{"version":3,"sources":["style/Global.ts","connectors/NetworkConnector.ts","connectors/index.ts","constants/index.ts","hooks/index.ts","state/application/actions.ts","state/application/hooks.ts","components/Column/index.tsx","state/lists/actions.ts","utils/listVersionLabel.ts","components/Row/index.tsx","components/Popups/ListUpdatePopup.tsx","utils/index.ts","components/Shared/Common.tsx","components/Popups/TransactionPopup.tsx","components/Popups/PopupItem.tsx","components/Popups/index.tsx","components/Loader/index.tsx","components/Web3ReactManager/index.tsx","components/Card/index.tsx","components/Modal/index.tsx","components/TransactionConfirmationModal/helpers.tsx","components/TransactionConfirmationModal/ConfirmationPendingContent.tsx","components/TransactionConfirmationModal/TransactionSubmittedContent.tsx","components/TransactionConfirmationModal/TransactionConfirmationModal.tsx","components/TransactionConfirmationModal/ConfirmationModalContent.tsx","components/TransactionConfirmationModal/TransactionErrorContent.tsx","components/TransactionConfirmationModal/index.tsx","hooks/TranslationsContext.ts","utils/translateTextHelpers.ts","hooks/useI18n.ts","components/CardNav/index.tsx","constants/abis/erc20.ts","state/lists/hooks.ts","state/multicall/actions.ts","state/multicall/hooks.ts","state/user/actions.ts","utils/theme.ts","state/user/hooks.tsx","constants/multicall/index.ts","hooks/useContract.ts","hooks/Tokens.ts","state/wallet/hooks.ts","hooks/useLast.ts","utils/contenthashToUri.ts","utils/parseENSAddress.ts","utils/uriToHttp.ts","utils/isZero.ts","hooks/useHttpLocations.ts","hooks/useENSContentHash.ts","components/Logo/index.tsx","components/ListLogo/index.tsx","hooks/useInterval.ts","components/Popover/index.tsx","components/Tooltip/index.tsx","components/QuestionHelper/index.tsx","components/pancake/CoinLogo.ts","components/CurrencyLogo/index.tsx","components/SearchModal/CommonBases.tsx","components/SearchModal/styleds.tsx","components/SearchModal/CurrencyList.tsx","components/SearchModal/filtering.ts","components/SearchModal/SortButton.tsx","components/SearchModal/sorting.ts","components/SearchModal/CurrencySearch.tsx","constants/lists.ts","utils/getTokenList.ts","utils/resolveENSContentHash.ts","hooks/useFetchListCallback.ts","hooks/useOnClickOutside.tsx","components/SearchModal/ListSelect.tsx","hooks/useToggle.ts","components/SearchModal/CurrencySearchModal.tsx","components/DoubleLogo/index.tsx","components/NumericalInput/index.tsx","components/CurrencyInputPanel/index.tsx","components/NavigationTabs/index.tsx","data/TotalSupply.ts","utils/currencyId.ts","utils/wrappedCurrency.ts","components/swap/styleds.tsx","components/PositionCard/index.tsx","data/Reserves.ts","data/Allowances.ts","state/swap/actions.ts","state/transactions/actions.ts","state/transactions/hooks.tsx","utils/prices.ts","hooks/useApproveCallback.ts","state/mint/actions.ts","hooks/useDebounce.ts","hooks/useENS.ts","hooks/useENSName.ts","hooks/useENSAddress.ts","hooks/Trades.ts","state/swap/hooks.ts","hooks/useParsedQueryString.ts","state/mint/hooks.ts","utils/maxAmountSpend.ts","components/Pane/index.tsx","state/toasts/index.ts","hooks/useToast.ts","hooks/useAuth.ts","components/ConnectWalletButton/index.tsx","pages/AppBody.tsx","pages/Pool/styleds.tsx","pages/AddLiquidity/ConfirmAddModalBottom.tsx","pages/AddLiquidity/PoolPriceBar.tsx","pages/AddLiquidity/index.tsx","pages/AddLiquidity/redirects.tsx","pages/RemoveLiquidity/redirects.tsx","pages/PoolFinder/index.tsx","components/PageHeader/SlippageToleranceSetting.tsx","components/PageHeader/TransactionDeadlineSetting.tsx","components/PageHeader/SettingsModal.tsx","components/PageHeader/RecentTransactionsModal.tsx","components/PageHeader/index.tsx","pages/Pool/index.tsx","state/burn/actions.ts","components/Slider/index.tsx","state/burn/hooks.ts","pages/RemoveLiquidity/index.tsx","utils/useDebouncedChangeHandler.ts","components/AddressInputPanel/index.tsx","components/swap/FormattedPriceImpact.tsx","components/swap/SwapModalFooter.tsx","components/swap/SwapModalHeader.tsx","components/swap/ConfirmSwapModal.tsx","components/swap/SwapRoute.tsx","components/swap/AdvancedSwapDetails.tsx","components/swap/AdvancedSwapDetailsDropdown.tsx","components/swap/TradePrice.tsx","components/TokenWarningModal/index.tsx","components/SyrupWarningModal/index.tsx","components/SafeMoonWarningModal/index.tsx","components/ProgressSteps/index.tsx","hooks/useSwapCallback.ts","hooks/useWrapCallback.ts","pages/Swap/index.tsx","components/swap/confirmPriceImpactWithoutFee.ts","pages/Swap/redirects.tsx","constants/localisation/languageCodes.ts","hooks/LanguageContext.ts","ThemeContext.tsx","hooks/useTheme.ts","hooks/useGetLocalProfile.ts","components/Menu/config.ts","components/Menu/index.tsx","hooks/useGetDocumentTitlePrice.ts","pages/App.tsx","hooks/useIsWindowVisible.ts","state/application/updater.ts","state/lists/updater.ts","utils/retry.ts","state/multicall/updater.tsx","utils/chunkArray.ts","state/transactions/updater.tsx","components/ToastListener/index.tsx","state/application/reducer.ts","state/global/actions.ts","state/user/reducer.ts","state/transactions/reducer.ts","state/swap/reducer.ts","state/mint/reducer.ts","state/lists/reducer.ts","state/burn/reducer.ts","state/multicall/reducer.ts","state/index.ts","utils/getLibrary.ts","Providers.tsx","i18n.ts","index.tsx"],"names":["GlobalStyle","createGlobalStyle","RequestError","message","code","data","Error","MiniRpcProvider","chainId","url","batchWaitTimeMs","isMetaMask","host","path","nextId","batchTimeoutId","batch","clearBatch","a","console","info","fetch","method","headers","accept","body","JSON","stringify","map","item","request","response","forEach","reject","ok","status","statusText","json","byKey","reduce","memo","current","id","result","resolve","error","sendAsync","callback","params","then","jsonrpc","catch","toString","promise","Promise","push","setTimeout","this","parsed","URL","pathname","NetworkConnector","urls","defaultChainId","invariant","Object","keys","length","supportedChainIds","k","Number","providers","currentChainId","accumulator","provider","account","AbstractConnector","NETWORK_URL","process","NETWORK_CHAIN_ID","parseInt","networkLibrary","network","injected","InjectedConnector","bscConnector","BscConnector","walletconnect","WalletConnectConnector","rpc","bridge","qrcode","pollingInterval","connectorsByName","WalletLinkConnector","appName","appLogoUrl","ConnectorNames","Injected","WalletConnect","BSC","ROUTER_ADDRESS","CAKE","Token","ChainId","MAINNET","WBNB","DAI","BUSD","BTCB","USDT","UST","ETH","WETH_ONLY","WETH","BSCTESTNET","BASES_TO_CHECK_TRADES_AGAINST","CUSTOM_BASES","SUGGESTED_BASES","BASES_TO_TRACK_LIQUIDITY_FOR","PINNED_PAIRS","NetworkContextName","INITIAL_ALLOWED_SLIPPAGE","DEFAULT_DEADLINE_FROM_NOW","ONE_BIPS","Percent","JSBI","BigInt","BIPS_BASE","ALLOWED_PRICE_IMPACT_LOW","ALLOWED_PRICE_IMPACT_MEDIUM","ALLOWED_PRICE_IMPACT_HIGH","PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN","BLOCKED_PRICE_IMPACT_NON_EXPERT","MIN_ETH","exponentiate","useActiveWeb3React","context","useWeb3ReactCore","contextNetwork","active","updateBlockNumber","createAction","toggleWalletModal","toggleSettingsMenu","addPopup","removePopup","useBlockNumber","useSelector","state","application","blockNumber","useRemovePopup","dispatch","useDispatch","useCallback","key","Column","styled","div","ColumnCenter","AutoColumn","gap","justify","fetchTokenList","pending","fulfilled","rejected","acceptListUpdate","addList","removeList","selectList","listVersionLabel","version","major","minor","patch","Row","Box","align","padding","border","borderRadius","RowBetween","RowFlat","AutoRow","RowFixed","ListUpdatePopup","popKey","listUrl","oldList","newList","auto","removeThisPopup","handleAcceptUpdate","useMemo","diffTokenLists","tokens","tokensAdded","added","tokensChanged","changed","tokensRemoved","removed","numTokensChanged","style","flex","name","fontSize","token","i","Fragment","title","address","symbol","flexGrow","marginRight","onClick","isAddress","value","getAddress","BSCSCAN_PREFIXES","56","97","getBscScanLink","type","prefix","shortenAddress","chars","substring","calculateGasMargin","mul","BigNumber","from","add","calculateSlippageAmount","slippage","divide","multiply","raw","getContract","ABI","library","AddressZero","Contract","getSigner","connectUnchecked","getProviderOrSigner","getRouterContract","_","IUniswapV2Router02ABI","LinkStyledButton","button","disabled","theme","colors","textSubtle","primary","StyledInternalLink","Link","StyledLink","ExternalLink","target","href","rel","rest","handleClick","event","ctrlKey","metaKey","preventDefault","rotate","keyframes","Spinner","img","RowNoFlex","TransactionPopup","hash","success","summary","useContext","ThemeContext","paddingRight","color","size","failure","slice","StyledClose","X","Popup","invertedContrast","mediaQueries","sm","Fader","tertiary","AnimatedFader","animated","PopupItem","removeAfterMs","content","useEffect","timeout","clearTimeout","popupContent","txn","listUpdate","faderStyle","useSpring","width","to","config","duration","undefined","MobilePopupWrapper","height","MobilePopupInner","FixedPopupColumn","Popups","activePopups","list","popupList","filter","show","useActivePopups","reverse","StyledSVG","svg","stroke","Loader","viewBox","fill","xmlns","d","strokeWidth","strokeLinecap","strokeLinejoin","MessageWrapper","Message","h2","primaryDark","Web3ReactManager","children","t","useTranslation","useWeb3React","networkActive","networkError","activateNetwork","activate","triedEager","useState","tried","setTried","isAuthorized","hasSignedIn","window","localStorage","getItem","connectorLocalStorageKey","isMobile","ethereum","useEagerConnect","suppress","on","handleChainChanged","e","handleAccountsChanged","accounts","removeListener","useInactiveListener","showLoader","setShowLoader","Card","LightCard","GreyCard","AnimatedDialogOverlay","DialogOverlay","StyledDialogOverlay","AnimatedDialogContent","DialogContent","StyledDialogContent","minHeight","maxHeight","mobile","isOpen","attrs","transparentize","css","lg","Modal","onDismiss","initialFocusRef","fadeTransition","useTransition","opacity","enter","leave","props","aria-label","tabIndex","Wrapper","Section","ConfirmedIcon","BottomSection","StyledContentHeader","Heading","ContentHeader","variant","CustomLightSpinner","ConfirmationPendingContent","pendingText","src","alt","TransactionSubmittedContent","mt","TransactionConfirmationModal","attemptingTxn","ConfirmationModalContent","bottomContent","topContent","TransactionErrorContent","marginTop","textAlign","defaultTranslationState","translations","setTranslations","TranslationsContext","createContext","variableRegex","getTranslation","translationId","fallback","foundTranslation","find","translation","stringId","translatedString","text","includes","stringToReplace","exec","indexToReplace","split","indexOf","fallbackValueAtIndex","replace","replaceDynamicString","TranslateString","useI18n","StyledNav","Nav","activeIndex","scale","as","ERC20_INTERFACE","Interface","ERC20_ABI","WrappedTokenInfo","tokenInfo","tags","decimals","logoURI","EMPTY_LIST","listCache","WeakMap","useTokenList","lists","byUrl","get","tokenMap","tagId","x","Boolean","set","listToTokenMap","useSelectedListUrl","selectedListUrl","useSelectedTokenList","ADDRESS_REGEX","LOWER_HEX_REGEX","toCallKey","call","test","callData","parseCallKey","callKey","pcs","addMulticallListeners","removeMulticallListeners","fetchingMulticallResults","errorFetchingMulticallResults","updateMulticallResults","isMethodArg","isValidMethodArgs","Array","isArray","every","xi","INVALID_RESULT","valid","NEVER_RELOAD","blocksPerFetch","Infinity","useCallsData","calls","options","callResults","multicall","serializedCallKeys","c","sort","callKeys","parse","INVALID_CALL_STATE","loading","syncing","LOADING_CALL_STATE","toCallState","callResult","contractInterface","fragment","latestBlockNumber","decodeFunctionResult","useMultipleContractSingleData","addresses","methodName","callInputs","getFunction","encodeFunctionData","results","useSingleCallResult","contract","inputs","interface","updateMatchesDarkMode","updateUserDarkMode","updateUserExpertMode","updateUserSlippageTolerance","updateUserDeadline","addSerializedToken","removeSerializedToken","addSerializedPair","removeSerializedPair","muteAudio","unmuteAudio","CACHE_KEY","serializeToken","deserializeToken","serializedToken","useIsExpertMode","user","userExpertMode","useUserSlippageTolerance","userSlippageTolerance","slippageTolerance","useUserDeadline","userDeadline","deadline","useUserAddedTokens","serializedTokensMap","values","serializePair","pair","token0","token1","toV2LiquidityToken","tokenA","tokenB","Pair","MULTICALL_NETWORKS","useContract","withSignerIfPossible","useTokenContract","tokenAddress","useENSRegistrarContract","ENS_ABI","useENSResolverContract","ENS_PUBLIC_RESOLVER_ABI","useMulticallContract","MULTICALL_ABI","useAllTokens","userAddedTokens","allTokens","BYTES32_REGEX","parseStringOrBytes32","str","bytes32","defaultValue","parseBytes32String","useToken","tokenContract","tokenContractBytes32","ERC20_BYTES32_ABI","useBytes32TokenContract","tokenName","tokenNameBytes32","symbolBytes32","useCurrency","currencyId","isBNB","toUpperCase","ETHER","useETHBalances","uncheckedAddresses","multicallContract","useSingleContractMultipleData","CurrencyAmount","ether","useTokenBalancesWithLoadingIndicator","validatedTokens","balances","vt","anyLoading","some","callState","amount","TokenAmount","useTokenBalances","useTokenBalance","tokenBalances","useCurrencyBalances","currencies","currency","ethBalance","useCurrencyBalance","useLast","filterFn","last","setLast","prev","isDefined","UTF_8_DECODER","TextDecoder","contenthashToUri","contenthash","buff","hex","startsWith","substr","arr","Uint8Array","hexToUint8Array","codec","getCodec","rmPrefix","cid","CID","toB58String","multihash","decode","digest","trim","ENS_NAME_REGEX","parseENSAddress","ensAddress","match","ensName","toLowerCase","ensPath","uriToHttp","uri","isZero","hexNumberString","useHttpLocations","ens","resolvedContentHash","ensNodeArgument","namehash","resolverAddressResult","resolverAddress","useENSContentHash","BAD_SRCS","Logo","srcs","refresh","s","onError","StyledListLogo","ListLogo","useInterval","delay","leading","savedCallback","useRef","tick","setInterval","clearInterval","PopoverContainer","ReferenceElement","Arrow","Popover","placement","referenceElement","setReferenceElement","popperElement","setPopperElement","arrowElement","setArrowElement","usePopper","strategy","modifiers","offset","element","styles","update","attributes","ref","popper","className","arrow","TooltipContainer","Tooltip","MouseoverTooltip","setShow","open","close","onMouseEnter","onMouseLeave","QuestionWrapper","QuestionHelper","marginLeft","CoinLogo","getTokenLogoURL","StyledBnbLogo","StyledLogo","CurrencyLogo","uriLocations","BaseWrapper","disable","CommonBases","onSelect","selectedCurrency","currencyEquals","selected","FadedSpan","PaddedColumn","MenuItem","SearchInput","input","textDisabled","Separator","SeparatorDark","currencyKey","StyledBalanceText","Text","Tag","Balance","balance","toExact","toSignificant","TagContainer","TokenTags","tag","description","join","CurrencyRow","isSelected","otherSelected","isOnSelectedList","defaultTokens","isTokenOnList","customAdded","useIsUserAddedToken","removeToken","useRemoveUserAddedToken","addToken","useAddUserToken","stopPropagation","justifySelf","CurrencyList","onCurrencySelect","otherCurrency","fixedListRef","showETH","itemData","Currency","index","itemKey","itemCount","itemSize","filterTokens","search","searchingAddress","lowerSearchParts","matchesSearch","sParts","p","sp","endsWith","FilterWrapper","SortButton","toggleSortOrder","ascending","useTokenComparator","inverted","useAllTokenBalances","comparator","balanceA","balanceB","balanceComp","greaterThan","equalTo","getTokenComparator","CurrencySearch","otherSelectedCurrency","showCommonBases","onChangeList","fixedList","searchQuery","setSearchQuery","invertSearchOrder","setInvertSearchOrder","isAddressSearch","searchToken","tokenComparator","filteredTokens","filteredSortedTokens","sorted","symbolMatch","handleCurrencySelect","inputRef","handleInput","checksummedInput","scrollTo","handleEnter","selectedUrl","listsByUrl","pendingUpdate","loadingRequestId","useSelectedListInfo","placeholder","onChange","onKeyDown","iso","disableWidth","DEFAULT_TOKEN_LIST_URL","DEFAULT_LIST_OF_LISTS","tokenListValidator","Ajv","allErrors","compile","schema","getTokenList","resolveENSContentHash","defaultTokenJson","parsedENS","contentHashUri","translatedUri","isLast","validationErrors","errors","dataPath","REGISTRAR_ABI","constant","outputs","payable","stateMutability","REGISTRAR_ADDRESS","RESOLVER_ABI","internalType","resolverContract","ensRegistrarContract","resolver","useFetchListCallback","ensResolver","Web3Provider","getNetworkLibrary","requestId","nanoid","tokenList","errorMessage","useOnClickOutside","node","handler","handlerRef","handleClickOutside","contains","document","addEventListener","removeEventListener","UnpaddedLinkStyledButton","StyledMenu","StyledListUrlText","ListOrigin","lowerListUrl","listUrlRowHTMLId","ListRow","onBack","initialState","setState","toggle","useToggle","selectThisList","handleAcceptListUpdate","handleRemoveList","prompt","bold","overflow","textOverflow","display","minWidth","ListContainer","ListSelect","listUrlInput","setListUrlInput","adding","addError","setAddError","fetchList","handleAddList","validUrl","handleEnterKey","sortedLists","u1","u2","l1","l2","cursor","maxWidth","CurrencySearchModal","listView","setListView","lastOpen","handleClickChangeList","handleClickBack","noListSelected","sizeraw","margin","HigherLogo","CoveredLogo","DoubleCurrencyLogo","currency0","currency1","StyledInput","inputRegex","RegExp","Input","React","onUserInput","nextUserInput","inputMode","autoComplete","autoCorrect","pattern","minLength","maxLength","spellCheck","InputRow","CurrencySelect","darken","LabelRow","Aligner","span","InputPanel","hideInput","background","Container","shadows","inset","CurrencyInputPanel","onMax","showMaxButton","label","disableCurrencySelect","hideBalance","modalOpen","setModalOpen","selectedCurrencyBalance","translatedLabel","handleDismissSearch","val","Tabs","ActiveText","StyledArrowLeft","ArrowLeft","FindPoolTabs","AddRemoveTabs","useTotalSupply","totalSupply","wrappedCurrency","wrappedCurrencyAmount","currencyAmount","unwrappedToken","equals","ArrowWrapper","clickable","SectionBreak","BottomGrouping","ErrorText","severity","binance","StyledBalanceMaxMini","Dots","SwapCallbackErrorInner","SwapCallbackErrorInnerAlertTriangle","SwapCallbackError","SwapShowAcceptChanges","FixedHeightRow","HoverCard","MinimalPositionCard","showUnwrapped","showMore","setShowMore","userPoolBalance","liquidityToken","totalPoolTokens","greaterThanOrEqual","getLiquidityValue","token0Deposited","token1Deposited","textTransform","fontWeight","ml","FullPositionCard","poolTokenPercentage","toFixed","PairState","PAIR_INTERFACE","IUniswapV2PairABI","usePairs","currencyA","currencyB","reserves","LOADING","INVALID","NOT_EXISTS","reserve0","reserve1","sortsBefore","EXISTS","usePair","useTokenAllowance","owner","spender","allowance","Field","selectCurrency","switchCurrencies","typeInput","replaceSwapState","setRecipient","addTransaction","clearAllTransactions","finalizeTransaction","checkedTransaction","useTransactionAdder","approval","useAllTransactions","transactions","isTransactionRecent","tx","Date","getTime","addedTime","ApprovalState","BASE_FEE","ONE_HUNDRED_PERCENT","INPUT_FRACTION_AFTER_FEE","subtract","computeTradePriceBreakdown","trade","realizedLPFee","route","pairs","currentFee","priceImpactWithoutFeeFraction","priceImpact","priceImpactWithoutFee","numerator","denominator","inputAmount","quotient","computeSlippageAdjustedAmounts","allowedSlippage","num","pct","Math","floor","INPUT","maximumAmountIn","OUTPUT","minimumAmountOut","warningSeverity","lessThan","formatExecutionPrice","executionPrice","invert","outputAmount","useApproveCallback","amountToApprove","currentAllowance","pendingApproval","allTransactions","receipt","useHasPendingApproval","approvalState","APPROVED","PENDING","NOT_APPROVED","UNKNOWN","approve","useExact","estimateGas","MaxUint256","estimatedGas","gasLimit","resetMintState","useDebounce","debouncedValue","setDebouncedValue","useENS","nameOrAddress","validated","reverseLookup","debouncedAddress","ENSName","useENSName","lookup","debouncedName","addr","useENSAddress","useAllCommonPairs","bases","basePairs","flatMap","base","otherBase","t0","t1","allPairs","customBases","customBasesA","customBasesB","curr","useSwapState","swap","tryParseAmount","typedValueParsed","parseUnits","BAD_RECIPIENT_ADDRESSES","involvesAddress","checksummedAddress","useDerivedSwapInfo","inputError","independentField","typedValue","inputCurrencyId","outputCurrencyId","recipient","inputCurrency","outputCurrency","recipientLookup","relevantTokenBalances","isExactIn","parsedAmount","bestTradeExactIn","currencyAmountIn","currencyOut","allowedPairs","Trade","maxHops","maxNumResults","useTradeExactIn","bestTradeExactOut","currencyIn","currencyAmountOut","useTradeExactOut","v2Trade","currencyBalances","formattedTo","slippageAdjustedAmounts","balanceIn","amountIn","parseCurrencyFromURLParameter","urlParam","queryParametersToSwapState","parsedQs","validatedRecipient","exactAmount","isNaN","parseFloat","parseIndependentFieldURLParameter","exactField","useDefaultsFromURLSearch","useLocation","parseArrays","ignoreQueryPrefix","useParsedQueryString","setResult","field","ZERO","useMintState","mint","maxAmountSpend","Pane","borderColor","toastsSlice","createSlice","reducers","action","payload","toastIndex","findIndex","toast","splice","unshift","remove","clear","actions","useToast","pushToast","toastError","kebabCase","toastTypes","DANGER","toastInfo","INFO","toastSuccess","SUCCESS","toastWarning","WARNING","removeToast","clearToast","useAuth","deactivate","login","connectorID","connector","removeItem","UnsupportedChainIdError","NoEthereumProviderError","NoBscProviderError","UserRejectedRequestErrorInjected","UserRejectedRequestErrorWalletConnect","walletConnectProvider","logout","UnlockButton","onPresentConnectModal","useWalletModal","BodyWrapper","AppBody","ClickableText","ConfirmAddModalBottom","noLiquidity","price","parsedAmounts","onAdd","CURRENCY_A","CURRENCY_B","justifyContent","PoolPriceBar","pt","AddLiquidity","currencyIdA","currencyIdB","history","oneCurrencyIsWBNB","expertMode","otherTypedValue","dependentField","pairState","equal","independentAmount","dependentAmount","wrappedIndependentAmount","dependentCurrency","dependentTokenAmount","priceOf","quote","currencyAAmount","currencyBAmount","Price","wrappedCurrencyA","liquidityMinted","tokenAmountA","tokenAmountB","getLiquidityMinted","useDerivedMintInfo","onFieldAInput","onFieldBInput","useMintActionHandlers","isValid","showConfirm","setShowConfirm","setAttemptingTxn","txHash","setTxHash","formattedAmounts","maxAmounts","atMaxAmounts","approvalA","approveACallback","approvalB","approveBCallback","router","parsedAmountA","parsedAmountB","amountsMin","deadlineFromNow","ceil","now","tokenBIsBNB","estimate","addLiquidityETH","args","addLiquidity","estimatedGasLimit","modalHeader","mr","small","fontStyle","modalBottom","handleCurrencyASelect","currA","newCurrencyIdA","handleCurrencyBSelect","currB","newCurrencyIdB","handleDismissConfirmation","CardNav","mb","ConnectWalletButton","OLD_PATH_STRUCTURE","RedirectOldAddLiquidityPathStructure","RedirectDuplicateTokenIds","RedirectOldRemoveLiquidityPathStructure","Fields","Option","Options","predefinedValues","SlippageToleranceSettings","translateString","setUserslippageTolerance","setValue","setError","rawValue","alignItems","predefinedValue","step","min","evt","inputValue","isWarning","TransactionDeadlineSetting","setDeadline","defaultOnDismiss","SettingsModal","SlippageToleranceSetting","newTransactionsFirst","b","RecentTransactionsModal","sortedRecentTransactions","flexDirection","sortedRecentTransaction","icon","getRowStatus","StyledPageHeader","Details","PageHeader","useModal","onPresentSettings","onPresentRecentTransactions","Pool","trackedTokenPairs","pinnedPairs","generatedPairs","savedSerializedPairs","userPairs","forChain","pairId","combinedList","concat","keyed","useTrackedTokenPairs","tokenPairsWithLiquidityTokens","tpwlt","v2PairsBalances","fetchingV2PairBalances","liquidityTokensWithBalances","v2Pairs","v2IsLoading","V2Pair","allV2PairsWithLiquidity","v2Pair","PoolFinder","showSearch","setShowSearch","TOKEN1","activeField","setActiveField","setCurrency0","setCurrency1","addPair","serializedPair","usePairAdder","validPairNoLiquidity","position","hasPosition","TOKEN0","handleSearchDismiss","prerequisiteMessage","startIcon","endIcon","justifyItems","backgroundColor","StyledRangeInput","Slider","max","changeCallback","aria-labelledby","useBurnState","burn","OutlineCard","Body","RemoveLiquidity","userLiquidity","LIQUIDITY","liquidityValueA","liquidityValueB","liquidityValues","percentToRemove","LIQUIDITY_PERCENT","liquidityValue","useDerivedBurnInfo","_onUserInput","useBurnActionHandlers","showDetailed","setShowDetailed","atMaxAmount","pairContract","signatureData","setSignatureData","approveCallback","liquidityAmount","nonces","nonce","deadlineForSignature","EIP712Domain","domain","verifyingContract","Permit","toHexString","types","primaryType","send","splitSignature","signature","v","r","onLiquidityInput","onCurrencyAInput","onCurrencyBInput","onRemove","currencyAmountA","currencyAmountB","currencyBIsETH","oneCurrencyIsETH","methodNames","all","safeGasEstimates","indexOfSuccessfulEstimation","safeGasEstimate","isBigNumber","liquidityPercentChangeCallback","oneCurrencyIsWETH","handleSelectCurrencyA","handleSelectCurrencyB","debouncedMs","inner","setInner","timer","onChangeInner","newValue","useDebouncedChangeHandler","innerLiquidityPercentage","setInnerLiquidityPercentage","paddingBottom","ContainerRow","InputContainer","AddressInputPanel","withoutSpaces","autoCapitalize","FormattedPriceImpact","SwapModalFooter","onConfirm","swapErrorMessage","disabledConfirm","showInverted","setShowInverted","paddingLeft","tradeType","TradeType","EXACT_INPUT","PriceInfoText","SwapModalHeader","showAcceptChanges","onAcceptChanges","priceImpactSeverity","EXACT_OUTPUT","ConfirmSwapModal","originalTrade","tradeB","tradeA","confirmationContent","px","py","my","flexWrap","isLastItem","flexShrink","TradeSummary","AdvancedSwapDetails","showRoute","AdvancedDetailsFooter","AdvancedSwapDetailsDropdown","lastTrade","TradePrice","formattedPrice","baseCurrency","quoteCurrency","WarningContainer","StyledWarningIcon","AlertTriangle","TokenWarningCard","tokenSymbol","duplicateNameOrSymbol","userToken","TokenWarningModal","understandChecked","setUnderstandChecked","toggleUnderstand","uc","handleDismiss","htmlFor","userSelect","checked","SyrupWarningModal","transactionType","SafeMoonWarningModal","SwapCallbackState","Grouping","Circle","confirmed","backgroundDisabled","CircleRow","Connector","prevConfirmed","ProgressCircles","steps","useSwapCallArguments","recipientAddressOrName","recipientAddress","swapMethods","Router","swapCallParameters","feeOnTransfer","ttl","parameters","useSwapCallback","swapCalls","VALID","gasEstimate","gasError","callStatic","callError","reason","estimatedCalls","successfulEstimation","el","ix","errorCalls","inputSymbol","outputSymbol","withRecipient","WrapType","NOT_APPLICABLE","wrapType","useWrapCallback","wethContract","WETH_ABI","useWETHContract","sufficientBalance","WRAP","execute","deposit","txReceipt","UNWRAP","withdraw","Swap","loadedUrlParams","loadedInputCurrency","loadedOutputCurrency","dismissTokenWarning","setDismissTokenWarning","selectedToken","purchaseType","transactionWarning","setTransactionWarning","urlLoadedTokens","handleConfirmTokenWarning","handleConfirmWarning","toggleSetExpertMode","useExpertModeManager","isExpertMode","swapInputError","onWrap","wrapInputError","showWrap","onCurrencySelection","onSwitchTokens","onChangeRecipient","useSwapActionHandlers","handleTypeInput","handleTypeOutput","tradeToConfirm","setSwapState","userHasSpecifiedInputOutput","noRoute","useApproveCallbackFromTrade","approvalSubmitted","setApprovalSubmitted","maxAmountInput","atMaxAmountInput","swapCallback","swapCallbackError","handleSwap","confirm","confirmPriceImpactWithoutFee","prevState","showApproveFlow","handleConfirmDismiss","handleAcceptChanges","checkForWarning","handleInputSelect","handleMaxInput","handleOutputSelect","RedirectPathToSwapOnly","location","EN","language","allLanguages","defaultLanguageState","selectedLanguage","setSelectedLanguage","translatedLanguage","setTranslatedLanguage","LanguageContext","isDark","toggleTheme","ThemeContextProvider","isDarkUserSetting","setIsDark","Provider","setItem","dark","light","useTheme","StyledThemeCopntext","profileLink","noProfileLink","useGetLocalProfile","profile","setProfile","localData","Cookies","localProfile","prevProfile","username","image","avatar","menuStatus","NEW","items","Menu","links","currentLang","langs","setLang","cakePriceUsd","useGetDocumentTitlePrice","AppWrapper","xs","Marginer","App","apiKey","REACT_APP_CROWDIN_APIKEY","projectId","REACT_APP_CROWDIN_PROJECTID","credentials","stringTranslationsApi","StringTranslations","storedLangCode","storedLang","getStoredLang","fetchTranslationsForSelectedLanguage","listLanguageTranslations","translationApiResponse","langObject","exact","strict","component","VISIBILITY_STATE_SUPPORTED","isWindowVisible","visibilityState","useIsWindowVisible","focused","setFocused","listener","Updater","windowVisible","blockNumberCallback","getBlockNumber","debouncedState","bump","getVersionUpgrade","VersionUpgrade","NONE","PATCH","MINOR","minVersionBump","MAJOR","waitRandom","ms","round","random","CancelledError","RetryableError","chunk","minBlockNumber","aggregate","obj","resultsBlockNumber","returnData","toNumber","debouncedListeners","callListeners","cancellations","listeningKeys","allListeners","listeners","keyListeners","previousMin","activeListeningKeys","unserializedOutdatedCallKeys","minDataBlockNumber","fetchingBlockNumber","outdatedListeningKeys","serializedOutdatedCallKeys","outdatedCallKeys","chunkedCalls","maxChunkSize","numChunks","chunkSize","chunkArray","fn","rejectCancelled","n","minWait","maxWait","completed","cancel","retry","fetchChunk","fetchBlockNumber","firstCallKeyIndex","lastCallKeyIndex","lastBlockNumber","useAddPopup","lastCheckedBlockNumber","blocksSinceCheck","minutesPending","shouldCheck","getTransactionReceipt","blockHash","contractAddress","transactionHash","transactionIndex","ToastListener","toasts","createReducer","walletModalOpen","settingsMenuOpen","builder","addCase","popup","updateVersion","currentTimestamp","pairKey","token0Address","token1Address","userDarkMode","matchesDarkMode","timestamp","audioPlay","lastUpdateVersionTimestamp","tokenAAddress","tokenBAddress","txs","confirmedTime","otherField","NEW_LIST_STATE","lastInitializedDefaultListOfLists","DEFAULT_LIST","lastInitializedSet","l","Set","newListOfListsSet","has","PERSISTED_KEYS","loadedState","load","states","cache","rawCache","getThemeCache","store","configureStore","reducer","middleware","getDefaultMiddleware","thunk","save","preloadedState","getLibrary","Web3ProviderNetwork","createWeb3ReactRoot","Providers","i18next","use","XHR","LanguageDetector","initReactI18next","init","backend","loadPath","react","useSuspense","fallbackLng","preload","keySeparator","interpolation","escapeValue","autoRefreshOnNetworkChange","ReactDOM","render","Global","getElementById"],"mappings":"k8wDAaeA,EAXKC,4BAAH,4I,yMCgBXC,E,kDACJ,WAAYC,EAAwBC,EAAqBC,GAAiB,IAAD,8BACvE,cAAMF,IAD4BC,OAAqC,EAAhBC,OAAgB,E,sBADhDC,QAYrBC,EAmBJ,WAAYC,EAAiBC,EAAaC,GAA2B,IAAD,gCAlBpDC,YAAoB,EAkBgC,KAhBpDH,aAgBoD,OAdpDC,SAcoD,OAZpDG,UAYoD,OAVpDC,UAUoD,OARpDH,qBAQoD,OAN5DI,OAAS,EAMmD,KAJ5DC,eAAuD,KAIK,KAF5DC,MAAqB,GAEuC,KAUpDC,WAVoD,sBAUvC,sDAAAC,EAAA,6DAC3BC,QAAQC,KAAK,iBAAkB,EAAKJ,OAC5BA,EAAU,EAAVA,MACR,EAAKA,MAAQ,GACb,EAAKD,eAAiB,KAJK,kBAQRM,MAAM,EAAKZ,IAAK,CAC/Ba,OAAQ,OACRC,QAAS,CAAE,eAAgB,mBAAoBC,OAAQ,oBACvDC,KAAMC,KAAKC,UAAUX,EAAMY,KAAI,SAACC,GAAD,OAAUA,EAAKC,cAXvB,OAQzBC,EARyB,gEAczBf,EAAMgB,SAAQ,mBAAgBC,EAAhB,EAAGA,QAAoB,IAAI3B,MAAM,iCAdtB,8BAkBtByB,EAASG,GAlBa,wBAmBzBlB,EAAMgB,SAAQ,mBAAgBC,EAAhB,EAAGA,QAAoB,IAAI/B,EAAJ,UAAoB6B,EAASI,OAA7B,aAAwCJ,EAASK,aAAe,UAnB5E,sDAyBZL,EAASM,OAzBG,QAyBzBA,EAzByB,iEA2BzBrB,EAAMgB,SAAQ,mBAAgBC,EAAhB,EAAGA,QAAoB,IAAI3B,MAAM,qCA3BtB,2BA8BrBgC,EAAQtB,EAAMuB,QAAoC,SAACC,EAAMC,GAE7D,OADAD,EAAKC,EAAQX,QAAQY,IAAMD,EACpBD,IACN,IAjCwB,cAoCNH,GApCM,IAoC3B,2BAAWM,EAAgB,UAKrBL,EAAMK,EAAOD,IAHfE,EAFuB,EAEvBA,QACAX,EAHuB,EAGvBA,OACWX,EAJY,EAIvBQ,QAAWR,OAETsB,IACE,UAAWD,EACbV,EAAO,IAAI/B,EAAJ,OAAiByC,QAAjB,IAAiBA,GAAjB,UAAiBA,EAAQE,aAAzB,aAAiB,EAAe1C,QAAhC,OAAyCwC,QAAzC,IAAyCA,GAAzC,UAAyCA,EAAQE,aAAjD,aAAyC,EAAezC,KAAxD,OAA8DuC,QAA9D,IAA8DA,GAA9D,UAA8DA,EAAQE,aAAtE,aAA8D,EAAexC,OAC3E,WAAYsC,EACrBC,EAAQD,EAAOA,QAEfV,EAAO,IAAI/B,EAAJ,mDAA6DoB,EAA7D,cAAiF,KAAOqB,KAhD1E,gGAVuC,KAgEpDG,UAAY,SAC1BhB,EACAiB,GAEA,EAAKjB,QAAQA,EAAQR,OAAQQ,EAAQkB,QAClCC,MAAK,SAACN,GAAD,OAAYI,EAAS,KAAM,CAAEG,QAAS,MAAOR,GAAIZ,EAAQY,GAAIC,cAClEQ,OAAM,SAACN,GAAD,OAAWE,EAASF,EAAO,UAtE8B,KAyEpDf,QAzEoD,uCAyE1C,WACxBR,EACA0B,GAFwB,iBAAA9B,EAAA,yDAIF,kBAAXI,EAJa,yCAKf,EAAKQ,QAAQR,EAAOA,OAAQA,EAAO0B,SALpB,UAOT,gBAAX1B,EAPoB,qDAQV,EAAKd,QAAQ4C,SAAS,MARZ,cAUlBC,EAAU,IAAIC,SAAQ,SAACV,EAASX,GACpC,EAAKjB,MAAMuC,KAAK,CACdzB,QAAS,CACPoB,QAAS,MACTR,GAAI,EAAK5B,SACTQ,SACA0B,UAEFJ,UACAX,cAGJ,EAAKlB,eAAL,UAAsB,EAAKA,sBAA3B,QAA6CyC,WAAW,EAAKvC,WAAY,EAAKP,iBAtBtD,kBAuBjB2C,GAvBiB,2CAzE0C,wDAClEI,KAAKjD,QAAUA,EACfiD,KAAKhD,IAAMA,EACX,IAAMiD,EAAS,IAAIC,IAAIlD,GACvBgD,KAAK7C,KAAO8C,EAAO9C,KACnB6C,KAAK5C,KAAO6C,EAAOE,SAEnBH,KAAK/C,gBAAL,OAAuBA,QAAvB,IAAuBA,IAAmB,IA6FjCmD,EAAb,kDAKE,cAAkE,IAAD,EAAnDC,EAAmD,EAAnDA,KAAMC,EAA6C,EAA7CA,eAA6C,2BAC/DC,YAAUD,GAA+C,IAA7BE,OAAOC,KAAKJ,GAAMK,OAAc,sDAC5D,cAAM,CAAEC,kBAAmBH,OAAOC,KAAKJ,GAAMlC,KAAI,SAACyC,GAAD,OAAeC,OAAOD,SANxDE,eAIgD,IAFzDC,oBAEyD,EAI/D,EAAKA,eAAiBT,GAAkBO,OAAOL,OAAOC,KAAKJ,GAAM,IACjE,EAAKS,UAAYN,OAAOC,KAAKJ,GAAMvB,QAA+C,SAACkC,EAAajE,GAE9F,OADAiE,EAAYH,OAAO9D,IAAY,IAAID,EAAgB+D,OAAO9D,GAAUsD,EAAKQ,OAAO9D,KACzEiE,IACN,IAR4D,EALnE,0CAgBE,WACE,OAAOhB,KAAKc,UAAUd,KAAKe,kBAjB/B,6DAoBE,uGACS,CAAEE,SAAUjB,KAAKc,UAAUd,KAAKe,gBAAiBhE,QAASiD,KAAKe,eAAgBG,QAAS,OADjG,gDApBF,sHAwBE,uGACSlB,KAAKc,UAAUd,KAAKe,iBAD7B,gDAxBF,qHA4BE,uGACSf,KAAKe,gBADd,gDA5BF,qHAgCE,uGACS,MADT,2CAhCF,8EAoCE,WACE,OAAO,SArCX,GAAsCI,qBC7IhCC,EAAcC,mCAEPC,EAA2BC,UAASF,YAM1C,IAIHG,EAJSC,EAAU,IAAIrB,EAAiB,CAC1CC,KAAK,eAAIiB,EAAmBF,KASvB,I,EAAMM,EAAW,IAAIC,IAAkB,CAC5ChB,kBAAmB,CAAC,GAAI,MAGbiB,EAAe,IAAIC,eAAa,CAAElB,kBAAmB,CAAC,MAGtDmB,EAAgB,IAAIC,IAAuB,CACtDC,IAAI,eAAIV,EAAmBF,GAC3Ba,OAAQ,mCACRC,QAAQ,EACRC,gBAAiB,OAWNC,GAPa,IAAIC,IAAoB,CAChDrF,IAAKoE,EACLkB,QAAS,UACTC,WACE,4KAGqE,mBACtEC,IAAeC,SAAWf,GAD4C,cAEtEc,IAAeE,cAAgBZ,GAFuC,cAGtEU,IAAeG,IAAMf,GAHiD,G,uBC9C5DgB,EAAiB,6CAQjBC,EAAO,IAAIC,IAAMC,IAAQC,QAAS,6CAA8C,GAAI,OAAQ,qBAC5FC,GAAO,IAAIH,IAAMC,IAAQC,QAAS,6CAA8C,GAAI,OAAQ,eAC5FE,GAAM,IAAIJ,IAAMC,IAAQC,QAAS,6CAA8C,GAAI,MAAO,kBAC1FG,GAAO,IAAIL,IAAMC,IAAQC,QAAS,6CAA8C,GAAI,OAAQ,eAC5FI,GAAO,IAAIN,IAAMC,IAAQC,QAAS,6CAA8C,GAAI,OAAQ,eAC5FK,GAAO,IAAIP,IAAMC,IAAQC,QAAS,6CAA8C,GAAI,OAAQ,cAC5FM,GAAM,IAAIR,IACrBC,IAAQC,QACR,6CACA,GACA,MACA,qBAEWO,GAAM,IAAIT,IACrBC,IAAQC,QACR,6CACA,GACA,MACA,8BAGIQ,IAAyB,mBAC5BT,IAAQC,QAAU,CAACS,IAAKV,IAAQC,WADJ,cAE5BD,IAAQW,WAAa,CAACD,IAAKV,IAAQW,cAFP,GAMlBC,GAA6C,2BACrDH,IADqD,kBAEvDT,IAAQC,QAF+C,sBAEjCQ,GAAUT,IAAQC,UAFe,CAELE,GAAKC,GAAMC,GAAMC,GAAMC,GAAKC,OAOpEK,GAA4E,eACtFb,IAAQC,QAAU,IAIRa,GAA+B,2BACvCL,IADuC,kBAEzCT,IAAQC,QAFiC,sBAEnBQ,GAAUT,IAAQC,UAFC,CAESE,GAAKC,GAAME,OAInDS,GAA4C,2BACpDN,IADoD,kBAEtDT,IAAQC,QAF8C,sBAEhCQ,GAAUT,IAAQC,UAFc,CAEJE,GAAKC,GAAMC,GAAMC,OAGzDU,GAAkE,eAC5EhB,IAAQC,QAAU,CACjB,CAACH,EAAMI,IACP,CAACE,GAAME,IACP,CAACH,GAAKG,MAIGW,GAAqB,UAGrBC,GAA2B,IAE3BC,GAA4B,KAG5BC,GAAW,IAAIC,IAAQC,IAAKC,OAAO,GAAID,IAAKC,OAAO,MACnDC,GAAYF,IAAKC,OAAO,KAExBE,GAAoC,IAAIJ,IAAQC,IAAKC,OAAO,KAAMC,IAClEE,GAAuC,IAAIL,IAAQC,IAAKC,OAAO,KAAMC,IACrEG,GAAqC,IAAIN,IAAQC,IAAKC,OAAO,KAAMC,IAEnEI,GAAgD,IAAIP,IAAQC,IAAKC,OAAO,KAAOC,IAE/EK,GAA2C,IAAIR,IAAQC,IAAKC,OAAO,MAAOC,IAG1EM,GAAgBR,IAAKS,aAAaT,IAAKC,OAAO,IAAKD,IAAKC,OAAO,KC/ErE,SAASS,KACd,IAAMC,EAAUC,cACVC,EAAiBD,YAA+BjB,IACtD,OAAOgB,EAAQG,OAASH,EAAUE,E,sBCMvBE,GAAoBC,aAAuD,yBAC3EC,GAAoBD,aAAmB,yBACvCE,GAAqBF,aAAmB,0BACxCG,GAAWH,aACtB,gBAEWI,GAAcJ,aAA8B,mBCpBlD,SAASK,KACd,IAAQ3I,EAAYgI,KAAZhI,QAER,OAAO4I,aAAY,SAACC,GAAD,OAAqBA,EAAMC,YAAYC,YAAlB,OAA8B/I,QAA9B,IAA8BA,KAAY,MAkC7E,SAASgJ,KACd,IAAMC,EAAWC,cACjB,OAAOC,uBACL,SAACC,GACCH,EAASP,GAAY,CAAEU,WAEzB,CAACH,IC/CL,IAAMI,GAASC,UAAOC,IAAV,2GAKCC,GAAeF,kBAAOD,GAAPC,CAAH,sEAKZG,GAAaH,UAAOC,IAAV,sHAML,gBAAGG,EAAH,EAAGA,IAAH,OAAsB,OAARA,EAAgB,MAAmB,OAARA,GAAgB,SAAoB,OAARA,GAAgB,QAAWA,KAC/F,gBAAGC,EAAH,EAAGA,QAAH,OAAiBA,GAAWA,KAGhCN,M,4BCnBFO,GAIR,CACHC,QAASvB,aAAa,gCACtBwB,UAAWxB,aAAa,kCACxByB,SAAUzB,aAAa,kCAGZ0B,GAAmB1B,aAAqB,0BACxC2B,GAAU3B,aAAqB,iBAC/B4B,GAAa5B,aAAqB,oBAClC6B,GAAa7B,aAAqB,oBACZA,aAAsB,6BCf1C,SAAS8B,GAAiBC,GACvC,MAAM,IAAN,OAAWA,EAAQC,MAAnB,YAA4BD,EAAQE,MAApC,YAA6CF,EAAQG,O,6BCAjDC,GAAMnB,kBAAOoB,OAAPpB,CAAH,4JAIQ,qBAAGqB,OAAsB,YAC7B,qBAAGC,WACJ,qBAAGC,UACI,qBAAGC,gBAGTC,GAAazB,kBAAOmB,GAAPnB,CAAH,iEAIV0B,GAAU1B,UAAOC,IAAV,0EAKP0B,GAAU3B,kBAAOmB,GAAPnB,CAAH,0IAER,gBAAGI,EAAH,EAAGA,IAAH,OAAaA,GAAG,WAAQA,MACf,gBAAGC,EAAH,EAAGA,QAAH,OAAiBA,GAAWA,KAGnC,qBAAGD,OAIJwB,GAAW5B,kBAAOmB,GAAPnB,CAAH,qEAET,gBAAGI,EAAH,EAAGA,IAAH,OAAaA,GAAG,WAAQA,MAGrBe,M,QC1BA,SAASU,GAAT,GAYX,IAXFC,EAWC,EAXDA,OACAC,EAUC,EAVDA,QACAC,EASC,EATDA,QACAC,EAQC,EARDA,QACAC,EAOC,EAPDA,KAQM9C,EAAcM,KACdyC,EAAkBtC,uBAAY,kBAAMT,EAAY0C,KAAS,CAACA,EAAQ1C,IAClEO,EAAWC,cAEXwC,EAAqBvC,uBAAY,WACjCqC,IACJvC,EAASe,GAAiBqB,IAC1BI,OACC,CAACD,EAAMvC,EAAUoC,EAASI,IAE7B,EAA+EE,mBAAQ,WACrF,OAAOC,aAAeN,EAAQO,OAAQN,EAAQM,UAC7C,CAACN,EAAQM,OAAQP,EAAQO,SAFbC,EAAf,EAAQC,MAA6BC,EAArC,EAA4BC,QAAiCC,EAA7D,EAAoDC,QAG9CC,EAAmBT,mBACvB,kBACElI,OAAOC,KAAKsI,GAAejK,QAAO,SAACC,EAAMhC,GAAP,OAAwBgC,EAAOyB,OAAOC,KAAKsI,EAAchM,IAAU2D,SAAQ,KAC/G,CAACqI,IAGH,OACE,eAACf,GAAD,UACE,eAACxB,GAAD,CAAY4C,MAAO,CAAEC,KAAM,KAAO5C,IAAI,MAAtC,SACG8B,EACC,gBAAC,IAAD,8BACwBF,EAAQiB,KADhC,wBACgE,IAC9D,kCAASnC,GAAiBmB,EAAQlB,WAFpC,OAKA,uCACE,iCACE,gBAAC,IAAD,CAAMmC,SAAS,OAAf,wDACmDlB,EAAQiB,KAD3D,MAEGnC,GAAiBkB,EAAQjB,SAF5B,OAE0CD,GAAiBmB,EAAQlB,SAFnE,QAIA,gCACGyB,EAAYnI,OAAS,EACpB,gCACGmI,EAAY1K,KAAI,SAACqL,EAAOC,GAAR,OACf,gBAAC,IAAMC,SAAP,WACE,yBAAQC,MAAOH,EAAMI,QAArB,SAA+BJ,EAAMK,SACpCJ,IAAMZ,EAAYnI,OAAS,EAAI,KAAO,OAFzC,UAAwB8I,EAAMzM,QAA9B,YAAyCyM,EAAMI,aAI7C,IANN,WASE,KACHX,EAAcvI,OAAS,EACtB,gCACGuI,EAAc9K,KAAI,SAACqL,EAAOC,GAAR,OACjB,gBAAC,IAAMC,SAAP,WACE,yBAAQC,MAAOH,EAAMI,QAArB,SAA+BJ,EAAMK,SACpCJ,IAAMR,EAAcvI,OAAS,EAAI,KAAO,OAF3C,UAAwB8I,EAAMzM,QAA9B,YAAyCyM,EAAMI,aAI7C,IANN,aASE,KACHT,EAAmB,EAAI,gCAAKA,EAAL,qBAA6C,WAGzE,gBAACnB,GAAD,WACE,sBAAKoB,MAAO,CAAEU,SAAU,EAAGC,YAAa,IAAxC,SACE,eAAC,IAAD,CAAQC,QAASvB,EAAjB,6BAEF,sBAAKW,MAAO,CAAEU,SAAU,GAAxB,SACE,eAAC,IAAD,CAAQE,QAASxB,EAAjB,iC,uEC9ET,SAASyB,GAAUC,GACxB,IACE,OAAOC,sBAAWD,GAClB,SACA,OAAO,GAIX,IAAME,GAAqD,CACzDC,GAAI,GACJC,GAAI,YAGC,SAASC,GAAexN,EAAkBH,EAAc4N,GAC7D,IAAMC,EAAM,kBAAcL,GAAiBrN,IAAYqN,GAAiBrH,IAAQC,SAApE,eAEZ,OAAQwH,GACN,IAAK,cACH,MAAM,GAAN,OAAUC,EAAV,eAAuB7N,GAEzB,IAAK,QACH,MAAM,GAAN,OAAU6N,EAAV,kBAA0B7N,GAE5B,IAAK,UACL,QACE,MAAM,GAAN,OAAU6N,EAAV,oBAA4B7N,IAM3B,SAAS8N,GAAed,GAAqC,IAApBe,EAAmB,uDAAX,EAChD1K,EAASgK,GAAUL,GACzB,IAAK3J,EACH,MAAMpD,MAAM,gCAAD,OAAiC+M,EAAjC,OAEb,MAAM,GAAN,OAAU3J,EAAO2K,UAAU,EAAGD,EAAQ,GAAtC,cAA8C1K,EAAO2K,UAAU,GAAKD,IAI/D,SAASE,GAAmBX,GACjC,OAAOA,EAAMY,IAAIC,KAAUC,KAAK,KAAOC,IAAIF,KAAUC,KAAK,OAAQ1E,IAAIyE,KAAUC,KAAK,MAQhF,SAASE,GAAwBhB,EAAuBiB,GAC7D,GAAIA,EAAW,GAAKA,EAAW,IAC7B,MAAMtO,MAAM,8BAAD,OAA+BsO,IAE5C,MAAO,CACL9G,IAAK+G,OAAO/G,IAAKgH,SAASnB,EAAMoB,IAAKjH,IAAKC,OAAO,IAAQ6G,IAAY9G,IAAKC,OAAO,MACjFD,IAAK+G,OAAO/G,IAAKgH,SAASnB,EAAMoB,IAAKjH,IAAKC,OAAO,IAAQ6G,IAAY9G,IAAKC,OAAO,OAe9E,SAASiH,GAAY3B,EAAiB4B,EAAUC,EAAuBvK,GAC5E,IAAK+I,GAAUL,IAAYA,IAAY8B,KACrC,MAAM7O,MAAM,gCAAD,OAAiC+M,EAAjC,OAGb,OAAO,IAAI+B,KAAS/B,EAAS4B,EAVxB,SAA6BC,EAAuBvK,GACzD,OAAOA,EANF,SAAmBuK,EAAuBvK,GAC/C,OAAOuK,EAAQG,UAAU1K,GAAS2K,mBAKjBD,CAAUH,EAASvK,GAAWuK,EASbK,CAAoBL,EAASvK,IAI1D,SAAS6K,GAAkBC,EAAWP,EAAuBvK,GAClE,OAAOqK,GAAY3I,EAAgBqJ,KAAuBR,EAASvK,G,4BCtFxDgL,GAAmB7F,UAAO8F,OAAV,oTAKjB,qBAAGC,SAA2B,UAAY,aAC3C,gBAAGC,EAAH,EAAGA,MAAH,SAAUD,SAA2BC,EAAMC,OAAOC,WAAaF,EAAMC,OAAOE,WAIhE,qBAAGJ,SAA2B,KAAO,eAKrC,qBAAGA,SAA2B,KAAO,eAS/CK,GAAqBpG,kBAAOqG,IAAPrG,CAAH,4RAGpB,qBAAGgG,MAAkBC,OAAOE,WAiBjCG,GAAatG,UAAO5I,EAAV,4RAGL,qBAAG4O,MAAkBC,OAAOE,WAoBhC,SAASI,GAAT,GAK8E,IAAD,IAJlFC,cAIkF,MAJzE,SAIyE,EAHlFC,EAGkF,EAHlFA,KAGkF,IAFlFC,WAEkF,MAF5E,sBAE4E,EAD/EC,EAC+E,wCAC5EC,EAAc/G,uBAClB,SAACgH,GACkB,WAAXL,GAAuBK,EAAMC,SAAWD,EAAME,SAClDF,EAAMG,mBAGV,CAACR,IAEH,OAAO,eAACF,GAAD,aAAYE,OAAQA,EAAQE,IAAKA,EAAKD,KAAMA,EAAM9C,QAASiD,GAAiBD,IAGrF,I,YAAMM,GAASC,oBAAH,wHASCC,GAAUnH,UAAOoH,IAAV,oGACFH,ICzFZI,GAAYrH,kBAAO2B,GAAP3B,CAAH,oDAIA,SAASsH,GAAT,GAQX,IAPFC,EAOC,EAPDA,KACAC,EAMC,EANDA,QACAC,EAKC,EALDA,QAMQ/Q,EAAYgI,KAAZhI,QAEFsP,EAAQ0B,qBAAWC,gBAEzB,OACE,gBAACN,GAAD,WACE,sBAAKtE,MAAO,CAAE6E,aAAc,IAA5B,SACGJ,EACC,eAAC,KAAD,CAAaK,MAAO7B,EAAMC,OAAOuB,QAASM,KAAM,KAEhD,eAAC,KAAD,CAAaD,MAAO7B,EAAMC,OAAO8B,QAASD,KAAM,OAGpD,gBAAC3H,GAAD,CAAYC,IAAI,MAAhB,UACE,eAAC,IAAD,iBAAOqH,QAAP,IAAOA,IAAP,gBAA2BF,EAAKS,MAAM,EAAG,GAAzC,cAAiDT,EAAKS,MAAM,GAAI,OAC/DtR,GAAW,eAAC6P,GAAD,CAAcE,KAAMvC,GAAexN,EAAS6Q,EAAM,eAAlD,mCC5Bb,I,SAAMU,GAAcjI,kBAAOkI,KAAPlI,CAAH,4HASXmI,GAAQnI,UAAOC,IAAV,wQAII,qBAAG+F,MAAkBC,OAAOmC,oBAO9C,qBAAGpC,MAAkBqC,aAAaC,MAIhCC,GAAQvI,UAAOC,IAAV,6IAMW,qBAAG+F,MAAkBC,OAAOuC,YAG5CC,GAAgBC,aAASH,IAEhB,SAASI,GAAT,GAQX,IAPFC,EAOC,EAPDA,cACAC,EAMC,EANDA,QACA/G,EAKC,EALDA,OAMM1C,EAAcM,KACdyC,EAAkBtC,uBAAY,kBAAMT,EAAY0C,KAAS,CAACA,EAAQ1C,IACxE0J,qBAAU,WACR,GAAsB,OAAlBF,EAAJ,CAEA,IAAMG,EAAUrP,YAAW,WACzByI,MACCyG,GAEH,OAAO,WACLI,aAAaD,OAEd,CAACH,EAAezG,IAEnB,IAEI8G,EAFEjD,EAAQ0B,qBAAWC,gBAGzB,GAAI,QAASkB,EAAS,CACpB,MAEIA,EADFK,IAAO3B,EADT,EACSA,KAAMC,EADf,EACeA,QAASC,EADxB,EACwBA,QAExBwB,EAAe,eAAC3B,GAAD,CAAkBC,KAAMA,EAAMC,QAASA,EAASC,QAASA,SACnE,GAAI,eAAgBoB,EAAS,CAClC,MAEIA,EADFM,WAAcpH,EADhB,EACgBA,QAASC,EADzB,EACyBA,QAASC,EADlC,EACkCA,QAASC,EAD3C,EAC2CA,KAE3C+G,EAAe,eAACpH,GAAD,CAAiBC,OAAQA,EAAQC,QAASA,EAASC,QAASA,EAASC,QAASA,EAASC,KAAMA,IAG9G,IAAMkH,EAAaC,aAAU,CAC3B1E,KAAM,CAAE2E,MAAO,QACfC,GAAI,CAAED,MAAO,MACbE,OAAQ,CAAEC,SAAQ,OAAEb,QAAF,IAAEA,SAAiBc,KAGvC,OACE,gBAACvB,GAAD,WACE,eAACF,GAAD,CAAaJ,MAAO7B,EAAMC,OAAOC,WAAYvC,QAASxB,IACrD8G,EACkB,OAAlBL,EAAyB,eAACH,GAAD,CAAe1F,MAAOqG,IAAiB,QCvFvE,IAAMO,GAAqB3J,UAAOC,IAAV,wLAGZ,qBAAG2J,UACH,qBAAGA,OAAuB,UAAY,KAC/B,qBAAGA,OAAuB,OAAS,KAGlD,qBAAG5D,MAAkBqC,aAAaC,MAKhCuB,GAAmB7J,UAAOC,IAAV,4NAYhB6J,GAAmB9J,kBAAOG,GAAPH,CAAH,mLAQlB,qBAAGgG,MAAkBqC,aAAaC,MAKvB,SAASyB,KAEtB,IAAMC,EVQD,WACL,IAAMC,EAAO3K,aAAY,SAACC,GAAD,OAAqBA,EAAMC,YAAY0K,aAChE,OAAO7H,mBAAQ,kBAAM4H,EAAKE,QAAO,SAAApS,GAAI,OAAIA,EAAKqS,UAAO,CAACH,IUVjCI,GAErB,OACE,uCACE,eAACP,GAAD,CAAkB1J,IAAI,OAAtB,SACG4J,EAAalS,KAAI,SAACC,GAAD,OAChB,eAAC4Q,GAAD,CAA0BE,QAAS9Q,EAAK8Q,QAAS/G,OAAQ/J,EAAK+H,IAAK8I,cAAe7Q,EAAK6Q,eAAvE7Q,EAAK+H,UAGzB,eAAC6J,GAAD,CAAoBC,QAAoB,OAAZI,QAAY,IAAZA,OAAA,EAAAA,EAAc3P,QAAS,EAAI,cAAgB,EAAvE,SACE,eAACwP,GAAD,UACGG,EACEhC,MAAM,GACNsC,UACAxS,KAAI,SAACC,GAAD,OACH,eAAC4Q,GAAD,CAA0BE,QAAS9Q,EAAK8Q,QAAS/G,OAAQ/J,EAAK+H,IAAK8I,cAAe7Q,EAAK6Q,eAAvE7Q,EAAK+H,e,0BCzD7BmH,GAASC,oBAAH,wHASNqD,GAAYvK,UAAOwK,IAAV,mIACGvD,IACN,qBAAGa,QACJ,qBAAGA,QAEA,gBAAG2C,EAAH,EAAGA,OAAQzE,EAAX,EAAWA,MAAX,cAAuByE,QAAvB,IAAuBA,IAAUzE,EAAMC,OAAOE,WAQ7C,SAASuE,GAAT,GAAyF,IAAD,IAAtE5C,YAAsE,MAA/D,OAA+D,EAAvD2C,EAAuD,EAAvDA,OAAW9D,EAA4C,kCACrG,OACE,eAAC4D,GAAD,yBAAWI,QAAQ,YAAYC,KAAK,OAAOC,MAAM,6BAA6B/C,KAAMA,EAAM2C,OAAQA,GAAY9D,GAA9G,aACE,uBACEmE,EAAE,6HACFC,YAAY,MACZC,cAAc,QACdC,eAAe,aCvBvB,I,SAAMC,GAAiBlL,UAAOC,IAAV,sHAOdkL,GAAUnL,UAAOoL,GAAV,6CACF,qBAAGpF,MAAkBC,OAAOoF,eAGxB,SAASC,GAAT,GAAoE,IAAxCC,EAAuC,EAAvCA,SACjCC,EAAMC,eAAND,EACA1M,EAAW4M,cAAX5M,OACR,EAAkF4M,YAAa/N,IAA/EgO,EAAhB,EAAQ7M,OAA8B8M,EAAtC,EAA+B7S,MAA+B8S,EAA9D,EAAoDC,SAG9CC,EdVD,WACL,MAA6BnN,cAArBkN,EAAR,EAAQA,SAAUhN,EAAlB,EAAkBA,OAClB,EAA0BkN,oBAAS,GAAnC,mBAAOC,EAAP,KAAcC,EAAd,KA0BA,OAxBApD,qBAAU,WACRzN,EAAS8Q,eAAehT,MAAK,SAACgT,GAC5B,IAAMC,EAAcC,OAAOC,aAAaC,QAAQC,KAC5CL,GAAgBC,GAITK,YAAYJ,OAAOK,UAAYN,EAHxCN,EAASzQ,OAAUqO,GAAW,GAAMrQ,OAAM,WACxC6S,GAAS,MAOXA,GAAS,QAGZ,CAACJ,IAGJhD,qBAAU,WACJhK,GACFoN,GAAS,KAEV,CAACpN,IAEGmN,EclBYU,GAGnB7D,qBAAU,YACJiD,GAAeJ,GAAkBC,GAAiB9M,GACpD+M,EAAgBzQ,KAEjB,CAAC2Q,EAAYJ,EAAeC,EAAcC,EAAiB/M,IdkBzD,WAAgD,IAAnB8N,EAAkB,wDACpD,EAAoChO,cAA5BE,EAAR,EAAQA,OAAQ/F,EAAhB,EAAgBA,MAAO+S,EAAvB,EAAuBA,SAEvBhD,qBAAU,WACR,IAAQ4D,EAAaL,OAAbK,SAER,GAAIA,GAAYA,EAASG,KAAO/N,IAAW/F,IAAU6T,EAAU,CAC7D,IAAME,EAAqB,WAEzBhB,EAASzQ,OAAUqO,GAAW,GAAMrQ,OAAM,SAAC0T,GACzC1V,QAAQ0B,MAAM,yCAA0CgU,OAItDC,EAAwB,SAACC,GACzBA,EAAS5S,OAAS,GAEpByR,EAASzQ,OAAUqO,GAAW,GAAMrQ,OAAM,SAAC0T,GACzC1V,QAAQ0B,MAAM,4CAA6CgU,OAQjE,OAHAL,EAASG,GAAG,eAAgBC,GAC5BJ,EAASG,GAAG,kBAAmBG,GAExB,WACDN,EAASQ,iBACXR,EAASQ,eAAe,eAAgBJ,GACxCJ,EAASQ,eAAe,kBAAmBF,QAKhD,CAAClO,EAAQ/F,EAAO6T,EAAUd,IcjD7BqB,EAAqBpB,GAGrB,MAAoCC,oBAAS,GAA7C,mBAAOoB,EAAP,KAAmBC,EAAnB,KAYA,OAXAvE,qBAAU,WACR,IAAMC,EAAUrP,YAAW,WACzB2T,GAAc,KACb,KAEH,OAAO,WACLrE,aAAaD,MAEd,IAGEgD,GAKAjN,GAAU8M,EAEX,eAACV,GAAD,UACE,eAACC,GAAD,UAAUK,EAAE,oBAMb1M,GAAW6M,EAQTJ,EAPE6B,EACL,eAAClC,GAAD,UACE,eAACR,GAAD,MAEA,KAlBG,KCnDX,I,2BAAM4C,GAAOtN,UAAOC,IAAV,mJAIG,qBAAGqB,WACJ,qBAAGC,UACI,qBAAGC,gBAEP8L,MAEFC,GAAYvN,kBAAOsN,GAAPtN,CAAH,kFACA,qBAAGgG,MAAkBC,OAAOmC,oBAC5B,qBAAGpC,MAAkBC,OAAOmC,oBAGrCoF,GAAWxN,kBAAOsN,GAAPtN,CAAH,wDACC,qBAAGgG,MAAkBC,OAAOuC,Y,4BCV5CiF,GAAwB/E,aAASgF,MAEjCC,GAAsB3N,kBAAOyN,GAAPzN,CAAH,4QAcnB4N,GAAwBlF,aAASmF,MAGjCC,GAAsB9N,mBAAO,cAAG+N,UAAH,EAAcC,UAAd,EAAyBC,OAAzB,EAAiCC,OAAjC,IAA4CvH,EAA5C,mEACjC,eAACiH,GAAD,eAA2BjH,OAC1BwH,MAAM,CACP,aAAc,UAHYnO,CAAH,kbAOD,qBAAGgG,MAAkBC,OAAOmC,oBAC5B,qBAAGpC,MAAkBC,OAAOmC,mBACtBgG,aAAe,IAAM,YAKjC,qBAAGH,OAAuB,WAAa,YAGnD,gBAAGD,EAAH,EAAGA,UAAH,OACAA,GACAK,cADS,+DAEOL,MAEhB,gBAAGD,EAAH,EAAGA,UAAH,OACAA,GACAM,cADS,+DAEON,MAKhB,qBAAG/H,MAAkBqC,aAAaiG,MAGlC,qBAAGtI,MAAkBqC,aAAaC,MAezB,SAASiG,GAAT,GAOC,IANdL,EAMa,EANbA,OACAM,EAKa,EALbA,UAKa,IAJbT,iBAIa,aAHbC,iBAGa,MAHD,GAGC,EAFbS,EAEa,EAFbA,gBACAlD,EACa,EADbA,SAEMmD,EAAiBC,aAAcT,EAAQ,KAAM,CACjD1E,OAAQ,CAAEC,SAAU,KACpB9E,KAAM,CAAEiK,QAAS,GACjBC,MAAO,CAAED,QAAS,GAClBE,MAAO,CAAEF,QAAS,KAGpB,OACE,qCACGF,EAAe5W,KACd,gBAAGC,EAAH,EAAGA,KAAM+H,EAAT,EAASA,IAAKiP,EAAd,EAAcA,MAAd,OACEhX,GACE,eAAC4V,GAAD,CAA+B5K,MAAOgM,EAAOP,UAAWA,EAAWC,gBAAiBA,EAApF,SACE,gBAACX,GAAD,CACEkB,aAAW,iBACXjB,UAAWA,EACXC,UAAWA,EACXC,OAAQxB,WAJV,WAQIgC,GAAmBhC,WAAW,sBAAKwC,SAAU,IAAQ,KAEtD1D,MAXqBzL,QCzF/B,I,MAAMoP,GAAUlP,UAAOC,IAAV,mEAIPkP,GAAUnP,kBAAOG,GAAPH,CAAH,gDAIPoP,GAAgBpP,kBAAOE,GAAPF,CAAH,kDAIbqP,GAAgBrP,kBAAOmP,GAAPnP,CAAH,iIACJ,qBAAGgG,MAAkBC,OAAOmC,oBAQ5CkH,GAAsBtP,UAAOC,IAAV,yGAIjBsP,KAUKC,GAAgB,SAAC,GAAD,IAAGjE,EAAH,EAAGA,SAAUiD,EAAb,EAAaA,UAAb,OAC3B,gBAACc,GAAD,WACE,eAAC,IAAD,UAAU/D,IACV,eAAC,IAAD,CAAY5H,QAAS6K,EAAWiB,QAAQ,OAAxC,SACE,eAAC,IAAD,CAAW5H,MAAM,kBCpCjB6H,GAAqB1P,kBAAOmH,GAAPnH,CAAH,6DACZ,qBAAG8H,QACJ,qBAAGA,QAwBC6H,GArBoB,SAAC,GAAiE,IAA/DnB,EAA8D,EAA9DA,UAAWoB,EAAmD,EAAnDA,YAC/C,OACE,eAACV,GAAD,UACE,gBAACC,GAAD,WACE,eAAC,GAAD,CAAeX,UAAWA,EAA1B,sCACA,eAACY,GAAD,UACE,eAACM,GAAD,CAAoBG,IAAI,0BAA0BC,IAAI,SAAShI,KAAK,WAEtE,gBAAC3H,GAAD,CAAYC,IAAI,OAAOC,QAAQ,SAA/B,UACE,eAACF,GAAD,CAAYC,IAAI,OAAOC,QAAQ,SAA/B,SACE,eAAC,IAAD,CAAM6C,SAAS,OAAf,SACE,kCAAS0M,QAGb,eAAC,IAAD,CAAM1M,SAAS,OAAf,8D,UCUK6M,GAvBqB,SAAC,GAAoE,IAAlEvB,EAAiE,EAAjEA,UAAW9X,EAAsD,EAAtDA,QAAS6Q,EAA6C,EAA7CA,KACnDvB,EAAQ0B,qBAAWC,gBAEzB,OACE,eAACuH,GAAD,UACE,gBAACC,GAAD,WACE,eAAC,GAAD,CAAeX,UAAWA,EAA1B,mCACA,eAACY,GAAD,UACE,eAAC,KAAD,CAAerE,YAAa,GAAKjD,KAAM,GAAID,MAAO7B,EAAMC,OAAOE,YAEjE,gBAAChG,GAAD,CAAYC,IAAI,MAAMC,QAAQ,SAA9B,UACG3J,GAAW6Q,GACV,eAAC,IAAD,CAAcd,KAAMvC,GAAexN,EAAS6Q,EAAM,eAAlD,6BAEF,eAAC,IAAD,CAAQ5D,QAAS6K,EAAWwB,GAAG,OAA/B,4BCYKC,GA1BsB,SAAC,GAOP,IAN7B/B,EAM4B,EAN5BA,OACAM,EAK4B,EAL5BA,UACA0B,EAI4B,EAJ5BA,cACA3I,EAG4B,EAH5BA,KACAqI,EAE4B,EAF5BA,YACA/G,EAC4B,EAD5BA,QAEQnS,EAAYgI,KAAZhI,QAER,OAAKA,EAIH,eAAC6X,GAAD,CAAOL,OAAQA,EAAQM,UAAWA,EAAWR,UAAW,GAAxD,SACGkC,EACC,eAAC,GAAD,CAA4B1B,UAAWA,EAAWoB,YAAaA,IAC7DrI,EACF,eAAC,GAAD,CAA6B7Q,QAASA,EAAS6Q,KAAMA,EAAMiH,UAAWA,IAEtE3F,MAVe,MCHRsH,GAZkB,SAAC,GAAoF,IAAlF7M,EAAiF,EAAjFA,MAAO8M,EAA0E,EAA1EA,cAAe5B,EAA2D,EAA3DA,UAAW6B,EAAgD,EAAhDA,WACnE,OACE,gBAACnB,GAAD,WACE,gBAACC,GAAD,WACE,eAAC,GAAD,CAAeX,UAAWA,EAA1B,SAAsClL,IACrC+M,OAEH,eAAChB,GAAD,CAAejP,IAAI,OAAnB,SAA2BgQ,U,UCYlBE,GApBiB,SAAC,GAA0D,IAAxDja,EAAuD,EAAvDA,QAASmY,EAA8C,EAA9CA,UACpCxI,EAAQ0B,qBAAWC,gBACzB,OACE,gBAACuH,GAAD,WACE,gBAACC,GAAD,WACE,eAAC,GAAD,CAAeX,UAAWA,EAA1B,mBACA,gBAACrO,GAAD,CAAY4C,MAAO,CAAEwN,UAAW,GAAIjP,QAAS,UAAYlB,IAAI,OAAOC,QAAQ,SAA5E,UACE,eAAC,KAAD,CAAewH,MAAO7B,EAAMC,OAAO8B,QAAShF,MAAO,CAAEgI,YAAa,KAAOjD,KAAM,KAC/E,eAAC,IAAD,CAAM5E,SAAS,OAAO2E,MAAM,UAAU9E,MAAO,CAAEyN,UAAW,SAAUlH,MAAO,OAA3E,SACGjT,UAIP,eAACgZ,GAAD,CAAejP,IAAI,OAAnB,SACE,eAAC,IAAD,CAAQuD,QAAS6K,EAAjB,2BChBOyB,MCATQ,GAA4C,CAChDC,aAAc,GACdC,gBAAiB,cAGNC,GAAsBC,wBAAcJ,ICT3CK,GAAgB,UAUTC,GAAiB,SAACL,EAA0BM,EAAuBC,GAC9E,IAAMC,EAAmBR,EAAaS,MAAK,SAACC,GAC1C,OAAOA,EAAY7a,KAAK8a,WAAaL,KAEvC,GAAIE,EAAkB,CACpB,IAAMI,EAAmBJ,EAAiB3a,KAAKgb,KAE/C,OADyBD,EAAiBE,SAAS,KAd1B,SAACN,EAA0BD,GAEtD,IAAMQ,EAAkBX,GAAcY,KAAKR,GAAmB,GACxDS,EAAiBT,EAAiBU,MAAM,KAAKC,QAAQJ,GACrDK,EAAuBb,EAASW,MAAM,KAAKD,GACjD,OAAOT,EAAiBa,QAAQN,EAAiBK,GAWtCE,CAAqBV,EAAkBL,GAEzCK,EAET,OAAOL,GAGIgB,GAAkB,SAACjB,EAAuBC,GACrD,IAAQP,EAAiBhJ,qBAAWkJ,IAA5BF,aACR,MAAwB,UAApBA,EAAa,GACRO,EAELP,EAAarW,OAAS,EACjB0W,GAAeL,EAAcM,EAAeC,GAE9C,MCVMiB,GAtBC,WACd,IAAQxB,EAAiBhJ,qBAAWkJ,IAA5BF,aAOR,OAAO7Q,uBACL,SAACmR,EAAuBC,GACtB,MAAwB,UAApBP,EAAa,GACRO,EAELP,EAAarW,OAAS,EACjB0W,GAAeL,EAAcM,EAAeC,GAE9CA,IAET,CAACP,KChBCyB,GAAYnS,UAAOC,IAAV,sDA6BAmS,I,GAAAA,GAzBf,YAA6D,IAAD,IAA7CC,mBAA6C,MAA/B,EAA+B,EACpDJ,EAAkBC,KACxB,OACE,eAACC,GAAD,UACE,gBAAC,IAAD,CAAYE,YAAaA,EAAaC,MAAM,KAAK7C,QAAQ,SAAzD,UACE,eAAC,IAAD,CAAgB7W,GAAG,gBAAgB2Q,GAAG,QAAQgJ,GAAIlM,IAAlD,SACG4L,EAAgB,KAAM,UAEzB,eAAC,IAAD,CAAgBrZ,GAAG,gBAAgB2Q,GAAG,QAAQgJ,GAAIlM,IAAlD,SACG4L,EAAgB,IAAK,eAExB,eAAC,IAAD,CACErZ,GAAG,gBACH2Z,GAAG,IACH9L,KAAK,oCACLD,OAAO,SACPE,IAAI,sBALN,0B,8BCfO8L,GAFS,IAAIC,KAAUC,I,UCUzBC,GAAb,kDAKE,WAAYC,EAAsBC,GAAkB,IAAD,8BACjD,cAAMD,EAAUlc,QAASkc,EAAUrP,QAASqP,EAAUE,SAAUF,EAAUpP,OAAQoP,EAAU3P,OAL9E2P,eAImC,IAFnCC,UAEmC,EAEjD,EAAKD,UAAYA,EACjB,EAAKC,KAAOA,EAHqC,EALrD,yCAWE,WACE,OAAOlZ,KAAKiZ,UAAUG,YAZ1B,GAAsCtW,KAqBhCuW,IAA2B,qBAC9BtW,IAAQC,QAAU,IADY,eAE9BD,IAAQW,WAAa,IAFS,IAK3B4V,GACe,qBAAZC,QAA0B,IAAIA,QAAwC,KA+BxE,SAASC,GAAaxc,GAC3B,IAAMyc,EAAQ9T,aAAkD,SAAAC,GAAK,OAAIA,EAAM6T,MAAMC,SACrF,OAAOhR,mBAAQ,WAAO,IAAD,EACnB,IAAK1L,EAAK,OAAOqc,GACjB,IAAMra,EAAO,UAAGya,EAAMzc,UAAT,aAAG,EAAYgC,QAC5B,IAAKA,EAAS,OAAOqa,GACrB,IACE,OApCC,SAAwB/I,GAC7B,IAAMpR,EAAM,OAAGoa,SAAH,IAAGA,QAAH,EAAGA,GAAWK,IAAIrJ,GAC9B,GAAIpR,EAAQ,OAAOA,EAEnB,IAAMf,EAAMmS,EAAK1H,OAAO9J,QACtB,SAAC8a,EAAUX,GAAe,IAAD,MACjBC,EAAe,oBACnBD,EAAUC,YADS,iBACnB,EACI/a,KAAI,SAAA0b,GAAU,IAAD,EACb,GAAI,UAACvJ,EAAK4I,YAAN,aAAC,EAAYW,GACjB,OAAO,2BAAKvJ,EAAK4I,KAAKW,IAAtB,IAA8B5a,GAAI4a,cAJnB,aACnB,EAKIrJ,QAAO,SAACsJ,GAAD,OAAqBC,QAAQD,aANrB,QAM4B,GAC3CtQ,EAAQ,IAAIwP,GAAiBC,EAAWC,GAC9C,QAA+CnJ,IAA3C6J,EAASpQ,EAAMzM,SAASyM,EAAMI,SAAwB,MAAM/M,MAAM,qBACtE,OAAO,2BACF+c,GADL,kBAEGpQ,EAAMzM,QAFT,2BAGO6c,EAASpQ,EAAMzM,UAHtB,kBAIKyM,EAAMI,QAAUJ,QAfb,eAmBL6P,KAGP,OADS,OAATC,SAAS,IAATA,OAAWU,IAAI1J,EAAMnS,GACdA,EAUI8b,CAAejb,GACtB,MAAOI,GAEP,OADA1B,QAAQ0B,MAAM,yCAA0CA,GACjDia,MAER,CAACI,EAAOzc,IAGN,SAASkd,KACd,OAAOvU,aAA4D,SAAAC,GAAK,OAAIA,EAAM6T,MAAMU,mBAGnF,SAASC,KACd,OAAOZ,GAAaU,MCrFtB,IAAMG,GAAgB,sBAChBC,GAAkB,gBACjB,SAASC,GAAUC,GACxB,IAAKH,GAAcI,KAAKD,EAAK5Q,SAC3B,MAAM,IAAI/M,MAAJ,2BAA8B2d,EAAK5Q,UAE3C,IAAK0Q,GAAgBG,KAAKD,EAAKE,UAC7B,MAAM,IAAI7d,MAAJ,uBAA0B2d,EAAKE,WAEvC,MAAM,GAAN,OAAUF,EAAK5Q,QAAf,YAA0B4Q,EAAKE,UAG1B,SAASC,GAAaC,GAC3B,IAAMC,EAAMD,EAAQ3C,MAAM,KAC1B,GAAmB,IAAf4C,EAAIna,OACN,MAAM,IAAI7D,MAAJ,4BAA+B+d,IAEvC,MAAO,CACLhR,QAASiR,EAAI,GACbH,SAAUG,EAAI,IASX,IAAMC,GAAwBzV,aACnC,mCAEW0V,GAA2B1V,aACtC,sCAEW2V,GAA2B3V,aACtC,sCAEW4V,GAAgC5V,aAI1C,2CACU6V,GAAyB7V,aAMnC,oCC7BH,SAAS8V,GAAYrB,GACnB,OAAmD,IAA5C,CAAC,SAAU,UAAU5B,eAAe4B,GAG7C,SAASsB,GAAkBtB,GACzB,YACQ/J,IAAN+J,GACCuB,MAAMC,QAAQxB,IAAMA,EAAEyB,OAAM,SAACC,GAAD,OAAQL,GAAYK,IAAQH,MAAMC,QAAQE,IAAOA,EAAGD,MAAMJ,OAU3F,IAAMM,GAA6B,CAAEC,OAAO,EAAO5V,iBAAaiK,EAAWnT,UAAMmT,GAGpE4L,GAAgC,CAC3CC,eAAgBC,KAIlB,SAASC,GAAaC,EAA6BC,GACjD,IAAQjf,EAAYgI,KAAZhI,QACFkf,EAActW,aAClB,SAACC,GAAD,OAAWA,EAAMsW,UAAUD,eAEvBjW,EAAWC,cAEXkW,EAA6BzT,mBACjC,4BACEzK,KAAKC,UAAL,iBACE6d,QADF,IACEA,GADF,UACEA,EACIvL,QAAO,SAAC4L,GAAD,OAAkBrC,QAAQqC,aAFvC,iBACE,EAEIje,IAAIoc,WAHV,aACE,EAGI8B,cAJN,QAIgB,MAElB,CAACN,IA4BH,OAxBA5M,qBAAU,WACR,IAAMmN,EAAqBre,KAAKse,MAAMJ,GACtC,GAAKpf,GAA+B,IAApBuf,EAAS5b,OAAzB,CAEA,IAAMqb,EAAQO,EAASne,KAAI,SAACgI,GAAD,OAASwU,GAAaxU,MASjD,OARAH,EACE8U,GAAsB,CACpB/d,UACAgf,QACAC,aAIG,WACLhW,EACE+U,GAAyB,CACvBhe,UACAgf,QACAC,iBAIL,CAACjf,EAASiJ,EAAUgW,EAASG,IAEzBzT,mBACL,kBAEEqT,EAAM5d,KAAgB,SAACqc,GAAU,IAAD,EAC9B,IAAKzd,IAAYyd,EAAM,OAAOiB,GAE9B,IAAMvc,EAAM,UAAG+c,EAAYlf,UAAf,aAAG,EAAuBwd,GAAUC,IAGhD,MAAO,CAAEkB,OAAO,EAAM9e,MAFH,OAANsC,QAAM,IAANA,OAAA,EAAAA,EAAQtC,OAAyB,QAAX,OAANsC,QAAM,IAANA,OAAA,EAAAA,EAAQtC,MAAgBsC,EAAOtC,KAAO,KAEvCkJ,YAAW,OAAE5G,QAAF,IAAEA,OAAF,EAAEA,EAAQ4G,kBAErD,CAACmW,EAAaF,EAAOhf,IAgBzB,IAAMyf,GAAgC,CAAEd,OAAO,EAAOxc,YAAQ6Q,EAAW0M,SAAS,EAAOC,SAAS,EAAOtd,OAAO,GAC1Gud,GAAgC,CAAEjB,OAAO,EAAMxc,YAAQ6Q,EAAW0M,SAAS,EAAMC,SAAS,EAAMtd,OAAO,GAE7G,SAASwd,GACPC,EACAC,EACAC,EACAC,GAEA,IAAKH,EAAY,OAAOL,GACxB,IAAQd,EAA6BmB,EAA7BnB,MAAO9e,EAAsBigB,EAAtBjgB,KAAMkJ,EAAgB+W,EAAhB/W,YACrB,IAAK4V,EAAO,OAAOc,GACnB,GAAId,IAAU5V,EAAa,OAAO6W,GAClC,IAAKG,IAAsBC,IAAaC,EAAmB,OAAOL,GAClE,IAEIzd,EAFE2O,EAAUjR,GAAQA,EAAK8D,OAAS,EAChCgc,GAAU,OAAC5W,QAAD,IAACA,IAAe,GAAKkX,EAErC,GAAInP,GAAWjR,EACb,IACEsC,EAAS4d,EAAkBG,qBAAqBF,EAAUngB,GAC1D,MAAOwC,GAEP,OADA1B,QAAQ0B,MAAM,6BAA8B2d,EAAUngB,GAC/C,CACL8e,OAAO,EACPe,SAAS,EACTrd,OAAO,EACPsd,UACAxd,UAIN,MAAO,CACLwc,OAAO,EACPe,SAAS,EACTC,UACAxd,SACAE,OAAQyO,GAkCL,SAASqP,GACdC,EACAL,EACAM,EACAC,EACArB,GAEA,IAAMe,EAAWrU,mBAAQ,kBAAMoU,EAAkBQ,YAAYF,KAAa,CAACN,EAAmBM,IACxF1C,EAA+BhS,mBACnC,kBACEqU,GAAY3B,GAAkBiC,GAC1BP,EAAkBS,mBAAmBR,EAAUM,QAC/CtN,IACN,CAACsN,EAAYP,EAAmBC,IAkB5BS,EAAU1B,GAfFpT,mBACZ,kBACEqU,GAAYI,GAAaA,EAAUzc,OAAS,GAAKga,EAC7CyC,EAAUhf,KAAsB,SAACyL,GAC/B,OAAOA,GAAW8Q,EACd,CACE9Q,UACA8Q,iBAEF3K,KAEN,KACN,CAACoN,EAAWzC,EAAUqC,IAGYf,GAE9BgB,EAAoBtX,KAE1B,OAAOgD,mBAAQ,WACb,OAAO8U,EAAQrf,KAAI,SAACe,GAAD,OAAY0d,GAAY1d,EAAQ4d,EAAmBC,EAAUC,QAC/E,CAACD,EAAUS,EAASV,EAAmBE,IAGrC,SAASS,GACdC,EACAN,EACAO,EACA3B,GAEA,IAAMe,EAAWrU,mBAAQ,+BAAMgV,QAAN,IAAMA,GAAN,UAAMA,EAAUE,iBAAhB,aAAM,EAAqBN,YAAYF,KAAa,CAACM,EAAUN,IAalFle,EAAS4c,GAXDpT,mBAAgB,WAC5B,OAAOgV,GAAYX,GAAY3B,GAAkBuC,GAC7C,CACE,CACE/T,QAAS8T,EAAS9T,QAClB8Q,SAAUgD,EAASE,UAAUL,mBAAmBR,EAAUY,KAG9D,KACH,CAACD,EAAUX,EAAUY,IAEW3B,GAAS,GACtCgB,EAAoBtX,KAE1B,OAAOgD,mBAAQ,WACb,OAAOkU,GAAY1d,EAAD,OAASwe,QAAT,IAASA,OAAT,EAASA,EAAUE,UAAWb,EAAUC,KACzD,CAAC9d,EAAQwe,EAAUX,EAAUC,I,yBChPrBa,GAAwBxY,aAA2C,8BACnEyY,GAAqBzY,aAAwC,2BAC7D0Y,GAAuB1Y,aAA0C,6BACjE2Y,GAA8B3Y,aACzC,oCAEW4Y,GAAqB5Y,aAAuC,2BAC5D6Y,GAAqB7Y,aAAmD,2BACxE8Y,GAAwB9Y,aAAmD,8BAC3E+Y,GAAoB/Y,aAAiD,0BACrEgZ,GAAuBhZ,aAClC,6BAEWiZ,GAAYjZ,aAAmB,kBAC/BkZ,GAAclZ,aAAmB,oBC7BxCmZ,GAAY,UCyBlB,SAASC,GAAejV,GACtB,MAAO,CACLzM,QAASyM,EAAMzM,QACf6M,QAASJ,EAAMI,QACfuP,SAAU3P,EAAM2P,SAChBtP,OAAQL,EAAMK,OACdP,KAAME,EAAMF,MAIhB,SAASoV,GAAiBC,GACxB,OAAO,IAAI7b,IACT6b,EAAgB5hB,QAChB4hB,EAAgB/U,QAChB+U,EAAgBxF,SAChBwF,EAAgB9U,OAChB8U,EAAgBrV,MAoDb,SAASsV,KACd,OAAOjZ,aAA0D,SAACC,GAAD,OAAWA,EAAMiZ,KAAKC,kBAclF,SAASC,KACd,IAAM/Y,EAAWC,cAYjB,MAAO,CAXuBN,aAAiE,SAACC,GAC9F,OAAOA,EAAMiZ,KAAKG,yBAGa9Y,uBAC/B,SAAC+Y,GACCjZ,EAASgY,GAA4B,CAAEgB,sBAAuBC,OAEhE,CAACjZ,KAME,SAASkZ,KACd,IAAMlZ,EAAWC,cAYjB,MAAO,CAXcN,aAAwD,SAACC,GAC5E,OAAOA,EAAMiZ,KAAKM,gBAGIjZ,uBACtB,SAACkZ,GACCpZ,EAASiY,GAAmB,CAAEkB,aAAcC,OAE9C,CAACpZ,KA0BE,SAASqZ,KACd,IAAQtiB,EAAYgI,KAAZhI,QACFuiB,EAAsB3Z,aAAkD,qBAAGkZ,KAAQjW,UAEzF,OAAOF,mBAAQ,WAAO,IAAD,EACnB,OAAK3L,EACEyD,OAAO+e,OAAP,UAAcD,EAAoBviB,UAAlC,QAAyD,IAAIoB,IAAIugB,IADnD,KAEpB,CAACY,EAAqBviB,IAG3B,SAASyiB,GAAcC,GACrB,MAAO,CACLC,OAAQjB,GAAegB,EAAKC,QAC5BC,OAAQlB,GAAegB,EAAKE,SAoBzB,SAASC,GAAT,GAAsE,IAAD,mBAAxCC,EAAwC,KAAhCC,EAAgC,KAC1E,OAAO,IAAIhd,IAAM+c,EAAO9iB,QAASgjB,IAAK5V,WAAW0V,EAAQC,GAAS,GAAI,UAAW,e,yDC/L7EE,IAAoD,qBACvDjd,IAAQC,QAAU,8CADqC,eAEvDD,IAAQW,WAAa,8CAFkC,ICW1D,SAASuc,GAAYrW,EAA6B4B,GAAyD,IAA/C0U,IAA8C,yDACxG,EAA6Bnb,KAArB0G,EAAR,EAAQA,QAASvK,EAAjB,EAAiBA,QAEjB,OAAOwH,mBAAQ,WACb,IAAKkB,IAAY4B,IAAQC,EAAS,OAAO,KACzC,IACE,OAAOF,GAAY3B,EAAS4B,EAAKC,EAASyU,GAAwBhf,EAAUA,OAAU6O,GACtF,MAAO3Q,GAEP,OADA1B,QAAQ0B,MAAM,yBAA0BA,GACjC,QAER,CAACwK,EAAS4B,EAAKC,EAASyU,EAAsBhf,IAG5C,SAASif,GAAiBC,EAAuBF,GACtD,OAAOD,GAAYG,EAAcrH,GAAWmH,GAQvC,SAASG,GAAwBH,GACtC,IAAQnjB,EAAYgI,KAAZhI,QAER,GAAIA,EACF,OAAQA,GACN,KAAKgG,IAAQC,QACb,KAAKD,IAAQW,YAGjB,OAAOuc,GAPHrW,UAOwB0W,GAASJ,GAGhC,SAASK,GAAuB3W,EAA6BsW,GAClE,OAAOD,GAAYrW,EAAS4W,GAAyBN,GAWhD,SAASO,KACd,IAAQ1jB,EAAYgI,KAAZhI,QACR,OAAOkjB,GAAYljB,GAAWijB,GAAmBjjB,GAAU2jB,IAAe,GCnDrE,SAASC,KACd,IAAQ5jB,EAAYgI,KAAZhI,QACF6jB,EAAkBvB,KAClBwB,EAAYzG,KAElB,OAAO1R,mBAAQ,WACb,OAAK3L,EAEH6jB,EAEG9hB,QACC,SAAC8a,EAAUpQ,GAET,OADAoQ,EAASpQ,EAAMI,SAAWJ,EACnBoQ,IALb,eASSiH,EAAU9jB,KAXA,KAcpB,CAACA,EAAS6jB,EAAiBC,IAUhC,IAAMC,GAAgB,sBACtB,SAASC,GAAqBC,EAAyBC,EAA6BC,GAClF,OAAOF,GAAOA,EAAItgB,OAAS,EACvBsgB,EACAC,GAAWH,GAAcrG,KAAKwG,GAC9BE,aAAmBF,GACnBC,EAMC,SAASE,GAAShB,GACvB,IAAQrjB,EAAYgI,KAAZhI,QACF6L,EAAS+X,KAET/W,EAAUK,GAAUmW,GAEpBiB,EAAgBlB,GAAiBvW,QAAWmG,GAAW,GACvDuR,EDRD,SAAiClB,EAAuBF,GAC7D,OAAOD,GAAYG,EAAcmB,GAAmBrB,GCOvBsB,CAAwB5X,QAAWmG,GAAW,GACrEvG,EAA2BI,EAAUhB,EAAOgB,QAAWmG,EAEvD0R,EAAYhE,GAAoBjU,OAAQuG,EAAYsR,EAAe,YAAQtR,EAAW4L,IACtF+F,EAAmBjE,GACvBjU,OAAQuG,EAAYuR,EACpB,YACAvR,EACA4L,IAEI9R,EAAS4T,GAAoBjU,OAAQuG,EAAYsR,EAAe,cAAUtR,EAAW4L,IACrFgG,EAAgBlE,GAAoBjU,OAAQuG,EAAYuR,EAAsB,cAAUvR,EAAW4L,IACnGxC,EAAWsE,GAAoBjU,OAAQuG,EAAYsR,EAAe,gBAAYtR,EAAW4L,IAE/F,OAAOjT,mBAAQ,WACb,GAAIc,EAAO,OAAOA,EAClB,GAAKzM,GAAY6M,EAAjB,CACA,GAAIuP,EAASsD,SAAW5S,EAAO4S,SAAWgF,EAAUhF,QAAS,OAAO,KAC9C,IAAD,QAArB,GAAItD,EAASja,OACX,OAAO,IAAI4D,IACT/F,EACA6M,EACAuP,EAASja,OAAO,GAChB6hB,GAAoB,UAAClX,EAAO3K,cAAR,aAAC,EAAgB,GAAjB,UAAqByiB,EAAcziB,cAAnC,aAAqB,EAAuB,GAAI,WACpE6hB,GAAoB,UAACU,EAAUviB,cAAX,aAAC,EAAmB,GAApB,UAAwBwiB,EAAiBxiB,cAAzC,aAAwB,EAA0B,GAAI,qBAI7E,CACD0K,EACA7M,EACAoc,EAASsD,QACTtD,EAASja,OACT2K,EAAO4S,QACP5S,EAAO3K,OACPyiB,EAAcziB,OACdsK,EACAiY,EAAUhF,QACVgF,EAAUviB,OACVwiB,EAAiBxiB,SAId,SAAS0iB,GAAYC,GAC1B,IAAMC,EAAsC,SAApB,OAAVD,QAAU,IAAVA,OAAA,EAAAA,EAAYE,eACpBvY,EAAQ4X,GAASU,OAAQ/R,EAAY8R,GAC3C,OAAOC,EAAQE,IAAQxY,EC/FlB,SAASyY,GACdC,GAEA,IAAMC,EAAoB1B,KAEpBtD,EAAsBzU,mBAC1B,kBACEwZ,EACIA,EACG/jB,IAAI8L,IACJuG,QAAO,SAAC/S,GAAD,OAA0B,IAANA,KAC3B4e,OACH,KACN,CAAC6F,IAGG1E,EPqID,SACLE,EACAN,EACAC,EACArB,GAEA,IAAMe,EAAWrU,mBAAQ,+BAAMgV,QAAN,IAAMA,GAAN,UAAMA,EAAUE,iBAAhB,aAAM,EAAqBN,YAAYF,KAAa,CAACM,EAAUN,IAelFI,EAAU1B,GAbFpT,mBACZ,kBACEgV,GAAYX,GAAYM,GAAcA,EAAW3c,OAAS,EACtD2c,EAAWlf,KAAU,SAACwf,GACpB,MAAO,CACL/T,QAAS8T,EAAS9T,QAClB8Q,SAAUgD,EAASE,UAAUL,mBAAmBR,EAAUY,OAG9D,KACN,CAACN,EAAYK,EAAUX,IAGWf,GAE9BgB,EAAoBtX,KAE1B,OAAOgD,mBAAQ,WACb,OAAO8U,EAAQrf,KAAI,SAACe,GAAD,OAAY0d,GAAY1d,EAAD,OAASwe,QAAT,IAASA,OAAT,EAASA,EAAUE,UAAWb,EAAUC,QACjF,CAACD,EAAUW,EAAUF,EAASR,IOhKjBoF,CACdD,EACA,gBACAhF,EAAUhf,KAAI,SAAAyL,GAAO,MAAI,CAACA,OAG5B,OAAOlB,mBACL,kBACEyU,EAAUre,QAA8C,SAACC,EAAM6K,EAASH,GAAO,IAAD,IACtES,EAAK,OAAGsT,QAAH,IAAGA,GAAH,UAAGA,EAAU/T,UAAb,iBAAG,EAAcvK,cAAjB,aAAG,EAAuB,GAErC,OADIgL,IAAOnL,EAAK6K,GAAWyY,IAAeC,MAAMje,IAAKC,OAAO4F,EAAMvK,cAC3DZ,IACN,MACL,CAACoe,EAAWK,IAOT,SAAS+E,GACd3Y,EACAhB,GAEA,IAAM4Z,EAA2B9Z,mBAC/B,yCAAME,QAAN,IAAMA,OAAN,EAAMA,EAAQ4H,QAAO,SAACqB,GAAD,OAAqD,IAA1B5H,GAAS,OAAC4H,QAAD,IAACA,OAAD,EAACA,EAAGjI,mBAA7D,QAAoF,KACpF,CAAChB,IAKG6Z,EAAWvF,GAFexU,mBAAQ,kBAAM8Z,EAAgBrkB,KAAI,SAAAukB,GAAE,OAAIA,EAAG9Y,aAAU,CAAC4Y,IAEd3J,GAAiB,YAAa,CAACjP,IAEjG+Y,EAAsBja,mBAAQ,kBAAM+Z,EAASG,MAAK,SAAAC,GAAS,OAAIA,EAAUpG,aAAU,CAACgG,IAE1F,MAAO,CACL/Z,mBACE,kBACEkB,GAAW4Y,EAAgB9hB,OAAS,EAChC8hB,EAAgB1jB,QAA4D,SAACC,EAAMyK,EAAOC,GAAO,IAAD,IACxFS,EAAK,OAAGuY,QAAH,IAAGA,GAAH,UAAGA,EAAWhZ,UAAd,iBAAG,EAAevK,cAAlB,aAAG,EAAwB,GAChC4jB,EAAS5Y,EAAQ7F,IAAKC,OAAO4F,EAAMvK,iBAAcoQ,EAIvD,OAHI+S,IACF/jB,EAAKyK,EAAMI,SAAW,IAAImZ,IAAYvZ,EAAOsZ,IAExC/jB,IACN,IACH,KACN,CAAC6K,EAAS4Y,EAAiBC,IAE7BE,GAIG,SAASK,GACdpZ,EACAhB,GAEA,OAAO2Z,GAAqC3Y,EAAShB,GAAQ,GAIxD,SAASqa,GAAgB/hB,EAAkBsI,GAChD,IAAM0Z,EAAgBF,GAAiB9hB,EAAS,CAACsI,IACjD,GAAKA,EACL,OAAO0Z,EAAc1Z,EAAMI,SAGtB,SAASuZ,GACdjiB,EACAkiB,GAEA,IAAMxa,EAASF,mBAAQ,yCAAM0a,QAAN,IAAMA,OAAN,EAAMA,EAAY5S,QAAO,SAAC6S,GAAD,OAAiCA,aAAoBvgB,cAA9E,QAAwF,KAAI,CACjHsgB,IAGIF,EAAgBF,GAAiB9hB,EAAS0H,GAE1C0a,EAAarB,GADUvZ,mBAAQ,yCAAM0a,QAAN,IAAMA,OAAN,EAAMA,EAAYR,MAAK,SAAAS,GAAQ,OAAIA,IAAarB,cAAhD,WAAiE,CAACoB,IACvD,CAACliB,GAAW,IAE5D,OAAOwH,mBACL,yCACE0a,QADF,IACEA,OADF,EACEA,EAAYjlB,KAAI,SAAAklB,GACd,GAAKniB,GAAYmiB,EACjB,OAAIA,aAAoBvgB,IAAcogB,EAAcG,EAASzZ,SACzDyZ,IAAarB,IAAcsB,EAAWpiB,QAA1C,YAJJ,QAMQ,KACR,CAACA,EAASkiB,EAAYE,EAAYJ,IAI/B,SAASK,GAAmBriB,EAAkBmiB,GACnD,OAAOF,GAAoBjiB,EAAS,CAACmiB,IAAW,GClHnC,SAASG,GACtBtZ,EACAuZ,GAEA,MAAwBpR,mBAA+BoR,GAAYA,EAASvZ,GAASA,OAAQ6F,GAA7F,mBAAO2T,EAAP,KAAaC,EAAb,KAQA,OAPAxU,qBAAU,WACRwU,GAAQ,SAACC,GAEP,OAD2BH,GAAWA,EAASvZ,GACzBA,EACf0Z,OAER,CAACH,EAAUvZ,IACPwZ,EAGT,SAASG,GAAa/J,GACpB,OAAa,OAANA,QAAoB/J,IAAN+J,E,uDCTvB,IAAMgK,GAAgB,IAAIC,YAMX,SAASC,GAAiBC,GACvC,IAAMC,EAjBD,SAAyBC,GAE9B,IADAA,EAAMA,EAAIC,WAAW,MAAQD,EAAIE,OAAO,GAAKF,GACrCzjB,OAAS,IAAM,EAAG,MAAM,IAAI7D,MAAM,8CAE1C,IADA,IAAMynB,EAAM,IAAIC,WAAWJ,EAAIzjB,OAAS,GAC/B+I,EAAI,EAAGA,EAAI6a,EAAI5jB,OAAQ+I,IAC9B6a,EAAI7a,GAAKlI,SAAS4iB,EAAIE,OAAW,EAAJ5a,EAAO,GAAI,IAE1C,OAAO6a,EAUME,CAAgBP,GACvBQ,EAAQC,oBAASR,GACvB,OAAQO,GACN,IAAK,UACH,IAAM7nB,EAAO+nB,oBAAST,GAChBU,EAAM,IAAIC,KAAIjoB,GACpB,MAAM,UAAN,OAAiBkoB,uBAAYF,EAAIG,YAEnC,IAAK,UACH,IAAMnoB,EAAO+nB,oBAAST,GAChBU,EAAM,IAAIC,KAAIjoB,GACdmoB,EAAYC,kBAAOJ,EAAIG,WAC7B,MAAuB,aAAnBA,EAAUzb,KACN,UAAN,OAAiBwa,GAAckB,OAAOD,EAAUE,QAAQC,QAElD,UAAN,OAAiBJ,uBAAYF,EAAIG,YAGrC,QACE,MAAM,IAAIloB,MAAJ,8BAAiC4nB,KCxC7C,IAAMU,GAAiB,kCAEhB,SAASC,GAAgBC,GAC9B,IAAMC,EAAQD,EAAWC,MAAMH,IAC/B,GAAKG,EACL,MAAO,CAAEC,QAAQ,GAAD,OAAKD,EAAM,GAAGE,cAAd,OAAkCC,QAASH,EAAM,ICDpD,SAASI,GAAUC,GAAwB,IAAD,IAEvD,OADiBA,EAAI1N,MAAM,KAAK,GAAGuN,eAEjC,IAAK,QACH,MAAO,CAACG,GACV,IAAK,OACH,MAAO,CAAC,QAAD,OAAWA,EAAItB,OAAO,IAAMsB,GACrC,IAAK,OACH,IAAM/X,EAAI,UAAG+X,EAAIL,MAAM,8BAAb,aAAG,EAAmC,GAChD,MAAO,CAAC,oCAAD,OAAqC1X,EAArC,oCAAsEA,EAAtE,MACT,IAAK,OACH,IAAMtE,EAAI,UAAGqc,EAAIL,MAAM,8BAAb,aAAG,EAAmC,GAChD,MAAO,CAAC,oCAAD,OAAqChc,EAArC,oCAAsEA,EAAtE,MACT,QACE,MAAO,I,aCdE,SAASsc,GAAOC,GAC7B,MAAO,SAASpL,KAAKoL,GCCR,SAASC,GAAiBH,GACvC,IAAMI,EAAMrd,mBAAQ,kBAAOid,EAAMP,GAAgBO,QAAO5V,IAAY,CAAC4V,IAC/DK,ECCO,SAA2BT,GAA4E,IAAD,MAC7GU,EAAkBvd,mBAAQ,WAC9B,IAAK6c,EAAS,MAAO,MAACxV,GACtB,IACE,OAAOwV,EAAU,CAACW,oBAASX,IAAY,MAACxV,GACxC,MAAO3Q,GACP,MAAO,MAAC2Q,MAET,CAACwV,IAEEY,EAAwB1I,GADJ4C,IAAwB,GACmB,WAAY4F,GAC3EG,EAAe,UAAGD,EAAsBjnB,cAAzB,aAAG,EAA+B,GAKjD+kB,EAAcxG,GAJK8C,GACvB6F,GAAmBR,GAAOQ,QAAmBrW,EAAYqW,GACzD,GAEwD,cAAeH,GAEzE,MAAO,CACLhC,YAAW,oBAAEA,EAAY/kB,cAAd,aAAE,EAAqB,UAAvB,QAA6B,KACxCud,QAAS0J,EAAsB1J,SAAWwH,EAAYxH,SDrB5B4J,CAAiB,OAACN,QAAD,IAACA,OAAD,EAACA,EAAKR,SACnD,OAAO7c,mBAAQ,WACb,OAAIqd,EACKC,EAAoB/B,YAAcyB,GAAU1B,GAAiBgC,EAAoB/B,cAAgB,GAEjG0B,EAAMD,GAAUC,GAAO,KAE/B,CAACI,EAAKC,EAAoB/B,YAAa0B,I,iBEZtCW,GAA6C,GAYpC,SAASC,GAAT,GAAkD,IAAlCC,EAAiC,EAAjCA,KAAMrQ,EAA2B,EAA3BA,IAAQnJ,EAAmB,+BAC9D,EAAoBqF,mBAAiB,GAA5BoU,EAAT,oBAEMvQ,EAA0BsQ,EAAKhP,MAAK,SAACkP,GAAD,OAAQJ,GAASI,MAE3D,OAAIxQ,EAEA,gDACMlJ,GADN,IAEEmJ,IAAKA,EACLD,IAAKA,EACLyQ,QAAS,WACHzQ,IAAKoQ,GAASpQ,IAAO,GACzBuQ,GAAQ,SAAChd,GAAD,OAAOA,EAAI,SAMpB,eAAC,KAAD,eAAgBuD,IC5BzB,IAAM4Z,GAAiBvgB,kBAAOkgB,GAAPlgB,CAAH,6DACT,qBAAG8H,QACF,qBAAGA,QAGA,SAAS0Y,GAAT,GAUX,IATFzN,EASC,EATDA,QACAhQ,EAQC,EARDA,MAQC,IAPD+E,YAOC,MAPM,OAON,EANDgI,EAMC,EANDA,IAOMqQ,EAAiBV,GAAiB1M,GAExC,OAAO,eAACwN,GAAD,CAAgBzQ,IAAKA,EAAKhI,KAAMA,EAAMqY,KAAMA,EAAMpd,MAAOA,I,iCCtBnD,SAAS0d,GAAYxnB,EAAsBynB,GAAuC,IAAjBC,IAAgB,yDACxFC,EAAgBC,mBAGtB/X,qBAAU,WACR8X,EAAcjoB,QAAUM,IACvB,CAACA,IAGJ6P,qBAAU,WACR,SAASgY,IACP,IAAQnoB,EAAYioB,EAAZjoB,QACJA,GACFA,IAIJ,GAAc,OAAV+nB,EAAgB,CACdC,GAASG,IACb,IAAMloB,EAAKmoB,YAAYD,EAAMJ,GAC7B,OAAO,kBAAMM,cAAcpoB,OAG5B,CAAC8nB,EAAOC,ICjBb,I,GAAMM,GAAmBjhB,UAAOC,IAAV,2QAGN,SAAC8O,GAAD,OAAYA,EAAM3E,KAAO,UAAY,YACxC,SAAC2E,GAAD,OAAYA,EAAM3E,KAAO,EAAI,KAG1B,qBAAGpE,MAAkBC,OAAOmC,oBACtB,qBAAGpC,MAAkBC,OAAOuC,WACtB4F,aAAe,GAAK,YACrC,qBAAGpI,MAAkBC,OAAOC,cAIjCgb,GAAmBlhB,UAAOC,IAAV,wDAIhBkhB,GAAQnhB,UAAOC,IAAV,uvBAYa,qBAAG+F,MAAkBC,OAAOuC,YAElC,qBAAGxC,MAAkBC,OAAOmC,oBA4C/B,SAASgZ,GAAT,GAAiF,IAAD,IAA7DvY,EAA6D,EAA7DA,QAASuB,EAAoD,EAApDA,KAAMmB,EAA8C,EAA9CA,SAA8C,IAApC8V,iBAAoC,MAAxB,OAAwB,EAC7F,EAAgDrV,mBAAgC,MAAhF,mBAAOsV,EAAP,KAAyBC,EAAzB,KACA,EAA0CvV,mBAAgC,MAA1E,mBAAOwV,EAAP,KAAsBC,EAAtB,KACA,EAAwCzV,mBAAgC,MAAxE,mBAAO0V,EAAP,KAAqBC,EAArB,KACA,EAAuCC,aAAUN,EAAkBE,EAAe,CAChFH,YACAQ,SAAU,QACVC,UAAW,CACT,CAAE7e,KAAM,SAAU0S,QAAS,CAAEoM,OAAQ,CAAC,EAAG,KACzC,CAAE9e,KAAM,QAAS0S,QAAS,CAAEqM,QAASN,OALjCO,EAAR,EAAQA,OAAQC,EAAhB,EAAgBA,OAAQC,EAAxB,EAAwBA,WAexB,OAFA1B,GALuB5gB,uBAAY,WAC7BqiB,GACFA,MAED,CAACA,IACwB9X,EAAO,IAAM,MAGvC,uCACE,eAAC8W,GAAD,CAAkBkB,IAAKb,EAAvB,SAAoDhW,IACpD,eAAC,KAAD,UACE,gBAAC0V,GAAD,yBAAkB7W,KAAMA,EAAMgY,IAAKX,EAAyB1e,MAAOkf,EAAOI,QAAYF,EAAWE,QAAjG,cACGxZ,EACD,eAACsY,GAAD,aACEmB,UAAS,oCAAWH,EAAWE,cAAtB,aAAW,EAAoB,gCAA/B,QAA2D,IACpED,IAAKT,EACL5e,MAAOkf,EAAOM,OACVJ,EAAWI,iBC7G3B,I,GAAMC,GAAmBxiB,UAAOC,IAAV,mHAWP,SAASwiB,GAAT,GAAmD,IAAhClR,EAA+B,EAA/BA,KAAS5K,EAAsB,yBAC/D,OAAO,eAACya,GAAD,aAASvY,QAAS,eAAC2Z,GAAD,UAAmBjR,KAA8B5K,IAGrE,SAAS+b,GAAT,GAA8E,IAAlDnX,EAAiD,EAAjDA,SAAa5E,EAAoC,6BAClF,EAAwBqF,oBAAS,GAAjC,mBAAO5B,EAAP,KAAauY,EAAb,KACMC,EAAO/iB,uBAAY,kBAAM8iB,GAAQ,KAAO,CAACA,IACzCE,EAAQhjB,uBAAY,kBAAM8iB,GAAQ,KAAQ,CAACA,IACjD,OACE,eAACF,GAAD,2BAAa9b,GAAb,IAAmByD,KAAMA,EAAzB,SACE,sBAAK0Y,aAAcF,EAAMG,aAAcF,EAAvC,SACGtX,OCrBT,I,GAAMyX,GAAkBhjB,UAAOC,IAAV,sTAUC,qBAAG+F,MAAkBC,OAAOmC,oBACvC,qBAAGpC,MAAkBC,OAAOC,cAQxB,SAAS+c,GAAT,GAAqD,IAA3B1R,EAA0B,EAA1BA,KACvC,EAAwBvF,oBAAkB,GAA1C,mBAAO5B,EAAP,KAAauY,EAAb,KAEMC,EAAO/iB,uBAAY,kBAAM8iB,GAAQ,KAAO,CAACA,IACzCE,EAAQhjB,uBAAY,kBAAM8iB,GAAQ,KAAQ,CAACA,IAEjD,OACE,uBAAM5f,MAAO,CAAEmgB,WAAY,GAA3B,SACE,eAACT,GAAD,CAASlR,KAAMA,EAAMnH,KAAMA,EAA3B,SACE,eAAC4Y,GAAD,CAAiBrf,QAASif,EAAME,aAAcF,EAAMG,aAAcF,EAAlE,SACE,eAAC,KAAD,CAAU/a,KAAM,WC/B1B,I,SAKeqb,GALEnjB,kBAAOkgB,GAAPlgB,CAAH,6DACH,qBAAG8H,QACF,qBAAGA,QCGTsb,GAAkB,SAAC7f,GAAD,0GACuEA,EADvE,cAGlB8f,GAAgBrjB,UAAOoH,IAAV,uIACR,qBAAGU,QACF,qBAAGA,QAKTwb,GAAatjB,kBAAOkgB,GAAPlgB,CAAH,6DACL,qBAAG8H,QACF,qBAAGA,QAGA,SAASyb,GAAT,GAQX,IAAD,IAPDvG,EAOC,EAPDA,SAOC,IANDlV,YAMC,MANM,OAMN,EALD/E,EAKC,EALDA,MAMMygB,EAAe/D,GAAiBzC,aAAoBrK,GAAmBqK,EAASjK,aAAUrJ,GAE1FyW,EAAiB9d,mBAAQ,WAC7B,OAAI2a,IAAarB,IAAc,GAE3BqB,aAAoBvgB,IAClBugB,aAAoBrK,GAChB,GAAN,mBAAW6Q,GAAX,0CAA0CxG,QAA1C,IAA0CA,OAA1C,EAA0CA,EAAUzZ,eAApD,QAA+D,QAA/D,QAA8E6f,GAAgBpG,EAASzZ,WAGlG,CAAC,iBAAD,wBAAkByZ,QAAlB,IAAkBA,OAAlB,EAAkBA,EAAUzZ,eAA5B,QAAuC,QAAvC,QAAsD6f,GAAgBpG,EAASzZ,UAEjF,GAPyB,IAAD,EACa,IAO3C,CAACyZ,EAAUwG,IAEd,OAAIxG,IAAarB,IACR,eAAC0H,GAAD,CAAexT,IAAI,wBAAwB/H,KAAMA,EAAM/E,MAAOA,KAGhE,OAACia,QAAD,IAACA,OAAD,EAACA,EAAkBxZ,QACxB,eAAC,GAAD,CAAUsE,KAAMA,EAAMqY,KAAMA,EAAMrQ,IAAG,2BAAKkN,QAAL,IAAKA,OAAL,EAAKA,EAAUxZ,cAAf,QAAyB,QAAzB,SAAyCT,MAAOA,IAErF,eAACugB,GAAD,CAAYxb,KAAMA,EAAMqY,KAAMA,EAAMrQ,IAAG,2BAAKkN,QAAL,IAAKA,OAAL,EAAKA,EAAUxZ,cAAf,QAAyB,QAAzB,SAAyCT,MAAOA,IC1C3F,IAAM0gB,GAAczjB,UAAOC,IAAV,yPACK,gBAAG+F,EAAH,EAAGA,MAAH,SAAU0d,QAAyB,cAAgB1d,EAAMC,OAAOuC,YAOxE,qBAAGkb,SAA0B,aACnB,gBAAG1d,EAAH,EAAGA,MAAH,SAAU0d,SAA0B1d,EAAMC,OAAOmC,oBAGnD,gBAAGpC,EAAH,EAAGA,MAAH,SAAU0d,SAAyB1d,EAAMC,OAAOuC,YACzD,qBAAGkb,SAAyB,SAG1B,SAASC,GAAT,GAQX,IAPFjtB,EAOC,EAPDA,QACAktB,EAMC,EANDA,SACAC,EAKC,EALDA,iBAMM5R,EAAkBC,KACxB,OACE,gBAAC/R,GAAD,CAAYC,IAAI,KAAhB,UACE,gBAACuB,GAAD,WACE,eAAC,IAAD,CAAMuB,SAAS,OAAf,0BACA,eAAC+f,GAAD,CAAgB1R,KAAMU,EAAgB,KAAM,4DAE9C,gBAACtQ,GAAD,CAASvB,IAAI,MAAb,UACE,gBAACqjB,GAAD,CACE9f,QAAS,WACFkgB,GAAqBC,YAAeD,EAAkBlI,MACzDiI,EAASjI,MAGb+H,QAASG,IAAqBlI,IANhC,UAQE,eAAC4H,GAAD,CAAcvG,SAAUrB,IAAO5Y,MAAO,CAAEW,YAAa,KACrD,eAAC,IAAD,sBAEAhN,EAAU8G,GAAgB9G,GAAW,IAAIoB,KAAI,SAACqL,GAC9C,IAAM4gB,EAAWF,aAA4BpnB,KAASonB,EAAiBtgB,UAAYJ,EAAMI,QACzF,OACE,gBAACkgB,GAAD,CAAa9f,QAAS,kBAAOogB,GAAYH,EAASzgB,IAAQugB,QAASK,EAAnE,UACE,eAACR,GAAD,CAAcvG,SAAU7Z,EAAOJ,MAAO,CAAEW,YAAa,KACrD,eAAC,IAAD,UAAOP,EAAMK,WAFmEL,EAAMI,kB,yCCvDvFygB,GAAYhkB,kBAAO4B,GAAP5B,CAAH,iEACX,qBAAGgG,MAAkBC,OAAOE,WAI1B8d,GAAejkB,kBAAOG,GAAPH,CAAH,yEAKZkkB,GAAWlkB,kBAAOyB,GAAPzB,CAAH,uRAMT,qBAAG+F,UAA4B,aACvB,qBAAGA,UAA2B,UAE1B,gBAAGC,EAAH,EAAGA,MAAH,SAAUD,UAA4BC,EAAMC,OAAOmC,oBAE9D,gBAAGrC,EAAH,EAAGA,SAAUge,EAAb,EAAaA,SAAb,OAA6Bhe,GAAYge,EAAW,GAAM,KAG1DI,GAAcnkB,UAAOokB,MAAV,seAWb,qBAAGpe,MAAkBC,OAAOsL,QAEjB,qBAAGvL,MAAkBC,OAAOuC,YAMrC,qBAAGxC,MAAkBC,OAAOoe,gBAIjB,qBAAGre,MAAkBC,OAAOE,WAIvCme,GAAYtkB,UAAOC,IAAV,wFAGA,qBAAG+F,MAAkBC,OAAOmC,oBAGrCmc,GAAgBvkB,UAAOC,IAAV,wFAGJ,qBAAG+F,MAAkBC,OAAOuC,YC7ClD,SAASgc,GAAYxH,GACnB,OAAOA,aAAoBvgB,IAAQugB,EAASzZ,QAAUyZ,IAAarB,IAAQ,QAAU,GAGvF,IAAM8I,GAAoBzkB,kBAAO0kB,IAAP1kB,CAAH,2HAOjB2kB,GAAM3kB,UAAOC,IAAV,2SACa,qBAAG+F,MAAkBC,OAAOuC,YACvC,qBAAGxC,MAAkBC,OAAOC,cAYvC,SAAS0e,GAAT,GAA4D,IAAzCC,EAAwC,EAAxCA,QACjB,OAAO,eAACJ,GAAD,CAAmBnhB,MAAOuhB,EAAQC,UAAlC,SAA8CD,EAAQE,cAAc,KAG7E,IAAMC,GAAehlB,UAAOC,IAAV,8EAKlB,SAASglB,GAAT,GAA0D,IAArCjI,EAAoC,EAApCA,SACnB,KAAMA,aAAoBrK,IACxB,OAAO,0BAGT,IAAQE,EAASmK,EAATnK,KACR,IAAKA,GAAwB,IAAhBA,EAAKxY,OAAc,OAAO,0BAEvC,IAAM6qB,EAAMrS,EAAK,GAEjB,OACE,gBAACmS,GAAD,WACE,eAACtC,GAAD,CAAkBnR,KAAM2T,EAAIC,YAA5B,SACE,eAACR,GAAD,UAAmBO,EAAIjiB,MAAbiiB,EAAItsB,MAEfia,EAAKxY,OAAS,EACb,eAACqoB,GAAD,CACEnR,KAAMsB,EACH7K,MAAM,GACNlQ,KAAI,gBAAGmL,EAAH,EAAGA,KAAMkiB,EAAT,EAASA,YAAT,gBAA8BliB,EAA9B,aAAuCkiB,MAC3CC,KAAK,QAJV,SAME,eAACT,GAAD,oBAEA,QAKV,SAASU,GAAT,GAYI,IAXFrI,EAWC,EAXDA,SACA4G,EAUC,EAVDA,SACA0B,EASC,EATDA,WACAC,EAQC,EARDA,cACAxiB,EAOC,EAPDA,MAQA,EAA6BrE,KAArB7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QACXoJ,EAAM0kB,GAAYxH,GAElBwI,EhDAD,SAAuBC,EAAgCzI,GAA+B,IAAD,EAC1F,OAAIA,IAAarB,KACVjI,QAAQsJ,aAAoBvgB,MAApB,UAA6BgpB,EAAczI,EAAStmB,gBAApD,aAA6B,EAAkCsmB,EAASzZ,WgDF9DmiB,CADC3R,KACgCiJ,GACpD2I,EnB/DD,SAA6B3I,GAElC,QADwBhE,KACC7H,MAAK,SAAChO,GAAD,OAAW2gB,YAAe9G,EAAU7Z,MmB6D9CyiB,CAAoB5I,GAClC6H,EAAU3H,GAAkB,OAACriB,QAAD,IAACA,SAAW6O,EAAWsT,GAEnD6I,EtBgDD,WACL,IAAMlmB,EAAWC,cACjB,OAAOC,uBACL,SAACnJ,EAAiB6M,GAChB5D,EAASmY,GAAsB,CAAEphB,UAAS6M,eAE5C,CAAC5D,IsBtDiBmmB,GACdC,EtBqCD,WACL,IAAMpmB,EAAWC,cACjB,OAAOC,uBACL,SAACsD,GACCxD,EAASkY,GAAmB,CAAES,gBAAiBF,GAAejV,QAEhE,CAACxD,IsB3CcqmB,GAGjB,OACE,gBAAC9B,GAAD,CACEnhB,MAAOA,EACPuf,UAAS,qBAAgBxiB,GACzB6D,QAAS,kBAAO2hB,EAAa,KAAO1B,KACpC7d,SAAUuf,EACVvB,SAAUwB,EALZ,UAOE,eAAChC,GAAD,CAAcvG,SAAUA,EAAUlV,KAAK,SACvC,gBAAC,GAAD,WACE,eAAC,IAAD,CAAMxE,MAAO0Z,EAAS/Z,KAAtB,SAA6B+Z,EAASxZ,SACtC,gBAACwgB,GAAD,WACIwB,IAAoBG,GAAiB3I,aAAoBrK,GAYvD,KAXF,gBAAC,IAAD,2BAEE,eAAC9M,GAAD,CACElC,QAAS,SAACkD,GACRA,EAAMof,kBACFvvB,GAAWsmB,aAAoBvgB,KAAOopB,EAAYnvB,EAASsmB,EAASzZ,UAH5E,yBAUFiiB,GAAqBG,GAAiB3I,aAAoBrK,GAYxD,KAXF,gBAAC,IAAD,8BAEE,eAAC9M,GAAD,CACElC,QAAS,SAACkD,GACRA,EAAMof,kBACFjJ,aAAoBvgB,KAAOspB,EAAS/I,IAH5C,4BAYR,eAACiI,GAAD,CAAWjI,SAAUA,IACrB,eAACpb,GAAD,CAAUmB,MAAO,CAAEmjB,YAAa,YAAhC,SACGrB,EAAU,eAACD,GAAD,CAASC,QAASA,IAAchqB,EAAU,eAAC6P,GAAD,IAAa,UAM3D,SAASyb,GAAT,GAgBX,IAfFvc,EAeC,EAfDA,OACAmT,EAcC,EAdDA,WACA8G,EAaC,EAbDA,iBACAuC,EAYC,EAZDA,iBACAC,EAWC,EAXDA,cACAC,EAUC,EAVDA,aACAC,EASC,EATDA,QAUMC,EAAWnkB,mBAAQ,kBAAOkkB,EAAO,CAAIE,IAAS9K,OAAb,mBAAuBoB,IAAvB,YAAyCA,KAAc,CAACA,EAAYwJ,IAErGplB,EAAMtB,uBACV,YAA6B,IAA1BtJ,EAAyB,EAAzBA,KAAMmwB,EAAmB,EAAnBA,MAAO3jB,EAAY,EAAZA,MACRia,EAAqBzmB,EAAKmwB,GAC1BpB,EAAa5R,QAAQmQ,GAAoBC,YAAeD,EAAkB7G,IAC1EuI,EAAgB7R,QAAQ2S,GAAiBvC,YAAeuC,EAAerJ,IAE7E,OACE,eAACqI,GAAD,CACEtiB,MAAOA,EACPia,SAAUA,EACVsI,WAAYA,EACZ1B,SANiB,kBAAMwC,EAAiBpJ,IAOxCuI,cAAeA,MAIrB,CAACa,EAAkBC,EAAexC,IAG9B8C,EAAU9mB,uBAAY,SAAC6mB,EAAenwB,GAAhB,OAA8BiuB,GAAYjuB,EAAKmwB,MAAS,IAEpF,OACE,eAAC,KAAD,CACE9c,OAAQA,EACRwY,IAAKkE,EACLhd,MAAM,OACNkd,SAAUA,EACVI,UAAWJ,EAASnsB,OACpBwsB,SAAU,GACVF,QAASA,EAPX,SASGxlB,ICzMA,SAAS2lB,GAAavkB,EAAiBwkB,GAC5C,GAAsB,IAAlBA,EAAO1sB,OAAc,OAAOkI,EAEhC,IAAMykB,EAAmBpjB,GAAUmjB,GAEnC,GAAIC,EACF,OAAOzkB,EAAO4H,QAAO,SAAChH,GAAD,OAAWA,EAAMI,UAAYyjB,KAGpD,IAAMC,EAAmBF,EACtB5H,cACAvN,MAAM,OACNzH,QAAO,SAACkW,GAAD,OAAOA,EAAEhmB,OAAS,KAE5B,GAAgC,IAA5B4sB,EAAiB5sB,OACnB,OAAOkI,EAGT,IAAM2kB,EAAgB,SAAC7G,GACrB,IAAM8G,EAAS9G,EACZlB,cACAvN,MAAM,OACNzH,QAAO,SAACwQ,GAAD,OAASA,EAAItgB,OAAS,KAEhC,OAAO4sB,EAAiB/R,OAAM,SAACkS,GAAD,OAAoB,IAAbA,EAAE/sB,QAAgB8sB,EAAO5K,MAAK,SAAC8K,GAAD,OAAQA,EAAGtJ,WAAWqJ,IAAMC,EAAGC,SAASF,UAG7G,OAAO7kB,EAAO4H,QAAO,SAAChH,GACpB,IAAQK,EAAiBL,EAAjBK,OAAQP,EAASE,EAATF,KAEhB,OAAQO,GAAU0jB,EAAc1jB,IAAaP,GAAQikB,EAAcjkB,MAIxD6jB,I,GChCFS,GAAgBvnB,kBAAO4B,GAAP5B,CAAH,oNAEJ,qBAAGgG,MAAkBC,OAAOmC,oBACvC,qBAAGpC,MAAkBC,OAAOsL,QAWxB,SAASiW,GAAT,GAMX,IALFC,EAKC,EALDA,gBACAC,EAIC,EAJDA,UAKA,OACE,eAACH,GAAD,CAAe5jB,QAAS8jB,EAAxB,SACE,eAAC,IAAD,CAAMvkB,SAAS,OAAf,SAAuBwkB,EAAY,SAAM,aCYxC,SAASC,GAAmBC,GACjC,IAAMxL,ErBoFD,WACL,IAAQvhB,EAAY6D,KAAZ7D,QACF2f,EAAYF,KAEZ8B,EAAWO,GAAgB,OAAC9hB,QAAD,IAACA,SAAW6O,EADtBrH,mBAAQ,kBAAMlI,OAAO+e,OAAP,OAAcsB,QAAd,IAAcA,IAAa,MAAK,CAACA,KAEtE,cAAO4B,QAAP,IAAOA,IAAY,GqBzFFyL,GACXC,EAAazlB,mBAAQ,kBAxB7B,SAA4B+Z,GAG1B,OAAO,SAAoB5C,EAAeC,GAKxC,IArBuBsO,EAAwBC,EAwBzCC,GAxBiBF,EAqBN3L,EAAS5C,EAAOjW,SArBcykB,EAsB9B5L,EAAS3C,EAAOlW,SArB/BwkB,GAAYC,EACPD,EAASG,YAAYF,IAAa,EAAID,EAASI,QAAQH,GAAY,EAAI,EAE5ED,GAAYA,EAASG,YAAY,MAC3B,EAENF,GAAYA,EAASE,YAAY,KAC5B,EAEF,GAeL,OAAoB,IAAhBD,EAA0BA,EAE1BzO,EAAOhW,QAAUiW,EAAOjW,OAEnBgW,EAAOhW,OAAO2b,cAAgB1F,EAAOjW,OAAO2b,eAAiB,EAAI,EAEnE3F,EAAOhW,QAAciW,EAAOjW,QAAX,EAAyB,GAMlB4kB,CAAkB,OAAChM,QAAD,IAACA,IAAY,MAAK,CAACA,IACtE,OAAO/Z,mBAAQ,WACb,OAAIulB,EACK,SAACpO,EAAeC,GAAhB,OAAgE,EAA9BqO,EAAWtO,EAAQC,IAEvDqO,IACN,CAACF,EAAUE,ICbT,SAASO,GAAT,GAQkB,IAPvBxE,EAOsB,EAPtBA,iBACAuC,EAMsB,EANtBA,iBACAkC,EAKsB,EALtBA,sBACAC,EAIsB,EAJtBA,gBACA/Z,EAGsB,EAHtBA,UACAN,EAEsB,EAFtBA,OAGQ1C,GADc,EADtBgd,aAEc/c,eAAND,GACA9U,EAAYgI,KAAZhI,QAGF+xB,GAFQ/gB,qBAAWC,gBAEPkZ,oBAClB,EAAsC7U,mBAAiB,IAAvD,mBAAO0c,EAAP,KAAoBC,EAApB,KACA,EAAkD3c,oBAAkB,GAApE,mBAAO4c,EAAP,KAA0BC,EAA1B,KACMrO,EAAYF,KAGZwO,EAAkBllB,GAAU8kB,GAC5BK,EAAchO,GAAS2N,GAEvBnC,EAAmBlkB,mBAAQ,WAC/B,IAAMge,EAAIqI,EAAYvJ,cAAcN,OACpC,MAAa,KAANwB,GAAkB,MAANA,GAAmB,OAANA,GAAoB,QAANA,IAC7C,CAACqI,IAEEM,EAAkBrB,GAAmBiB,GAErCK,EAA0B5mB,mBAAQ,WACtC,OAAIymB,EAAwBC,EAAc,CAACA,GAAe,GACnDjC,GAAa3sB,OAAO+e,OAAOsB,GAAYkO,KAC7C,CAACI,EAAiBC,EAAavO,EAAWkO,IAEvCQ,EAAgC7mB,mBAAQ,WAC5C,GAAI0mB,EAAa,MAAO,CAACA,GACzB,IAAMI,EAASF,EAAejT,KAAKgT,GAC7BI,EAAcV,EACjBvJ,cACAvN,MAAM,OACNzH,QAAO,SAACkW,GAAD,OAAOA,EAAEhmB,OAAS,KAC5B,OAAI+uB,EAAY/uB,OAAS,EAAU8uB,EAE7B,GAAN,mBACMJ,EAAc,CAACA,GAAe,IADpC,YAGKI,EAAOhf,QAAO,SAAChH,GAAD,aAAW,UAAAA,EAAMK,cAAN,eAAc2b,iBAAkBiK,EAAY,OAH1E,YAIKD,EAAOhf,QAAO,SAAChH,GAAD,aAAW,UAAAA,EAAMK,cAAN,eAAc2b,iBAAkBiK,EAAY,UAEzE,CAACH,EAAgBP,EAAaK,EAAaC,IAExCK,EAAuBxpB,uBAC3B,SAACmd,GACCoJ,EAAiBpJ,GACjBxO,MAEF,CAACA,EAAW4X,IAIdtd,qBAAU,WACJoF,GAAQya,EAAe,MAC1B,CAACza,IAGJ,IAAMob,EAAWzI,mBACX0I,EAAc1pB,uBAAY,SAACgH,GAAW,IAAD,EACnCud,EAAQvd,EAAML,OAAO3C,MACrB2lB,EAAmB5lB,GAAUwgB,GACnCuE,EAAea,GAAoBpF,GACnC,UAAAqE,EAAU9vB,eAAV,SAAmB8wB,SAAS,KAC3B,IAEGC,EAAc7pB,uBAClB,SAACkN,GACC,GAAc,UAAVA,EAAEjN,IAEJ,GAAU,QADA4oB,EAAYvJ,cAAcN,OAElCwK,EAAqB1N,UAChB,GAAIuN,EAAqB7uB,OAAS,EAAG,CAAC,IAAD,GAExC,UAAA6uB,EAAqB,GAAG1lB,cAAxB,eAAgC2b,iBAAkBuJ,EAAY7J,OAAOM,eACrC,IAAhC+J,EAAqB7uB,QAErBgvB,EAAqBH,EAAqB,OAKlD,CAACA,EAAsBG,EAAsBX,IAIzCzW,G/BjCD,WAA4G,IAAD,IAC1G0X,EAAc9V,KACd+V,EAAatqB,aAAkD,SAAAC,GAAK,OAAIA,EAAM6T,MAAMC,SACpFpJ,EAAO0f,EAAcC,EAAWD,QAAejgB,EAE5C,SAAEO,QAAF,IAAEA,OAAF,EAAEA,EAAMtR,QACR,SAAEsR,QAAF,IAAEA,OAAF,EAAEA,EAAM4f,cACF,OAAJ5f,QAAI,IAAJA,KAAM6f,iB+ByBQC,GACD7X,MACxB,OACE,gBAAC,GAAD,CAAQnP,MAAO,CAAEuG,MAAO,OAAQtG,KAAM,OAAtC,UACE,gBAACihB,GAAD,CAAc7jB,IAAI,OAAlB,UACE,gBAACqB,GAAD,WACE,gBAAC,IAAD,WACGwQ,EAAgB,GAAI,kBACrB,eAACgR,GAAD,CACE1R,KAAMU,EACJ,IACA,0FAIN,eAAC,IAAD,CAAWtO,QAAS6K,OAEtB,eAAC2V,GAAD,CACEhgB,KAAK,OACLvL,GAAG,qBACHoxB,YAAaxe,EAAE,0BACf3H,MAAO6kB,EACPtG,IAAKkH,EACLW,SAAUV,EACVW,UAAWR,IAEZnB,GACC,eAAC5E,GAAD,CAAajtB,QAASA,EAASktB,SAAUyF,EAAsBxF,iBAAkBA,IAEnF,gBAACpiB,GAAD,WACE,eAAC,IAAD,CAAMyB,SAAS,OAAf,SAAuB+O,EAAgB,IAAK,gBAC5C,eAACuV,GAAD,CAAYE,UAAWkB,EAAmBnB,gBAAiB,kBAAMoB,GAAqB,SAACsB,GAAD,OAAUA,cAIpG,eAAC7F,GAAD,IAEA,sBAAKvhB,MAAO,CAAEC,KAAM,KAApB,SACE,eAAC,KAAD,CAAWonB,cAAY,EAAvB,SACG,gBAAGxgB,EAAH,EAAGA,OAAH,OACC,eAACuc,GAAD,CACEvc,OAAQA,EACR2c,QAASA,EACTxJ,WAAYmM,EACZ9C,iBAAkBiD,EAClBhD,cAAeiC,EACfzE,iBAAkBA,EAClByC,aAAcmC,SAMrB,QAgCQJ,I,yCCpNFgC,GAAyB,iBAEzBC,GAAkC,CAACD,I,UCS1CE,GAAqB,IAAIC,KAAI,CAAEC,WAAW,IAAQC,QAAQC,IAOjD,SAAeC,GAA9B,qC,8CAAe,WACb7oB,EACA8oB,GAFa,uCAAAzzB,EAAA,yDAIT2K,IAAYsoB,GAJH,yCAKJS,IALI,YAOPC,EAAYhM,GAAgBhd,IAPrB,0CAac8oB,EAAsBE,EAAU7L,SAb9C,OAaT8L,EAbS,+DAeT3zB,QAAQ0B,MAAR,sCAA6CgyB,EAAU7L,SAAvD,MACM,IAAI1oB,MAAJ,sCAAyCu0B,EAAU7L,UAhBhD,kBAoBT+L,EAAgBtN,GAAiBqN,GApBxB,yDAsBT3zB,QAAQ0B,MAAM,yCAA0CiyB,GAClD,IAAIx0B,MAAJ,kDAAqDw0B,IAvBlD,QAyBXhxB,EAAOqlB,GAAU,GAAD,OAAI4L,GAAJ,iBAAoBF,EAAU3L,eAA9B,QAAyC,KAzB9C,wBA2BXplB,EAAOqlB,GAAUtd,GA3BN,QA6BJqB,EAAI,EA7BA,aA6BGA,EAAIpJ,EAAKK,QA7BZ,wBA8BL1D,EAAMqD,EAAKoJ,GACX8nB,EAAS9nB,IAAMpJ,EAAKK,OAAS,EAC/BpC,OAhCO,sBAkCQV,MAAMZ,GAlCd,QAkCTsB,EAlCS,6DAoCTZ,QAAQ0B,MAAM,uBAAwBgJ,EAAtC,OACImpB,EArCK,uBAqCS,IAAI10B,MAAJ,kCAAqCuL,IArC9C,kDA0CN9J,EAASG,GA1CH,qBA2CL8yB,EA3CK,uBA2CS,IAAI10B,MAAJ,kCAAqCuL,IA3C9C,gEAgDQ9J,EAASM,OAhDjB,WAgDLA,EAhDK,OAiDNgyB,GAAmBhyB,GAjDb,uBAkDH4yB,EAlDG,oBAmDPZ,GAAmBa,cAnDZ,aAmDP,EAA2B3yB,QAAe,SAACC,EAAMK,GAAW,IAAD,EACnD6L,EAAG,UAAM7L,EAAMsyB,SAAZ,sBAAwBtyB,EAAM1C,eAA9B,QAAyC,IAClD,OAAOqC,EAAK2B,OAAS,EAAd,UAAqB3B,EAArB,aAA8BkM,GAA9B,UAAyCA,KAC/C,WAtDI,QAsDG,gBACN,IAAIpO,MAAJ,wCAA2C20B,IAvDxC,iCAyDJ5yB,GAzDI,QA6BoB6K,IA7BpB,8BA2DP,IAAI5M,MAAM,mCA3DH,2E,sBCdf,IAAM80B,GAAgB,CACpB,CACEC,UAAU,EACVjU,OAAQ,CACN,CACErU,KAAM,OACNkB,KAAM,YAGVlB,KAAM,WACNuoB,QAAS,CACP,CACEvoB,KAAM,kBACNkB,KAAM,YAGVsnB,SAAS,EACTC,gBAAiB,OACjBvnB,KAAM,aAGJwnB,GAAoB,6CAEpBC,GAAe,CACnB,CACEL,UAAU,EACVjU,OAAQ,CACN,CACEuU,aAAc,UACd5oB,KAAM,OACNkB,KAAM,YAGVlB,KAAM,cACNuoB,QAAS,CACP,CACEK,aAAc,QACd5oB,KAAM,GACNkB,KAAM,UAGVsnB,SAAS,EACTC,gBAAiB,OACjBvnB,KAAM,aAKV,SAAS2nB,GAAiB/L,EAAyBnlB,GACjD,OAAO,IAAI0K,KAASya,EAAiB6L,GAAchxB,GAQtC,SAAeiwB,GAA9B,qC,8CAAe,WAAqC3L,EAAiBtkB,GAAtD,mBAAAxD,EAAA,6DACP20B,EAAuB,IAAIzmB,KAASqmB,GAAmBL,GAAe1wB,GACtE2M,EAAOsY,oBAASX,GAFT,SAGiB6M,EAAqBC,SAASzkB,GAH/C,cAGPwY,EAHO,yBAIN+L,GAAiB/L,EAAiBnlB,GAAUgjB,YAAYrW,IAJlD,4C,sBCjDR,SAAS0kB,KACd,MAA6BvtB,KAArBhI,EAAR,EAAQA,QAAS0O,EAAjB,EAAiBA,QACXzF,EAAWC,cAEXssB,EAAcrsB,uBAClB,SAACqf,GACC,IAAK9Z,GAAW1O,IAAYgG,IAAQC,QAAS,CAC3C,GAAI1B,IAAqByB,IAAQC,QAAS,CACxC,IAAMxB,ElECT,WAA4C,IAAD,EAEhD,OAAQA,EAAc,UAAGA,SAAH,QAAqB,IAAIgxB,IAAa/wB,EAAQR,UkEHrCwxB,GACvB,GAAIjxB,EACF,OAAO0vB,GAAsB3L,EAAS/jB,GAG1C,MAAM,IAAI3E,MAAM,4CAElB,OAAOq0B,GAAsB3L,EAAS9Z,KAExC,CAAC1O,EAAS0O,IAGZ,OAAOvF,sBAAW,uCAChB,WAAOkC,GAAP,eAAA3K,EAAA,6DACQi1B,EAAYC,eAClB3sB,EAASW,GAAeC,QAAQ,CAAE8rB,YAAW11B,IAAKoL,KAFpD,kBAGS6oB,GAAa7oB,EAASmqB,GAC1B/yB,MAAK,SAACozB,GAEL,OADA5sB,EAASW,GAAeE,UAAU,CAAE7J,IAAKoL,EAASwqB,YAAWF,eACtDE,KAERlzB,OAAM,SAACN,GAGN,MAFA1B,QAAQ0B,MAAR,oCAA2CgJ,GAAWhJ,GACtD4G,EAASW,GAAeG,SAAS,CAAE9J,IAAKoL,EAASsqB,YAAWG,aAAczzB,EAAM1C,WAC1E0C,MAXZ,2CADgB,sDAehB,CAAC4G,EAAUusB,IC7CR,SAASO,GACdC,EACAC,GAEA,IAAMC,EAAa/L,iBAAiC8L,GACpD7jB,qBAAU,WACR8jB,EAAWj0B,QAAUg0B,IACpB,CAACA,IAEJ7jB,qBAAU,WACR,IAAM+jB,EAAqB,SAAC9f,GAAmB,IAAD,IAC5C,oBAAI2f,EAAK/zB,eAAT,aAAI,EAAcm0B,SAAS/f,EAAEvG,eAA7B,UAGIomB,EAAWj0B,SAASi0B,EAAWj0B,WAKrC,OAFAo0B,SAASC,iBAAiB,YAAaH,GAEhC,WACLE,SAASE,oBAAoB,YAAaJ,MAE3C,CAACH,IAGSD,I,eCJf,IAAMS,GAA2BltB,kBAAO6F,GAAP7F,CAAH,kFAGjB,qBAAG+F,SAA2B,MAAQ,OAG7Ckb,GAAmBjhB,UAAOC,IAAV,ggBAEN,SAAC8O,GAAD,OAAYA,EAAM3E,KAAO,UAAY,YACxC,SAAC2E,GAAD,OAAYA,EAAM3E,KAAO,EAAI,KAE1B,qBAAGpE,MAAkBC,OAAOmC,oBACtB,qBAAGpC,MAAkBC,OAAOuC,YAGvC,qBAAGxC,MAAkBC,OAAOC,cAUjCinB,GAAantB,UAAOC,IAAV,4IAQVmtB,GAAoBptB,UAAOC,IAAV,kKASvB,SAASotB,GAAT,GAAuD,IAAjCtrB,EAAgC,EAAhCA,QACdmd,EAAU7c,mBAAQ,kCAAM0c,GAAgBhd,UAAtB,aAAM,EAA0Bmd,UAAS,CAACnd,IAC5DjL,EAAOuL,mBAAQ,WACnB,IAAI6c,EAAJ,CACA,IAAMoO,EAAevrB,EAAQod,cAC7B,GAAImO,EAAavP,WAAW,YAAcuP,EAAavP,WAAW,WAChE,OAAOhc,EAET,IAEE,OADY,IAAIlI,IAAIkI,GACTjL,KACX,MAAOiC,GACP,WAED,CAACgJ,EAASmd,IACb,OAAO,4CAAGA,QAAH,IAAGA,IAAWpoB,IAGvB,SAASy2B,GAAiBxrB,GACxB,MAAM,YAAN,OAAmBA,EAAQgQ,QAAQ,MAAO,MAG5C,IAAMyb,GAAU90B,gBAAK,YAAgF,IAA7DqJ,EAA4D,EAA5DA,QAAS0rB,EAAmD,EAAnDA,OACzC7D,EAAatqB,aAAkD,SAACC,GAAD,OAAWA,EAAM6T,MAAMC,SACtFS,EAAkBD,KAClBlU,EAAWC,cACjB,EAAkDgqB,EAAW7nB,GAA5CkI,EAAjB,EAAQtR,QAA8B4H,EAAtC,EAAuBspB,cAEjBvE,EAAavjB,IAAY+R,EAE/B,EC7Fa,WAAiE,IAA9C4Z,EAA6C,wDAC7E,EAA0B1hB,mBAAS0hB,GAAnC,mBAAOnuB,EAAP,KAAcouB,EAAd,KACMC,EAAS/tB,uBAAY,kBAAM8tB,GAAS,SAACpQ,GAAD,OAAWA,OAAO,IAC5D,MAAO,CAAChe,EAAOquB,GD0FQC,EAAU,GAAjC,mBAAOjL,EAAP,KAAagL,EAAb,KACMlB,EAAO7L,mBACb,EAAgD7U,qBAAhD,mBAAOsV,EAAP,KAAyBC,EAAzB,KACA,EAA0CvV,qBAA1C,mBAAOwV,EAAP,KAAsBC,EAAtB,KAEA,EAA+BG,aAAUN,EAAkBE,EAAe,CACxEH,UAAW,OACXQ,SAAU,QACVC,UAAW,CAAC,CAAE7e,KAAM,SAAU0S,QAAS,CAAEoM,OAAQ,CAAC,EAAG,QAH/CE,EAAR,EAAQA,OAAQE,EAAhB,EAAgBA,WAMhBsK,GAAkBC,EAAM9J,EAAOgL,OAASlkB,GAExC,IAAMokB,EAAiBjuB,uBAAY,WAC7BylB,IAEJ3lB,EAASkB,GAAWkB,IACpB0rB,OACC,CAAC9tB,EAAU2lB,EAAYvjB,EAAS0rB,IAE7BM,EAAyBluB,uBAAY,WACpCU,GACLZ,EAASe,GAAiBqB,MACzB,CAACpC,EAAUoC,EAASxB,IAEjBytB,EAAmBnuB,uBAAY,WAC/B,WAAAwM,OAAO4hB,OAAP,uEACFtuB,EAASiB,GAAWmB,MAErB,CAACpC,EAAUoC,IACRkQ,EAAkBC,KACxB,OAAKjI,EAGH,gBAAC,GAAD,CAAmB5I,MAAM,SAASC,QAAQ,OAAO1I,GAAI20B,GAAiBxrB,GAAtE,UACGkI,EAAK8I,QACJ,eAACyN,GAAD,CAAUzd,MAAO,CAAEW,YAAa,QAAUqP,QAAS9I,EAAK8I,QAASjD,IAAG,UAAK7F,EAAKhH,KAAV,gBAEpE,sBAAKF,MAAO,CAAEuG,MAAO,OAAQM,OAAQ,OAAQlG,YAAa,UAE5D,gBAAC,GAAD,CAAQX,MAAO,CAAEC,KAAM,KAAvB,UACE,eAAC,GAAD,UACE,eAAC,IAAD,CAAMkrB,KAAM5I,EAAYpiB,SAAS,OAAOH,MAAO,CAAEorB,SAAU,SAAUC,aAAc,YAAnF,SACGnkB,EAAKhH,SAGV,eAAC,GAAD,CACEF,MAAO,CACLwN,UAAW,OAFf,SAKE,eAAC6c,GAAD,CAAmB9pB,MAAOvB,EAA1B,SACE,eAACsrB,GAAD,CAAYtrB,QAASA,WAI3B,gBAACorB,GAAD,CAAY/K,IAAKsK,EAAjB,UACE,sBAAK3pB,MAAO,CAAEsrB,QAAS,gBAAkBjM,IAAKb,EAA9C,SACE,eAAC,IAAD,CACExe,MAAO,CACLuG,MAAO,OACP5F,YAAa,OAEfC,QAASiqB,EACTne,QAAQ,YANV,SAQE,eAAC,IAAD,QAIHmT,GACC,gBAAC,GAAD,yBAAkBxY,MAAI,EAACgY,IAAKX,EAAyB1e,MAAOkf,EAAOI,QAAYF,EAAWE,QAA1F,cACE,+BAAMpY,GAAQnJ,GAAiBmJ,EAAKlJ,WACpC,eAACwjB,GAAD,IACA,eAAChe,GAAD,CAAcE,KAAI,gDAA2C1E,GAA7D,SACGkQ,EAAgB,KAAM,eAEzB,eAACib,GAAD,CAA0BvpB,QAASqqB,EAAkBjoB,SAA6C,IAAnC5L,OAAOC,KAAKwvB,GAAYvvB,OAAvF,yBAGCkG,GACC,eAAC2sB,GAAD,CAA0BvpB,QAASoqB,EAAnC,gCAKPzI,EACC,eAAC,IAAD,CAAQvf,UAAQ,EAAChD,MAAO,CAAEuG,MAAO,OAAQglB,SAAU,QAAnD,sBAIA,qCACE,eAAC,IAAD,CACEhM,UAAU,gBACVvf,MAAO,CACLuG,MAAO,OACPglB,SAAU,UAEZ3qB,QAASmqB,EANX,wBA1DI/rB,GAHM,QA6EdwsB,GAAgBvuB,UAAOC,IAAV,6DAKZ,SAASuuB,GAAT,GAA2F,IAAD,EAApEhgB,EAAoE,EAApEA,UAAWif,EAAyD,EAAzDA,OACtC,EAAwCzhB,mBAAiB,IAAzD,mBAAOyiB,EAAP,KAAqBC,EAArB,KAEM/uB,EAAWC,cACXwT,EAAQ9T,aAAkD,SAACC,GAAD,OAAWA,EAAM6T,MAAMC,SACjFsb,EAASjb,QAAO,UAACN,EAAMqb,UAAP,aAAC,EAAqB3E,kBAC5C,EAAgC9d,mBAAwB,MAAxD,mBAAO4iB,EAAP,KAAiBC,EAAjB,KAEMtF,EAAc1pB,uBAAY,SAACkN,GAC/B2hB,EAAgB3hB,EAAEvG,OAAO3C,OACzBgrB,EAAY,QACX,IACGC,EAAY7C,KAEZ8C,EAAgBlvB,uBAAY,WAC5B8uB,IACJE,EAAY,MACZC,EAAUL,GACPt1B,MAAK,WACJu1B,EAAgB,OAEjBr1B,OAAM,SAACN,GACN81B,EAAY91B,EAAM1C,SAClBsJ,EAASiB,GAAW6tB,UAEvB,CAACE,EAAQhvB,EAAUmvB,EAAWL,IAE3BO,EAAoB3sB,mBAAQ,WAChC,OAAOgd,GAAUoP,GAAcp0B,OAAS,GAAKqZ,QAAQqL,GAAgB0P,MACpE,CAACA,IAEEQ,EAAiBpvB,uBACrB,SAACkN,GACKiiB,GAAsB,UAAVjiB,EAAEjN,KAChBivB,MAGJ,CAACA,EAAeC,IAGZE,EAAc7sB,mBAAQ,WAE1B,OADiBlI,OAAOC,KAAKgZ,GAE1BjJ,QAAO,SAACpI,GACP,OAAO2R,QAAQN,EAAMrR,GAASpJ,YAE/Bqd,MAAK,SAACmZ,EAAIC,GACT,IAAiBC,EAAOjc,EAAM+b,GAAtBx2B,QACS22B,EAAOlc,EAAMgc,GAAtBz2B,QACR,OAAI02B,GAAMC,EACDD,EAAGpsB,KAAKkc,cAAgBmQ,EAAGrsB,KAAKkc,eAClC,EACDkQ,EAAGpsB,KAAKkc,gBAAkBmQ,EAAGrsB,KAAKkc,cAClC,EACA,EAEFkQ,GAAY,EACZC,EAAW,EACR,OAEV,CAAClc,IACEnB,EAAkBC,KACxB,OACE,gBAAC,GAAD,CAAQnP,MAAO,CAAEuG,MAAO,OAAQtG,KAAM,OAAtC,UACE,eAACihB,GAAD,UACE,gBAACxiB,GAAD,WACE,+BACE,eAAC,KAAD,CAAWsB,MAAO,CAAEwsB,OAAQ,WAAa5rB,QAAS8pB,MAEpD,eAAC,IAAD,CAAMvqB,SAAS,OAAf,SAAuB+O,EAAgB,KAAM,kBAC7C,eAAC,IAAD,CAAWtO,QAAS6K,SAIxB,eAAC8V,GAAD,IAEA,gBAACL,GAAD,CAAc7jB,IAAI,OAAlB,UACE,gBAAC,IAAD,CAAM8tB,MAAI,EAAV,uBACa,IACX,eAACjL,GAAD,CACE1R,KAAMU,EACJ,IACA,+MAIN,gBAAC,GAAD,WACE,eAACkS,GAAD,CACEhgB,KAAK,OACLvL,GAAG,iBACHoxB,YAAY,kCACZnmB,MAAO4qB,EACPxE,SAAUV,EACVW,UAAW+E,EACXlsB,MAAO,CAAE6G,OAAQ,UAAWpI,aAAc,GAAIF,QAAS,UAEzD,eAAC,IAAD,CAAQqC,QAASorB,EAAehsB,MAAO,CAAEysB,SAAU,MAAOtM,WAAY,OAASnd,UAAWipB,EAA1F,oBAIDJ,EACC,eAAC,IAAD,CAAM/mB,MAAM,UAAUvE,MAAOsrB,EAAU7rB,MAAO,CAAEqrB,aAAc,WAAYD,SAAU,UAApF,SACGS,IAED,QAGN,eAACtK,GAAD,IAEA,eAACiK,GAAD,UACGW,EAAYp3B,KAAI,SAACiK,GAAD,OACf,eAAC,GAAD,CAAuBA,QAASA,EAAS0rB,OAAQA,GAAnC1rB,QAGlB,eAACuiB,GAAD,IAEA,sBAAKvhB,MAAO,CAAEzB,QAAS,OAAQkP,UAAW,UAA1C,SACE,eAACjK,GAAD,CAAcE,KAAK,yBAAnB,+BAMO+nB,I,SEzTA,SAASiB,GAAT,GAMe,IAL5BvhB,EAK2B,EAL3BA,OACAM,EAI2B,EAJ3BA,UACA4X,EAG2B,EAH3BA,iBACAvC,EAE2B,EAF3BA,iBACAyE,EAC2B,EAD3BA,sBAEA,EAAgCtc,oBAAkB,GAAlD,mBAAO0jB,EAAP,KAAiBC,EAAjB,KACMC,EAAWzS,GAAQjP,GAEzBpF,qBAAU,WACJoF,IAAW0hB,GACbD,GAAY,KAEb,CAACzhB,EAAQ0hB,IAEZ,IAAMvG,EAAuBxpB,uBAC3B,SAACmd,GACCoJ,EAAiBpJ,GACjBxO,MAEF,CAACA,EAAW4X,IAGRyJ,EAAwBhwB,uBAAY,WACxC8vB,GAAY,KACX,IACGG,EAAkBjwB,uBAAY,WAClC8vB,GAAY,KACX,IAGGI,GADkBlc,KAGxB,OACE,eAACtF,GAAD,CAAOL,OAAQA,EAAQM,UAAWA,EAAWR,UAAW,GAAID,UAAW2hB,EAAW,GAAKK,EAAiB,EAAI,GAA5G,SACGL,EACC,eAAClB,GAAD,CAAYhgB,UAAWA,EAAWif,OAAQqC,IAE1C,eAACzH,GAAD,CACEna,OAAQA,EACRM,UAAWA,EACX4X,iBAAkBiD,EAClBb,aAAcqH,EACdhM,iBAAkBA,EAClByE,sBAAuBA,EACvBC,iBAAiB,MC3D3B,I,GAAMrZ,GAAUlP,UAAOC,IAAV,qHAIK,gBAAG+vB,EAAH,EAAGA,QAAH,SAAYC,QAAmB,WAAQD,EAAU,EAAI,GAAG12B,WAAzB,SAU3C42B,GAAalwB,kBAAOujB,GAAPvjB,CAAH,6CAGVmwB,GAAcnwB,kBAAOujB,GAAPvjB,CAAH,mEAEP,gBAAGgwB,EAAH,EAAGA,QAAH,iBAAqBA,EAAU,GAAG12B,WAAlC,SAGK,SAAS82B,GAAT,GAKc,IAJ3BC,EAI0B,EAJ1BA,UACAC,EAG0B,EAH1BA,UAG0B,IAF1BxoB,YAE0B,MAFnB,GAEmB,MAD1BmoB,cAC0B,SAC1B,OACE,gBAAC,GAAD,CAASD,QAASloB,EAAMmoB,OAAQA,EAAhC,UACGI,GAAa,eAACH,GAAD,CAAYlT,SAAUqT,EAAWvoB,KAAI,UAAKA,EAAKxO,WAAV,QAClDg3B,GAAa,eAACH,GAAD,CAAanT,SAAUsT,EAAWxoB,KAAI,UAAKA,EAAKxO,WAAV,MAA4B02B,QAASloB,OChC/F,I,2BAAMyoB,GAAcvwB,UAAOokB,MAAV,wnBACN,gBAAGrrB,EAAH,EAAGA,MAAOiN,EAAV,EAAUA,MAAV,OAAuBjN,EAAQiN,EAAMC,OAAO8B,QAAU/B,EAAMC,OAAOsL,QAS9D,gBAAGlQ,EAAH,EAAGA,MAAH,OAAeA,GAASA,KAqB3B,qBAAG2E,MAAkBC,OAAOC,cAInCsqB,GAAaC,OAAO,0BAEbC,GAAQC,IAAMj4B,MAAK,YAWyC,IAVvEmL,EAUsE,EAVtEA,MACA+sB,EASsE,EATtEA,YACA5G,EAQsE,EARtEA,YACGrjB,EAOmE,sDAOtE,OACE,eAAC4pB,GAAD,2BACM5pB,GADN,IAEE9C,MAAOA,EACPomB,SAAU,SAACpjB,GAVE,IAACgqB,GACM,MADNA,EAYHhqB,EAAML,OAAO3C,MAAMkO,QAAQ,KAAM,OAXlBye,GAAWpc,KAAkByc,E9DyC7C9e,QAAQ,sBAAuB,W8DxCzC6e,EAAYC,IAaZC,UAAU,UACVxtB,MAAM,eACNytB,aAAa,MACbC,YAAY,MAEZ7sB,KAAK,OACL8sB,QAAQ,sBACRjH,YAAaA,GAAe,MAC5BkH,UAAW,EACXC,UAAW,GACXC,WAAW,cChEXC,GAAWrxB,UAAOC,IAAV,mHAID,qBAAG8jB,SAA2B,8BAAgC,kCAErEuN,GAAiBtxB,UAAO8F,OAAV,oVAMT,gBAAGie,EAAH,EAAGA,SAAU/d,EAAb,EAAaA,MAAb,OAA0B+d,EAAW/d,EAAMC,OAAOsL,KAAO,aAS5C,gBAAGvL,EAAH,EAAGA,MAAH,OAAeurB,aAAO,IAAMvrB,EAAMC,OAAOme,UAG3DoN,GAAWxxB,UAAOC,IAAV,2PAIH,qBAAG+F,MAAkBC,OAAOsL,QAM1B,gBAAGvL,EAAH,EAAGA,MAAH,OAAeurB,aAAO,GAAKvrB,EAAMC,OAAOC,eAG/CurB,GAAUzxB,UAAO0xB,KAAV,2GAKPC,GAAa3xB,UAAOC,IAAV,oKAIG,qBAAG2xB,UAA6B,MAAQ,UACrC,qBAAG5rB,MAAkBC,OAAO4rB,cAG5CC,GAAY9xB,UAAOC,IAAV,oGAEO,qBAAG+F,MAAkBC,OAAOme,SAClC,qBAAGpe,MAAkB+rB,QAAQC,SAkB9B,SAASC,GAAT,GAec,IAd3BpuB,EAc0B,EAd1BA,MACA+sB,EAa0B,EAb1BA,YACAsB,EAY0B,EAZ1BA,MACAC,EAW0B,EAX1BA,cACAC,EAU0B,EAV1BA,MACAhM,EAS0B,EAT1BA,iBACApJ,EAQ0B,EAR1BA,SAQ0B,IAP1BqV,6BAO0B,aAN1BC,mBAM0B,aAL1BlZ,YAK0B,MALnB,KAKmB,MAJ1BwY,iBAI0B,SAH1BvL,EAG0B,EAH1BA,cACAztB,EAE0B,EAF1BA,GACA2vB,EAC0B,EAD1BA,gBAEA,EAAkCvc,oBAAS,GAA3C,mBAAOumB,EAAP,KAAkBC,EAAlB,KACQ33B,EAAY6D,KAAZ7D,QACF43B,EAA0BvV,GAAkB,OAACriB,QAAD,IAACA,SAAW6O,EAAZ,OAAuBsT,QAAvB,IAAuBA,SAAYtT,GAC/EuI,EAAkBC,KAClBwgB,EAAkBN,GAASngB,EAAgB,IAAK,SAChD0gB,EAAsB9yB,uBAAY,WACtC2yB,GAAa,KACZ,CAACA,IACJ,OACE,gBAACb,GAAD,CAAY/4B,GAAIA,EAAhB,UACE,gBAACk5B,GAAD,CAAWF,UAAWA,EAAtB,WACIA,GACA,eAACJ,GAAD,UACE,gBAAC/vB,GAAD,WACE,eAAC,IAAD,CAAMyB,SAAS,OAAf,SAAuBwvB,IACtB73B,GACC,eAAC,IAAD,CAAM8I,QAASuuB,EAAOhvB,SAAS,OAAOH,MAAO,CAAEsrB,QAAS,SAAUkB,OAAQ,WAA1E,UACI+C,GAAiBtV,GAAYyV,EAA9B,0BACeA,QADf,IACeA,OADf,EACeA,EAAyB1N,cAAc,IACnD,YAMd,gBAACsM,GAAD,CAAUtuB,MAAO6uB,EAAY,CAAEtwB,QAAS,IAAKE,aAAc,OAAU,GAAIuiB,SAAUsO,EAAnF,WACIT,GACA,uCACE,eAAC,GAAD,CACEtP,UAAU,qBACVze,MAAOA,EACP+sB,YAAa,SAACgC,GACZhC,EAAYgC,MAGf/3B,GAAWmiB,GAAYmV,GAA2B,OAAVC,GACvC,eAAC,IAAD,CAAQzuB,QAASuuB,EAAO5f,MAAM,KAAK7C,QAAQ,OAA3C,oBAMN,eAAC6hB,GAAD,CACEvN,WAAY/G,EACZsF,UAAU,8BACV3e,QAAS,WACF0uB,GACHG,GAAa,IALnB,SASE,gBAACf,GAAD,WACGrY,EACC,eAACgX,GAAD,CAAoBC,UAAWjX,EAAKC,OAAQiX,UAAWlX,EAAKE,OAAQxR,KAAM,GAAImoB,QAAM,IAClFjT,EACF,eAACuG,GAAD,CAAcvG,SAAUA,EAAUlV,KAAK,OAAO/E,MAAO,CAAEW,YAAa,SAClE,KACH0V,EACC,gBAAC,IAAD,CAAMxgB,GAAG,OAAT,iBACGwgB,QADH,IACGA,OADH,EACGA,EAAMC,OAAO7V,OADhB,WACyB4V,QADzB,IACyBA,OADzB,EACyBA,EAAME,OAAO9V,UAGtC,eAAC,IAAD,CAAM5K,GAAG,OAAT,UACIokB,GAAYA,EAASxZ,QAAUwZ,EAASxZ,OAAOnJ,OAAS,GAAxD,UACK2iB,EAASxZ,OAAOwE,MAAM,EAAG,GAD9B,cACsCgV,EAASxZ,OAAOwE,MAClDgV,EAASxZ,OAAOnJ,OAAS,EACzB2iB,EAASxZ,OAAOnJ,SAHpB,OAKE2iB,QALF,IAKEA,OALF,EAKEA,EAAUxZ,SAAWyO,EAAgB,KAAM,wBAGjDogB,GAAyB,eAAC,IAAD,gBAKjCA,GAAyBjM,GACzB,eAACqJ,GAAD,CACEvhB,OAAQqkB,EACR/jB,UAAWmkB,EACXvM,iBAAkBA,EAClBvC,iBAAkB7G,EAClBsL,sBAAuBjC,EACvBkC,gBAAiBA,OChL3B,IAAMsK,GAAO7yB,UAAOC,IAAV,4JAQJ6yB,GAAa9yB,UAAOC,IAAV,uEAKV8yB,GAAkB/yB,kBAAOgzB,KAAPhzB,CAAH,6CACV,qBAAGgG,MAAkBC,OAAOsL,QAGhC,SAAS0hB,KACd,IAAMhhB,EAAkBC,KACxB,OACE,eAAC2gB,GAAD,UACE,gBAACpxB,GAAD,CAAYsB,MAAO,CAAEzB,QAAS,QAA9B,UACE,eAAC,IAAD,CAAaiI,GAAG,QAAhB,SACE,eAACwpB,GAAD,MAEF,eAACD,GAAD,0BACA,eAAC7P,GAAD,CACE1R,KAAMU,EAAgB,IAAK,yFAO9B,SAASihB,GAAT,GAAyD,IAAhCvE,EAA+B,EAA/BA,OACxB1c,EAAkBC,KACxB,OACE,eAAC2gB,GAAD,UACE,gBAACpxB,GAAD,CAAYsB,MAAO,CAAEzB,QAAS,QAA9B,UACE,eAAC,IAAD,CAAaiI,GAAG,QAAhB,SACE,eAACwpB,GAAD,MAEF,gBAACD,GAAD,WAAanE,EAAS1c,EAAgB,IAAK,OAASA,EAAgB,IAAK,UAAzE,gBACA,eAACgR,GAAD,CACE1R,KACEod,EACI1c,EACE,IACA,+LAEFA,EACE,IACA,qM,wBCrDX,SAASkhB,GAAehwB,GAAyC,IAAD,IAG/DiwB,EAAsB,UAAGhc,GAFd0C,GAAgB,OAAC3W,QAAD,IAACA,OAAD,EAACA,EAAOI,SAAS,GAEW,sBAAjC,iBAAG,EAA8C1K,cAAjD,aAAG,EAAuD,GAEtF,OAAOsK,GAASiwB,EAAc,IAAI1W,IAAYvZ,EAAOiwB,EAAY95B,iBAAcoQ,ECV1E,SAAS8R,GAAWwB,GACzB,GAAIA,IAAarB,IAAO,MAAO,MAC/B,GAAIqB,aAAoBvgB,IAAO,OAAOugB,EAASzZ,QAC/C,MAAM,IAAI/M,MAAM,oBAGHglB,I,iCCNR,SAAS6X,GAAgBrW,EAAgCtmB,GAE9D,OAAOA,GAAWsmB,IAAarB,IAAQve,IAAK1G,GAAWsmB,aAAoBvgB,IAAQugB,OAAWtT,EAGzF,SAAS4pB,GACdC,EACA78B,GAEA,IAAMyM,EAAQowB,GAAkB78B,EAAU28B,GAAgBE,EAAevW,SAAUtmB,QAAWgT,EAC9F,OAAOvG,GAASowB,EAAiB,IAAI7W,IAAYvZ,EAAOowB,EAAetuB,UAAOyE,EAGzE,SAAS8pB,GAAerwB,GAC7B,OAAIA,EAAMswB,OAAOr2B,IAAK+F,EAAMzM,UAAkBilB,IACvCxY,ECVF,IAAM+L,GAAUlP,UAAOC,IAAV,qDAIPyzB,GAAe1zB,UAAOC,IAAV,wDAGrB,qBAAG0zB,UAECtlB,cADK,gIAOL,QAGKulB,GAAe5zB,UAAOC,IAAV,wFAGH,qBAAG+F,MAAkBC,OAAOuC,YAGrCqrB,GAAiB7zB,UAAOC,IAAV,mDAId6zB,GAAY9zB,kBAAO0kB,IAAP1kB,CAAH,6CACX,gBAAGgG,EAAH,EAAGA,MAAO+tB,EAAV,EAAUA,SAAV,OACM,IAAbA,GAA+B,IAAbA,EACd/tB,EAAMC,OAAO8B,QACA,IAAbgsB,EACA/tB,EAAMC,OAAO+tB,QACA,IAAbD,EACA/tB,EAAMC,OAAOsL,KACbvL,EAAMC,OAAOuB,WAGRysB,GAAuBj0B,UAAO8F,OAAV,ocAGX,qBAAGE,MAAkBC,OAAOmC,oBAQvC,qBAAGpC,MAAkBC,OAAOC,cAOf,qBAAGF,MAAkBC,OAAOuC,YAG5B,qBAAGxC,MAAkBC,OAAOuC,YAMvC0rB,GAAOl0B,UAAO0xB,KAAV,sUAqBXyC,GAAyBn0B,UAAOC,IAAV,+TACN,gBAAG+F,EAAH,EAAGA,MAAH,OAAeoI,aAAe,GAAKpI,EAAMC,OAAO8B,YAQ3D,qBAAG/B,MAAkBC,OAAO8B,WASjCqsB,GAAsCp0B,UAAOC,IAAV,kNACnB,gBAAG+F,EAAH,EAAGA,MAAH,OAAeoI,aAAe,GAAKpI,EAAMC,OAAO8B,YAU/D,SAASssB,GAAT,GAA0D,IAA7Bt7B,EAA4B,EAA5BA,MAClC,OACE,gBAACo7B,GAAD,WACE,eAACC,GAAD,UACE,eAAC,KAAD,CAAetsB,KAAM,OAEvB,6BAAI/O,OAKH,I,MAAMu7B,GAAwBt0B,kBAAOG,GAAPH,CAAH,uIACZ,gBAAGgG,EAAH,EAAGA,MAAH,OAAeoI,aAAe,GAAKpI,EAAMC,OAAOE,YAC3D,qBAAGH,MAAkBC,OAAOE,WCpH1BouB,GAAiBv0B,kBAAOyB,GAAPzB,CAAH,+CAIdw0B,GAAYx0B,kBAAOsN,GAAPtN,CAAH,qGACA,qBAAGgG,MAAkBC,OAAOmC,oBAE1B,gBAAGpC,EAAH,EAAGA,MAAH,OAAeurB,aAAO,IAAMvrB,EAAMC,OAAOmC,qBAU1D,SAASqsB,GAAT,GAAkF,IAAnDrb,EAAkD,EAAlDA,KAAkD,IAA5Csb,qBAA4C,SAC9E75B,EAAY6D,KAAZ7D,QAEFw1B,EAAYqE,EAAgBtb,EAAKC,OAASma,GAAepa,EAAKC,QAC9DiX,EAAYoE,EAAgBtb,EAAKE,OAASka,GAAepa,EAAKE,QAEpE,EAAgCtN,oBAAS,GAAzC,mBAAO2oB,EAAP,KAAiBC,EAAjB,KAEMC,EAAkBjY,GAAe,OAAC/hB,QAAD,IAACA,SAAW6O,EAAW0P,EAAK0b,gBAC7DC,EAAkB5B,GAAe/Z,EAAK0b,gBAE5C,EACI1b,GACA2b,GACAF,GAEF72B,IAAKg3B,mBAAmBD,EAAgB9vB,IAAK4vB,EAAgB5vB,KACzD,CACEmU,EAAK6b,kBAAkB7b,EAAKC,OAAQ0b,EAAiBF,GAAiB,GACtEzb,EAAK6b,kBAAkB7b,EAAKE,OAAQyb,EAAiBF,GAAiB,IAExE,MAACnrB,OAAWA,GAVlB,mBAAOwrB,EAAP,KAAwBC,EAAxB,KAYA,OACE,qCACGN,GACC,eAAC,IAAD,UACE,eAAC,IAAD,UACE,gBAAC10B,GAAD,CAAYC,IAAI,OAAhB,UACE,eAACm0B,GAAD,UACE,eAAC3yB,GAAD,UACE,eAAC,IAAD,CAAMmB,MAAO,CAAEqyB,cAAe,YAAaC,WAAY,KAAOnyB,SAAS,OAAO2E,MAAM,aAApF,0CAKJ,gBAAC0sB,GAAD,CAAgB5wB,QAAS,kBAAMixB,GAAaD,IAA5C,UACE,gBAAC/yB,GAAD,WACE,eAACwuB,GAAD,CAAoBC,UAAWA,EAAWC,UAAWA,EAAWL,QAAM,EAACnoB,KAAM,KAC7E,gBAAC,IAAD,CAAM5E,SAAS,OAAf,UACGmtB,EAAU7sB,OADb,IACsB8sB,EAAU9sB,aAGlC,eAAC5B,GAAD,UACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SAAuB2xB,EAAkBA,EAAgB9P,cAAc,GAAK,WAGhF,gBAAC5kB,GAAD,CAAYC,IAAI,MAAhB,UACE,gBAACm0B,GAAD,WACE,gBAAC,IAAD,CAAMrxB,SAAS,OAAf,UAAuBmtB,EAAU7sB,OAAjC,OACC0xB,EACC,eAACtzB,GAAD,UACE,eAAC,IAAD,CAAM0zB,GAAG,MAAMpyB,SAAS,OAAxB,gBACGgyB,QADH,IACGA,OADH,EACGA,EAAiBnQ,cAAc,OAIpC,OAGJ,gBAACwP,GAAD,WACE,gBAAC,IAAD,CAAMrxB,SAAS,OAAf,UAAuBotB,EAAU9sB,OAAjC,OACC2xB,EACC,eAACvzB,GAAD,UACE,eAAC,IAAD,CAAM0zB,GAAG,MAAMpyB,SAAS,OAAxB,gBACGiyB,QADH,IACGA,OADH,EACGA,EAAiBpQ,cAAc,OAIpC,mBAYL,SAASwQ,GAAT,GAAwD,IAA5Bnc,EAA2B,EAA3BA,KACjCve,EAAY6D,KAAZ7D,QAEFw1B,EAAYmD,GAAepa,EAAKC,QAChCiX,EAAYkD,GAAepa,EAAKE,QAEtC,EAAgCtN,oBAAS,GAAzC,mBAAO2oB,EAAP,KAAiBC,EAAjB,KAEMC,EAAkBjY,GAAe,OAAC/hB,QAAD,IAACA,SAAW6O,EAAW0P,EAAK0b,gBAC7DC,EAAkB5B,GAAe/Z,EAAK0b,gBAEtCU,EACFX,GAAqBE,GAAmB/2B,IAAKg3B,mBAAmBD,EAAgB9vB,IAAK4vB,EAAgB5vB,KACnG,IAAIlH,IAAQ82B,EAAgB5vB,IAAK8vB,EAAgB9vB,UACjDyE,EAEN,EACI0P,GACA2b,GACAF,GAEF72B,IAAKg3B,mBAAmBD,EAAgB9vB,IAAK4vB,EAAgB5vB,KACzD,CACEmU,EAAK6b,kBAAkB7b,EAAKC,OAAQ0b,EAAiBF,GAAiB,GACtEzb,EAAK6b,kBAAkB7b,EAAKE,OAAQyb,EAAiBF,GAAiB,IAExE,MAACnrB,OAAWA,GAVlB,mBAAOwrB,EAAP,KAAwBC,EAAxB,KAYA,OACE,eAACX,GAAD,UACE,gBAACr0B,GAAD,CAAYC,IAAI,OAAhB,UACE,gBAACm0B,GAAD,CAAgB5wB,QAAS,kBAAMixB,GAAaD,IAAW5xB,MAAO,CAAEwsB,OAAQ,WAAxE,UACE,gBAAC3tB,GAAD,WACE,eAACwuB,GAAD,CAAoBC,UAAWA,EAAWC,UAAWA,EAAWL,QAAM,EAACnoB,KAAM,KAC7E,eAAC,IAAD,UAAQuoB,GAAcC,EAAf,UAAqDD,EAAU7sB,OAA/D,YAAyE8sB,EAAU9sB,QAAxD,eAAC0wB,GAAD,2BAEpC,eAACtyB,GAAD,UACG+yB,EACC,eAAC,KAAD,CAAW7sB,KAAK,KAAK/E,MAAO,CAAEmgB,WAAY,UAE1C,eAAC,KAAD,CAAapb,KAAK,KAAK/E,MAAO,CAAEmgB,WAAY,eAIjDyR,GACC,gBAACx0B,GAAD,CAAYC,IAAI,MAAhB,UACE,gBAACm0B,GAAD,WACE,eAAC3yB,GAAD,UACE,gBAAC,IAAD,qBAAcyuB,EAAU7sB,OAAxB,SAED0xB,EACC,gBAACtzB,GAAD,WACE,eAAC,IAAD,CAAM0zB,GAAG,MAAT,gBAAgBJ,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAiBnQ,cAAc,KAC/C,eAACxB,GAAD,CAAczb,KAAK,OAAO/E,MAAO,CAAEmgB,WAAY,OAASlG,SAAUqT,OAGpE,OAIJ,gBAACkE,GAAD,WACE,eAAC3yB,GAAD,UACE,gBAAC,IAAD,qBAAc0uB,EAAU9sB,OAAxB,SAED2xB,EACC,gBAACvzB,GAAD,WACE,eAAC,IAAD,CAAM0zB,GAAG,MAAT,gBAAgBH,QAAhB,IAAgBA,OAAhB,EAAgBA,EAAiBpQ,cAAc,KAC/C,eAACxB,GAAD,CAAczb,KAAK,OAAO/E,MAAO,CAAEmgB,WAAY,OAASlG,SAAUsT,OAGpE,OAGJ,gBAACiE,GAAD,WACE,eAAC,IAAD,gCACA,eAAC,IAAD,UAAOM,EAAkBA,EAAgB9P,cAAc,GAAK,SAE9D,gBAACwP,GAAD,WACE,eAAC,IAAD,+BACA,eAAC,IAAD,UAAOiB,EAAmB,UAAMA,EAAoBC,QAAQ,GAAlC,KAA0C,SAGtE,gBAACh0B,GAAD,CAAY8O,UAAU,OAAtB,UACE,eAAC,IAAD,CAAQgC,GAAIlM,IAAMkD,GAAE,eAAUiS,GAAW6U,GAArB,YAAmC7U,GAAW8U,IAAcvtB,MAAO,CAAEuG,MAAO,OAAhG,iBAGA,eAAC,IAAD,CACEiJ,GAAIlM,IACJtD,MAAO,CAAEuG,MAAO,OAChBC,GAAE,kBAAaiS,GAAW6U,GAAxB,YAAsC7U,GAAW8U,IAHrD,+BCnMd,IAEYoF,GAFNC,GAAiB,IAAIljB,KAAUmjB,MAS9B,SAASC,GAAS9Y,GACvB,IAAQrmB,EAAYgI,KAAZhI,QAEF6L,EAASF,mBACb,kBACE0a,EAAWjlB,KAAI,mCAAEg+B,EAAF,KAAaC,EAAb,WAA4B,CACzC1C,GAAgByC,EAAWp/B,GAC3B28B,GAAgB0C,EAAWr/B,SAE/B,CAACA,EAASqmB,IAWN5F,EAAUN,GARMxU,mBACpB,kBACEE,EAAOzK,KAAI,YAAuB,IAAD,mBAApB0hB,EAAoB,KAAZC,EAAY,KAC/B,OAAOD,GAAUC,IAAWD,EAAOia,OAAOha,GAAUC,IAAK5V,WAAW0V,EAAQC,QAAU/P,OAE1F,CAACnH,IAG0DozB,GAAgB,eAE7E,OAAOtzB,mBAAQ,WACb,OAAO8U,EAAQrf,KAAI,SAACe,EAAQuK,GAC1B,IAAgB4yB,EAAsBn9B,EAA9BA,OAAkBud,EAAYvd,EAAZud,QACpBoD,EAASjX,EAAOa,GAAG,GACnBqW,EAASlX,EAAOa,GAAG,GAEzB,GAAIgT,EAAS,MAAO,CAACsf,GAAUO,QAAS,MACxC,IAAKzc,IAAWC,GAAUD,EAAOia,OAAOha,GAAS,MAAO,CAACic,GAAUQ,QAAS,MAC5E,IAAKF,EAAU,MAAO,CAACN,GAAUS,WAAY,MAC7C,IAAQC,EAAuBJ,EAAvBI,SAAUC,EAAaL,EAAbK,SAClB,EAAyB7c,EAAO8c,YAAY7c,GAAU,CAACD,EAAQC,GAAU,CAACA,EAAQD,GAAlF,mBAAOH,EAAP,KAAeC,EAAf,KACA,MAAO,CACLoc,GAAUa,OACV,IAAI7c,IAAK,IAAIgD,IAAYrD,EAAQ+c,EAAS98B,YAAa,IAAIojB,IAAYpD,EAAQ+c,EAAS/8B,mBAG3F,CAAC6d,EAAS5U,IAGR,SAASi0B,GAAQhd,EAAmBC,GACzC,OAAOoc,GAAS,CAAC,CAACrc,EAAQC,KAAU,I,SAjD1Bic,O,qBAAAA,I,2BAAAA,I,mBAAAA,I,sBAAAA,Q,mBCLL,SAASe,GAAkBtzB,EAAeuzB,EAAgBC,GAC/D,IAGMC,EAAYxf,GAHD0C,GAAgB,OAAC3W,QAAD,IAACA,OAAD,EAACA,EAAOI,SAAS,GAGF,YADjClB,mBAAQ,iBAAM,CAACq0B,EAAOC,KAAU,CAACD,EAAOC,KACc99B,OAErE,OAAOwJ,mBAAQ,kBAAOc,GAASyzB,EAAY,IAAIla,IAAYvZ,EAAOyzB,EAAUt9B,iBAAcoQ,IAAY,CACpGvG,EACAyzB,IAIWH,IChBHI,I,SAAAA,K,cAAAA,E,iBAAAA,Q,KAKL,IAAMC,GAAiB93B,aAAmD,uBACpE+3B,GAAmB/3B,aAAmB,yBACtCg4B,GAAYh4B,aAAmD,kBAC/Di4B,GAAmBj4B,aAM7B,yBACUk4B,GAAel4B,aAA2C,qBCH1Dm4B,GAAiBn4B,aAM3B,+BACUo4B,GAAuBp4B,aAAmC,qCAC1Dq4B,GAAsBr4B,aAIhC,oCACUs4B,GAAqBt4B,aAI/B,mCCrBI,SAASu4B,KAId,MAA6B74B,KAArBhI,EAAR,EAAQA,QAASmE,EAAjB,EAAiBA,QACX8E,EAAWC,cAEjB,OAAOC,uBACL,SACE5H,GAEI,IAAD,yDADiG,GAAlGwP,EACC,EADDA,QAAS+vB,EACR,EADQA,SAEX,GAAK38B,GACAnE,EAAL,CAEA,IAAQ6Q,EAAStP,EAATsP,KACR,IAAKA,EACH,MAAM/Q,MAAM,8BAEdmJ,EAASw3B,GAAe,CAAE5vB,OAAM5C,KAAM9J,EAASnE,UAAS8gC,WAAU/vB,gBAEpE,CAAC9H,EAAUjJ,EAASmE,IAKjB,SAAS48B,KAAgE,IAAD,EACrE/gC,EAAYgI,KAAZhI,QAEF6I,EAAQD,aAAgD,SAAC+gB,GAAD,OAAOA,EAAEqX,gBAEvE,OAAOhhC,GAAO,UAAG6I,EAAM7I,UAAT,QAA0B,GAenC,SAASihC,GAAoBC,GAClC,OAAO,IAAIC,MAAOC,UAAYF,EAAGG,UAAY,MC9C/C,ICEYC,GCXAnB,GFSNoB,GAAW,IAAIl6B,IAAQC,IAAKC,OAAO,IAAKD,IAAKC,OAAO,MACpDi6B,GAAsB,IAAIn6B,IAAQC,IAAKC,OAAO,KAAQD,IAAKC,OAAO,MAClEk6B,GAA2BD,GAAoBE,SAASH,IAGvD,SAASI,GACdC,GAIA,IAAMC,EAAiBD,EAEnBJ,GAAoBE,SAClBE,EAAME,MAAMC,MAAMhgC,QAChB,SAACigC,GAAD,OAAoCA,EAAW1zB,SAASmzB,MACxDD,UAJJxuB,EASEivB,EAAgCL,GAASC,EAAgBD,EAAMM,YAAYR,SAASG,QAAiB7uB,EAe3G,MAAO,CAAEmvB,sBAZ4BF,EACjC,IAAI56B,IAAJ,OAAY46B,QAAZ,IAAYA,OAAZ,EAAYA,EAA+BG,UAA3C,OAAsDH,QAAtD,IAAsDA,OAAtD,EAAsDA,EAA+BI,kBACrFrvB,EAU0D6uB,cAN5DA,GACAD,IACCA,EAAMU,uBAAuBtc,IAC1B,IAAIA,IAAY4b,EAAMU,YAAY71B,MAAOo1B,EAAcvzB,SAASszB,EAAMU,YAAY/zB,KAAKg0B,UACvFjd,IAAeC,MAAMsc,EAAcvzB,SAASszB,EAAMU,YAAY/zB,KAAKg0B,YAMpE,SAASC,GACdZ,EACAa,GACwC,IAAD,E3EGJC,E2EF7BC,G3EE6BD,E2EFFD,E3EG1B,IAAIp7B,IAAQC,IAAKC,OAAOq7B,KAAKC,MAAMH,IAAOp7B,IAAKC,OAAO,O2EF7D,OAAO,EAAP,iBACG44B,GAAM2C,MADT,OACiBlB,QADjB,IACiBA,OADjB,EACiBA,EAAOmB,gBAAgBJ,IADxC,cAEGxC,GAAM6C,OAFT,OAEkBpB,QAFlB,IAEkBA,OAFlB,EAEkBA,EAAOqB,iBAAiBN,IAF1C,EAMK,SAASO,GAAgBhB,GAC9B,OAAI,OAACA,QAAD,IAACA,OAAD,EAACA,EAAaiB,SAASt7B,MACvB,OAACq6B,QAAD,IAACA,OAAD,EAACA,EAAaiB,SAASx7B,MACvB,OAACu6B,QAAD,IAACA,OAAD,EAACA,EAAaiB,SAASz7B,MACvB,OAACw6B,QAAD,IAACA,OAAD,EAACA,EAAaiB,SAAS17B,KACpB,EADsD,EADG,EADF,EADM,EAO/D,SAAS27B,GAAqBxB,EAAe1Q,GAClD,OAAK0Q,EAGE1Q,EAAQ,UACR0Q,EAAMyB,eAAeC,SAASjV,cAAc,GADpC,YAC0CuT,EAAMU,YAAYhc,SAASxZ,OADrE,cAET80B,EAAM2B,aAAajd,SAASxZ,QAFnB,UAIR80B,EAAMyB,eAAehV,cAAc,GAJ3B,YAIiCuT,EAAM2B,aAAajd,SAASxZ,OAJ7D,cAKT80B,EAAMU,YAAYhc,SAASxZ,QAPxB,GClDJ,SAAS02B,GACdC,EACAxD,GAEA,IAAQ97B,EAAY6D,KAAZ7D,QACFsI,EAAQg3B,aAA2Bzd,IAAcyd,EAAgBh3B,WAAQuG,EACzE0wB,EAAmB3D,GAAkBtzB,EAAD,OAAQtI,QAAR,IAAQA,SAAW6O,EAAWitB,GAClE0D,EFiCD,SAA+BtgB,EAAkC4c,GACtE,IAAM2D,EAAkB7C,KACxB,OAAOp1B,mBACL,iBAC0B,kBAAjB0X,GACY,kBAAZ4c,GACPx8B,OAAOC,KAAKkgC,GAAiB/d,MAAK,SAAChV,GACjC,IAAMqwB,EAAK0C,EAAgB/yB,GAC3B,IAAKqwB,EAAI,OAAO,EAChB,GAAIA,EAAG2C,QACL,OAAO,EAET,IAAQ/C,EAAaI,EAAbJ,SACR,QAAKA,GACEA,EAASb,UAAYA,GAAWa,EAASzd,eAAiBA,GAAgB4d,GAAoBC,QAEzG,CAAC0C,EAAiB3D,EAAS5c,IEjDLygB,CAAqB,OAACr3B,QAAD,IAACA,OAAD,EAACA,EAAOI,QAASozB,GAGxD8D,EAA+Bp4B,mBAAQ,WAC3C,OAAK83B,GAAoBxD,EACrBwD,EAAgBnd,WAAarB,IAAcqc,GAAc0C,SAExDN,EAGEA,EAAiBP,SAASM,GAC7BE,EACErC,GAAc2C,QACd3C,GAAc4C,aAChB5C,GAAc0C,SAPY1C,GAAc6C,QAHH7C,GAAc6C,UAWtD,CAACV,EAAiBC,EAAkBC,EAAiB1D,IAElD3b,EAAgBlB,GAAgB,OAAC3W,QAAD,IAACA,OAAD,EAACA,EAAOI,SACxC4zB,EAAiBI,KAEjBuD,EAAUj7B,sBAAW,sBAAC,8BAAAzI,EAAA,yDACtBqjC,IAAkBzC,GAAc4C,aADV,uBAExBvjC,QAAQ0B,MAAM,oCAFU,6BAKrBoK,EALqB,uBAMxB9L,QAAQ0B,MAAM,YANU,6BAUrBiiB,EAVqB,uBAWxB3jB,QAAQ0B,MAAM,yBAXU,6BAerBohC,EAfqB,wBAgBxB9iC,QAAQ0B,MAAM,6BAhBU,8BAoBrB49B,EApBqB,wBAqBxBt/B,QAAQ0B,MAAM,cArBU,kCAyBtBgiC,GAAW,EAzBW,UA0BC/f,EAAcggB,YAAYF,QAAQnE,EAASsE,MAAY5hC,OAAM,WAGtF,OADA0hC,GAAW,EACJ/f,EAAcggB,YAAYF,QAAQnE,EAASwD,EAAgBl1B,IAAI3L,eA7B9C,eA0BpB4hC,EA1BoB,yBAiCnBlgB,EACJ8f,QAAQnE,EAASoE,EAAWZ,EAAgBl1B,IAAI3L,WAAa2hC,KAAY,CACxEE,SAAU32B,GAAmB02B,KAE9B/hC,MAAK,SAAClB,GACLk/B,EAAel/B,EAAU,CACvBwP,QAAQ,WAAD,OAAa0yB,EAAgBnd,SAASxZ,QAC7Cg0B,SAAU,CAAEzd,aAAc5W,EAAMI,QAASozB,gBAG5Ct9B,OAAM,SAACN,GAEN,MADA1B,QAAQ0B,MAAM,0BAA2BA,GACnCA,MA7CgB,4CA+CzB,CAAC0hC,EAAet3B,EAAO6X,EAAemf,EAAiBxD,EAASQ,IAEnE,MAAO,CAACsD,EAAeK,I,SApFb9C,O,qBAAAA,I,+BAAAA,I,qBAAAA,I,wBAAAA,Q,cCXAnB,K,wBAAAA,E,yBAAAA,Q,KAKL,IAAMG,GAAYh4B,aAAyE,sBACrFo8B,GAAiBp8B,aAAmB,uB,UCLlC,SAASq8B,GAAex3B,EAAU6c,GAC/C,MAA4C1U,mBAAYnI,GAAxD,mBAAOy3B,EAAP,KAAuBC,EAAvB,KAgBA,OAdAzyB,qBAAU,WAER,IAAM6jB,EAAUjzB,YAAW,WACzB6hC,EAAkB13B,KACjB6c,GAKH,OAAO,WACL1X,aAAa2jB,MAEd,CAAC9oB,EAAO6c,IAEJ4a,ECZM,SAASE,GACtBC,GAEA,IAAMC,EAAY93B,GAAU63B,GACtBE,ECAO,SAAoBp4B,GAAiE,IAAD,MAC3Fq4B,EAAmBP,GAAY93B,EAAS,KACxCqc,EAAkBvd,mBAAQ,WAC9B,IAAKu5B,IAAqBh4B,GAAUg4B,GAAmB,MAAO,MAAClyB,GAC/D,IACE,OAAOkyB,EAAmB,CAAC/b,oBAAS,GAAD,OAAI+b,EAAiBzc,cAAcnB,OAAO,GAA1C,mBAAgE,MAACtU,GACpG,MAAO3Q,GACP,MAAO,MAAC2Q,MAET,CAACkyB,IAEE7b,EAAkB3I,GADE4C,IAAwB,GACa,WAAY4F,GACrEE,EAAqB,UAAGC,EAAgBlnB,cAAnB,aAAG,EAAyB,GAKjDoK,EAAOmU,GAJY8C,GACvB4F,IAA0BP,GAAOO,GAAyBA,OAAwBpW,GAClF,GAEiD,OAAQkW,GAErDjd,EAAUi5B,IAAqBr4B,EACrC,MAAO,CACLs4B,QAASl5B,EAAU,KAAH,oBAAUM,EAAKpK,cAAf,aAAU,EAAc,UAAxB,QAA8B,KAC9Cud,QAASzT,GAAWod,EAAgB3J,SAAWnT,EAAKmT,SDtBhC0lB,CAAWJ,QAAahyB,GACxCqyB,EEHO,SAAuB7c,GAAwE,IAAD,MACrG8c,EAAgBX,GAAYnc,EAAS,KACrCU,EAAkBvd,mBAAQ,WAC9B,IAAK25B,EAAe,MAAO,MAACtyB,GAC5B,IACE,OAAOsyB,EAAgB,CAACnc,oBAASmc,IAAkB,MAACtyB,GACpD,MAAO3Q,GACP,MAAO,MAAC2Q,MAET,CAACsyB,IAEEjc,EAAkB3I,GADE4C,IAAwB,GACa,WAAY4F,GACrEE,EAAqB,UAAGC,EAAgBlnB,cAAnB,aAAG,EAAyB,GAKjDojC,EAAO7kB,GAJY8C,GACvB4F,IAA0BP,GAAOO,GAAyBA,OAAwBpW,GAClF,GAEiD,OAAQkW,GAErDjd,EAAUq5B,IAAkB9c,EAClC,MAAO,CACL3b,QAASZ,EAAU,KAAH,oBAAUs5B,EAAKpjC,cAAf,aAAU,EAAc,UAAxB,QAA8B,KAC9Cud,QAASzT,GAAWod,EAAgB3J,SAAW6lB,EAAK7lB,SFnBvC8lB,CAAcT,GAE7B,MAAO,CACLrlB,QAASulB,EAAcvlB,SAAW2lB,EAAO3lB,QACzC7S,QAASm4B,GAAaK,EAAOx4B,QAC7BN,KAAM04B,EAAcE,QAAUF,EAAcE,SAAWH,GAAaK,EAAOx4B,SAAUk4B,GAAwB,MGRjH,SAASU,GAAkBrG,EAAsBC,GAC/C,IAAQr/B,EAAYgI,KAAZhI,QAGF0lC,EAAiB/5B,mBAAQ,kBAAO3L,EAAU4G,GAA8B5G,GAAW,KAAK,CAACA,IAGzF2lC,EAA8Bh6B,mBAClC,kBACEi6B,KAAQF,GAAO,SAACG,GAAD,OAA4BH,EAAMtkC,KAAI,SAAC0kC,GAAD,MAAe,CAACD,EAAMC,SAAaryB,QACtF,mCAAEsyB,EAAF,KAAMC,EAAN,YAAcD,EAAGl5B,UAAYm5B,EAAGn5B,aAEpC,CAAC64B,IAGH,EAAyB1lC,EACrB,CAAC28B,GAAgByC,EAAWp/B,GAAU28B,GAAgB0C,EAAWr/B,IACjE,MAACgT,OAAWA,GAFhB,mBAAO8P,EAAP,KAAeC,EAAf,KAuCMkjB,EAAW9G,GAnC6BxzB,mBAC5C,kBACEmX,GAAUC,EACN,CAEE,CAACD,EAAQC,IAFX,mBAIK2iB,EAAMtkC,KAAI,SAACykC,GAAD,MAA0B,CAAC/iB,EAAQ+iB,OAJlD,YAMKH,EAAMtkC,KAAI,SAACykC,GAAD,MAA0B,CAAC9iB,EAAQ8iB,OANlD,YAQKF,IAEFlyB,QAAO,SAAC5H,GAAD,OAAsCmR,QAAQnR,EAAO,IAAMA,EAAO,OACzE4H,QAAO,mCAAEsyB,EAAF,KAAMC,EAAN,YAAcD,EAAGl5B,UAAYm5B,EAAGn5B,WAGvC4G,QAAO,YAAe,IAAD,mBAAZsyB,EAAY,KAARC,EAAQ,KACpB,IAAKhmC,EAAS,OAAO,EACrB,IAAMkmC,EAAcr/B,GAAa7G,GACjC,IAAKkmC,EAAa,OAAO,EAEzB,IAAMC,EAAoCD,EAAYH,EAAGl5B,SACnDu5B,EAAoCF,EAAYF,EAAGn5B,SAEzD,OAAKs5B,IAAiBC,KAClBD,IAAiBA,EAAa1rB,MAAK,SAACorB,GAAD,OAAUG,EAAGjJ,OAAO8I,UACvDO,IAAiBA,EAAa3rB,MAAK,SAACorB,GAAD,OAAUE,EAAGhJ,OAAO8I,UAI/D,KACN,CAAC/iB,EAAQC,EAAQ2iB,EAAOC,EAAW3lC,KAMrC,OAAO2L,mBACL,kBACElI,OAAO+e,OACLyjB,EAEGxyB,QAAO,SAACtR,GAAD,OAAgD6a,QAAQ7a,EAAO,KAAO68B,GAAUa,QAAU19B,EAAO,OAExGJ,QAAwC,SAACC,EAAD,GAAqB,IAAD,EAAVqkC,EAAU,oBAE3D,OADArkC,EAAKqkC,EAAKjI,eAAevxB,SAAzB,UAAoC7K,EAAKqkC,EAAKjI,eAAevxB,gBAA7D,QAAyEw5B,EAClErkC,IACN,OAET,CAACikC,I,cC3DE,SAASK,KACd,OAAO19B,aAAwC,SAACC,GAAD,OAAWA,EAAM09B,QAiD3D,SAASC,GAAer5B,EAAgBmZ,GAC7C,GAAKnZ,GAAUmZ,EAGf,IACE,IAAMmgB,EAAmBC,sBAAWv5B,EAAOmZ,EAASlK,UAAUxZ,WAC9D,GAAyB,MAArB6jC,EACF,OAAOngB,aAAoBvgB,IACvB,IAAIigB,IAAYM,EAAUhf,IAAKC,OAAOk/B,IACtCnhB,IAAeC,MAAMje,IAAKC,OAAOk/B,IAEvC,MAAOpkC,GAEP1B,QAAQC,KAAR,yCAA+CuM,EAA/C,KAAyD9K,IAM7D,IAAMskC,GAAoC,CACxC,6CACA,6CACA,6CACA,6CACA,8CAQF,SAASC,GAAgBhF,EAAciF,GACrC,OACEjF,EAAME,MAAMzhC,KAAKwlB,MAAK,SAACpZ,GAAD,OAAWA,EAAMI,UAAYg6B,MACnDjF,EAAME,MAAMC,MAAMlc,MAAK,SAACnD,GAAD,OAAUA,EAAK0b,eAAevxB,UAAYg6B,KAK9D,SAASC,KAMb,IAAD,QAuCIC,EAKe,EAIwC,EA/CnD5iC,EAAY6D,KAAZ7D,QAER,EAMImiC,KALFU,EADF,EACEA,iBACAC,EAFF,EAEEA,WAC6BC,EAH/B,EAGG/G,GAAM2C,OAAUhe,WACaqiB,EAJhC,EAIGhH,GAAM6C,QAAWle,WAClBsiB,EALF,EAKEA,UAGIC,EAAgBxiB,GAAYqiB,GAC5BI,EAAiBziB,GAAYsiB,GAC7BI,EAAkBzC,GAAM,OAACsC,QAAD,IAACA,SAAap0B,GACtCH,EAAiB,UAAkB,OAAdu0B,EAAqBjjC,EAAUojC,EAAgB16B,eAAnD,QAA+D,KAEhF26B,EAAwBphB,GAAmB,OAACjiB,QAAD,IAACA,SAAW6O,EAAW,QACtEq0B,QADsE,IACtEA,SAAiBr0B,EADqD,OAEtEs0B,QAFsE,IAEtEA,SAAkBt0B,IAGdy0B,EAAqBT,IAAqB7G,GAAM2C,MAChD4E,EAAelB,GAAeS,EAAD,UAAcQ,EAAYJ,EAAgBC,SAA1C,aAA6Dt0B,GAE1F20B,EDtDD,SAAyBC,EAAmCC,GACjE,IAAMC,EAAerC,GAAiB,OAACmC,QAAD,IAACA,OAAD,EAACA,EAAkBthB,SAAUuhB,GAEnE,OAAOl8B,mBAAQ,WACoD,IAAD,EAAhE,OAAIi8B,GAAoBC,GAAeC,EAAankC,OAAS,GAC3D,UACEokC,IAAMJ,iBAAiBG,EAAcF,EAAkBC,EAAa,CAAEG,QAAS,EAAGC,cAAe,IAAK,UADxG,QAIK,OACN,CAACH,EAAcF,EAAkBC,IC4CXK,CAAgBT,EAAYC,OAAe10B,EAA5B,OAAuCs0B,QAAvC,IAAuCA,SAAkBt0B,GAC3Fm1B,EDvCD,SAA0BC,EAAuBC,GACtD,IAAMP,EAAerC,GAAkB2C,EAAD,OAAaC,QAAb,IAAaA,OAAb,EAAaA,EAAmB/hB,UAEtE,OAAO3a,mBAAQ,WACoD,IAAD,EAAhE,OAAIy8B,GAAcC,GAAqBP,EAAankC,OAAS,GAC3D,UACEokC,IAAMI,kBAAkBL,EAAcM,EAAYC,EAAmB,CAAEL,QAAS,EAAGC,cAAe,IAAK,UADzG,QAKK,OACN,CAACH,EAAcM,EAAYC,IC4BJC,CAAgB,OAACjB,QAAD,IAACA,SAAiBr0B,EAAYy0B,OAA2Bz0B,EAAf00B,GAE9Ea,EAAUd,EAAYE,EAAmBQ,EAEzCK,GAAgB,mBACnBrI,GAAM2C,MAAQ0E,EAAsB,IADjB,cAEnBrH,GAAM6C,OAASwE,EAAsB,IAFlB,GAKhBnhB,GAA2C,mBAC9C8Z,GAAM2C,MADwC,OAChCuE,QADgC,IAChCA,SAAiBr0B,GADe,cAE9CmtB,GAAM6C,OAFwC,OAE/BsE,QAF+B,IAE/BA,SAAkBt0B,GAFa,IAM5C7O,IACH4iC,EAAa,kBAGVW,KACHX,EAAU,UAAGA,SAAH,QAAiB,mBAGxB1gB,EAAW8Z,GAAM2C,QAAWzc,EAAW8Z,GAAM6C,UAChD+D,EAAU,UAAGA,SAAH,QAAiB,kBAG7B,IACyB,EADnB0B,EAAcv7B,GAAU2F,GAC9B,GAAKA,GAAO41B,GAEL,IAC6C,IAAlD9B,GAAwBxrB,QAAQstB,IAC/Bd,GAAoBf,GAAgBe,EAAkBc,IACtDN,GAAqBvB,GAAgBuB,EAAmBM,GACzD,CAAC,IAAD,EACA1B,EAAU,UAAGA,SAAH,QAAiB,0BAN3BA,EAAU,UAAGA,SAAH,QAAiB,oBAS7B,MAA0B/kB,KAAnBygB,EAAP,oBAEMiG,EAA0BH,GAAW9F,GAAmBD,GAA+B+F,EAAS9F,GAGtG,EAA8B,CAC5B+F,EAAiBrI,GAAM2C,OACvB4F,EAA0BA,EAAwBvI,GAAM2C,OAAS,MAF5D6F,EAAP,KAAkBC,EAAlB,KASA,OAJID,GAAaC,GAAYD,EAAUxF,SAASyF,KAC9C7B,EAAU,uBAAmB6B,EAAStiB,SAASxZ,OAArC,aAGL,CACLuZ,aACAmiB,mBACAd,eACAa,QAAO,OAAEA,QAAF,IAAEA,SAAWv1B,EACpB+zB,cAIJ,SAAS8B,GAA8BC,GACrC,GAAwB,kBAAbA,EAAuB,CAChC,IAAMnqB,EAAQzR,GAAU47B,GACxB,GAAInqB,EAAO,OAAOA,EAClB,GAA+B,QAA3BmqB,EAAS9jB,cAAyB,MAAO,MAC7C,IAAc,IAAVrG,EAAiB,MAAO,MAE9B,cAAO,YAAS,GAYlB,IAAMyJ,GAAiB,qFACjB9K,GAAgB,sBAUf,SAASyrB,GAA2BC,GAAgC,IAAD,EACpE3B,EAAgBwB,GAA8BG,EAAS3B,eACvDC,EAAiBuB,GAA8BG,EAAS1B,gBACxDD,IAAkBC,IACmB,kBAA5B0B,EAAS1B,eAClBD,EAAgB,GAEhBC,EAAiB,IAIrB,IA/BoCwB,EA+B9B1B,EApBR,SAA4BA,GAC1B,MAAyB,kBAAdA,EAA+B,KAC1Bl6B,GAAUk6B,KAEtBhf,GAAe1K,KAAK0pB,IACpB9pB,GAAcI,KAAK0pB,GADoBA,EAEpC,MAcW6B,CAAmBD,EAAS5B,WAE9C,OAAO,EAAP,iBACGjH,GAAM2C,MAAQ,CACbhe,WAAYuiB,IAFhB,cAIGlH,GAAM6C,OAAS,CACdle,WAAYwiB,IALhB,2BA/B2B,kBAFSwB,EAwCOE,EAASE,cAtCZC,MAAMC,WAAWN,IAAwB,GAAXA,GA+BtE,iCA5BF,SAA2CA,GACzC,MAA2B,kBAAbA,GAAoD,WAA3BA,EAASrgB,cAA6B0X,GAAM6C,OAAS7C,GAAM2C,MAmC9EuG,CAAkCL,EAASM,aAR/D,0BASElC,GATF,EAcK,SAASmC,KAGd,IAAQvpC,EAAYgI,KAAZhI,QACFiJ,EAAWC,cACX8/B,ECpQO,WACb,IAAQ3Y,EAAWmZ,cAAXnZ,OACR,OAAO1kB,mBACL,kBAAO0kB,GAAUA,EAAO1sB,OAAS,EAAI6b,iBAAM6Q,EAAQ,CAAEoZ,aAAa,EAAOC,mBAAmB,IAAU,KACtG,CAACrZ,IDgQcsZ,GACjB,EAA4Br0B,qBAA5B,mBAAOnT,EAAP,KAAeynC,EAAf,KA4BA,OAxBAx3B,qBAAU,WACR,GAAKpS,EAAL,CACA,IAAMkD,EAAS6lC,GAA2BC,GAGtC1B,EAAiBpkC,EAAOi9B,GAAM6C,QAAQle,WACrCwiB,IACHA,E5F3QoB,8C4F8QtBr+B,EACEs3B,GAAiB,CACf0G,WAAY/jC,EAAO+jC,WACnB4C,MAAO3mC,EAAO8jC,iBACdE,gBAAiBhkC,EAAOi9B,GAAM2C,OAAOhe,WACrCqiB,iBAAkBG,EAClBF,UAAWlkC,EAAOkkC,aAItBwC,EAAU,CAAE1C,gBAAiBhkC,EAAOi9B,GAAM2C,OAAOhe,WAAYqiB,iBAAkBjkC,EAAOi9B,GAAM6C,QAAQle,gBAEnG,CAAC7b,EAAUjJ,IAEPmC,EEvRT,IAAM2nC,GAAOxiC,IAAKC,OAAO,GAElB,SAASwiC,KACd,OAAOnhC,aAAwC,SAACC,GAAD,OAAWA,EAAMmhC,QCV3D,SAASC,GAAepN,GAC7B,GAAKA,EACL,OAAIA,EAAevW,WAAarB,IAC1B3d,IAAKkqB,YAAYqL,EAAetuB,IAAKzG,IAChCwd,IAAeC,MAAMje,IAAKo6B,SAAS7E,EAAetuB,IAAKzG,KAEzDwd,IAAeC,MAAMje,IAAKC,OAAO,IAEnCs1B,EAGMoN,I,eCVAC,GANF5gC,UAAOC,IAAV,kGACY,qBAAG+F,MAAkBC,OAAO46B,e,UCSrCC,GAAcC,aAAY,CACrC99B,KAAM,SACNyqB,aAVgC,CAChCn3B,KAAM,IAUNyqC,SAAU,CACRvnC,KAAM,SAAC8F,EAAoB0hC,GACzB,IAAQC,EAAYD,EAAZC,QACFC,EAAa5hC,EAAMhJ,KAAK6qC,WAAU,SAACC,GAAD,OAAWA,EAAMzoC,KAAOqoC,EAAOC,QAAQtoC,MAG3EuoC,GAAc,GAChB5hC,EAAMhJ,KAAK+qC,OAAOH,EAAY,GAGhC5hC,EAAMhJ,KAAKgrC,QAAQL,IAErBM,OAAQ,SAACjiC,EAAoB0hC,GAC3B,IAAME,EAAa5hC,EAAMhJ,KAAK6qC,WAAU,SAACC,GAAD,OAAWA,EAAMzoC,KAAOqoC,EAAOC,WAEnEC,GAAc,GAChB5hC,EAAMhJ,KAAK+qC,OAAOH,EAAY,IAGlCM,MAAO,SAACliC,GACNA,EAAMhJ,KAAO,OAMZ,GAAgCuqC,GAAYY,QAApCD,GAAR,GAAQA,MAAOD,GAAf,GAAeA,OAAQ/nC,GAAvB,GAAuBA,KAEfqnC,MAAf,QCJea,GA3BE,WACf,IAAMhiC,EAAWC,cAuBjB,OAtBgByC,mBAAQ,WACtB,IAAM5I,EAAO,SAAC4nC,GAAD,OAAkB1hC,EAASiiC,GAAUP,KAElD,MAAO,CACLQ,WAAY,SAACv+B,EAAe6hB,GAC1B,OAAO1rB,EAAK,CAAEb,GAAIkpC,qBAAUx+B,GAAQa,KAAM49B,IAAWC,OAAQ1+B,QAAO6hB,iBAEtE8c,UAAW,SAAC3+B,EAAe6hB,GACzB,OAAO1rB,EAAK,CAAEb,GAAIkpC,qBAAUx+B,GAAQa,KAAM49B,IAAWG,KAAM5+B,QAAO6hB,iBAEpEgd,aAAc,SAAC7+B,EAAe6hB,GAC5B,OAAO1rB,EAAK,CAAEb,GAAIkpC,qBAAUx+B,GAAQa,KAAM49B,IAAWK,QAAS9+B,QAAO6hB,iBAEvEkd,aAAc,SAAC/+B,EAAe6hB,GAC5B,OAAO1rB,EAAK,CAAEb,GAAIkpC,qBAAUx+B,GAAQa,KAAM49B,IAAWO,QAASh/B,QAAO6hB,iBAEvE1rB,OACA+nC,OAAQ,SAAC5oC,GAAD,OAAgB+G,EAAS4iC,GAAY3pC,KAC7C6oC,MAAO,kBAAM9hC,EAAS6iC,UAEvB,CAAC7iC,KCgBS8iC,GAnCC,WACd,MAAiC/2B,cAAzBI,EAAR,EAAQA,SAAU42B,EAAlB,EAAkBA,WACVb,EAAeF,KAAfE,WA8BR,MAAO,CAAEc,MA5BK9iC,uBAAY,SAAC+iC,GACzB,IAAMC,EAAY9mC,EAAiB6mC,GAC/BC,EACF/2B,EAAS+2B,EAAD,uCAAY,WAAO9pC,GAAP,SAAA3B,EAAA,sDAClBiV,OAAOC,aAAaw2B,WAAWt2B,KAC3BzT,aAAiBgqC,IACnBlB,EAAW,uBAAwB,oDAC1B9oC,aAAiBiqC,KAA2BjqC,aAAiBkqC,qBACtEpB,EAAW,iBAAkB,yBAE7B9oC,aAAiBmqC,KACjBnqC,aAAiBoqC,KAEbN,aAAqBnnC,MACCmnC,EACRO,sBAAwB,MAE1CvB,EAAW,sBAAuB,4CAElCA,EAAW9oC,EAAMkK,KAAMlK,EAAM1C,SAhBb,2CAAZ,uDAoBRwrC,EAAW,uBAAwB,mCAGpC,IAEawB,OAAQX,IC9BXY,GAZ6B,SAACv0B,GAC3C,IAAMkD,EAAkBC,KACxB,EAA0BuwB,KAAlBE,EAAR,EAAQA,MAAOU,EAAf,EAAeA,OACPE,EAA0BC,YAAeb,EAAOU,GAAhDE,sBAER,OACE,eAAC,IAAD,yBAAQ5/B,QAAS4/B,GAA2Bx0B,GAA5C,aACGkD,EAAgB,IAAK,qBCRfwxB,GAAczjC,kBAAOsN,IAAPtN,CAAH,yGAUT,SAAS0jC,GAAT,GAA+D,IAA5Cn4B,EAA2C,EAA3CA,SAChC,OAAO,eAACk4B,GAAD,UAAcl4B,ICZhB,IAAM2D,GAAUlP,UAAOC,IAAV,qDAIP0jC,GAAgB3jC,kBAAO0kB,IAAP1kB,CAAH,oFAIf,qBAAGgG,MAAkBC,OAAOE,WAG1B+tB,GAAOl0B,UAAO0xB,KAAV,sUCNV,SAASkS,GAAT,GAcH,IAAD,gBAbDC,EAaC,EAbDA,YACAC,EAYC,EAZDA,MACA/mB,EAWC,EAXDA,WACAgnB,EAUC,EAVDA,cACAvO,EASC,EATDA,oBACAwO,EAQC,EARDA,MASA,OACE,uCACE,gBAACviC,GAAD,WACE,gBAAC,IAAD,qBAAOsb,EAAW8Z,GAAMoN,mBAAxB,aAAO,EAA8BzgC,OAArC,gBACA,gBAAC5B,GAAD,WACE,eAAC2hB,GAAD,CAAcvG,SAAUD,EAAW8Z,GAAMoN,YAAalhC,MAAO,CAAEW,YAAa,SAC5E,eAAC,IAAD,oBAAOqgC,EAAclN,GAAMoN,mBAA3B,aAAO,EAAiClf,cAAc,WAG1D,gBAACtjB,GAAD,WACE,gBAAC,IAAD,qBAAOsb,EAAW8Z,GAAMqN,mBAAxB,aAAO,EAA8B1gC,OAArC,gBACA,gBAAC5B,GAAD,WACE,eAAC2hB,GAAD,CAAcvG,SAAUD,EAAW8Z,GAAMqN,YAAanhC,MAAO,CAAEW,YAAa,SAC5E,eAAC,IAAD,oBAAOqgC,EAAclN,GAAMqN,mBAA3B,aAAO,EAAiCnf,cAAc,WAG1D,gBAACtjB,GAAD,WACE,eAAC,IAAD,oBACA,eAAC,IAAD,gCACQsb,EAAW8Z,GAAMoN,mBADzB,aACQ,EAA8BzgC,OADtC,qBACkDsgC,QADlD,IACkDA,OADlD,EACkDA,EAAO/e,cAAc,GADvE,sBAEIhI,EAAW8Z,GAAMqN,mBAFrB,aAEI,EAA8B1gC,aAIpC,eAAC/B,GAAD,CAAYsB,MAAO,CAAEohC,eAAgB,YAArC,SACE,eAAC,IAAD,gCACQpnB,EAAW8Z,GAAMqN,mBADzB,aACQ,EAA8B1gC,OADtC,qBACkDsgC,QADlD,IACkDA,OADlD,EACkDA,EAAO9J,SAASjV,cAAc,GADhF,sBAEIhI,EAAW8Z,GAAMoN,mBAFrB,aAEI,EAA8BzgC,YAIpC,gBAAC/B,GAAD,WACE,eAAC,IAAD,6BACA,gBAAC,IAAD,WAAOoiC,EAAc,MAAH,OAAWrO,QAAX,IAAWA,OAAX,EAAWA,EAAqBzQ,cAAc,GAAhE,UAEF,eAAC,IAAD,CAAQ/U,GAAG,OAAOrM,QAASqgC,EAA3B,SACGH,EAAc5xB,GAAgB,IAAK,wBAA0BA,GAAgB,IAAK,uBCnDpF,SAASmyB,GAAT,GAUH,IAAD,gBATDrnB,EASC,EATDA,WACA8mB,EAQC,EARDA,YACArO,EAOC,EAPDA,oBACAsO,EAMC,EANDA,MAOA,OACE,eAAC3jC,GAAD,CAAYC,IAAI,KAAhB,SACE,gBAACuB,GAAD,CAAStB,QAAQ,eAAeD,IAAI,MAApC,UACE,gBAACD,GAAD,CAAYE,QAAQ,SAApB,UACE,eAAC,IAAD,2BAAOyjC,QAAP,IAAOA,OAAP,EAAOA,EAAO/e,cAAc,UAA5B,QAAkC,MAClC,gBAAC,IAAD,CAAM7hB,SAAS,OAAO2E,MAAM,aAAaw8B,GAAI,EAA7C,oBACGtnB,EAAW8Z,GAAMqN,mBADpB,aACG,EAA8B1gC,OADjC,kBAC8CuZ,EAAW8Z,GAAMoN,mBAD/D,aAC8C,EAA8BzgC,aAG9E,gBAACrD,GAAD,CAAYE,QAAQ,SAApB,UACE,eAAC,IAAD,2BAAOyjC,QAAP,IAAOA,GAAP,UAAOA,EAAO9J,gBAAd,aAAO,EAAiBjV,cAAc,UAAtC,QAA4C,MAC5C,gBAAC,IAAD,CAAM7hB,SAAS,OAAO2E,MAAM,aAAaw8B,GAAI,EAA7C,oBACGtnB,EAAW8Z,GAAMoN,mBADpB,aACG,EAA8BzgC,OADjC,kBAC8CuZ,EAAW8Z,GAAMqN,mBAD/D,aAC8C,EAA8B1gC,aAG9E,gBAACrD,GAAD,CAAYE,QAAQ,SAApB,UACE,gBAAC,IAAD,WACGwjC,GAAeC,EACZ,MADH,WAEuB,OAAnBtO,QAAmB,IAAnBA,OAAA,EAAAA,EAAqBqE,SAAS/7B,KAAY,QAA1C,OAAoD03B,QAApD,IAAoDA,OAApD,EAAoDA,EAAqBC,QAAQ,UAFrF,QAE4F,IAH/F,OAMA,eAAC,IAAD,CAAMvyB,SAAS,OAAO2E,MAAM,aAAaw8B,GAAI,EAA7C,mCCHK,SAASC,GAAT,GAK0D,IAAD,0BAJtErlB,MACE/lB,OAAUqrC,EAG0D,EAH1DA,YAAaC,EAG6C,EAH7CA,YAEzBC,EACsE,EADtEA,QAEA,EAAsC/lC,KAA9B7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QAAS0O,EAA1B,EAA0BA,QACpB0wB,EAAYva,GAAYgpB,GACxBxO,EAAYxa,GAAYipB,GACxBvyB,EAAkBC,KAElBwyB,EAAoBhxB,QACxBhd,IACIo/B,GAAahS,YAAegS,EAAW14B,IAAK1G,KAC3Cq/B,GAAajS,YAAeiS,EAAW34B,IAAK1G,MAE7CiuC,EAAapsB,KAGnB,EAA0DkoB,KAAlD/C,EAAR,EAAQA,iBAAkBC,EAA1B,EAA0BA,WAAYiH,EAAtC,EAAsCA,gBACtC,EXtCK,SACL9O,EACAC,GAaC,IAAD,QAgGIh9B,EAKiC,EAIqC,EAxG1E,EAA6B2F,KAArB7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QAEjB,EAA0D+pC,KAAlD/C,EAAR,EAAQA,iBAAkBC,EAA1B,EAA0BA,WAAYiH,EAAtC,EAAsCA,gBAEhCC,EAAiBnH,IAAqB7G,GAAMoN,WAAapN,GAAMqN,WAAarN,GAAMoN,WAGlFlnB,EAA8C1a,mBAClD,2CACGw0B,GAAMoN,WADT,OACsBnO,QADtB,IACsBA,SAAapsB,GADnC,cAEGmtB,GAAMqN,WAFT,OAEsBnO,QAFtB,IAEsBA,SAAarsB,GAFnC,IAIA,CAACosB,EAAWC,IAId,EAA0BS,GAAQzZ,EAAW8Z,GAAMoN,YAAalnB,EAAW8Z,GAAMqN,aAAjF,mBAAOY,EAAP,KAAkB1rB,EAAlB,KACMga,EAAcD,GAAc,OAAC/Z,QAAD,IAACA,OAAD,EAACA,EAAM0b,gBAEnC+O,EACJiB,IAAcpP,GAAUS,YAAcziB,QAAQ0f,GAAep1B,IAAK+mC,MAAM3R,EAAYnuB,IAAKu7B,KAGrFpkB,EAAWU,GAAmB,OAACjiB,QAAD,IAACA,SAAW6O,EAAW,CACzDqT,EAAW8Z,GAAMoN,YACjBlnB,EAAW8Z,GAAMqN,cAEbhF,GAAuD,mBAC1DrI,GAAMoN,WAAa7nB,EAAS,IAD8B,cAE1Dya,GAAMqN,WAAa9nB,EAAS,IAF8B,GAMvD4oB,EAAgD9H,GAAeS,EAAY5gB,EAAW2gB,IACtFuH,EAA8C5iC,mBAAQ,WAC1D,GAAIwhC,EACF,OAAIe,GAAmB7nB,EAAW8nB,GACzB3H,GAAe0H,EAAiB7nB,EAAW8nB,SAEpD,EAEF,GAAIG,EAAJ,CAEE,IAAME,EAA2B5R,GAAsB0R,EAAmBtuC,GAC1E,EAAyB,CAAC28B,GAAgByC,EAAWp/B,GAAU28B,GAAgB0C,EAAWr/B,IAAnF8iB,EAAP,KAAeC,EAAf,KACA,GAAID,GAAUC,GAAUyrB,GAA4B9rB,EAAM,CACxD,IAAM+rB,EAAoBN,IAAmBhO,GAAMqN,WAAanO,EAAYD,EACtEsP,EACJP,IAAmBhO,GAAMqN,WACrB9qB,EAAKisB,QAAQ7rB,GAAQ8rB,MAAMJ,GAC3B9rB,EAAKisB,QAAQ5rB,GAAQ6rB,MAAMJ,GACjC,OAAOC,IAAsBxpB,IAAQK,IAAeC,MAAMmpB,EAAqBngC,KAAOmgC,MAKzF,CAACvB,EAAae,EAAiB7nB,EAAY8nB,EAAgBG,EAAmBlP,EAAWp/B,EAASq/B,EAAW3c,IAE1G2qB,GAA+D,mBAClElN,GAAMoN,WAAavG,IAAqB7G,GAAMoN,WAAae,EAAoBC,GADb,cAElEpO,GAAMqN,WAAaxG,IAAqB7G,GAAMoN,WAAagB,EAAkBD,GAFX,GAK/DlB,EAAQzhC,mBAAQ,WACpB,GAAIwhC,EAAa,CACf,IAA4B0B,EAAyDxB,EAA5ElN,GAAMoN,YAAkDuB,EAAoBzB,EAAvClN,GAAMqN,YACpD,OAAIqB,GAAmBC,EACd,IAAIC,IAAMF,EAAgBvoB,SAAUwoB,EAAgBxoB,SAAUuoB,EAAgBtgC,IAAKugC,EAAgBvgC,UAE5G,EAEF,IAAMygC,EAAmBrS,GAAgByC,EAAWp/B,GACpD,OAAO0iB,GAAQssB,EAAmBtsB,EAAKisB,QAAQK,QAAoBh8B,IAClE,CAAChT,EAASo/B,EAAW+N,EAAazqB,EAAM2qB,IAGrC4B,EAAkBtjC,mBAAQ,WAC9B,IAA4BkjC,EAAyDxB,EAA5ElN,GAAMoN,YAAkDuB,EAAoBzB,EAAvClN,GAAMqN,YACpD,EAAqC,CACnC5Q,GAAsBiS,EAAiB7uC,GACvC48B,GAAsBkS,EAAiB9uC,IAFlCkvC,EAAP,KAAqBC,EAArB,KAIA,GAAIzsB,GAAQga,GAAewS,GAAgBC,EACzC,OAAOzsB,EAAK0sB,mBAAmB1S,EAAawS,EAAcC,KAG3D,CAAC9B,EAAertC,EAAS0iB,EAAMga,IAE5BoC,EAAsBnzB,mBAAQ,WAClC,GAAIsjC,GAAmBvS,EACrB,OAAO,IAAIr1B,IAAQ4nC,EAAgB1gC,IAAKmuB,EAAYxuB,IAAI+gC,GAAiB1gC,OAG1E,CAAC0gC,EAAiBvS,IAGhBv4B,IACH9B,EAAQ,kBAGN+rC,IAAcpP,GAAUQ,UAC1Bn9B,EAAK,UAAGA,SAAH,QAAYkZ,GAAgB,IAAK,iBAGnC8xB,EAAclN,GAAMoN,aAAgBF,EAAclN,GAAMqN,cAC3DnrC,EAAK,UAAGA,SAAH,QAAYkZ,GAAgB,GAAI,oBAGvC,IAEwF,EAIA,EAN5DszB,EAAyDxB,EAA5ElN,GAAMoN,YAAkDuB,EAAoBzB,EAAvClN,GAAMqN,YAUpD,OARIqB,IAAe,OAAIrG,QAAJ,IAAIA,GAAJ,UAAIA,EAAmBrI,GAAMoN,mBAA7B,aAAI,EAAsCpK,SAAS0L,MACpExsC,EAAK,iCAAmBgkB,EAAW8Z,GAAMoN,mBAApC,aAAmB,EAA8BzgC,OAAjD,aAGHgiC,IAAe,OAAItG,QAAJ,IAAIA,GAAJ,UAAIA,EAAmBrI,GAAMqN,mBAA7B,aAAI,EAAsCrK,SAAS2L,MACpEzsC,EAAK,iCAAmBgkB,EAAW8Z,GAAMqN,mBAApC,aAAmB,EAA8B1gC,OAAjD,aAGA,CACLqhC,iBACA9nB,aACA3D,OACA0rB,YACA5F,mBACA6E,gBACAD,QACAD,cACA8B,kBACAnQ,sBACAz8B,SW/FEgtC,CAAkB,OAACjQ,QAAD,IAACA,SAAapsB,EAAd,OAAyBqsB,QAAzB,IAAyBA,SAAarsB,GAX1Dm7B,EADF,EACEA,eACA9nB,EAFF,EAEEA,WACA3D,EAHF,EAGEA,KACA0rB,EAJF,EAIEA,UACA5F,EALF,EAKEA,iBACA6E,EANF,EAMEA,cACAD,EAPF,EAOEA,MACAD,EARF,EAQEA,YACA8B,EATF,EASEA,gBACAnQ,EAVF,EAUEA,oBACAz8B,EAXF,EAWEA,MAEF,EXkGK,SACL8qC,GAKA,IAAMlkC,EAAWC,cAejB,MAAO,CACLomC,cAdoBnmC,uBACpB,SAAC89B,GACCh+B,EAASq3B,GAAU,CAAEuJ,MAAO1J,GAAMoN,WAAYtG,aAAYkG,aAA6B,IAAhBA,OAEzE,CAAClkC,EAAUkkC,IAWXoC,cAToBpmC,uBACpB,SAAC89B,GACCh+B,EAASq3B,GAAU,CAAEuJ,MAAO1J,GAAMqN,WAAYvG,aAAYkG,aAA6B,IAAhBA,OAEzE,CAAClkC,EAAUkkC,KWpH4BqC,CAAsBrC,GAAvDmC,EAAR,EAAQA,cAAeC,GAAvB,EAAuBA,cAEjBE,IAAWptC,EAGjB,GAAsCiT,oBAAkB,GAAxD,qBAAOo6B,GAAP,MAAoBC,GAApB,MACA,GAA0Cr6B,oBAAkB,GAA5D,qBAAOkE,GAAP,MAAsBo2B,GAAtB,MAGA,GAAmBztB,KAAZE,GAAP,qBACA,GAA0BL,KAAnBygB,GAAP,qBACA,GAA4BntB,mBAAiB,IAA7C,qBAAOu6B,GAAP,MAAeC,GAAf,MAGMC,IAAgB,mBACnB/I,EAAmBC,GADA,cAEnBkH,EAAiBhB,EAAce,EAAH,oBAAqBb,EAAcc,UAAnC,aAAqB,EAA+B9f,cAAc,UAAlE,QAAwE,IAFjF,GAMhB2hB,GAAiD,CAAC7P,GAAMoN,WAAYpN,GAAMqN,YAAYzrC,QAC1F,SAACkC,EAAa4lC,GACZ,OAAO,2BACF5lC,GADL,kBAEG4lC,EAAQI,GAAezB,EAAiBqB,QAG7C,IAGIoG,GAAmD,CAAC9P,GAAMoN,WAAYpN,GAAMqN,YAAYzrC,QAC5F,SAACkC,EAAa4lC,GAAW,IAAD,IACtB,OAAO,2BACF5lC,GADL,kBAEG4lC,EAFH,UAEWmG,GAAWnG,UAFtB,aAEW,EAAmBpY,QAAnB,UAA2B4b,EAAcxD,UAAzC,QAAmD,SAGhE,IAIF,GAAsCrG,GAAmB6J,EAAclN,GAAMoN,YAAa1nC,GAA1F,qBAAOqqC,GAAP,MAAkBC,GAAlB,MACA,GAAsC3M,GAAmB6J,EAAclN,GAAMqN,YAAa3nC,GAA1F,qBAAOuqC,GAAP,MAAkBC,GAAlB,MAEM5P,GAAiBI,KAxE+C,SA0EvDyM,KA1EuD,8EA0EtE,4DAAA5sC,EAAA,yDACOV,GAAY0O,GAAYvK,EAD/B,oDAEQmsC,EAASthC,GAAkBhP,EAAS0O,EAASvK,GAEvBosC,EAAqDlD,EAAxElN,GAAMoN,YAAgDiD,EAAkBnD,EAArClN,GAAMqN,YAC7C+C,GAAkBC,GAAkBpR,GAAcC,EALzD,2EAUKc,GAAMoN,WAAap/B,GAAwBoiC,EAAepD,EAAc,EAAI1K,IAAiB,IAVlG,cAWKtC,GAAMqN,WAAar/B,GAAwBqiC,EAAerD,EAAc,EAAI1K,IAAiB,IAF1FgO,EATR,EAcQC,EAAkB9N,KAAK+N,KAAKxP,KAAKyP,MAAQ,KAAQvuB,GAMnD+c,IAAcna,KAASoa,IAAcpa,KACjC4rB,EAAcxR,IAAcpa,IAClC6rB,EAAWR,EAAOhM,YAAYyM,gBAC9BjwC,EAASwvC,EAAOS,gBAChBC,EAAO,qBACLrU,GAAgBkU,EAAczR,EAAYC,EAAWr/B,UADhD,aACL,EAA+D6M,eAD1D,QACqE,IACzEgkC,EAAcN,EAAgBC,GAAejiC,IAAI3L,WAClD6tC,EAAWI,EAAc1Q,GAAMoN,WAAapN,GAAMqN,YAAY5qC,WAC9D6tC,EAAWI,EAAc1Q,GAAMqN,WAAarN,GAAMoN,YAAY3qC,WAC9DuB,EACAusC,GAEFvjC,EAAQa,KAAUC,MAAM4iC,EAAcL,EAAgBD,GAAehiC,IAAI3L,cAEzEkuC,EAAWR,EAAOhM,YAAY2M,aAC9BnwC,EAASwvC,EAAOW,aAChBD,EAAO,qBACLrU,GAAgByC,EAAWp/B,UADtB,aACL,EAAqC6M,eADhC,QAC2C,GAD3C,oBAEL8vB,GAAgB0C,EAAWr/B,UAFtB,aAEL,EAAqC6M,eAFhC,QAE2C,GAChD0jC,EAAchiC,IAAI3L,WAClB4tC,EAAcjiC,IAAI3L,WAClB6tC,EAAWtQ,GAAMoN,YAAY3qC,WAC7B6tC,EAAWtQ,GAAMqN,YAAY5qC,WAC7BuB,EACAusC,GAEFvjC,EAAQ,MAGVyiC,IAAiB,GAjDnB,UAmDQkB,EAAQ,WAAR,cAAYE,GAAZ,QAAkB7jC,EAAQ,CAAEA,SAAU,MACzC1K,MAAK,SAACyuC,GAAD,OACJpwC,EAAM,WAAN,cAAUkwC,GAAV,mCACM7jC,EAAQ,CAAEA,SAAU,IAD1B,IAEEs3B,SAAU32B,GAAmBojC,QAC5BzuC,MAAK,SAAClB,GAAc,IAAD,QACpBquC,IAAiB,GAEjBnP,GAAel/B,EAAU,CACvBwP,QAAQ,OAAD,iBAASs8B,EAAclN,GAAMoN,mBAA7B,aAAS,EAAiClf,cAAc,GAAxD,sBACLhI,EAAW8Z,GAAMoN,mBADZ,aACL,EAA8BzgC,OADzB,0BAECugC,EAAclN,GAAMqN,mBAFrB,aAEC,EAAiCnf,cAAc,GAFhD,sBAEsDhI,EAAW8Z,GAAMqN,mBAFvE,aAEsD,EAA8B1gC,UAG7FgjC,GAAUvuC,EAASsP,YAGtBlO,OAAM,SAAC0T,GACNu5B,IAAiB,GAED,QAAX,OAADv5B,QAAC,IAADA,OAAA,EAAAA,EAAGzW,OACLe,QAAQ0B,MAAMgU,MAxEtB,6CA1EsE,sBAuJtE,IAAM86B,GAAc,WAAO,IAAD,QACxB,OAAOhE,EACL,eAAC1jC,GAAD,CAAYC,IAAI,OAAhB,SACE,eAACmN,GAAD,CAAWyC,GAAG,OAAOxO,aAAa,OAAlC,SACE,gBAACE,GAAD,WACE,eAAC,IAAD,CAAWwB,SAAS,OAAO4kC,GAAG,MAA9B,6BACM/qB,EAAW8Z,GAAMoN,mBADvB,aACM,EAA8BzgC,OADpC,sBAC8CuZ,EAAW8Z,GAAMqN,mBAD/D,aAC8C,EAA8B1gC,UAE5E,eAAC4sB,GAAD,CACEC,UAAWtT,EAAW8Z,GAAMoN,YAC5B3T,UAAWvT,EAAW8Z,GAAMqN,YAC5Bp8B,KAAM,YAMd,gBAAC3H,GAAD,CAAYC,IAAI,OAAhB,UACE,gBAACsB,GAAD,CAASqB,MAAO,CAAEwN,UAAW,QAA7B,UACE,eAAC,IAAD,CAAWrN,SAAS,OAAO4kC,GAAG,MAA9B,gBACGnC,QADH,IACGA,OADH,EACGA,EAAiB5gB,cAAc,KAElC,eAACqL,GAAD,CACEC,UAAWtT,EAAW8Z,GAAMoN,YAC5B3T,UAAWvT,EAAW8Z,GAAMqN,YAC5Bp8B,KAAM,QAGV,eAAC,GAAD,UACE,eAAC,IAAD,CAAW5E,SAAS,OAApB,6BACM6Z,EAAW8Z,GAAMoN,mBADvB,aACM,EAA8BzgC,OADpC,sBAC8CuZ,EAAW8Z,GAAMqN,mBAD/D,aAC8C,EAA8B1gC,OAD5E,oBAIF,eAAC,IAAD,CAAWukC,OAAK,EAACv3B,UAAU,OAAOlP,QAAQ,aAAayB,MAAO,CAAEilC,UAAW,UAA3E,0EAEI7O,GAAkB,IAFtB,yCASA8O,GAAc,WAClB,OACE,eAACrE,GAAD,CACEE,MAAOA,EACP/mB,WAAYA,EACZgnB,cAAeA,EACfF,YAAaA,EACbG,MAAOA,GACPxO,oBAAqBA,KAKrB5lB,GAAW,8BAAgBm0B,EAAclN,GAAMoN,mBAApC,aAAgB,EAAiClf,cAAc,GAA/D,sBACfhI,EAAW8Z,GAAMoN,mBADF,aACf,EAA8BzgC,OADf,0BAETugC,EAAclN,GAAMqN,mBAFX,aAET,EAAiCnf,cAAc,GAFtC,sBAE4ChI,EAAW8Z,GAAMqN,mBAF7D,aAE4C,EAA8B1gC,QAErF0kC,GAAwBroC,uBAC5B,SAACsoC,GACC,IAAMC,EAAiB5sB,GAAW2sB,GAC9BC,IAAmB5D,EACrBC,EAAQhrC,KAAR,eAAqB+qC,EAArB,YAAoCD,IAEpCE,EAAQhrC,KAAR,eAAqB2uC,EAArB,YAAuC5D,MAG3C,CAACA,EAAaC,EAASF,IAEnB8D,GAAwBxoC,uBAC5B,SAACyoC,GACC,IAAMC,EAAiB/sB,GAAW8sB,GAC9B/D,IAAgBgE,EACd/D,EACFC,EAAQhrC,KAAR,eAAqB+qC,EAArB,YAAoC+D,IAEpC9D,EAAQhrC,KAAR,eAAqB8uC,IAGvB9D,EAAQhrC,KAAR,eAAqB8qC,GAAe,MAApC,YAA6CgE,MAGjD,CAAChE,EAAaE,EAASD,IAGnBgE,GAA4B3oC,uBAAY,WAC5CwmC,IAAe,GAEXE,IACFP,EAAc,IAEhBQ,GAAU,MACT,CAACR,EAAeO,KAEnB,OACE,uCACE,eAACkC,GAAD,CAASp2B,YAAa,IACtB,gBAACqxB,GAAD,WACE,eAACxQ,GAAD,CAAevE,QAAM,IACrB,gBAAC,GAAD,WACE,eAAC,GAAD,CACEzgB,OAAQk4B,GACR53B,UAAWg6B,GACXt4B,cAAeA,GACf3I,KAAMg/B,GACN19B,QAAS,kBACP,eAAC,GAAD,CACEvF,MACEugC,EACI5xB,EAAgB,KAAM,2BACtBA,EAAgB,KAAM,oBAE5BzD,UAAWg6B,GACXn4B,WAAYw3B,GACZz3B,cAAe63B,MAGnBr4B,YAAaA,KAEf,eAAC,IAAD,UACE,gBAACzP,GAAD,CAAYC,IAAI,OAAhB,UACGyjC,GACC,eAAC3jC,GAAD,UACE,eAAC,GAAD,UACE,gBAACC,GAAD,CAAYC,IAAI,OAAhB,UACE,eAAC,IAAD,UAAY6R,EAAgB,KAAM,2CAClC,eAAC,IAAD,UACGA,EAAgB,KAAM,kEAEzB,eAAC,IAAD,UACGA,EAAgB,KAAM,qEAMjC,eAACggB,GAAD,CACEpuB,MAAO4iC,GAAiB5P,GAAMoN,YAC9BrT,YAAaoV,EACb9T,MAAO,WAAO,IAAD,IACX8T,EAAa,oBAACU,GAAW7P,GAAMoN,mBAAlB,aAAC,EAA8Bnf,iBAA/B,QAA4C,KAE3DsB,iBAAkB8hB,GAClB/V,eAAgBwU,GAAa9P,GAAMoN,YACnCjnB,SAAUD,EAAW8Z,GAAMoN,YAC3BrrC,GAAG,6BACH2vB,iBAAiB,IAEnB,eAACroB,GAAD,UACE,eAAC,IAAD,CAAS2H,MAAM,iBAEjB,eAACoqB,GAAD,CACEpuB,MAAO4iC,GAAiB5P,GAAMqN,YAC9BtT,YAAaqV,GACb7f,iBAAkBiiB,GAClBnW,MAAO,WAAO,IAAD,IACX+T,GAAa,oBAACS,GAAW7P,GAAMqN,mBAAlB,aAAC,EAA8Bpf,iBAA/B,QAA4C,KAE3DqN,eAAgBwU,GAAa9P,GAAMqN,YACnClnB,SAAUD,EAAW8Z,GAAMqN,YAC3BtrC,GAAG,6BACH2vB,iBAAiB,IAElBxL,EAAW8Z,GAAMoN,aAAelnB,EAAW8Z,GAAMqN,aAAeY,IAAcpP,GAAUQ,SACvF,iCACE,eAAC,IAAD,CACEnzB,MAAO,CAAEqyB,cAAe,YAAaC,WAAY,KACjDxtB,MAAM,aACN3E,SAAS,OACTwlC,GAAG,MAJL,SAMG7E,EACG5xB,EAAgB,KAAM,iCACtBA,EAAgB,KAAM,2BAE5B,eAAC,GAAD,UACE,eAACmyB,GAAD,CACErnB,WAAYA,EACZyY,oBAAqBA,EACrBqO,YAAaA,EACbC,MAAOA,SAMbjpC,EAGA,gBAACsF,GAAD,CAAYC,IAAI,KAAhB,WACIwmC,KAAc5O,GAAc4C,cAC5BgM,KAAc5O,GAAc2C,SAC5BmM,KAAc9O,GAAc4C,cAC5BkM,KAAc9O,GAAc2C,UAC5BwL,IACE,gBAAC1kC,GAAD,WACGmlC,KAAc5O,GAAc0C,UAC3B,eAAC,IAAD,CACE/2B,QAASkjC,GACT9gC,SAAU6gC,KAAc5O,GAAc2C,QACtC53B,MAAO,CAAEuG,MAAOw9B,KAAc9O,GAAc0C,SAAW,MAAQ,QAHjE,SAKGkM,KAAc5O,GAAc2C,QAC3B,gBAAC,GAAD,kCAAiB5d,EAAW8Z,GAAMoN,mBAAlC,aAAiB,EAA8BzgC,UADhD,4BAGYuZ,EAAW8Z,GAAMoN,mBAH7B,aAGY,EAA8BzgC,UAI9CsjC,KAAc9O,GAAc0C,UAC3B,eAAC,IAAD,CACE/2B,QAASojC,GACThhC,SAAU+gC,KAAc9O,GAAc2C,QACtC53B,MAAO,CAAEuG,MAAOs9B,KAAc5O,GAAc0C,SAAW,MAAQ,QAHjE,SAKGoM,KAAc9O,GAAc2C,QAC3B,gBAAC,GAAD,kCAAiB5d,EAAW8Z,GAAMqN,mBAAlC,aAAiB,EAA8B1gC,UADhD,4BAGYuZ,EAAW8Z,GAAMqN,mBAH7B,aAGY,EAA8B1gC,aAMrD,eAAC,IAAD,CACEG,QAAS,WACHghC,EACFX,KAEAqC,IAAe,IAGnBtgC,UAAWogC,IAAWS,KAAc5O,GAAc0C,UAAYoM,KAAc9O,GAAc0C,SAC1FjrB,SACG02B,IAAapC,EAAclN,GAAMoN,aAAiBF,EAAclN,GAAMqN,YACnE,SACA,UAEN56B,MAAM,OAdR,gBAgBGvQ,QAhBH,IAgBGA,IAAS,cArDd,eAAC4vC,GAAD,CAAqBr/B,MAAM,oBA6DpC8P,IAASyqB,GAAeiB,IAAcpP,GAAUQ,QAC/C,eAAC/1B,GAAD,CAAY4C,MAAO,CAAEurB,SAAU,QAAS/d,UAAW,QAAnD,SACE,eAACkkB,GAAD,CAAqBC,cAAegQ,EAAmBtrB,KAAMA,MAE7D,QC3bV,IAAMwvB,GAAqB,4CACpB,SAASC,GAAqC95B,GACnD,IAKMkQ,EADFlQ,EAHFkQ,MACE/lB,OAAUqrC,YAGYtlB,MAAM2pB,IAChC,cAAI3pB,QAAJ,IAAIA,OAAJ,EAAIA,EAAO5kB,QACF,eAAC,IAAD,CAAUkP,GAAE,eAAU0V,EAAM,GAAhB,YAAsBA,EAAM,MAG1C,eAACqlB,GAAD,eAAkBv1B,IAGpB,SAAS+5B,GAA0B/5B,GACxC,MAIIA,EAHFkQ,MACE/lB,OAAUqrC,EAFd,EAEcA,YAAaC,EAF3B,EAE2BA,YAG3B,OAAID,EAAYplB,gBAAkBqlB,EAAYrlB,cACrC,eAAC,IAAD,CAAU5V,GAAE,eAAUg7B,KAExB,eAACD,GAAD,eAAkBv1B,ICzB3B,IAAM65B,GAAqB,4CAEpB,SAASG,GAAT,GAIsC,IAF/BxmC,EAE8B,EAH1C0c,MACE/lB,OAAUqJ,OAGZ,IAAKqmC,GAAmBx0B,KAAK7R,GAC3B,OAAO,eAAC,IAAD,CAAUgH,GAAG,UAEtB,MAA+BhH,EAAOqP,MAAM,KAA5C,mBAAOye,EAAP,KAAkBC,EAAlB,KAEA,OAAO,eAAC,IAAD,CAAU/mB,GAAE,kBAAa8mB,EAAb,YAA0BC,KAGhCyY,I,eCEVC,GCVCC,GAASjpC,UAAOC,IAAV,iDAINipC,GAAUlpC,UAAOC,IAAV,gPAKTgpC,GAIAA,IAIA,qBAAGjjC,MAAkBqC,aAAaC,MAKhC6gC,GAAmB,CACvB,CAAE/W,MAAO,OAAQvuB,MAAO,IACxB,CAAEuuB,MAAO,OAAQvuB,MAAO,IACxB,CAAEuuB,MAAO,KAAMvuB,MAAO,IA4FTulC,GArFmB,SAAC,GAA8D,IAA5DC,EAA2D,EAA3DA,gBACnC,EAA0D3wB,KAA1D,mBAAOC,EAAP,KAA8B2wB,EAA9B,KACA,EAA0Bt9B,mBAAS2M,EAAwB,KAA3D,mBAAO9U,EAAP,KAAc0lC,EAAd,KACA,EAA0Bv9B,mBAAwB,MAAlD,mBAAOjT,EAAP,KAAcywC,EAAd,KA8BA,OAvBA1gC,qBAAU,WACR,IACE,IAAM2gC,EAAmB,IAAR5lC,GACZrJ,OAAOqlC,MAAM4J,IAAaA,EAAW,GAAKA,EAjDhC,KAkDbH,EAAyBG,GACzBD,EAAS,OAETA,EAASH,EAAgB,KAAM,sCAEjC,SACAG,EAASH,EAAgB,KAAM,yCAEhC,CAACxlC,EAAO2lC,EAAUF,EAA0BD,IAG/CvgC,qBAAU,WACJ6P,EA7DmB,GA8DrB6wB,EAASH,EAAgB,KAAM,8BACtB1wB,EA9Da,KA+DtB6wB,EAASH,EAAgB,KAAM,uCAEhC,CAAC1wB,EAAuB6wB,EAAUH,IAGnC,gBAAC,IAAD,CAAKX,GAAG,OAAR,UACE,gBAAC,IAAD,CAAMgB,WAAW,SAAShB,GAAG,MAA7B,UACE,eAAC,IAAD,CAAMxa,MAAI,EAAV,SAAYmb,EAAgB,GAAI,wBAChC,eAACpmB,GAAD,CACE1R,KAAM83B,EACJ,IACA,oGAIN,gBAACH,GAAD,WACE,eAAC,IAAD,CAAMR,GAAI,CAAC,MAAO,MAAO,GAAIZ,GAAI,CAAC,EAAG,EAAG,OAAxC,SACGqB,GAAiBrxC,KAAI,YAAwC,IAArCs6B,EAAoC,EAApCA,MAAcuX,EAAsB,EAA7B9lC,MAG9B,OACE,eAAColC,GAAD,UACE,eAAC,IAAD,CAAQx5B,QAAS5L,IAAU8lC,EAAkB,UAAY,WAAYhmC,QAJrD,kBAAM4lC,EAASI,IAI/B,SACGvX,KAFQuX,QAQnB,gBAAC,IAAD,CAAMD,WAAW,SAAjB,UACE,eAACT,GAAD,UACE,eAAC,IAAD,CACE9kC,KAAK,SACLmO,MAAM,KACNs3B,KAAM,GACNC,IAAK,GACL7f,YAAY,KACZnmB,MAAOA,EACPomB,SA/DS,SAAC6f,GACpB,IAAeC,EAAeD,EAAItjC,OAA1B3C,MACR0lC,EAASzJ,WAAWiK,KA8DVC,UAAqB,OAAVjxC,MAGf,eAACkwC,GAAD,UACE,eAAC,IAAD,CAAM/lC,SAAS,OAAf,uBAILnK,GACC,eAAC,IAAD,CAAMiX,GAAG,MAAMnI,MAAM,UAArB,SACG9O,QClHL89B,GAAQ72B,UAAOC,IAAV,yHAIHywB,KAyDOuZ,GAhDoB,SAAC,GAA+D,IAA7DZ,EAA4D,EAA5DA,gBACpC,EAAgCxwB,KAAhC,mBAAOE,EAAP,KAAiBmxB,EAAjB,KACA,EAA0Bl+B,mBAAS+M,EAAW,IAA9C,mBAAOlV,EAAP,KAAc0lC,EAAd,KACA,EAA0Bv9B,mBAAwB,MAAlD,mBAAOjT,EAAP,KAAcywC,EAAd,KAsBA,OAdA1gC,qBAAU,WACR,IACE,IAAM2gC,EAAmB,GAAR5lC,GACZrJ,OAAOqlC,MAAM4J,IAAaA,EAAW,GACxCS,EAAYT,GACZD,EAAS,OAETA,EAASH,EAAgB,KAAM,2BAEjC,SACAG,EAASH,EAAgB,KAAM,8BAEhC,CAACxlC,EAAO2lC,EAAUU,EAAab,IAGhC,gBAAC,IAAD,CAAKX,GAAG,OAAR,UACE,gBAAC,IAAD,CAAMgB,WAAW,SAAShB,GAAG,MAA7B,UACE,eAAC,IAAD,CAAMxa,MAAI,EAAV,SAAYmb,EAAgB,GAAI,0BAChC,eAACpmB,GAAD,CACE1R,KAAM83B,EAAgB,IAAK,+EAG/B,gBAAC,GAAD,WACE,eAAC,IAAD,CAAOllC,KAAK,SAASylC,KAAK,IAAIC,IAAI,IAAIhmC,MAAOA,EAAOomB,SA7BrC,SAAC6f,GACpB,IAAeC,EAAeD,EAAItjC,OAA1B3C,MACR0lC,EAASruC,SAAS6uC,EAAY,QA4B1B,eAAC,IAAD,CAAM7mC,SAAS,OAAOoyB,GAAG,MAAzB,wBAIDv8B,GACC,eAAC,IAAD,CAAMiX,GAAG,MAAMnI,MAAM,UAArB,SACG9O,QCjDLoxC,GAAmB,kBAAM,MAWhBC,GATO,SAAC,GAA2E,IAAD,IAAxE57B,iBAAwE,MAA5D27B,GAA4D,EAA1Cd,EAA0C,EAA1CA,gBACrD,OACE,gBAAC,IAAD,CAAO/lC,MAAO+lC,EAAgB,KAAM,YAAa76B,UAAWA,EAA5D,UACE,eAAC67B,GAAD,CAA0BhB,gBAAiBA,IAC3C,eAAC,GAAD,CAA4BA,gBAAiBA,QCH7Cc,GAAmB,kBAAM,MAEzBG,GAAuB,SAAClzC,EAAuBmzC,GAAxB,OAAkDA,EAAExS,UAAY3gC,EAAE2gC,WAqEhFyS,GArDiB,SAAC,GAAqF,IAAD,IAAlFh8B,iBAAkF,MAAtE27B,GAAsE,EAApDd,EAAoD,EAApDA,gBAC/D,EAA6B3qC,KAArB7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QACX4jC,EAAkB7C,KAGlBgT,EAA2BpoC,mBAAQ,WAEvC,OADYlI,OAAO+e,OAAOohB,GACfnwB,OAAOwtB,IAAqB3hB,KAAKs0B,MAC3C,CAAChQ,IAEJ,OACE,gBAAC,IAAD,CAAOh3B,MAAO+lC,EAAgB,KAAM,uBAAwB76B,UAAWA,EAAvE,WACI3T,GACA,gBAAC,IAAD,CAAMspC,eAAe,SAASuG,cAAc,SAAShB,WAAW,SAAhE,UACE,eAAC,IAAD,CAAMhB,GAAG,MAAMxa,MAAI,EAAnB,yEAGA,eAAC,IAAD,CAAQze,QAAQ,WAAW6C,MAAM,KAAK3O,QAAS6K,EAA/C,sBAKH3T,GAAWnE,GAA+C,IAApC+zC,EAAyBpwC,QAC9C,gBAAC,IAAD,CAAM8pC,eAAe,SAASuG,cAAc,SAAShB,WAAW,SAAhE,UACE,eAAC,IAAD,CAAMhB,GAAG,MAAMxa,MAAI,EAAnB,oCAGA,eAAC,IAAD,CAAQze,QAAQ,WAAW6C,MAAM,KAAK3O,QAAS6K,EAA/C,sBAKH3T,GACCnE,GACA+zC,EAAyB3yC,KAAI,SAAC6yC,GAC5B,IAAQpjC,EAAkBojC,EAAlBpjC,KAAME,EAAYkjC,EAAZljC,QACd,EAlDW,SAACkjC,GACpB,IAAQpjC,EAAkBojC,EAAlBpjC,KAAMgzB,EAAYoQ,EAAZpQ,QAEd,OAAKhzB,EAIDA,GAA4B,KAAb,OAAPgzB,QAAO,IAAPA,OAAA,EAAAA,EAASliC,QACZ,CAAEuyC,KAAM,eAAC,IAAD,CAAqB/iC,MAAM,YAAcA,MAAO,WAG1D,CAAE+iC,KAAM,eAAC,IAAD,CAAW/iC,MAAM,YAAcA,MAAO,WAP5C,CAAE+iC,KAAM,eAAClgC,GAAD,IAAY7C,MAAO,QA8CJgjC,CAAaF,GAA7BC,EAAR,EAAQA,KAAM/iC,EAAd,EAAcA,MAEd,OACE,qCACE,gBAAC,IAAD,CAAiB6hC,WAAW,SAASvF,eAAe,gBAAgBuE,GAAG,MAAvE,UACE,eAAC,IAAD,CAAcjiC,KAAMvC,GAAexN,EAAS6Q,EAAM,eAAgBM,MAAOA,EAAzE,gBACGJ,QADH,IACGA,IAAWF,IAEbqjC,IAJQrjC,YC3DnBujC,GAAmB9qC,UAAOC,IAAV,iFACO,qBAAG+F,MAAkBC,OAAO46B,eAInDkK,GAAU/qC,UAAOC,IAAV,0CAoCE+qC,GAhCI,SAAC,GAAuD,IAArD1nC,EAAoD,EAApDA,MAAO6hB,EAA6C,EAA7CA,YAAa5Z,EAAgC,EAAhCA,SAClC0G,EAAkBC,KACxB,EAA4B+4B,YAAS,eAAC,GAAD,CAAe5B,gBAAiBp3B,KAA9Di5B,EAAP,oBACA,EAAsCD,YAAS,eAAC,GAAD,CAAyB5B,gBAAiBp3B,KAAlFk5B,EAAP,oBAEA,OACE,gBAACL,GAAD,WACE,gBAAC,IAAD,CAAMpB,WAAW,SAAjB,UACE,gBAACqB,GAAD,WACE,eAAC,IAAD,CAASrC,GAAG,MAAZ,SAAmBplC,IAClB6hB,GACC,eAAC,IAAD,CAAMtd,MAAM,aAAa3E,SAAS,OAAlC,SACGiiB,OAIP,eAAC,IAAD,CAAY1V,QAAQ,OAAO9L,QAASunC,EAAmB5nC,MAAO2O,EAAgB,KAAM,YAApF,SACE,eAAC,IAAD,CAAU3I,MAAM,OAAOzB,MAAM,mBAE/B,eAAC,IAAD,CACE4H,QAAQ,OACR9L,QAASwnC,EACT7nC,MAAO2O,EAAgB,KAAM,uBAH/B,SAKE,eAAC,IAAD,CAAa3I,MAAM,OAAOzB,MAAM,sBAGnC0D,GAAY,eAAC,IAAD,CAAMyE,GAAG,OAAT,SAAiBzE,QC3BrB,SAAS6/B,KACtB,IAAMplC,EAAQ0B,qBAAWC,gBACjB9M,EAAY6D,KAAZ7D,QACFoX,EAAkBC,KAGlBm5B,E/E4KD,WACL,IAAQ30C,EAAYgI,KAAZhI,QACF6L,EAAS+X,KAGTgxB,EAAcjpC,mBAAQ,wBAAO3L,GAAO,UAAGgH,GAAahH,UAAhB,QAAiC,KAAK,CAACA,IAG3E60C,EAAmClpC,mBACvC,kBACE3L,EACI4lC,KAAQniC,OAAOC,KAAKmI,IAAS,SAACwX,GAAkB,IAAD,EACvC5W,EAAQZ,EAAOwX,GAErB,OAEE,UAACtc,GAA6B/G,UAA9B,QAA0C,IAEvCoB,KAAI,SAACykC,GACJ,OAAIA,EAAKh5B,UAAYJ,EAAMI,QAClB,KAEF,CAACg5B,EAAMp5B,MAEfgH,QAAO,SAACid,GAAD,OAAkC,OAANA,QAG1C,KACN,CAAC7kB,EAAQ7L,IAIL80C,EAAuBlsC,aAAiD,qBAAGkZ,KAAQigB,SAEnFgT,EAA8BppC,mBAAQ,WAC1C,IAAK3L,IAAY80C,EAAsB,MAAO,GAC9C,IAAME,EAAWF,EAAqB90C,GACtC,OAAKg1C,EAEEvxC,OAAOC,KAAKsxC,GAAU5zC,KAAI,SAAC6zC,GAChC,MAAO,CAACtzB,GAAiBqzB,EAASC,GAAQtyB,QAAShB,GAAiBqzB,EAASC,GAAQryB,YAHjE,KAKrB,CAACkyB,EAAsB90C,IAEpBk1C,EAAevpC,mBAAQ,kBAAMopC,EAAUI,OAAON,GAAgBM,OAAOP,KAAc,CACvFC,EACAD,EACAG,IAGF,OAAOppC,mBAAQ,WAEb,IAAMypC,EAAQF,EAAanzC,QAA0C,SAACC,EAAD,GAA6B,IAAD,mBAApB8gB,EAAoB,KAAZC,EAAY,KACzF0P,EAAS3P,EAAO8c,YAAY7c,GAC5B3Z,EAAMqpB,EAAM,UAAM3P,EAAOjW,QAAb,YAAwBkW,EAAOlW,SAA/B,UAA8CkW,EAAOlW,QAArD,YAAgEiW,EAAOjW,SACzF,OAAI7K,EAAKoH,KACTpH,EAAKoH,GAAOqpB,EAAS,CAAC3P,EAAQC,GAAU,CAACA,EAAQD,IAD3B9gB,IAGrB,IAEH,OAAOyB,OAAOC,KAAK0xC,GAAOh0C,KAAI,SAACgI,GAAD,OAASgsC,EAAMhsC,QAC5C,CAAC8rC,I+EzOsBG,GACpBC,EAAgC3pC,mBACpC,kBAAMgpC,EAAkBvzC,KAAI,SAACyK,GAAD,MAAa,CAAEuyB,eAAgBvb,GAAmBhX,GAASA,eACvF,CAAC8oC,IAKH,EAAkDnvB,GAAoC,OACpFrhB,QADoF,IACpFA,SAAW6O,EAJWrH,mBAAQ,kBAAM2pC,EAA8Bl0C,KAAI,SAACm0C,GAAD,OAAWA,EAAMnX,oBAAiB,CACxGkX,KAEF,mBAAOE,EAAP,KAAwBC,EAAxB,KAMMC,EAA8B/pC,mBAClC,kBACE2pC,EAA8B7hC,QAAO,kBAAG2qB,EAAH,EAAGA,eAAH,iBACnCoX,EAAgBpX,EAAevxB,gBADI,aACnC,EAAyC2kB,YAAY,UAEzD,CAAC8jB,EAA+BE,IAG5BG,EAAUxW,GAASuW,EAA4Bt0C,KAAI,qBAAGyK,WACtD+pC,EACJH,IAAiC,OAAPE,QAAO,IAAPA,OAAA,EAAAA,EAAShyC,QAAS+xC,EAA4B/xC,SAAxE,OAAkFgyC,QAAlF,IAAkFA,OAAlF,EAAkFA,EAAS9vB,MAAK,SAACgwB,GAAD,OAAaA,MAEzGC,EAA0BH,EAAQv0C,KAAI,0CAAoBqS,QAAO,SAACsiC,GAAD,OAA4B/4B,QAAQ+4B,MAE3G,OACE,uCACE,eAAChE,GAAD,CAASp2B,YAAa,IACtB,gBAACqxB,GAAD,WACE,eAAC,GAAD,CACEpgC,MAAO2O,EAAgB,IAAK,aAC5BkT,YAAalT,EAAgB,KAAM,sCAFrC,SAIE,eAAC,IAAD,CAAQrZ,GAAG,mBAAmB2Z,GAAIlM,IAAMkD,GAAG,WAA3C,SACG0I,EAAgB,IAAK,qBAG1B,eAAC9R,GAAD,CAAYC,IAAI,KAAKC,QAAQ,SAA7B,SACE,eAAC,IAAD,UACE,gBAACF,GAAD,CAAYC,IAAI,OAAO2C,MAAO,CAAEuG,MAAO,QAAvC,UACE,gBAAC7H,GAAD,CAAYH,QAAQ,QAApB,UACE,eAAC,IAAD,CAAMuG,MAAO7B,EAAMC,OAAOsL,KAA1B,SAAiCU,EAAgB,IAAK,oBACtD,eAAC,GAAD,CACEV,KAAMU,EACJ,KACA,uKAKJpX,EAMEyxC,EACF,eAAC/+B,GAAD,CAAWjM,QAAQ,OAAnB,SACE,eAAC,IAAD,CAAMuG,MAAM,eAAe2I,UAAU,SAArC,SACE,eAAC0jB,GAAD,2BAGqB,OAAvBsY,QAAuB,IAAvBA,OAAA,EAAAA,EAAyBnyC,QAAS,EACpC,qCACGmyC,EAAwB10C,KAAI,SAAC20C,GAAD,OAC3B,eAAClX,GAAD,CAAsDnc,KAAMqzB,GAArCA,EAAO3X,eAAevxB,cAIjD,eAACgK,GAAD,CAAWjM,QAAQ,OAAnB,SACE,eAAC,IAAD,CAAMuG,MAAM,eAAe2I,UAAU,SAArC,SACGyB,EAAgB,IAAK,2BApB1B,eAAC1E,GAAD,CAAWjM,QAAQ,OAAnB,SACE,eAAC,IAAD,CAAMuG,MAAM,eAAe2I,UAAU,SAArC,SACGyB,EAAgB,IAAK,mDAuB5B,iCACE,gBAAC,IAAD,CAAM/O,SAAS,OAAOH,MAAO,CAAEzB,QAAS,mBAAxC,UACG2Q,EAAgB,IAAK,gCAAiC,IACvD,eAAC7L,GAAD,CAAoBxN,GAAG,mBAAmB2Q,GAAG,QAA7C,SACG0I,EAAgB,IAAK,mBAG1B,eAAC,IAAD,CAAM/O,SAAS,OAAOH,MAAO,CAAEzB,QAAS,mBAAxC,SACG2Q,EAAgB,KAAM,gGN1F1B,SAASy6B,KAAc,IAAD,EAC3B7xC,EAAY6D,KAAZ7D,QAER,EAAoCmR,oBAAkB,GAAtD,mBAAO2gC,EAAP,KAAmBC,EAAnB,KACA,EAAsC5gC,mBAAiBg9B,GAAO6D,QAA9D,mBAAOC,EAAP,KAAoBC,EAApB,KAEA,EAAkC/gC,mBAA0B2P,KAA5D,mBAAO0U,EAAP,KAAkB2c,EAAlB,KACA,EAAkChhC,mBAA0B,MAA5D,mBAAOskB,EAAP,KAAkB2c,EAAlB,KAEA,EAA0BzW,GAAO,OAACnG,QAAD,IAACA,SAAa3mB,EAAd,OAAyB4mB,QAAzB,IAAyBA,SAAa5mB,GAAvE,mBAAOo7B,EAAP,KAAkB1rB,EAAlB,KACM8zB,EzE8ID,WACL,IAAMvtC,EAAWC,cAEjB,OAAOC,uBACL,SAACuZ,GACCzZ,EAASoY,GAAkB,CAAEo1B,eAAgBh0B,GAAcC,QAE7D,CAACzZ,IyErJaytC,GAEVn7B,EAAkBC,KACxBpJ,qBAAU,WACJsQ,GACF8zB,EAAQ9zB,KAET,CAACA,EAAM8zB,IAEV,IAAMG,EACJvI,IAAcpP,GAAUS,YACxBziB,QACEoxB,IAAcpP,GAAUa,QACtBnd,GACApb,IAAK+mC,MAAM3rB,EAAKgd,SAASnxB,IAAKjH,IAAKC,OAAO,KAC1CD,IAAK+mC,MAAM3rB,EAAKid,SAASpxB,IAAKjH,IAAKC,OAAO,KAG1CqvC,EAAoC1wB,GAAe,OAAC/hB,QAAD,IAACA,SAAW6O,EAAZ,OAAuB0P,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAM0b,gBAChFyY,EAAc75B,QAAQ45B,GAAYtvC,IAAKkqB,YAAYolB,EAASroC,IAAKjH,IAAKC,OAAO,KAE7EorB,EAAuBxpB,uBAC3B,SAACmd,GACK8vB,IAAgB9D,GAAOwE,OACzBR,EAAahwB,GAEbiwB,EAAajwB,KAGjB,CAAC8vB,IAGGW,EAAsB5tC,uBAAY,WACtC+sC,GAAc,KACb,CAACA,IAEEc,EACJ,eAACngC,GAAD,CAAWjM,QAAQ,YAAnB,SACE,eAAC,IAAD,CAAMyB,MAAO,CAAEyN,UAAW,UAA1B,SACI3V,EAEEoX,EAAgB,IAAK,0CADrBA,EAAgB,KAAM,yCAMhC,OACE,uCACE,eAACw2B,GAAD,CAASp2B,YAAa,IACtB,gBAACqxB,GAAD,WACE,eAACzQ,GAAD,IACA,gBAAC,IAAD,WACE,gBAAC9yB,GAAD,CAAYC,IAAI,KAAhB,UACE,eAAC,IAAD,CACEuD,QAAS,WACPipC,GAAc,GACdG,EAAe/D,GAAOwE,SAExBG,UAAWtd,EAAY,eAAC9M,GAAD,CAAcvG,SAAUqT,EAAWttB,MAAO,CAAEW,YAAa,WAAgB,KAChGkqC,QAAS,eAAC,IAAD,CAAiBtkC,MAAM,OAAOzB,MAAM,UAC7CyB,MAAM,OAPR,SASG+mB,EAAYA,EAAU7sB,OAASyO,EAAgB,GAAI,oBAGtD,eAAC/R,GAAD,UACE,eAAC,IAAD,CAAS2H,MAAM,iBAGjB,eAAC,IAAD,CACElE,QAAS,WACPipC,GAAc,GACdG,EAAe/D,GAAO6D,SAExBc,UAAWrd,EAAY,eAAC/M,GAAD,CAAcvG,SAAUsT,EAAWvtB,MAAO,CAAEW,YAAa,WAAgB,KAChGkqC,QAAS,eAAC,IAAD,CAAiBtkC,MAAM,OAAOzB,MAAM,UAC7CyB,MAAM,OAPR,SASGgnB,EAAYA,EAAU9sB,OAASyO,EAAgB,GAAI,oBAGrDs7B,GACC,eAACrtC,GAAD,CACE6C,MAAO,CAAE8qC,aAAc,SAAUC,gBAAiB,GAAIxsC,QAAS,WAAYE,aAAc,QAD3F,SAGE,eAAC,IAAD,CAAMuB,MAAO,CAAEyN,UAAW,UAA1B,SAAuCyB,EAAgB,IAAK,mBAI/Doe,GAAaC,EACZwU,IAAcpP,GAAUa,OACtBgX,GAAen0B,EACb,eAACqb,GAAD,CAAqBrb,KAAMA,IAE3B,eAAC7L,GAAD,CAAWjM,QAAQ,YAAnB,SACE,gBAACnB,GAAD,CAAYC,IAAI,KAAKC,QAAQ,SAA7B,UACE,eAAC,IAAD,CAAM0C,MAAO,CAAEyN,UAAW,UAA1B,SACGyB,EAAgB,IAAK,qDAExB,eAAC7L,GAAD,CAAoBmD,GAAE,eAAUiS,GAAW6U,GAArB,YAAmC7U,GAAW8U,IAApE,SACE,eAAC,IAAD,CAAMvtB,MAAO,CAAEyN,UAAW,UAA1B,SAAuCyB,EAAgB,IAAK,0BAKlEo7B,EACF,eAAC9/B,GAAD,CAAWjM,QAAQ,YAAnB,SACE,gBAACnB,GAAD,CAAYC,IAAI,KAAKC,QAAQ,SAA7B,UACE,eAAC,IAAD,CAAM0C,MAAO,CAAEyN,UAAW,UAA1B,SAAuCyB,EAAgB,IAAK,oBAC5D,eAAC7L,GAAD,CAAoBmD,GAAE,eAAUiS,GAAW6U,GAArB,YAAmC7U,GAAW8U,IAApE,+BAKFwU,IAAcpP,GAAUQ,QAC1B,eAAC3oB,GAAD,CAAWjM,QAAQ,YAAnB,SACE,eAACnB,GAAD,CAAYC,IAAI,KAAKC,QAAQ,SAA7B,SACE,eAAC,IAAD,CAAM0C,MAAO,CAAEyN,UAAW,UAA1B,SAAuCyB,EAAgB,IAAK,uBAG9D6yB,IAAcpP,GAAUO,QAC1B,eAAC1oB,GAAD,CAAWjM,QAAQ,YAAnB,SACE,eAACnB,GAAD,CAAYC,IAAI,KAAKC,QAAQ,SAA7B,SACE,gBAAC,IAAD,CAAM0C,MAAO,CAAEyN,UAAW,UAA1B,oBAEE,eAAC,GAAD,WAIJ,KAEJk9B,KAIJ,eAACje,GAAD,CACEvhB,OAAQy+B,EACRvmB,iBAAkBiD,EAClB7a,UAAWi/B,EACXllB,iBAAe,EACf1E,iBAAgB,UAAGipB,IAAgB9D,GAAOwE,OAASld,EAAYD,SAA/C,aAA6D3mB,c,SA3JpFs/B,O,mBAAAA,I,oBAAAA,Q,YOlBOnS,G,4BCCNkX,GAAmB/tC,UAAOokB,MAAV,g9DAgBR,qBAAGtc,QACJ,qBAAGA,QAKH,qBAAG9B,MAAkBC,OAAOmC,oBAU3B,qBAAGN,QACJ,qBAAGA,QAIH,qBAAG9B,MAAkBC,OAAOmC,oBAU3B,qBAAGN,QACJ,qBAAGA,QAGH,qBAAG9B,MAAkBC,OAAOmC,oBAYjC,qBAAGpC,MAAkBC,OAAOoF,eAC5B,qBAAGrF,MAAkBC,OAAOuC,YAQ5B,qBAAGxC,MAAkBC,OAAOoF,eAC5B,qBAAGrF,MAAkBC,OAAOuC,YAUlB,qBAAGxC,MAAkBC,OAAOoF,eAI5B,qBAAGrF,MAAkBC,OAAOoF,eAG5B,qBAAGrF,MAAkBC,OAAOuC,YAa/B,SAASwlC,GAAT,GAAiG,IAA/EnqC,EAA8E,EAA9EA,MAAOomB,EAAuE,EAAvEA,SAAuE,IAA7D4f,WAA6D,MAAvD,EAAuD,MAApDD,YAAoD,MAA7C,EAA6C,MAA1CqE,WAA0C,MAApC,IAAoC,MAA/BnmC,YAA+B,MAAxB,GAAwB,EACvGomC,EAAiBruC,uBACrB,SAAAkN,GACEkd,EAAS/uB,SAAS6R,EAAEvG,OAAO3C,UAE7B,CAAComB,IAGH,OACE,eAAC8jB,GAAD,CACEjmC,KAAMA,EACN3D,KAAK,QACLN,MAAOA,EACPd,MAAO,CAAEuG,MAAO,MAAO4Z,WAAY,GAAIxf,YAAa,GAAIpC,QAAS,UACjE2oB,SAAUikB,EACVC,kBAAgB,eAChBvE,KAAMA,EACNC,IAAKA,EACLoE,IAAKA,K,SD1HCpX,K,sCAAAA,E,sBAAAA,E,wBAAAA,E,yBAAAA,Q,KAOL,I,MAAMG,GAAYh4B,aAAmD,sBEIrE,SAASovC,KACd,OAAO9uC,aAAwC,SAAAC,GAAK,OAAIA,EAAM8uC,QC6BhE,I,YAAMC,GAActuC,UAAOC,IAAV,kGACK,qBAAG+F,MAAkBC,OAAO46B,eAK5C0N,GAAOvuC,UAAOC,IAAV,6EAKK,SAASuuC,GAAT,GAKwD,IAAD,0BjFFhB30B,EiFFpD4qB,EAIoE,EAJpEA,QAIoE,IAHpExlB,MACE/lB,OAAUqrC,EAEwD,EAFxDA,YAAaC,EAE2C,EAF3CA,YAGlB1O,EAAP,UAAgCva,GAAYgpB,UAA5C,aAA4D76B,EAA1CqsB,EAAlB,UAAuExa,GAAYipB,UAAnF,aAAmG96B,EACnG,EAAsChL,KAA9B7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QAAS0O,EAA1B,EAA0BA,QACpB6M,EAAkBC,KACxB,EAAyB7P,mBAAQ,iBAAM,CAACgxB,GAAgByC,EAAWp/B,GAAU28B,GAAgB0C,EAAWr/B,MAAW,CACjHo/B,EACAC,EACAr/B,IAHF,mBAAO8iB,EAAP,KAAeC,EAAf,KAMMzT,EAAQ0B,qBAAWC,gBAGzB,EAAyCymC,KAAjC1Q,EAAR,EAAQA,iBAAkBC,EAA1B,EAA0BA,WAC1B,EDxDK,SACL7H,EACAC,GAUC,IAAD,UACA,EAA6Br3B,KAArB7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QAEjB,EAAyC03C,KAAjC1Q,EAAR,EAAQA,iBAAkBC,EAA1B,EAA0BA,WAG1B,EAAiBnH,GAAQV,EAAWC,GAA3B3c,EAAT,oBAGM8kB,EAAwBvhB,GAAgB,OAAC9hB,QAAD,IAACA,SAAW6O,EAAW,QAAC0P,QAAD,IAACA,OAAD,EAACA,EAAM0b,iBACtE2Z,EAAsC,OAAGvQ,QAAH,IAAGA,OAAH,EAAGA,EAAqB,iBAAG9kB,QAAH,IAAGA,GAAH,UAAGA,EAAM0b,sBAAT,aAAG,EAAsBvxB,eAAzB,QAAoC,IAExG,EAAyB,CAAC8vB,GAAgByC,EAAWp/B,GAAU28B,GAAgB0C,EAAWr/B,IAAnF8iB,EAAP,KAAeC,EAAf,KACMlX,GAAM,mBACTs0B,GAAMoN,WAAazqB,GADV,cAETqd,GAAMqN,WAAazqB,GAFV,cAGTod,GAAM6X,UAHG,OAGSt1B,QAHT,IAGSA,OAHT,EAGSA,EAAM0b,gBAHf,GAON1B,EAAcD,GAAc,OAAC/Z,QAAD,IAACA,OAAD,EAACA,EAAM0b,gBACnC6Z,EACJv1B,GACAga,GACAqb,GACAj1B,GAEAxb,IAAKg3B,mBAAmB5B,EAAYnuB,IAAKwpC,EAAcxpC,KACnD,IAAIyX,IAAYlD,EAAQJ,EAAK6b,kBAAkBzb,EAAQ4Z,EAAaqb,GAAe,GAAOxpC,UAC1FyE,EACAklC,EACJx1B,GACAga,GACAqb,GACAh1B,GAEAzb,IAAKg3B,mBAAmB5B,EAAYnuB,IAAKwpC,EAAcxpC,KACnD,IAAIyX,IAAYjD,EAAQL,EAAK6b,kBAAkBxb,EAAQ2Z,EAAaqb,GAAe,GAAOxpC,UAC1FyE,EACAmlC,GAAuF,mBAC1FhY,GAAMoN,WAAa0K,GADuE,cAE1F9X,GAAMqN,WAAa0K,GAFuE,GAKzFE,EAA2B,IAAI/wC,IAAQ,IAAK,OAEhD,GAAI2/B,IAAqB7G,GAAMkY,kBAC7BD,EAAkB,IAAI/wC,IAAQ4/B,EAAY,YAGvC,GAAID,IAAqB7G,GAAM6X,WAClC,UAAIt1B,QAAJ,IAAIA,OAAJ,EAAIA,EAAM0b,eAAgB,CACxB,IAAMkQ,EAAoB9H,GAAeS,EAAYvkB,EAAK0b,gBACtDkQ,GAAqByJ,IAAkBzJ,EAAkB9c,YAAYumB,KACvEK,EAAkB,IAAI/wC,IAAQinC,EAAkB//B,IAAKwpC,EAAcxpC,YAKpE,GAAI1C,EAAOm7B,GAAmB,CAC/B,IAAMsH,EAAoB9H,GAAeS,EAAYp7B,EAAOm7B,IACtDsR,EAAiBH,EAAgBnR,GACnCsH,GAAqBgK,IAAmBhK,EAAkB9c,YAAY8mB,KACxEF,EAAkB,IAAI/wC,IAAQinC,EAAkB//B,IAAK+pC,EAAe/pC,MAI1E,IAqBIlM,EAKyG,EA1BvGgrC,GAKL,mBACElN,GAAMkY,kBAAoBD,GAD5B,cAEEjY,GAAM6X,UACLD,GAAiBK,GAAmBA,EAAgB5mB,YAAY,KAC5D,IAAIxL,IAAY+xB,EAActrC,MAAO2rC,EAAgB9pC,SAASypC,EAAcxpC,KAAKg0B,eACjFvvB,GALP,cAMEmtB,GAAMoN,WACLzqB,GAAUs1B,GAAmBA,EAAgB5mB,YAAY,MAAQymB,EAC7D,IAAIjyB,IAAYlD,EAAQs1B,EAAgB9pC,SAAS2pC,EAAgB1pC,KAAKg0B,eACtEvvB,GATP,cAUEmtB,GAAMqN,WACLzqB,GAAUq1B,GAAmBA,EAAgB5mB,YAAY,MAAQ0mB,EAC7D,IAAIlyB,IAAYjD,EAAQq1B,EAAgB9pC,SAAS4pC,EAAgB3pC,KAAKg0B,eACtEvvB,GAbP,GAyBD,OARK7O,IACH9B,EAAQ,kBAGLgrC,EAAclN,GAAM6X,YAAe3K,EAAclN,GAAMoN,aAAgBF,EAAclN,GAAMqN,cAC9FnrC,EAAK,UAAGA,SAAH,QAAY,mBAGZ,CAAEqgB,OAAM2qB,gBAAehrC,SCrDSk2C,CAAkB,OAACnZ,QAAD,IAACA,SAAapsB,EAAd,OAAyBqsB,QAAzB,IAAyBA,SAAarsB,GAAvF0P,EAAR,EAAQA,KAAM2qB,EAAd,EAAcA,cAAehrC,EAA7B,EAA6BA,MACRm2C,EDuDhB,WAGL,IAAMvvC,EAAWC,cASjB,MAAO,CACLgxB,YARkB/wB,uBAClB,SAAC0gC,EAAc5C,GACbh+B,EAASq3B,GAAU,CAAEuJ,QAAO5C,kBAE9B,CAACh+B,KChEmCwvC,GAA9Bve,YACFuV,GAAWptC,EAGjB,EAAsCiT,oBAAkB,GAAxD,mBAAOo6B,EAAP,KAAoBC,GAApB,KACA,GAAwCr6B,oBAAkB,GAA1D,qBAAOojC,GAAP,MAAqBC,GAArB,MACA,GAA0CrjC,oBAAS,GAAnD,qBAAOkE,GAAP,MAAsBo2B,GAAtB,MAGA,GAA4Bt6B,mBAAiB,IAA7C,qBAAOu6B,GAAP,MAAeC,GAAf,MACA,GAAmB3tB,KAAZE,GAAP,qBACA,GAA0BL,KAAnBygB,GAAP,qBAEMsN,IAAgB,mBACnB5P,GAAMkY,kBAAoBhL,EAAclN,GAAMkY,mBAAmB5mB,QAAQ,KACtE,IACA4b,EAAclN,GAAMkY,mBAAmBlV,SAAS,IAAI97B,IAAQ,IAAK,QACjE,KACAgmC,EAAclN,GAAMkY,mBAAmBtZ,QAAQ,IAL/B,cAMnBoB,GAAM6X,UACLhR,IAAqB7G,GAAM6X,UAAY/Q,EAAvC,oBAAoDoG,EAAclN,GAAM6X,kBAAxE,aAAoD,EAAgC3pB,cAAc,UAAlG,QAAwG,IAPtF,cAQnB8R,GAAMoN,WACLvG,IAAqB7G,GAAMoN,WAAatG,EAAxC,oBAAqDoG,EAAclN,GAAMoN,mBAAzE,aAAqD,EAAiClf,cAAc,UAApG,QAA0G,IATxF,cAUnB8R,GAAMqN,WACLxG,IAAqB7G,GAAMqN,WAAavG,EAAxC,oBAAqDoG,EAAclN,GAAMqN,mBAAzE,aAAqD,EAAiCnf,cAAc,UAApG,QAA0G,IAXxF,GAchBuqB,GAAW,UAAGvL,EAAclN,GAAMkY,0BAAvB,aAAG,EAAwC5mB,QAAQ,IAAIpqB,IAAQ,MAG1EwxC,GjF9CC31B,GiF8C8C,OAACR,QAAD,IAACA,GAAD,UAACA,EAAM0b,sBAAP,aAAC,EAAsBvxB,QjF9C5CqyB,KAAmB/b,GiFiDnD,GAA0C7N,mBAAuE,MAAjH,qBAAOwjC,GAAP,MAAsBC,GAAtB,MACA,GAAoCvV,GAAmB6J,EAAclN,GAAM6X,WAAYnyC,GAAvF,qBAAOi7B,GAAP,MAAiBkY,GAAjB,MAjDoE,8CAkDpE,0CAAAt4C,EAAA,yDACOm4C,IAAiBn2B,GAAShU,EADjC,sBACgD,IAAI5O,MAAM,wBAD1D,UAEQm5C,EAAkB5L,EAAclN,GAAM6X,WAF9C,sBAG8B,IAAIl4C,MAAM,4BAHxC,uBAKsB+4C,GAAaK,OAAO/0C,GAL1C,OAKQg1C,EALR,OAOQC,EAA+BxW,KAAK+N,KAAKxP,KAAKyP,MAAQ,KAAQvuB,GAE9Dg3B,EAAe,CACnB,CAAE9sC,KAAM,OAAQkB,KAAM,UACtB,CAAElB,KAAM,UAAWkB,KAAM,UACzB,CAAElB,KAAM,UAAWkB,KAAM,WACzB,CAAElB,KAAM,oBAAqBkB,KAAM,YAE/B6rC,EAAS,CACb/sC,KAAM,cACNlC,QAAS,IACTrK,UACAu5C,kBAAmB72B,EAAK0b,eAAevxB,SAEnC2sC,EAAS,CACb,CAAEjtC,KAAM,QAASkB,KAAM,WACvB,CAAElB,KAAM,UAAWkB,KAAM,WACzB,CAAElB,KAAM,QAASkB,KAAM,WACvB,CAAElB,KAAM,QAASkB,KAAM,WACvB,CAAElB,KAAM,WAAYkB,KAAM,YAEtB9N,EAAU,CACdqgC,MAAO77B,EACP87B,QAASp6B,EACTsH,MAAO8rC,EAAgB1qC,IAAI3L,WAC3Bu2C,MAAOA,EAAMM,cACbp3B,SAAU+2B,GAENv5C,EAAOqB,KAAKC,UAAU,CAC1Bu4C,MAAO,CACLL,eACAG,UAEFF,SACAK,YAAa,SACbh6C,YAGF+O,EACGkrC,KAAK,uBAAwB,CAACz1C,EAAStE,IACvC4C,KAAKo3C,mBACLp3C,MAAK,SAACq3C,GACLf,GAAiB,CACfgB,EAAGD,EAAUC,EACbC,EAAGF,EAAUE,EACbrwB,EAAGmwB,EAAUnwB,EACbtH,SAAU+2B,OAGbz2C,OAAM,SAAC0T,GAEU,QAAX,OAADA,QAAC,IAADA,OAAA,EAAAA,EAAGzW,OACLo5C,QA3DR,6CAlDoE,sBAmHpE,IAAM9e,GAAc/wB,uBAClB,SAAC0gC,EAAc3N,GAEb,OADA6c,GAAiB,MACVP,EAAa3O,EAAO3N,KAE7B,CAACsc,IAGGyB,GAAmB9wC,uBAAY,SAAC+yB,GAAD,OAAuBhC,GAAYiG,GAAM6X,UAAW9b,KAAM,CAAChC,KAC1FggB,GAAmB/wC,uBAAY,SAAC+yB,GAAD,OAAuBhC,GAAYiG,GAAMoN,WAAYrR,KAAM,CAAChC,KAC3FigB,GAAmBhxC,uBAAY,SAAC+yB,GAAD,OAAuBhC,GAAYiG,GAAMqN,WAAYtR,KAAM,CAAChC,KAG3FuG,GAAiBI,KAhI6C,SAiIrDuZ,KAjIqD,8EAiIpE,wDAAA15C,EAAA,yDACOV,GAAY0O,GAAYvK,EAD/B,sBAC8C,IAAIrE,MAAM,wBADxD,UAE8Bu6C,EAAyDhN,EAA5ElN,GAAMoN,YAAkD+M,EAAoBjN,EAAvClN,GAAMqN,YAC/C6M,GAAoBC,EAH3B,sBAIU,IAAIx6C,MAAM,4BAJpB,UAMQwwC,EAASthC,GAAkBhP,EAAS0O,EAASvK,GANrD,mBASKg8B,GAAMoN,WAAap/B,GAAwBksC,EAAiB5X,IAAiB,IATlF,cAUKtC,GAAMqN,WAAar/B,GAAwBmsC,EAAiB7X,IAAiB,IAF1EgO,EARR,EAaOrR,GAAcC,EAbrB,sBAasC,IAAIv/B,MAAM,kBAbhD,UAcQm5C,EAAkB5L,EAAclN,GAAM6X,WAd9C,uBAe8B,IAAIl4C,MAAM,4BAfxC,WAiBQy6C,EAAiBlb,IAAcpa,IAC/Bu1B,EAAmBpb,IAAcna,KAASs1B,EAC1C7J,EAAkB9N,KAAK+N,KAAKxP,KAAKyP,MAAQ,KAAQvuB,GAElDS,GAAWC,EArBlB,uBAqBgC,IAAIjjB,MAAM,kBArB1C,WA0BMghC,KAAaQ,GAAc0C,SA1BjC,iBA4BQwW,GACFC,EAAc,CAAC,qBAAsB,mDACrCzJ,EAAO,CACLuJ,EAAiBz3B,EAAOjW,QAAUkW,EAAOlW,QACzCosC,EAAgB1qC,IAAI3L,WACpB6tC,EAAW8J,EAAiBpa,GAAMoN,WAAapN,GAAMqN,YAAY5qC,WACjE6tC,EAAW8J,EAAiBpa,GAAMqN,WAAarN,GAAMoN,YAAY3qC,WACjEuB,EACAusC,KAKF+J,EAAc,CAAC,mBACfzJ,EAAO,CACLluB,EAAOjW,QACPkW,EAAOlW,QACPosC,EAAgB1qC,IAAI3L,WACpB6tC,EAAWtQ,GAAMoN,YAAY3qC,WAC7B6tC,EAAWtQ,GAAMqN,YAAY5qC,WAC7BuB,EACAusC,IAjDR,2BAsD6B,OAAlBoI,GAtDX,iBAwDQ0B,GACFC,EAAc,CAAC,+BAAgC,6DAC/CzJ,EAAO,CACLuJ,EAAiBz3B,EAAOjW,QAAUkW,EAAOlW,QACzCosC,EAAgB1qC,IAAI3L,WACpB6tC,EAAW8J,EAAiBpa,GAAMoN,WAAapN,GAAMqN,YAAY5qC,WACjE6tC,EAAW8J,EAAiBpa,GAAMqN,WAAarN,GAAMoN,YAAY3qC,WACjEuB,EACA20C,GAAcz2B,UACd,EACAy2B,GAAciB,EACdjB,GAAckB,EACdlB,GAAcnvB,KAKhB8wB,EAAc,CAAC,6BACfzJ,EAAO,CACLluB,EAAOjW,QACPkW,EAAOlW,QACPosC,EAAgB1qC,IAAI3L,WACpB6tC,EAAWtQ,GAAMoN,YAAY3qC,WAC7B6tC,EAAWtQ,GAAMqN,YAAY5qC,WAC7BuB,EACA20C,GAAcz2B,UACd,EACAy2B,GAAciB,EACdjB,GAAckB,EACdlB,GAAcnvB,IArFtB,8BAyFU,IAAI7pB,MAAM,kFAzFpB,yBA2F4DgD,QAAQ43C,IAChED,EAAYr5C,KAAI,SAACif,EAAY2P,GAAb,aACd,EAAAsgB,EAAOhM,aAAYjkB,GAAnB,oBAAkC2wB,IAC/BvuC,KAAKqL,IACLnL,OAAM,SAAC0T,GACN1V,QAAQ0B,MAAR,qBAAoC2tB,EAAO3P,EAAY2wB,EAAM36B,UAhGvE,WA2FQskC,EA3FR,QA2GuC,KAL/BC,EAA8BD,EAAiBjQ,WAAU,SAACmQ,GAAD,OAC7D7sC,KAAU8sC,YAAYD,OAvG1B,iBA4GIl6C,QAAQ0B,MAAM,wDA5GlB,+BA8GUge,EAAao6B,EAAYG,GACzBC,EAAkBF,EAAiBC,GAEzChL,IAAiB,GAjHrB,UAkHUU,EAAOjwB,GAAP,MAAAiwB,EAAM,YAAgBU,GAAhB,QAAsB,CAChCvM,SAAUoW,MAETp4C,MAAK,SAAClB,GAAmC,IAAD,IACvCquC,IAAiB,GAEjBnP,GAAel/B,EAAU,CACvBwP,QAAQ,UAAD,iBAAYs8B,EAAclN,GAAMoN,mBAAhC,aAAY,EAAiClf,cAAc,GAA3D,mBACL+Q,QADK,IACLA,OADK,EACLA,EAAWtyB,OADN,0BAECugC,EAAclN,GAAMqN,mBAFrB,aAEC,EAAiCnf,cAAc,GAFhD,mBAEsDgR,QAFtD,IAEsDA,OAFtD,EAEsDA,EAAWvyB,UAG1EgjC,GAAUvuC,EAASsP,SAEpBlO,OAAM,SAAC0T,GACNu5B,IAAiB,GAEjBjvC,QAAQ0B,MAAMgU,MAnItB,6CAjIoE,sBAyQpE,SAAS86B,KAAe,IAAD,IACrB,OACE,gBAAC1nC,GAAD,CAAYC,IAAI,KAAK2C,MAAO,CAAEwN,UAAW,QAAzC,UACE,gBAAC9O,GAAD,CAAYJ,MAAM,WAAlB,UACE,eAAC,IAAD,CAAM6B,SAAS,OAAf,mBAAuB6gC,EAAclN,GAAMoN,mBAA3C,aAAuB,EAAiClf,cAAc,KACtE,gBAACnjB,GAAD,CAAUxB,IAAI,MAAd,UACE,eAACmjB,GAAD,CAAcvG,SAAU8Y,EAAWhuB,KAAK,SACxC,eAAC,IAAD,CAAM5E,SAAS,OAAOH,MAAO,CAAEmgB,WAAY,QAA3C,gBACG4S,QADH,IACGA,OADH,EACGA,EAAWtyB,eAIlB,eAAC5B,GAAD,UACE,eAAC,KAAD,CAAMkG,KAAK,KAAKD,MAAO7B,EAAMC,OAAOC,eAEtC,gBAACzE,GAAD,CAAYJ,MAAM,WAAlB,UACE,eAAC,IAAD,CAAM6B,SAAS,OAAf,mBAAuB6gC,EAAclN,GAAMqN,mBAA3C,aAAuB,EAAiCnf,cAAc,KACtE,gBAACnjB,GAAD,CAAUxB,IAAI,MAAd,UACE,eAACmjB,GAAD,CAAcvG,SAAU+Y,EAAWjuB,KAAK,SACxC,eAAC,IAAD,CAAM5E,SAAS,OAAOH,MAAO,CAAEmgB,WAAY,QAA3C,gBACG6S,QADH,IACGA,OADH,EACGA,EAAWvyB,eAKlB,eAAC,IAAD,CAAMukC,OAAK,EAAClgC,MAAM,aAAa2I,UAAU,OAAOlP,QAAQ,aAAayB,MAAO,CAAEilC,UAAW,UAAzF,0EAEI7O,GAAkB,IAFtB,wCASN,SAAS8O,KAAe,IAAD,EACrB,OACE,uCACE,gBAACxmC,GAAD,WACE,gBAAC,IAAD,CAAMoG,MAAM,aAAZ,8BAAgCiuB,QAAhC,IAAgCA,OAAhC,EAAgCA,EAAWtyB,OAA3C,mBAAqDuyB,QAArD,IAAqDA,OAArD,EAAqDA,EAAWvyB,QAAhE,aACA,gBAAC5B,GAAD,WACE,eAACwuB,GAAD,CAAoBC,UAAWyF,EAAWxF,UAAWyF,EAAW9F,QAAM,IACtE,eAAC,IAAD,oBAAO8T,EAAclN,GAAM6X,kBAA3B,aAAO,EAAgC3pB,cAAc,WAGxD3L,GACC,uCACE,gBAAC3X,GAAD,WACE,eAAC,IAAD,CAAMoG,MAAM,aAAZ,SAA0BoK,EAAgB,KAAM,WAChD,gBAAC,IAAD,uBACK6jB,QADL,IACKA,OADL,EACKA,EAAWtyB,OADhB,MAC2BgW,EAASJ,EAAKisB,QAAQ7rB,GAAQuL,cAAc,GAAK,IAD5E,WACkFgR,QADlF,IACkFA,OADlF,EACkFA,EAAWvyB,aAG/F,gBAAC/B,GAAD,WACE,yBACA,gBAAC,IAAD,uBACKs0B,QADL,IACKA,OADL,EACKA,EAAWvyB,OADhB,MAC2BiW,EAASL,EAAKisB,QAAQ5rB,GAAQsL,cAAc,GAAK,IAD5E,WACkF+Q,QADlF,IACkFA,OADlF,EACkFA,EAAWtyB,gBAKnG,eAAC,IAAD,CAAQuC,WAAYyxB,KAAaQ,GAAc0C,UAA8B,OAAlB8U,IAAyB7rC,QAASmtC,GAA7F,SACG7+B,EAAgB,KAAM,gBAM/B,IAAMrC,GAAW,6BAAem0B,EAAclN,GAAMoN,mBAAnC,aAAe,EAAiClf,cAAc,GAA9D,mBACf+Q,QADe,IACfA,OADe,EACfA,EAAWtyB,OADI,0BAETugC,EAAclN,GAAMqN,mBAFX,aAET,EAAiCnf,cAAc,GAFtC,mBAE4CgR,QAF5C,IAE4CA,OAF5C,EAE4CA,EAAWvyB,QAElEiuC,GAAiC5xC,uBACrC,SAACgE,GACC+sB,GAAYiG,GAAMkY,kBAAmBlrC,EAAMvK,cAE7C,CAACs3B,KAGGsgB,GAAmBpb,IAAcna,KAASoa,IAAcpa,IACxD+1B,GAAoBh+B,QACxBhd,IACIo/B,GAAahS,YAAe1mB,IAAK1G,GAAUo/B,IAC1CC,GAAajS,YAAe1mB,IAAK1G,GAAUq/B,KAG5C4b,GAAwB9xC,uBAC5B,SAACmd,GACKwnB,GAAehpB,GAAWwB,KAAcwnB,EAC1CC,EAAQhrC,KAAR,kBAAwB+hB,GAAWwB,GAAnC,YAAgDunB,IAEhDE,EAAQhrC,KAAR,kBAAwB+hB,GAAWwB,GAAnC,YAAgDwnB,MAGpD,CAACD,EAAaC,EAAaC,IAEvBmN,GAAwB/xC,uBAC5B,SAACmd,GACKunB,GAAe/oB,GAAWwB,KAAcunB,EAC1CE,EAAQhrC,KAAR,kBAAwB+qC,EAAxB,YAAuChpB,GAAWwB,KAElDynB,EAAQhrC,KAAR,kBAAwB8qC,EAAxB,YAAuC/oB,GAAWwB,OAGtD,CAACunB,EAAaC,EAAaC,IAGvB+D,GAA4B3oC,uBAAY,WAC5CwmC,IAAe,GACfoJ,GAAiB,MAEblJ,IACF3V,GAAYiG,GAAMkY,kBAAmB,KAEvCvI,GAAU,MACT,CAAC5V,GAAa2V,KAEjB,GChba,SACb1iC,EACAomB,GAE0B,IAD1B4nB,EACyB,uDADX,IAEd,EAA0B7lC,oBAAY,kBAAMnI,KAA5C,mBAAOiuC,EAAP,KAAcC,EAAd,KACMC,EAAQnxB,mBAERoxB,EAAgBpyC,uBACpB,SAACqyC,GACCH,EAASG,GACLF,EAAMr5C,SACRqQ,aAAagpC,EAAMr5C,SAErBq5C,EAAMr5C,QAAUe,YAAW,WACzBuwB,EAASioB,GACTF,EAAMr5C,aAAU+Q,IACfmoC,KAEL,CAACA,EAAa5nB,IAWhB,OARAnhB,qBAAU,WACJkpC,EAAMr5C,UACRqQ,aAAagpC,EAAMr5C,SACnBq5C,EAAMr5C,aAAU+Q,GAElBqoC,EAASluC,KACR,CAACA,IAEG,CAACiuC,EAAOG,GDkZiDE,CAC9D33C,OAAOU,SAAS6oC,EAAclN,GAAMkY,mBAAmBtZ,QAAQ,IAC/Dgc,IAFF,qBAAOW,GAAP,MAAiCC,GAAjC,MAKA,OACE,uCACE,gBAAC3O,GAAD,WACE,eAACxQ,GAAD,CAAevE,QAAQ,IACvB,gBAAC,GAAD,WACE,eAAC,GAAD,CACEzgB,OAAQk4B,EACR53B,UAAWg6B,GACXt4B,cAAeA,GACf3I,KAAMg/B,IAAU,GAChB19B,QAAS,kBACP,eAAC,GAAD,CACEvF,MAAO2O,EAAgB,KAAM,oBAC7BzD,UAAWg6B,GACXn4B,WAAYw3B,GACZz3B,cAAe63B,MAGnBr4B,YAAaA,KAEf,gBAACzP,GAAD,CAAYC,IAAI,KAAhB,UACE,eAACmuC,GAAD,UACE,eAACD,GAAD,UACE,gBAACnuC,GAAD,WACE,gBAACsB,GAAD,WACE,eAAC,IAAD,qBACA,eAACkiC,GAAD,CACEhgC,QAAS,WACP0rC,IAAiBD,KAFrB,SAKGA,GAAen9B,EAAgB,KAAM,UAAYA,EAAgB,KAAM,iBAG5E,eAAC,IAAD,CAAMkyB,eAAe,QAArB,SACE,gBAAC,IAAD,CAAMjhC,SAAS,OAAf,UAAuBujC,GAAiB5P,GAAMkY,mBAA9C,UAEAK,IACA,uCACE,eAAC,IAAD,CAAM1G,GAAG,MAAT,SACE,eAACsF,GAAD,CAAQnqC,MAAOuuC,GAA0BnoB,SAAUooB,OAErD,gBAAC,IAAD,CAAMlO,eAAe,eAArB,UACE,eAAC,IAAD,CACE10B,QAAQ,WACR6C,MAAM,KACN3O,QAAS,kBAAMitB,GAAYiG,GAAMkY,kBAAmB,OAHtD,iBAOA,eAAC,IAAD,CACEt/B,QAAQ,WACR6C,MAAM,KACN3O,QAAS,kBAAMitB,GAAYiG,GAAMkY,kBAAmB,OAHtD,iBAOA,eAAC,IAAD,CACEt/B,QAAQ,WACR6C,MAAM,KACN3O,QAAS,kBAAMitB,GAAYiG,GAAMkY,kBAAmB,OAHtD,iBAOA,eAAC,IAAD,CACEt/B,QAAQ,WACR6C,MAAM,KACN3O,QAAS,kBAAMitB,GAAYiG,GAAMkY,kBAAmB,QAHtD,SAKG98B,EAAgB,IAAK,uBAQlCm9B,IACA,uCACE,eAAClvC,GAAD,UACE,eAAC,KAAD,CAAW4H,KAAK,KAAKD,MAAO7B,EAAMC,OAAOC,eAE3C,eAACqoC,GAAD,UACE,eAACD,GAAD,UACE,gBAACnuC,GAAD,CAAYC,IAAI,OAAhB,UACE,gBAACqB,GAAD,WACE,eAAC,IAAD,CAAMyB,SAAS,OAAf,SAAuBujC,GAAiB5P,GAAMoN,aAAe,MAC7D,gBAACriC,GAAD,WACE,eAAC2hB,GAAD,CAAcvG,SAAU8Y,EAAW/yB,MAAO,CAAEW,YAAa,UACzD,eAAC,IAAD,CAAMR,SAAS,OAAOtK,GAAG,iCAAzB,gBACGk9B,QADH,IACGA,OADH,EACGA,EAAWtyB,eAIlB,gBAAC/B,GAAD,WACE,eAAC,IAAD,CAAMyB,SAAS,OAAf,SAAuBujC,GAAiB5P,GAAMqN,aAAe,MAC7D,gBAACtiC,GAAD,WACE,eAAC2hB,GAAD,CAAcvG,SAAU+Y,EAAWhzB,MAAO,CAAEW,YAAa,UACzD,eAAC,IAAD,CAAMR,SAAS,OAAOtK,GAAG,iCAAzB,gBACGm9B,QADH,IACGA,OADH,EACGA,EAAWvyB,eAIjB9M,IAAYg7C,IAAqBR,IAChC,eAACzvC,GAAD,CAAYsB,MAAO,CAAEohC,eAAgB,YAArC,SACG+M,GACC,eAAC9qC,GAAD,CACEmD,GAAE,kBAAausB,IAAcna,IAAQve,IAAK1G,GAAS6M,QAAUghC,EAA3D,YACAxO,IAAcpa,IAAQve,IAAK1G,GAAS6M,QAAUihC,GAFlD,SAKGvyB,EAAgB,KAAM,kBAEvBy/B,GACF,eAACtrC,GAAD,CACEmD,GAAE,kBACAusB,GAAahS,YAAegS,EAAW14B,IAAK1G,IAAY,MAAQ6tC,EADhE,YAEExO,GAAajS,YAAeiS,EAAW34B,IAAK1G,IAAY,MAAQ8tC,GAHtE,SAKGvyB,EAAgB,KAAM,iBAEvB,OAEJ,eAMd,gBAACs8B,GAAD,CAAMxrC,MAAO,CAAEuvC,cAAe,QAA9B,UACGlD,IACC,uCACE,eAACnd,GAAD,CACEpuB,MAAO4iC,GAAiB5P,GAAM6X,WAC9B9d,YAAa+f,GACbze,MAAO,WACLtB,GAAYiG,GAAMkY,kBAAmB,QAEvC5c,eAAgBmd,GAChBjd,uBAAqB,EACrBrV,SAAQ,OAAE5D,QAAF,IAAEA,OAAF,EAAEA,EAAM0b,eAChB1b,KAAMA,EACNxgB,GAAG,qBAEL,eAACsH,GAAD,UACE,eAAC,KAAD,CAAW4H,KAAK,KAAKD,MAAO7B,EAAMC,OAAOC,eAE3C,eAAC+rB,GAAD,CACEK,aAAW,EACXzuB,MAAO4iC,GAAiB5P,GAAMoN,YAC9BrT,YAAaggB,GACb1e,MAAO,kBAAMtB,GAAYiG,GAAMkY,kBAAmB,QAClD5c,eAAgBmd,GAChBtyB,SAAU8Y,EACV1D,MAAM,SACNhM,iBAAkBurB,GAClB/4C,GAAG,4BAEL,eAACsH,GAAD,UACE,eAAC,KAAD,CAAM4H,KAAK,KAAKD,MAAO7B,EAAMC,OAAOC,eAEtC,eAAC+rB,GAAD,CACEK,aAAW,EACXzuB,MAAO4iC,GAAiB5P,GAAMqN,YAC9BtT,YAAaigB,GACb3e,MAAO,kBAAMtB,GAAYiG,GAAMkY,kBAAmB,QAClD5c,eAAgBmd,GAChBtyB,SAAU+Y,EACV3D,MAAM,SACNhM,iBAAkBwrB,GAClBh5C,GAAG,+BAIRwgB,GACC,uBAAKrW,MAAO,CAAEzB,QAAS,QAAvB,UACE,gBAAC,IAAD,CAAM6iC,eAAe,gBAAgBuE,GAAG,MAAxC,mBAEE,6CACK5S,QADL,IACKA,OADL,EACKA,EAAWtyB,OADhB,MAC2BgW,EAASJ,EAAKisB,QAAQ7rB,GAAQuL,cAAc,GAAK,IAD5E,WACkFgR,QADlF,IACkFA,OADlF,EACkFA,EAAWvyB,aAG/F,gBAAC,IAAD,CAAM2gC,eAAe,gBAArB,UACE,yBACA,6CACKpO,QADL,IACKA,OADL,EACKA,EAAWvyB,OADhB,MAC2BiW,EAASL,EAAKisB,QAAQ5rB,GAAQsL,cAAc,GAAK,IAD5E,WACkF+Q,QADlF,IACkFA,OADlF,EACkFA,EAAWtyB,gBAKnG,sBAAKT,MAAO,CAAEuqC,SAAU,YAAxB,SACIzyC,EAGA,gBAAC4G,GAAD,WACE,eAAC,IAAD,CACEkC,QAtkBgD,4CAukBhD8L,QAAS+nB,KAAaQ,GAAc0C,UAA8B,OAAlB8U,GAAyB,UAAY,UACrFzpC,SAAUyxB,KAAaQ,GAAc4C,cAAkC,OAAlB4U,GACrD1H,GAAG,MAJL,SAMGtQ,KAAaQ,GAAc2C,QAC1B,eAACzG,GAAD,wBACEsD,KAAaQ,GAAc0C,UAA8B,OAAlB8U,GACzC,WAEA,YAGJ,eAAC,IAAD,CACE7rC,QAAS,WACP0iC,IAAe,IAEjBtgC,UAAWogC,GAA8B,OAAlBqJ,IAA0BhY,KAAaQ,GAAc0C,SAC5EjrB,SACG02B,GAAapC,EAAclN,GAAMoN,aAAiBF,EAAclN,GAAMqN,YACnE,SACA,UARR,SAWGnrC,GAAS,cA5Bd,eAAC4vC,GAAD,CAAqBr/B,MAAM,uBAsCtC8P,EACC,eAACjZ,GAAD,CAAY4C,MAAO,CAAEurB,SAAU,QAAS/d,UAAW,QAAnD,SACE,eAACkkB,GAAD,CAAqBC,cAAegd,GAAmBt4B,KAAMA,MAE7D,QE5pBV,IAAMuY,GAAa3xB,UAAOC,IAAV,wLAKM,qBAAG+F,MAAkBC,OAAOmC,oBAK5CmqC,GAAevyC,UAAOC,IAAV,gPAKI,gBAAGlH,EAAH,EAAGA,MAAOiN,EAAV,EAAUA,MAAV,OAAuBjN,EAAQiN,EAAMC,OAAO8B,QAAU/B,EAAMC,OAAOmC,oBACtD,qBAAGrP,MAAqB,WAAa,gBACtD,qBAAGA,MAAqB,WAAa,gBACjC,qBAAGiN,MAAkBC,OAAOmC,oBAG5CoqC,GAAiBxyC,UAAOC,IAAV,4DAKdywB,GAAQ1wB,UAAOokB,MAAV,4kBAMW,qBAAGpe,MAAkBC,OAAOmC,oBACtB,qBAAGrP,MAAqB,WAAa,gBACtD,gBAAGA,EAAH,EAAGA,MAAOiN,EAAV,EAAUA,MAAV,OAAuBjN,EAAQiN,EAAMC,OAAO8B,QAAU/B,EAAMC,OAAOE,WAMjE,qBAAGH,MAAkBC,OAAOoe,gBAe5B,qBAAGre,MAAkBC,OAAOoe,gBAI1B,SAASouB,GAAT,GAUX,IATF75C,EASC,EATDA,GACAiL,EAQC,EARDA,MACAomB,EAOC,EAPDA,SAQQvzB,EAAYgI,KAAZhI,QACFub,EAAkBC,KACxB,EAAmCspB,GAAO33B,GAAlCN,EAAR,EAAQA,QAAS6S,EAAjB,EAAiBA,QAASnT,EAA1B,EAA0BA,KAEpBsmB,EAAc1pB,uBAClB,SAACgH,GACC,IACM6rC,EADQ7rC,EAAML,OAAO3C,MACCkO,QAAQ,OAAQ,IAC5CkY,EAASyoB,KAEX,CAACzoB,IAGGlxB,EAAQ2a,QAAQ7P,EAAMxJ,OAAS,IAAM+b,IAAY7S,GAEvD,OACE,eAAC,GAAD,CAAY3K,GAAIA,EAAhB,SACE,eAAC25C,GAAD,CAAcx5C,MAAOA,EAArB,SACE,eAACy5C,GAAD,UACE,gBAACryC,GAAD,CAAYC,IAAI,KAAhB,UACE,gBAACqB,GAAD,WACE,eAAC,IAAD,CAAMoG,MAAM,aAAawtB,WAAY,IAAKnyB,SAAS,OAAnD,SACG+O,EAAgB,KAAM,eAExB1O,GAAW7M,GACV,eAAC6P,GAAD,CAAcE,KAAMvC,GAAexN,EAAD,OAAUuM,QAAV,IAAUA,IAAQM,EAAS,WAAYR,MAAO,CAAEG,SAAU,QAA5F,SACG+O,EAAgB,IAAK,0BAI5B,eAAC,GAAD,CACEqQ,UAAU,0BACVne,KAAK,OACL4sB,aAAa,MACbC,YAAY,MACZ2hB,eAAe,MACfvhB,WAAW,QACXpH,YAAa/X,EAAgB,KAAM,8BACnClZ,MAAOA,EACPk4B,QAAQ,wBACRhH,SAAUV,EACV1lB,MAAOA,a,iBCjHN,SAAS+uC,GAAT,GAA2E,IAA3Cha,EAA0C,EAA1CA,YAC7C,OACE,eAAC9E,GAAD,CAAW5wB,SAAS,OAAO6wB,SAAU6F,GAAgBhB,GAArD,SACGA,EAAeA,EAAYiB,SAAS/7B,IAAY,SAAjC,UAA+C86B,EAAYnD,QAAQ,GAAnE,KAA4E,MCOnF,SAASod,GAAT,GAYX,IAAD,QAXDva,EAWC,EAXDA,MACAwa,EAUC,EAVDA,UACA3Z,EASC,EATDA,gBACA4Z,EAQC,EARDA,iBACAC,EAOC,EAPDA,gBAQA,EAAwChnC,oBAAkB,GAA1D,mBAAOinC,EAAP,KAAqBC,EAArB,KACM9T,EAA0B/8B,mBAAQ,kBAAM62B,GAA+BZ,EAAOa,KAAkB,CACpGA,EACAb,IAEF,EAAiDj2B,mBAAQ,kBAAMg2B,GAA2BC,KAAQ,CAACA,IAA3FO,EAAR,EAAQA,sBAAuBN,EAA/B,EAA+BA,cACzBxE,EAAW6F,GAAgBf,GAC3B5mB,EAAkBC,KAExB,OACE,uCACE,gBAAC/R,GAAD,CAAYC,IAAI,MAAhB,UACE,gBAACqB,GAAD,CAAYJ,MAAM,SAAlB,UACE,eAAC,IAAD,CAAM6B,SAAS,OAAf,mBACA,gBAAC,IAAD,CACEA,SAAS,OACTH,MAAO,CACLohC,eAAgB,SAChBuF,WAAY,SACZrb,QAAS,OACT7d,UAAW,QACX2iC,YAAa,MACb9d,WAAY,KARhB,UAWGyE,GAAqBxB,EAAO2a,GAC7B,eAAChf,GAAD,CAAsBtwB,QAAS,kBAAMuvC,GAAiBD,IAAtD,SACE,eAAC,KAAD,CAAQnrC,KAAM,aAKpB,gBAACrG,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SACGo1B,EAAM8a,YAAcC,IAAUC,YAC3BrhC,EAAgB,KAAM,oBACtBA,EAAgB,IAAK,kBAE3B,eAACgR,GAAD,CACE1R,KAAMU,EACJ,IACA,6GAIN,gBAACrQ,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SACGo1B,EAAM8a,YAAcC,IAAUC,YAA9B,oBACGlU,EAAwBvI,GAAM6C,eADjC,aACG,EAAuC3U,cAAc,UADxD,QAC8D,IAD9D,oBAEGqa,EAAwBvI,GAAM2C,cAFjC,aAEG,EAAsCzU,cAAc,UAFvD,QAE6D,MAEhE,eAAC,IAAD,CAAM7hB,SAAS,OAAOggB,WAAW,MAAjC,SACGoV,EAAM8a,YAAcC,IAAUC,YAC3Bhb,EAAM2B,aAAajd,SAASxZ,OAC5B80B,EAAMU,YAAYhc,SAASxZ,eAIrC,gBAAC/B,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SAAuB+O,EAAgB,IAAK,kBAC5C,eAACgR,GAAD,CACE1R,KAAMU,EAAgB,IAAK,kFAG/B,eAAC2gC,GAAD,CAAsBha,YAAaC,OAErC,gBAACp3B,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SAAuB+O,EAAgB,IAAK,4BAC5C,eAACgR,GAAD,CACE1R,KAAMU,EACJ,IACA,yHAIN,eAAC,IAAD,CAAM/O,SAAS,OAAf,SACGq1B,EAAa,iBAAMA,QAAN,IAAMA,OAAN,EAAMA,EAAexT,cAAc,GAAnC,YAAyCuT,EAAMU,YAAYhc,SAASxZ,QAAW,YAKnG,gBAAC7B,GAAD,WACE,eAAC,IAAD,CACEgC,QAASmvC,EACT/sC,SAAUitC,EACVvjC,QAASskB,EAAW,EAAI,SAAW,UACnC/jB,GAAG,OACHpX,GAAG,uBACH0Q,MAAM,OANR,SAQGyqB,EAAW,EAAI,cAAgB,iBAGjCgf,EAAmB,eAAC1e,GAAD,CAAmBt7B,MAAOg6C,IAAuB,WCnH7E,IAAMQ,GAAgBvzC,kBAAO0kB,IAAP1kB,CAAH,mIAKN,qBAAGgG,MAAkBC,OAAOE,WAK1B,SAASqtC,GAAT,GAYX,IAAD,IAXDlb,EAWC,EAXDA,MACAa,EAUC,EAVDA,gBACA2E,EASC,EATDA,UACA2V,EAQC,EARDA,kBACAC,EAOC,EAPDA,gBAQMtU,EAA0B/8B,mBAAQ,kBAAM62B,GAA+BZ,EAAOa,KAAkB,CACpGb,EACAa,IAGIwa,EAAsB/Z,GADMv3B,mBAAQ,kBAAMg2B,GAA2BC,KAAQ,CAACA,IAA5EO,uBAGF7yB,EAAQ0B,qBAAWC,gBAEzB,OACE,gBAACxH,GAAD,CAAYC,IAAI,KAAK2C,MAAO,CAAEwN,UAAW,QAAzC,UACE,gBAAC9O,GAAD,CAAYJ,MAAM,WAAlB,UACE,gBAACO,GAAD,CAAUxB,IAAI,MAAd,UACE,eAACmjB,GAAD,CAAcvG,SAAUsb,EAAMU,YAAYhc,SAAUlV,KAAK,OAAO/E,MAAO,CAAEW,YAAa,UACtF,eAAC,IAAD,CACER,SAAS,OACT2E,MAAO4rC,GAAqBnb,EAAM8a,YAAcC,IAAUO,aAAe5tC,EAAMC,OAAOE,QAAU,OAFlG,SAIGmyB,EAAMU,YAAYjU,cAAc,QAGrC,eAACnjB,GAAD,CAAUxB,IAAI,MAAd,SACE,eAAC,IAAD,CAAM8C,SAAS,OAAOH,MAAO,CAAEmgB,WAAY,OAAQmS,WAAY,KAA/D,SACGiD,EAAMU,YAAYhc,SAASxZ,cAIlC,eAAC5B,GAAD,UACE,eAAC,KAAD,CAAWkG,KAAK,KAAKD,MAAO7B,EAAMC,OAAOC,WAAYnD,MAAO,CAAEmgB,WAAY,MAAOoL,SAAU,YAE7F,gBAAC7sB,GAAD,CAAYJ,MAAM,WAAlB,UACE,gBAACO,GAAD,CAAUxB,IAAI,MAAd,UACE,eAACmjB,GAAD,CAAcvG,SAAUsb,EAAM2B,aAAajd,SAAUlV,KAAK,OAAO/E,MAAO,CAAEW,YAAa,UACvF,eAAC,IAAD,CACER,SAAS,OACTH,MAAO,CAAEmgB,WAAY,OAAQmS,WAAY,KACzCxtB,MACE8rC,EAAsB,EAClB3tC,EAAMC,OAAO8B,QACb0rC,GAAqBnb,EAAM8a,YAAcC,IAAUC,YACnDttC,EAAMC,OAAOE,QACb,OARR,SAWGmyB,EAAM2B,aAAalV,cAAc,QAGtC,eAACnjB,GAAD,CAAUxB,IAAI,MAAd,SACE,eAAC,IAAD,CAAM8C,SAAS,OAAOH,MAAO,CAAEmgB,WAAY,OAAQmS,WAAY,KAA/D,SACGiD,EAAM2B,aAAajd,SAASxZ,cAIlCiwC,EACC,eAACnf,GAAD,CAAuBj0B,QAAQ,aAAaD,IAAI,MAAhD,SACE,gBAACqB,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,KAAD,CAAekG,KAAM,GAAI/E,MAAO,CAAEW,YAAa,MAAO4qB,SAAU,MAChE,eAAC,IAAD,CAAMzmB,MAAM,UAAZ,+BAEF,eAAC,IAAD,CAAQlE,QAAS+vC,EAAjB,yBAGF,KACJ,eAACvzC,GAAD,CAAYE,QAAQ,aAAaD,IAAI,KAAK2C,MAAO,CAAEzB,QAAS,YAA5D,SACGg3B,EAAM8a,YAAcC,IAAUC,YAC7B,gBAACC,GAAD,6DAEE,4CACGnU,EAAwBvI,GAAM6C,eADjC,aACG,EAAuC3U,cAAc,GADxD,IAC6DuT,EAAM2B,aAAajd,SAASxZ,UAExF,sCAGH,gBAAC+vC,GAAD,wDAEE,4CACGnU,EAAwBvI,GAAM2C,cADjC,aACG,EAAsCzU,cAAc,GADvD,IAC4DuT,EAAMU,YAAYhc,SAASxZ,UAEtF,wCAIQ,OAAds6B,EACC,eAAC39B,GAAD,CAAYE,QAAQ,aAAaD,IAAI,KAAK2C,MAAO,CAAEzB,QAAS,YAA5D,SACE,gBAAC,IAAD,oCACyB,IACvB,oBAAGgC,MAAOw6B,EAAV,SAAsBl6B,GAAUk6B,GAAaz5B,GAAey5B,GAAaA,SAG3E,QCtGK,SAAS+V,GAAT,GAwBX,IAAD,YAvBDvb,EAuBC,EAvBDA,MACAwb,EAsBC,EAtBDA,cACAJ,EAqBC,EArBDA,gBACAva,EAoBC,EApBDA,gBACA2Z,EAmBC,EAnBDA,UACAtkC,EAkBC,EAlBDA,UACAsvB,EAiBC,EAjBDA,UACAiV,EAgBC,EAhBDA,iBACA7kC,EAeC,EAfDA,OACAgC,EAcC,EAdDA,cACAq2B,EAaC,EAbDA,OAcMkN,EAAoBpxC,mBACxB,kBAAMqR,QAAQ4kB,GAASwb,IApCsBC,EAoC2BD,GApC1CE,EAoCmC1b,GAlC1D8a,YAAcW,EAAOX,YAC3BtvB,YAAekwB,EAAOhb,YAAYhc,SAAU+2B,EAAO/a,YAAYhc,YAC/Dg3B,EAAOhb,YAAY7Q,QAAQ4rB,EAAO/a,eAClClV,YAAekwB,EAAO/Z,aAAajd,SAAU+2B,EAAO9Z,aAAajd,YACjEg3B,EAAO/Z,aAAa9R,QAAQ4rB,EAAO9Z,gBANxC,IAAkC+Z,EAAeD,IAqC7C,CAACD,EAAexb,IAGZuP,EAAchoC,uBAAY,WAC9B,OAAOy4B,EACL,eAACkb,GAAD,CACElb,MAAOA,EACPa,gBAAiBA,EACjB2E,UAAWA,EACX2V,kBAAmBA,EACnBC,gBAAiBA,IAEjB,OACH,CAACva,EAAiBua,EAAiB5V,EAAW2V,EAAmBnb,IAE9D2P,EAAcpoC,uBAAY,WAC9B,OAAOy4B,EACL,eAACua,GAAD,CACEC,UAAWA,EACXxa,MAAOA,EACP0a,gBAAiBS,EACjBV,iBAAkBA,EAClB5Z,gBAAiBA,IAEjB,OACH,CAACA,EAAiB2Z,EAAWW,EAAmBV,EAAkBza,IAG/D1oB,EAAW,0BAAe0oB,QAAf,IAAeA,GAAf,UAAeA,EAAOU,mBAAtB,aAAe,EAAoBjU,cAAc,GAAjD,mBACfuT,QADe,IACfA,GADe,UACfA,EAAOU,mBADQ,iBACf,EAAoBhc,gBADL,aACf,EAA8BxZ,OADf,uBAET80B,QAFS,IAETA,GAFS,UAETA,EAAO2B,oBAFE,aAET,EAAqBlV,cAAc,GAF1B,mBAEgCuT,QAFhC,IAEgCA,GAFhC,UAEgCA,EAAO2B,oBAFvC,iBAEgC,EAAqBjd,gBAFrD,aAEgC,EAA+BxZ,QAE1EywC,EAAsBp0C,uBAC1B,kBACEkzC,EACE,eAAC,GAAD,CAAyBvkC,UAAWA,EAAWnY,QAAS08C,IAExD,eAAC,GAAD,CACEzvC,MAAM,eACNkL,UAAWA,EACX6B,WAAYw3B,EACZz3B,cAAe63B,MAGrB,CAACz5B,EAAWy5B,EAAaJ,EAAakL,IAGxC,OACE,eAAC,GAAD,CACE7kC,OAAQA,EACRM,UAAWA,EACX0B,cAAeA,EACf3I,KAAMg/B,EACN19B,QAASorC,EACTrkC,YAAaA,I,iBClGJlX,mBAAK,YAAiD,IAA5B4/B,EAA2B,EAA3BA,MACjCtyB,EAAQ0B,qBAAWC,gBACzB,OACE,eAAC,IAAD,CACEusC,GAAG,OACHC,GAAG,SACHC,GAAG,SACHrxC,MAAO,CAAExB,OAAO,aAAD,OAAeyE,EAAMC,OAAOuC,UAAYhH,aAAc,QACrE6yC,SAAS,OACTlQ,eAAe,eACfuF,WAAW,SAPb,SASGpR,EAAME,MAAMzhC,KAAKe,KAAI,SAACqL,EAAOC,EAAGrM,GAC/B,IAAMu9C,EAAsBlxC,IAAMrM,EAAKsD,OAAS,EAChD,OAEE,eADA,CACC,WAAD,WACE,gBAAC,IAAD,CAAM+5C,GAAG,SAAS1K,WAAW,SAAS3mC,MAAO,CAAEwxC,WAAY,GAA3D,UACE,eAAChxB,GAAD,CAAcvG,SAAU7Z,EAAO2E,KAAK,WACpC,eAAC,IAAD,CAAM5E,SAAS,OAAO2E,MAAM,OAAOytB,GAAG,SAAtC,SACGnyB,EAAMK,YAGV8wC,EAAa,KAAO,eAAC,KAAD,CAAczsC,MAAM,iBAP5BzE,WCTzB,SAASoxC,GAAT,GAA8F,IAAD,QAArElc,EAAqE,EAArEA,MAAOa,EAA8D,EAA9DA,gBAC7B,EAAiDd,GAA2BC,GAApEO,EAAR,EAAQA,sBAAuBN,EAA/B,EAA+BA,cACzB4F,EAAY7F,EAAM8a,YAAcC,IAAUC,YAC1ClU,EAA0BlG,GAA+BZ,EAAOa,GAChElnB,EAAkBC,KAExB,OACE,eAAC,IAAD,UACE,gBAAC,IAAD,WACE,gBAACzQ,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SACGi7B,EAAYlsB,EAAgB,KAAM,oBAAsBA,EAAgB,IAAK,kBAEhF,eAACgR,GAAD,CACE1R,KAAMU,EACJ,IACA,6GAIN,eAACrQ,GAAD,UACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SACGi7B,EAAS,8BACHiB,EAAwBvI,GAAM6C,eAD3B,aACH,EAAuC3U,cAAc,GADlD,YACwDuT,EAAM2B,aAAajd,SAASxZ,eADpF,QAEN,IAFM,8BAGH47B,EAAwBvI,GAAM2C,cAH3B,aAGH,EAAsCzU,cAAc,GAHjD,YAGuDuT,EAAMU,YAAYhc,SAASxZ,eAHlF,QAIN,WAIV,gBAAC/B,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SAAuB+O,EAAgB,IAAK,kBAC5C,eAACgR,GAAD,CACE1R,KAAMU,EACJ,IACA,uFAIN,eAAC2gC,GAAD,CAAsBha,YAAaC,OAGrC,gBAACp3B,GAAD,WACE,gBAACG,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,SAAuB+O,EAAgB,IAAK,4BAC5C,eAACgR,GAAD,CACE1R,KAAMU,EACJ,IACA,yHAIN,eAAC,IAAD,CAAM/O,SAAS,OAAf,SACGq1B,EAAa,UAAMA,EAAcxT,cAAc,GAAlC,YAAwCuT,EAAMU,YAAYhc,SAASxZ,QAAW,cAYjG,SAASixC,GAAT,GAAmE,IAApCnc,EAAmC,EAAnCA,MACpC,EAA0B5f,KAAnBygB,EAAP,oBACMlnB,EAAkBC,KAClBwiC,EAAYhhC,QAAQ4kB,GAASA,EAAME,MAAMzhC,KAAKsD,OAAS,GAE7D,OACE,eAAC8F,GAAD,CAAYC,IAAI,KAAhB,SACGk4B,GACC,uCACE,eAACkc,GAAD,CAAclc,MAAOA,EAAOa,gBAAiBA,IAC5Cub,GACC,uCACE,eAAC9gB,GAAD,IACA,gBAACzzB,GAAD,CAAY4C,MAAO,CAAEzB,QAAS,UAA9B,UACE,gBAACM,GAAD,WACE,eAAC,IAAD,CAAMsB,SAAS,OAAf,mBACA,eAAC+f,GAAD,CACE1R,KAAMU,EACJ,IACA,gFAIN,eAAC,GAAD,CAAWqmB,MAAOA,eCnGlC,I,SAAMqc,GAAwB30C,UAAOC,IAAV,6TAQhB,qBAAG+F,MAAkBC,OAAOC,cAGxB,qBAAGkE,KAAmB,iBAAmB,uBAIzC,SAASwqC,GAAT,GAAoF,IAAD,EAA5Ctc,EAA4C,EAA5CA,MAAU3xB,EAAkC,0BAC1FkuC,EvFUC13B,GuFVyBmb,EvFUV9a,IuFRtB,OACE,eAACm3B,GAAD,CAAuBvqC,KAAMsJ,QAAQ4kB,GAArC,SACE,eAACmc,GAAD,2BAAyB9tC,GAAzB,IAA+B2xB,MAAK,iBAAEA,QAAF,IAAEA,IAASuc,SAAX,aAAwBnrC,OCdnD,SAASorC,GAAT,GAAgF,IAAD,UAAzDhR,EAAyD,EAAzDA,MAAOmP,EAAkD,EAAlDA,aAAcC,EAAoC,EAApCA,gBAClD6B,EAAiB9B,EAAY,OAAGnP,QAAH,IAAGA,OAAH,EAAGA,EAAO/e,cAAc,GAAxB,OAA6B+e,QAA7B,IAA6BA,GAA7B,UAA6BA,EAAO9J,gBAApC,aAA6B,EAAiBjV,cAAc,GAEzF3a,EAAOsJ,SAAa,OAALowB,QAAK,IAALA,OAAA,EAAAA,EAAOkR,gBAAP,OAAuBlR,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAOmR,gBAC7C7iB,EAAQ6gB,EAAY,iBACnBnP,QADmB,IACnBA,GADmB,UACnBA,EAAOmR,qBADY,aACnB,EAAsBzxC,OADH,uBACiBsgC,QADjB,IACiBA,GADjB,UACiBA,EAAOkR,oBADxB,aACiB,EAAqBxxC,QADtC,iBAEnBsgC,QAFmB,IAEnBA,GAFmB,UAEnBA,EAAOkR,oBAFY,aAEnB,EAAqBxxC,OAFF,uBAEgBsgC,QAFhB,IAEgBA,GAFhB,UAEgBA,EAAOmR,qBAFvB,aAEgB,EAAsBzxC,QAEhE,OACE,eAAC,IAAD,CAAMN,SAAS,OAAOH,MAAO,CAAEohC,eAAgB,SAAUuF,WAAY,SAAUrb,QAAS,QAAxF,SACGjkB,EACC,8CACG2qC,QADH,IACGA,IAAkB,IADrB,IAC2B3iB,EACzB,eAAC6B,GAAD,CAAsBtwB,QAAS,kBAAMuvC,GAAiBD,IAAtD,SACE,eAAC,IAAD,CAAa3pC,MAAM,OAAOzB,MAAM,iBAIpC,MCbR,I,MAAMqH,GAAUlP,UAAOC,IAAV,+FACG,gBAAG+F,EAAH,EAAGA,MAAH,OAAeoI,aAAe,GAAKpI,EAAMC,OAAOuC,aAK1D0sC,GAAmBl1C,UAAOC,IAAV,sMAUhBk1C,GAAoBn1C,kBAAOo1C,KAAPp1C,CAAH,8CACX,qBAAGgG,MAAkBC,OAAO8B,WAOxC,SAASstC,GAAT,GAA6D,IAAD,QAAhClyC,EAAgC,EAAhCA,MAClBzM,EAAYgI,KAAZhI,QACFub,EAAkBC,KAClBojC,EAAW,iBAAGnyC,QAAH,IAAGA,GAAH,UAAGA,EAAOK,cAAV,aAAG,EAAe2b,qBAAlB,QAAmC,GAC9C/D,EAAS,iBAAGjY,QAAH,IAAGA,GAAH,UAAGA,EAAOF,YAAV,aAAG,EAAakc,qBAAhB,QAAiC,GAE1C3E,EAAYF,KAEZi7B,EAAwBlzC,mBAAQ,WACpC,SAAKc,IAAUzM,IAERyD,OAAOC,KAAKogB,GAAW+B,MAAK,SAACxC,GAAkB,IAAD,IAC7Cy7B,EAAYh7B,EAAUT,GAC5B,OAAIy7B,EAAU/hB,OAAOtwB,MAGd,UAAAqyC,EAAUhyC,cAAV,eAAkB2b,iBAAkBm2B,IAAe,UAAAE,EAAUvyC,YAAV,eAAgBkc,iBAAkB/D,QAE7F,CAACjY,EAAOzM,EAAS8jB,EAAW86B,EAAal6B,IAE5C,OAAKjY,EAGH,eAAC,GAAD,CAASpK,MAAOw8C,EAAhB,SACE,gBAAC5zC,GAAD,CAASvB,IAAI,MAAb,UACE,gBAACD,GAAD,CAAYC,IAAI,OAAhB,UACE,eAACmjB,GAAD,CAAcvG,SAAU7Z,EAAO2E,KAAK,SACpC,wCAEF,gBAAC3H,GAAD,CAAYC,IAAI,OAAOC,QAAQ,aAA/B,UACE,gBAAC,IAAD,WACG8C,GAASA,EAAMF,MAAQE,EAAMK,QAAUL,EAAMF,OAASE,EAAMK,OAA5D,UACML,EAAMF,KADZ,aACqBE,EAAMK,OAD3B,KAEGL,EAAMF,MAAQE,EAAMK,OAAQ,OAEjC9M,GACC,eAAC6P,GAAD,CAAcxD,MAAO,CAAEsyB,WAAY,KAAO5uB,KAAMvC,GAAexN,EAASyM,EAAMI,QAAS,SAAvF,SACE,gBAAC,IAAD,CAAMD,MAAOH,EAAMI,QAAnB,UACGc,GAAelB,EAAMI,SADxB,IACmC0O,EAAgB,IAAK,kCAlBjD,KA4BN,SAASwjC,GAAT,GAQX,IAPFvnC,EAOC,EAPDA,OACA3L,EAMC,EANDA,OACAuwC,EAKC,EALDA,UAMA,EAAkD9mC,oBAAS,GAA3D,mBAAO0pC,EAAP,KAA0BC,EAA1B,KACMC,EAAmB/1C,uBAAY,kBAAM81C,GAAqB,SAACE,GAAD,OAASA,OAAK,IACxE5jC,EAAkBC,KAElB4jC,EAAgBj2C,uBAAY,kBAAM,OAAM,IAC9C,OACE,eAAC0O,GAAD,CAAOL,OAAQA,EAAQM,UAAWsnC,EAAe9nC,UAAW,GAA5D,SACE,eAACknC,GAAD,CAAkB5yB,UAAU,0BAA5B,SACE,gBAACniB,GAAD,CAAYC,IAAI,KAAhB,UACE,gBAACuB,GAAD,CAASvB,IAAI,MAAb,UACE,eAAC+0C,GAAD,IACA,eAAC,IAAD,CAAMttC,MAAM,UAAZ,SAAuBoK,EAAgB,KAAM,uBAE/C,eAAC,IAAD,UACGA,EACC,KACA,qLAGJ,eAAC,IAAD,UACGA,EACC,KACA,+JAGJ,eAAC,IAAD,UAAOA,EAAgB,KAAM,4EAC5B1P,EAAOzK,KAAI,SAACqL,GACX,OAAO,eAACkyC,GAAD,CAAsClyC,MAAOA,GAAtBA,EAAMI,YAEtC,gBAAC9B,GAAD,WACE,+BACE,yBAAOs0C,QAAQ,sBAAsBhzC,MAAO,CAAEwsB,OAAQ,UAAWymB,WAAY,QAA7E,UACE,wBACEp9C,GAAG,sBACHuL,KAAK,WACLme,UAAU,sBACV2zB,QAASP,EACTzrB,SAAU2rB,IACT,IACH,eAAC,IAAD,CAAMrjC,GAAG,OAAO+iB,GAAG,MAAnB,SACGrjB,EAAgB,IAAK,uBAI5B,eAAC,IAAD,CACElM,UAAW2vC,EACXjmC,QAAQ,SACR1M,MAAO,CAAEuG,MAAO,SAChBgZ,UAAU,uBACV3e,QAAS,WACPmvC,KANJ,SASG7gC,EAAgB,IAAK,wBC9IpC,I,MAAMijC,GAAmBl1C,UAAOC,IAAV,sMAUhBk1C,GAAoBn1C,kBAAOo1C,KAAPp1C,CAAH,8CACX,qBAAGgG,MAAkBC,OAAO8B,WAGzB,SAASmuC,GAAT,GAQX,IAPFhoC,EAOC,EAPDA,OACAioC,EAMC,EANDA,gBACArD,EAKC,EALDA,UAMA,EAAkD9mC,oBAAS,GAA3D,mBAAO0pC,EAAP,KAA0BC,EAA1B,KACMC,EAAmB/1C,uBAAY,kBAAM81C,GAAqB,SAACE,GAAD,OAASA,OAAK,IAExEC,EAAgBj2C,uBAAY,kBAAM,OAAM,IAC9C,OACE,eAAC0O,GAAD,CAAOL,OAAQA,EAAQM,UAAWsnC,EAAe9nC,UAAW,GAA5D,SACE,eAAC,GAAD,CAAkBsU,UAAU,0BAA5B,SACE,gBAACniB,GAAD,CAAYC,IAAI,KAAhB,UACE,gBAACuB,GAAD,CAASvB,IAAI,MAAb,UACE,eAAC,GAAD,IACA,eAAC,IAAD,CAAMyH,MAAM,UAAZ,8BAEmB,KAApBsuC,GACC,uCACE,gBAAC,IAAD,CAAMtuC,MAAM,UAAZ,oCACyB,kCAASsuC,IADlC,aAGA,eAAC,IAAD,CAAMtuC,MAAM,UAAZ,SACuB,WAApBsuC,EACG,iEACA,8FAIV,gBAAC10C,GAAD,WACE,+BACE,yBAAOs0C,QAAQ,sBAAsBhzC,MAAO,CAAEwsB,OAAQ,UAAWymB,WAAY,QAA7E,UACE,wBACEp9C,GAAG,sBACHuL,KAAK,WACLme,UAAU,sBACV2zB,QAASP,EACTzrB,SAAU2rB,IACT,IACH,eAAC,IAAD,CAAMrjC,GAAG,OAAT,+BAGJ,eAAC,IAAD,CACExM,UAAW2vC,EACXjmC,QAAQ,SACR1M,MAAO,CAAEuG,MAAO,SAChB3F,QAAS,WACPgyC,GAAqB,GACrB7C,KANJ,gCC5DZ,I,eAAMoC,GAAmBl1C,UAAOC,IAAV,sMAUhBk1C,GAAoBn1C,kBAAOo1C,KAAPp1C,CAAH,8CACX,qBAAGgG,MAAkBC,OAAO+tB,WAGzB,SAASoiB,GAAT,GAAkG,IAAlEloC,EAAiE,EAAjEA,OAAQ4kC,EAAyD,EAAzDA,UACrD,EAAkD9mC,oBAAS,GAA3D,mBAAO0pC,EAAP,KAA0BC,EAA1B,KACMC,EAAmB/1C,uBAAY,kBAAM81C,GAAqB,SAACE,GAAD,OAASA,OAAK,IAExEC,EAAgBj2C,uBAAY,kBAAM,OAAM,IAC9C,OACE,eAAC0O,GAAD,CAAOL,OAAQA,EAAQM,UAAWsnC,EAAe9nC,UAAW,GAA5D,SACE,eAAC,GAAD,CAAkBsU,UAAU,0BAA5B,SACE,gBAACniB,GAAD,CAAYC,IAAI,KAAhB,UACE,gBAACuB,GAAD,CAASvB,IAAI,MAAb,UACE,eAAC,GAAD,IACA,eAAC,IAAD,6CAEF,uCACE,gBAAC,IAAD,wEAC6D,IAC3D,6EAEF,eAAC,IAAD,4EACA,eAAC,IAAD,oEACA,eAAC,IAAD,uDAEF,gBAACqB,GAAD,WACE,+BACE,yBAAOs0C,QAAQ,sBAAsBhzC,MAAO,CAAEwsB,OAAQ,UAAWymB,WAAY,QAA7E,UACE,wBACEp9C,GAAG,6BACHuL,KAAK,WACLme,UAAU,sBACV2zB,QAASP,EACTzrB,SAAU2rB,IACT,IACH,eAAC,IAAD,CAAMrjC,GAAG,OAAT,+BAGJ,eAAC,IAAD,CACE3Z,GAAG,0BACHmN,UAAW2vC,EACXjmC,QAAQ,SACR1M,MAAO,CAAEuG,MAAO,SAChB3F,QAAS,WACPgyC,GAAqB,GACrB7C,KAPJ,gCCnDZ,ICKMuD,GDLAnnC,GAAUlP,kBAAOG,GAAPH,CAAH,sDAIPs2C,GAAWt2C,kBAAOyB,GAAPzB,CAAH,6CAIRu2C,GAASv2C,UAAOC,IAAV,sPAGU,gBAAG+F,EAAH,EAAGA,MAAOwwC,EAAV,EAAUA,UAAV,SAAqBzwC,SAC5BC,EAAMC,OAAOwwC,mBAAqBD,EAAYxwC,EAAMC,OAAOuB,QAAUxB,EAAMC,OAAOE,WAOtF,gBAAGH,EAAH,EAAGA,MAAOwwC,EAAV,EAAUA,UAAV,SAAqBzwC,SACjBC,EAAMC,OAAOsL,KAAOilC,EAAYxwC,EAAMC,OAAOuB,QAAU,aAGhEkvC,GAAY12C,UAAOC,IAAV,qGAMT02C,GAAY32C,UAAOC,IAAV,kLAMT,gBAAG+F,EAAH,EAAGA,MAAO4wC,EAAV,EAAUA,cAAV,OAA8BxoC,aAAe,GAAKwoC,EAAgB5wC,EAAMC,OAAOuB,QAAUxB,EAAMC,OAAOE,YACtG,gBAAGH,EAAH,EAAGA,MAAH,SAAU4wC,cAAqC5wC,EAAMC,OAAOE,QAAUH,EAAMC,OAAOwwC,sBAmB1E,SAASI,GAAT,GAA2D,IAAhCC,EAA+B,EAA/BA,MACxC,OACE,eAAC,GAAD,CAASz2C,QAAQ,SAAjB,SACE,gBAACi2C,GAAD,WACGQ,EAAMh/C,KAAI,SAAC8xC,EAAMxmC,GAChB,OAEE,eADA,CACCszC,GAAD,WACE,eAACH,GAAD,CAAQC,UAAW5M,EAAM7jC,UAAW+wC,EAAM1zC,EAAI,IAAY,IAANA,EAApD,SACGwmC,EAAO,SAAMxmC,EAAI,IAEpB,eAACuzC,GAAD,CAAWC,cAAehN,MAJZxmC,MAQpB,eAACmzC,GAAD,CAAQxwC,UAAW+wC,EAAMA,EAAMz8C,OAAS,GAAxC,SAA6Cy8C,EAAMz8C,OAAS,SCnCpE,SAAS08C,GACPze,GAIa,IAHba,EAGY,uDAHcv7B,GAC1Bmb,EAEY,uDAFOlb,GACnBm5C,EACY,uCACZ,EAAsCt4C,KAA9B7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QAAS0O,EAA1B,EAA0BA,QAE1B,EAAsCo2B,GAAOwb,GAA5BC,EAAjB,EAAQ1zC,QACFu6B,EAAuC,OAA3BkZ,EAAkCn8C,EAAUo8C,EAE9D,OAAO50C,mBAAQ,WACb,IAAKi2B,IAAUwF,IAAc14B,IAAYvK,IAAYnE,EAAS,MAAO,GAErE,IAAM2gB,EAA4B3R,GAAkBhP,EAAS0O,EAASvK,GACtE,IAAKwc,EACH,MAAO,GAGT,IAAM6/B,EAAc,GAwBpB,OAtBAA,EAAYz9C,KAEV09C,IAAOC,mBAAmB9e,EAAO,CAC/B+e,eAAe,EACfle,gBAAiB,IAAIp7B,IAAQC,IAAKC,OAAOq7B,KAAKC,MAAMJ,IAAmBj7B,IACvE4/B,YACAwZ,IAAKv+B,KAILuf,EAAM8a,YAAcC,IAAUC,aAChC4D,EAAYz9C,KAEV09C,IAAOC,mBAAmB9e,EAAO,CAC/B+e,eAAe,EACfle,gBAAiB,IAAIp7B,IAAQC,IAAKC,OAAOq7B,KAAKC,MAAMJ,IAAmBj7B,IACvE4/B,YACAwZ,IAAKv+B,KAKJm+B,EAAYp/C,KAAI,SAACy/C,GAAD,MAAiB,CAAEA,aAAYlgC,iBACrD,CAACxc,EAASs+B,EAAiBziC,EAASqiB,EAAU3T,EAAS04B,EAAWxF,IAKhE,SAASkf,GACdlf,GAI+F,IAH/Fa,EAG8F,uDAHpEv7B,GAC1Bmb,EAE8F,uDAF3Elb,GACnBm5C,EAC8F,uCAC9F,EAAsCt4C,KAA9B7D,EAAR,EAAQA,QAASnE,EAAjB,EAAiBA,QAAS0O,EAA1B,EAA0BA,QAEpBqyC,EAAYV,GAAqBze,EAAOa,EAAiBpgB,EAAUi+B,GAEnE7f,EAAiBI,KAEvB,EAAsCiE,GAAOwb,GAA5BC,EAAjB,EAAQ1zC,QACFu6B,EAAuC,OAA3BkZ,EAAkCn8C,EAAUo8C,EAE9D,OAAO50C,mBAAQ,WACb,OAAKi2B,GAAUlzB,GAAYvK,GAAYnE,EAGlConC,EAOE,CACLv+B,MAAO82C,GAAkBqB,MACzBz+C,SAAS,WAAD,4BAAE,8CAAA7B,EAAA,sEAC0CoC,QAAQ43C,IACxDqG,EAAU3/C,KAAI,SAACqc,GAAU,IAAD,EACtB,EAGIA,EAFFojC,WAAcxgC,EADhB,EACgBA,WAAY2wB,EAD5B,EAC4BA,KAAM7jC,EADlC,EACkCA,MAChCwT,EACElD,EADFkD,SAEI1B,GAAW9R,GAAS0b,GAAO1b,GAAS,GAAK,CAAEA,SAEjD,OAAO,EAAAwT,EAAS2jB,aAAYjkB,GAArB,oBAAoC2wB,GAApC,QAA0C/xB,KAC9Cxc,MAAK,SAACw+C,GACL,MAAO,CACLxjC,OACAwjC,kBAGHt+C,OAAM,SAACu+C,GAAc,IAAD,EAGnB,OAFAvgD,QAAQC,KAAK,wDAAyD6c,IAE/D,EAAAkD,EAASwgC,YAAW9gC,GAApB,oBAAmC2wB,GAAnC,QAAyC/xB,KAC7Cxc,MAAK,SAACN,GAEL,OADAxB,QAAQC,KAAK,uDAAwD6c,EAAMyjC,EAAU/+C,GAC9E,CAAEsb,OAAMpb,MAAO,IAAIvC,MAAM,mEAEjC6C,OAAM,SAACy+C,GAEN,IAAItrB,EACJ,OAFAn1B,QAAQC,KAAK,mBAAoB6c,EAAM2jC,GAE/BA,EAAUC,QAChB,IAAK,8CACL,IAAK,0CACHvrB,EACE,6HACF,MACF,QACEA,EAAY,uDAAmDsrB,EAAUC,OAA7D,wEAEhB,MAAO,CAAE5jC,OAAMpb,MAAO,IAAIvC,MAAMg2B,cApCpC,UACFwrB,EADE,OA2CFC,EAAuBD,EAAe7mC,MAC1C,SAAC+mC,EAAIC,EAAIluC,GAAT,MACE,gBAAiBiuC,IAAOC,IAAOluC,EAAK5P,OAAS,GAAK,gBAAiB4P,EAAKkuC,EAAK,OA7CzE,sBAiDAC,EAAaJ,EAAe7tC,QAAO,SAACgK,GAAD,MAA8B,UAAWA,MACnE9Z,OAAS,GAlDlB,sBAkD2B+9C,EAAWA,EAAW/9C,OAAS,GAAGtB,MAlD7D,aAmDA,IAAIvC,MAAM,8EAnDV,gBA4DJyhD,EALF9jC,KACEkD,EAxDI,EAwDJA,SAxDI,IAyDJkgC,WAAcxgC,EAzDV,EAyDUA,WAAY2wB,EAzDtB,EAyDsBA,KAAM7jC,EAzD5B,EAyD4BA,MAElC8zC,EACEM,EADFN,YA3DM,kBA8DDtgC,EAASN,GAAT,MAAAM,EAAQ,YAAgBqwB,GAAhB,qBACbvM,SAAU32B,GAAmBmzC,IACzB9zC,IAAU0b,GAAO1b,GAAS,CAAEA,QAAOc,KAAM9J,GAAY,CAAE8J,KAAM9J,OAEhE1B,MAAK,SAAClB,GACL,IAAMogD,EAAc/f,EAAMU,YAAYhc,SAASxZ,OACzC80C,EAAehgB,EAAM2B,aAAajd,SAASxZ,OAC3Cw1B,EAAcV,EAAMU,YAAYjU,cAAc,GAC9CkV,EAAe3B,EAAM2B,aAAalV,cAAc,GAEhDwX,EAAI,eAAWvD,EAAX,YAA0Bqf,EAA1B,gBAA6Cpe,EAA7C,YAA6Dqe,GACjEC,EACJza,IAAcjjC,EACV0hC,EADJ,UAEOA,EAFP,eAGMya,GAA0BpzC,GAAUozC,GAChC3yC,GAAe2yC,GACfA,GAOZ,OAJA7f,EAAel/B,EAAU,CACvBwP,QAAS8wC,IAGJtgD,EAASsP,QAEjBlO,OAAM,SAACN,GAEN,MAAoB,QAAX,OAALA,QAAK,IAALA,OAAA,EAAAA,EAAOzC,MACH,IAAIE,MAAM,0BAGhBa,QAAQ0B,MAAR,cAA6BA,EAAOge,EAAY2wB,EAAM7jC,GAChD,IAAIrN,MAAJ,uBAA0BuC,EAAM1C,eA/FpC,4CAAF,kDAAC,GAmGT0C,MAAO,MA3GwB,OAA3Bi+C,EACK,CAAEz3C,MAAO82C,GAAkBngB,QAASj9B,SAAU,KAAMF,MAAO,qBAE7D,CAAEwG,MAAO82C,GAAkBpgB,QAASh9B,SAAU,KAAMF,MAAO,MAN3D,CAAEwG,MAAO82C,GAAkBngB,QAASj9B,SAAU,KAAMF,MAAO,0BAgHnE,CAACu/B,EAAOlzB,EAASvK,EAASnE,EAASonC,EAAWkZ,EAAwBS,EAAWtgB,K,SAhNhFkf,O,qBAAAA,I,qBAAAA,I,kBAAAA,Q,KAmNSmB,ICtNHgB,I,SAAAA,O,mCAAAA,I,eAAAA,I,oBAAAA,Q,KAMZ,IAAMC,GAAiB,CAAEC,SAAUF,GAASC,gBAO7B,SAASE,GACtB5a,EACAC,EACAL,GAEA,MAA6Bj/B,KAArBhI,EAAR,EAAQA,QAASmE,EAAjB,EAAiBA,QACX+9C,EjGKD,SAAyB/+B,GAC9B,IAAQnjB,EAAYgI,KAAZhI,QACR,OAAOkjB,GAAYljB,EAAU0G,IAAK1G,GAAS6M,aAAUmG,EAAWmvC,GAAUh/B,GiGPrDi/B,GACfj0B,EAAU3H,GAAkB,OAACriB,QAAD,IAACA,SAAW6O,EAAWq0B,GAEnD/E,EAAc32B,mBAAQ,kBAAM66B,GAAeS,EAAYI,KAAgB,CAACA,EAAeJ,IACvFxG,EAAiBI,KAEvB,OAAOl1B,mBAAQ,WACb,IAAKu2C,IAAiBliD,IAAYqnC,IAAkBC,EAAgB,OAAOya,GAE3E,IAAMM,EAAoB/f,GAAenU,IAAYA,EAAQgV,SAASb,GAEtE,OAAI+E,IAAkBpiB,KAASmI,YAAe1mB,IAAK1G,GAAUsnC,GACpD,CACL0a,SAAUF,GAASQ,KACnBC,QACEF,GAAqB/f,EAArB,sBACI,4BAAA5hC,EAAA,+EAE4BwhD,EAAaM,QAAQ,CAAEr1C,MAAM,KAAD,OAAOm1B,EAAY/zB,IAAI3L,SAAS,OAFxF,OAEU6/C,EAFV,OAGIhiB,EAAegiB,EAAW,CAAE1xC,QAAQ,QAAD,OAAUuxB,EAAYjU,cAAc,GAApC,kBAHvC,gDAKI1tB,QAAQ0B,MAAM,oBAAd,MALJ,8DAQA2Q,EACN+zB,WAAYsb,OAAoBrvC,EAAY,4BAE1Coa,YAAe1mB,IAAK1G,GAAUqnC,IAAkBC,IAAmBriB,IAChE,CACL+8B,SAAUF,GAASY,OACnBH,QACEF,GAAqB/f,EAArB,sBACI,4BAAA5hC,EAAA,+EAE4BwhD,EAAaS,SAAb,YAA2BrgB,EAAY/zB,IAAI3L,SAAS,MAFhF,OAEU6/C,EAFV,OAGIhiB,EAAegiB,EAAW,CAAE1xC,QAAQ,UAAD,OAAYuxB,EAAYjU,cAAc,GAAtC,kBAHvC,gDAKI1tB,QAAQ0B,MAAM,qBAAd,MALJ,8DAQA2Q,EACN+zB,WAAYsb,OAAoBrvC,EAAY,6BAGvC+uC,KAER,CAACG,EAAcliD,EAASqnC,EAAeC,EAAgBhF,EAAanU,EAASsS,IClClF,IAocemiB,GApcF,WAAO,IAAD,oBACXC,EAAkBtZ,KAClBhuB,EAAkBC,KAGxB,EAAoD,CAClDqJ,GAAW,OAACg+B,QAAD,IAACA,OAAD,EAACA,EAAiB3b,iBAC7BriB,GAAW,OAACg+B,QAAD,IAACA,OAAD,EAACA,EAAiB1b,mBAFxB2b,EAAP,KAA4BC,EAA5B,KAIA,EAAsDztC,oBAAkB,GAAxE,mBAAO0tC,EAAP,KAA4BC,EAA5B,KACA,EAAoD3tC,mBAGjD,CACD4tC,cAAe,KACfC,aAAc,OALhB,mBAAOC,EAAP,KAA2BC,EAA3B,KAOMC,EAA2B33C,mBAC/B,8CAAM,CAACm3C,EAAqBC,UAA5B,aAAM,EAA6CtvC,QAAO,SAAC4L,GAAD,OAAmBA,aAAatZ,cAA1F,QAAoG,KACpG,CAAC+8C,EAAqBC,IAElBQ,EAA4Bp6C,uBAAY,WAC5C85C,GAAuB,KACtB,IAEGO,EAAuB,WAC3BH,EAAsB,CACpBH,cAAe,KACfC,aAAc,QAIVh/C,EAAY6D,KAAZ7D,QACFmL,EAAQ0B,qBAAWC,gBAEzB,EpGuBK,WACL,IAAMhI,EAAWC,cACX+kC,EAAapsB,KAEb4hC,EAAsBt6C,uBAAY,WACtCF,EAAS+X,GAAqB,CAAEe,gBAAiBksB,OAChD,CAACA,EAAYhlC,IAEhB,MAAO,CAACglC,EAAYwV,GoG/BGC,GAAhBC,EAAP,oBAGA,EAAmBxhC,KAAZE,EAAP,oBACA,EAA0BL,KAAnBygB,EAAP,oBAGA,EAAoD6D,KAA5CU,EAAR,EAAQA,iBAAkBC,EAA1B,EAA0BA,WAAYG,EAAtC,EAAsCA,UACtC,EAA4FN,KAApFyB,EAAR,EAAQA,QAASC,EAAjB,EAAiBA,iBAAkBd,EAAnC,EAAmCA,aAAcrhB,EAAjD,EAAiDA,WAAwBu9B,EAAzE,EAA6D7c,WAC7D,EAAkEkb,GAChE57B,EAAW8Z,GAAM2C,OACjBzc,EAAW8Z,GAAM6C,QACjBiE,GAHM+a,GAAR,EAAQA,SAAmB6B,GAA3B,EAAkBtB,QAA6BuB,GAA/C,EAAmC/c,WAK7Bgd,GAAoB/B,KAAaF,GAASC,eAC1CngB,GAAQmiB,QAAW/wC,EAAYu1B,EAE/B8E,GAAgB0W,IAAQ,mBAEvB5jB,GAAM2C,MAAQ4E,GAFS,cAGvBvH,GAAM6C,OAAS0E,GAHQ,uBAMvBvH,GAAM2C,MAAQkE,IAAqB7G,GAAM2C,MAAQ4E,EAAnC,OAAkD9F,SAAlD,IAAkDA,QAAlD,EAAkDA,GAAOU,aANhD,cAOvBnC,GAAM6C,OAASgE,IAAqB7G,GAAM6C,OAAS0E,EAApC,OAAmD9F,SAAnD,IAAmDA,QAAnD,EAAmDA,GAAO2B,cAPlD,GAU9B,G3C7EK,WAML,IAAMt6B,EAAWC,cACX86C,EAAsB76C,uBAC1B,SAAC0gC,EAAcvjB,GACbrd,EACEm3B,GAAe,CACbyJ,QACA/kB,WAAYwB,aAAoBvgB,IAAQugB,EAASzZ,QAAUyZ,IAAarB,IAAQ,MAAQ,QAI9F,CAAChc,IAqBH,MAAO,CACLg7C,eAnBqB96C,uBAAY,WACjCF,EAASo3B,QACR,CAACp3B,IAkBF+6C,sBACA9pB,YAjBkB/wB,uBAClB,SAAC0gC,EAAc5C,GACbh+B,EAASq3B,GAAU,CAAEuJ,QAAO5C,kBAE9B,CAACh+B,IAcDi7C,kBAXwB/6C,uBACxB,SAACi+B,GACCn+B,EAASu3B,GAAa,CAAE4G,iBAE1B,CAACn+B,K2C2C6Ek7C,GAAxEF,GAAR,GAAQA,eAAgBD,GAAxB,GAAwBA,oBAAqB9pB,GAA7C,GAA6CA,YAAagqB,GAA1D,GAA0DA,kBACpDzU,IAAWmU,EACXzV,GAAwBnH,IAAqB7G,GAAM2C,MAAQ3C,GAAM6C,OAAS7C,GAAM2C,MAEhFshB,GAAkBj7C,uBACtB,SAACgE,GACC+sB,GAAYiG,GAAM2C,MAAO31B,KAE3B,CAAC+sB,KAEGmqB,GAAmBl7C,uBACvB,SAACgE,GACC+sB,GAAYiG,GAAM6C,OAAQ71B,KAE5B,CAAC+sB,KAIH,GAAiG5kB,mBAM9F,CACDo6B,aAAa,EACb4U,oBAAgBtxC,EAChBwG,eAAe,EACf6iC,sBAAkBrpC,EAClB68B,YAAQ78B,IAXV,8BAAS08B,GAAT,GAASA,YAAa4U,GAAtB,GAAsBA,eAAgBjI,GAAtC,GAAsCA,iBAAkB7iC,GAAxD,GAAwDA,cAAeq2B,GAAvE,GAAuEA,OAAU0U,GAAjF,MAcMxU,IAAgB,mBACnB/I,EAAmBC,GADA,cAEnBkH,GAAiB4V,GAAQ,oBACtB1W,GAAcrG,UADQ,aACtB,EAAiC5Y,iBADX,QACwB,GADxB,oBAEtBif,GAAcc,WAFQ,aAEtB,EAA+B9f,cAAc,UAFvB,QAE6B,IAJnC,GAOhByT,GAAK,OAAGF,SAAH,IAAGA,QAAH,EAAGA,GAAOE,MACf0iB,GAA8BxnC,QAClCqJ,EAAW8Z,GAAM2C,QAAUzc,EAAW8Z,GAAM6C,UAA5C,UAAuDqK,GAAcrG,UAArE,aAAuD,EAAiCxV,YAAYlqB,IAAKC,OAAO,MAE5Gk9C,IAAW3iB,GAGjB,GlD9CK,SAAqCF,GAAqC,IAAtBa,EAAqB,uDAAH,EAK3E,OAAOe,GAJiB73B,mBACtB,kBAAOi2B,EAAQY,GAA+BZ,EAAOa,GAAiBtC,GAAM2C,YAAS9vB,IACrF,CAAC4uB,EAAOa,IAEiC58B,GkDyCP6+C,CAA4B9iB,GAAOa,GAAvE,qBAAO3B,GAAP,MAAiBkY,GAAjB,MAGA,GAAkD1jC,oBAAkB,GAApE,qBAAOqvC,GAAP,MAA0BC,GAA1B,MAGAxyC,qBAAU,WACJ0uB,KAAaQ,GAAc2C,SAC7B2gB,IAAqB,KAEtB,CAAC9jB,GAAU6jB,KAEd,IAAME,GAA6C5a,GAAezB,EAAiBrI,GAAM2C,QACnFgiB,GAAmB9nC,QAAQ6nC,KAAc,UAAIxX,GAAclN,GAAM2C,cAAxB,aAAI,EAA4BrR,QAAQozB,MAGvF,GAA6D/D,GAC3Dlf,GACAa,EACApgB,EACA+kB,GAJgB2d,GAAlB,GAAQxiD,SAA+ByiD,GAAvC,GAAgC3iD,MAOxB8/B,GAA0BR,GAA2BC,IAArDO,sBAEF8iB,GAAa97C,uBAAY,WACzBg5B,KCrKO,SAAsCA,GACnD,OAAKA,EAAsBgB,SAASv7B,MAQ7Bu6B,EAAsBgB,SAASx7B,KAC7BgO,OAAOuvC,QAAP,mDACuCv9C,GAA0Bo3B,QACpE,GAFG,sEAHC,YAJNppB,OAAO4hB,OAAP,mDAC8C3vB,GAAqCm3B,QAC/E,GAFJ,kEDkK4BomB,CAA6BhjB,KAGtD4iB,KAGLR,IAAa,SAACa,GAAD,mBAAC,eAAoBA,GAArB,IAAgC5rC,eAAe,EAAM6iC,sBAAkBrpC,EAAW68B,YAAQ78B,OACvG+xC,KACGtiD,MAAK,SAACoO,GACL0zC,IAAa,SAACa,GAAD,mBAAC,eACTA,GADQ,IAEX5rC,eAAe,EACf6iC,sBAAkBrpC,EAClB68B,OAAQh/B,UAGXlO,OAAM,SAACN,GACNkiD,IAAa,SAACa,GAAD,mBAAC,eACTA,GADQ,IAEX5rC,eAAe,EACf6iC,iBAAkBh6C,EAAM1C,QACxBkwC,YAAQ78B,aAGb,CAACmvB,GAAuB4iB,GAAcR,KAGzC,GAAwCjvC,oBAAkB,GAA1D,qBAAOinC,GAAP,MAAqBC,GAArB,MAGMS,GAAsB/Z,GAAgBf,IAItCkjB,IACHzB,IACA9iB,KAAaQ,GAAc4C,cAC1BpD,KAAaQ,GAAc2C,SAC1B0gB,IAAqB7jB,KAAaQ,GAAc0C,aACjDiZ,GAAsB,IAAM0G,GAE1B2B,GAAuBn8C,uBAAY,WACvCo7C,IAAa,SAACa,GAAD,mBAAC,eAAoBA,GAArB,IAAgC1V,aAAa,OAGtDG,IACF3V,GAAYiG,GAAM2C,MAAO,MAE1B,CAAC5I,GAAa2V,GAAQ0U,KAEnBgB,GAAsBp8C,uBAAY,WACtCo7C,IAAa,SAACa,GAAD,mBAAC,eAAoBA,GAArB,IAAgCd,eAAgB1iB,UAC5D,CAACA,KAIE4jB,GAAkBr8C,uBACtB,SAACkkB,EAAkB81B,GACb,CAAC,QAAS,YAAYroC,SAASuS,IACjCg2B,EAAsB,CACpBH,cAAe71B,EACf81B,mBAIN,CAACE,IAGGoC,GAAoBt8C,uBACxB,SAACk+B,GACCud,IAAqB,GACrBZ,GAAoB7jB,GAAM2C,MAAOuE,GACJ,UAAzBA,EAAcv6B,QAChB04C,GAAgBne,EAAcv6B,OAAQ,WAEX,aAAzBu6B,EAAcv6B,QAChB04C,GAAgBne,EAAcv6B,OAAQ,aAG1C,CAACk3C,GAAqBY,GAAsBY,KAGxCE,GAAiBv8C,uBAAY,WAC7B07C,IACF3qB,GAAYiG,GAAM2C,MAAO+hB,GAAez2B,aAEzC,CAACy2B,GAAgB3qB,KAEdyrB,GAAqBx8C,uBACzB,SAACm+B,GACC0c,GAAoB7jB,GAAM6C,OAAQsE,GACJ,UAA1BA,EAAex6B,QACjB04C,GAAgBle,EAAex6B,OAAQ,UAEX,aAA1Bw6B,EAAex6B,QACjB04C,GAAgBle,EAAex6B,OAAQ,YAG3C,CAACk3C,GAAqBwB,KAGxB,OACE,uCACE,eAACzG,GAAD,CACEvnC,OAAQ8rC,EAAgB3/C,OAAS,IAAMq/C,EACvCn3C,OAAQy3C,EACRlH,UAAWmH,IAEb,eAAC/D,GAAD,CACEhoC,OAA6C,UAArC4rC,EAAmBF,cAC3BzD,gBAAiB2D,EAAmBD,aACpC/G,UAAWoH,IAEb,eAAC9D,GAAD,CAAsBloC,OAA6C,aAArC4rC,EAAmBF,cAA8B9G,UAAWoH,IAC1F,eAACzR,GAAD,IACA,eAAC/E,GAAD,UACE,gBAAC,GAAD,CAAS9qC,GAAG,YAAZ,UACE,eAACi7C,GAAD,CACE3lC,OAAQk4B,GACR9N,MAAOA,GACPwb,cAAekH,GACftH,gBAAiBuI,GACjB/rC,cAAeA,GACfq2B,OAAQA,GACRzI,UAAWA,EACX3E,gBAAiBA,EACjB2Z,UAAW6I,GACX5I,iBAAkBA,GAClBvkC,UAAWwtC,KAEb,eAAC,GAAD,CACE14C,MAAO2O,EAAgB,EAAG,YAC1BkT,YAAalT,EAAgB,KAAM,gCAErC,gBAAC,IAAD,WACE,gBAAC9R,GAAD,CAAYC,IAAI,KAAhB,UACE,eAAC6xB,GAAD,CACEG,MACEsL,IAAqB7G,GAAM6C,SAAW+gB,IAAYniB,GAC9CrmB,EAAgB,IAAK,oBACrBA,EAAgB,GAAI,QAE1BpO,MAAO4iC,GAAiB5P,GAAM2C,OAC9BrH,eAAgBqpB,GAChBx+B,SAAUD,EAAW8Z,GAAM2C,OAC3B5I,YAAakqB,GACb5oB,MAAOkqB,GACPh2B,iBAAkB+1B,GAClB91B,cAAetJ,EAAW8Z,GAAM6C,QAChC9gC,GAAG,wBAEL,eAACuH,GAAD,CAAYE,QAAQ,gBAApB,SACE,gBAACsB,GAAD,CAAStB,QAASg6C,EAAe,gBAAkB,SAAUt3C,MAAO,CAAEzB,QAAS,UAA/E,UACE,eAACoyB,GAAD,CAAcC,WAAS,EAAvB,SACE,eAAC,IAAD,CACElkB,QAAQ,WACR9L,QAAS,WACP23C,IAAqB,GACrBX,MAEF53C,MAAO,CAAEvB,aAAc,OACvB8Q,MAAM,KAPR,SASE,eAAC,IAAD,CAAezK,MAAM,UAAUyB,MAAM,aAG1B,OAAdw0B,IAAuB2c,IAAYJ,EAClC,eAACx0C,GAAD,CAAkBjN,GAAG,uBAAuB+K,QAAS,kBAAMi3C,GAAkB,KAA7E,qCAGE,UAGR,eAAC3oB,GAAD,CACEpuB,MAAO4iC,GAAiB5P,GAAM6C,QAC9B9I,YAAamqB,GACb3oB,MACEsL,IAAqB7G,GAAM2C,QAAUihB,IAAYniB,GAC7CrmB,EAAgB,IAAK,kBACrBA,EAAgB,GAAI,MAE1BkgB,eAAe,EACfnV,SAAUD,EAAW8Z,GAAM6C,QAC3BtT,iBAAkBi2B,GAClBh2B,cAAetJ,EAAW8Z,GAAM2C,OAChC5gC,GAAG,yBAGU,OAAdklC,GAAuB2c,GAYpB,KAXF,uCACE,gBAAC94C,GAAD,CAAStB,QAAQ,gBAAgB0C,MAAO,CAAEzB,QAAS,UAAnD,UACE,eAACoyB,GAAD,CAAcC,WAAW,EAAzB,SACE,eAAC,KAAD,CAAW7rB,KAAK,KAAKD,MAAO7B,EAAMC,OAAOC,eAE3C,eAACL,GAAD,CAAkBjN,GAAG,0BAA0B+K,QAAS,kBAAMi3C,GAAkB,OAAhF,8BAIF,eAACnI,GAAD,CAAmB75C,GAAG,YAAYiL,MAAOi6B,EAAW7T,SAAU2wB,QAIjEH,GAAW,KACV,eAAC,GAAD,CAAMn5C,QAAQ,yBAAyBE,aAAa,OAApD,SACE,gBAACrB,GAAD,CAAYC,IAAI,MAAhB,UACGsT,QAAQ4kB,KACP,gBAAC72B,GAAD,CAAYJ,MAAM,SAAlB,UACE,eAAC,IAAD,CAAM6B,SAAS,OAAf,SAAuB+O,EAAgB,KAAM,WAC7C,eAAC6iC,GAAD,CACEhR,MAAK,OAAExL,SAAF,IAAEA,QAAF,EAAEA,GAAOyB,eACdkZ,aAAcA,GACdC,gBAAiBA,QAItB/Z,IAAoBv7B,IACnB,gBAAC6D,GAAD,CAAYJ,MAAM,SAAlB,UACE,eAAC,IAAD,CAAM6B,SAAS,OAAf,SAAuB+O,EAAgB,GAAI,wBAC3C,gBAAC,IAAD,CAAM/O,SAAS,OAAf,UAAuBi2B,EAAkB,IAAzC,kBAOZ,gBAACtF,GAAD,WACIh5B,EAEE4/C,GACF,eAAC,IAAD,CAAQ10C,SAAU2N,QAAQ8mC,IAAiB72C,QAAS42C,GAAQjxC,MAAM,OAAlE,gBACGkxC,SADH,IACGA,MACE9B,KAAaF,GAASQ,KAAO,OAASN,KAAaF,GAASY,OAAS,SAAW,OAEnF+B,IAAWD,GACb,eAAC1tC,GAAD,CAAUzK,MAAO,CAAEyN,UAAW,UAA9B,SACE,eAAC,IAAD,CAAMk4B,GAAG,MAAT,SAAgBz2B,EAAgB,KAAM,8CAEtC8pC,GACF,gBAACt6C,GAAD,WACE,eAAC,IAAD,CACEkC,QAAS+rC,GACT3pC,SAAUyxB,KAAaQ,GAAc4C,cAAgBygB,GACrDt4C,MAAO,CAAEuG,MAAO,OAChBmG,QAAS+nB,KAAaQ,GAAc0C,SAAW,UAAY,UAJ7D,SAMGlD,KAAaQ,GAAc2C,QAC1B,gBAACh5B,GAAD,CAASvB,IAAI,MAAMC,QAAQ,SAA3B,uBACY,eAACqK,GAAD,CAAQD,OAAO,aAEzB4wC,IAAqB7jB,KAAaQ,GAAc0C,SAClD,WADE,4BAGS3d,EAAW8Z,GAAM2C,cAH1B,aAGS,EAAyBh2B,UAGxC,eAAC,IAAD,CACEG,QAAS,WACH02C,EACFsB,KAEAV,GAAa,CACXD,eAAgB1iB,GAChBpoB,eAAe,EACf6iC,sBAAkBrpC,EAClB08B,aAAa,EACbG,YAAQ78B,KAId3G,MAAO,CAAEuG,MAAO,OAChB1Q,GAAG,cACHmN,UACGogC,IAAW3O,KAAaQ,GAAc0C,UAAaiZ,GAAsB,IAAM0G,EAElF5qC,QAAS02B,IAAWwN,GAAsB,EAAI,SAAW,UAnB3D,SAqBGA,GAAsB,IAAM0G,EAA5B,kCAEU1G,GAAsB,EAAI,UAAY,SAIrD,eAAC,IAAD,CACEhwC,QAAS,WACH02C,EACFsB,KAEAV,GAAa,CACXD,eAAgB1iB,GAChBpoB,eAAe,EACf6iC,sBAAkBrpC,EAClB08B,aAAa,EACbG,YAAQ78B,KAId9Q,GAAG,cACHmN,UAAWogC,IAAYwN,GAAsB,IAAM0G,KAAmBqB,GACtEjsC,QAAS02B,IAAWwN,GAAsB,IAAM+H,GAAoB,SAAW,UAC/EpyC,MAAM,OAjBR,SAmBGgxC,IACE3G,GAAsB,IAAM0G,EAA5B,sCAEU1G,GAAsB,EAAI,UAAY,OA7ErD,eAAChL,GAAD,CAAqBr/B,MAAM,SAgF5ByyC,IAAmB,eAAC,GAAD,CAAejF,MAAO,CAACtf,KAAaQ,GAAc0C,YACrE2f,GAAgBtH,GAAmB,eAAC1e,GAAD,CAAmBt7B,MAAOg6C,KAAuB,gBAK7F,eAAC6B,GAAD,CAA6Btc,MAAOA,SElenC,SAASgkB,GAAT,GAAoE,IAAlCC,EAAiC,EAAjCA,SACvC,OAAO,eAAC,IAAD,CAAUhzC,GAAE,2BAAOgzC,GAAP,IAAiBziD,SAAU,YAGjCwiD,I,SCRFE,GAAK,CAAElmD,KAAM,KAAMmmD,SAAU,WA6B7BC,GAAe,CAC1BF,GA7BgB,CAAElmD,KAAM,KAAMmmD,SAAU,8CACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,kCACtB,CAAEnmD,KAAM,QAASmmD,SAAU,4BAC3B,CAAEnmD,KAAM,QAASmmD,SAAU,4BAC7B,CAAEnmD,KAAM,KAAMmmD,SAAU,cACvB,CAAEnmD,KAAM,MAAOmmD,SAAU,YAC1B,CAAEnmD,KAAM,KAAMmmD,SAAU,eACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,eACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,WACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,oDACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,kCACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,UACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,oBACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,YACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,sBACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,sBACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,UACtB,CAAEnmD,KAAM,QAASmmD,SAAU,2BAC3B,CAAEnmD,KAAM,QAASmmD,SAAU,yBAC7B,CAAEnmD,KAAM,KAAMmmD,SAAU,kBACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,8CACtB,CAAEnmD,KAAM,QAASmmD,SAAU,cAC3B,CAAEnmD,KAAM,QAASmmD,SAAU,WAC7B,CAAEnmD,KAAM,KAAMmmD,SAAU,kCACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,gBACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,gEACxB,CAAEnmD,KAAM,KAAMmmD,SAAU,yBCbpCE,GAAsC,CAC1CC,iBAAkB,CAAEtmD,KAAM,GAAImmD,SAAU,IACxCI,oBAAqB,aACrBC,mBAAoB,CAAExmD,KAAM,GAAImmD,SAAU,IAC1CM,sBAAuB,cAGZC,GAAkBnsC,wBAAc8rC,ICjBvCxkC,GAAY,UAOZxQ,GAAegpB,IAAM9f,cAAgC,CAAEosC,QAAQ,EAAOC,YAAa,kBAAM,QAEzFC,GAAiC,SAAC,GAAkB,IAAhB5xC,EAAe,EAAfA,SACxC,EAA4BS,oBAAS,WACnC,IAAMoxC,EAAoB9wC,aAAaC,QAAQ4L,IAC/C,QAAOilC,GAAoBxlD,KAAKse,MAAMknC,MAFxC,mBAAOH,EAAP,KAAeI,EAAf,KAYA,OACE,eAAC11C,GAAa21C,SAAd,CAAuBz5C,MAAO,CAAEo5C,SAAQC,YARtB,WAClBG,GAAU,SAACvB,GAET,OADAxvC,aAAaixC,QAAQplC,GAAWvgB,KAAKC,WAAWikD,KACxCA,OAKV,SACE,eAAC,gBAAD,CAAiB91C,MAAOi3C,EAASO,IAAOC,IAAxC,SAAgDlyC,OClBvCmyC,GANE,WACf,MAAgCh2C,qBAAWC,IAE3C,MAAO,CAAEs1C,OAFT,EAAQA,OAESC,YAFjB,EAAgBA,YAEcl3C,MADhB0B,qBAAWi2C,kB,qBCFrBjwB,GAAe,CACnBkwB,YAAa,sCACbC,cAAe,uCAmCFC,GA7BY,WACzB,MAA8B9xC,mBAAS0hB,IAAvC,mBAAOqwB,EAAP,KAAgBC,EAAhB,KACQnjD,EAAY6D,KAAZ7D,QAwBR,OAtBAiO,qBAAU,WACR,GAAIjO,EACF,IACE,IAAMojD,EAAYC,KAAQ5qC,IAAR,kBAAuBzY,IAEzC,GAAIojD,EAAW,CACb,IAAME,EAAevmD,KAAKse,MAAM+nC,GAEhCD,GAAW,SAACI,GAAD,mBAAC,eACPA,GADM,IAETC,SAAUF,EAAaE,SACvBC,MAAOH,EAAaI,aAGxB,MAAOxlD,GACPilD,EAAWtwB,SAGbswB,EAAWtwB,MAEZ,CAAC7yB,EAASmjD,IAEND,GCiBMv0C,GArDa,CAC1B,CACE4oB,MAAO,UACPwY,KAAM,YACNnkC,KAAM,SAER,CACE2rB,MAAO,aACPwY,KAAM,aACNnkC,KAAM,6CAER,CACE2rB,MAAO,aACPwY,KAAM,WACNnkC,KAAM,wCAER,CACE2rB,MAAO,YACPwY,KAAM,WACNnkC,KAAM,wCAER,CACE2rB,MAAO,cACPwY,KAAM,YACNnkC,KAAM,wCACNpO,OAAQmmD,IAAWC,KAErB,CACErsB,MAAO,gBACPwY,KAAM,eACNnkC,KAAM,2CAER,CACE2rB,MAAO,SACPwY,KAAM,YACN8T,MAAO,CACL,CACEtsB,MAAO,MACP3rB,KAAM,yEAER,CACE2rB,MAAO,MACP3rB,KAAM,2EAIZ,CACE2rB,MAAO,WACPwY,KAAM,eACNnkC,KAAM,2CCZKk4C,GA3BQ,SAAC5vC,GACtB,IAAQlU,EAAY6Q,cAAZ7Q,QACR,EAA0B4nC,KAAlBE,EAAR,EAAQA,MAAOU,EAAf,EAAeA,OACf,EAAkD37B,qBAAWs1C,IAArDJ,EAAR,EAAQA,iBAAkBC,EAA1B,EAA0BA,oBAC1B,EAAgCa,KAAxBT,EAAR,EAAQA,OAAQC,EAAhB,EAAgBA,YAGVa,EAAUD,KAEhB,OACE,eAAC,IAAD,aACEc,MAAOA,GACP/jD,QAASA,EACT8nC,MAAOA,EACPU,OAAQA,EACR4Z,OAAQA,EACRC,YAAaA,EACb2B,aAA6B,OAAhBjC,QAAgB,IAAhBA,OAAA,EAAAA,EAAkBtmD,OAAQ,GACvCwoD,MAAOpC,GACPqC,QAASlC,EACTmC,aAdiBt1C,UAejBq0C,QAASA,GACLhvC,KC3BKkwC,GALkB,WAC/Bn2C,qBAAU,WACRikB,SAASzpB,MAAT,iBCkBE47C,GAAal/C,UAAOC,IAAV,yHAOVwjC,GAAczjC,UAAOC,IAAV,yRAYb,qBAAG+F,MAAkBqC,aAAa82C,MAKhCC,GAAWp/C,UAAOC,IAAV,mDAIRkY,GAAY,yBAEH,SAASknC,KACtB,MAAgDrzC,wBAActC,GAA9D,mBAAOkzC,EAAP,KAAyBC,EAAzB,KACA,EAAoD7wC,wBAActC,GAAlE,mBAAOozC,EAAP,KAA2BC,EAA3B,KACA,EAAwC/wC,mBAAqB,IAA7D,mBAAO0E,EAAP,KAAqBC,EAArB,KACM2uC,EAAM,UAAMtkD,kPAAYukD,0BACxBC,EAAYtkD,SAAS,GAAD,OAAIF,kPAAYykD,8BAGpCC,EAA2B,CAC/Bv8C,MAAOm8C,GAGHK,EAAwB,IAAIC,qBAAmBF,GAQrD52C,qBAAU,WACR,IAAM+2C,EAAiBvzC,aAAaC,QAAQ4L,IAC5C,GAAI0nC,EAAgB,CAClB,IAAMC,EATY,SAACD,GACrB,OAAOnD,GAAavyC,QAAO,SAACsyC,GAC1B,OAAOA,EAASnmD,OAASupD,KACxB,GAMkBE,CAAcF,GACjChD,EAAoBiD,QAEpBjD,EAAoBL,MAErB,IAEH,IAAMwD,EAAoC,uCAAG,sBAAA5oD,EAAA,sDAC3CuoD,EACGM,yBAAyBT,EAAW5C,EAAiBtmD,UAAMoT,EA1BjD,EA0BoE,KAC9EvQ,MAAK,SAAC+mD,GACDA,EAAuB3pD,KAAK8D,OAAS,EACvCsW,EAAgB,CAAC,UAEjBA,EAAgBuvC,EAAuB3pD,SAG1C4C,MAAK,kBAAM4jD,EAAsBH,MACjCvjD,OAAM,SAACN,GACN4X,EAAgB,CAAC,UACjBtZ,QAAQ0B,MAAMA,MAbyB,2CAAH,qDAiB1C+P,qBAAU,WACJ8zC,GACFoD,MAGD,CAACpD,IASJ,OAFAqC,KAGE,eAAC,WAAD,CAAUhuC,SAAU,KAApB,SACE,eAAC,IAAD,UACE,eAACiuC,GAAD,UACE,eAAClC,GAAgBM,SAAjB,CACEz5C,MAAO,CAAE+4C,mBAAkBC,oBAZR,SAACsD,GAC5BtD,EAAoBsD,GACpB7zC,aAAaixC,QAAQplC,GAAWgoC,EAAW7pD,OAUmCwmD,qBAAoBC,yBAD5F,SAGE,eAACnsC,GAAoB0sC,SAArB,CAA8Bz5C,MAAO,CAAE6M,eAAcC,mBAArD,SACE,eAAC,GAAD,UACE,gBAAC,GAAD,WACE,eAAC5G,GAAD,IACA,eAACuB,GAAD,UACE,gBAAC,IAAD,WACE,eAAC,IAAD,CAAO80C,OAAK,EAACC,QAAM,EAACtpD,KAAK,QAAQupD,UAAWhH,KAC5C,eAAC,IAAD,CAAO8G,OAAK,EAACC,QAAM,EAACtpD,KAAK,QAAQupD,UAAW5T,KAC5C,eAAC,IAAD,CAAO0T,OAAK,EAACC,QAAM,EAACtpD,KAAK,QAAQupD,UAAWlV,KAC5C,eAAC,IAAD,CAAOgV,OAAK,EAACrpD,KAAK,OAAOupD,UAAWhc,KACpC,eAAC,IAAD,CAAO8b,OAAK,EAACC,QAAM,EAACtpD,KAAK,oCAAoCupD,UAAW9R,KAGxE,eAAC,IAAD,CAAO4R,OAAK,EAACrpD,KAAK,oBAAoBupD,UAAWzX,KACjD,eAAC,IAAD,CAAOuX,OAAK,EAACrpD,KAAK,iCAAiCupD,UAAWxX,KAC9D,eAAC,IAAD,CAAOsX,OAAK,EAACC,QAAM,EAACtpD,KAAK,kBAAkBupD,UAAWvX,KAEtD,eAAC,IAAD,CAAOuX,UAAWhE,UAGtB,eAAC8C,GAAD,mBC1IlB,IAAMmB,GAA6B,oBAAqBxzB,SAExD,SAASyzB,KACP,OAAQD,IAA2D,WAA7BxzB,SAAS0zB,gBAMlC,SAASC,KACtB,MAA8B10C,mBAAkBw0C,MAAhD,mBAAOG,EAAP,KAAgBC,EAAhB,KACMC,EAAWhhD,uBAAY,WAC3B+gD,EAAWJ,QACV,CAACI,IAWJ,OATA93C,qBAAU,WACR,GAAKy3C,GAGL,OADAxzB,SAASC,iBAAiB,mBAAoB6zB,GACvC,WACL9zB,SAASE,oBAAoB,mBAAoB4zB,MAElD,CAACA,IAEGF,ECnBM,SAASG,KACtB,MAA6BpiD,KAArB0G,EAAR,EAAQA,QAAS1O,EAAjB,EAAiBA,QACXiJ,EAAWC,cAEXmhD,EAAgBL,KAEtB,EAA0B10C,mBAAsE,CAC9FtV,UACA+I,YAAa,OAFf,mBAAOF,EAAP,KAAcouB,EAAd,KAKMqzB,EAAsBnhD,uBAC1B,SAACJ,GACCkuB,GAAS,SAACtN,GACR,OAAI3pB,IAAY2pB,EAAE3pB,QACa,kBAAlB2pB,EAAE5gB,YAAiC,CAAE/I,UAAS+I,eAClD,CAAE/I,UAAS+I,YAAa65B,KAAK2U,IAAIxuC,EAAa4gB,EAAE5gB,cAElD4gB,OAGX,CAAC3pB,EAASi3B,IAIZ7kB,qBAAU,WACR,GAAK1D,GAAY1O,GAAYqqD,EAU7B,OARApzB,EAAS,CAAEj3B,UAAS+I,YAAa,OAEjC2F,EACG67C,iBACA9nD,KAAK6nD,GACL3nD,OAAM,SAACN,GAAD,OAAW1B,QAAQ0B,MAAR,kDAAyDrC,GAAWqC,MAExFqM,EAAQyH,GAAG,QAASm0C,GACb,WACL57C,EAAQ8H,eAAe,QAAS8zC,MAEjC,CAACrhD,EAAUjJ,EAAS0O,EAAS47C,EAAqBD,IAErD,IAAMG,EAAiB7lB,GAAY97B,EAAO,KAO1C,OALAuJ,qBAAU,WACHo4C,EAAexqD,SAAYwqD,EAAezhD,aAAgBshD,GAC/DphD,EAASZ,GAAkB,CAAErI,QAASwqD,EAAexqD,QAAS+I,YAAayhD,EAAezhD,iBACzF,CAACshD,EAAephD,EAAUuhD,EAAezhD,YAAayhD,EAAexqD,UAEjE,KC5CM,SAASoqD,KACtB,IAAQ17C,EAAY1G,KAAZ0G,QACFzF,EAAWC,cACXwT,EAAQ9T,aAAkD,SAACC,GAAD,OAAWA,EAAM6T,MAAMC,SAEjFmtC,EAAkBE,KAElB5xB,EAAY7C,KA8ElB,OApEAxL,GAR8B5gB,uBAAY,WACnC2gD,GACLrmD,OAAOC,KAAKgZ,GAAOlb,SAAQ,SAACvB,GAAD,OACzBm4B,EAAUn4B,GAAK0C,OAAM,SAACN,GAAD,OAAW1B,QAAQ0B,MAAM,+BAAgCA,WAE/E,CAAC+1B,EAAW0xB,EAAiBptC,IAGGhO,EAAU,IAAiB,MAG9D0D,qBAAU,WACR3O,OAAOC,KAAKgZ,GAAOlb,SAAQ,SAAC6J,GAC1B,IAAMkI,EAAOmJ,EAAMrR,GAEdkI,EAAKtR,SAAYsR,EAAK6f,kBAAqB7f,EAAKlR,OACnD+1B,EAAU/sB,GAAS1I,OAAM,SAACN,GAAD,OAAW1B,QAAQ0B,MAAM,4BAA6BA,WAGlF,CAAC4G,EAAUmvB,EAAW1pB,EAASgO,IAGlCtK,qBAAU,WACR3O,OAAOC,KAAKgZ,GAAOlb,SAAQ,SAAC6J,GAC1B,IAAMkI,EAAOmJ,EAAMrR,GACnB,GAAIkI,EAAKtR,SAAWsR,EAAK4f,cAAe,CACtC,IAAMs3B,EAAOC,aAAkBn3C,EAAKtR,QAAQoI,QAASkJ,EAAK4f,cAAc9oB,SACxE,OAAQogD,GACN,KAAKE,KAAeC,KAClB,MAAM,IAAI9qD,MAAM,8BAClB,KAAK6qD,KAAeE,MACpB,KAAKF,KAAeG,MAGdL,GAFQM,aAAex3C,EAAKtR,QAAQ4J,OAAQ0H,EAAK4f,cAActnB,SAGjE5C,EAASe,GAAiBqB,IAC1BpC,EACER,GAAS,CACPW,IAAKiC,EACL8G,QAAS,CACPM,WAAY,CACVpH,UACAC,QAASiI,EAAKtR,QACdsJ,QAASgI,EAAK4f,cACd3nB,MAAM,QAMd7K,QAAQ0B,MAAR,sBACiBgJ,EADjB,mJAIF,MAEF,KAAKs/C,KAAeK,MAClB/hD,EACER,GAAS,CACPW,IAAKiC,EACL8G,QAAS,CACPM,WAAY,CACVpH,UACAG,MAAM,EACNF,QAASiI,EAAKtR,QACdsJ,QAASgI,EAAK4f,gBAGlBjhB,cAAe,eAM1B,CAACjJ,EAAUyT,IAEP,KC5FT,SAASuuC,GAAW9X,EAAaoE,GAC/B,OALY2T,EAKA/X,EAAMvQ,KAAKuoB,MAAMvoB,KAAKwoB,SAAWxoB,KAAK2U,IAAI,EAAGA,EAAMpE,IAJxD,IAAIrwC,SAAQ,SAACV,GAAD,OAAaY,WAAWZ,EAAS8oD,MADtD,IAAcA,EAWP,IAAMG,GAAb,kDACE,aAAe,uCACP,aAFV,sBAAoCvrD,QASvBwrD,GAAb,wIAAoCxrD,Q,8CCOpC,WACEslB,EACAmmC,EACAC,GAHF,qBAAA9qD,EAAA,+EAQ6C0kB,EAAkBqmC,UACzDF,EAAMnqD,KAAI,SAACsqD,GAAD,MAAS,CAACA,EAAI7+C,QAAS6+C,EAAI/tC,cAT3C,mCAQKguC,EARL,KAQyBC,EARzB,2DAYIjrD,QAAQC,KAAK,qCAAb,MAZJ,kBAeM+qD,EAAmBE,WAAaL,GAftC,uBAgBU,IAAIF,GAAe,gCAhB7B,iCAkBS,CAAE7qC,QAASmrC,EAAY7iD,YAAa4iD,EAAmBE,aAlBhE,0D,sBAsFe,SAASzB,KACtB,IAAMnhD,EAAWC,cACXL,EAAQD,aAA6C,SAAC+gB,GAAD,OAAOA,EAAExK,aAE9D2sC,EAAqBnnB,GAAY97B,EAAMkjD,cAAe,KACtD9rC,EAAoBtX,KAClB3I,EAAYgI,KAAZhI,QACFolB,EAAoB1B,KACpBsoC,EAAgB7hC,mBAEhB8hC,EAA+CtgD,mBAAQ,WAC3D,OAtEG,SACLugD,EACAlsD,GAEA,IAAKksD,IAAiBlsD,EAAS,MAAO,GACtC,IAAMmsD,EAAYD,EAAalsD,GAC/B,OAAKmsD,EAEE1oD,OAAOC,KAAKyoD,GAAWpqD,QAAsC,SAACC,EAAM6b,GACzE,IAAMuuC,EAAeD,EAAUtuC,GAW/B,OATA7b,EAAK6b,GAAWpa,OAAOC,KAAK0oD,GACzB34C,QAAO,SAACrK,GACP,IAAMyV,EAAiBra,SAAS4E,GAChC,QAAIyV,GAAkB,IACfutC,EAAavtC,GAAkB,KAEvC9c,QAAO,SAACsqD,EAAapqD,GACpB,OAAO2gC,KAAKuQ,IAAIkZ,EAAa7nD,SAASvC,MACrC6c,KACE9c,IACN,IAfoB,GAgEdsqD,CAAoBR,EAAoB9rD,KAC9C,CAAC8rD,EAAoB9rD,IAElBusD,EAA+B5gD,mBAAQ,WAC3C,OA3CG,SACLuT,EACA+sC,EACAjsD,EACAigB,GAEA,OAAKjgB,GAAYigB,EACDf,EAAYlf,GAIrByD,OAAOC,KAAKuoD,GAAex4C,QAAO,SAACoK,GACxC,IAAMgB,EAAiBotC,EAAcpuC,GAE/Bhe,EAAOqf,EAAYlf,GAAS6d,GAElC,IAAKhe,EAAM,OAAO,EAElB,IAAM2sD,EAAqBvsC,GAAqBpB,EAAiB,GAGjE,QAAIhf,EAAK4sD,qBAAuB5sD,EAAK4sD,qBAAuBD,MAGpD3sD,EAAKkJ,aAAelJ,EAAKkJ,YAAcyjD,MAf5B/oD,OAAOC,KAAKuoD,GAHU,GAqClCS,CAAsB7jD,EAAMqW,YAAa+sC,EAAejsD,EAASigB,KACvE,CAACjgB,EAAS6I,EAAMqW,YAAa+sC,EAAehsC,IAEzC0sC,EAA6BhhD,mBAAQ,kBAAMzK,KAAKC,UAAUorD,EAA6BjtC,UAAS,CACpGitC,IAyEF,OAtEAn6C,qBAAU,WAAO,IAAD,EACd,GAAK6N,GAAsBjgB,GAAYolB,EAAvC,CAEA,IAAMwnC,EAA6B1rD,KAAKse,MAAMmtC,GAC9C,GAAgC,IAA5BC,EAAiBjpD,OAArB,CACA,IAK8D,IALxDqb,EAAQ4tC,EAAiBxrD,KAAI,SAACgI,GAAD,OAASwU,GAAaxU,MAGnDyjD,EC7IK,SAAuB7E,EAAY8E,GAChD,GAAIA,EAAe,EAAG,MAAM,IAAIhtD,MAAM,8BACtC,GAAIkoD,EAAMrkD,QAAUmpD,EAAc,MAAO,CAAC9E,GAE1C,IAAM+E,EAAoBnqB,KAAK+N,KAAKqX,EAAMrkD,OAASmpD,GAC7CE,EAAYpqB,KAAK+N,KAAKqX,EAAMrkD,OAASopD,GAE3C,OAAO,YAAIzuC,MAAMyuC,GAAWrpD,QAAQtC,KAAI,SAAAqgD,GAAE,OAAIuG,EAAM12C,MAAMmwC,EAAKuL,EAAWvL,EAAKuL,EAAYA,MDsIpEC,CAAWjuC,EA5HZ,KA8HpB,IAAI,UAAAgtC,EAAc/pD,eAAd,eAAuB8G,eAAgBkX,EACzC,UAAA+rC,EAAc/pD,eAAd,mBAAuB+pD,qBAAvB,SAAsCxqD,SAAQ,SAAC6d,GAAD,OAAOA,OAGvDpW,EACEgV,GAAyB,CACvBe,QACAhf,UACAysD,oBAAqBxsC,KAIzB+rC,EAAc/pD,QAAU,CACtB8G,YAAakX,EACb+rC,cAAea,EAAazrD,KAAI,SAACmqD,EAAOv7B,GACtC,MDnID,SACLk9B,EADK,GAGyC,IAE1CC,EAHFC,EAC2C,EAD3CA,EAAGC,EACwC,EADxCA,QAASC,EAC+B,EAD/BA,QAEVC,GAAY,EA6BhB,MAAO,CACL1qD,QA3Bc,IAAIC,QAAJ,uCAAe,WAAOV,EAASX,GAAhB,eAAAf,EAAA,sDAC7BysD,EAAkB1rD,EADW,cAIvBU,OAJuB,oBAMV+qD,IANU,cAMzB/qD,EANyB,OAOpBorD,IACHnrD,EAAQD,GACRorD,GAAY,GATW,2DAarBA,EAbqB,0DAgBrBH,GAAK,IAAO,gBAAiB9B,GAhBR,wBAiBvB7pD,EAAO,EAAD,IACN8rD,GAAY,EAlBW,6BAqBzBH,IArByB,yBAuBrBnC,GAAWoC,EAASC,GAvBC,iFAAf,yDA4BdE,OAAQ,WACFD,IACJA,GAAY,EACZJ,EAAgB,IAAI9B,OC6FUoC,EAAM,kB,gDAAMC,CAAWtoC,EAAmBmmC,EAAOtrC,KAAoB,CAC/FmtC,EAAGtuC,IACHuuC,QAAS,KACTC,QAAS,OAHHE,EAAR,EAAQA,OAwCR,OAxCA,EAAgB3qD,QAMbJ,MAAK,YAA6D,IAAjDmpD,EAAgD,EAAzDnrC,QAAkCktC,EAAuB,EAApC5kD,YAC5BijD,EAAc/pD,QAAU,CAAE+pD,cAAe,GAAIjjD,YAAakX,GAG1D,IAAM2tC,EAAoBf,EAAav7C,MAAM,EAAG0e,GAAOjuB,QAAe,SAACC,EAAMqkC,GAAP,OAAgBrkC,EAAOqkC,EAAK1iC,SAAQ,GACpGkqD,EAAmBD,EAAoBhC,EAAWjoD,OAExDsF,EACEkV,GAAuB,CACrBne,UACAygB,QAASmsC,EACNt7C,MAAMs8C,EAAmBC,GACzB9rD,QAA6C,SAACC,EAAM6b,EAASnR,GAAO,IAAD,EAElE,OADA1K,EAAK6b,GAAL,UAAgB+tC,EAAWl/C,UAA3B,QAAiC,KAC1B1K,IACN,IACL+G,YAAa4kD,QAIlBhrD,OAAM,SAACN,GACFA,aAAiBgpD,GACnB1qD,QAAQ0B,MAAM,kCAAmC4d,IAGnDtf,QAAQ0B,MAAM,kCAAmCkpD,EAAOvrD,EAASqC,GACjE4G,EACEiV,GAA8B,CAC5Bc,MAAOusC,EACPvrD,UACAysD,oBAAqBxsC,SAItButC,UAGV,CAACxtD,EAASolB,EAAmBnc,EAAU0jD,EAA4B1sC,IAE/D,KEjLM,SAASmqC,KAAiB,IAAD,EACtC,EAA6BpiD,KAArBhI,EAAR,EAAQA,QAAS0O,EAAjB,EAAiBA,QAEXo/C,EAAkBnlD,KAElBM,EAAWC,cACXL,EAAQD,aAAgD,SAAC+gB,GAAD,OAAOA,EAAEqX,gBAGjEA,EAAehhC,GAAO,UAAG6I,EAAM7I,UAAT,QAA0B,GAGhDyI,EtJTD,WACL,IAAMQ,EAAWC,cAEjB,OAAOC,uBACL,SAACgJ,EAAuB/I,GACtBH,EAASR,GAAS,CAAE0J,UAAS/I,WAE/B,CAACH,IsJEc8kD,GAiDjB,OA/CA37C,qBAAU,WACHpS,GAAY0O,GAAYo/C,GAE7BrqD,OAAOC,KAAKs9B,GACTvtB,QAAO,SAAC5C,GAAD,OAvCP,SACLi9C,EACA5sB,GAEA,GAAIA,EAAG2C,QAAS,OAAO,EACvB,IAAK3C,EAAG8sB,uBAAwB,OAAO,EACvC,IAAMC,EAAmBH,EAAkB5sB,EAAG8sB,uBAC9C,GAAIC,EAAmB,EAAG,OAAO,EACjC,IAAMC,IAAkB,IAAI/sB,MAAOC,UAAYF,EAAGG,WAAa,IAAO,GACtE,OAAI6sB,EAAiB,GAEZD,EAAmB,IAExBC,EAAiB,IAEZD,EAAmB,EAwBNE,CAAYL,EAAiB9sB,EAAanwB,OAC3DrP,SAAQ,SAACqP,GACRnC,EACG0/C,sBAAsBv9C,GACtBpO,MAAK,SAACohC,GACS,IAAD,EAATA,GACF56B,EACE03B,GAAoB,CAClB3gC,UACA6Q,OACAgzB,QAAS,CACPwqB,UAAWxqB,EAAQwqB,UACnBtlD,YAAa86B,EAAQ96B,YACrBulD,gBAAiBzqB,EAAQyqB,gBACzBrgD,KAAM41B,EAAQ51B,KACdtM,OAAQkiC,EAAQliC,OAChBkR,GAAIgxB,EAAQhxB,GACZ07C,gBAAiB1qB,EAAQ0qB,gBACzBC,iBAAkB3qB,EAAQ2qB,qBAKhC/lD,EACE,CACE+J,IAAK,CACH3B,OACAC,QAA4B,IAAnB+yB,EAAQliC,OACjBoP,QAAO,UAAEiwB,EAAanwB,UAAf,aAAE,EAAoBE,UAGjCF,IAGF5H,EAAS23B,GAAmB,CAAE5gC,UAAS6Q,OAAM9H,YAAa+kD,QAG7DnrD,OAAM,SAACN,GACN1B,QAAQ0B,MAAR,4CAAmDwO,GAAQxO,WAGlE,CAACrC,EAAS0O,EAASsyB,EAAc8sB,EAAiB7kD,EAAUR,IAExD,KCnFT,IASegmD,GATO,WACpB,IAAMC,EAAkB9lD,aAAY,SAACC,GAAD,OAAqBA,EAAM6lD,OAAO7uD,QAC9DirC,EAAWG,KAAXH,OAIR,OAAO,eAAC,IAAD,CAAgB4jB,OAAQA,EAAQtU,SAFlB,SAACl4C,GAAD,OAAgB4oC,EAAO5oC,O,UCgB/BysD,gBAPwB,CACrC5lD,YAAa,GACbyK,UAAW,GACXo7C,iBAAiB,EACjBC,kBAAkB,IAGuB,SAAAC,GAAO,OAChDA,EACGC,QAAQ1mD,IAAmB,SAACQ,EAAO0hC,GAClC,MAAiCA,EAAOC,QAAhCxqC,EAAR,EAAQA,QAAS+I,EAAjB,EAAiBA,YACyB,kBAA/BF,EAAME,YAAY/I,GAC3B6I,EAAME,YAAY/I,GAAW+I,EAE7BF,EAAME,YAAY/I,GAAW4iC,KAAK2U,IAAIxuC,EAAaF,EAAME,YAAY/I,OAGxE+uD,QAAQxmD,IAAmB,SAAAM,GAC1BA,EAAM+lD,iBAAmB/lD,EAAM+lD,mBAEhCG,QAAQvmD,IAAoB,SAAAK,GAC3BA,EAAMgmD,kBAAoBhmD,EAAMgmD,oBAEjCE,QAAQtmD,IAAU,SAACI,EAAD,GAAkE,IAAD,IAAvD2hC,QAAWr4B,EAA4C,EAA5CA,QAAS/I,EAAmC,EAAnCA,IAAmC,IAA9B8I,qBAA8B,MAAd,KAAc,EAClFrJ,EAAM2K,WAAapK,EAAMP,EAAM2K,UAAUC,QAAO,SAAAu7C,GAAK,OAAIA,EAAM5lD,MAAQA,KAAOP,EAAM2K,WAAW2hC,OAAO,CACpG,CACE/rC,IAAKA,GAAOwsB,eACZliB,MAAM,EACNvB,UACAD,sBAIL68C,QAAQrmD,IAAa,SAACG,EAAD,GAAkC,IAAbO,EAAY,EAAvBohC,QAAWphC,IACzCP,EAAM2K,UAAUhS,SAAQ,SAAAkvB,GAClBA,EAAEtnB,MAAQA,IACZsnB,EAAEhd,MAAO,YCnDNu7C,GAAgB3mD,aAAmB,wBCe1C4mD,IDbS5mD,GAAf,ECayB,kBAAM,IAAI64B,MAAOC,YAmC1C,SAAS+tB,GAAQC,EAAuBC,GACtC,MAAM,GAAN,OAAUD,EAAV,YAA2BC,GAGtB,I,GAAMr4B,GAA0B,CACrCs4B,aAAc,KACdC,iBAAiB,EACjBxtC,gBAAgB,EAChBE,sBAAuB/a,GACvBkb,aAAcjb,GACd0E,OAAQ,GACRk2B,MAAO,GACPytB,UAAWN,KACXO,WAAW,GAGEd,gBAAc33B,IAAc,SAAA83B,GAAO,OAChDA,EACGC,QAAQE,IAAe,SAAApmD,GAGqB,kBAAhCA,EAAMoZ,wBACfpZ,EAAMoZ,sBAAwB/a,IAKE,kBAAvB2B,EAAMuZ,eACfvZ,EAAMuZ,aAAejb,IAGvB0B,EAAM6mD,2BAA6BR,QAEpCH,QAAQhuC,IAAoB,SAAClY,EAAO0hC,GACnC1hC,EAAMymD,aAAe/kB,EAAOC,QAAQ8kB,aACpCzmD,EAAM2mD,UAAYN,QAEnBH,QAAQjuC,IAAuB,SAACjY,EAAO0hC,GACtC1hC,EAAM0mD,gBAAkBhlB,EAAOC,QAAQ+kB,gBACvC1mD,EAAM2mD,UAAYN,QAEnBH,QAAQ/tC,IAAsB,SAACnY,EAAO0hC,GACrC1hC,EAAMkZ,eAAiBwoB,EAAOC,QAAQzoB,eACtClZ,EAAM2mD,UAAYN,QAEnBH,QAAQ9tC,IAA6B,SAACpY,EAAO0hC,GAC5C1hC,EAAMoZ,sBAAwBsoB,EAAOC,QAAQvoB,sBAC7CpZ,EAAM2mD,UAAYN,QAEnBH,QAAQ7tC,IAAoB,SAACrY,EAAO0hC,GACnC1hC,EAAMuZ,aAAemoB,EAAOC,QAAQpoB,aACpCvZ,EAAM2mD,UAAYN,QAEnBH,QAAQ5tC,IAAoB,SAACtY,EAAD,GAA8C,IAAzB+Y,EAAwB,EAAnC4oB,QAAW5oB,gBAChD/Y,EAAMgD,OAAO+V,EAAgB5hB,SAAW6I,EAAMgD,OAAO+V,EAAgB5hB,UAAY,GACjF6I,EAAMgD,OAAO+V,EAAgB5hB,SAAS4hB,EAAgB/U,SAAW+U,EACjE/Y,EAAM2mD,UAAYN,QAEnBH,QAAQ3tC,IAAuB,SAACvY,EAAD,GAA+C,IAAD,IAApC2hC,QAAW39B,EAAyB,EAAzBA,QAAS7M,EAAgB,EAAhBA,QAC5D6I,EAAMgD,OAAO7L,GAAW6I,EAAMgD,OAAO7L,IAAY,UAC1C6I,EAAMgD,OAAO7L,GAAS6M,GAC7BhE,EAAM2mD,UAAYN,QAEnBH,QAAQ1tC,IAAmB,SAACxY,EAAD,GAA6C,IAAxB4tC,EAAuB,EAAlCjM,QAAWiM,eAC/C,GACEA,EAAe9zB,OAAO3iB,UAAYy2C,EAAe7zB,OAAO5iB,SACxDy2C,EAAe9zB,OAAO9V,UAAY4pC,EAAe7zB,OAAO/V,QACxD,CACA,IAAO7M,EAAWy2C,EAAe9zB,OAA1B3iB,QACP6I,EAAMk5B,MAAM/hC,GAAW6I,EAAMk5B,MAAM/hC,IAAY,GAC/C6I,EAAMk5B,MAAM/hC,GAASmvD,GAAQ1Y,EAAe9zB,OAAO9V,QAAS4pC,EAAe7zB,OAAO/V,UAAY4pC,EAEhG5tC,EAAM2mD,UAAYN,QAEnBH,QAAQztC,IAAsB,SAACzY,EAAD,GAAoE,IAAD,IAAzD2hC,QAAWxqC,EAA8C,EAA9CA,QAAS2vD,EAAqC,EAArCA,cAAeC,EAAsB,EAAtBA,cACtE/mD,EAAMk5B,MAAM/hC,YAEP6I,EAAMk5B,MAAM/hC,GAASmvD,GAAQQ,EAAeC,WAC5C/mD,EAAMk5B,MAAM/hC,GAASmvD,GAAQS,EAAeD,KAErD9mD,EAAM2mD,UAAYN,QAEnBH,QAAQxtC,IAAW,SAAA1Y,GAClBA,EAAM4mD,WAAY,KAEnBV,QAAQvtC,IAAa,SAAA3Y,GACpBA,EAAM4mD,WAAY,QCnIlB7e,GAAM,kBAAM,IAAIzP,MAAOC,WAqBdutB,gBAF+B,IAEH,SAAAG,GAAO,OAChDA,EACGC,QAAQtuB,IAAgB,SAACO,EAAD,GAA4E,IAAD,QAA1DwJ,QAAWxqC,EAA+C,EAA/CA,QAASiO,EAAsC,EAAtCA,KAAM4C,EAAgC,EAAhCA,KAAMiwB,EAA0B,EAA1BA,SAAU/vB,EAAgB,EAAhBA,QAClF,aAAIiwB,EAAahhC,UAAjB,aAAI,EAAwB6Q,GAC1B,MAAM/Q,MAAM,0CAEd,IAAM+vD,EAAG,UAAG7uB,EAAahhC,UAAhB,QAA4B,GACrC6vD,EAAIh/C,GAAQ,CAAEA,OAAMiwB,WAAU/vB,UAAS9C,OAAMozB,UAAWuP,MACxD5P,EAAahhC,GAAW6vD,KAEzBd,QAAQruB,IAAsB,SAACM,EAAD,GAA6C,IAAjBhhC,EAAgB,EAA3BwqC,QAAWxqC,QACpDghC,EAAahhC,KAClBghC,EAAahhC,GAAW,OAEzB+uD,QAAQnuB,IAAoB,SAACI,EAAD,GAAgE,IAAD,MAA9CwJ,QAAWxqC,EAAmC,EAAnCA,QAAS6Q,EAA0B,EAA1BA,KAAM9H,EAAoB,EAApBA,YAChEm4B,EAAE,UAAGF,EAAahhC,UAAhB,aAAG,EAAwB6Q,GAC9BqwB,IAGAA,EAAG8sB,uBAGN9sB,EAAG8sB,uBAAyBprB,KAAK2U,IAAIxuC,EAAam4B,EAAG8sB,wBAFrD9sB,EAAG8sB,uBAAyBjlD,MAK/BgmD,QAAQpuB,IAAqB,SAACK,EAAD,GAA4D,IAAD,MAA1CwJ,QAAW35B,EAA+B,EAA/BA,KAAM7Q,EAAyB,EAAzBA,QAAS6jC,EAAgB,EAAhBA,QACjE3C,EAAE,UAAGF,EAAahhC,UAAhB,aAAG,EAAwB6Q,GAC9BqwB,IAGLA,EAAG2C,QAAUA,EACb3C,EAAG4uB,cAAgBlf,YC7CnB5Z,IAAuB,IAC3BgQ,iBAAkB7G,GAAM2C,MACxBmE,WAAY,IAFe,eAG1B9G,GAAM2C,MAAQ,CACbhe,WAAY,KAJa,eAM1Bqb,GAAM6C,OAAS,CACdle,WAAY,KAPa,2BAShB,MATgB,IAYd6pC,gBAAyB33B,IAAc,SAAC83B,GAAD,OACpDA,EACGC,QACCxuB,IACA,SAAC13B,EAAD,GAA8F,IAAD,MAAnF2hC,QAAWvD,EAAwE,EAAxEA,WAAYG,EAA4D,EAA5DA,UAAWyC,EAAiD,EAAjDA,MAAO3C,EAA0C,EAA1CA,gBAAiBC,EAAyB,EAAzBA,iBAClE,OAAO,EAAP,iBACGhH,GAAM2C,MAAQ,CACbhe,WAAYoiB,IAFhB,cAIG/G,GAAM6C,OAAS,CACdle,WAAYqiB,IALhB,iCAOoB0C,GAPpB,2BAQE5C,GARF,0BASEG,GATF,KAaH2nB,QAAQ3uB,IAAgB,SAACv3B,EAAD,GAAgD,IAEtB,EAFqB,IAArC2hC,QAAW1lB,EAA0B,EAA1BA,WAAY+kB,EAAc,EAAdA,MAClDkmB,EAAalmB,IAAU1J,GAAM2C,MAAQ3C,GAAM6C,OAAS7C,GAAM2C,MAChE,OAAIhe,IAAejc,EAAMknD,GAAYjrC,WAE5B,2BACFjc,GADL,OAEEm+B,iBAAkBn+B,EAAMm+B,mBAAqB7G,GAAM2C,MAAQ3C,GAAM6C,OAAS7C,GAAM2C,OAFlF,cAGG+G,EAAQ,CAAE/kB,eAHb,cAIGirC,EAAa,CAAEjrC,WAAYjc,EAAMghC,GAAO/kB,aAJ3C,IAQK,2BACFjc,GADL,kBAEGghC,EAAQ,CAAE/kB,mBAGdiqC,QAAQ1uB,IAAkB,SAACx3B,GAAW,IAAD,EACpC,OAAO,2BACFA,GADL,OAEEm+B,iBAAkBn+B,EAAMm+B,mBAAqB7G,GAAM2C,MAAQ3C,GAAM6C,OAAS7C,GAAM2C,OAFlF,cAGG3C,GAAM2C,MAAQ,CAAEhe,WAAYjc,EAAMs3B,GAAM6C,QAAQle,aAHnD,cAIGqb,GAAM6C,OAAS,CAAEle,WAAYjc,EAAMs3B,GAAM2C,OAAOhe,aAJnD,OAODiqC,QAAQzuB,IAAW,SAACz3B,EAAD,GAAgD,IAAD,IAArC2hC,QAAWX,EAA0B,EAA1BA,MAAO5C,EAAmB,EAAnBA,WAC9C,OAAO,2BACFp+B,GADL,IAEEm+B,iBAAkB6C,EAClB5C,kBAGH8nB,QAAQvuB,IAAc,SAAC33B,EAAD,GAAwC,IAAnBu+B,EAAkB,EAA7BoD,QAAWpD,UAC1Cv+B,EAAMu+B,UAAYA,QCtElBpQ,GAA0B,CAC9BgQ,iBAAkB7G,GAAMoN,WACxBtG,WAAY,GACZiH,gBAAiB,IAGJygB,gBAAyB33B,IAAc,SAAA83B,GAAO,OAC3DA,EACGC,QAAQrqB,IAAgB,kBAAM1N,MAC9B+3B,QAAQzuB,IAAW,SAACz3B,EAAD,GAA6D,IAAD,IAAlD2hC,QAAWX,EAAuC,EAAvCA,MAAO5C,EAAgC,EAAhCA,WAC9C,OAD8E,EAApBkG,YAGpDtD,IAAUhhC,EAAMm+B,iBACX,2BACFn+B,GADL,IAEEm+B,iBAAkB6C,EAClB5C,eAKK,2BACFp+B,GADL,IAEEm+B,iBAAkB6C,EAClB5C,aACAiH,gBAAiBrlC,EAAMo+B,aAIpB,2BACFp+B,GADL,IAEEm+B,iBAAkB6C,EAClB5C,aACAiH,gBAAiB,WCnBrB8hB,GAA8C,CAClD3tD,MAAO,KACPJ,QAAS,KACTmxB,iBAAkB,KAClBD,cAAe,MAKX6D,GAA2B,CAC/Bi5B,kCAAmCr8B,GACnCjX,MAAM,2BACDiX,GAAsB7xB,QAAqC,SAACC,EAAMqJ,GAEnE,OADArJ,EAAKqJ,GAAW2kD,GACThuD,IACN,KAJA,kBAKF2xB,GAAyB,CACxBtxB,MAAO,KACPJ,QAASiuD,GACT98B,iBAAkB,KAClBD,cAAe,QAGnB/V,gBAAiBuW,IAGJg7B,gBAAc33B,IAAc,SAAC83B,GAAD,OACzCA,EACGC,QAAQnlD,GAAeC,SAAS,SAAChB,EAAD,GAA6C,IAAD,IAAlC2hC,QAAW7U,EAAuB,EAAvBA,UAAW11B,EAAY,EAAZA,IAC/D4I,EAAM8T,MAAM1c,GAAZ,yBACEgC,QAAS,KACTkxB,cAAe,MACZtqB,EAAM8T,MAAM1c,IAHjB,IAIEmzB,iBAAkBuC,EAClBtzB,MAAO,UAGV0sD,QAAQnlD,GAAeE,WAAW,SAACjB,EAAD,GAAwD,IAAD,QAA7C2hC,QAAW7U,EAAkC,EAAlCA,UAAWE,EAAuB,EAAvBA,UAAW51B,EAAY,EAAZA,IACtEgC,EAAO,UAAG4G,EAAM8T,MAAM1c,UAAf,aAAG,EAAkBgC,QAC5BmxB,EAAgB,UAAGvqB,EAAM8T,MAAM1c,UAAf,aAAG,EAAkBmzB,iBAG3C,GAAInxB,EAAS,CAEX,GADoByoD,aAAkBzoD,EAAQoI,QAASwrB,EAAUxrB,WAC7CsgD,KAAeC,KAAM,OAChB,OAArBx3B,GAA6BA,IAAqBuC,IACpD9sB,EAAM8T,MAAM1c,GAAZ,2BACK4I,EAAM8T,MAAM1c,IADjB,IAEEmzB,iBAAkB,KAClB/wB,MAAO,KACPJ,UACAkxB,cAAe0C,UAInBhtB,EAAM8T,MAAM1c,GAAZ,2BACK4I,EAAM8T,MAAM1c,IADjB,IAEEmzB,iBAAkB,KAClB/wB,MAAO,KACPJ,QAAS4zB,EACT1C,cAAe,UAIpB47B,QAAQnlD,GAAeG,UAAU,SAAClB,EAAD,GAA2D,IAAD,MAAhD2hC,QAAWvqC,EAAqC,EAArCA,IAAK01B,EAAgC,EAAhCA,UAAWG,EAAqB,EAArBA,cACjE,UAAAjtB,EAAM8T,MAAM1c,UAAZ,eAAkBmzB,oBAAqBuC,IAK3C9sB,EAAM8T,MAAM1c,GAAZ,2BACK4I,EAAM8T,MAAM1c,IADjB,IAEEmzB,iBAAkB,KAClB/wB,MAAOyzB,EACP7zB,QAAS,KACTkxB,cAAe,WAGlB47B,QAAQ5kD,IAAY,SAACtB,EAAD,GAA8B,IAAX5I,EAAU,EAAnBuqC,QAC7B3hC,EAAMuU,gBAAkBnd,EAEnB4I,EAAM8T,MAAM1c,KACf4I,EAAM8T,MAAM1c,GAAO+vD,OAGtBjB,QAAQ9kD,IAAS,SAACpB,EAAD,GAA8B,IAAX5I,EAAU,EAAnBuqC,QACrB3hC,EAAM8T,MAAM1c,KACf4I,EAAM8T,MAAM1c,GAAO+vD,OAGtBjB,QAAQ7kD,IAAY,SAACrB,EAAD,GAA8B,IAAX5I,EAAU,EAAnBuqC,QACzB3hC,EAAM8T,MAAM1c,WACP4I,EAAM8T,MAAM1c,GAEjB4I,EAAMuU,kBAAoBnd,IAC5B4I,EAAMuU,gBAAkB3Z,OAAOC,KAAKmF,EAAM8T,OAAO,OAGpDoyC,QAAQ/kD,IAAkB,SAACnB,EAAD,GAA8B,IAAD,EAAV5I,EAAU,EAAnBuqC,QACnC,KAAI,UAAC3hC,EAAM8T,MAAM1c,UAAb,aAAC,EAAkBkzB,eACrB,MAAM,IAAIrzB,MAAM,oDAElB+I,EAAM8T,MAAM1c,GAAZ,2BACK4I,EAAM8T,MAAM1c,IADjB,IAEEkzB,cAAe,KACflxB,QAAS4G,EAAM8T,MAAM1c,GAAKkzB,mBAG7B47B,QAAQE,IAAe,SAACpmD,GAEvB,GAAKA,EAAMonD,mCAGJ,GAAIpnD,EAAMonD,kCAAmC,CAClD,IAAME,EAAqBtnD,EAAMonD,kCAAkCluD,QACjE,SAAC4nB,EAAGymC,GAAJ,OAAUzmC,EAAEzb,IAAIkiD,KAChB,IAAIC,KAEAC,EAAoB18B,GAAsB7xB,QAAoB,SAAC4nB,EAAGymC,GAAJ,OAAUzmC,EAAEzb,IAAIkiD,KAAI,IAAIC,KAE5Fz8B,GAAsBpyB,SAAQ,SAAC6J,GACxB8kD,EAAmBI,IAAIllD,KAC1BxC,EAAM8T,MAAMtR,GAAW2kD,OAI3BnnD,EAAMonD,kCAAkCzuD,SAAQ,SAAC6J,GAC1CilD,EAAkBC,IAAIllD,WAClBxC,EAAM8T,MAAMtR,YAjBvBxC,EAAM8T,MAAQqa,GAAara,MAC3B9T,EAAMuU,qBAAkBpK,EAqB1BnK,EAAMonD,kCAAoCr8B,SCpJ1CoD,GAA0B,CAC9BgQ,iBAAkB7G,GAAMkY,kBACxBpR,WAAY,KAGC0nB,gBAAyB33B,IAAc,SAAA83B,GAAO,OAC3DA,EAAQC,QAAQzuB,IAAW,SAACz3B,EAAD,GAAgD,IAAD,IAArC2hC,QAAWX,EAA0B,EAA1BA,MAAO5C,EAAmB,EAAnBA,WACrD,OAAO,2BACFp+B,GADL,IAEEm+B,iBAAkB6C,EAClB5C,qBCmBS0nB,gBAJsB,CACnCzvC,YAAa,KAG4B,SAAA4vC,GAAO,OAChDA,EACGC,QAAQhxC,IAAuB,SAAClV,EAAD,GAAmF,IAAD,MAAxE2hC,QAAWxrB,EAA6D,EAA7DA,MAAOhf,EAAsD,EAAtDA,QAAsD,IAA7Cif,QAA6C,gBAAX,GAAW,GAAlCJ,sBAAkC,MAAjB,EAAiB,EAC1GstC,EAA6CtjD,EAAMkjD,cACrDljD,EAAMkjD,cACLljD,EAAMkjD,cAAgB,GAC3BI,EAAUnsD,GAAV,UAAqBmsD,EAAUnsD,UAA/B,QAA2C,GAC3Cgf,EAAMxd,SAAQ,SAAAic,GAAS,IAAD,IACdI,EAAUL,GAAUC,GAC1B0uC,EAAUnsD,GAAS6d,GAAnB,UAA8BsuC,EAAUnsD,GAAS6d,UAAjD,QAA6D,GAC7DsuC,EAAUnsD,GAAS6d,GAASgB,IAAkB,UAACstC,EAAUnsD,GAAS6d,GAASgB,UAA7B,QAAgD,GAAK,QAGtGkwC,QACC/wC,IACA,SAACnV,EAAD,GAAmF,IAAD,IAAxE2hC,QAAWxqC,EAA6D,EAA7DA,QAASgf,EAAoD,EAApDA,MAAoD,IAA7CC,QAA6C,gBAAX,GAAW,GAAlCJ,sBAAkC,MAAjB,EAAiB,EAC1EstC,EAA6CtjD,EAAMkjD,cACrDljD,EAAMkjD,cACLljD,EAAMkjD,cAAgB,GAEtBI,EAAUnsD,IACfgf,EAAMxd,SAAQ,SAAAic,GACZ,IAAMI,EAAUL,GAAUC,GACrB0uC,EAAUnsD,GAAS6d,IACnBsuC,EAAUnsD,GAAS6d,GAASgB,KAEmB,IAAhDstC,EAAUnsD,GAAS6d,GAASgB,UACvBstC,EAAUnsD,GAAS6d,GAASgB,GAEnCstC,EAAUnsD,GAAS6d,GAASgB,YAKnCkwC,QAAQ9wC,IAA0B,SAACpV,EAAD,GAAkE,IAAD,MAAvD2hC,QAAWxqC,EAA4C,EAA5CA,QAASysD,EAAmC,EAAnCA,oBAAqBztC,EAAc,EAAdA,MACpFnW,EAAMqW,YAAYlf,GAAlB,UAA6B6I,EAAMqW,YAAYlf,UAA/C,QAA2D,GAC3Dgf,EAAMxd,SAAQ,SAAAic,GACZ,IAAMI,EAAUL,GAAUC,GACpBxb,EAAU4G,EAAMqW,YAAYlf,GAAS6d,GAC3C,GAAK5b,EAIE,CAAC,IAAD,EACL,IAAI,UAACA,EAAQwqD,2BAAT,QAAgC,IAAMA,EAAqB,OAC/D5jD,EAAMqW,YAAYlf,GAAS6d,GAAS4uC,oBAAsBA,OAL1D5jD,EAAMqW,YAAYlf,GAAS6d,GAAW,CACpC4uC,6BAQPsC,QAAQ7wC,IAA+B,SAACrV,EAAD,GAAkE,IAAD,MAAvD2hC,QAAWiiB,EAA4C,EAA5CA,oBAAqBzsD,EAAuB,EAAvBA,QAASgf,EAAc,EAAdA,MACzFnW,EAAMqW,YAAYlf,GAAlB,UAA6B6I,EAAMqW,YAAYlf,UAA/C,QAA2D,GAC3Dgf,EAAMxd,SAAQ,SAAAic,GACZ,IAAMI,EAAUL,GAAUC,GACpBxb,EAAU4G,EAAMqW,YAAYlf,GAAS6d,GACtC5b,GACDA,EAAQwqD,sBAAwBA,WAC3BxqD,EAAQwqD,oBACfxqD,EAAQpC,KAAO,KACfoC,EAAQ8G,YAAc0jD,SAI3BsC,QAAQ5wC,IAAwB,SAACtV,EAAD,GAA4D,IAAD,MAAjD2hC,QAAWxqC,EAAsC,EAAtCA,QAASygB,EAA6B,EAA7BA,QAAS1X,EAAoB,EAApBA,YACtEF,EAAMqW,YAAYlf,GAAlB,UAA6B6I,EAAMqW,YAAYlf,UAA/C,QAA2D,GAC3DyD,OAAOC,KAAK+c,GAASjf,SAAQ,SAAAqc,GAAY,IAAD,EAChC5b,EAAU4G,EAAMqW,YAAYlf,GAAS6d,IACvC,iBAAC5b,QAAD,IAACA,OAAD,EAACA,EAAS8G,mBAAV,QAAyB,GAAKA,IAClCF,EAAMqW,YAAYlf,GAAS6d,GAAW,CACpChe,KAAM4gB,EAAQ5C,GACd9U,yBCnFJynD,GAA2B,CAAC,OAAQ,gBACpCC,GAAcC,gBAAK,CAAEC,OAAQH,KAC/BC,GAAY3uC,OACd2uC,GAAY3uC,KAAKwtC,alIxBZ,WACL,IAAIsB,EAAQ,KACZ,IACE,IAAMC,EAAWj7C,aAAaC,QAAQ4L,IAClCovC,IACFD,EAAQ1vD,KAAKse,MAAMqxC,IAErB,MAAOxuD,GACP1B,QAAQ0B,MAAMA,GAGhB,OAAOuuD,EkIayBE,IAGlC,IAAMC,GAAQC,aAAe,CAC3BC,QAAS,CACPnoD,eACAgZ,QACAkf,gBACAuF,QACAyD,QACA2N,QACAx4B,aACAzC,SACAgyC,WAEFwC,WAAW,GAAD,mBAAMC,aAAqB,CAAEC,OAAO,KAApC,CAA8CC,gBAAK,CAAEV,OAAQH,OACvEc,eAAgBb,KAGlBM,GAAM9nD,SAASgmD,MAEA8B,UC7CA,SAASQ,GAAWrtD,GACjC,IAAMwK,EAAU,IAAI+mB,IAAavxB,GAEjC,OADAwK,EAAQtJ,gBAAkB,KACnBsJ,ECIT,IAAM8iD,GAAsBC,YAAoBxqD,IAgBjCyqD,GAda,SAAC,GAAkB,IAAhB78C,EAAe,EAAfA,SAC7B,OACE,eAAC,IAAD,CAAmB08C,WAAYA,GAA/B,SACE,eAACC,GAAD,CAAqBD,WAAYA,GAAjC,SACE,eAAC,IAAD,CAAUR,MAAOA,GAAjB,SACE,eAAC,GAAD,UACE,eAAC,IAAD,UAAgBl8C,a,6DCZ5B88C,KACGC,IAAIC,MACJD,IAAIE,MACJF,IAAIG,MACJC,KAAK,CACJC,QAAS,CACPC,SAAS,0BAEXC,MAAO,CACLC,aAAa,GAEfC,YAAa,KACbC,QAAS,CAAC,MACVC,cAAc,EACdC,cAAe,CAAEC,aAAa,KAGnBd,GAAf,ECRI,aAAch8C,SACfA,OAAOK,SAAiB08C,4BAA6B,GAGxD/8C,OAAO2gB,iBAAiB,SAAS,WAAO,IAAD,EACxB,QAAZ,EAAA1gB,oBAAA,SAAcw2B,WAAW,sCAG5BumB,IAASC,OACP,eAAC,aAAD,UACE,gBAAC,GAAD,WACE,uCACE,eAAC,GAAD,IACA,eAAC,GAAD,IACA,eAAC,GAAD,IACA,eAAC,GAAD,IACA,eAAC,GAAD,OAEF,eAAC,IAAD,IACA,eAACC,EAAD,IACA,eAAClK,GAAD,SAGJtyB,SAASy8B,eAAe,W","file":"static/js/main.22c6ba45.chunk.js","sourcesContent":["import { createGlobalStyle } from 'styled-components'\n\nconst GlobalStyle = createGlobalStyle`\n body {\n background-color: #081832;\n\n img {\n height: auto;\n max-width: 100%;\n }\n }\n`\n\nexport default GlobalStyle\n","import { ConnectorUpdate } from '@web3-react/types'\nimport { AbstractConnector } from '@web3-react/abstract-connector'\nimport invariant from 'tiny-invariant'\n\ninterface NetworkConnectorArguments {\n urls: { [chainId: number]: string }\n defaultChainId?: number\n}\n\n// taken from ethers.js, compatible interface with web3 provider\ntype AsyncSendable = {\n isMetaMask?: boolean\n host?: string\n path?: string\n sendAsync?: (request: any, callback: (error: any, response: any) => void) => void\n send?: (request: any, callback: (error: any, response: any) => void) => void\n}\n\nclass RequestError extends Error {\n constructor(message: string, public code: number, public data?: unknown) {\n super(message)\n }\n}\n\ninterface BatchItem {\n request: { jsonrpc: '2.0'; id: number; method: string; params: unknown }\n resolve: (result: any) => void\n reject: (error: Error) => void\n}\n\nclass MiniRpcProvider implements AsyncSendable {\n public readonly isMetaMask: false = false\n\n public readonly chainId: number\n\n public readonly url: string\n\n public readonly host: string\n\n public readonly path: string\n\n public readonly batchWaitTimeMs: number\n\n private nextId = 1\n\n private batchTimeoutId: ReturnType | null = null\n\n private batch: BatchItem[] = []\n\n constructor(chainId: number, url: string, batchWaitTimeMs?: number) {\n this.chainId = chainId\n this.url = url\n const parsed = new URL(url)\n this.host = parsed.host\n this.path = parsed.pathname\n // how long to wait to batch calls\n this.batchWaitTimeMs = batchWaitTimeMs ?? 50\n }\n\n public readonly clearBatch = async () => {\n console.info('Clearing batch', this.batch)\n const { batch } = this\n this.batch = []\n this.batchTimeoutId = null\n\n let response: Response\n try {\n response = await fetch(this.url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify(batch.map((item) => item.request)),\n })\n } catch (error) {\n batch.forEach(({ reject }) => reject(new Error('Failed to send batch call')))\n return\n }\n\n if (!response.ok) {\n batch.forEach(({ reject }) => reject(new RequestError(`${response.status}: ${response.statusText}`, -32000)))\n return\n }\n\n let json\n try {\n json = await response.json()\n } catch (error) {\n batch.forEach(({ reject }) => reject(new Error('Failed to parse JSON response')))\n return\n }\n const byKey = batch.reduce<{ [id: number]: BatchItem }>((memo, current) => {\n memo[current.request.id] = current\n return memo\n }, {})\n\n // eslint-disable-next-line no-restricted-syntax\n for (const result of json) {\n const {\n resolve,\n reject,\n request: { method },\n } = byKey[result.id]\n if (resolve) {\n if ('error' in result) {\n reject(new RequestError(result?.error?.message, result?.error?.code, result?.error?.data))\n } else if ('result' in result) {\n resolve(result.result)\n } else {\n reject(new RequestError(`Received unexpected JSON-RPC response to ${method} request.`, -32000, result))\n }\n }\n }\n }\n\n public readonly sendAsync = (\n request: { jsonrpc: '2.0'; id: number | string | null; method: string; params?: any },\n callback: (error: any, response: any) => void\n ): void => {\n this.request(request.method, request.params)\n .then((result) => callback(null, { jsonrpc: '2.0', id: request.id, result }))\n .catch((error) => callback(error, null))\n }\n\n public readonly request = async (\n method: string | { method: string; params: unknown[] },\n params?: any\n ): Promise => {\n if (typeof method !== 'string') {\n return this.request(method.method, method.params)\n }\n if (method === 'eth_chainId') {\n return `0x${this.chainId.toString(16)}`\n }\n const promise = new Promise((resolve, reject) => {\n this.batch.push({\n request: {\n jsonrpc: '2.0',\n id: this.nextId++,\n method,\n params,\n },\n resolve,\n reject,\n })\n })\n this.batchTimeoutId = this.batchTimeoutId ?? setTimeout(this.clearBatch, this.batchWaitTimeMs)\n return promise\n }\n}\n\nexport class NetworkConnector extends AbstractConnector {\n private readonly providers: { [chainId: number]: MiniRpcProvider }\n\n private currentChainId: number\n\n constructor({ urls, defaultChainId }: NetworkConnectorArguments) {\n invariant(defaultChainId || Object.keys(urls).length === 1, 'defaultChainId is a required argument with >1 url')\n super({ supportedChainIds: Object.keys(urls).map((k): number => Number(k)) })\n\n this.currentChainId = defaultChainId || Number(Object.keys(urls)[0])\n this.providers = Object.keys(urls).reduce<{ [chainId: number]: MiniRpcProvider }>((accumulator, chainId) => {\n accumulator[Number(chainId)] = new MiniRpcProvider(Number(chainId), urls[Number(chainId)])\n return accumulator\n }, {})\n }\n\n public get provider(): MiniRpcProvider {\n return this.providers[this.currentChainId]\n }\n\n public async activate(): Promise {\n return { provider: this.providers[this.currentChainId], chainId: this.currentChainId, account: null }\n }\n\n public async getProvider(): Promise {\n return this.providers[this.currentChainId]\n }\n\n public async getChainId(): Promise {\n return this.currentChainId\n }\n\n public async getAccount(): Promise {\n return null\n }\n\n public deactivate() {\n return null\n }\n}\n\nexport default NetworkConnector\n","import { ConnectorNames } from '@doublemoondev/doublemoon-uikit'\nimport { Web3Provider } from '@ethersproject/providers'\nimport { InjectedConnector } from '@web3-react/injected-connector'\nimport { WalletConnectConnector } from '@web3-react/walletconnect-connector'\nimport { WalletLinkConnector } from '@web3-react/walletlink-connector'\nimport { BscConnector } from '@binance-chain/bsc-connector'\nimport { NetworkConnector } from './NetworkConnector'\n\nconst NETWORK_URL = process.env.REACT_APP_NETWORK_URL\n\nexport const NETWORK_CHAIN_ID: number = parseInt(process.env.REACT_APP_CHAIN_ID ?? '56')\n\nif (typeof NETWORK_URL === 'undefined') {\n throw new Error(`REACT_APP_NETWORK_URL must be a defined environment variable`)\n}\n\nexport const network = new NetworkConnector({\n urls: { [NETWORK_CHAIN_ID]: NETWORK_URL },\n})\n\nlet networkLibrary: Web3Provider | undefined\nexport function getNetworkLibrary(): Web3Provider {\n // eslint-disable-next-line no-return-assign\n return (networkLibrary = networkLibrary ?? new Web3Provider(network.provider as any))\n}\n\nexport const injected = new InjectedConnector({\n supportedChainIds: [56, 97],\n})\n\nexport const bscConnector = new BscConnector({ supportedChainIds: [56] })\n\n// mainnet only\nexport const walletconnect = new WalletConnectConnector({\n rpc: { [NETWORK_CHAIN_ID]: NETWORK_URL },\n bridge: 'https://bridge.walletconnect.org',\n qrcode: true,\n pollingInterval: 15000,\n})\n\n// mainnet only\nexport const walletlink = new WalletLinkConnector({\n url: NETWORK_URL,\n appName: 'Uniswap',\n appLogoUrl:\n 'https://mpng.pngfly.com/20181202/bex/kisspng-emoji-domain-unicorn-pin-badges-sticker-unicorn-tumblr-emoji-unicorn-iphoneemoji-5c046729264a77.5671679315437924251569.jpg',\n})\n\nexport const connectorsByName: { [connectorName in ConnectorNames]: any } = {\n [ConnectorNames.Injected]: injected,\n [ConnectorNames.WalletConnect]: walletconnect,\n [ConnectorNames.BSC]: bscConnector,\n}\n","import { ChainId, JSBI, Percent, Token, WETH } from '@doublemoondev/sdk'\n\nexport const ROUTER_ADDRESS = '0x10ED43C718714eb63d5aA57B78B54704E256024E'\n\n// a list of tokens by chain\ntype ChainTokenList = {\n readonly [chainId in ChainId]: Token[]\n}\n\nexport const DOUBLEMOON = '0x0314e5a39806C30D67B869EE1bCDABee7e08dE74'\nexport const CAKE = new Token(ChainId.MAINNET, '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82', 18, 'CAKE', 'PancakeSwap Token')\nexport const WBNB = new Token(ChainId.MAINNET, '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c', 18, 'WBNB', 'Wrapped BNB')\nexport const DAI = new Token(ChainId.MAINNET, '0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3', 18, 'DAI', 'Dai Stablecoin')\nexport const BUSD = new Token(ChainId.MAINNET, '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56', 18, 'BUSD', 'Binance USD')\nexport const BTCB = new Token(ChainId.MAINNET, '0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c', 18, 'BTCB', 'Binance BTC')\nexport const USDT = new Token(ChainId.MAINNET, '0x55d398326f99059fF775485246999027B3197955', 18, 'USDT', 'Tether USD')\nexport const UST = new Token(\n ChainId.MAINNET,\n '0x23396cF899Ca06c4472205fC903bDB4de249D6fC',\n 18,\n 'UST',\n 'Wrapped UST Token'\n)\nexport const ETH = new Token(\n ChainId.MAINNET,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'Binance-Peg Ethereum Token'\n)\n\nconst WETH_ONLY: ChainTokenList = {\n [ChainId.MAINNET]: [WETH[ChainId.MAINNET]],\n [ChainId.BSCTESTNET]: [WETH[ChainId.BSCTESTNET]],\n}\n\n// used to construct intermediary pairs for trading\nexport const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n ...WETH_ONLY,\n [ChainId.MAINNET]: [...WETH_ONLY[ChainId.MAINNET], DAI, BUSD, BTCB, USDT, UST, ETH],\n}\n\n/**\n * Some tokens can only be swapped via certain pairs, so we override the list of bases that are considered for these\n * tokens.\n */\nexport const CUSTOM_BASES: { [chainId in ChainId]?: { [tokenAddress: string]: Token[] } } = {\n [ChainId.MAINNET]: {},\n}\n\n// used for display in the default list when adding liquidity\nexport const SUGGESTED_BASES: ChainTokenList = {\n ...WETH_ONLY,\n [ChainId.MAINNET]: [...WETH_ONLY[ChainId.MAINNET], DAI, BUSD, USDT],\n}\n\n// used to construct the list of all pairs we consider by default in the frontend\nexport const BASES_TO_TRACK_LIQUIDITY_FOR: ChainTokenList = {\n ...WETH_ONLY,\n [ChainId.MAINNET]: [...WETH_ONLY[ChainId.MAINNET], DAI, BUSD, BTCB, USDT],\n}\n\nexport const PINNED_PAIRS: { readonly [chainId in ChainId]?: [Token, Token][] } = {\n [ChainId.MAINNET]: [\n [CAKE, WBNB],\n [BUSD, USDT],\n [DAI, USDT],\n ],\n}\n\nexport const NetworkContextName = 'NETWORK'\n\n// default allowed slippage, in bips\nexport const INITIAL_ALLOWED_SLIPPAGE = 700\n// 20 minutes, denominated in seconds\nexport const DEFAULT_DEADLINE_FROM_NOW = 60 * 20\n\n// one basis point\nexport const ONE_BIPS = new Percent(JSBI.BigInt(1), JSBI.BigInt(10000))\nexport const BIPS_BASE = JSBI.BigInt(10000)\n// used for warning states\nexport const ALLOWED_PRICE_IMPACT_LOW: Percent = new Percent(JSBI.BigInt(100), BIPS_BASE) // 1%\nexport const ALLOWED_PRICE_IMPACT_MEDIUM: Percent = new Percent(JSBI.BigInt(300), BIPS_BASE) // 3%\nexport const ALLOWED_PRICE_IMPACT_HIGH: Percent = new Percent(JSBI.BigInt(500), BIPS_BASE) // 5%\n// if the price slippage exceeds this number, force the user to type 'confirm' to execute\nexport const PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN: Percent = new Percent(JSBI.BigInt(1000), BIPS_BASE) // 10%\n// for non expert mode disable swaps above this\nexport const BLOCKED_PRICE_IMPACT_NON_EXPERT: Percent = new Percent(JSBI.BigInt(1500), BIPS_BASE) // 15%\n\n// used to ensure the user doesn't send so much ETH so they end up with <.01\nexport const MIN_ETH: JSBI = JSBI.exponentiate(JSBI.BigInt(10), JSBI.BigInt(16)) // .01 ETH\n","import { Web3Provider } from '@ethersproject/providers'\nimport { ChainId } from '@doublemoondev/sdk'\nimport { connectorLocalStorageKey } from '@doublemoondev/doublemoon-uikit'\nimport { useWeb3React as useWeb3ReactCore } from '@web3-react/core'\n// eslint-disable-next-line import/no-unresolved\nimport { Web3ReactContextInterface } from '@web3-react/core/dist/types'\nimport { useEffect, useState } from 'react'\nimport { isMobile } from 'react-device-detect'\nimport { injected } from '../connectors'\nimport { NetworkContextName } from '../constants'\n\nexport function useActiveWeb3React(): Web3ReactContextInterface & { chainId?: ChainId } {\n const context = useWeb3ReactCore()\n const contextNetwork = useWeb3ReactCore(NetworkContextName)\n return context.active ? context : contextNetwork\n}\n\nexport function useEagerConnect() {\n const { activate, active } = useWeb3ReactCore() // specifically using useWeb3ReactCore because of what this hook does\n const [tried, setTried] = useState(false)\n\n useEffect(() => {\n injected.isAuthorized().then((isAuthorized) => {\n const hasSignedIn = window.localStorage.getItem(connectorLocalStorageKey)\n if (isAuthorized && hasSignedIn) {\n activate(injected, undefined, true).catch(() => {\n setTried(true)\n })\n } else if (isMobile && window.ethereum && hasSignedIn) {\n activate(injected, undefined, true).catch(() => {\n setTried(true)\n })\n } else {\n setTried(true)\n }\n })\n }, [activate]) // intentionally only running on mount (make sure it's only mounted once :))\n\n // if the connection worked, wait until we get confirmation of that to flip the flag\n useEffect(() => {\n if (active) {\n setTried(true)\n }\n }, [active])\n\n return tried\n}\n\n/**\n * Use for network and injected - logs user in\n * and out after checking what network theyre on\n */\nexport function useInactiveListener(suppress = false) {\n const { active, error, activate } = useWeb3ReactCore() // specifically using useWeb3React because of what this hook does\n\n useEffect(() => {\n const { ethereum } = window\n\n if (ethereum && ethereum.on && !active && !error && !suppress) {\n const handleChainChanged = () => {\n // eat errors\n activate(injected, undefined, true).catch((e) => {\n console.error('Failed to activate after chain changed', e)\n })\n }\n\n const handleAccountsChanged = (accounts: string[]) => {\n if (accounts.length > 0) {\n // eat errors\n activate(injected, undefined, true).catch((e) => {\n console.error('Failed to activate after accounts changed', e)\n })\n }\n }\n\n ethereum.on('chainChanged', handleChainChanged)\n ethereum.on('accountsChanged', handleAccountsChanged)\n\n return () => {\n if (ethereum.removeListener) {\n ethereum.removeListener('chainChanged', handleChainChanged)\n ethereum.removeListener('accountsChanged', handleAccountsChanged)\n }\n }\n }\n return undefined\n }, [active, error, suppress, activate])\n}\n","import { createAction } from '@reduxjs/toolkit'\nimport { TokenList } from '@uniswap/token-lists'\n\nexport type PopupContent =\n | {\n txn: {\n hash: string\n success: boolean\n summary?: string\n }\n }\n | {\n listUpdate: {\n listUrl: string\n oldList: TokenList\n newList: TokenList\n auto: boolean\n }\n }\n\nexport const updateBlockNumber = createAction<{ chainId: number; blockNumber: number }>('app/updateBlockNumber')\nexport const toggleWalletModal = createAction('app/toggleWalletModal')\nexport const toggleSettingsMenu = createAction('app/toggleSettingsMenu')\nexport const addPopup = createAction<{ key?: string; removeAfterMs?: number | null; content: PopupContent }>(\n 'app/addPopup'\n)\nexport const removePopup = createAction<{ key: string }>('app/removePopup')\n","import { useCallback, useMemo } from 'react'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { addPopup, PopupContent, removePopup, toggleWalletModal, toggleSettingsMenu } from './actions'\nimport { AppState } from '../index'\n\nexport function useBlockNumber(): number | undefined {\n const { chainId } = useActiveWeb3React()\n\n return useSelector((state: AppState) => state.application.blockNumber[chainId ?? -1])\n}\n\nexport function useWalletModalOpen(): boolean {\n return useSelector((state: AppState) => state.application.walletModalOpen)\n}\n\nexport function useWalletModalToggle(): () => void {\n const dispatch = useDispatch()\n return useCallback(() => dispatch(toggleWalletModal()), [dispatch])\n}\n\nexport function useSettingsMenuOpen(): boolean {\n return useSelector((state: AppState) => state.application.settingsMenuOpen)\n}\n\nexport function useToggleSettingsMenu(): () => void {\n const dispatch = useDispatch()\n return useCallback(() => dispatch(toggleSettingsMenu()), [dispatch])\n}\n\n// returns a function that allows adding a popup\nexport function useAddPopup(): (content: PopupContent, key?: string) => void {\n const dispatch = useDispatch()\n\n return useCallback(\n (content: PopupContent, key?: string) => {\n dispatch(addPopup({ content, key }))\n },\n [dispatch]\n )\n}\n\n// returns a function that allows removing a popup via its key\nexport function useRemovePopup(): (key: string) => void {\n const dispatch = useDispatch()\n return useCallback(\n (key: string) => {\n dispatch(removePopup({ key }))\n },\n [dispatch]\n )\n}\n\n// get the list of active popups\nexport function useActivePopups(): AppState['application']['popupList'] {\n const list = useSelector((state: AppState) => state.application.popupList)\n return useMemo(() => list.filter(item => item.show), [list])\n}\n","import styled from 'styled-components'\n\nconst Column = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n`\nexport const ColumnCenter = styled(Column)`\n width: 100%;\n align-items: center;\n`\n\nexport const AutoColumn = styled.div<{\n gap?: 'sm' | 'md' | 'lg' | string\n justify?: 'stretch' | 'center' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'space-between'\n}>`\n display: grid;\n grid-auto-rows: auto;\n grid-row-gap: ${({ gap }) => (gap === 'sm' && '8px') || (gap === 'md' && '12px') || (gap === 'lg' && '24px') || gap};\n justify-items: ${({ justify }) => justify && justify};\n`\n\nexport default Column\n","import { ActionCreatorWithPayload, createAction } from '@reduxjs/toolkit'\nimport { TokenList, Version } from '@uniswap/token-lists'\n\nexport const fetchTokenList: Readonly<{\n pending: ActionCreatorWithPayload<{ url: string; requestId: string }>\n fulfilled: ActionCreatorWithPayload<{ url: string; tokenList: TokenList; requestId: string }>\n rejected: ActionCreatorWithPayload<{ url: string; errorMessage: string; requestId: string }>\n}> = {\n pending: createAction('lists/fetchTokenList/pending'),\n fulfilled: createAction('lists/fetchTokenList/fulfilled'),\n rejected: createAction('lists/fetchTokenList/rejected')\n}\n\nexport const acceptListUpdate = createAction('lists/acceptListUpdate')\nexport const addList = createAction('lists/addList')\nexport const removeList = createAction('lists/removeList')\nexport const selectList = createAction('lists/selectList')\nexport const rejectVersionUpdate = createAction('lists/rejectVersionUpdate')\n","import { Version } from '@uniswap/token-lists'\n\nexport default function listVersionLabel(version: Version): string {\n return `v${version.major}.${version.minor}.${version.patch}`\n}\n","import styled from 'styled-components'\nimport { Box } from 'rebass/styled-components'\n\nconst Row = styled(Box)<{ align?: string; padding?: string; border?: string; borderRadius?: string }>`\n width: 100%;\n display: flex;\n padding: 0;\n align-items: ${({ align }) => (align || 'center')};\n padding: ${({ padding }) => padding};\n border: ${({ border }) => border};\n border-radius: ${({ borderRadius }) => borderRadius};\n`\n\nexport const RowBetween = styled(Row)`\n justify-content: space-between;\n`\n\nexport const RowFlat = styled.div`\n display: flex;\n align-items: flex-end;\n`\n\nexport const AutoRow = styled(Row)<{ gap?: string; justify?: string }>`\n flex-wrap: wrap;\n margin: ${({ gap }) => gap && `-${gap}`};\n justify-content: ${({ justify }) => justify && justify};\n\n & > * {\n margin: ${({ gap }) => gap} !important;\n }\n`\n\nexport const RowFixed = styled(Row)<{ gap?: string; justify?: string }>`\n width: fit-content;\n margin: ${({ gap }) => gap && `-${gap}`};\n`\n\nexport default Row\n","import React, { useCallback, useMemo } from 'react'\nimport { diffTokenLists, TokenList } from '@uniswap/token-lists'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport { useDispatch } from 'react-redux'\nimport { AppDispatch } from '../../state'\nimport { useRemovePopup } from '../../state/application/hooks'\nimport { acceptListUpdate } from '../../state/lists/actions'\nimport listVersionLabel from '../../utils/listVersionLabel'\nimport { AutoColumn } from '../Column'\nimport { AutoRow } from '../Row'\n\nexport default function ListUpdatePopup({\n popKey,\n listUrl,\n oldList,\n newList,\n auto,\n}: {\n popKey: string\n listUrl: string\n oldList: TokenList\n newList: TokenList\n auto: boolean\n}) {\n const removePopup = useRemovePopup()\n const removeThisPopup = useCallback(() => removePopup(popKey), [popKey, removePopup])\n const dispatch = useDispatch()\n\n const handleAcceptUpdate = useCallback(() => {\n if (auto) return\n dispatch(acceptListUpdate(listUrl))\n removeThisPopup()\n }, [auto, dispatch, listUrl, removeThisPopup])\n\n const { added: tokensAdded, changed: tokensChanged, removed: tokensRemoved } = useMemo(() => {\n return diffTokenLists(oldList.tokens, newList.tokens)\n }, [newList.tokens, oldList.tokens])\n const numTokensChanged = useMemo(\n () =>\n Object.keys(tokensChanged).reduce((memo, chainId: any) => memo + Object.keys(tokensChanged[chainId]).length, 0),\n [tokensChanged]\n )\n\n return (\n \n \n {auto ? (\n \n The token list "{oldList.name}" has been updated to{' '}\n {listVersionLabel(newList.version)}.\n \n ) : (\n <>\n
\n \n An update is available for the token list "{oldList.name}" (\n {listVersionLabel(oldList.version)} to {listVersionLabel(newList.version)}).\n \n
    \n {tokensAdded.length > 0 ? (\n
  • \n {tokensAdded.map((token, i) => (\n \n {token.symbol}\n {i === tokensAdded.length - 1 ? null : ', '}\n \n ))}{' '}\n added\n
  • \n ) : null}\n {tokensRemoved.length > 0 ? (\n
  • \n {tokensRemoved.map((token, i) => (\n \n {token.symbol}\n {i === tokensRemoved.length - 1 ? null : ', '}\n \n ))}{' '}\n removed\n
  • \n ) : null}\n {numTokensChanged > 0 ?
  • {numTokensChanged} tokens updated
  • : null}\n
\n
\n \n
\n \n
\n
\n \n
\n
\n \n )}\n
\n
\n )\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { getAddress } from '@ethersproject/address'\nimport { AddressZero } from '@ethersproject/constants'\nimport { JsonRpcSigner, Web3Provider } from '@ethersproject/providers'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { abi as IUniswapV2Router02ABI } from '@uniswap/v2-periphery/build/IUniswapV2Router02.json'\nimport { ChainId, JSBI, Percent, Token, CurrencyAmount, Currency, ETHER } from '@doublemoondev/sdk'\nimport { ROUTER_ADDRESS } from '../constants'\nimport { TokenAddressMap } from '../state/lists/hooks'\n\n// returns the checksummed address if the address is valid, otherwise returns false\nexport function isAddress(value: any): string | false {\n try {\n return getAddress(value)\n } catch {\n return false\n }\n}\n\nconst BSCSCAN_PREFIXES: { [chainId in ChainId]: string } = {\n 56: '',\n 97: 'testnet.'\n}\n\nexport function getBscScanLink(chainId: ChainId, data: string, type: 'transaction' | 'token' | 'address'): string {\n const prefix = `https://${BSCSCAN_PREFIXES[chainId] || BSCSCAN_PREFIXES[ChainId.MAINNET]}bscscan.com`\n\n switch (type) {\n case 'transaction': {\n return `${prefix}/tx/${data}`\n }\n case 'token': {\n return `${prefix}/token/${data}`\n }\n case 'address':\n default: {\n return `${prefix}/address/${data}`\n }\n }\n}\n\n// shorten the checksummed version of the input address to have 0x + 4 characters at start and end\nexport function shortenAddress(address: string, chars = 4): string {\n const parsed = isAddress(address)\n if (!parsed) {\n throw Error(`Invalid 'address' parameter '${address}'.`)\n }\n return `${parsed.substring(0, chars + 2)}...${parsed.substring(42 - chars)}`\n}\n\n// add 10%\nexport function calculateGasMargin(value: BigNumber): BigNumber {\n return value.mul(BigNumber.from(10000).add(BigNumber.from(1000))).div(BigNumber.from(10000))\n}\n\n// converts a basis points value to a sdk percent\nexport function basisPointsToPercent(num: number): Percent {\n return new Percent(JSBI.BigInt(Math.floor(num)), JSBI.BigInt(10000))\n}\n\nexport function calculateSlippageAmount(value: CurrencyAmount, slippage: number): [JSBI, JSBI] {\n if (slippage < 0 || slippage > 10000) {\n throw Error(`Unexpected slippage value: ${slippage}`)\n }\n return [\n JSBI.divide(JSBI.multiply(value.raw, JSBI.BigInt(10000 - slippage)), JSBI.BigInt(10000)),\n JSBI.divide(JSBI.multiply(value.raw, JSBI.BigInt(10000 + slippage)), JSBI.BigInt(10000))\n ]\n}\n\n// account is not optional\nexport function getSigner(library: Web3Provider, account: string): JsonRpcSigner {\n return library.getSigner(account).connectUnchecked()\n}\n\n// account is optional\nexport function getProviderOrSigner(library: Web3Provider, account?: string): Web3Provider | JsonRpcSigner {\n return account ? getSigner(library, account) : library\n}\n\n// account is optional\nexport function getContract(address: string, ABI: any, library: Web3Provider, account?: string): Contract {\n if (!isAddress(address) || address === AddressZero) {\n throw Error(`Invalid 'address' parameter '${address}'.`)\n }\n\n return new Contract(address, ABI, getProviderOrSigner(library, account) as any)\n}\n\n// account is optional\nexport function getRouterContract(_: number, library: Web3Provider, account?: string): Contract {\n return getContract(ROUTER_ADDRESS, IUniswapV2Router02ABI, library, account)\n}\n\nexport function escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // $& means the whole matched string\n}\n\nexport function isTokenOnList(defaultTokens: TokenAddressMap, currency?: Currency): boolean {\n if (currency === ETHER) return true\n return Boolean(currency instanceof Token && defaultTokens[currency.chainId]?.[currency.address])\n}\n","import React, { HTMLProps, useCallback } from 'react'\nimport { Link } from 'react-router-dom'\nimport styled, { keyframes } from 'styled-components'\n\n// A button that triggers some onClick result, but looks like a link.\nexport const LinkStyledButton = styled.button<{ disabled?: boolean }>`\n border: none;\n text-decoration: none;\n background: none;\n\n cursor: ${({ disabled }) => (disabled ? 'default' : 'pointer')};\n color: ${({ theme, disabled }) => (disabled ? theme.colors.textSubtle : theme.colors.primary)};\n font-weight: 500;\n\n :hover {\n text-decoration: ${({ disabled }) => (disabled ? null : 'underline')};\n }\n\n :focus {\n outline: none;\n text-decoration: ${({ disabled }) => (disabled ? null : 'underline')};\n }\n\n :active {\n text-decoration: none;\n }\n`\n\n// An internal link from the react-router-dom library that is correctly styled\nexport const StyledInternalLink = styled(Link)`\n text-decoration: none;\n cursor: pointer;\n color: ${({ theme }) => theme.colors.primary};\n font-weight: 500;\n\n :hover {\n text-decoration: underline;\n }\n\n :focus {\n outline: none;\n text-decoration: underline;\n }\n\n :active {\n text-decoration: none;\n }\n`\n\nconst StyledLink = styled.a`\n text-decoration: none;\n cursor: pointer;\n color: ${({ theme }) => theme.colors.primary};\n font-weight: 500;\n\n :hover {\n text-decoration: underline;\n }\n\n :focus {\n outline: none;\n text-decoration: underline;\n }\n\n :active {\n text-decoration: none;\n }\n`\n\n/**\n * Outbound link that handles firing google analytics events\n */\nexport function ExternalLink({\n target = '_blank',\n href,\n rel = 'noopener noreferrer',\n ...rest\n}: Omit, 'as' | 'ref' | 'onClick'> & { href: string }) {\n const handleClick = useCallback(\n (event: React.MouseEvent) => {\n if (!(target === '_blank' || event.ctrlKey || event.metaKey)) {\n event.preventDefault()\n }\n },\n [target]\n )\n return \n}\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nexport const Spinner = styled.img`\n animation: 2s ${rotate} linear infinite;\n width: 16px;\n height: 16px;\n`\n","import React, { useContext } from 'react'\nimport { AlertCircle, CheckCircle } from 'react-feather'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport styled, { ThemeContext } from 'styled-components'\nimport { useActiveWeb3React } from '../../hooks'\nimport { getBscScanLink } from '../../utils'\nimport { ExternalLink } from '../Shared'\nimport { AutoColumn } from '../Column'\nimport { AutoRow } from '../Row'\n\nconst RowNoFlex = styled(AutoRow)`\n flex-wrap: nowrap;\n`\n\nexport default function TransactionPopup({\n hash,\n success,\n summary,\n}: {\n hash: string\n success?: boolean\n summary?: string\n}) {\n const { chainId } = useActiveWeb3React()\n\n const theme = useContext(ThemeContext)\n\n return (\n \n
\n {success ? (\n \n ) : (\n \n )}\n
\n \n {summary ?? `Hash: ${hash.slice(0, 8)}...${hash.slice(58, 65)}`}\n {chainId && View on bscscan}\n \n
\n )\n}\n","import React, { useCallback, useContext, useEffect } from 'react'\nimport { X } from 'react-feather'\nimport { useSpring } from 'react-spring/web'\nimport styled, { ThemeContext } from 'styled-components'\nimport { animated } from 'react-spring'\nimport { PopupContent } from '../../state/application/actions'\nimport { useRemovePopup } from '../../state/application/hooks'\nimport ListUpdatePopup from './ListUpdatePopup'\nimport TransactionPopup from './TransactionPopup'\n\nexport const StyledClose = styled(X)`\n position: absolute;\n right: 10px;\n top: 10px;\n\n :hover {\n cursor: pointer;\n }\n`\nexport const Popup = styled.div`\n display: inline-block;\n width: 100%;\n padding: 1em;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n position: relative;\n border-radius: 10px;\n padding: 20px;\n padding-right: 35px;\n overflow: hidden;\n\n ${({ theme }) => theme.mediaQueries.sm} {\n min-width: 290px;\n }\n`\nconst Fader = styled.div`\n position: absolute;\n bottom: 0px;\n left: 0px;\n width: 100%;\n height: 2px;\n background-color: ${({ theme }) => theme.colors.tertiary};\n`\n\nconst AnimatedFader = animated(Fader)\n\nexport default function PopupItem({\n removeAfterMs,\n content,\n popKey\n}: {\n removeAfterMs: number | null\n content: PopupContent\n popKey: string\n}) {\n const removePopup = useRemovePopup()\n const removeThisPopup = useCallback(() => removePopup(popKey), [popKey, removePopup])\n useEffect(() => {\n if (removeAfterMs === null) return undefined\n\n const timeout = setTimeout(() => {\n removeThisPopup()\n }, removeAfterMs)\n\n return () => {\n clearTimeout(timeout)\n }\n }, [removeAfterMs, removeThisPopup])\n\n const theme = useContext(ThemeContext)\n\n let popupContent\n if ('txn' in content) {\n const {\n txn: { hash, success, summary }\n } = content\n popupContent = \n } else if ('listUpdate' in content) {\n const {\n listUpdate: { listUrl, oldList, newList, auto }\n } = content\n popupContent = \n }\n\n const faderStyle = useSpring({\n from: { width: '100%' },\n to: { width: '0%' },\n config: { duration: removeAfterMs ?? undefined }\n })\n\n return (\n \n \n {popupContent}\n {removeAfterMs !== null ? : null}\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { useActivePopups } from '../../state/application/hooks'\nimport { AutoColumn } from '../Column'\nimport PopupItem from './PopupItem'\n\nconst MobilePopupWrapper = styled.div<{ height: string | number }>`\n position: relative;\n max-width: 100%;\n height: ${({ height }) => height};\n margin: ${({ height }) => (height ? '0 auto;' : 0)};\n margin-bottom: ${({ height }) => (height ? '20px' : 0)}};\n display: none;\n\n ${({ theme }) => theme.mediaQueries.sm} {\n display: block;\n }\n`\n\nconst MobilePopupInner = styled.div`\n height: 99%;\n overflow-x: auto;\n overflow-y: hidden;\n display: flex;\n flex-direction: row;\n -webkit-overflow-scrolling: touch;\n ::-webkit-scrollbar {\n display: none;\n }\n`\n\nconst FixedPopupColumn = styled(AutoColumn)`\n position: fixed;\n top: 64px;\n right: 1rem;\n max-width: 355px !important;\n width: 100%;\n z-index: 2;\n\n ${({ theme }) => theme.mediaQueries.sm} {\n display: none;\n }\n`\n\nexport default function Popups() {\n // get all popups\n const activePopups = useActivePopups()\n\n return (\n <>\n \n {activePopups.map((item) => (\n \n ))}\n \n 0 ? 'fit-content' : 0}>\n \n {activePopups // reverse so new items up front\n .slice(0)\n .reverse()\n .map((item) => (\n \n ))}\n \n \n \n )\n}\n","import React from 'react'\n\nimport styled, { keyframes } from 'styled-components'\n\nconst rotate = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`\n\nconst StyledSVG = styled.svg<{ size: string; stroke?: string }>`\n animation: 2s ${rotate} linear infinite;\n height: ${({ size }) => size};\n width: ${({ size }) => size};\n path {\n stroke: ${({ stroke, theme }) => stroke ?? theme.colors.primary};\n }\n`\n\n/**\n * Takes in custom size and stroke for circle color, default to primary color as fill,\n * need ...rest for layered styles on top\n */\nexport default function Loader({ size = '16px', stroke, ...rest }: { size?: string; stroke?: string }) {\n return (\n \n \n \n )\n}\n","import React, { useState, useEffect } from 'react'\nimport { useWeb3React } from '@web3-react/core'\nimport styled from 'styled-components'\nimport { useTranslation } from 'react-i18next'\n\nimport { network } from '../../connectors'\nimport { useEagerConnect, useInactiveListener } from '../../hooks'\nimport { NetworkContextName } from '../../constants'\nimport Loader from '../Loader'\n\nconst MessageWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 20rem;\n`\n\nconst Message = styled.h2`\n color: ${({ theme }) => theme.colors.primaryDark};\n`\n\nexport default function Web3ReactManager({ children }: { children: JSX.Element }) {\n const { t } = useTranslation()\n const { active } = useWeb3React()\n const { active: networkActive, error: networkError, activate: activateNetwork } = useWeb3React(NetworkContextName)\n\n // try to eagerly connect to an injected provider, if it exists and has granted access already\n const triedEager = useEagerConnect()\n\n // after eagerly trying injected, if the network connect ever isn't active or in an error state, activate itd\n useEffect(() => {\n if (triedEager && !networkActive && !networkError && !active) {\n activateNetwork(network)\n }\n }, [triedEager, networkActive, networkError, activateNetwork, active])\n\n // when there's no account connected, react to logins (broadly speaking) on the injected provider, if it exists\n useInactiveListener(!triedEager)\n\n // handle delayed loader state\n const [showLoader, setShowLoader] = useState(false)\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShowLoader(true)\n }, 600)\n\n return () => {\n clearTimeout(timeout)\n }\n }, [])\n\n // on page load, do nothing until we've tried to connect to the injected connector\n if (!triedEager) {\n return null\n }\n\n // if the account context isn't active, and there's an error on the network context, it's an irrecoverable error\n if (!active && networkError) {\n return (\n \n {t('unknownError')}\n \n )\n }\n\n // if neither context is active, spin\n if (!active && !networkActive) {\n return showLoader ? (\n \n \n \n ) : null\n }\n\n return children\n}\n","import styled from 'styled-components'\n\nconst Card = styled.div`\n width: 100%;\n border-radius: 16px;\n padding: 1.25rem;\n padding: ${({ padding }) => padding};\n border: ${({ border }) => border};\n border-radius: ${({ borderRadius }) => borderRadius};\n`\nexport default Card\n\nexport const LightCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.colors.invertedContrast};\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n`\n\nexport const GreyCard = styled(Card)`\n background-color: ${({ theme }) => theme.colors.tertiary};\n`\n","import React from 'react'\nimport styled, { css } from 'styled-components'\nimport { animated, useTransition } from 'react-spring'\nimport { DialogOverlay, DialogContent } from '@reach/dialog'\nimport { isMobile } from 'react-device-detect'\nimport '@reach/dialog/styles.css'\nimport { transparentize } from 'polished'\n\nconst AnimatedDialogOverlay = animated(DialogOverlay)\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst StyledDialogOverlay = styled(AnimatedDialogOverlay)`\n &[data-reach-dialog-overlay] {\n z-index: 2;\n background-color: transparent;\n overflow: hidden;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.3);\n }\n`\n\nconst AnimatedDialogContent = animated(DialogContent)\n// destructure to not pass custom props to Dialog DOM element\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst StyledDialogContent = styled(({ minHeight, maxHeight, mobile, isOpen, ...rest }) => (\n \n)).attrs({\n 'aria-label': 'dialog',\n})`\n &[data-reach-dialog-content] {\n margin: 0 0 2rem 0;\n border: 1px solid ${({ theme }) => theme.colors.invertedContrast};\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n box-shadow: 0 4px 8px 0 ${transparentize(0.95, '#191326')};\n padding: 0px;\n width: 80%;\n overflow: hidden;\n\n align-self: ${({ mobile }) => (mobile ? 'flex-end' : 'center')};\n\n max-width: 420px;\n ${({ maxHeight }) =>\n maxHeight &&\n css`\n max-height: ${maxHeight}vh;\n `}\n ${({ minHeight }) =>\n minHeight &&\n css`\n min-height: ${minHeight}vh;\n `}\n display: flex;\n border-radius: 20px;\n\n ${({ theme }) => theme.mediaQueries.lg} {\n width: 65vw;\n }\n ${({ theme }) => theme.mediaQueries.sm} {\n width: 85vw;\n }\n }\n`\n\ninterface ModalProps {\n isOpen: boolean\n onDismiss: () => void\n minHeight?: number | false\n maxHeight?: number\n initialFocusRef?: React.RefObject\n children?: React.ReactNode\n}\n\nexport default function Modal({\n isOpen,\n onDismiss,\n minHeight = false,\n maxHeight = 50,\n initialFocusRef,\n children,\n}: ModalProps) {\n const fadeTransition = useTransition(isOpen, null, {\n config: { duration: 200 },\n from: { opacity: 0 },\n enter: { opacity: 1 },\n leave: { opacity: 0 },\n })\n\n return (\n <>\n {fadeTransition.map(\n ({ item, key, props }) =>\n item && (\n \n \n {/* prevents the automatic focusing of inputs on mobile by the reach dialog */}\n {/* eslint-disable */}\n {!initialFocusRef && isMobile ?
: null}\n {/* eslint-enable */}\n {children}\n \n \n )\n )}\n \n )\n}\n","import React, { ReactNode } from 'react'\nimport styled from 'styled-components'\nimport { Heading, IconButton, CloseIcon } from '@doublemoondev/doublemoon-uikit'\nimport { AutoColumn, ColumnCenter } from '../Column'\n\n\nexport const Wrapper = styled.div`\n width: 100%;\n overflow-y: auto;\n`\nexport const Section = styled(AutoColumn)`\n padding: 24px;\n`\n\nexport const ConfirmedIcon = styled(ColumnCenter)`\n padding: 40px 0;\n`\n\nexport const BottomSection = styled(Section)`\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n`\n\n/**\n * TODO: Remove this when modal system from the UI Kit is implemented\n */\nconst StyledContentHeader = styled.div`\n align-items: center;\n display: flex;\n\n & > ${Heading} {\n flex: 1;\n }\n`\n\ntype ContentHeaderProps = {\n children: ReactNode\n onDismiss: () => void\n}\n\nexport const ContentHeader = ({ children, onDismiss }: ContentHeaderProps) => (\n \n {children}\n \n \n \n \n)\n","import React from 'react'\nimport styled from 'styled-components'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport { Spinner } from '../Shared'\nimport { AutoColumn } from '../Column'\nimport { Wrapper, Section, ConfirmedIcon, ContentHeader } from './helpers'\n\ntype ConfirmationPendingContentProps = { onDismiss: () => void; pendingText: string }\n\nconst CustomLightSpinner = styled(Spinner)<{ size: string }>`\n height: ${({ size }) => size};\n width: ${({ size }) => size};\n`\n\nconst ConfirmationPendingContent = ({ onDismiss, pendingText }: ConfirmationPendingContentProps) => {\n return (\n \n
\n Waiting for confirmation\n \n \n \n \n \n \n {pendingText}\n \n \n Confirm this transaction in your wallet\n \n
\n
\n )\n}\n\nexport default ConfirmationPendingContent\n","import { ChainId } from '@doublemoondev/sdk'\nimport React, { useContext } from 'react'\nimport { ThemeContext } from 'styled-components'\nimport { Button, LinkExternal } from '@doublemoondev/doublemoon-uikit'\nimport { ArrowUpCircle } from 'react-feather'\nimport { AutoColumn } from '../Column'\nimport { getBscScanLink } from '../../utils'\nimport { Wrapper, Section, ConfirmedIcon, ContentHeader } from './helpers'\n\ntype TransactionSubmittedContentProps = {\n onDismiss: () => void\n hash: string | undefined\n chainId: ChainId\n}\n\nconst TransactionSubmittedContent = ({ onDismiss, chainId, hash }: TransactionSubmittedContentProps) => {\n const theme = useContext(ThemeContext)\n\n return (\n \n
\n Transaction submitted\n \n \n \n \n {chainId && hash && (\n View on BscScan\n )}\n \n \n
\n
\n )\n}\n\nexport default TransactionSubmittedContent\n","import React from 'react'\nimport Modal from '../Modal'\nimport { useActiveWeb3React } from '../../hooks'\nimport ConfirmationPendingContent from './ConfirmationPendingContent'\nimport TransactionSubmittedContent from './TransactionSubmittedContent'\n\ninterface ConfirmationModalProps {\n isOpen: boolean\n onDismiss: () => void\n hash: string | undefined\n content: () => React.ReactNode\n attemptingTxn: boolean\n pendingText: string\n}\n\nconst TransactionConfirmationModal = ({\n isOpen,\n onDismiss,\n attemptingTxn,\n hash,\n pendingText,\n content\n}: ConfirmationModalProps) => {\n const { chainId } = useActiveWeb3React()\n\n if (!chainId) return null\n\n // confirmation screen\n return (\n \n {attemptingTxn ? (\n \n ) : hash ? (\n \n ) : (\n content()\n )}\n \n )\n}\n\nexport default TransactionConfirmationModal\n","import React from 'react'\nimport { Wrapper, Section, BottomSection, ContentHeader } from './helpers'\n\ntype ConfirmationModalContentProps = {\n title: string\n onDismiss: () => void\n topContent: () => React.ReactNode\n bottomContent: () => React.ReactNode\n}\n\nconst ConfirmationModalContent = ({ title, bottomContent, onDismiss, topContent }: ConfirmationModalContentProps) => {\n return (\n \n
\n {title}\n {topContent()}\n
\n {bottomContent()}\n
\n )\n}\n\nexport default ConfirmationModalContent\n","import React, { useContext } from 'react'\nimport { ThemeContext } from 'styled-components'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport { AlertTriangle } from 'react-feather'\nimport { AutoColumn } from '../Column'\nimport { Wrapper, Section, BottomSection, ContentHeader } from './helpers'\n\ntype TransactionErrorContentProps = { message: string; onDismiss: () => void }\n\nconst TransactionErrorContent = ({ message, onDismiss }: TransactionErrorContentProps) => {\n const theme = useContext(ThemeContext)\n return (\n \n
\n Error\n \n \n \n {message}\n \n \n
\n \n \n \n
\n )\n}\n\nexport default TransactionErrorContent\n","import TransactionConfirmationModal from './TransactionConfirmationModal'\n\nexport { default as ConfirmationModalContent } from './ConfirmationModalContent'\nexport { default as ConfirmationPendingContent } from './ConfirmationPendingContent'\nexport { default as TransactionErrorContent } from './TransactionErrorContent'\nexport { default as TransactionSubmittedContent } from './TransactionSubmittedContent'\n\nexport default TransactionConfirmationModal\n","import React, { createContext } from 'react'\n\ninterface TranslationState {\n translations: Array\n setTranslations: React.Dispatch>>\n}\n\nconst defaultTranslationState: TranslationState = {\n translations: [],\n setTranslations: (): void => undefined,\n}\n\nexport const TranslationsContext = createContext(defaultTranslationState as TranslationState)\n\nexport default TranslationsContext\n","import { useContext } from 'react'\nimport { TranslationsContext } from '../hooks/TranslationsContext'\n\nconst variableRegex = /%(.*?)%/\n\nconst replaceDynamicString = (foundTranslation: string, fallback: string) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const stringToReplace = variableRegex.exec(foundTranslation)![0]\n const indexToReplace = foundTranslation.split(' ').indexOf(stringToReplace)\n const fallbackValueAtIndex = fallback.split(' ')[indexToReplace]\n return foundTranslation.replace(stringToReplace, fallbackValueAtIndex)\n}\n\nexport const getTranslation = (translations: Array, translationId: number, fallback: string) => {\n const foundTranslation = translations.find((translation) => {\n return translation.data.stringId === translationId\n })\n if (foundTranslation) {\n const translatedString = foundTranslation.data.text\n const includesVariable = translatedString.includes('%')\n if (includesVariable) {\n return replaceDynamicString(translatedString, fallback)\n }\n return translatedString\n }\n return fallback\n}\n\nexport const TranslateString = (translationId: number, fallback: string) => {\n const { translations } = useContext(TranslationsContext)\n if (translations[0] === 'error') {\n return fallback\n }\n if (translations.length > 0) {\n return getTranslation(translations, translationId, fallback)\n }\n return null\n}\n","import { useCallback, useContext } from 'react'\nimport { TranslationsContext } from 'hooks/TranslationsContext'\nimport { getTranslation } from 'utils/translateTextHelpers'\n\nconst useI18n = () => {\n const { translations } = useContext(TranslationsContext)\n\n /**\n * As a temporary fix memoize the translation function so it can be used in an effect.\n * It appears the TranslationsContext is always empty and is not currently used\n * TODO: Figure out if the context is used and if not, remove it.\n */\n return useCallback(\n (translationId: number, fallback: string) => {\n if (translations[0] === 'error') {\n return fallback\n }\n if (translations.length > 0) {\n return getTranslation(translations, translationId, fallback)\n }\n return fallback\n },\n [translations]\n )\n}\n\nexport default useI18n\n","import React from 'react'\nimport styled from 'styled-components'\nimport { Link } from 'react-router-dom'\nimport { ButtonMenu, ButtonMenuItem } from '@doublemoondev/doublemoon-uikit'\nimport useI18n from 'hooks/useI18n'\n\nconst StyledNav = styled.div`\n margin-bottom: 40px;\n`\n\nfunction Nav({ activeIndex = 0 }: { activeIndex?: number }) {\n const TranslateString = useI18n()\n return (\n \n \n \n {TranslateString(1142, 'Swap')}\n \n \n {TranslateString(262, 'Liquidity')}\n \n \n Bridge\n \n \n \n )\n}\n\nexport default Nav\n","import { Interface } from '@ethersproject/abi'\nimport ERC20_ABI from './erc20.json'\nimport ERC20_BYTES32_ABI from './erc20_bytes32.json'\n\nconst ERC20_INTERFACE = new Interface(ERC20_ABI)\n\nexport default ERC20_INTERFACE\nexport { ERC20_ABI, ERC20_BYTES32_ABI }\n","import { ChainId, Token } from '@doublemoondev/sdk'\nimport { Tags, TokenInfo, TokenList } from '@uniswap/token-lists'\nimport { useMemo } from 'react'\nimport { useSelector } from 'react-redux'\nimport { AppState } from '../index'\n\ntype TagDetails = Tags[keyof Tags]\nexport interface TagInfo extends TagDetails {\n id: string\n}\n\n/**\n * Token instances created from token info.\n */\nexport class WrappedTokenInfo extends Token {\n public readonly tokenInfo: TokenInfo\n\n public readonly tags: TagInfo[]\n\n constructor(tokenInfo: TokenInfo, tags: TagInfo[]) {\n super(tokenInfo.chainId, tokenInfo.address, tokenInfo.decimals, tokenInfo.symbol, tokenInfo.name)\n this.tokenInfo = tokenInfo\n this.tags = tags\n }\n\n public get logoURI(): string | undefined {\n return this.tokenInfo.logoURI\n }\n}\n\nexport type TokenAddressMap = Readonly<{ [chainId in ChainId]: Readonly<{ [tokenAddress: string]: WrappedTokenInfo }> }>\n\n/**\n * An empty result, useful as a default.\n */\nconst EMPTY_LIST: TokenAddressMap = {\n [ChainId.MAINNET]: {},\n [ChainId.BSCTESTNET]: {}\n}\n\nconst listCache: WeakMap | null =\n typeof WeakMap !== 'undefined' ? new WeakMap() : null\n\nexport function listToTokenMap(list: TokenList): TokenAddressMap {\n const result = listCache?.get(list)\n if (result) return result\n\n const map = list.tokens.reduce(\n (tokenMap, tokenInfo) => {\n const tags: TagInfo[] =\n tokenInfo.tags\n ?.map(tagId => {\n if (!list.tags?.[tagId]) return undefined\n return { ...list.tags[tagId], id: tagId }\n })\n ?.filter((x): x is TagInfo => Boolean(x)) ?? []\n const token = new WrappedTokenInfo(tokenInfo, tags)\n if (tokenMap[token.chainId][token.address] !== undefined) throw Error('Duplicate tokens.')\n return {\n ...tokenMap,\n [token.chainId]: {\n ...tokenMap[token.chainId],\n [token.address]: token\n }\n }\n },\n { ...EMPTY_LIST }\n )\n listCache?.set(list, map)\n return map\n}\n\nexport function useTokenList(url: string | undefined): TokenAddressMap {\n const lists = useSelector(state => state.lists.byUrl)\n return useMemo(() => {\n if (!url) return EMPTY_LIST\n const current = lists[url]?.current\n if (!current) return EMPTY_LIST\n try {\n return listToTokenMap(current)\n } catch (error) {\n console.error('Could not show token list due to error', error)\n return EMPTY_LIST\n }\n }, [lists, url])\n}\n\nexport function useSelectedListUrl(): string | undefined {\n return useSelector(state => state.lists.selectedListUrl)\n}\n\nexport function useSelectedTokenList(): TokenAddressMap {\n return useTokenList(useSelectedListUrl())\n}\n\nexport function useSelectedListInfo(): { current: TokenList | null; pending: TokenList | null; loading: boolean } {\n const selectedUrl = useSelectedListUrl()\n const listsByUrl = useSelector(state => state.lists.byUrl)\n const list = selectedUrl ? listsByUrl[selectedUrl] : undefined\n return {\n current: list?.current ?? null,\n pending: list?.pendingUpdate ?? null,\n loading: list?.loadingRequestId !== null\n }\n}\n\n// returns all downloaded current lists\nexport function useAllLists(): TokenList[] {\n const lists = useSelector(state => state.lists.byUrl)\n\n return useMemo(\n () =>\n Object.keys(lists)\n .map(url => lists[url].current)\n .filter((l): l is TokenList => Boolean(l)),\n [lists]\n )\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport interface Call {\n address: string\n callData: string\n}\n\nconst ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\nconst LOWER_HEX_REGEX = /^0x[a-f0-9]*$/\nexport function toCallKey(call: Call): string {\n if (!ADDRESS_REGEX.test(call.address)) {\n throw new Error(`Invalid address: ${call.address}`)\n }\n if (!LOWER_HEX_REGEX.test(call.callData)) {\n throw new Error(`Invalid hex: ${call.callData}`)\n }\n return `${call.address}-${call.callData}`\n}\n\nexport function parseCallKey(callKey: string): Call {\n const pcs = callKey.split('-')\n if (pcs.length !== 2) {\n throw new Error(`Invalid call key: ${callKey}`)\n }\n return {\n address: pcs[0],\n callData: pcs[1]\n }\n}\n\nexport interface ListenerOptions {\n // how often this data should be fetched, by default 1\n readonly blocksPerFetch?: number\n}\n\nexport const addMulticallListeners = createAction<{ chainId: number; calls: Call[]; options?: ListenerOptions }>(\n 'multicall/addMulticallListeners'\n)\nexport const removeMulticallListeners = createAction<{ chainId: number; calls: Call[]; options?: ListenerOptions }>(\n 'multicall/removeMulticallListeners'\n)\nexport const fetchingMulticallResults = createAction<{ chainId: number; calls: Call[]; fetchingBlockNumber: number }>(\n 'multicall/fetchingMulticallResults'\n)\nexport const errorFetchingMulticallResults = createAction<{\n chainId: number\n calls: Call[]\n fetchingBlockNumber: number\n}>('multicall/errorFetchingMulticallResults')\nexport const updateMulticallResults = createAction<{\n chainId: number\n blockNumber: number\n results: {\n [callKey: string]: string | null\n }\n}>('multicall/updateMulticallResults')\n","import { Interface, FunctionFragment } from '@ethersproject/abi'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { useEffect, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useBlockNumber } from '../application/hooks'\nimport { AppDispatch, AppState } from '../index'\nimport {\n addMulticallListeners,\n Call,\n removeMulticallListeners,\n parseCallKey,\n toCallKey,\n ListenerOptions,\n} from './actions'\n\nexport interface Result extends ReadonlyArray {\n readonly [key: string]: any\n}\n\ntype MethodArg = string | number | BigNumber\ntype MethodArgs = Array\n\ntype OptionalMethodInputs = Array | undefined\n\nfunction isMethodArg(x: unknown): x is MethodArg {\n return ['string', 'number'].indexOf(typeof x) !== -1\n}\n\nfunction isValidMethodArgs(x: unknown): x is MethodArgs | undefined {\n return (\n x === undefined ||\n (Array.isArray(x) && x.every((xi) => isMethodArg(xi) || (Array.isArray(xi) && xi.every(isMethodArg))))\n )\n}\n\ninterface CallResult {\n readonly valid: boolean\n readonly data: string | undefined\n readonly blockNumber: number | undefined\n}\n\nconst INVALID_RESULT: CallResult = { valid: false, blockNumber: undefined, data: undefined }\n\n// use this options object\nexport const NEVER_RELOAD: ListenerOptions = {\n blocksPerFetch: Infinity,\n}\n\n// the lowest level call for subscribing to contract data\nfunction useCallsData(calls: (Call | undefined)[], options?: ListenerOptions): CallResult[] {\n const { chainId } = useActiveWeb3React()\n const callResults = useSelector(\n (state) => state.multicall.callResults\n )\n const dispatch = useDispatch()\n\n const serializedCallKeys: string = useMemo(\n () =>\n JSON.stringify(\n calls\n ?.filter((c): c is Call => Boolean(c))\n ?.map(toCallKey)\n ?.sort() ?? []\n ),\n [calls]\n )\n\n // update listeners when there is an actual change that persists for at least 100ms\n useEffect(() => {\n const callKeys: string[] = JSON.parse(serializedCallKeys)\n if (!chainId || callKeys.length === 0) return undefined\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const calls = callKeys.map((key) => parseCallKey(key))\n dispatch(\n addMulticallListeners({\n chainId,\n calls,\n options,\n })\n )\n\n return () => {\n dispatch(\n removeMulticallListeners({\n chainId,\n calls,\n options,\n })\n )\n }\n }, [chainId, dispatch, options, serializedCallKeys])\n\n return useMemo(\n () =>\n // @ts-ignore\n calls.map((call) => {\n if (!chainId || !call) return INVALID_RESULT\n\n const result = callResults[chainId]?.[toCallKey(call)]\n const data = result?.data && result?.data !== '0x' ? result.data : null\n\n return { valid: true, data, blockNumber: result?.blockNumber }\n }),\n [callResults, calls, chainId]\n )\n}\n\ninterface CallState {\n readonly valid: boolean\n // the result, or undefined if loading or errored/no data\n readonly result: Result | undefined\n // true if the result has never been fetched\n readonly loading: boolean\n // true if the result is not for the latest block\n readonly syncing: boolean\n // true if the call was made and is synced, but the return data is invalid\n readonly error: boolean\n}\n\nconst INVALID_CALL_STATE: CallState = { valid: false, result: undefined, loading: false, syncing: false, error: false }\nconst LOADING_CALL_STATE: CallState = { valid: true, result: undefined, loading: true, syncing: true, error: false }\n\nfunction toCallState(\n callResult: CallResult | undefined,\n contractInterface: Interface | undefined,\n fragment: FunctionFragment | undefined,\n latestBlockNumber: number | undefined\n): CallState {\n if (!callResult) return INVALID_CALL_STATE\n const { valid, data, blockNumber } = callResult\n if (!valid) return INVALID_CALL_STATE\n if (valid && !blockNumber) return LOADING_CALL_STATE\n if (!contractInterface || !fragment || !latestBlockNumber) return LOADING_CALL_STATE\n const success = data && data.length > 2\n const syncing = (blockNumber ?? 0) < latestBlockNumber\n let result: Result | undefined\n if (success && data) {\n try {\n result = contractInterface.decodeFunctionResult(fragment, data)\n } catch (error) {\n console.error('Result data parsing failed', fragment, data)\n return {\n valid: true,\n loading: false,\n error: true,\n syncing,\n result,\n }\n }\n }\n return {\n valid: true,\n loading: false,\n syncing,\n result,\n error: !success,\n }\n}\n\nexport function useSingleContractMultipleData(\n contract: Contract | null | undefined,\n methodName: string,\n callInputs: OptionalMethodInputs[],\n options?: ListenerOptions\n): CallState[] {\n const fragment = useMemo(() => contract?.interface?.getFunction(methodName), [contract, methodName])\n\n const calls = useMemo(\n () =>\n contract && fragment && callInputs && callInputs.length > 0\n ? callInputs.map((inputs) => {\n return {\n address: contract.address,\n callData: contract.interface.encodeFunctionData(fragment, inputs),\n }\n })\n : [],\n [callInputs, contract, fragment]\n )\n\n const results = useCallsData(calls, options)\n\n const latestBlockNumber = useBlockNumber()\n\n return useMemo(() => {\n return results.map((result) => toCallState(result, contract?.interface, fragment, latestBlockNumber))\n }, [fragment, contract, results, latestBlockNumber])\n}\n\nexport function useMultipleContractSingleData(\n addresses: (string | undefined)[],\n contractInterface: Interface,\n methodName: string,\n callInputs?: OptionalMethodInputs,\n options?: ListenerOptions\n): CallState[] {\n const fragment = useMemo(() => contractInterface.getFunction(methodName), [contractInterface, methodName])\n const callData: string | undefined = useMemo(\n () =>\n fragment && isValidMethodArgs(callInputs)\n ? contractInterface.encodeFunctionData(fragment, callInputs)\n : undefined,\n [callInputs, contractInterface, fragment]\n )\n\n const calls = useMemo(\n () =>\n fragment && addresses && addresses.length > 0 && callData\n ? addresses.map((address) => {\n return address && callData\n ? {\n address,\n callData,\n }\n : undefined\n })\n : [],\n [addresses, callData, fragment]\n )\n\n const results = useCallsData(calls, options)\n\n const latestBlockNumber = useBlockNumber()\n\n return useMemo(() => {\n return results.map((result) => toCallState(result, contractInterface, fragment, latestBlockNumber))\n }, [fragment, results, contractInterface, latestBlockNumber])\n}\n\nexport function useSingleCallResult(\n contract: Contract | null | undefined,\n methodName: string,\n inputs?: OptionalMethodInputs,\n options?: ListenerOptions\n): CallState {\n const fragment = useMemo(() => contract?.interface?.getFunction(methodName), [contract, methodName])\n\n const calls = useMemo(() => {\n return contract && fragment && isValidMethodArgs(inputs)\n ? [\n {\n address: contract.address,\n callData: contract.interface.encodeFunctionData(fragment, inputs),\n },\n ]\n : []\n }, [contract, fragment, inputs])\n\n const result = useCallsData(calls, options)[0]\n const latestBlockNumber = useBlockNumber()\n\n return useMemo(() => {\n return toCallState(result, contract?.interface, fragment, latestBlockNumber)\n }, [result, contract, fragment, latestBlockNumber])\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport interface SerializedToken {\n chainId: number\n address: string\n decimals: number\n symbol?: string\n name?: string\n}\n\nexport interface SerializedPair {\n token0: SerializedToken\n token1: SerializedToken\n}\n\nexport const updateMatchesDarkMode = createAction<{ matchesDarkMode: boolean }>('user/updateMatchesDarkMode')\nexport const updateUserDarkMode = createAction<{ userDarkMode: boolean }>('user/updateUserDarkMode')\nexport const updateUserExpertMode = createAction<{ userExpertMode: boolean }>('user/updateUserExpertMode')\nexport const updateUserSlippageTolerance = createAction<{ userSlippageTolerance: number }>(\n 'user/updateUserSlippageTolerance'\n)\nexport const updateUserDeadline = createAction<{ userDeadline: number }>('user/updateUserDeadline')\nexport const addSerializedToken = createAction<{ serializedToken: SerializedToken }>('user/addSerializedToken')\nexport const removeSerializedToken = createAction<{ chainId: number; address: string }>('user/removeSerializedToken')\nexport const addSerializedPair = createAction<{ serializedPair: SerializedPair }>('user/addSerializedPair')\nexport const removeSerializedPair = createAction<{ chainId: number; tokenAAddress: string; tokenBAddress: string }>(\n 'user/removeSerializedPair'\n)\nexport const muteAudio = createAction('user/muteAudio')\nexport const unmuteAudio = createAction('user/unmuteAudio')\n","const CACHE_KEY = 'IS_DARK'\n\nexport function getThemeCache(): boolean | null {\n let cache = null\n try {\n const rawCache = localStorage.getItem(CACHE_KEY)\n if (rawCache) {\n cache = JSON.parse(rawCache)\n }\n } catch (error) {\n console.error(error)\n }\n\n return cache\n}\n\nexport function setThemeCache(isDark: boolean) {\n try {\n localStorage.setItem(CACHE_KEY, JSON.stringify(isDark))\n } catch (error) {\n console.error(error)\n }\n}\n","import { ChainId, Pair, Token } from '@doublemoondev/sdk'\nimport flatMap from 'lodash.flatmap'\nimport { useCallback, useMemo } from 'react'\nimport { shallowEqual, useDispatch, useSelector } from 'react-redux'\nimport { BASES_TO_TRACK_LIQUIDITY_FOR, PINNED_PAIRS } from '../../constants'\n\nimport { useActiveWeb3React } from '../../hooks'\n// eslint-disable-next-line import/no-cycle\nimport { useAllTokens } from '../../hooks/Tokens'\nimport { AppDispatch, AppState } from '../index'\nimport {\n addSerializedPair,\n addSerializedToken,\n removeSerializedToken,\n SerializedPair,\n SerializedToken,\n updateUserDarkMode,\n updateUserDeadline,\n updateUserExpertMode,\n updateUserSlippageTolerance,\n muteAudio,\n unmuteAudio,\n} from './actions'\nimport { setThemeCache } from '../../utils/theme'\n\nfunction serializeToken(token: Token): SerializedToken {\n return {\n chainId: token.chainId,\n address: token.address,\n decimals: token.decimals,\n symbol: token.symbol,\n name: token.name,\n }\n}\n\nfunction deserializeToken(serializedToken: SerializedToken): Token {\n return new Token(\n serializedToken.chainId,\n serializedToken.address,\n serializedToken.decimals,\n serializedToken.symbol,\n serializedToken.name\n )\n}\n\nexport function useIsDarkMode(): boolean {\n const { userDarkMode, matchesDarkMode } = useSelector<\n AppState,\n { userDarkMode: boolean | null; matchesDarkMode: boolean }\n >(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n ({ user: { matchesDarkMode, userDarkMode } }) => ({\n userDarkMode,\n matchesDarkMode,\n }),\n shallowEqual\n )\n return userDarkMode === null ? matchesDarkMode : userDarkMode\n}\n\nexport function useDarkModeManager(): [boolean, () => void] {\n const dispatch = useDispatch()\n const { userDarkMode } = useSelector(\n // eslint-disable-next-line @typescript-eslint/no-shadow\n ({ user: { userDarkMode } }) => ({\n userDarkMode,\n }),\n shallowEqual\n )\n const darkMode = useIsDarkMode()\n\n const toggleSetDarkMode = useCallback(() => {\n setThemeCache(!userDarkMode)\n dispatch(updateUserDarkMode({ userDarkMode: !userDarkMode }))\n }, [userDarkMode, dispatch])\n\n return [darkMode, toggleSetDarkMode]\n}\n\nexport function useAudioModeManager(): [boolean, () => void] {\n const dispatch = useDispatch()\n const audioPlay = useSelector((state) => state.user.audioPlay)\n const toggleSetAudioMode = useCallback(() => {\n if (audioPlay) {\n dispatch(muteAudio())\n } else {\n dispatch(unmuteAudio())\n }\n }, [audioPlay, dispatch])\n\n return [audioPlay, toggleSetAudioMode]\n}\n\nexport function useIsExpertMode(): boolean {\n return useSelector((state) => state.user.userExpertMode)\n}\n\nexport function useExpertModeManager(): [boolean, () => void] {\n const dispatch = useDispatch()\n const expertMode = useIsExpertMode()\n\n const toggleSetExpertMode = useCallback(() => {\n dispatch(updateUserExpertMode({ userExpertMode: !expertMode }))\n }, [expertMode, dispatch])\n\n return [expertMode, toggleSetExpertMode]\n}\n\nexport function useUserSlippageTolerance(): [number, (slippage: number) => void] {\n const dispatch = useDispatch()\n const userSlippageTolerance = useSelector((state) => {\n return state.user.userSlippageTolerance\n })\n\n const setUserSlippageTolerance = useCallback(\n (slippageTolerance: number) => {\n dispatch(updateUserSlippageTolerance({ userSlippageTolerance: slippageTolerance }))\n },\n [dispatch]\n )\n\n return [userSlippageTolerance, setUserSlippageTolerance]\n}\n\nexport function useUserDeadline(): [number, (slippage: number) => void] {\n const dispatch = useDispatch()\n const userDeadline = useSelector((state) => {\n return state.user.userDeadline\n })\n\n const setUserDeadline = useCallback(\n (deadline: number) => {\n dispatch(updateUserDeadline({ userDeadline: deadline }))\n },\n [dispatch]\n )\n\n return [userDeadline, setUserDeadline]\n}\n\nexport function useAddUserToken(): (token: Token) => void {\n const dispatch = useDispatch()\n return useCallback(\n (token: Token) => {\n dispatch(addSerializedToken({ serializedToken: serializeToken(token) }))\n },\n [dispatch]\n )\n}\n\nexport function useRemoveUserAddedToken(): (chainId: number, address: string) => void {\n const dispatch = useDispatch()\n return useCallback(\n (chainId: number, address: string) => {\n dispatch(removeSerializedToken({ chainId, address }))\n },\n [dispatch]\n )\n}\n\nexport function useUserAddedTokens(): Token[] {\n const { chainId } = useActiveWeb3React()\n const serializedTokensMap = useSelector(({ user: { tokens } }) => tokens)\n\n return useMemo(() => {\n if (!chainId) return []\n return Object.values(serializedTokensMap[chainId as ChainId] ?? {}).map(deserializeToken)\n }, [serializedTokensMap, chainId])\n}\n\nfunction serializePair(pair: Pair): SerializedPair {\n return {\n token0: serializeToken(pair.token0),\n token1: serializeToken(pair.token1),\n }\n}\n\nexport function usePairAdder(): (pair: Pair) => void {\n const dispatch = useDispatch()\n\n return useCallback(\n (pair: Pair) => {\n dispatch(addSerializedPair({ serializedPair: serializePair(pair) }))\n },\n [dispatch]\n )\n}\n\n/**\n * Given two tokens return the liquidity token that represents its liquidity shares\n * @param tokenA one of the two tokens\n * @param tokenB the other token\n */\nexport function toV2LiquidityToken([tokenA, tokenB]: [Token, Token]): Token {\n return new Token(tokenA.chainId, Pair.getAddress(tokenA, tokenB), 18, 'Cake-LP', 'Pancake LPs')\n}\n\n/**\n * Returns all the pairs of tokens that are tracked by the user for the current chain ID.\n */\nexport function useTrackedTokenPairs(): [Token, Token][] {\n const { chainId } = useActiveWeb3React()\n const tokens = useAllTokens()\n\n // pinned pairs\n const pinnedPairs = useMemo(() => (chainId ? PINNED_PAIRS[chainId] ?? [] : []), [chainId])\n\n // pairs for every token against every base\n const generatedPairs: [Token, Token][] = useMemo(\n () =>\n chainId\n ? flatMap(Object.keys(tokens), (tokenAddress) => {\n const token = tokens[tokenAddress]\n // for each token on the current chain,\n return (\n // loop though all bases on the current chain\n (BASES_TO_TRACK_LIQUIDITY_FOR[chainId] ?? [])\n // to construct pairs of the given token with each base\n .map((base) => {\n if (base.address === token.address) {\n return null\n }\n return [base, token]\n })\n .filter((p): p is [Token, Token] => p !== null)\n )\n })\n : [],\n [tokens, chainId]\n )\n\n // pairs saved by users\n const savedSerializedPairs = useSelector(({ user: { pairs } }) => pairs)\n\n const userPairs: [Token, Token][] = useMemo(() => {\n if (!chainId || !savedSerializedPairs) return []\n const forChain = savedSerializedPairs[chainId]\n if (!forChain) return []\n\n return Object.keys(forChain).map((pairId) => {\n return [deserializeToken(forChain[pairId].token0), deserializeToken(forChain[pairId].token1)]\n })\n }, [savedSerializedPairs, chainId])\n\n const combinedList = useMemo(() => userPairs.concat(generatedPairs).concat(pinnedPairs), [\n generatedPairs,\n pinnedPairs,\n userPairs,\n ])\n\n return useMemo(() => {\n // dedupes pairs of tokens in the combined list\n const keyed = combinedList.reduce<{ [key: string]: [Token, Token] }>((memo, [tokenA, tokenB]) => {\n const sorted = tokenA.sortsBefore(tokenB)\n const key = sorted ? `${tokenA.address}:${tokenB.address}` : `${tokenB.address}:${tokenA.address}`\n if (memo[key]) return memo\n memo[key] = sorted ? [tokenA, tokenB] : [tokenB, tokenA]\n return memo\n }, {})\n\n return Object.keys(keyed).map((key) => keyed[key])\n }, [combinedList])\n}\n","import { ChainId } from '@doublemoondev/sdk'\nimport MULTICALL_ABI from './abi.json'\n\nconst MULTICALL_NETWORKS: { [chainId in ChainId]: string } = {\n [ChainId.MAINNET]: '0x1Ee38d535d541c55C9dae27B12edf090C608E6Fb', // TODO\n [ChainId.BSCTESTNET]: '0x301907b5835a2d723Fe3e9E8C5Bc5375d5c1236A'\n}\n\nexport { MULTICALL_ABI, MULTICALL_NETWORKS }\n","import { Contract } from '@ethersproject/contracts'\nimport { ChainId, WETH } from '@doublemoondev/sdk'\nimport { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'\nimport { useMemo } from 'react'\nimport ENS_ABI from '../constants/abis/ens-registrar.json'\nimport ENS_PUBLIC_RESOLVER_ABI from '../constants/abis/ens-public-resolver.json'\nimport { ERC20_BYTES32_ABI } from '../constants/abis/erc20'\nimport ERC20_ABI from '../constants/abis/erc20.json'\nimport WETH_ABI from '../constants/abis/weth.json'\nimport { MULTICALL_ABI, MULTICALL_NETWORKS } from '../constants/multicall'\nimport { getContract } from '../utils'\nimport { useActiveWeb3React } from './index'\n\n// returns null on errors\nfunction useContract(address: string | undefined, ABI: any, withSignerIfPossible = true): Contract | null {\n const { library, account } = useActiveWeb3React()\n\n return useMemo(() => {\n if (!address || !ABI || !library) return null\n try {\n return getContract(address, ABI, library, withSignerIfPossible && account ? account : undefined)\n } catch (error) {\n console.error('Failed to get contract', error)\n return null\n }\n }, [address, ABI, library, withSignerIfPossible, account])\n}\n\nexport function useTokenContract(tokenAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(tokenAddress, ERC20_ABI, withSignerIfPossible)\n}\n\nexport function useWETHContract(withSignerIfPossible?: boolean): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId ? WETH[chainId].address : undefined, WETH_ABI, withSignerIfPossible)\n}\n\nexport function useENSRegistrarContract(withSignerIfPossible?: boolean): Contract | null {\n const { chainId } = useActiveWeb3React()\n let address: string | undefined\n if (chainId) {\n switch (chainId) {\n case ChainId.MAINNET:\n case ChainId.BSCTESTNET:\n }\n }\n return useContract(address, ENS_ABI, withSignerIfPossible)\n}\n\nexport function useENSResolverContract(address: string | undefined, withSignerIfPossible?: boolean): Contract | null {\n return useContract(address, ENS_PUBLIC_RESOLVER_ABI, withSignerIfPossible)\n}\n\nexport function useBytes32TokenContract(tokenAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(tokenAddress, ERC20_BYTES32_ABI, withSignerIfPossible)\n}\n\nexport function usePairContract(pairAddress?: string, withSignerIfPossible?: boolean): Contract | null {\n return useContract(pairAddress, IUniswapV2PairABI, withSignerIfPossible)\n}\n\nexport function useMulticallContract(): Contract | null {\n const { chainId } = useActiveWeb3React()\n return useContract(chainId && MULTICALL_NETWORKS[chainId], MULTICALL_ABI, false)\n}\n","import { parseBytes32String } from '@ethersproject/strings'\nimport { Currency, ETHER, Token, currencyEquals } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\nimport { useSelectedTokenList } from '../state/lists/hooks'\nimport { NEVER_RELOAD, useSingleCallResult } from '../state/multicall/hooks'\n// eslint-disable-next-line import/no-cycle\nimport { useUserAddedTokens } from '../state/user/hooks'\nimport { isAddress } from '../utils'\n\nimport { useActiveWeb3React } from './index'\nimport { useBytes32TokenContract, useTokenContract } from './useContract'\n\nexport function useAllTokens(): { [address: string]: Token } {\n const { chainId } = useActiveWeb3React()\n const userAddedTokens = useUserAddedTokens()\n const allTokens = useSelectedTokenList()\n\n return useMemo(() => {\n if (!chainId) return {}\n return (\n userAddedTokens\n // reduce into all ALL_TOKENS filtered by the current chain\n .reduce<{ [address: string]: Token }>(\n (tokenMap, token) => {\n tokenMap[token.address] = token\n return tokenMap\n },\n // must make a copy because reduce modifies the map, and we do not\n // want to make a copy in every iteration\n { ...allTokens[chainId] }\n )\n )\n }, [chainId, userAddedTokens, allTokens])\n}\n\n// Check if currency is included in custom list from user storage\nexport function useIsUserAddedToken(currency: Currency): boolean {\n const userAddedTokens = useUserAddedTokens()\n return !!userAddedTokens.find((token) => currencyEquals(currency, token))\n}\n\n// parse a name or symbol from a token response\nconst BYTES32_REGEX = /^0x[a-fA-F0-9]{64}$/\nfunction parseStringOrBytes32(str: string | undefined, bytes32: string | undefined, defaultValue: string): string {\n return str && str.length > 0\n ? str\n : bytes32 && BYTES32_REGEX.test(bytes32)\n ? parseBytes32String(bytes32)\n : defaultValue\n}\n\n// undefined if invalid or does not exist\n// null if loading\n// otherwise returns the token\nexport function useToken(tokenAddress?: string): Token | undefined | null {\n const { chainId } = useActiveWeb3React()\n const tokens = useAllTokens()\n\n const address = isAddress(tokenAddress)\n\n const tokenContract = useTokenContract(address || undefined, false)\n const tokenContractBytes32 = useBytes32TokenContract(address || undefined, false)\n const token: Token | undefined = address ? tokens[address] : undefined\n\n const tokenName = useSingleCallResult(token ? undefined : tokenContract, 'name', undefined, NEVER_RELOAD)\n const tokenNameBytes32 = useSingleCallResult(\n token ? undefined : tokenContractBytes32,\n 'name',\n undefined,\n NEVER_RELOAD\n )\n const symbol = useSingleCallResult(token ? undefined : tokenContract, 'symbol', undefined, NEVER_RELOAD)\n const symbolBytes32 = useSingleCallResult(token ? undefined : tokenContractBytes32, 'symbol', undefined, NEVER_RELOAD)\n const decimals = useSingleCallResult(token ? undefined : tokenContract, 'decimals', undefined, NEVER_RELOAD)\n\n return useMemo(() => {\n if (token) return token\n if (!chainId || !address) return undefined\n if (decimals.loading || symbol.loading || tokenName.loading) return null\n if (decimals.result) {\n return new Token(\n chainId,\n address,\n decimals.result[0],\n parseStringOrBytes32(symbol.result?.[0], symbolBytes32.result?.[0], 'UNKNOWN'),\n parseStringOrBytes32(tokenName.result?.[0], tokenNameBytes32.result?.[0], 'Unknown Token')\n )\n }\n return undefined\n }, [\n address,\n chainId,\n decimals.loading,\n decimals.result,\n symbol.loading,\n symbol.result,\n symbolBytes32.result,\n token,\n tokenName.loading,\n tokenName.result,\n tokenNameBytes32.result,\n ])\n}\n\nexport function useCurrency(currencyId: string | undefined): Currency | null | undefined {\n const isBNB = currencyId?.toUpperCase() === 'BNB'\n const token = useToken(isBNB ? undefined : currencyId)\n return isBNB ? ETHER : token\n}\n","import { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\nimport ERC20_INTERFACE from '../../constants/abis/erc20'\nimport { useAllTokens } from '../../hooks/Tokens'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useMulticallContract } from '../../hooks/useContract'\nimport { isAddress } from '../../utils'\nimport { useSingleContractMultipleData, useMultipleContractSingleData } from '../multicall/hooks'\n\n/**\n * Returns a map of the given addresses to their eventually consistent ETH balances.\n */\nexport function useETHBalances(\n uncheckedAddresses?: (string | undefined)[]\n): { [address: string]: CurrencyAmount | undefined } {\n const multicallContract = useMulticallContract()\n\n const addresses: string[] = useMemo(\n () =>\n uncheckedAddresses\n ? uncheckedAddresses\n .map(isAddress)\n .filter((a): a is string => a !== false)\n .sort()\n : [],\n [uncheckedAddresses]\n )\n\n const results = useSingleContractMultipleData(\n multicallContract,\n 'getEthBalance',\n addresses.map(address => [address])\n )\n\n return useMemo(\n () =>\n addresses.reduce<{ [address: string]: CurrencyAmount }>((memo, address, i) => {\n const value = results?.[i]?.result?.[0]\n if (value) memo[address] = CurrencyAmount.ether(JSBI.BigInt(value.toString()))\n return memo\n }, {}),\n [addresses, results]\n )\n}\n\n/**\n * Returns a map of token addresses to their eventually consistent token balances for a single account.\n */\nexport function useTokenBalancesWithLoadingIndicator(\n address?: string,\n tokens?: (Token | undefined)[]\n): [{ [tokenAddress: string]: TokenAmount | undefined }, boolean] {\n const validatedTokens: Token[] = useMemo(\n () => tokens?.filter((t?: Token): t is Token => isAddress(t?.address) !== false) ?? [],\n [tokens]\n )\n\n const validatedTokenAddresses = useMemo(() => validatedTokens.map(vt => vt.address), [validatedTokens])\n\n const balances = useMultipleContractSingleData(validatedTokenAddresses, ERC20_INTERFACE, 'balanceOf', [address])\n\n const anyLoading: boolean = useMemo(() => balances.some(callState => callState.loading), [balances])\n\n return [\n useMemo(\n () =>\n address && validatedTokens.length > 0\n ? validatedTokens.reduce<{ [tokenAddress: string]: TokenAmount | undefined }>((memo, token, i) => {\n const value = balances?.[i]?.result?.[0]\n const amount = value ? JSBI.BigInt(value.toString()) : undefined\n if (amount) {\n memo[token.address] = new TokenAmount(token, amount)\n }\n return memo\n }, {})\n : {},\n [address, validatedTokens, balances]\n ),\n anyLoading\n ]\n}\n\nexport function useTokenBalances(\n address?: string,\n tokens?: (Token | undefined)[]\n): { [tokenAddress: string]: TokenAmount | undefined } {\n return useTokenBalancesWithLoadingIndicator(address, tokens)[0]\n}\n\n// get the balance for a single token/account combo\nexport function useTokenBalance(account?: string, token?: Token): TokenAmount | undefined {\n const tokenBalances = useTokenBalances(account, [token])\n if (!token) return undefined\n return tokenBalances[token.address]\n}\n\nexport function useCurrencyBalances(\n account?: string,\n currencies?: (Currency | undefined)[]\n): (CurrencyAmount | undefined)[] {\n const tokens = useMemo(() => currencies?.filter((currency): currency is Token => currency instanceof Token) ?? [], [\n currencies\n ])\n\n const tokenBalances = useTokenBalances(account, tokens)\n const containsETH: boolean = useMemo(() => currencies?.some(currency => currency === ETHER) ?? false, [currencies])\n const ethBalance = useETHBalances(containsETH ? [account] : [])\n\n return useMemo(\n () =>\n currencies?.map(currency => {\n if (!account || !currency) return undefined\n if (currency instanceof Token) return tokenBalances[currency.address]\n if (currency === ETHER) return ethBalance[account]\n return undefined\n }) ?? [],\n [account, currencies, ethBalance, tokenBalances]\n )\n}\n\nexport function useCurrencyBalance(account?: string, currency?: Currency): CurrencyAmount | undefined {\n return useCurrencyBalances(account, [currency])[0]\n}\n\n// mimics useAllBalances\nexport function useAllTokenBalances(): { [tokenAddress: string]: TokenAmount | undefined } {\n const { account } = useActiveWeb3React()\n const allTokens = useAllTokens()\n const allTokensArray = useMemo(() => Object.values(allTokens ?? {}), [allTokens])\n const balances = useTokenBalances(account ?? undefined, allTokensArray)\n return balances ?? {}\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Returns the last value of type T that passes a filter function\n * @param value changing value\n * @param filterFn function that determines whether a given value should be considered for the last value\n */\nexport default function useLast(\n value: T | undefined | null,\n filterFn?: (value: T | null | undefined) => boolean\n): T | null | undefined {\n const [last, setLast] = useState(filterFn && filterFn(value) ? value : undefined)\n useEffect(() => {\n setLast((prev) => {\n const shouldUse: boolean = filterFn ? filterFn(value) : true\n if (shouldUse) return value\n return prev\n })\n }, [filterFn, value])\n return last\n}\n\nfunction isDefined(x: T | null | undefined): x is T {\n return x !== null && x !== undefined\n}\n\n/**\n * Returns the last truthy value of type T\n * @param value changing value\n */\nexport function useLastTruthy(value: T | undefined | null): T | null | undefined {\n return useLast(value, isDefined)\n}\n","import CID from 'cids'\nimport { getCodec, rmPrefix } from 'multicodec'\nimport { decode, toB58String } from 'multihashes'\n\nexport function hexToUint8Array(hex: string): Uint8Array {\n hex = hex.startsWith('0x') ? hex.substr(2) : hex\n if (hex.length % 2 !== 0) throw new Error('hex must have length that is multiple of 2')\n const arr = new Uint8Array(hex.length / 2)\n for (let i = 0; i < arr.length; i++) {\n arr[i] = parseInt(hex.substr(i * 2, 2), 16)\n }\n return arr\n}\n\nconst UTF_8_DECODER = new TextDecoder()\n\n/**\n * Returns the URI representation of the content hash for supported codecs\n * @param contenthash to decode\n */\nexport default function contenthashToUri(contenthash: string): string {\n const buff = hexToUint8Array(contenthash)\n const codec = getCodec(buff as Buffer) // the typing is wrong for @types/multicodec\n switch (codec) {\n case 'ipfs-ns': {\n const data = rmPrefix(buff as Buffer)\n const cid = new CID(data)\n return `ipfs://${toB58String(cid.multihash)}`\n }\n case 'ipns-ns': {\n const data = rmPrefix(buff as Buffer)\n const cid = new CID(data)\n const multihash = decode(cid.multihash)\n if (multihash.name === 'identity') {\n return `ipns://${UTF_8_DECODER.decode(multihash.digest).trim()}`\n } \n return `ipns://${toB58String(cid.multihash)}`\n \n }\n default:\n throw new Error(`Unrecognized codec: ${codec}`)\n }\n}\n","const ENS_NAME_REGEX = /^(([a-zA-Z0-9]+\\.)+)eth(\\/.*)?$/\n\nexport function parseENSAddress(ensAddress: string): { ensName: string; ensPath: string | undefined } | undefined {\n const match = ensAddress.match(ENS_NAME_REGEX)\n if (!match) return undefined\n return { ensName: `${match[1].toLowerCase()}eth`, ensPath: match[3] }\n}\n\nexport default parseENSAddress\n","/**\n * Given a URI that may be ipfs, ipns, http, or https protocol, return the fetch-able http(s) URLs for the same content\n * @param uri to convert to fetch-able http url\n */\nexport default function uriToHttp(uri: string): string[] {\n const protocol = uri.split(':')[0].toLowerCase()\n switch (protocol) {\n case 'https':\n return [uri]\n case 'http':\n return [`https${ uri.substr(4)}`, uri]\n case 'ipfs':\n const hash = uri.match(/^ipfs:(\\/\\/)?(.*)$/i)?.[2]\n return [`https://cloudflare-ipfs.com/ipfs/${hash}/`, `https://ipfs.io/ipfs/${hash}/`]\n case 'ipns':\n const name = uri.match(/^ipns:(\\/\\/)?(.*)$/i)?.[2]\n return [`https://cloudflare-ipfs.com/ipns/${name}/`, `https://ipfs.io/ipns/${name}/`]\n default:\n return []\n }\n}\n","/**\n * Returns true if the string value is zero in hex\n * @param hexNumberString\n */\nexport default function isZero(hexNumberString: string) {\n return /^0x0*$/.test(hexNumberString)\n}\n","import { useMemo } from 'react'\nimport contenthashToUri from '../utils/contenthashToUri'\nimport { parseENSAddress } from '../utils/parseENSAddress'\nimport uriToHttp from '../utils/uriToHttp'\nimport useENSContentHash from './useENSContentHash'\n\nexport default function useHttpLocations(uri: string | undefined): string[] {\n const ens = useMemo(() => (uri ? parseENSAddress(uri) : undefined), [uri])\n const resolvedContentHash = useENSContentHash(ens?.ensName)\n return useMemo(() => {\n if (ens) {\n return resolvedContentHash.contenthash ? uriToHttp(contenthashToUri(resolvedContentHash.contenthash)) : []\n } \n return uri ? uriToHttp(uri) : []\n \n }, [ens, resolvedContentHash.contenthash, uri])\n}\n","import { namehash } from 'ethers/lib/utils'\nimport { useMemo } from 'react'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport isZero from '../utils/isZero'\nimport { useENSRegistrarContract, useENSResolverContract } from './useContract'\n\n/**\n * Does a lookup for an ENS name to find its contenthash.\n */\nexport default function useENSContentHash(ensName?: string | null): { loading: boolean; contenthash: string | null } {\n const ensNodeArgument = useMemo(() => {\n if (!ensName) return [undefined]\n try {\n return ensName ? [namehash(ensName)] : [undefined]\n } catch (error) {\n return [undefined]\n }\n }, [ensName])\n const registrarContract = useENSRegistrarContract(false)\n const resolverAddressResult = useSingleCallResult(registrarContract, 'resolver', ensNodeArgument)\n const resolverAddress = resolverAddressResult.result?.[0]\n const resolverContract = useENSResolverContract(\n resolverAddress && isZero(resolverAddress) ? undefined : resolverAddress,\n false\n )\n const contenthash = useSingleCallResult(resolverContract, 'contenthash', ensNodeArgument)\n\n return {\n contenthash: contenthash.result?.[0] ?? null,\n loading: resolverAddressResult.loading || contenthash.loading\n }\n}\n","import React, { useState } from 'react'\nimport { HelpCircle } from 'react-feather'\n\nconst BAD_SRCS: { [tokenAddress: string]: true } = {}\n\nexport interface LogoProps {\n alt?: string\n style?: any\n className?: string\n srcs: string[]\n}\n\n/**\n * Renders an image by sequentially trying a list of URIs, and then eventually a fallback triangle alert\n */\nexport default function Logo({ srcs, alt, ...rest }: LogoProps) {\n const [, refresh] = useState(0)\n\n const src: string | undefined = srcs.find((s) => !BAD_SRCS[s])\n\n if (src) {\n return (\n {\n if (src) BAD_SRCS[src] = true\n refresh((i) => i + 1)\n }}\n />\n )\n }\n\n return \n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport useHttpLocations from '../../hooks/useHttpLocations'\n\nimport Logo from '../Logo'\n\nconst StyledListLogo = styled(Logo)<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n`\n\nexport default function ListLogo({\n logoURI,\n style,\n size = '24px',\n alt\n}: {\n logoURI: string\n size?: string\n style?: React.CSSProperties\n alt?: string\n}) {\n const srcs: string[] = useHttpLocations(logoURI)\n\n return \n}\n","import { useEffect, useRef } from 'react'\n\nexport default function useInterval(callback: () => void, delay: null | number, leading = true) {\n const savedCallback = useRef<() => void>()\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback\n }, [callback])\n\n // Set up the interval.\n useEffect(() => {\n function tick() {\n const { current } = savedCallback\n if (current) {\n current()\n }\n }\n\n if (delay !== null) {\n if (leading) tick()\n const id = setInterval(tick, delay)\n return () => clearInterval(id)\n }\n return undefined\n }, [delay, leading])\n}\n","import { Placement } from '@popperjs/core'\nimport { transparentize } from 'polished'\nimport React, { useCallback, useState } from 'react'\nimport { usePopper } from 'react-popper'\nimport styled from 'styled-components'\nimport Portal from '@reach/portal'\nimport useInterval from '../../hooks/useInterval'\n\nconst PopoverContainer = styled.div<{ show: boolean }>`\n z-index: 9999;\n\n visibility: ${(props) => (props.show ? 'visible' : 'hidden')};\n opacity: ${(props) => (props.show ? 1 : 0)};\n transition: visibility 150ms linear, opacity 150ms linear;\n\n background: ${({ theme }) => theme.colors.invertedContrast};\n border: 1px solid ${({ theme }) => theme.colors.tertiary};\n box-shadow: 0 4px 8px 0 ${transparentize(0.9, '#2F80ED')};\n color: ${({ theme }) => theme.colors.textSubtle};\n border-radius: 8px;\n`\n\nconst ReferenceElement = styled.div`\n display: inline-block;\n`\n\nconst Arrow = styled.div`\n width: 8px;\n height: 8px;\n z-index: 9998;\n\n ::before {\n position: absolute;\n width: 8px;\n height: 8px;\n z-index: 9998;\n\n content: '';\n border: 1px solid ${({ theme }) => theme.colors.tertiary};\n transform: rotate(45deg);\n background: ${({ theme }) => theme.colors.invertedContrast};\n }\n\n &.arrow-top {\n bottom: -5px;\n ::before {\n border-top: none;\n border-left: none;\n }\n }\n\n &.arrow-bottom {\n top: -5px;\n ::before {\n border-bottom: none;\n border-right: none;\n }\n }\n\n &.arrow-left {\n right: -5px;\n\n ::before {\n border-bottom: none;\n border-left: none;\n }\n }\n\n &.arrow-right {\n left: -5px;\n ::before {\n border-right: none;\n border-top: none;\n }\n }\n`\n\nexport interface PopoverProps {\n content: React.ReactNode\n show: boolean\n children: React.ReactNode\n placement?: Placement\n}\n\nexport default function Popover({ content, show, children, placement = 'auto' }: PopoverProps) {\n const [referenceElement, setReferenceElement] = useState(null)\n const [popperElement, setPopperElement] = useState(null)\n const [arrowElement, setArrowElement] = useState(null)\n const { styles, update, attributes } = usePopper(referenceElement, popperElement, {\n placement,\n strategy: 'fixed',\n modifiers: [\n { name: 'offset', options: { offset: [8, 8] } },\n { name: 'arrow', options: { element: arrowElement } },\n ],\n })\n const updateCallback = useCallback(() => {\n if (update) {\n update()\n }\n }, [update])\n useInterval(updateCallback, show ? 100 : null)\n\n return (\n <>\n {children}\n \n \n {content}\n \n \n \n \n )\n}\n","import React, { useCallback, useState } from 'react'\nimport styled from 'styled-components'\nimport Popover, { PopoverProps } from '../Popover'\n\nconst TooltipContainer = styled.div`\n width: 228px;\n padding: 0.6rem 1rem;\n line-height: 150%;\n font-weight: 400;\n`\n\ninterface TooltipProps extends Omit {\n text: string\n}\n\nexport default function Tooltip({ text, ...rest }: TooltipProps) {\n return {text}} {...rest} />\n}\n\nexport function MouseoverTooltip({ children, ...rest }: Omit) {\n const [show, setShow] = useState(false)\n const open = useCallback(() => setShow(true), [setShow])\n const close = useCallback(() => setShow(false), [setShow])\n return (\n \n
\n {children}\n
\n
\n )\n}\n","import React, { useCallback, useState } from 'react'\nimport { HelpCircle as Question } from 'react-feather'\nimport styled from 'styled-components'\nimport Tooltip from '../Tooltip'\n\nconst QuestionWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.2rem;\n border: none;\n background: none;\n outline: none;\n cursor: default;\n border-radius: 36px;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n color: ${({ theme }) => theme.colors.textSubtle};\n\n :hover,\n :focus {\n opacity: 0.7;\n }\n`\n\nexport default function QuestionHelper({ text }: { text: string }) {\n const [show, setShow] = useState(false)\n\n const open = useCallback(() => setShow(true), [setShow])\n const close = useCallback(() => setShow(false), [setShow])\n\n return (\n \n \n \n \n \n \n \n )\n}\n","import styled from 'styled-components'\nimport Logo from '../Logo'\n\nconst CoinLogo = styled(Logo)<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n`\n\nexport default CoinLogo\n","import { Currency, ETHER, Token } from '@doublemoondev/sdk'\nimport React, { useMemo } from 'react'\nimport styled from 'styled-components'\nimport useHttpLocations from '../../hooks/useHttpLocations'\nimport { WrappedTokenInfo } from '../../state/lists/hooks'\nimport Logo from '../Logo'\nimport CoinLogo from '../pancake/CoinLogo'\n\nconst getTokenLogoURL = (address: string) =>\n `https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/smartchain/assets/${address}/logo.png`\n\nconst StyledBnbLogo = styled.img<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n box-shadow: 0px 6px 10px rgba(0, 0, 0, 0.075);\n border-radius: 24px;\n`\n\nconst StyledLogo = styled(Logo)<{ size: string }>`\n width: ${({ size }) => size};\n height: ${({ size }) => size};\n`\n\nexport default function CurrencyLogo({\n currency,\n size = '24px',\n style,\n}: {\n currency?: Currency\n size?: string\n style?: React.CSSProperties\n}) {\n const uriLocations = useHttpLocations(currency instanceof WrappedTokenInfo ? currency.logoURI : undefined)\n\n const srcs: string[] = useMemo(() => {\n if (currency === ETHER) return []\n\n if (currency instanceof Token) {\n if (currency instanceof WrappedTokenInfo) {\n return [...uriLocations, `/images/coins/${currency?.address ?? 'token'}.png`, getTokenLogoURL(currency.address)]\n }\n\n return [`/images/coins/${currency?.address ?? 'token'}.png`, getTokenLogoURL(currency.address)]\n }\n return []\n }, [currency, uriLocations])\n\n if (currency === ETHER) {\n return \n }\n\n return (currency as any)?.symbol ? (\n \n ) : (\n \n )\n}\n","import React from 'react'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport { ChainId, Currency, currencyEquals, ETHER, Token } from '@doublemoondev/sdk'\nimport styled from 'styled-components'\n\nimport useI18n from 'hooks/useI18n'\nimport { SUGGESTED_BASES } from '../../constants'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { AutoRow } from '../Row'\nimport CurrencyLogo from '../CurrencyLogo'\n\nconst BaseWrapper = styled.div<{ disable?: boolean }>`\n border: 1px solid ${({ theme, disable }) => (disable ? 'transparent' : theme.colors.tertiary)};\n border-radius: 10px;\n display: flex;\n padding: 6px;\n\n align-items: center;\n :hover {\n cursor: ${({ disable }) => !disable && 'pointer'};\n background-color: ${({ theme, disable }) => !disable && theme.colors.invertedContrast};\n }\n\n background-color: ${({ theme, disable }) => disable && theme.colors.tertiary};\n opacity: ${({ disable }) => disable && '0.4'};\n`\n\nexport default function CommonBases({\n chainId,\n onSelect,\n selectedCurrency,\n}: {\n chainId?: ChainId\n selectedCurrency?: Currency | null\n onSelect: (currency: Currency) => void\n}) {\n const TranslateString = useI18n()\n return (\n \n \n Common bases\n \n \n \n {\n if (!selectedCurrency || !currencyEquals(selectedCurrency, ETHER)) {\n onSelect(ETHER)\n }\n }}\n disable={selectedCurrency === ETHER}\n >\n \n BNB\n \n {(chainId ? SUGGESTED_BASES[chainId] : []).map((token: Token) => {\n const selected = selectedCurrency instanceof Token && selectedCurrency.address === token.address\n return (\n !selected && onSelect(token)} disable={selected} key={token.address}>\n \n {token.symbol}\n \n )\n })}\n \n \n )\n}\n","import styled from 'styled-components'\nimport { AutoColumn } from '../Column'\nimport { RowBetween, RowFixed } from '../Row'\n\nexport const FadedSpan = styled(RowFixed)`\n color: ${({ theme }) => theme.colors.primary};\n font-size: 14px;\n`\n\nexport const PaddedColumn = styled(AutoColumn)`\n padding: 20px;\n padding-bottom: 12px;\n`\n\nexport const MenuItem = styled(RowBetween)`\n padding: 4px 20px;\n height: 56px;\n display: grid;\n grid-template-columns: auto minmax(auto, 1fr) auto minmax(0, 72px);\n grid-gap: 16px;\n cursor: ${({ disabled }) => !disabled && 'pointer'};\n pointer-events: ${({ disabled }) => disabled && 'none'};\n :hover {\n background-color: ${({ theme, disabled }) => !disabled && theme.colors.invertedContrast};\n }\n opacity: ${({ disabled, selected }) => (disabled || selected ? 0.5 : 1)};\n`\n\nexport const SearchInput = styled.input`\n position: relative;\n display: flex;\n padding: 16px;\n align-items: center;\n width: 100%;\n white-space: nowrap;\n background: none;\n border: none;\n outline: none;\n border-radius: 20px;\n color: ${({ theme }) => theme.colors.text};\n border-style: solid;\n border: 1px solid ${({ theme }) => theme.colors.tertiary};\n -webkit-appearance: none;\n\n font-size: 18px;\n\n ::placeholder {\n color: ${({ theme }) => theme.colors.textDisabled};\n }\n transition: border 100ms;\n :focus {\n border: 1px solid ${({ theme }) => theme.colors.primary};\n outline: none;\n }\n`\nexport const Separator = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n`\n\nexport const SeparatorDark = styled.div`\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.colors.tertiary};\n`\n","import { Currency, CurrencyAmount, currencyEquals, ETHER, Token } from '@doublemoondev/sdk'\nimport React, { CSSProperties, MutableRefObject, useCallback, useMemo } from 'react'\nimport { FixedSizeList } from 'react-window'\nimport styled from 'styled-components'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useSelectedTokenList, WrappedTokenInfo } from '../../state/lists/hooks'\nimport { useAddUserToken, useRemoveUserAddedToken } from '../../state/user/hooks'\nimport { useCurrencyBalance } from '../../state/wallet/hooks'\nimport { LinkStyledButton } from '../Shared'\nimport { useIsUserAddedToken } from '../../hooks/Tokens'\nimport Column from '../Column'\nimport { RowFixed } from '../Row'\nimport CurrencyLogo from '../CurrencyLogo'\nimport { MouseoverTooltip } from '../Tooltip'\nimport { FadedSpan, MenuItem } from './styleds'\nimport Loader from '../Loader'\nimport { isTokenOnList } from '../../utils'\n\nfunction currencyKey(currency: Currency): string {\n return currency instanceof Token ? currency.address : currency === ETHER ? 'ETHER' : ''\n}\n\nconst StyledBalanceText = styled(Text)`\n white-space: nowrap;\n overflow: hidden;\n max-width: 5rem;\n text-overflow: ellipsis;\n`\n\nconst Tag = styled.div`\n background-color: ${({ theme }) => theme.colors.tertiary};\n color: ${({ theme }) => theme.colors.textSubtle};\n font-size: 14px;\n border-radius: 4px;\n padding: 0.25rem 0.3rem 0.25rem 0.3rem;\n max-width: 6rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n justify-self: flex-end;\n margin-right: 4px;\n`\n\nfunction Balance({ balance }: { balance: CurrencyAmount }) {\n return {balance.toSignificant(4)}\n}\n\nconst TagContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n`\n\nfunction TokenTags({ currency }: { currency: Currency }) {\n if (!(currency instanceof WrappedTokenInfo)) {\n return \n }\n\n const { tags } = currency\n if (!tags || tags.length === 0) return \n\n const tag = tags[0]\n\n return (\n \n \n {tag.name}\n \n {tags.length > 1 ? (\n `${name}: ${description}`)\n .join('; \\n')}\n >\n ...\n \n ) : null}\n \n )\n}\n\nfunction CurrencyRow({\n currency,\n onSelect,\n isSelected,\n otherSelected,\n style,\n}: {\n currency: Currency\n onSelect: () => void\n isSelected: boolean\n otherSelected: boolean\n style: CSSProperties\n}) {\n const { account, chainId } = useActiveWeb3React()\n const key = currencyKey(currency)\n const selectedTokenList = useSelectedTokenList()\n const isOnSelectedList = isTokenOnList(selectedTokenList, currency)\n const customAdded = useIsUserAddedToken(currency)\n const balance = useCurrencyBalance(account ?? undefined, currency)\n\n const removeToken = useRemoveUserAddedToken()\n const addToken = useAddUserToken()\n\n // only show add or remove buttons if not on selected list\n return (\n (isSelected ? null : onSelect())}\n disabled={isSelected}\n selected={otherSelected}\n >\n \n \n {currency.symbol}\n \n {!isOnSelectedList && customAdded && !(currency instanceof WrappedTokenInfo) ? (\n \n Added by user\n {\n event.stopPropagation()\n if (chainId && currency instanceof Token) removeToken(chainId, currency.address)\n }}\n >\n (Remove)\n \n \n ) : null}\n {!isOnSelectedList && !customAdded && !(currency instanceof WrappedTokenInfo) ? (\n \n Found by address\n {\n event.stopPropagation()\n if (currency instanceof Token) addToken(currency)\n }}\n >\n (Add)\n \n \n ) : null}\n \n \n \n \n {balance ? : account ? : null}\n \n \n )\n}\n\nexport default function CurrencyList({\n height,\n currencies,\n selectedCurrency,\n onCurrencySelect,\n otherCurrency,\n fixedListRef,\n showETH,\n}: {\n height: number\n currencies: Currency[]\n selectedCurrency?: Currency | null\n onCurrencySelect: (currency: Currency) => void\n otherCurrency?: Currency | null\n fixedListRef?: MutableRefObject\n showETH: boolean\n}) {\n const itemData = useMemo(() => (showETH ? [Currency.ETHER, ...currencies] : [...currencies]), [currencies, showETH])\n\n const Row = useCallback(\n ({ data, index, style }) => {\n const currency: Currency = data[index]\n const isSelected = Boolean(selectedCurrency && currencyEquals(selectedCurrency, currency))\n const otherSelected = Boolean(otherCurrency && currencyEquals(otherCurrency, currency))\n const handleSelect = () => onCurrencySelect(currency)\n return (\n \n )\n },\n [onCurrencySelect, otherCurrency, selectedCurrency]\n )\n\n const itemKey = useCallback((index: number, data: any) => currencyKey(data[index]), [])\n\n return (\n \n {Row}\n \n )\n}\n","import { Token } from '@doublemoondev/sdk'\nimport { isAddress } from '../../utils'\n\nexport function filterTokens(tokens: Token[], search: string): Token[] {\n if (search.length === 0) return tokens\n\n const searchingAddress = isAddress(search)\n\n if (searchingAddress) {\n return tokens.filter((token) => token.address === searchingAddress)\n }\n\n const lowerSearchParts = search\n .toLowerCase()\n .split(/\\s+/)\n .filter((s) => s.length > 0)\n\n if (lowerSearchParts.length === 0) {\n return tokens\n }\n\n const matchesSearch = (s: string): boolean => {\n const sParts = s\n .toLowerCase()\n .split(/\\s+/)\n .filter((str) => str.length > 0)\n\n return lowerSearchParts.every((p) => p.length === 0 || sParts.some((sp) => sp.startsWith(p) || sp.endsWith(p)))\n }\n\n return tokens.filter((token) => {\n const { symbol, name } = token\n\n return (symbol && matchesSearch(symbol)) || (name && matchesSearch(name))\n })\n}\n\nexport default filterTokens\n","import React from 'react'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport styled from 'styled-components'\nimport { RowFixed } from '../Row'\n\nexport const FilterWrapper = styled(RowFixed)`\n padding: 8px;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n color: ${({ theme }) => theme.colors.text};\n border-radius: 8px;\n user-select: none;\n & > * {\n user-select: none;\n }\n :hover {\n cursor: pointer;\n }\n`\n\nexport default function SortButton({\n toggleSortOrder,\n ascending\n}: {\n toggleSortOrder: () => void\n ascending: boolean\n}) {\n return (\n \n {ascending ? '↑' : '↓'}\n \n )\n}\n","import { Token, TokenAmount } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\nimport { useAllTokenBalances } from '../../state/wallet/hooks'\n\n// compare two token amounts with highest one coming first\nfunction balanceComparator(balanceA?: TokenAmount, balanceB?: TokenAmount) {\n if (balanceA && balanceB) {\n return balanceA.greaterThan(balanceB) ? -1 : balanceA.equalTo(balanceB) ? 0 : 1\n }\n if (balanceA && balanceA.greaterThan('0')) {\n return -1\n }\n if (balanceB && balanceB.greaterThan('0')) {\n return 1\n }\n return 0\n}\n\nfunction getTokenComparator(balances: {\n [tokenAddress: string]: TokenAmount | undefined\n}): (tokenA: Token, tokenB: Token) => number {\n return function sortTokens(tokenA: Token, tokenB: Token): number {\n // -1 = a is first\n // 1 = b is first\n\n // sort by balances\n const balanceA = balances[tokenA.address]\n const balanceB = balances[tokenB.address]\n\n const balanceComp = balanceComparator(balanceA, balanceB)\n if (balanceComp !== 0) return balanceComp\n\n if (tokenA.symbol && tokenB.symbol) {\n // sort by symbol\n return tokenA.symbol.toLowerCase() < tokenB.symbol.toLowerCase() ? -1 : 1\n }\n return tokenA.symbol ? -1 : tokenB.symbol ? -1 : 0\n }\n}\n\nexport function useTokenComparator(inverted: boolean): (tokenA: Token, tokenB: Token) => number {\n const balances = useAllTokenBalances()\n const comparator = useMemo(() => getTokenComparator(balances ?? {}), [balances])\n return useMemo(() => {\n if (inverted) {\n return (tokenA: Token, tokenB: Token) => comparator(tokenA, tokenB) * -1\n }\n return comparator\n }, [inverted, comparator])\n}\n\nexport default useTokenComparator\n","import { Currency, ETHER, Token } from '@doublemoondev/sdk'\nimport React, { KeyboardEvent, RefObject, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport { Text, CloseIcon } from '@doublemoondev/doublemoon-uikit'\nimport { useTranslation } from 'react-i18next'\nimport { FixedSizeList } from 'react-window'\nimport { ThemeContext } from 'styled-components'\nimport AutoSizer from 'react-virtualized-auto-sizer'\nimport useI18n from 'hooks/useI18n'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAllTokens, useToken } from '../../hooks/Tokens'\nimport { useSelectedListInfo } from '../../state/lists/hooks'\nimport { LinkStyledButton } from '../Shared'\nimport { isAddress } from '../../utils'\nimport Card from '../Card'\nimport Column from '../Column'\nimport ListLogo from '../ListLogo'\nimport QuestionHelper from '../QuestionHelper'\nimport Row, { RowBetween } from '../Row'\nimport CommonBases from './CommonBases'\nimport CurrencyList from './CurrencyList'\nimport { filterTokens } from './filtering'\nimport SortButton from './SortButton'\nimport { useTokenComparator } from './sorting'\nimport { PaddedColumn, SearchInput, Separator } from './styleds'\n\ninterface CurrencySearchProps {\n isOpen: boolean\n onDismiss: () => void\n selectedCurrency?: Currency | null\n onCurrencySelect: (currency: Currency) => void\n otherSelectedCurrency?: Currency | null\n showCommonBases?: boolean\n onChangeList: () => void\n}\n\nexport function CurrencySearch({\n selectedCurrency,\n onCurrencySelect,\n otherSelectedCurrency,\n showCommonBases,\n onDismiss,\n isOpen,\n onChangeList,\n}: CurrencySearchProps) {\n const { t } = useTranslation()\n const { chainId } = useActiveWeb3React()\n const theme = useContext(ThemeContext)\n\n const fixedList = useRef()\n const [searchQuery, setSearchQuery] = useState('')\n const [invertSearchOrder, setInvertSearchOrder] = useState(false)\n const allTokens = useAllTokens()\n\n // if they input an address, use it\n const isAddressSearch = isAddress(searchQuery)\n const searchToken = useToken(searchQuery)\n\n const showETH: boolean = useMemo(() => {\n const s = searchQuery.toLowerCase().trim()\n return s === '' || s === 'b' || s === 'bn' || s === 'bnb'\n }, [searchQuery])\n\n const tokenComparator = useTokenComparator(invertSearchOrder)\n\n const filteredTokens: Token[] = useMemo(() => {\n if (isAddressSearch) return searchToken ? [searchToken] : []\n return filterTokens(Object.values(allTokens), searchQuery)\n }, [isAddressSearch, searchToken, allTokens, searchQuery])\n\n const filteredSortedTokens: Token[] = useMemo(() => {\n if (searchToken) return [searchToken]\n const sorted = filteredTokens.sort(tokenComparator)\n const symbolMatch = searchQuery\n .toLowerCase()\n .split(/\\s+/)\n .filter((s) => s.length > 0)\n if (symbolMatch.length > 1) return sorted\n\n return [\n ...(searchToken ? [searchToken] : []),\n // sort any exact symbol matches first\n ...sorted.filter((token) => token.symbol?.toLowerCase() === symbolMatch[0]),\n ...sorted.filter((token) => token.symbol?.toLowerCase() !== symbolMatch[0]),\n ]\n }, [filteredTokens, searchQuery, searchToken, tokenComparator])\n\n const handleCurrencySelect = useCallback(\n (currency: Currency) => {\n onCurrencySelect(currency)\n onDismiss()\n },\n [onDismiss, onCurrencySelect]\n )\n\n // clear the input on open\n useEffect(() => {\n if (isOpen) setSearchQuery('')\n }, [isOpen])\n\n // manage focus on modal show\n const inputRef = useRef()\n const handleInput = useCallback((event) => {\n const input = event.target.value\n const checksummedInput = isAddress(input)\n setSearchQuery(checksummedInput || input)\n fixedList.current?.scrollTo(0)\n }, [])\n\n const handleEnter = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n const s = searchQuery.toLowerCase().trim()\n if (s === 'bnb') {\n handleCurrencySelect(ETHER)\n } else if (filteredSortedTokens.length > 0) {\n if (\n filteredSortedTokens[0].symbol?.toLowerCase() === searchQuery.trim().toLowerCase() ||\n filteredSortedTokens.length === 1\n ) {\n handleCurrencySelect(filteredSortedTokens[0])\n }\n }\n }\n },\n [filteredSortedTokens, handleCurrencySelect, searchQuery]\n )\n\n const selectedListInfo = useSelectedListInfo()\n const TranslateString = useI18n()\n return (\n \n \n \n \n {TranslateString(82, 'Select a token')}\n \n \n \n \n }\n onChange={handleInput}\n onKeyDown={handleEnter}\n />\n {showCommonBases && (\n \n )}\n \n {TranslateString(126, 'Token name')}\n setInvertSearchOrder((iso) => !iso)} />\n \n \n\n \n\n
\n \n {({ height }) => (\n \n )}\n \n
\n\n {null && (\n <>\n \n \n \n {selectedListInfo.current ? (\n \n {selectedListInfo.current.logoURI ? (\n \n ) : null}\n {selectedListInfo.current.name}\n \n ) : null}\n \n {selectedListInfo.current ? TranslateString(180, 'Change') : TranslateString(1152, 'Select a list')}\n \n \n \n \n )}\n
\n )\n}\n\nexport default CurrencySearch\n","export const DEFAULT_TOKEN_LIST_URL = 'doublemoonswap'\n\nexport const DEFAULT_LIST_OF_LISTS: string[] = [DEFAULT_TOKEN_LIST_URL]\n","import { TokenList } from '@uniswap/token-lists'\nimport schema from '@uniswap/token-lists/src/tokenlist.schema.json'\nimport Ajv from 'ajv'\nimport contenthashToUri from './contenthashToUri'\nimport { parseENSAddress } from './parseENSAddress'\nimport uriToHttp from './uriToHttp'\n\n// bakeryswap defaultTokenJson\nimport { DEFAULT_TOKEN_LIST_URL } from '../constants/lists'\nimport defaultTokenJson from '../constants/token/doublemoonswap.json'\n\nconst tokenListValidator = new Ajv({ allErrors: true }).compile(schema)\n\n/**\n * Contains the logic for resolving a list URL to a validated token list\n * @param listUrl list url\n * @param resolveENSContentHash resolves an ens name to a contenthash\n */\nexport default async function getTokenList(\n listUrl: string,\n resolveENSContentHash: (ensName: string) => Promise\n): Promise {\n if (listUrl === DEFAULT_TOKEN_LIST_URL) {\n return defaultTokenJson\n }\n const parsedENS = parseENSAddress(listUrl)\n\n let urls: string[]\n if (parsedENS) {\n let contentHashUri\n try {\n contentHashUri = await resolveENSContentHash(parsedENS.ensName)\n } catch (error) {\n console.error(`Failed to resolve ENS name: ${parsedENS.ensName}`, error)\n throw new Error(`Failed to resolve ENS name: ${parsedENS.ensName}`)\n }\n let translatedUri\n try {\n translatedUri = contenthashToUri(contentHashUri)\n } catch (error) {\n console.error('Failed to translate contenthash to URI', contentHashUri)\n throw new Error(`Failed to translate contenthash to URI: ${contentHashUri}`)\n }\n urls = uriToHttp(`${translatedUri}${parsedENS.ensPath ?? ''}`)\n } else {\n urls = uriToHttp(listUrl)\n }\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i]\n const isLast = i === urls.length - 1\n let response\n try {\n response = await fetch(url)\n } catch (error) {\n console.error('Failed to fetch list', listUrl, error)\n if (isLast) throw new Error(`Failed to download list ${listUrl}`)\n // eslint-disable-next-line no-continue\n continue\n }\n\n if (!response.ok) {\n if (isLast) throw new Error(`Failed to download list ${listUrl}`)\n // eslint-disable-next-line no-continue\n continue\n }\n\n const json = await response.json()\n if (!tokenListValidator(json)) {\n const validationErrors: string =\n tokenListValidator.errors?.reduce((memo, error) => {\n const add = `${error.dataPath} ${error.message ?? ''}`\n return memo.length > 0 ? `${memo}; ${add}` : `${add}`\n }, '') ?? 'unknown error'\n throw new Error(`Token list failed validation: ${validationErrors}`)\n }\n return json\n }\n throw new Error('Unrecognized list URL protocol.')\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { Provider } from '@ethersproject/abstract-provider'\nimport { namehash } from 'ethers/lib/utils'\n\nconst REGISTRAR_ABI = [\n {\n constant: true,\n inputs: [\n {\n name: 'node',\n type: 'bytes32'\n }\n ],\n name: 'resolver',\n outputs: [\n {\n name: 'resolverAddress',\n type: 'address'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n }\n]\nconst REGISTRAR_ADDRESS = '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'\n\nconst RESOLVER_ABI = [\n {\n constant: true,\n inputs: [\n {\n internalType: 'bytes32',\n name: 'node',\n type: 'bytes32'\n }\n ],\n name: 'contenthash',\n outputs: [\n {\n internalType: 'bytes',\n name: '',\n type: 'bytes'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n }\n]\n\n// cache the resolver contracts since most of them are the public resolver\nfunction resolverContract(resolverAddress: string, provider: Provider): Contract {\n return new Contract(resolverAddress, RESOLVER_ABI, provider)\n}\n\n/**\n * Fetches and decodes the result of an ENS contenthash lookup on mainnet to a URI\n * @param ensName to resolve\n * @param provider provider to use to fetch the data\n */\nexport default async function resolveENSContentHash(ensName: string, provider: Provider): Promise {\n const ensRegistrarContract = new Contract(REGISTRAR_ADDRESS, REGISTRAR_ABI, provider)\n const hash = namehash(ensName)\n const resolverAddress = await ensRegistrarContract.resolver(hash)\n return resolverContract(resolverAddress, provider).contenthash(hash)\n}\n","import { nanoid } from '@reduxjs/toolkit'\nimport { ChainId } from '@doublemoondev/sdk'\nimport { TokenList } from '@uniswap/token-lists'\nimport { useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { getNetworkLibrary, NETWORK_CHAIN_ID } from '../connectors'\nimport { AppDispatch } from '../state'\nimport { fetchTokenList } from '../state/lists/actions'\nimport getTokenList from '../utils/getTokenList'\nimport resolveENSContentHash from '../utils/resolveENSContentHash'\nimport { useActiveWeb3React } from './index'\n\nexport function useFetchListCallback(): (listUrl: string) => Promise {\n const { chainId, library } = useActiveWeb3React()\n const dispatch = useDispatch()\n\n const ensResolver = useCallback(\n (ensName: string) => {\n if (!library || chainId !== ChainId.MAINNET) {\n if (NETWORK_CHAIN_ID === ChainId.MAINNET) {\n const networkLibrary = getNetworkLibrary()\n if (networkLibrary) {\n return resolveENSContentHash(ensName, networkLibrary)\n }\n }\n throw new Error('Could not construct mainnet ENS resolver')\n }\n return resolveENSContentHash(ensName, library)\n },\n [chainId, library]\n )\n\n return useCallback(\n async (listUrl: string) => {\n const requestId = nanoid()\n dispatch(fetchTokenList.pending({ requestId, url: listUrl }))\n return getTokenList(listUrl, ensResolver)\n .then((tokenList) => {\n dispatch(fetchTokenList.fulfilled({ url: listUrl, tokenList, requestId }))\n return tokenList\n })\n .catch((error) => {\n console.error(`Failed to get list at url ${listUrl}`, error)\n dispatch(fetchTokenList.rejected({ url: listUrl, requestId, errorMessage: error.message }))\n throw error\n })\n },\n [dispatch, ensResolver]\n )\n}\n\nexport default useFetchListCallback\n","import { RefObject, useEffect, useRef } from 'react'\n\nexport function useOnClickOutside(\n node: RefObject,\n handler: undefined | (() => void)\n) {\n const handlerRef = useRef void)>(handler)\n useEffect(() => {\n handlerRef.current = handler\n }, [handler])\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (node.current?.contains(e.target as Node) ?? false) {\n return\n }\n if (handlerRef.current) handlerRef.current()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [node])\n}\n\nexport default useOnClickOutside\n","import React, { memo, useCallback, useMemo, useRef, useState } from 'react'\nimport { ArrowLeft } from 'react-feather'\nimport { usePopper } from 'react-popper'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Button, Text, ChevronDownIcon, CloseIcon } from '@doublemoondev/doublemoon-uikit'\nimport styled from 'styled-components'\nimport useI18n from 'hooks/useI18n'\nimport { useFetchListCallback } from '../../hooks/useFetchListCallback'\nimport { useOnClickOutside } from '../../hooks/useOnClickOutside'\nimport useToggle from '../../hooks/useToggle'\nimport { AppDispatch, AppState } from '../../state'\nimport { acceptListUpdate, removeList, selectList } from '../../state/lists/actions'\nimport { useSelectedListUrl } from '../../state/lists/hooks'\nimport { ExternalLink, LinkStyledButton } from '../Shared'\nimport listVersionLabel from '../../utils/listVersionLabel'\nimport { parseENSAddress } from '../../utils/parseENSAddress'\nimport uriToHttp from '../../utils/uriToHttp'\nimport Column from '../Column'\nimport ListLogo from '../ListLogo'\nimport QuestionHelper from '../QuestionHelper'\nimport Row, { RowBetween } from '../Row'\nimport { PaddedColumn, SearchInput, Separator, SeparatorDark } from './styleds'\n\nconst UnpaddedLinkStyledButton = styled(LinkStyledButton)`\n padding: 0;\n font-size: 1rem;\n opacity: ${({ disabled }) => (disabled ? '0.4' : '1')};\n`\n\nconst PopoverContainer = styled.div<{ show: boolean }>`\n z-index: 100;\n visibility: ${(props) => (props.show ? 'visible' : 'hidden')};\n opacity: ${(props) => (props.show ? 1 : 0)};\n transition: visibility 150ms linear, opacity 150ms linear;\n background: ${({ theme }) => theme.colors.invertedContrast};\n border: 1px solid ${({ theme }) => theme.colors.tertiary};\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),\n 0px 24px 32px rgba(0, 0, 0, 0.01);\n color: ${({ theme }) => theme.colors.textSubtle};\n border-radius: 0.5rem;\n padding: 1rem;\n display: grid;\n grid-template-rows: 1fr;\n grid-gap: 8px;\n font-size: 1rem;\n text-align: left;\n`\n\nconst StyledMenu = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n border: none;\n`\n\nconst StyledListUrlText = styled.div`\n max-width: 160px;\n opacity: 0.6;\n margin-right: 0.5rem;\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n`\n\nfunction ListOrigin({ listUrl }: { listUrl: string }) {\n const ensName = useMemo(() => parseENSAddress(listUrl)?.ensName, [listUrl])\n const host = useMemo(() => {\n if (ensName) return undefined\n const lowerListUrl = listUrl.toLowerCase()\n if (lowerListUrl.startsWith('ipfs://') || lowerListUrl.startsWith('ipns://')) {\n return listUrl\n }\n try {\n const url = new URL(listUrl)\n return url.host\n } catch (error) {\n return undefined\n }\n }, [listUrl, ensName])\n return <>{ensName ?? host}\n}\n\nfunction listUrlRowHTMLId(listUrl: string) {\n return `list-row-${listUrl.replace(/\\./g, '-')}`\n}\n\nconst ListRow = memo(function ListRow({ listUrl, onBack }: { listUrl: string; onBack: () => void }) {\n const listsByUrl = useSelector((state) => state.lists.byUrl)\n const selectedListUrl = useSelectedListUrl()\n const dispatch = useDispatch()\n const { current: list, pendingUpdate: pending } = listsByUrl[listUrl]\n\n const isSelected = listUrl === selectedListUrl\n\n const [open, toggle] = useToggle(false)\n const node = useRef()\n const [referenceElement, setReferenceElement] = useState()\n const [popperElement, setPopperElement] = useState()\n\n const { styles, attributes } = usePopper(referenceElement, popperElement, {\n placement: 'auto',\n strategy: 'fixed',\n modifiers: [{ name: 'offset', options: { offset: [8, 8] } }],\n })\n\n useOnClickOutside(node, open ? toggle : undefined)\n\n const selectThisList = useCallback(() => {\n if (isSelected) return\n\n dispatch(selectList(listUrl))\n onBack()\n }, [dispatch, isSelected, listUrl, onBack])\n\n const handleAcceptListUpdate = useCallback(() => {\n if (!pending) return\n dispatch(acceptListUpdate(listUrl))\n }, [dispatch, listUrl, pending])\n\n const handleRemoveList = useCallback(() => {\n if (window.prompt(`Please confirm you would like to remove this list by typing REMOVE`) === `REMOVE`) {\n dispatch(removeList(listUrl))\n }\n }, [dispatch, listUrl])\n const TranslateString = useI18n()\n if (!list) return null\n\n return (\n \n {list.logoURI ? (\n \n ) : (\n
\n )}\n \n \n \n {list.name}\n \n \n \n \n \n \n \n \n \n
\n \n \n \n
\n\n {open && (\n \n
{list && listVersionLabel(list.version)}
\n \n \n {TranslateString(1206, 'View list')}\n \n \n Remove list\n \n {pending && (\n Update list\n )}\n
\n )}\n
\n {isSelected ? (\n \n ) : (\n <>\n \n Select\n \n \n )}\n \n )\n})\n\nconst ListContainer = styled.div`\n flex: 1;\n overflow: auto;\n`\n\nexport function ListSelect({ onDismiss, onBack }: { onDismiss: () => void; onBack: () => void }) {\n const [listUrlInput, setListUrlInput] = useState('')\n\n const dispatch = useDispatch()\n const lists = useSelector((state) => state.lists.byUrl)\n const adding = Boolean(lists[listUrlInput]?.loadingRequestId)\n const [addError, setAddError] = useState(null)\n\n const handleInput = useCallback((e) => {\n setListUrlInput(e.target.value)\n setAddError(null)\n }, [])\n const fetchList = useFetchListCallback()\n\n const handleAddList = useCallback(() => {\n if (adding) return\n setAddError(null)\n fetchList(listUrlInput)\n .then(() => {\n setListUrlInput('')\n })\n .catch((error) => {\n setAddError(error.message)\n dispatch(removeList(listUrlInput))\n })\n }, [adding, dispatch, fetchList, listUrlInput])\n\n const validUrl: boolean = useMemo(() => {\n return uriToHttp(listUrlInput).length > 0 || Boolean(parseENSAddress(listUrlInput))\n }, [listUrlInput])\n\n const handleEnterKey = useCallback(\n (e) => {\n if (validUrl && e.key === 'Enter') {\n handleAddList()\n }\n },\n [handleAddList, validUrl]\n )\n\n const sortedLists = useMemo(() => {\n const listUrls = Object.keys(lists)\n return listUrls\n .filter((listUrl) => {\n return Boolean(lists[listUrl].current)\n })\n .sort((u1, u2) => {\n const { current: l1 } = lists[u1]\n const { current: l2 } = lists[u2]\n if (l1 && l2) {\n return l1.name.toLowerCase() < l2.name.toLowerCase()\n ? -1\n : l1.name.toLowerCase() === l2.name.toLowerCase()\n ? 0\n : 1\n }\n if (l1) return -1\n if (l2) return 1\n return 0\n })\n }, [lists])\n const TranslateString = useI18n()\n return (\n \n \n \n
\n \n
\n {TranslateString(1208, 'Manage Lists')}\n \n
\n
\n\n \n\n \n \n Add a list{' '}\n \n \n \n \n \n \n {addError ? (\n \n {addError}\n \n ) : null}\n \n\n \n\n \n {sortedLists.map((listUrl) => (\n \n ))}\n \n \n\n
\n Browse lists\n
\n
\n )\n}\n\nexport default ListSelect\n","import { useCallback, useState } from 'react'\n\nexport default function useToggle(initialState = false): [boolean, () => void] {\n const [state, setState] = useState(initialState)\n const toggle = useCallback(() => setState((prev) => !prev), [])\n return [state, toggle]\n}\n","import { Currency } from '@doublemoondev/sdk'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport useLast from '../../hooks/useLast'\nimport { useSelectedListUrl } from '../../state/lists/hooks'\nimport Modal from '../Modal'\nimport { CurrencySearch } from './CurrencySearch'\nimport { ListSelect } from './ListSelect'\n\ninterface CurrencySearchModalProps {\n isOpen: boolean\n onDismiss: () => void\n selectedCurrency?: Currency | null\n onCurrencySelect: (currency: Currency) => void\n otherSelectedCurrency?: Currency | null\n // eslint-disable-next-line react/no-unused-prop-types\n showCommonBases?: boolean\n}\n\nexport default function CurrencySearchModal({\n isOpen,\n onDismiss,\n onCurrencySelect,\n selectedCurrency,\n otherSelectedCurrency,\n}: CurrencySearchModalProps) {\n const [listView, setListView] = useState(false)\n const lastOpen = useLast(isOpen)\n\n useEffect(() => {\n if (isOpen && !lastOpen) {\n setListView(false)\n }\n }, [isOpen, lastOpen])\n\n const handleCurrencySelect = useCallback(\n (currency: Currency) => {\n onCurrencySelect(currency)\n onDismiss()\n },\n [onDismiss, onCurrencySelect]\n )\n\n const handleClickChangeList = useCallback(() => {\n setListView(true)\n }, [])\n const handleClickBack = useCallback(() => {\n setListView(false)\n }, [])\n\n const selectedListUrl = useSelectedListUrl()\n const noListSelected = !selectedListUrl\n\n return (\n \n {listView ? (\n \n ) : noListSelected ? (\n \n ) : (\n \n )}\n \n )\n}\n","import { Currency } from '@doublemoondev/sdk'\nimport React from 'react'\nimport styled from 'styled-components'\nimport CurrencyLogo from '../CurrencyLogo'\n\nconst Wrapper = styled.div<{ margin: boolean; sizeraw: number }>`\n position: relative;\n display: flex;\n flex-direction: row;\n margin-right: ${({ sizeraw, margin }) => margin && `${(sizeraw / 3 + 8).toString() }px`};\n`\n\ninterface DoubleCurrencyLogoProps {\n margin?: boolean\n size?: number\n currency0?: Currency\n currency1?: Currency\n}\n\nconst HigherLogo = styled(CurrencyLogo)`\n z-index: 2;\n`\nconst CoveredLogo = styled(CurrencyLogo)<{ sizeraw: number }>`\n position: absolute;\n left: ${({ sizeraw }) => `${(sizeraw / 2).toString() }px`};\n`\n\nexport default function DoubleCurrencyLogo({\n currency0,\n currency1,\n size = 16,\n margin = false\n}: DoubleCurrencyLogoProps) {\n return (\n \n {currency0 && }\n {currency1 && }\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { escapeRegExp } from '../../utils'\n\nconst StyledInput = styled.input<{ error?: boolean; fontSize?: string; align?: string }>`\n color: ${({ error, theme }) => (error ? theme.colors.failure : theme.colors.text)};\n width: 0;\n position: relative;\n font-weight: 500;\n outline: none;\n border: none;\n flex: 1 1 auto;\n background-color: transparent;\n font-size: 16px;\n text-align: ${({ align }) => align && align};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: 0px;\n -webkit-appearance: textfield;\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n [type='number'] {\n -moz-appearance: textfield;\n }\n\n ::-webkit-outer-spin-button,\n ::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n\n ::placeholder {\n color: ${({ theme }) => theme.colors.textSubtle};\n }\n`\n\nconst inputRegex = RegExp(`^\\\\d*(?:\\\\\\\\[.])?\\\\d*$`) // match escaped \".\" characters via in a non-capturing group\n\nexport const Input = React.memo(function InnerInput({\n value,\n onUserInput,\n placeholder,\n ...rest\n}: {\n value: string | number\n onUserInput: (input: string) => void\n error?: boolean\n fontSize?: string\n align?: 'right' | 'left'\n} & Omit, 'ref' | 'onChange' | 'as'>) {\n const enforcer = (nextUserInput: string) => {\n if (nextUserInput === '' || inputRegex.test(escapeRegExp(nextUserInput))) {\n onUserInput(nextUserInput)\n }\n }\n\n return (\n {\n // replace commas with periods, because uniswap exclusively uses period as the decimal separator\n enforcer(event.target.value.replace(/,/g, '.'))\n }}\n // universal input options\n inputMode=\"decimal\"\n title=\"Token Amount\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n // text-specific options\n type=\"text\"\n pattern=\"^[0-9]*[.,]?[0-9]*$\"\n placeholder={placeholder || '0.0'}\n minLength={1}\n maxLength={79}\n spellCheck=\"false\"\n />\n )\n})\n\nexport default Input\n","import React, { useState, useCallback } from 'react'\nimport { Currency, Pair } from '@doublemoondev/sdk'\nimport { Button, ChevronDownIcon, Text } from '@doublemoondev/doublemoon-uikit'\nimport styled from 'styled-components'\nimport { darken } from 'polished'\nimport useI18n from 'hooks/useI18n'\nimport { useCurrencyBalance } from '../../state/wallet/hooks'\nimport CurrencySearchModal from '../SearchModal/CurrencySearchModal'\nimport CurrencyLogo from '../CurrencyLogo'\nimport DoubleCurrencyLogo from '../DoubleLogo'\nimport { RowBetween } from '../Row'\nimport { Input as NumericalInput } from '../NumericalInput'\nimport { useActiveWeb3React } from '../../hooks'\n\nconst InputRow = styled.div<{ selected: boolean }>`\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n padding: ${({ selected }) => (selected ? '0.75rem 0.5rem 0.75rem 1rem' : '0.75rem 0.75rem 0.75rem 1rem')};\n`\nconst CurrencySelect = styled.button<{ selected: boolean }>`\n align-items: center;\n height: 34px;\n font-size: 16px;\n font-weight: 500;\n background-color: transparent;\n color: ${({ selected, theme }) => (selected ? theme.colors.text : '#FFFFFF')};\n border-radius: 12px;\n outline: none;\n cursor: pointer;\n user-select: none;\n border: none;\n padding: 0 0.5rem;\n :focus,\n :hover {\n background-color: ${({ theme }) => darken(0.05, theme.colors.input)};\n }\n`\nconst LabelRow = styled.div`\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n color: ${({ theme }) => theme.colors.text};\n font-size: 0.75rem;\n line-height: 1rem;\n padding: 0.75rem 1rem 0 1rem;\n span:hover {\n cursor: pointer;\n color: ${({ theme }) => darken(0.2, theme.colors.textSubtle)};\n }\n`\nconst Aligner = styled.span`\n display: flex;\n align-items: center;\n justify-content: space-between;\n`\nconst InputPanel = styled.div<{ hideInput?: boolean }>`\n display: flex;\n flex-flow: column nowrap;\n position: relative;\n border-radius: ${({ hideInput }) => (hideInput ? '8px' : '20px')};\n background-color: ${({ theme }) => theme.colors.background};\n z-index: 1;\n`\nconst Container = styled.div<{ hideInput: boolean }>`\n border-radius: 16px;\n background-color: ${({ theme }) => theme.colors.input};\n box-shadow: ${({ theme }) => theme.shadows.inset};\n`\ninterface CurrencyInputPanelProps {\n value: string\n onUserInput: (value: string) => void\n onMax?: () => void\n showMaxButton: boolean\n label?: string\n onCurrencySelect?: (currency: Currency) => void\n currency?: Currency | null\n disableCurrencySelect?: boolean\n hideBalance?: boolean\n pair?: Pair | null\n hideInput?: boolean\n otherCurrency?: Currency | null\n id: string\n showCommonBases?: boolean\n}\nexport default function CurrencyInputPanel({\n value,\n onUserInput,\n onMax,\n showMaxButton,\n label,\n onCurrencySelect,\n currency,\n disableCurrencySelect = false,\n hideBalance = false,\n pair = null, // used for double token logo\n hideInput = false,\n otherCurrency,\n id,\n showCommonBases,\n}: CurrencyInputPanelProps) {\n const [modalOpen, setModalOpen] = useState(false)\n const { account } = useActiveWeb3React()\n const selectedCurrencyBalance = useCurrencyBalance(account ?? undefined, currency ?? undefined)\n const TranslateString = useI18n()\n const translatedLabel = label || TranslateString(132, 'Input')\n const handleDismissSearch = useCallback(() => {\n setModalOpen(false)\n }, [setModalOpen])\n return (\n \n \n {!hideInput && (\n \n \n {translatedLabel}\n {account && (\n \n {!hideBalance && !!currency && selectedCurrencyBalance\n ? `Balance: ${selectedCurrencyBalance?.toSignificant(6)}`\n : ' -'}\n \n )}\n \n \n )}\n \n {!hideInput && (\n <>\n {\n onUserInput(val)\n }}\n />\n {account && currency && showMaxButton && label !== 'To' && (\n \n )}\n \n )}\n {\n if (!disableCurrencySelect) {\n setModalOpen(true)\n }\n }}\n >\n \n {pair ? (\n \n ) : currency ? (\n \n ) : null}\n {pair ? (\n \n {pair?.token0.symbol}:{pair?.token1.symbol}\n \n ) : (\n \n {(currency && currency.symbol && currency.symbol.length > 20\n ? `${currency.symbol.slice(0, 4)}...${currency.symbol.slice(\n currency.symbol.length - 5,\n currency.symbol.length\n )}`\n : currency?.symbol) || TranslateString(1196, 'Select a currency')}\n \n )}\n {!disableCurrencySelect && }\n \n \n \n \n {!disableCurrencySelect && onCurrencySelect && (\n \n )}\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { Link as HistoryLink } from 'react-router-dom'\nimport { ArrowLeft } from 'react-feather'\nimport { RowBetween } from 'components/Row'\nimport QuestionHelper from 'components/QuestionHelper'\nimport useI18n from 'hooks/useI18n'\n\nconst Tabs = styled.div`\n display: flex;\n flex-flow: row nowrap;\n align-items: center;\n border-radius: 3rem;\n justify-content: space-evenly;\n`\n\nconst ActiveText = styled.div`\n font-weight: 500;\n font-size: 20px;\n`\n\nconst StyledArrowLeft = styled(ArrowLeft)`\n color: ${({ theme }) => theme.colors.text};\n`\n\nexport function FindPoolTabs() {\n const TranslateString = useI18n()\n return (\n \n \n \n \n \n Import Pool\n \n \n \n )\n}\n\nexport function AddRemoveTabs({ adding }: { adding: boolean }) {\n const TranslateString = useI18n()\n return (\n \n \n \n \n \n {adding ? TranslateString(258, 'Add') : TranslateString(260, 'Remove')} Liquidity\n \n \n \n )\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Token, TokenAmount } from '@doublemoondev/sdk'\nimport { useTokenContract } from '../hooks/useContract'\nimport { useSingleCallResult } from '../state/multicall/hooks'\n\n// returns undefined if input token is undefined, or fails to get token contract,\n// or contract total supply cannot be fetched\nexport function useTotalSupply(token?: Token): TokenAmount | undefined {\n const contract = useTokenContract(token?.address, false)\n\n const totalSupply: BigNumber = useSingleCallResult(contract, 'totalSupply')?.result?.[0]\n\n return token && totalSupply ? new TokenAmount(token, totalSupply.toString()) : undefined\n}\n\nexport default useTotalSupply\n","import { Currency, ETHER, Token } from '@doublemoondev/sdk'\n\nexport function currencyId(currency: Currency): string {\n if (currency === ETHER) return 'BNB'\n if (currency instanceof Token) return currency.address\n throw new Error('invalid currency')\n}\n\nexport default currencyId\n","import { ChainId, Currency, CurrencyAmount, ETHER, Token, TokenAmount, WETH } from '@doublemoondev/sdk'\n\nexport function wrappedCurrency(currency: Currency | undefined, chainId: ChainId | undefined): Token | undefined {\n // eslint-disable-next-line no-nested-ternary\n return chainId && currency === ETHER ? WETH[chainId] : currency instanceof Token ? currency : undefined\n}\n\nexport function wrappedCurrencyAmount(\n currencyAmount: CurrencyAmount | undefined,\n chainId: ChainId | undefined\n): TokenAmount | undefined {\n const token = currencyAmount && chainId ? wrappedCurrency(currencyAmount.currency, chainId) : undefined\n return token && currencyAmount ? new TokenAmount(token, currencyAmount.raw) : undefined\n}\n\nexport function unwrappedToken(token: Token): Currency {\n if (token.equals(WETH[token.chainId])) return ETHER\n return token\n}\n","import { transparentize } from 'polished'\nimport React from 'react'\nimport { AlertTriangle } from 'react-feather'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport styled, { css } from 'styled-components'\nimport { AutoColumn } from '../Column'\n\nexport const Wrapper = styled.div`\n position: relative;\n`\n\nexport const ArrowWrapper = styled.div<{ clickable: boolean }>`\n padding: 2px;\n\n ${({ clickable }) =>\n clickable\n ? css`\n :hover {\n cursor: pointer;\n opacity: 0.8;\n }\n `\n : null}\n`\n\nexport const SectionBreak = styled.div`\n height: 1px;\n width: 100%;\n background-color: ${({ theme }) => theme.colors.tertiary};\n`\n\nexport const BottomGrouping = styled.div`\n margin-top: 1rem;\n`\n\nexport const ErrorText = styled(Text)<{ severity?: 0 | 1 | 2 | 3 | 4 }>`\n color: ${({ theme, severity }) =>\n severity === 3 || severity === 4\n ? theme.colors.failure\n : severity === 2\n ? theme.colors.binance\n : severity === 1\n ? theme.colors.text\n : theme.colors.success};\n`\n\nexport const StyledBalanceMaxMini = styled.button`\n height: 22px;\n width: 22px;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n border: none;\n border-radius: 50%;\n padding: 0.2rem;\n font-size: 0.875rem;\n font-weight: 400;\n margin-left: 0.4rem;\n cursor: pointer;\n color: ${({ theme }) => theme.colors.textSubtle};\n display: flex;\n justify-content: center;\n align-items: center;\n float: right;\n\n :hover {\n background-color: ${({ theme }) => theme.colors.tertiary};\n }\n :focus {\n background-color: ${({ theme }) => theme.colors.tertiary};\n outline: none;\n }\n`\n\n// styles\nexport const Dots = styled.span`\n &::after {\n display: inline-block;\n animation: ellipsis 1.25s infinite;\n content: '.';\n width: 1em;\n text-align: left;\n }\n @keyframes ellipsis {\n 0% {\n content: '.';\n }\n 33% {\n content: '..';\n }\n 66% {\n content: '...';\n }\n }\n`\n\nconst SwapCallbackErrorInner = styled.div`\n background-color: ${({ theme }) => transparentize(0.9, theme.colors.failure)};\n border-radius: 1rem;\n display: flex;\n align-items: center;\n font-size: 0.825rem;\n width: 100%;\n padding: 3rem 1.25rem 1rem 1rem;\n margin-top: -2rem;\n color: ${({ theme }) => theme.colors.failure};\n z-index: -1;\n p {\n padding: 0;\n margin: 0;\n font-weight: 500;\n }\n`\n\nconst SwapCallbackErrorInnerAlertTriangle = styled.div`\n background-color: ${({ theme }) => transparentize(0.9, theme.colors.failure)};\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 12px;\n border-radius: 12px;\n min-width: 48px;\n height: 48px;\n`\n\nexport function SwapCallbackError({ error }: { error: string }) {\n return (\n \n \n \n \n

{error}

\n
\n )\n}\n\nexport const SwapShowAcceptChanges = styled(AutoColumn)`\n background-color: ${({ theme }) => transparentize(0.9, theme.colors.primary)};\n color: ${({ theme }) => theme.colors.primary};\n padding: 0.5rem;\n border-radius: 12px;\n margin-top: 8px;\n`\n","import React, { useState } from 'react'\nimport { JSBI, Pair, Percent } from '@doublemoondev/sdk'\nimport { Button, Card as UIKitCard, CardBody, Text } from '@doublemoondev/doublemoon-uikit'\nimport { darken } from 'polished'\nimport { ChevronDown, ChevronUp } from 'react-feather'\nimport { Link } from 'react-router-dom'\nimport styled from 'styled-components'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { useTokenBalance } from '../../state/wallet/hooks'\nimport { currencyId } from '../../utils/currencyId'\nimport { unwrappedToken } from '../../utils/wrappedCurrency'\nimport Card from '../Card'\nimport { AutoColumn } from '../Column'\nimport CurrencyLogo from '../CurrencyLogo'\nimport DoubleCurrencyLogo from '../DoubleLogo'\nimport { RowBetween, RowFixed } from '../Row'\nimport { Dots } from '../swap/styleds'\n\nexport const FixedHeightRow = styled(RowBetween)`\n height: 24px;\n`\n\nexport const HoverCard = styled(Card)`\n border: 1px solid ${({ theme }) => theme.colors.invertedContrast};\n :hover {\n border: 1px solid ${({ theme }) => darken(0.06, theme.colors.invertedContrast)};\n }\n`\n\ninterface PositionCardProps {\n pair: Pair\n // eslint-disable-next-line react/no-unused-prop-types\n showUnwrapped?: boolean\n}\n\nexport function MinimalPositionCard({ pair, showUnwrapped = false }: PositionCardProps) {\n const { account } = useActiveWeb3React()\n\n const currency0 = showUnwrapped ? pair.token0 : unwrappedToken(pair.token0)\n const currency1 = showUnwrapped ? pair.token1 : unwrappedToken(pair.token1)\n\n const [showMore, setShowMore] = useState(false)\n\n const userPoolBalance = useTokenBalance(account ?? undefined, pair.liquidityToken)\n const totalPoolTokens = useTotalSupply(pair.liquidityToken)\n\n const [token0Deposited, token1Deposited] =\n !!pair &&\n !!totalPoolTokens &&\n !!userPoolBalance &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? [\n pair.getLiquidityValue(pair.token0, totalPoolTokens, userPoolBalance, false),\n pair.getLiquidityValue(pair.token1, totalPoolTokens, userPoolBalance, false),\n ]\n : [undefined, undefined]\n\n return (\n <>\n {userPoolBalance && (\n \n \n \n \n \n \n LP Tokens in your Wallet\n \n \n \n setShowMore(!showMore)}>\n \n \n \n {currency0.symbol}/{currency1.symbol}\n \n \n \n {userPoolBalance ? userPoolBalance.toSignificant(4) : '-'}\n \n \n \n \n {currency0.symbol}:\n {token0Deposited ? (\n \n \n {token0Deposited?.toSignificant(6)}\n \n \n ) : (\n '-'\n )}\n \n \n {currency1.symbol}:\n {token1Deposited ? (\n \n \n {token1Deposited?.toSignificant(6)}\n \n \n ) : (\n '-'\n )}\n \n \n \n \n \n )}\n \n )\n}\n\nexport default function FullPositionCard({ pair }: PositionCardProps) {\n const { account } = useActiveWeb3React()\n\n const currency0 = unwrappedToken(pair.token0)\n const currency1 = unwrappedToken(pair.token1)\n\n const [showMore, setShowMore] = useState(false)\n\n const userPoolBalance = useTokenBalance(account ?? undefined, pair.liquidityToken)\n const totalPoolTokens = useTotalSupply(pair.liquidityToken)\n\n const poolTokenPercentage =\n !!userPoolBalance && !!totalPoolTokens && JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? new Percent(userPoolBalance.raw, totalPoolTokens.raw)\n : undefined\n\n const [token0Deposited, token1Deposited] =\n !!pair &&\n !!totalPoolTokens &&\n !!userPoolBalance &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalPoolTokens.raw, userPoolBalance.raw)\n ? [\n pair.getLiquidityValue(pair.token0, totalPoolTokens, userPoolBalance, false),\n pair.getLiquidityValue(pair.token1, totalPoolTokens, userPoolBalance, false),\n ]\n : [undefined, undefined]\n\n return (\n \n \n setShowMore(!showMore)} style={{ cursor: 'pointer' }}>\n \n \n {!currency0 || !currency1 ? Loading : `${currency0.symbol}/${currency1.symbol}`}\n \n \n {showMore ? (\n \n ) : (\n \n )}\n \n \n {showMore && (\n \n \n \n Pooled {currency0.symbol}:\n \n {token0Deposited ? (\n \n {token0Deposited?.toSignificant(6)}\n \n \n ) : (\n '-'\n )}\n \n\n \n \n Pooled {currency1.symbol}:\n \n {token1Deposited ? (\n \n {token1Deposited?.toSignificant(6)}\n \n \n ) : (\n '-'\n )}\n \n \n Your pool tokens:\n {userPoolBalance ? userPoolBalance.toSignificant(4) : '-'}\n \n \n Your pool share:\n {poolTokenPercentage ? `${poolTokenPercentage.toFixed(2)}%` : '-'}\n \n\n \n \n \n Remove\n \n \n \n )}\n \n \n )\n}\n","import { TokenAmount, Pair, Currency } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\nimport { abi as IUniswapV2PairABI } from '@uniswap/v2-core/build/IUniswapV2Pair.json'\nimport { Interface } from '@ethersproject/abi'\nimport { useActiveWeb3React } from '../hooks'\n\nimport { useMultipleContractSingleData } from '../state/multicall/hooks'\nimport { wrappedCurrency } from '../utils/wrappedCurrency'\n\nconst PAIR_INTERFACE = new Interface(IUniswapV2PairABI)\n\nexport enum PairState {\n LOADING,\n NOT_EXISTS,\n EXISTS,\n INVALID\n}\n\nexport function usePairs(currencies: [Currency | undefined, Currency | undefined][]): [PairState, Pair | null][] {\n const { chainId } = useActiveWeb3React()\n\n const tokens = useMemo(\n () =>\n currencies.map(([currencyA, currencyB]) => [\n wrappedCurrency(currencyA, chainId),\n wrappedCurrency(currencyB, chainId)\n ]),\n [chainId, currencies]\n )\n\n const pairAddresses = useMemo(\n () =>\n tokens.map(([tokenA, tokenB]) => {\n return tokenA && tokenB && !tokenA.equals(tokenB) ? Pair.getAddress(tokenA, tokenB) : undefined\n }),\n [tokens]\n )\n\n const results = useMultipleContractSingleData(pairAddresses, PAIR_INTERFACE, 'getReserves')\n\n return useMemo(() => {\n return results.map((result, i) => {\n const { result: reserves, loading } = result\n const tokenA = tokens[i][0]\n const tokenB = tokens[i][1]\n\n if (loading) return [PairState.LOADING, null]\n if (!tokenA || !tokenB || tokenA.equals(tokenB)) return [PairState.INVALID, null]\n if (!reserves) return [PairState.NOT_EXISTS, null]\n const { reserve0, reserve1 } = reserves\n const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]\n return [\n PairState.EXISTS,\n new Pair(new TokenAmount(token0, reserve0.toString()), new TokenAmount(token1, reserve1.toString()))\n ]\n })\n }, [results, tokens])\n}\n\nexport function usePair(tokenA?: Currency, tokenB?: Currency): [PairState, Pair | null] {\n return usePairs([[tokenA, tokenB]])[0]\n}\n","import { Token, TokenAmount } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\n\nimport { useTokenContract } from '../hooks/useContract'\nimport { useSingleCallResult } from '../state/multicall/hooks'\n\nexport function useTokenAllowance(token?: Token, owner?: string, spender?: string): TokenAmount | undefined {\n const contract = useTokenContract(token?.address, false)\n\n const inputs = useMemo(() => [owner, spender], [owner, spender])\n const allowance = useSingleCallResult(contract, 'allowance', inputs).result\n\n return useMemo(() => (token && allowance ? new TokenAmount(token, allowance.toString()) : undefined), [\n token,\n allowance,\n ])\n}\n\nexport default useTokenAllowance\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n INPUT = 'INPUT',\n OUTPUT = 'OUTPUT'\n}\n\nexport const selectCurrency = createAction<{ field: Field; currencyId: string }>('swap/selectCurrency')\nexport const switchCurrencies = createAction('swap/switchCurrencies')\nexport const typeInput = createAction<{ field: Field; typedValue: string }>('swap/typeInput')\nexport const replaceSwapState = createAction<{\n field: Field\n typedValue: string\n inputCurrencyId?: string\n outputCurrencyId?: string\n recipient: string | null\n}>('swap/replaceSwapState')\nexport const setRecipient = createAction<{ recipient: string | null }>('swap/setRecipient')\n","import { createAction } from '@reduxjs/toolkit'\nimport { ChainId } from '@doublemoondev/sdk'\n\nexport interface SerializableTransactionReceipt {\n to: string\n from: string\n contractAddress: string\n transactionIndex: number\n blockHash: string\n transactionHash: string\n blockNumber: number\n status?: number\n}\n\nexport const addTransaction = createAction<{\n chainId: ChainId\n hash: string\n from: string\n approval?: { tokenAddress: string; spender: string }\n summary?: string\n}>('transactions/addTransaction')\nexport const clearAllTransactions = createAction<{ chainId: ChainId }>('transactions/clearAllTransactions')\nexport const finalizeTransaction = createAction<{\n chainId: ChainId\n hash: string\n receipt: SerializableTransactionReceipt\n}>('transactions/finalizeTransaction')\nexport const checkedTransaction = createAction<{\n chainId: ChainId\n hash: string\n blockNumber: number\n}>('transactions/checkedTransaction')\n","import { TransactionResponse } from '@ethersproject/providers'\nimport { useCallback, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { AppDispatch, AppState } from '../index'\nimport { addTransaction } from './actions'\nimport { TransactionDetails } from './reducer'\n\n// helper that can take a ethers library transaction response and add it to the list of transactions\nexport function useTransactionAdder(): (\n response: TransactionResponse,\n customData?: { summary?: string; approval?: { tokenAddress: string; spender: string } }\n) => void {\n const { chainId, account } = useActiveWeb3React()\n const dispatch = useDispatch()\n\n return useCallback(\n (\n response: TransactionResponse,\n { summary, approval }: { summary?: string; approval?: { tokenAddress: string; spender: string } } = {}\n ) => {\n if (!account) return\n if (!chainId) return\n\n const { hash } = response\n if (!hash) {\n throw Error('No transaction hash found.')\n }\n dispatch(addTransaction({ hash, from: account, chainId, approval, summary }))\n },\n [dispatch, chainId, account]\n )\n}\n\n// returns all the transactions for the current chain\nexport function useAllTransactions(): { [txHash: string]: TransactionDetails } {\n const { chainId } = useActiveWeb3React()\n\n const state = useSelector((s) => s.transactions)\n\n return chainId ? state[chainId] ?? {} : {}\n}\n\nexport function useIsTransactionPending(transactionHash?: string): boolean {\n const transactions = useAllTransactions()\n\n if (!transactionHash || !transactions[transactionHash]) return false\n\n return !transactions[transactionHash].receipt\n}\n\n/**\n * Returns whether a transaction happened in the last day (86400 seconds * 1000 milliseconds / second)\n * @param tx to check for recency\n */\nexport function isTransactionRecent(tx: TransactionDetails): boolean {\n return new Date().getTime() - tx.addedTime < 86_400_000\n}\n\n// returns whether a token has a pending approval transaction\nexport function useHasPendingApproval(tokenAddress: string | undefined, spender: string | undefined): boolean {\n const allTransactions = useAllTransactions()\n return useMemo(\n () =>\n typeof tokenAddress === 'string' &&\n typeof spender === 'string' &&\n Object.keys(allTransactions).some((hash) => {\n const tx = allTransactions[hash]\n if (!tx) return false\n if (tx.receipt) {\n return false\n }\n const { approval } = tx\n if (!approval) return false\n return approval.spender === spender && approval.tokenAddress === tokenAddress && isTransactionRecent(tx)\n }),\n [allTransactions, spender, tokenAddress]\n )\n}\n","import { CurrencyAmount, Fraction, JSBI, Percent, TokenAmount, Trade } from '@doublemoondev/sdk'\nimport {\n BLOCKED_PRICE_IMPACT_NON_EXPERT,\n ALLOWED_PRICE_IMPACT_HIGH,\n ALLOWED_PRICE_IMPACT_LOW,\n ALLOWED_PRICE_IMPACT_MEDIUM,\n} from '../constants'\n\nimport { Field } from '../state/swap/actions'\nimport { basisPointsToPercent } from './index'\n\nconst BASE_FEE = new Percent(JSBI.BigInt(20), JSBI.BigInt(10000))\nconst ONE_HUNDRED_PERCENT = new Percent(JSBI.BigInt(10000), JSBI.BigInt(10000))\nconst INPUT_FRACTION_AFTER_FEE = ONE_HUNDRED_PERCENT.subtract(BASE_FEE)\n\n// computes price breakdown for the trade\nexport function computeTradePriceBreakdown(\n trade?: Trade\n): { priceImpactWithoutFee?: Percent; realizedLPFee?: CurrencyAmount } {\n // for each hop in our trade, take away the x*y=k price impact from 0.2% fees\n // e.g. for 3 tokens/2 hops: 1 - ((1 - .02) * (1-.02))\n const realizedLPFee = !trade\n ? undefined\n : ONE_HUNDRED_PERCENT.subtract(\n trade.route.pairs.reduce(\n (currentFee: Fraction): Fraction => currentFee.multiply(INPUT_FRACTION_AFTER_FEE),\n ONE_HUNDRED_PERCENT\n )\n )\n\n // remove lp fees from price impact\n const priceImpactWithoutFeeFraction = trade && realizedLPFee ? trade.priceImpact.subtract(realizedLPFee) : undefined\n\n // the x*y=k impact\n const priceImpactWithoutFeePercent = priceImpactWithoutFeeFraction\n ? new Percent(priceImpactWithoutFeeFraction?.numerator, priceImpactWithoutFeeFraction?.denominator)\n : undefined\n\n // the amount of the input that accrues to LPs\n const realizedLPFeeAmount =\n realizedLPFee &&\n trade &&\n (trade.inputAmount instanceof TokenAmount\n ? new TokenAmount(trade.inputAmount.token, realizedLPFee.multiply(trade.inputAmount.raw).quotient)\n : CurrencyAmount.ether(realizedLPFee.multiply(trade.inputAmount.raw).quotient))\n\n return { priceImpactWithoutFee: priceImpactWithoutFeePercent, realizedLPFee: realizedLPFeeAmount }\n}\n\n// computes the minimum amount out and maximum amount in for a trade given a user specified allowed slippage in bips\nexport function computeSlippageAdjustedAmounts(\n trade: Trade | undefined,\n allowedSlippage: number\n): { [field in Field]?: CurrencyAmount } {\n const pct = basisPointsToPercent(allowedSlippage)\n return {\n [Field.INPUT]: trade?.maximumAmountIn(pct),\n [Field.OUTPUT]: trade?.minimumAmountOut(pct),\n }\n}\n\nexport function warningSeverity(priceImpact: Percent | undefined): 0 | 1 | 2 | 3 | 4 {\n if (!priceImpact?.lessThan(BLOCKED_PRICE_IMPACT_NON_EXPERT)) return 4\n if (!priceImpact?.lessThan(ALLOWED_PRICE_IMPACT_HIGH)) return 3\n if (!priceImpact?.lessThan(ALLOWED_PRICE_IMPACT_MEDIUM)) return 2\n if (!priceImpact?.lessThan(ALLOWED_PRICE_IMPACT_LOW)) return 1\n return 0\n}\n\nexport function formatExecutionPrice(trade?: Trade, inverted?: boolean): string {\n if (!trade) {\n return ''\n }\n return inverted\n ? `${trade.executionPrice.invert().toSignificant(6)} ${trade.inputAmount.currency.symbol} / ${\n trade.outputAmount.currency.symbol\n }`\n : `${trade.executionPrice.toSignificant(6)} ${trade.outputAmount.currency.symbol} / ${\n trade.inputAmount.currency.symbol\n }`\n}\n","import { MaxUint256 } from '@ethersproject/constants'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Trade, TokenAmount, CurrencyAmount, ETHER } from '@doublemoondev/sdk'\nimport { useCallback, useMemo } from 'react'\nimport { ROUTER_ADDRESS } from '../constants'\nimport { useTokenAllowance } from '../data/Allowances'\nimport { Field } from '../state/swap/actions'\nimport { useTransactionAdder, useHasPendingApproval } from '../state/transactions/hooks'\nimport { computeSlippageAdjustedAmounts } from '../utils/prices'\nimport { calculateGasMargin } from '../utils'\nimport { useTokenContract } from './useContract'\nimport { useActiveWeb3React } from './index'\n\nexport enum ApprovalState {\n UNKNOWN,\n NOT_APPROVED,\n PENDING,\n APPROVED,\n}\n\n// returns a variable indicating the state of the approval and a function which approves if necessary or early returns\nexport function useApproveCallback(\n amountToApprove?: CurrencyAmount,\n spender?: string\n): [ApprovalState, () => Promise] {\n const { account } = useActiveWeb3React()\n const token = amountToApprove instanceof TokenAmount ? amountToApprove.token : undefined\n const currentAllowance = useTokenAllowance(token, account ?? undefined, spender)\n const pendingApproval = useHasPendingApproval(token?.address, spender)\n\n // check the current approval status\n const approvalState: ApprovalState = useMemo(() => {\n if (!amountToApprove || !spender) return ApprovalState.UNKNOWN\n if (amountToApprove.currency === ETHER) return ApprovalState.APPROVED\n // we might not have enough data to know whether or not we need to approve\n if (!currentAllowance) return ApprovalState.UNKNOWN\n\n // amountToApprove will be defined if currentAllowance is\n return currentAllowance.lessThan(amountToApprove)\n ? pendingApproval\n ? ApprovalState.PENDING\n : ApprovalState.NOT_APPROVED\n : ApprovalState.APPROVED\n }, [amountToApprove, currentAllowance, pendingApproval, spender])\n\n const tokenContract = useTokenContract(token?.address)\n const addTransaction = useTransactionAdder()\n\n const approve = useCallback(async (): Promise => {\n if (approvalState !== ApprovalState.NOT_APPROVED) {\n console.error('approve was called unnecessarily')\n return\n }\n if (!token) {\n console.error('no token')\n return\n }\n\n if (!tokenContract) {\n console.error('tokenContract is null')\n return\n }\n\n if (!amountToApprove) {\n console.error('missing amount to approve')\n return\n }\n\n if (!spender) {\n console.error('no spender')\n return\n }\n\n let useExact = false\n const estimatedGas = await tokenContract.estimateGas.approve(spender, MaxUint256).catch(() => {\n // general fallback for tokens who restrict approval amounts\n useExact = true\n return tokenContract.estimateGas.approve(spender, amountToApprove.raw.toString())\n })\n\n // eslint-disable-next-line consistent-return\n return tokenContract\n .approve(spender, useExact ? amountToApprove.raw.toString() : MaxUint256, {\n gasLimit: calculateGasMargin(estimatedGas),\n })\n .then((response: TransactionResponse) => {\n addTransaction(response, {\n summary: `Approve ${amountToApprove.currency.symbol}`,\n approval: { tokenAddress: token.address, spender },\n })\n })\n .catch((error: Error) => {\n console.error('Failed to approve token', error)\n throw error\n })\n }, [approvalState, token, tokenContract, amountToApprove, spender, addTransaction])\n\n return [approvalState, approve]\n}\n\n// wraps useApproveCallback in the context of a swap\nexport function useApproveCallbackFromTrade(trade?: Trade, allowedSlippage = 0) {\n const amountToApprove = useMemo(\n () => (trade ? computeSlippageAdjustedAmounts(trade, allowedSlippage)[Field.INPUT] : undefined),\n [trade, allowedSlippage]\n )\n return useApproveCallback(amountToApprove, ROUTER_ADDRESS)\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n CURRENCY_A = 'CURRENCY_A',\n CURRENCY_B = 'CURRENCY_B'\n}\n\nexport const typeInput = createAction<{ field: Field; typedValue: string; noLiquidity: boolean }>('mint/typeInputMint')\nexport const resetMintState = createAction('mint/resetMintState')\n","import { useEffect, useState } from 'react'\n\n// modified from https://usehooks.com/useDebounce/\nexport default function useDebounce(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n // Cancel the timeout if value changes (also on delay change or unmount)\n // This is how we prevent debounced value from updating if value is changed ...\n // .. within the delay period. Timeout gets cleared and restarted.\n return () => {\n clearTimeout(handler)\n }\n }, [value, delay])\n\n return debouncedValue\n}\n","import { isAddress } from '../utils'\nimport useENSAddress from './useENSAddress'\nimport useENSName from './useENSName'\n\n/**\n * Given a name or address, does a lookup to resolve to an address and name\n * @param nameOrAddress ENS name or address\n */\nexport default function useENS(\n nameOrAddress?: string | null\n): { loading: boolean; address: string | null; name: string | null } {\n const validated = isAddress(nameOrAddress)\n const reverseLookup = useENSName(validated || undefined)\n const lookup = useENSAddress(nameOrAddress)\n\n return {\n loading: reverseLookup.loading || lookup.loading,\n address: validated || lookup.address,\n name: reverseLookup.ENSName ? reverseLookup.ENSName : !validated && lookup.address ? nameOrAddress || null : null\n }\n}\n","import { namehash } from 'ethers/lib/utils'\nimport { useMemo } from 'react'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport { isAddress } from '../utils'\nimport isZero from '../utils/isZero'\nimport { useENSRegistrarContract, useENSResolverContract } from './useContract'\nimport useDebounce from './useDebounce'\n\n/**\n * Does a reverse lookup for an address to find its ENS name.\n * Note this is not the same as looking up an ENS name to find an address.\n */\nexport default function useENSName(address?: string): { ENSName: string | null; loading: boolean } {\n const debouncedAddress = useDebounce(address, 200)\n const ensNodeArgument = useMemo(() => {\n if (!debouncedAddress || !isAddress(debouncedAddress)) return [undefined]\n try {\n return debouncedAddress ? [namehash(`${debouncedAddress.toLowerCase().substr(2)}.addr.reverse`)] : [undefined]\n } catch (error) {\n return [undefined]\n }\n }, [debouncedAddress])\n const registrarContract = useENSRegistrarContract(false)\n const resolverAddress = useSingleCallResult(registrarContract, 'resolver', ensNodeArgument)\n const resolverAddressResult = resolverAddress.result?.[0]\n const resolverContract = useENSResolverContract(\n resolverAddressResult && !isZero(resolverAddressResult) ? resolverAddressResult : undefined,\n false\n )\n const name = useSingleCallResult(resolverContract, 'name', ensNodeArgument)\n\n const changed = debouncedAddress !== address\n return {\n ENSName: changed ? null : name.result?.[0] ?? null,\n loading: changed || resolverAddress.loading || name.loading\n }\n}\n","import { namehash } from 'ethers/lib/utils'\nimport { useMemo } from 'react'\nimport { useSingleCallResult } from '../state/multicall/hooks'\nimport isZero from '../utils/isZero'\nimport { useENSRegistrarContract, useENSResolverContract } from './useContract'\nimport useDebounce from './useDebounce'\n\n/**\n * Does a lookup for an ENS name to find its address.\n */\nexport default function useENSAddress(ensName?: string | null): { loading: boolean; address: string | null } {\n const debouncedName = useDebounce(ensName, 200)\n const ensNodeArgument = useMemo(() => {\n if (!debouncedName) return [undefined]\n try {\n return debouncedName ? [namehash(debouncedName)] : [undefined]\n } catch (error) {\n return [undefined]\n }\n }, [debouncedName])\n const registrarContract = useENSRegistrarContract(false)\n const resolverAddress = useSingleCallResult(registrarContract, 'resolver', ensNodeArgument)\n const resolverAddressResult = resolverAddress.result?.[0]\n const resolverContract = useENSResolverContract(\n resolverAddressResult && !isZero(resolverAddressResult) ? resolverAddressResult : undefined,\n false\n )\n const addr = useSingleCallResult(resolverContract, 'addr', ensNodeArgument)\n\n const changed = debouncedName !== ensName\n return {\n address: changed ? null : addr.result?.[0] ?? null,\n loading: changed || resolverAddress.loading || addr.loading\n }\n}\n","import { Currency, CurrencyAmount, Pair, Token, Trade } from '@doublemoondev/sdk'\nimport flatMap from 'lodash.flatmap'\nimport { useMemo } from 'react'\n\nimport { BASES_TO_CHECK_TRADES_AGAINST, CUSTOM_BASES } from '../constants'\nimport { PairState, usePairs } from '../data/Reserves'\nimport { wrappedCurrency } from '../utils/wrappedCurrency'\n\nimport { useActiveWeb3React } from './index'\n\nfunction useAllCommonPairs(currencyA?: Currency, currencyB?: Currency): Pair[] {\n const { chainId } = useActiveWeb3React()\n\n // Base tokens for building intermediary trading routes\n const bases: Token[] = useMemo(() => (chainId ? BASES_TO_CHECK_TRADES_AGAINST[chainId] : []), [chainId])\n\n // All pairs from base tokens\n const basePairs: [Token, Token][] = useMemo(\n () =>\n flatMap(bases, (base): [Token, Token][] => bases.map((otherBase) => [base, otherBase])).filter(\n ([t0, t1]) => t0.address !== t1.address\n ),\n [bases]\n )\n\n const [tokenA, tokenB] = chainId\n ? [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)]\n : [undefined, undefined]\n\n const allPairCombinations: [Token, Token][] = useMemo(\n () =>\n tokenA && tokenB\n ? [\n // the direct pair\n [tokenA, tokenB],\n // token A against all bases\n ...bases.map((base): [Token, Token] => [tokenA, base]),\n // token B against all bases\n ...bases.map((base): [Token, Token] => [tokenB, base]),\n // each base against all bases\n ...basePairs,\n ]\n .filter((tokens): tokens is [Token, Token] => Boolean(tokens[0] && tokens[1]))\n .filter(([t0, t1]) => t0.address !== t1.address)\n // This filter will remove all the pairs that are not supported by the CUSTOM_BASES settings\n // This option is currently not used on Pancake swap\n .filter(([t0, t1]) => {\n if (!chainId) return true\n const customBases = CUSTOM_BASES[chainId]\n if (!customBases) return true\n\n const customBasesA: Token[] | undefined = customBases[t0.address]\n const customBasesB: Token[] | undefined = customBases[t1.address]\n\n if (!customBasesA && !customBasesB) return true\n if (customBasesA && !customBasesA.find((base) => t1.equals(base))) return false\n if (customBasesB && !customBasesB.find((base) => t0.equals(base))) return false\n\n return true\n })\n : [],\n [tokenA, tokenB, bases, basePairs, chainId]\n )\n\n const allPairs = usePairs(allPairCombinations)\n\n // only pass along valid pairs, non-duplicated pairs\n return useMemo(\n () =>\n Object.values(\n allPairs\n // filter out invalid pairs\n .filter((result): result is [PairState.EXISTS, Pair] => Boolean(result[0] === PairState.EXISTS && result[1]))\n // filter out duplicated pairs\n .reduce<{ [pairAddress: string]: Pair }>((memo, [, curr]) => {\n memo[curr.liquidityToken.address] = memo[curr.liquidityToken.address] ?? curr\n return memo\n }, {})\n ),\n [allPairs]\n )\n}\n\n/**\n * Returns the best trade for the exact amount of tokens in to the given token out\n */\nexport function useTradeExactIn(currencyAmountIn?: CurrencyAmount, currencyOut?: Currency): Trade | null {\n const allowedPairs = useAllCommonPairs(currencyAmountIn?.currency, currencyOut)\n\n return useMemo(() => {\n if (currencyAmountIn && currencyOut && allowedPairs.length > 0) {\n return (\n Trade.bestTradeExactIn(allowedPairs, currencyAmountIn, currencyOut, { maxHops: 3, maxNumResults: 1 })[0] ?? null\n )\n }\n return null\n }, [allowedPairs, currencyAmountIn, currencyOut])\n}\n\n/**\n * Returns the best trade for the token in to the exact amount of token out\n */\nexport function useTradeExactOut(currencyIn?: Currency, currencyAmountOut?: CurrencyAmount): Trade | null {\n const allowedPairs = useAllCommonPairs(currencyIn, currencyAmountOut?.currency)\n\n return useMemo(() => {\n if (currencyIn && currencyAmountOut && allowedPairs.length > 0) {\n return (\n Trade.bestTradeExactOut(allowedPairs, currencyIn, currencyAmountOut, { maxHops: 3, maxNumResults: 1 })[0] ??\n null\n )\n }\n return null\n }, [allowedPairs, currencyIn, currencyAmountOut])\n}\n","import { parseUnits } from '@ethersproject/units'\nimport { Currency, CurrencyAmount, ETHER, JSBI, Token, TokenAmount, Trade } from '@doublemoondev/sdk'\nimport { ParsedQs } from 'qs'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport useENS from '../../hooks/useENS'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { useTradeExactIn, useTradeExactOut } from '../../hooks/Trades'\nimport useParsedQueryString from '../../hooks/useParsedQueryString'\nimport { isAddress } from '../../utils'\nimport { AppDispatch, AppState } from '../index'\nimport { useCurrencyBalances } from '../wallet/hooks'\nimport { Field, replaceSwapState, selectCurrency, setRecipient, switchCurrencies, typeInput } from './actions'\nimport { SwapState } from './reducer'\nimport { DOUBLEMOON } from '../../constants'\n\nimport { useUserSlippageTolerance } from '../user/hooks'\nimport { computeSlippageAdjustedAmounts } from '../../utils/prices'\n\nexport function useSwapState(): AppState['swap'] {\n return useSelector((state) => state.swap)\n}\n\nexport function useSwapActionHandlers(): {\n onCurrencySelection: (field: Field, currency: Currency) => void\n onSwitchTokens: () => void\n onUserInput: (field: Field, typedValue: string) => void\n onChangeRecipient: (recipient: string | null) => void\n} {\n const dispatch = useDispatch()\n const onCurrencySelection = useCallback(\n (field: Field, currency: Currency) => {\n dispatch(\n selectCurrency({\n field,\n currencyId: currency instanceof Token ? currency.address : currency === ETHER ? 'BNB' : '',\n })\n )\n },\n [dispatch]\n )\n\n const onSwitchTokens = useCallback(() => {\n dispatch(switchCurrencies())\n }, [dispatch])\n\n const onUserInput = useCallback(\n (field: Field, typedValue: string) => {\n dispatch(typeInput({ field, typedValue }))\n },\n [dispatch]\n )\n\n const onChangeRecipient = useCallback(\n (recipient: string | null) => {\n dispatch(setRecipient({ recipient }))\n },\n [dispatch]\n )\n\n return {\n onSwitchTokens,\n onCurrencySelection,\n onUserInput,\n onChangeRecipient,\n }\n}\n\n// try to parse a user entered amount for a given token\nexport function tryParseAmount(value?: string, currency?: Currency): CurrencyAmount | undefined {\n if (!value || !currency) {\n return undefined\n }\n try {\n const typedValueParsed = parseUnits(value, currency.decimals).toString()\n if (typedValueParsed !== '0') {\n return currency instanceof Token\n ? new TokenAmount(currency, JSBI.BigInt(typedValueParsed))\n : CurrencyAmount.ether(JSBI.BigInt(typedValueParsed))\n }\n } catch (error) {\n // should fail if the user specifies too many decimal places of precision (or maybe exceed max uint?)\n console.info(`Failed to parse input amount: \"${value}\"`, error)\n }\n // necessary for all paths to return a value\n return undefined\n}\n\nconst BAD_RECIPIENT_ADDRESSES: string[] = [\n '0xBCfCcbde45cE874adCB698cC183deBcF17952812', // v1 factory\n '0xf164fC0Ec4E93095b804a4795bBe1e041497b92a', // v1 router 01\n '0x05fF2B0DB69458A0750badebc4f9e13aDd608C7F', // v1 router 02\n '0xca143ce32fe78f1f7019d7d551a6402fc5350c73', // v2 factory\n '0x10ED43C718714eb63d5aA57B78B54704E256024E', // v2 router 02\n]\n\n/**\n * Returns true if any of the pairs or tokens in a trade have the given checksummed address\n * @param trade to check for the given address\n * @param checksummedAddress address to check in the pairs and tokens\n */\nfunction involvesAddress(trade: Trade, checksummedAddress: string): boolean {\n return (\n trade.route.path.some((token) => token.address === checksummedAddress) ||\n trade.route.pairs.some((pair) => pair.liquidityToken.address === checksummedAddress)\n )\n}\n\n// from the current swap inputs, compute the best trade and return it.\nexport function useDerivedSwapInfo(): {\n currencies: { [field in Field]?: Currency }\n currencyBalances: { [field in Field]?: CurrencyAmount }\n parsedAmount: CurrencyAmount | undefined\n v2Trade: Trade | undefined\n inputError?: string\n} {\n const { account } = useActiveWeb3React()\n\n const {\n independentField,\n typedValue,\n [Field.INPUT]: { currencyId: inputCurrencyId },\n [Field.OUTPUT]: { currencyId: outputCurrencyId },\n recipient,\n } = useSwapState()\n\n const inputCurrency = useCurrency(inputCurrencyId)\n const outputCurrency = useCurrency(outputCurrencyId)\n const recipientLookup = useENS(recipient ?? undefined)\n const to: string | null = (recipient === null ? account : recipientLookup.address) ?? null\n\n const relevantTokenBalances = useCurrencyBalances(account ?? undefined, [\n inputCurrency ?? undefined,\n outputCurrency ?? undefined,\n ])\n\n const isExactIn: boolean = independentField === Field.INPUT\n const parsedAmount = tryParseAmount(typedValue, (isExactIn ? inputCurrency : outputCurrency) ?? undefined)\n\n const bestTradeExactIn = useTradeExactIn(isExactIn ? parsedAmount : undefined, outputCurrency ?? undefined)\n const bestTradeExactOut = useTradeExactOut(inputCurrency ?? undefined, !isExactIn ? parsedAmount : undefined)\n\n const v2Trade = isExactIn ? bestTradeExactIn : bestTradeExactOut\n\n const currencyBalances = {\n [Field.INPUT]: relevantTokenBalances[0],\n [Field.OUTPUT]: relevantTokenBalances[1],\n }\n\n const currencies: { [field in Field]?: Currency } = {\n [Field.INPUT]: inputCurrency ?? undefined,\n [Field.OUTPUT]: outputCurrency ?? undefined,\n }\n\n let inputError: string | undefined\n if (!account) {\n inputError = 'Connect Wallet'\n }\n\n if (!parsedAmount) {\n inputError = inputError ?? 'Enter an amount'\n }\n\n if (!currencies[Field.INPUT] || !currencies[Field.OUTPUT]) {\n inputError = inputError ?? 'Select a token'\n }\n\n const formattedTo = isAddress(to)\n if (!to || !formattedTo) {\n inputError = inputError ?? 'Enter a recipient'\n } else if (\n BAD_RECIPIENT_ADDRESSES.indexOf(formattedTo) !== -1 ||\n (bestTradeExactIn && involvesAddress(bestTradeExactIn, formattedTo)) ||\n (bestTradeExactOut && involvesAddress(bestTradeExactOut, formattedTo))\n ) {\n inputError = inputError ?? 'Invalid recipient'\n }\n\n const [allowedSlippage] = useUserSlippageTolerance()\n\n const slippageAdjustedAmounts = v2Trade && allowedSlippage && computeSlippageAdjustedAmounts(v2Trade, allowedSlippage)\n\n // compare input balance to max input based on version\n const [balanceIn, amountIn] = [\n currencyBalances[Field.INPUT],\n slippageAdjustedAmounts ? slippageAdjustedAmounts[Field.INPUT] : null,\n ]\n\n if (balanceIn && amountIn && balanceIn.lessThan(amountIn)) {\n inputError = `Insufficient ${amountIn.currency.symbol} balance`\n }\n\n return {\n currencies,\n currencyBalances,\n parsedAmount,\n v2Trade: v2Trade ?? undefined,\n inputError,\n }\n}\n\nfunction parseCurrencyFromURLParameter(urlParam: any): string {\n if (typeof urlParam === 'string') {\n const valid = isAddress(urlParam)\n if (valid) return valid\n if (urlParam.toUpperCase() === 'BNB') return 'BNB'\n if (valid === false) return 'BNB'\n }\n return 'BNB' ?? ''\n}\n\nfunction parseTokenAmountURLParameter(urlParam: any): string {\n // eslint-disable-next-line no-restricted-globals\n return typeof urlParam === 'string' && !isNaN(parseFloat(urlParam)) ? urlParam : ''\n}\n\nfunction parseIndependentFieldURLParameter(urlParam: any): Field {\n return typeof urlParam === 'string' && urlParam.toLowerCase() === 'output' ? Field.OUTPUT : Field.INPUT\n}\n\nconst ENS_NAME_REGEX = /^[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)?$/\nconst ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\nfunction validatedRecipient(recipient: any): string | null {\n if (typeof recipient !== 'string') return null\n const address = isAddress(recipient)\n if (address) return address\n if (ENS_NAME_REGEX.test(recipient)) return recipient\n if (ADDRESS_REGEX.test(recipient)) return recipient\n return null\n}\n\nexport function queryParametersToSwapState(parsedQs: ParsedQs): SwapState {\n let inputCurrency = parseCurrencyFromURLParameter(parsedQs.inputCurrency)\n let outputCurrency = parseCurrencyFromURLParameter(parsedQs.outputCurrency)\n if (inputCurrency === outputCurrency) {\n if (typeof parsedQs.outputCurrency === 'string') {\n inputCurrency = ''\n } else {\n outputCurrency = ''\n }\n }\n\n const recipient = validatedRecipient(parsedQs.recipient)\n\n return {\n [Field.INPUT]: {\n currencyId: inputCurrency,\n },\n [Field.OUTPUT]: {\n currencyId: outputCurrency,\n },\n typedValue: parseTokenAmountURLParameter(parsedQs.exactAmount),\n independentField: parseIndependentFieldURLParameter(parsedQs.exactField),\n recipient,\n }\n}\n\n// updates the swap state to use the defaults for a given network\nexport function useDefaultsFromURLSearch():\n | { inputCurrencyId: string | undefined; outputCurrencyId: string | undefined }\n | undefined {\n const { chainId } = useActiveWeb3React()\n const dispatch = useDispatch()\n const parsedQs = useParsedQueryString()\n const [result, setResult] = useState<\n { inputCurrencyId: string | undefined; outputCurrencyId: string | undefined } | undefined\n >()\n\n useEffect(() => {\n if (!chainId) return\n const parsed = queryParametersToSwapState(parsedQs)\n\n // set default doublemoon\n let outputCurrency = parsed[Field.OUTPUT].currencyId\n if (!outputCurrency) {\n outputCurrency = DOUBLEMOON\n }\n\n dispatch(\n replaceSwapState({\n typedValue: parsed.typedValue,\n field: parsed.independentField,\n inputCurrencyId: parsed[Field.INPUT].currencyId,\n outputCurrencyId: outputCurrency,\n recipient: parsed.recipient,\n })\n )\n\n setResult({ inputCurrencyId: parsed[Field.INPUT].currencyId, outputCurrencyId: parsed[Field.OUTPUT].currencyId })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [dispatch, chainId])\n\n return result\n}\n","import { parse, ParsedQs } from 'qs'\nimport { useMemo } from 'react'\nimport { useLocation } from 'react-router-dom'\n\nexport default function useParsedQueryString(): ParsedQs {\n const { search } = useLocation()\n return useMemo(\n () => (search && search.length > 1 ? parse(search, { parseArrays: false, ignoreQueryPrefix: true }) : {}),\n [search]\n )\n}\n","import { Currency, CurrencyAmount, ETHER, JSBI, Pair, Percent, Price, TokenAmount } from '@doublemoondev/sdk'\nimport { useCallback, useMemo } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { PairState, usePair } from '../../data/Reserves'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { TranslateString } from '../../utils/translateTextHelpers'\nimport { wrappedCurrency, wrappedCurrencyAmount } from '../../utils/wrappedCurrency'\nimport { AppDispatch, AppState } from '../index'\nimport { tryParseAmount } from '../swap/hooks'\nimport { useCurrencyBalances } from '../wallet/hooks'\nimport { Field, typeInput } from './actions'\n\nconst ZERO = JSBI.BigInt(0)\n\nexport function useMintState(): AppState['mint'] {\n return useSelector((state) => state.mint)\n}\n\nexport function useDerivedMintInfo(\n currencyA: Currency | undefined,\n currencyB: Currency | undefined\n): {\n dependentField: Field\n currencies: { [field in Field]?: Currency }\n pair?: Pair | null\n pairState: PairState\n currencyBalances: { [field in Field]?: CurrencyAmount }\n parsedAmounts: { [field in Field]?: CurrencyAmount }\n price?: Price\n noLiquidity?: boolean\n liquidityMinted?: TokenAmount\n poolTokenPercentage?: Percent\n error?: string\n} {\n const { account, chainId } = useActiveWeb3React()\n\n const { independentField, typedValue, otherTypedValue } = useMintState()\n\n const dependentField = independentField === Field.CURRENCY_A ? Field.CURRENCY_B : Field.CURRENCY_A\n\n // tokens\n const currencies: { [field in Field]?: Currency } = useMemo(\n () => ({\n [Field.CURRENCY_A]: currencyA ?? undefined,\n [Field.CURRENCY_B]: currencyB ?? undefined,\n }),\n [currencyA, currencyB]\n )\n\n // pair\n const [pairState, pair] = usePair(currencies[Field.CURRENCY_A], currencies[Field.CURRENCY_B])\n const totalSupply = useTotalSupply(pair?.liquidityToken)\n\n const noLiquidity: boolean =\n pairState === PairState.NOT_EXISTS || Boolean(totalSupply && JSBI.equal(totalSupply.raw, ZERO))\n\n // balances\n const balances = useCurrencyBalances(account ?? undefined, [\n currencies[Field.CURRENCY_A],\n currencies[Field.CURRENCY_B],\n ])\n const currencyBalances: { [field in Field]?: CurrencyAmount } = {\n [Field.CURRENCY_A]: balances[0],\n [Field.CURRENCY_B]: balances[1],\n }\n\n // amounts\n const independentAmount: CurrencyAmount | undefined = tryParseAmount(typedValue, currencies[independentField])\n const dependentAmount: CurrencyAmount | undefined = useMemo(() => {\n if (noLiquidity) {\n if (otherTypedValue && currencies[dependentField]) {\n return tryParseAmount(otherTypedValue, currencies[dependentField])\n }\n return undefined\n }\n if (independentAmount) {\n // we wrap the currencies just to get the price in terms of the other token\n const wrappedIndependentAmount = wrappedCurrencyAmount(independentAmount, chainId)\n const [tokenA, tokenB] = [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)]\n if (tokenA && tokenB && wrappedIndependentAmount && pair) {\n const dependentCurrency = dependentField === Field.CURRENCY_B ? currencyB : currencyA\n const dependentTokenAmount =\n dependentField === Field.CURRENCY_B\n ? pair.priceOf(tokenA).quote(wrappedIndependentAmount)\n : pair.priceOf(tokenB).quote(wrappedIndependentAmount)\n return dependentCurrency === ETHER ? CurrencyAmount.ether(dependentTokenAmount.raw) : dependentTokenAmount\n }\n return undefined\n }\n return undefined\n }, [noLiquidity, otherTypedValue, currencies, dependentField, independentAmount, currencyA, chainId, currencyB, pair])\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const parsedAmounts: { [field in Field]: CurrencyAmount | undefined } = {\n [Field.CURRENCY_A]: independentField === Field.CURRENCY_A ? independentAmount : dependentAmount,\n [Field.CURRENCY_B]: independentField === Field.CURRENCY_A ? dependentAmount : independentAmount,\n }\n\n const price = useMemo(() => {\n if (noLiquidity) {\n const { [Field.CURRENCY_A]: currencyAAmount, [Field.CURRENCY_B]: currencyBAmount } = parsedAmounts\n if (currencyAAmount && currencyBAmount) {\n return new Price(currencyAAmount.currency, currencyBAmount.currency, currencyAAmount.raw, currencyBAmount.raw)\n }\n return undefined\n }\n const wrappedCurrencyA = wrappedCurrency(currencyA, chainId)\n return pair && wrappedCurrencyA ? pair.priceOf(wrappedCurrencyA) : undefined\n }, [chainId, currencyA, noLiquidity, pair, parsedAmounts])\n\n // liquidity minted\n const liquidityMinted = useMemo(() => {\n const { [Field.CURRENCY_A]: currencyAAmount, [Field.CURRENCY_B]: currencyBAmount } = parsedAmounts\n const [tokenAmountA, tokenAmountB] = [\n wrappedCurrencyAmount(currencyAAmount, chainId),\n wrappedCurrencyAmount(currencyBAmount, chainId),\n ]\n if (pair && totalSupply && tokenAmountA && tokenAmountB) {\n return pair.getLiquidityMinted(totalSupply, tokenAmountA, tokenAmountB)\n }\n return undefined\n }, [parsedAmounts, chainId, pair, totalSupply])\n\n const poolTokenPercentage = useMemo(() => {\n if (liquidityMinted && totalSupply) {\n return new Percent(liquidityMinted.raw, totalSupply.add(liquidityMinted).raw)\n }\n return undefined\n }, [liquidityMinted, totalSupply])\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n\n if (pairState === PairState.INVALID) {\n error = error ?? TranslateString(136, 'Invalid pair')\n }\n\n if (!parsedAmounts[Field.CURRENCY_A] || !parsedAmounts[Field.CURRENCY_B]) {\n error = error ?? TranslateString(84, 'Enter an amount')\n }\n\n const { [Field.CURRENCY_A]: currencyAAmount, [Field.CURRENCY_B]: currencyBAmount } = parsedAmounts\n\n if (currencyAAmount && currencyBalances?.[Field.CURRENCY_A]?.lessThan(currencyAAmount)) {\n error = `Insufficient ${currencies[Field.CURRENCY_A]?.symbol} balance`\n }\n\n if (currencyBAmount && currencyBalances?.[Field.CURRENCY_B]?.lessThan(currencyBAmount)) {\n error = `Insufficient ${currencies[Field.CURRENCY_B]?.symbol} balance`\n }\n\n return {\n dependentField,\n currencies,\n pair,\n pairState,\n currencyBalances,\n parsedAmounts,\n price,\n noLiquidity,\n liquidityMinted,\n poolTokenPercentage,\n error,\n }\n}\n\nexport function useMintActionHandlers(\n noLiquidity: boolean | undefined\n): {\n onFieldAInput: (typedValue: string) => void\n onFieldBInput: (typedValue: string) => void\n} {\n const dispatch = useDispatch()\n\n const onFieldAInput = useCallback(\n (typedValue: string) => {\n dispatch(typeInput({ field: Field.CURRENCY_A, typedValue, noLiquidity: noLiquidity === true }))\n },\n [dispatch, noLiquidity]\n )\n const onFieldBInput = useCallback(\n (typedValue: string) => {\n dispatch(typeInput({ field: Field.CURRENCY_B, typedValue, noLiquidity: noLiquidity === true }))\n },\n [dispatch, noLiquidity]\n )\n\n return {\n onFieldAInput,\n onFieldBInput,\n }\n}\n","import { CurrencyAmount, ETHER, JSBI } from '@doublemoondev/sdk'\nimport { MIN_ETH } from '../constants'\n\n/**\n * Given some token amount, return the max that can be spent of it\n * @param currencyAmount to return max of\n */\nexport function maxAmountSpend(currencyAmount?: CurrencyAmount): CurrencyAmount | undefined {\n if (!currencyAmount) return undefined\n if (currencyAmount.currency === ETHER) {\n if (JSBI.greaterThan(currencyAmount.raw, MIN_ETH)) {\n return CurrencyAmount.ether(JSBI.subtract(currencyAmount.raw, MIN_ETH))\n }\n return CurrencyAmount.ether(JSBI.BigInt(0))\n }\n return currencyAmount\n}\n\nexport default maxAmountSpend\n","import styled from 'styled-components'\n\nconst Pane = styled.div`\n border: 2px solid ${({ theme }) => theme.colors.borderColor};\n border-radius: 16px;\n padding: 16px;\n`\n\nexport default Pane\n","/* eslint-disable no-param-reassign */\nimport { Toast } from '@doublemoondev/doublemoon-uikit'\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nconst initialState: ToastsState = {\n data: [],\n}\n\nexport interface ToastsState {\n data: Toast[]\n}\n\nexport const toastsSlice = createSlice({\n name: 'toasts',\n initialState,\n reducers: {\n push: (state: ToastsState, action: PayloadAction) => {\n const { payload } = action\n const toastIndex = state.data.findIndex((toast) => toast.id === action.payload.id)\n\n // If id already matches remove it before adding it to the top of the stack\n if (toastIndex >= 0) {\n state.data.splice(toastIndex, 1)\n }\n\n state.data.unshift(payload)\n },\n remove: (state: ToastsState, action: PayloadAction) => {\n const toastIndex = state.data.findIndex((toast) => toast.id === action.payload)\n\n if (toastIndex >= 0) {\n state.data.splice(toastIndex, 1)\n }\n },\n clear: (state: ToastsState) => {\n state.data = []\n },\n },\n})\n\n// Actions\nexport const { clear, remove, push } = toastsSlice.actions\n\nexport default toastsSlice.reducer\n","import { useMemo } from 'react'\nimport { kebabCase } from 'lodash'\nimport { Toast, toastTypes } from '@doublemoondev/doublemoon-uikit'\nimport { useDispatch } from 'react-redux'\n\nimport {\n push as pushToast,\n remove as removeToast,\n clear as clearToast\n} from 'state/actions'\n\n// Toasts\nconst useToast = () => {\n const dispatch = useDispatch()\n const helpers = useMemo(() => {\n const push = (toast: Toast) => dispatch(pushToast(toast))\n\n return {\n toastError: (title: string, description?: string) => {\n return push({ id: kebabCase(title), type: toastTypes.DANGER, title, description })\n },\n toastInfo: (title: string, description?: string) => {\n return push({ id: kebabCase(title), type: toastTypes.INFO, title, description })\n },\n toastSuccess: (title: string, description?: string) => {\n return push({ id: kebabCase(title), type: toastTypes.SUCCESS, title, description })\n },\n toastWarning: (title: string, description?: string) => {\n return push({ id: kebabCase(title), type: toastTypes.WARNING, title, description })\n },\n push,\n remove: (id: string) => dispatch(removeToast(id)),\n clear: () => dispatch(clearToast()),\n }\n }, [dispatch])\n\n return helpers\n}\n\nexport default useToast","import { useCallback } from 'react'\nimport { useWeb3React, UnsupportedChainIdError } from '@web3-react/core'\nimport { NoBscProviderError } from '@binance-chain/bsc-connector'\nimport {\n NoEthereumProviderError,\n UserRejectedRequestError as UserRejectedRequestErrorInjected,\n} from '@web3-react/injected-connector'\nimport {\n UserRejectedRequestError as UserRejectedRequestErrorWalletConnect,\n WalletConnectConnector,\n} from '@web3-react/walletconnect-connector'\nimport { connectorLocalStorageKey, ConnectorNames } from '@doublemoondev/doublemoon-uikit'\nimport useToast from 'hooks/useToast'\nimport { connectorsByName } from 'connectors'\n\nconst useAuth = () => {\n const { activate, deactivate } = useWeb3React()\n const { toastError } = useToast()\n\n const login = useCallback((connectorID: ConnectorNames) => {\n const connector = connectorsByName[connectorID]\n if (connector) {\n activate(connector, async (error: Error) => {\n window.localStorage.removeItem(connectorLocalStorageKey)\n if (error instanceof UnsupportedChainIdError) {\n toastError('Unsupported Chain Id', 'Unsupported Chain Id Error. Check your chain Id.')\n } else if (error instanceof NoEthereumProviderError || error instanceof NoBscProviderError) {\n toastError('Provider Error', 'No provider was found')\n } else if (\n error instanceof UserRejectedRequestErrorInjected ||\n error instanceof UserRejectedRequestErrorWalletConnect\n ) {\n if (connector instanceof WalletConnectConnector) {\n const walletConnector = connector as WalletConnectConnector\n walletConnector.walletConnectProvider = null\n }\n toastError('Authorization Error', 'Please authorize to access your account')\n } else {\n toastError(error.name, error.message)\n }\n })\n } else {\n toastError(\"Can't find connector\", 'The connector config is wrong')\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return { login, logout: deactivate }\n}\n\nexport default useAuth\n","import React from 'react'\nimport { Button, ButtonProps, useWalletModal} from '@doublemoondev/doublemoon-uikit'\nimport useI18n from 'hooks/useI18n'\nimport useAuth from 'hooks/useAuth'\n\nconst UnlockButton: React.FC = (props) => {\n const TranslateString = useI18n()\n const { login, logout } = useAuth()\n const { onPresentConnectModal } = useWalletModal(login, logout)\n\n return (\n \n )\n}\n\nexport default UnlockButton\n","import React from 'react'\nimport styled from 'styled-components'\nimport { Card } from '@doublemoondev/doublemoon-uikit'\n\nexport const BodyWrapper = styled(Card)`\n position: relative;\n max-width: 436px;\n width: 100%;\n z-index: 5;\n`\n\n/**\n * The styled container element that wraps the content of most pages and the tabs.\n */\nexport default function AppBody({ children }: { children: React.ReactNode }) {\n return {children}\n}\n","import { Text } from '@doublemoondev/doublemoon-uikit'\nimport styled from 'styled-components'\n\nexport const Wrapper = styled.div`\n position: relative;\n`\n\nexport const ClickableText = styled(Text)`\n :hover {\n cursor: pointer;\n }\n color: ${({ theme }) => theme.colors.primary};\n`\n\nexport const Dots = styled.span`\n &::after {\n display: inline-block;\n animation: ellipsis 1.25s infinite;\n content: '.';\n width: 1em;\n text-align: left;\n }\n @keyframes ellipsis {\n 0% {\n content: '.';\n }\n 33% {\n content: '..';\n }\n 66% {\n content: '...';\n }\n }\n`\n","import { Currency, CurrencyAmount, Fraction, Percent } from '@doublemoondev/sdk'\nimport React from 'react'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport { TranslateString } from 'utils/translateTextHelpers'\nimport { RowBetween, RowFixed } from '../../components/Row'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport { Field } from '../../state/mint/actions'\n\nexport function ConfirmAddModalBottom({\n noLiquidity,\n price,\n currencies,\n parsedAmounts,\n poolTokenPercentage,\n onAdd,\n}: {\n noLiquidity?: boolean\n price?: Fraction\n currencies: { [field in Field]?: Currency }\n parsedAmounts: { [field in Field]?: CurrencyAmount }\n poolTokenPercentage?: Percent\n onAdd: () => void\n}) {\n return (\n <>\n \n {currencies[Field.CURRENCY_A]?.symbol} Deposited\n \n \n {parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)}\n \n \n \n {currencies[Field.CURRENCY_B]?.symbol} Deposited\n \n \n {parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)}\n \n \n \n Rates\n \n {`1 ${currencies[Field.CURRENCY_A]?.symbol} = ${price?.toSignificant(4)} ${\n currencies[Field.CURRENCY_B]?.symbol\n }`}\n \n \n \n \n {`1 ${currencies[Field.CURRENCY_B]?.symbol} = ${price?.invert().toSignificant(4)} ${\n currencies[Field.CURRENCY_A]?.symbol\n }`}\n \n \n \n Share of Pool:\n {noLiquidity ? '100' : poolTokenPercentage?.toSignificant(4)}%\n \n \n \n )\n}\n\nexport default ConfirmAddModalBottom\n","import React from 'react'\nimport { Currency, Percent, Price } from '@doublemoondev/sdk'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport { AutoColumn } from '../../components/Column'\nimport { AutoRow } from '../../components/Row'\nimport { ONE_BIPS } from '../../constants'\nimport { Field } from '../../state/mint/actions'\n\nexport function PoolPriceBar({\n currencies,\n noLiquidity,\n poolTokenPercentage,\n price,\n}: {\n currencies: { [field in Field]?: Currency }\n noLiquidity?: boolean\n poolTokenPercentage?: Percent\n price?: Price\n}) {\n return (\n \n \n \n {price?.toSignificant(6) ?? '-'}\n \n {currencies[Field.CURRENCY_B]?.symbol} per {currencies[Field.CURRENCY_A]?.symbol}\n \n \n \n {price?.invert()?.toSignificant(6) ?? '-'}\n \n {currencies[Field.CURRENCY_A]?.symbol} per {currencies[Field.CURRENCY_B]?.symbol}\n \n \n \n \n {noLiquidity && price\n ? '100'\n : (poolTokenPercentage?.lessThan(ONE_BIPS) ? '<0.01' : poolTokenPercentage?.toFixed(2)) ?? '0'}\n %\n \n \n Share of Pool\n \n \n \n \n )\n}\n\nexport default PoolPriceBar\n","import React, { useCallback, useState } from 'react'\nimport { BigNumber } from '@ethersproject/bignumber'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Currency, currencyEquals, ETHER, TokenAmount, WETH } from '@doublemoondev/sdk'\nimport { Button, CardBody, AddIcon, Text as UIKitText } from '@doublemoondev/doublemoon-uikit'\nimport { RouteComponentProps } from 'react-router-dom'\nimport { LightCard } from 'components/Card'\nimport { AutoColumn, ColumnCenter } from 'components/Column'\nimport TransactionConfirmationModal, { ConfirmationModalContent } from 'components/TransactionConfirmationModal'\nimport CardNav from 'components/CardNav'\nimport CurrencyInputPanel from 'components/CurrencyInputPanel'\nimport DoubleCurrencyLogo from 'components/DoubleLogo'\nimport { AddRemoveTabs } from 'components/NavigationTabs'\nimport { MinimalPositionCard } from 'components/PositionCard'\nimport Row, { RowBetween, RowFlat } from 'components/Row'\n\nimport { PairState } from 'data/Reserves'\nimport { useActiveWeb3React } from 'hooks'\nimport { useCurrency } from 'hooks/Tokens'\nimport { ApprovalState, useApproveCallback } from 'hooks/useApproveCallback'\nimport { Field } from 'state/mint/actions'\nimport { useDerivedMintInfo, useMintActionHandlers, useMintState } from 'state/mint/hooks'\n\nimport { useTransactionAdder } from 'state/transactions/hooks'\nimport { useIsExpertMode, useUserDeadline, useUserSlippageTolerance } from 'state/user/hooks'\nimport { calculateGasMargin, calculateSlippageAmount, getRouterContract } from 'utils'\nimport { maxAmountSpend } from 'utils/maxAmountSpend'\nimport { wrappedCurrency } from 'utils/wrappedCurrency'\nimport { currencyId } from 'utils/currencyId'\nimport Pane from 'components/Pane'\nimport ConnectWalletButton from 'components/ConnectWalletButton'\nimport useI18n from 'hooks/useI18n'\nimport AppBody from '../AppBody'\nimport { Dots, Wrapper } from '../Pool/styleds'\nimport { ConfirmAddModalBottom } from './ConfirmAddModalBottom'\nimport { PoolPriceBar } from './PoolPriceBar'\nimport { ROUTER_ADDRESS } from '../../constants'\n\nexport default function AddLiquidity({\n match: {\n params: { currencyIdA, currencyIdB },\n },\n history,\n}: RouteComponentProps<{ currencyIdA?: string; currencyIdB?: string }>) {\n const { account, chainId, library } = useActiveWeb3React()\n const currencyA = useCurrency(currencyIdA)\n const currencyB = useCurrency(currencyIdB)\n const TranslateString = useI18n()\n\n const oneCurrencyIsWBNB = Boolean(\n chainId &&\n ((currencyA && currencyEquals(currencyA, WETH[chainId])) ||\n (currencyB && currencyEquals(currencyB, WETH[chainId])))\n )\n const expertMode = useIsExpertMode()\n\n // mint state\n const { independentField, typedValue, otherTypedValue } = useMintState()\n const {\n dependentField,\n currencies,\n pair,\n pairState,\n currencyBalances,\n parsedAmounts,\n price,\n noLiquidity,\n liquidityMinted,\n poolTokenPercentage,\n error,\n } = useDerivedMintInfo(currencyA ?? undefined, currencyB ?? undefined)\n const { onFieldAInput, onFieldBInput } = useMintActionHandlers(noLiquidity)\n\n const isValid = !error\n\n // modal and loading\n const [showConfirm, setShowConfirm] = useState(false)\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\n\n // txn values\n const [deadline] = useUserDeadline() // custom from users settings\n const [allowedSlippage] = useUserSlippageTolerance() // custom from users\n const [txHash, setTxHash] = useState('')\n\n // get formatted amounts\n const formattedAmounts = {\n [independentField]: typedValue,\n [dependentField]: noLiquidity ? otherTypedValue : parsedAmounts[dependentField]?.toSignificant(6) ?? '',\n }\n\n // get the max amounts user can add\n const maxAmounts: { [field in Field]?: TokenAmount } = [Field.CURRENCY_A, Field.CURRENCY_B].reduce(\n (accumulator, field) => {\n return {\n ...accumulator,\n [field]: maxAmountSpend(currencyBalances[field]),\n }\n },\n {}\n )\n\n const atMaxAmounts: { [field in Field]?: TokenAmount } = [Field.CURRENCY_A, Field.CURRENCY_B].reduce(\n (accumulator, field) => {\n return {\n ...accumulator,\n [field]: maxAmounts[field]?.equalTo(parsedAmounts[field] ?? '0'),\n }\n },\n {}\n )\n\n // check whether the user has approved the router on the tokens\n const [approvalA, approveACallback] = useApproveCallback(parsedAmounts[Field.CURRENCY_A], ROUTER_ADDRESS)\n const [approvalB, approveBCallback] = useApproveCallback(parsedAmounts[Field.CURRENCY_B], ROUTER_ADDRESS)\n\n const addTransaction = useTransactionAdder()\n\n async function onAdd() {\n if (!chainId || !library || !account) return\n const router = getRouterContract(chainId, library, account)\n\n const { [Field.CURRENCY_A]: parsedAmountA, [Field.CURRENCY_B]: parsedAmountB } = parsedAmounts\n if (!parsedAmountA || !parsedAmountB || !currencyA || !currencyB) {\n return\n }\n\n const amountsMin = {\n [Field.CURRENCY_A]: calculateSlippageAmount(parsedAmountA, noLiquidity ? 0 : allowedSlippage)[0],\n [Field.CURRENCY_B]: calculateSlippageAmount(parsedAmountB, noLiquidity ? 0 : allowedSlippage)[0],\n }\n\n const deadlineFromNow = Math.ceil(Date.now() / 1000) + deadline\n\n let estimate\n let method: (...args: any) => Promise\n let args: Array\n let value: BigNumber | null\n if (currencyA === ETHER || currencyB === ETHER) {\n const tokenBIsBNB = currencyB === ETHER\n estimate = router.estimateGas.addLiquidityETH\n method = router.addLiquidityETH\n args = [\n wrappedCurrency(tokenBIsBNB ? currencyA : currencyB, chainId)?.address ?? '', // token\n (tokenBIsBNB ? parsedAmountA : parsedAmountB).raw.toString(), // token desired\n amountsMin[tokenBIsBNB ? Field.CURRENCY_A : Field.CURRENCY_B].toString(), // token min\n amountsMin[tokenBIsBNB ? Field.CURRENCY_B : Field.CURRENCY_A].toString(), // eth min\n account,\n deadlineFromNow,\n ]\n value = BigNumber.from((tokenBIsBNB ? parsedAmountB : parsedAmountA).raw.toString())\n } else {\n estimate = router.estimateGas.addLiquidity\n method = router.addLiquidity\n args = [\n wrappedCurrency(currencyA, chainId)?.address ?? '',\n wrappedCurrency(currencyB, chainId)?.address ?? '',\n parsedAmountA.raw.toString(),\n parsedAmountB.raw.toString(),\n amountsMin[Field.CURRENCY_A].toString(),\n amountsMin[Field.CURRENCY_B].toString(),\n account,\n deadlineFromNow,\n ]\n value = null\n }\n\n setAttemptingTxn(true)\n // const aa = await estimate(...args, value ? { value } : {})\n await estimate(...args, value ? { value } : {})\n .then((estimatedGasLimit) =>\n method(...args, {\n ...(value ? { value } : {}),\n gasLimit: calculateGasMargin(estimatedGasLimit),\n }).then((response) => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: `Add ${parsedAmounts[Field.CURRENCY_A]?.toSignificant(3)} ${\n currencies[Field.CURRENCY_A]?.symbol\n } and ${parsedAmounts[Field.CURRENCY_B]?.toSignificant(3)} ${currencies[Field.CURRENCY_B]?.symbol}`,\n })\n\n setTxHash(response.hash)\n })\n )\n .catch((e) => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n if (e?.code !== 4001) {\n console.error(e)\n }\n })\n }\n\n const modalHeader = () => {\n return noLiquidity ? (\n \n \n \n \n {`${currencies[Field.CURRENCY_A]?.symbol}/${currencies[Field.CURRENCY_B]?.symbol}`}\n \n \n \n \n \n ) : (\n \n \n \n {liquidityMinted?.toSignificant(6)}\n \n \n \n \n \n {`${currencies[Field.CURRENCY_A]?.symbol}/${currencies[Field.CURRENCY_B]?.symbol} Pool Tokens`}\n \n \n \n {`Output is estimated. If the price changes by more than ${\n allowedSlippage / 100\n }% your transaction will revert.`}\n \n \n )\n }\n\n const modalBottom = () => {\n return (\n \n )\n }\n\n const pendingText = `Supplying ${parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)} ${\n currencies[Field.CURRENCY_A]?.symbol\n } and ${parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)} ${currencies[Field.CURRENCY_B]?.symbol}`\n\n const handleCurrencyASelect = useCallback(\n (currA: Currency) => {\n const newCurrencyIdA = currencyId(currA)\n if (newCurrencyIdA === currencyIdB) {\n history.push(`/add/${currencyIdB}/${currencyIdA}`)\n } else {\n history.push(`/add/${newCurrencyIdA}/${currencyIdB}`)\n }\n },\n [currencyIdB, history, currencyIdA]\n )\n const handleCurrencyBSelect = useCallback(\n (currB: Currency) => {\n const newCurrencyIdB = currencyId(currB)\n if (currencyIdA === newCurrencyIdB) {\n if (currencyIdB) {\n history.push(`/add/${currencyIdB}/${newCurrencyIdB}`)\n } else {\n history.push(`/add/${newCurrencyIdB}`)\n }\n } else {\n history.push(`/add/${currencyIdA || 'BNB'}/${newCurrencyIdB}`)\n }\n },\n [currencyIdA, history, currencyIdB]\n )\n\n const handleDismissConfirmation = useCallback(() => {\n setShowConfirm(false)\n // if there was a tx hash, we want to clear the input\n if (txHash) {\n onFieldAInput('')\n }\n setTxHash('')\n }, [onFieldAInput, txHash])\n\n return (\n <>\n \n \n \n \n (\n \n )}\n pendingText={pendingText}\n />\n \n \n {noLiquidity && (\n \n \n \n {TranslateString(1158, 'You are the first liquidity provider.')}\n \n {TranslateString(1160, 'The ratio of tokens you add will set the price of this pool.')}\n \n \n {TranslateString(1162, 'Once you are happy with the rate click supply to review.')}\n \n \n \n \n )}\n {\n onFieldAInput(maxAmounts[Field.CURRENCY_A]?.toExact() ?? '')\n }}\n onCurrencySelect={handleCurrencyASelect}\n showMaxButton={!atMaxAmounts[Field.CURRENCY_A]}\n currency={currencies[Field.CURRENCY_A]}\n id=\"add-liquidity-input-tokena\"\n showCommonBases={false}\n />\n \n \n \n {\n onFieldBInput(maxAmounts[Field.CURRENCY_B]?.toExact() ?? '')\n }}\n showMaxButton={!atMaxAmounts[Field.CURRENCY_B]}\n currency={currencies[Field.CURRENCY_B]}\n id=\"add-liquidity-input-tokenb\"\n showCommonBases={false}\n />\n {currencies[Field.CURRENCY_A] && currencies[Field.CURRENCY_B] && pairState !== PairState.INVALID && (\n
\n \n {noLiquidity\n ? TranslateString(1164, 'Initial prices and pool share')\n : TranslateString(1166, 'Prices and pool share')}\n \n \n \n \n
\n )}\n\n {!account ? (\n \n ) : (\n \n {(approvalA === ApprovalState.NOT_APPROVED ||\n approvalA === ApprovalState.PENDING ||\n approvalB === ApprovalState.NOT_APPROVED ||\n approvalB === ApprovalState.PENDING) &&\n isValid && (\n \n {approvalA !== ApprovalState.APPROVED && (\n \n {approvalA === ApprovalState.PENDING ? (\n Approving {currencies[Field.CURRENCY_A]?.symbol}\n ) : (\n `Approve ${currencies[Field.CURRENCY_A]?.symbol}`\n )}\n \n )}\n {approvalB !== ApprovalState.APPROVED && (\n \n {approvalB === ApprovalState.PENDING ? (\n Approving {currencies[Field.CURRENCY_B]?.symbol}\n ) : (\n `Approve ${currencies[Field.CURRENCY_B]?.symbol}`\n )}\n \n )}\n \n )}\n {\n if (expertMode) {\n onAdd()\n } else {\n setShowConfirm(true)\n }\n }}\n disabled={!isValid || approvalA !== ApprovalState.APPROVED || approvalB !== ApprovalState.APPROVED}\n variant={\n !isValid && !!parsedAmounts[Field.CURRENCY_A] && !!parsedAmounts[Field.CURRENCY_B]\n ? 'danger'\n : 'primary'\n }\n width=\"100%\"\n >\n {error ?? 'Supply'}\n \n \n )}\n
\n
\n
\n
\n {pair && !noLiquidity && pairState !== PairState.INVALID ? (\n \n \n \n ) : null}\n \n )\n}\n","import React from 'react'\nimport { Redirect, RouteComponentProps } from 'react-router-dom'\nimport AddLiquidity from './index'\n\nconst OLD_PATH_STRUCTURE = /^(0x[a-fA-F0-9]{40})-(0x[a-fA-F0-9]{40})$/\nexport function RedirectOldAddLiquidityPathStructure(props: RouteComponentProps<{ currencyIdA: string }>) {\n const {\n match: {\n params: { currencyIdA },\n },\n } = props\n const match = currencyIdA.match(OLD_PATH_STRUCTURE)\n if (match?.length) {\n return \n }\n\n return \n}\n\nexport function RedirectDuplicateTokenIds(props: RouteComponentProps<{ currencyIdA: string; currencyIdB: string }>) {\n const {\n match: {\n params: { currencyIdA, currencyIdB },\n },\n } = props\n if (currencyIdA.toLowerCase() === currencyIdB.toLowerCase()) {\n return \n }\n return \n}\n","import React from 'react'\nimport { RouteComponentProps, Redirect } from 'react-router-dom'\n\nconst OLD_PATH_STRUCTURE = /^(0x[a-fA-F0-9]{40})-(0x[a-fA-F0-9]{40})$/\n\nexport function RedirectOldRemoveLiquidityPathStructure({\n match: {\n params: { tokens },\n },\n}: RouteComponentProps<{ tokens: string }>) {\n if (!OLD_PATH_STRUCTURE.test(tokens)) {\n return \n }\n const [currency0, currency1] = tokens.split('-')\n\n return \n}\n\nexport default RedirectOldRemoveLiquidityPathStructure\n","import { Currency, ETHER, JSBI, TokenAmount } from '@doublemoondev/sdk'\nimport React, { useCallback, useEffect, useState } from 'react'\nimport { Button, ChevronDownIcon, AddIcon, CardBody, Text } from '@doublemoondev/doublemoon-uikit'\nimport CardNav from 'components/CardNav'\nimport { LightCard } from 'components/Card'\nimport { AutoColumn, ColumnCenter } from 'components/Column'\nimport CurrencyLogo from 'components/CurrencyLogo'\nimport { FindPoolTabs } from 'components/NavigationTabs'\nimport { MinimalPositionCard } from 'components/PositionCard'\nimport CurrencySearchModal from 'components/SearchModal/CurrencySearchModal'\nimport { PairState, usePair } from 'data/Reserves'\nimport { useActiveWeb3React } from 'hooks'\nimport { usePairAdder } from 'state/user/hooks'\nimport { useTokenBalance } from 'state/wallet/hooks'\nimport { StyledInternalLink } from 'components/Shared'\nimport { currencyId } from 'utils/currencyId'\nimport useI18n from 'hooks/useI18n'\nimport AppBody from '../AppBody'\nimport { Dots } from '../Pool/styleds'\n\nenum Fields {\n TOKEN0 = 0,\n TOKEN1 = 1,\n}\n\nexport default function PoolFinder() {\n const { account } = useActiveWeb3React()\n\n const [showSearch, setShowSearch] = useState(false)\n const [activeField, setActiveField] = useState(Fields.TOKEN1)\n\n const [currency0, setCurrency0] = useState(ETHER)\n const [currency1, setCurrency1] = useState(null)\n\n const [pairState, pair] = usePair(currency0 ?? undefined, currency1 ?? undefined)\n const addPair = usePairAdder()\n\n const TranslateString = useI18n()\n useEffect(() => {\n if (pair) {\n addPair(pair)\n }\n }, [pair, addPair])\n\n const validPairNoLiquidity: boolean =\n pairState === PairState.NOT_EXISTS ||\n Boolean(\n pairState === PairState.EXISTS &&\n pair &&\n JSBI.equal(pair.reserve0.raw, JSBI.BigInt(0)) &&\n JSBI.equal(pair.reserve1.raw, JSBI.BigInt(0))\n )\n\n const position: TokenAmount | undefined = useTokenBalance(account ?? undefined, pair?.liquidityToken)\n const hasPosition = Boolean(position && JSBI.greaterThan(position.raw, JSBI.BigInt(0)))\n\n const handleCurrencySelect = useCallback(\n (currency: Currency) => {\n if (activeField === Fields.TOKEN0) {\n setCurrency0(currency)\n } else {\n setCurrency1(currency)\n }\n },\n [activeField]\n )\n\n const handleSearchDismiss = useCallback(() => {\n setShowSearch(false)\n }, [setShowSearch])\n\n const prerequisiteMessage = (\n \n \n {!account\n ? TranslateString(1174, 'Connect to a wallet to find pools')\n : TranslateString(208, 'Select a token to find your liquidity.')}\n \n \n )\n\n return (\n <>\n \n \n \n \n \n {\n setShowSearch(true)\n setActiveField(Fields.TOKEN0)\n }}\n startIcon={currency0 ? : null}\n endIcon={}\n width=\"100%\"\n >\n {currency0 ? currency0.symbol : TranslateString(82, 'Select a Token')}\n \n\n \n \n \n\n {\n setShowSearch(true)\n setActiveField(Fields.TOKEN1)\n }}\n startIcon={currency1 ? : null}\n endIcon={}\n width=\"100%\"\n >\n {currency1 ? currency1.symbol : TranslateString(82, 'Select a Token')}\n \n\n {hasPosition && (\n \n {TranslateString(210, 'Pool found!')}\n \n )}\n\n {currency0 && currency1 ? (\n pairState === PairState.EXISTS ? (\n hasPosition && pair ? (\n \n ) : (\n \n \n \n {TranslateString(212, 'You don’t have liquidity in this pool yet.')}\n \n \n {TranslateString(168, 'Add Liquidity')}\n \n \n \n )\n ) : validPairNoLiquidity ? (\n \n \n {TranslateString(214, 'No pool found.')}\n \n Create pool.\n \n \n \n ) : pairState === PairState.INVALID ? (\n \n \n {TranslateString(136, 'Invalid pair.')}\n \n \n ) : pairState === PairState.LOADING ? (\n \n \n \n Loading\n \n \n \n \n ) : null\n ) : (\n prerequisiteMessage\n )}\n \n\n \n \n \n \n )\n}\n","import React, { useEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { Box, Button, Flex, Input, Text } from '@doublemoondev/doublemoon-uikit'\nimport { useUserSlippageTolerance } from 'state/user/hooks'\nimport QuestionHelper from '../QuestionHelper'\n\nconst MAX_SLIPPAGE = 5000\nconst RISKY_SLIPPAGE_LOW = 50\nconst RISKY_SLIPPAGE_HIGH = 500\n\nconst Option = styled.div`\n padding: 0 4px;\n`\n\nconst Options = styled.div`\n align-items: center;\n display: flex;\n flex-direction: column;\n\n ${Option}:first-child {\n padding-left: 0;\n }\n\n ${Option}:last-child {\n padding-right: 0;\n }\n\n ${({ theme }) => theme.mediaQueries.sm} {\n flex-direction: row;\n }\n`\n\nconst predefinedValues = [\n { label: '0.1%', value: 0.1 },\n { label: '0.5%', value: 0.5 },\n { label: '1%', value: 1 },\n]\n\ntype SlippageToleranceSettingsModalProps = {\n translateString: (translationId: number, fallback: string) => string\n}\n\nconst SlippageToleranceSettings = ({ translateString }: SlippageToleranceSettingsModalProps) => {\n const [userSlippageTolerance, setUserslippageTolerance] = useUserSlippageTolerance()\n const [value, setValue] = useState(userSlippageTolerance / 100)\n const [error, setError] = useState(null)\n const handleChange = (evt: React.ChangeEvent) => {\n const { value: inputValue } = evt.target\n setValue(parseFloat(inputValue))\n }\n\n // Updates local storage if value is valid\n useEffect(() => {\n try {\n const rawValue = value * 100\n if (!Number.isNaN(rawValue) && rawValue > 0 && rawValue < MAX_SLIPPAGE) {\n setUserslippageTolerance(rawValue)\n setError(null)\n } else {\n setError(translateString(1144, 'Enter a valid slippage percentage'))\n }\n } catch {\n setError(translateString(1144, 'Enter a valid slippage percentage'))\n }\n }, [value, setError, setUserslippageTolerance, translateString])\n\n // Notify user if slippage is risky\n useEffect(() => {\n if (userSlippageTolerance < RISKY_SLIPPAGE_LOW) {\n setError(translateString(1146, 'Your transaction may fail'))\n } else if (userSlippageTolerance > RISKY_SLIPPAGE_HIGH) {\n setError(translateString(1148, 'Your transaction may be frontrun'))\n }\n }, [userSlippageTolerance, setError, translateString])\n\n return (\n \n \n {translateString(88, 'Slippage tolerance')}\n \n \n \n \n {predefinedValues.map(({ label, value: predefinedValue }) => {\n const handleClick = () => setValue(predefinedValue)\n\n return (\n \n )\n })}\n \n \n \n \n \n \n {error && (\n \n {error}\n \n )}\n \n )\n}\n\nexport default SlippageToleranceSettings\n","import React, { useEffect, useState } from 'react'\nimport styled from 'styled-components'\nimport { Input, Text, Flex, Box } from '@doublemoondev/doublemoon-uikit'\nimport { useUserDeadline } from 'state/user/hooks'\nimport QuestionHelper from '../QuestionHelper'\n\nconst Field = styled.div`\n align-items: center;\n display: inline-flex;\n\n & > ${Input} {\n max-width: 100px;\n }\n`\n\ntype TransactionDeadlineSettingModalProps = {\n translateString: (translationId: number, fallback: string) => string\n}\n\nconst TransactionDeadlineSetting = ({ translateString }: TransactionDeadlineSettingModalProps) => {\n const [deadline, setDeadline] = useUserDeadline()\n const [value, setValue] = useState(deadline / 60) // deadline in minutes\n const [error, setError] = useState(null)\n\n const handleChange = (evt: React.ChangeEvent) => {\n const { value: inputValue } = evt.target\n setValue(parseInt(inputValue, 10))\n }\n\n // Updates local storage if value is valid\n useEffect(() => {\n try {\n const rawValue = value * 60\n if (!Number.isNaN(rawValue) && rawValue > 0) {\n setDeadline(rawValue)\n setError(null)\n } else {\n setError(translateString(1150, 'Enter a valid deadline'))\n }\n } catch {\n setError(translateString(1150, 'Enter a valid deadline'))\n }\n }, [value, setError, setDeadline, translateString])\n\n return (\n \n \n {translateString(90, 'Transaction deadline')}\n \n \n \n \n \n Minutes\n \n \n {error && (\n \n {error}\n \n )}\n \n )\n}\n\nexport default TransactionDeadlineSetting\n","import React from 'react'\nimport { Modal } from '@doublemoondev/doublemoon-uikit'\nimport SlippageToleranceSetting from './SlippageToleranceSetting'\nimport TransactionDeadlineSetting from './TransactionDeadlineSetting'\n\ntype SettingsModalProps = {\n onDismiss?: () => void\n translateString: (translationId: number, fallback: string) => string\n}\n\n// TODO: Fix UI Kit typings\nconst defaultOnDismiss = () => null\n\nconst SettingsModal = ({ onDismiss = defaultOnDismiss, translateString }: SettingsModalProps) => {\n return (\n \n \n \n \n )\n}\n\nexport default SettingsModal\n","import React, { useMemo } from 'react'\nimport { CheckmarkCircleIcon, ErrorIcon, Flex, LinkExternal, Text, Modal, Button } from '@doublemoondev/doublemoon-uikit'\nimport { useActiveWeb3React } from 'hooks'\nimport { getBscScanLink } from 'utils'\nimport { isTransactionRecent, useAllTransactions } from 'state/transactions/hooks'\nimport { TransactionDetails } from 'state/transactions/reducer'\nimport Loader from 'components/Loader'\n\ntype RecentTransactionsModalProps = {\n onDismiss?: () => void\n translateString: (translationId: number, fallback: string) => string\n}\n\n// TODO: Fix UI Kit typings\nconst defaultOnDismiss = () => null\n\nconst newTransactionsFirst = (a: TransactionDetails, b: TransactionDetails) => b.addedTime - a.addedTime\n\nconst getRowStatus = (sortedRecentTransaction: TransactionDetails) => {\n const { hash, receipt } = sortedRecentTransaction\n\n if (!hash) {\n return { icon: , color: 'text' }\n }\n\n if (hash && receipt?.status === 1) {\n return { icon: , color: 'success' }\n }\n\n return { icon: , color: 'failure' }\n}\n\nconst RecentTransactionsModal = ({ onDismiss = defaultOnDismiss, translateString }: RecentTransactionsModalProps) => {\n const { account, chainId } = useActiveWeb3React()\n const allTransactions = useAllTransactions()\n\n // Logic taken from Web3Status/index.tsx line 175\n const sortedRecentTransactions = useMemo(() => {\n const txs = Object.values(allTransactions)\n return txs.filter(isTransactionRecent).sort(newTransactionsFirst)\n }, [allTransactions])\n\n return (\n \n {!account && (\n \n \n Please connect your wallet to view your recent transactions\n \n \n \n )}\n {account && chainId && sortedRecentTransactions.length === 0 && (\n \n \n No recent transactions\n \n \n \n )}\n {account &&\n chainId &&\n sortedRecentTransactions.map((sortedRecentTransaction) => {\n const { hash, summary } = sortedRecentTransaction\n const { icon, color } = getRowStatus(sortedRecentTransaction)\n\n return (\n <>\n \n \n {summary ?? hash}\n \n {icon}\n \n \n )\n })}\n \n )\n}\n\nexport default RecentTransactionsModal\n","import React, { ReactNode } from 'react'\nimport styled from 'styled-components'\nimport { Heading, IconButton, Text, Flex, useModal, TuneIcon, HistoryIcon } from '@doublemoondev/doublemoon-uikit'\nimport useI18n from 'hooks/useI18n'\nimport SettingsModal from './SettingsModal'\nimport RecentTransactionsModal from './RecentTransactionsModal'\n\ninterface PageHeaderProps {\n title: ReactNode\n description?: ReactNode\n children?: ReactNode\n}\n\nconst StyledPageHeader = styled.div`\n border-bottom: 1px solid ${({ theme }) => theme.colors.borderColor};\n padding: 24px;\n`\n\nconst Details = styled.div`\n flex: 1;\n`\n\nconst PageHeader = ({ title, description, children }: PageHeaderProps) => {\n const TranslateString = useI18n()\n const [onPresentSettings] = useModal()\n const [onPresentRecentTransactions] = useModal()\n\n return (\n \n \n
\n {title}\n {description && (\n \n {description}\n \n )}\n
\n \n \n \n \n \n \n
\n {children && {children}}\n
\n )\n}\n\nexport default PageHeader\n","import React, { useContext, useMemo } from 'react'\nimport { ThemeContext } from 'styled-components'\nimport { Pair } from '@doublemoondev/sdk'\nimport { Button, CardBody, Text } from '@doublemoondev/doublemoon-uikit'\nimport { Link } from 'react-router-dom'\nimport CardNav from 'components/CardNav'\nimport Question from 'components/QuestionHelper'\nimport FullPositionCard from 'components/PositionCard'\nimport { useTokenBalancesWithLoadingIndicator } from 'state/wallet/hooks'\nimport { StyledInternalLink } from 'components/Shared'\nimport { LightCard } from 'components/Card'\nimport { RowBetween } from 'components/Row'\nimport { AutoColumn } from 'components/Column'\n\nimport { useActiveWeb3React } from 'hooks'\nimport { usePairs } from 'data/Reserves'\nimport { toV2LiquidityToken, useTrackedTokenPairs } from 'state/user/hooks'\nimport { Dots } from 'components/swap/styleds'\nimport useI18n from 'hooks/useI18n'\nimport PageHeader from 'components/PageHeader'\nimport AppBody from '../AppBody'\n\nexport default function Pool() {\n const theme = useContext(ThemeContext)\n const { account } = useActiveWeb3React()\n const TranslateString = useI18n()\n\n // fetch the user's balances of all tracked V2 LP tokens\n const trackedTokenPairs = useTrackedTokenPairs()\n const tokenPairsWithLiquidityTokens = useMemo(\n () => trackedTokenPairs.map((tokens) => ({ liquidityToken: toV2LiquidityToken(tokens), tokens })),\n [trackedTokenPairs]\n )\n const liquidityTokens = useMemo(() => tokenPairsWithLiquidityTokens.map((tpwlt) => tpwlt.liquidityToken), [\n tokenPairsWithLiquidityTokens,\n ])\n const [v2PairsBalances, fetchingV2PairBalances] = useTokenBalancesWithLoadingIndicator(\n account ?? undefined,\n liquidityTokens\n )\n\n // fetch the reserves for all V2 pools in which the user has a balance\n const liquidityTokensWithBalances = useMemo(\n () =>\n tokenPairsWithLiquidityTokens.filter(({ liquidityToken }) =>\n v2PairsBalances[liquidityToken.address]?.greaterThan('0')\n ),\n [tokenPairsWithLiquidityTokens, v2PairsBalances]\n )\n\n const v2Pairs = usePairs(liquidityTokensWithBalances.map(({ tokens }) => tokens))\n const v2IsLoading =\n fetchingV2PairBalances || v2Pairs?.length < liquidityTokensWithBalances.length || v2Pairs?.some((V2Pair) => !V2Pair)\n\n const allV2PairsWithLiquidity = v2Pairs.map(([, pair]) => pair).filter((v2Pair): v2Pair is Pair => Boolean(v2Pair))\n\n return (\n <>\n \n \n \n \n \n \n \n \n \n {TranslateString(107, 'Your Liquidity')}\n \n \n\n {!account ? (\n \n \n {TranslateString(156, 'Connect to a wallet to view your liquidity.')}\n \n \n ) : v2IsLoading ? (\n \n \n Loading\n \n \n ) : allV2PairsWithLiquidity?.length > 0 ? (\n <>\n {allV2PairsWithLiquidity.map((v2Pair) => (\n \n ))}\n \n ) : (\n \n \n {TranslateString(104, 'No liquidity found.')}\n \n \n )}\n\n
\n \n {TranslateString(106, \"Don't see a pool you joined?\")}{' '}\n \n {TranslateString(108, 'Import it.')}\n \n \n \n {TranslateString(1172, 'Or, if you staked your LP tokens in a farm, unstake them to see them here.')}\n \n
\n
\n
\n
\n
\n \n )\n}\n","import { createAction } from '@reduxjs/toolkit'\n\nexport enum Field {\n LIQUIDITY_PERCENT = 'LIQUIDITY_PERCENT',\n LIQUIDITY = 'LIQUIDITY',\n CURRENCY_A = 'CURRENCY_A',\n CURRENCY_B = 'CURRENCY_B'\n}\n\nexport const typeInput = createAction<{ field: Field; typedValue: string }>('burn/typeInputBurn')\n","import React, { useCallback } from 'react'\nimport styled from 'styled-components'\n\nconst StyledRangeInput = styled.input<{ size: number }>`\n -webkit-appearance: none; /* Hides the slider so that custom slider can be made */\n width: 100%; /* Specific width is required for Firefox. */\n background: transparent; /* Otherwise white in Chrome */\n cursor: pointer;\n\n &:focus {\n outline: none;\n }\n\n &::-moz-focus-outer {\n border: 0;\n }\n\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n height: ${({ size }) => size}px;\n width: ${({ size }) => size}px;\n background-color: #565a69;\n border-radius: 100%;\n border: none;\n transform: translateY(-50%);\n color: ${({ theme }) => theme.colors.invertedContrast};\n\n &:hover,\n &:focus {\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.08), 0px 16px 24px rgba(0, 0, 0, 0.06),\n 0px 24px 32px rgba(0, 0, 0, 0.04);\n }\n }\n\n &::-moz-range-thumb {\n height: ${({ size }) => size}px;\n width: ${({ size }) => size}px;\n background-color: #565a69;\n border-radius: 100%;\n border: none;\n color: ${({ theme }) => theme.colors.invertedContrast};\n\n &:hover,\n &:focus {\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.08), 0px 16px 24px rgba(0, 0, 0, 0.06),\n 0px 24px 32px rgba(0, 0, 0, 0.04);\n }\n }\n\n &::-ms-thumb {\n height: ${({ size }) => size}px;\n width: ${({ size }) => size}px;\n background-color: #565a69;\n border-radius: 100%;\n color: ${({ theme }) => theme.colors.invertedContrast};\n\n &:hover,\n &:focus {\n box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.1), 0px 4px 8px rgba(0, 0, 0, 0.08), 0px 16px 24px rgba(0, 0, 0, 0.06),\n 0px 24px 32px rgba(0, 0, 0, 0.04);\n }\n }\n\n &::-webkit-slider-runnable-track {\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.primaryDark},\n ${({ theme }) => theme.colors.tertiary}\n );\n height: 2px;\n }\n\n &::-moz-range-track {\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.primaryDark},\n ${({ theme }) => theme.colors.tertiary}\n );\n height: 2px;\n }\n\n &::-ms-track {\n width: 100%;\n border-color: transparent;\n color: transparent;\n\n background: ${({ theme }) => theme.colors.primaryDark};\n height: 2px;\n }\n &::-ms-fill-lower {\n background: ${({ theme }) => theme.colors.primaryDark};\n }\n &::-ms-fill-upper {\n background: ${({ theme }) => theme.colors.tertiary};\n }\n`\n\ninterface InputSliderProps {\n value: number\n onChange: (value: number) => void\n step?: number\n min?: number\n max?: number\n size?: number\n}\n\nexport default function Slider({ value, onChange, min = 0, step = 1, max = 100, size = 28 }: InputSliderProps) {\n const changeCallback = useCallback(\n e => {\n onChange(parseInt(e.target.value))\n },\n [onChange]\n )\n\n return (\n \n )\n}\n","import { Currency, CurrencyAmount, JSBI, Pair, Percent, TokenAmount } from '@doublemoondev/sdk'\nimport { useCallback } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { usePair } from '../../data/Reserves'\nimport { useTotalSupply } from '../../data/TotalSupply'\n\nimport { useActiveWeb3React } from '../../hooks'\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\nimport { AppDispatch, AppState } from '../index'\nimport { tryParseAmount } from '../swap/hooks'\nimport { useTokenBalances } from '../wallet/hooks'\nimport { Field, typeInput } from './actions'\n\nexport function useBurnState(): AppState['burn'] {\n return useSelector(state => state.burn)\n}\n\nexport function useDerivedBurnInfo(\n currencyA: Currency | undefined,\n currencyB: Currency | undefined\n): {\n pair?: Pair | null\n parsedAmounts: {\n [Field.LIQUIDITY_PERCENT]: Percent\n [Field.LIQUIDITY]?: TokenAmount\n [Field.CURRENCY_A]?: CurrencyAmount\n [Field.CURRENCY_B]?: CurrencyAmount\n }\n error?: string\n} {\n const { account, chainId } = useActiveWeb3React()\n\n const { independentField, typedValue } = useBurnState()\n\n // pair + totalsupply\n const [, pair] = usePair(currencyA, currencyB)\n\n // balances\n const relevantTokenBalances = useTokenBalances(account ?? undefined, [pair?.liquidityToken])\n const userLiquidity: undefined | TokenAmount = relevantTokenBalances?.[pair?.liquidityToken?.address ?? '']\n\n const [tokenA, tokenB] = [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)]\n const tokens = {\n [Field.CURRENCY_A]: tokenA,\n [Field.CURRENCY_B]: tokenB,\n [Field.LIQUIDITY]: pair?.liquidityToken\n }\n\n // liquidity values\n const totalSupply = useTotalSupply(pair?.liquidityToken)\n const liquidityValueA =\n pair &&\n totalSupply &&\n userLiquidity &&\n tokenA &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalSupply.raw, userLiquidity.raw)\n ? new TokenAmount(tokenA, pair.getLiquidityValue(tokenA, totalSupply, userLiquidity, false).raw)\n : undefined\n const liquidityValueB =\n pair &&\n totalSupply &&\n userLiquidity &&\n tokenB &&\n // this condition is a short-circuit in the case where useTokenBalance updates sooner than useTotalSupply\n JSBI.greaterThanOrEqual(totalSupply.raw, userLiquidity.raw)\n ? new TokenAmount(tokenB, pair.getLiquidityValue(tokenB, totalSupply, userLiquidity, false).raw)\n : undefined\n const liquidityValues: { [Field.CURRENCY_A]?: TokenAmount; [Field.CURRENCY_B]?: TokenAmount } = {\n [Field.CURRENCY_A]: liquidityValueA,\n [Field.CURRENCY_B]: liquidityValueB\n }\n\n let percentToRemove: Percent = new Percent('0', '100')\n // user specified a %\n if (independentField === Field.LIQUIDITY_PERCENT) {\n percentToRemove = new Percent(typedValue, '100')\n }\n // user specified a specific amount of liquidity tokens\n else if (independentField === Field.LIQUIDITY) {\n if (pair?.liquidityToken) {\n const independentAmount = tryParseAmount(typedValue, pair.liquidityToken)\n if (independentAmount && userLiquidity && !independentAmount.greaterThan(userLiquidity)) {\n percentToRemove = new Percent(independentAmount.raw, userLiquidity.raw)\n }\n }\n }\n // user specified a specific amount of token a or b\n else if (tokens[independentField]) {\n const independentAmount = tryParseAmount(typedValue, tokens[independentField])\n const liquidityValue = liquidityValues[independentField]\n if (independentAmount && liquidityValue && !independentAmount.greaterThan(liquidityValue)) {\n percentToRemove = new Percent(independentAmount.raw, liquidityValue.raw)\n }\n }\n\n const parsedAmounts: {\n [Field.LIQUIDITY_PERCENT]: Percent\n [Field.LIQUIDITY]?: TokenAmount\n [Field.CURRENCY_A]?: TokenAmount\n [Field.CURRENCY_B]?: TokenAmount\n } = {\n [Field.LIQUIDITY_PERCENT]: percentToRemove,\n [Field.LIQUIDITY]:\n userLiquidity && percentToRemove && percentToRemove.greaterThan('0')\n ? new TokenAmount(userLiquidity.token, percentToRemove.multiply(userLiquidity.raw).quotient)\n : undefined,\n [Field.CURRENCY_A]:\n tokenA && percentToRemove && percentToRemove.greaterThan('0') && liquidityValueA\n ? new TokenAmount(tokenA, percentToRemove.multiply(liquidityValueA.raw).quotient)\n : undefined,\n [Field.CURRENCY_B]:\n tokenB && percentToRemove && percentToRemove.greaterThan('0') && liquidityValueB\n ? new TokenAmount(tokenB, percentToRemove.multiply(liquidityValueB.raw).quotient)\n : undefined\n }\n\n let error: string | undefined\n if (!account) {\n error = 'Connect Wallet'\n }\n\n if (!parsedAmounts[Field.LIQUIDITY] || !parsedAmounts[Field.CURRENCY_A] || !parsedAmounts[Field.CURRENCY_B]) {\n error = error ?? 'Enter an amount'\n }\n\n return { pair, parsedAmounts, error }\n}\n\nexport function useBurnActionHandlers(): {\n onUserInput: (field: Field, typedValue: string) => void\n} {\n const dispatch = useDispatch()\n\n const onUserInput = useCallback(\n (field: Field, typedValue: string) => {\n dispatch(typeInput({ field, typedValue }))\n },\n [dispatch]\n )\n\n return {\n onUserInput\n }\n}\n","import React, { useCallback, useContext, useMemo, useState } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport { splitSignature } from '@ethersproject/bytes'\nimport { Contract } from '@ethersproject/contracts'\nimport { TransactionResponse } from '@ethersproject/providers'\nimport { Currency, currencyEquals, ETHER, Percent, WETH } from '@doublemoondev/sdk'\nimport { Button, Flex, Text } from '@doublemoondev/doublemoon-uikit'\nimport { ArrowDown, Plus } from 'react-feather'\nimport { RouteComponentProps } from 'react-router'\n\nimport { BigNumber } from '@ethersproject/bignumber'\nimport ConnectWalletButton from 'components/ConnectWalletButton'\nimport useI18n from 'hooks/useI18n'\nimport { AutoColumn, ColumnCenter } from '../../components/Column'\nimport TransactionConfirmationModal, { ConfirmationModalContent } from '../../components/TransactionConfirmationModal'\nimport CurrencyInputPanel from '../../components/CurrencyInputPanel'\nimport DoubleCurrencyLogo from '../../components/DoubleLogo'\nimport { AddRemoveTabs } from '../../components/NavigationTabs'\nimport { MinimalPositionCard } from '../../components/PositionCard'\nimport { RowBetween, RowFixed } from '../../components/Row'\n\nimport Slider from '../../components/Slider'\nimport CurrencyLogo from '../../components/CurrencyLogo'\nimport { ROUTER_ADDRESS } from '../../constants'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useCurrency } from '../../hooks/Tokens'\nimport { usePairContract } from '../../hooks/useContract'\n\nimport { useTransactionAdder } from '../../state/transactions/hooks'\nimport { StyledInternalLink } from '../../components/Shared'\nimport { calculateGasMargin, calculateSlippageAmount, getRouterContract } from '../../utils'\nimport { currencyId } from '../../utils/currencyId'\nimport useDebouncedChangeHandler from '../../utils/useDebouncedChangeHandler'\nimport { wrappedCurrency } from '../../utils/wrappedCurrency'\nimport AppBody from '../AppBody'\nimport { ClickableText, Wrapper } from '../Pool/styleds'\nimport { useApproveCallback, ApprovalState } from '../../hooks/useApproveCallback'\nimport { Dots } from '../../components/swap/styleds'\nimport { useBurnActionHandlers, useDerivedBurnInfo, useBurnState } from '../../state/burn/hooks'\n\nimport { Field } from '../../state/burn/actions'\nimport { useUserDeadline, useUserSlippageTolerance } from '../../state/user/hooks'\n\nconst OutlineCard = styled.div`\n border: 1px solid ${({ theme }) => theme.colors.borderColor};\n border-radius: 16px;\n padding: 24px;\n`\n\nconst Body = styled.div`\n padding-left: 24px;\n padding-right: 24px;\n`\n\nexport default function RemoveLiquidity({\n history,\n match: {\n params: { currencyIdA, currencyIdB },\n },\n}: RouteComponentProps<{ currencyIdA: string; currencyIdB: string }>) {\n const [currencyA, currencyB] = [useCurrency(currencyIdA) ?? undefined, useCurrency(currencyIdB) ?? undefined]\n const { account, chainId, library } = useActiveWeb3React()\n const TranslateString = useI18n()\n const [tokenA, tokenB] = useMemo(() => [wrappedCurrency(currencyA, chainId), wrappedCurrency(currencyB, chainId)], [\n currencyA,\n currencyB,\n chainId,\n ])\n\n const theme = useContext(ThemeContext)\n\n // burn state\n const { independentField, typedValue } = useBurnState()\n const { pair, parsedAmounts, error } = useDerivedBurnInfo(currencyA ?? undefined, currencyB ?? undefined)\n const { onUserInput: _onUserInput } = useBurnActionHandlers()\n const isValid = !error\n\n // modal and loading\n const [showConfirm, setShowConfirm] = useState(false)\n const [showDetailed, setShowDetailed] = useState(false)\n const [attemptingTxn, setAttemptingTxn] = useState(false) // clicked confirm\n\n // txn values\n const [txHash, setTxHash] = useState('')\n const [deadline] = useUserDeadline()\n const [allowedSlippage] = useUserSlippageTolerance()\n\n const formattedAmounts = {\n [Field.LIQUIDITY_PERCENT]: parsedAmounts[Field.LIQUIDITY_PERCENT].equalTo('0')\n ? '0'\n : parsedAmounts[Field.LIQUIDITY_PERCENT].lessThan(new Percent('1', '100'))\n ? '<1'\n : parsedAmounts[Field.LIQUIDITY_PERCENT].toFixed(0),\n [Field.LIQUIDITY]:\n independentField === Field.LIQUIDITY ? typedValue : parsedAmounts[Field.LIQUIDITY]?.toSignificant(6) ?? '',\n [Field.CURRENCY_A]:\n independentField === Field.CURRENCY_A ? typedValue : parsedAmounts[Field.CURRENCY_A]?.toSignificant(6) ?? '',\n [Field.CURRENCY_B]:\n independentField === Field.CURRENCY_B ? typedValue : parsedAmounts[Field.CURRENCY_B]?.toSignificant(6) ?? '',\n }\n\n const atMaxAmount = parsedAmounts[Field.LIQUIDITY_PERCENT]?.equalTo(new Percent('1'))\n\n // pair contract\n const pairContract: Contract | null = usePairContract(pair?.liquidityToken?.address)\n\n // allowance handling\n const [signatureData, setSignatureData] = useState<{ v: number; r: string; s: string; deadline: number } | null>(null)\n const [approval, approveCallback] = useApproveCallback(parsedAmounts[Field.LIQUIDITY], ROUTER_ADDRESS)\n async function onAttemptToApprove() {\n if (!pairContract || !pair || !library) throw new Error('missing dependencies')\n const liquidityAmount = parsedAmounts[Field.LIQUIDITY]\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n // try to gather a signature for permission\n const nonce = await pairContract.nonces(account)\n\n const deadlineForSignature: number = Math.ceil(Date.now() / 1000) + deadline\n\n const EIP712Domain = [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ]\n const domain = {\n name: 'Pancake LPs',\n version: '1',\n chainId,\n verifyingContract: pair.liquidityToken.address,\n }\n const Permit = [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ]\n const message = {\n owner: account,\n spender: ROUTER_ADDRESS,\n value: liquidityAmount.raw.toString(),\n nonce: nonce.toHexString(),\n deadline: deadlineForSignature,\n }\n const data = JSON.stringify({\n types: {\n EIP712Domain,\n Permit,\n },\n domain,\n primaryType: 'Permit',\n message,\n })\n\n library\n .send('eth_signTypedData_v4', [account, data])\n .then(splitSignature)\n .then((signature) => {\n setSignatureData({\n v: signature.v,\n r: signature.r,\n s: signature.s,\n deadline: deadlineForSignature,\n })\n })\n .catch((e) => {\n // for all errors other than 4001 (EIP-1193 user rejected request), fall back to manual approve\n if (e?.code !== 4001) {\n approveCallback()\n }\n })\n }\n\n // wrapped onUserInput to clear signatures\n const onUserInput = useCallback(\n (field: Field, val: string) => {\n setSignatureData(null)\n return _onUserInput(field, val)\n },\n [_onUserInput]\n )\n\n const onLiquidityInput = useCallback((val: string): void => onUserInput(Field.LIQUIDITY, val), [onUserInput])\n const onCurrencyAInput = useCallback((val: string): void => onUserInput(Field.CURRENCY_A, val), [onUserInput])\n const onCurrencyBInput = useCallback((val: string): void => onUserInput(Field.CURRENCY_B, val), [onUserInput])\n\n // tx sending\n const addTransaction = useTransactionAdder()\n async function onRemove() {\n if (!chainId || !library || !account) throw new Error('missing dependencies')\n const { [Field.CURRENCY_A]: currencyAmountA, [Field.CURRENCY_B]: currencyAmountB } = parsedAmounts\n if (!currencyAmountA || !currencyAmountB) {\n throw new Error('missing currency amounts')\n }\n const router = getRouterContract(chainId, library, account)\n\n const amountsMin = {\n [Field.CURRENCY_A]: calculateSlippageAmount(currencyAmountA, allowedSlippage)[0],\n [Field.CURRENCY_B]: calculateSlippageAmount(currencyAmountB, allowedSlippage)[0],\n }\n\n if (!currencyA || !currencyB) throw new Error('missing tokens')\n const liquidityAmount = parsedAmounts[Field.LIQUIDITY]\n if (!liquidityAmount) throw new Error('missing liquidity amount')\n\n const currencyBIsETH = currencyB === ETHER\n const oneCurrencyIsETH = currencyA === ETHER || currencyBIsETH\n const deadlineFromNow = Math.ceil(Date.now() / 1000) + deadline\n\n if (!tokenA || !tokenB) throw new Error('could not wrap')\n\n let methodNames: string[]\n let args: Array\n // we have approval, use normal remove liquidity\n if (approval === ApprovalState.APPROVED) {\n // removeLiquidityETH\n if (oneCurrencyIsETH) {\n methodNames = ['removeLiquidityETH', 'removeLiquidityETHSupportingFeeOnTransferTokens']\n args = [\n currencyBIsETH ? tokenA.address : tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_A : Field.CURRENCY_B].toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_B : Field.CURRENCY_A].toString(),\n account,\n deadlineFromNow,\n ]\n }\n // removeLiquidity\n else {\n methodNames = ['removeLiquidity']\n args = [\n tokenA.address,\n tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[Field.CURRENCY_A].toString(),\n amountsMin[Field.CURRENCY_B].toString(),\n account,\n deadlineFromNow,\n ]\n }\n }\n // we have a signataure, use permit versions of remove liquidity\n else if (signatureData !== null) {\n // removeLiquidityETHWithPermit\n if (oneCurrencyIsETH) {\n methodNames = ['removeLiquidityETHWithPermit', 'removeLiquidityETHWithPermitSupportingFeeOnTransferTokens']\n args = [\n currencyBIsETH ? tokenA.address : tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_A : Field.CURRENCY_B].toString(),\n amountsMin[currencyBIsETH ? Field.CURRENCY_B : Field.CURRENCY_A].toString(),\n account,\n signatureData.deadline,\n false,\n signatureData.v,\n signatureData.r,\n signatureData.s,\n ]\n }\n // removeLiquidityETHWithPermit\n else {\n methodNames = ['removeLiquidityWithPermit']\n args = [\n tokenA.address,\n tokenB.address,\n liquidityAmount.raw.toString(),\n amountsMin[Field.CURRENCY_A].toString(),\n amountsMin[Field.CURRENCY_B].toString(),\n account,\n signatureData.deadline,\n false,\n signatureData.v,\n signatureData.r,\n signatureData.s,\n ]\n }\n } else {\n throw new Error('Attempting to confirm without approval or a signature. Please contact support.')\n }\n const safeGasEstimates: (BigNumber | undefined)[] = await Promise.all(\n methodNames.map((methodName, index) =>\n router.estimateGas[methodName](...args)\n .then(calculateGasMargin)\n .catch((e) => {\n console.error(`estimateGas failed`, index, methodName, args, e)\n return undefined\n })\n )\n )\n\n const indexOfSuccessfulEstimation = safeGasEstimates.findIndex((safeGasEstimate) =>\n BigNumber.isBigNumber(safeGasEstimate)\n )\n\n // all estimations failed...\n if (indexOfSuccessfulEstimation === -1) {\n console.error('This transaction would fail. Please contact support.')\n } else {\n const methodName = methodNames[indexOfSuccessfulEstimation]\n const safeGasEstimate = safeGasEstimates[indexOfSuccessfulEstimation]\n\n setAttemptingTxn(true)\n await router[methodName](...args, {\n gasLimit: safeGasEstimate,\n })\n .then((response: TransactionResponse) => {\n setAttemptingTxn(false)\n\n addTransaction(response, {\n summary: `Remove ${parsedAmounts[Field.CURRENCY_A]?.toSignificant(3)} ${\n currencyA?.symbol\n } and ${parsedAmounts[Field.CURRENCY_B]?.toSignificant(3)} ${currencyB?.symbol}`,\n })\n\n setTxHash(response.hash)\n })\n .catch((e: Error) => {\n setAttemptingTxn(false)\n // we only care if the error is something _other_ than the user rejected the tx\n console.error(e)\n })\n }\n }\n\n function modalHeader() {\n return (\n \n \n {parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)}\n \n \n \n {currencyA?.symbol}\n \n \n \n \n \n \n \n {parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)}\n \n \n \n {currencyB?.symbol}\n \n \n \n\n \n {`Output is estimated. If the price changes by more than ${\n allowedSlippage / 100\n }% your transaction will revert.`}\n \n \n )\n }\n\n function modalBottom() {\n return (\n <>\n \n {`LP ${currencyA?.symbol}/${currencyB?.symbol}`} Burned\n \n \n {parsedAmounts[Field.LIQUIDITY]?.toSignificant(6)}\n \n \n {pair && (\n <>\n \n {TranslateString(1182, 'Price')}\n \n 1 {currencyA?.symbol} = {tokenA ? pair.priceOf(tokenA).toSignificant(6) : '-'} {currencyB?.symbol}\n \n \n \n
\n \n 1 {currencyB?.symbol} = {tokenB ? pair.priceOf(tokenB).toSignificant(6) : '-'} {currencyA?.symbol}\n \n \n \n )}\n \n \n )\n }\n\n const pendingText = `Removing ${parsedAmounts[Field.CURRENCY_A]?.toSignificant(6)} ${\n currencyA?.symbol\n } and ${parsedAmounts[Field.CURRENCY_B]?.toSignificant(6)} ${currencyB?.symbol}`\n\n const liquidityPercentChangeCallback = useCallback(\n (value: number) => {\n onUserInput(Field.LIQUIDITY_PERCENT, value.toString())\n },\n [onUserInput]\n )\n\n const oneCurrencyIsETH = currencyA === ETHER || currencyB === ETHER\n const oneCurrencyIsWETH = Boolean(\n chainId &&\n ((currencyA && currencyEquals(WETH[chainId], currencyA)) ||\n (currencyB && currencyEquals(WETH[chainId], currencyB)))\n )\n\n const handleSelectCurrencyA = useCallback(\n (currency: Currency) => {\n if (currencyIdB && currencyId(currency) === currencyIdB) {\n history.push(`/remove/${currencyId(currency)}/${currencyIdA}`)\n } else {\n history.push(`/remove/${currencyId(currency)}/${currencyIdB}`)\n }\n },\n [currencyIdA, currencyIdB, history]\n )\n const handleSelectCurrencyB = useCallback(\n (currency: Currency) => {\n if (currencyIdA && currencyId(currency) === currencyIdA) {\n history.push(`/remove/${currencyIdB}/${currencyId(currency)}`)\n } else {\n history.push(`/remove/${currencyIdA}/${currencyId(currency)}`)\n }\n },\n [currencyIdA, currencyIdB, history]\n )\n\n const handleDismissConfirmation = useCallback(() => {\n setShowConfirm(false)\n setSignatureData(null) // important that we clear signature data to avoid bad sigs\n // if there was a tx hash, we want to clear the input\n if (txHash) {\n onUserInput(Field.LIQUIDITY_PERCENT, '0')\n }\n setTxHash('')\n }, [onUserInput, txHash])\n\n const [innerLiquidityPercentage, setInnerLiquidityPercentage] = useDebouncedChangeHandler(\n Number.parseInt(parsedAmounts[Field.LIQUIDITY_PERCENT].toFixed(0)),\n liquidityPercentChangeCallback\n )\n\n return (\n <>\n \n \n \n (\n \n )}\n pendingText={pendingText}\n />\n \n \n \n \n \n Amount\n {\n setShowDetailed(!showDetailed)\n }}\n >\n {showDetailed ? TranslateString(1184, 'Simple') : TranslateString(1186, 'Detailed')}\n \n \n \n {formattedAmounts[Field.LIQUIDITY_PERCENT]}%\n \n {!showDetailed && (\n <>\n \n \n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '25')}\n >\n 25%\n \n onUserInput(Field.LIQUIDITY_PERCENT, '50')}\n >\n 50%\n \n onUserInput(Field.LIQUIDITY_PERCENT, '75')}\n >\n 75%\n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')}\n >\n {TranslateString(166, 'Max')}\n \n \n \n )}\n \n \n \n {!showDetailed && (\n <>\n \n \n \n \n \n \n \n {formattedAmounts[Field.CURRENCY_A] || '-'}\n \n \n \n {currencyA?.symbol}\n \n \n \n \n {formattedAmounts[Field.CURRENCY_B] || '-'}\n \n \n \n {currencyB?.symbol}\n \n \n \n {chainId && (oneCurrencyIsWETH || oneCurrencyIsETH) ? (\n \n {oneCurrencyIsETH ? (\n \n {TranslateString(1188, 'Receive WBNB')}\n \n ) : oneCurrencyIsWETH ? (\n \n {TranslateString(1190, 'Receive BNB')}\n \n ) : null}\n \n ) : null}\n \n \n \n \n )}\n \n {showDetailed && (\n <>\n {\n onUserInput(Field.LIQUIDITY_PERCENT, '100')\n }}\n showMaxButton={!atMaxAmount}\n disableCurrencySelect\n currency={pair?.liquidityToken}\n pair={pair}\n id=\"liquidity-amount\"\n />\n \n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')}\n showMaxButton={!atMaxAmount}\n currency={currencyA}\n label=\"Output\"\n onCurrencySelect={handleSelectCurrencyA}\n id=\"remove-liquidity-tokena\"\n />\n \n \n \n onUserInput(Field.LIQUIDITY_PERCENT, '100')}\n showMaxButton={!atMaxAmount}\n currency={currencyB}\n label=\"Output\"\n onCurrencySelect={handleSelectCurrencyB}\n id=\"remove-liquidity-tokenb\"\n />\n \n )}\n {pair && (\n
\n \n Price:\n
\n 1 {currencyA?.symbol} = {tokenA ? pair.priceOf(tokenA).toSignificant(6) : '-'} {currencyB?.symbol}\n
\n
\n \n
\n
\n 1 {currencyB?.symbol} = {tokenB ? pair.priceOf(tokenB).toSignificant(6) : '-'} {currencyA?.symbol}\n
\n \n
\n )}\n
\n {!account ? (\n \n ) : (\n \n \n {approval === ApprovalState.PENDING ? (\n Approving\n ) : approval === ApprovalState.APPROVED || signatureData !== null ? (\n 'Approved'\n ) : (\n 'Approve'\n )}\n \n {\n setShowConfirm(true)\n }}\n disabled={!isValid || (signatureData === null && approval !== ApprovalState.APPROVED)}\n variant={\n !isValid && !!parsedAmounts[Field.CURRENCY_A] && !!parsedAmounts[Field.CURRENCY_B]\n ? 'danger'\n : 'primary'\n }\n >\n {error || 'Remove'}\n \n \n )}\n
\n \n \n \n \n\n {pair ? (\n \n \n \n ) : null}\n \n )\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * Easy way to debounce the handling of a rapidly changing value, e.g. a changing slider input\n * @param value value that is rapidly changing\n * @param onChange change handler that should receive the debounced updates to the value\n * @param debouncedMs how long we should wait for changes to be applied\n */\nexport default function useDebouncedChangeHandler(\n value: T,\n onChange: (newValue: T) => void,\n debouncedMs = 100\n): [T, (value: T) => void] {\n const [inner, setInner] = useState(() => value)\n const timer = useRef>()\n\n const onChangeInner = useCallback(\n (newValue: T) => {\n setInner(newValue)\n if (timer.current) {\n clearTimeout(timer.current)\n }\n timer.current = setTimeout(() => {\n onChange(newValue)\n timer.current = undefined\n }, debouncedMs)\n },\n [debouncedMs, onChange]\n )\n\n useEffect(() => {\n if (timer.current) {\n clearTimeout(timer.current)\n timer.current = undefined\n }\n setInner(value)\n }, [value])\n\n return [inner, onChangeInner]\n}\n","import React, { useCallback } from 'react'\nimport styled from 'styled-components'\nimport { Text } from '@doublemoondev/doublemoon-uikit'\nimport useI18n from 'hooks/useI18n'\nimport useENS from '../../hooks/useENS'\nimport { useActiveWeb3React } from '../../hooks'\nimport { ExternalLink } from '../Shared'\nimport { AutoColumn } from '../Column'\nimport { RowBetween } from '../Row'\nimport { getBscScanLink } from '../../utils'\n\nconst InputPanel = styled.div`\n display: flex;\n flex-flow: column nowrap;\n position: relative;\n border-radius: 1.25rem;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n z-index: 1;\n width: 100%;\n`\n\nconst ContainerRow = styled.div<{ error: boolean }>`\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 1.25rem;\n border: 1px solid ${({ error, theme }) => (error ? theme.colors.failure : theme.colors.invertedContrast)};\n transition: border-color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')},\n color 500ms ${({ error }) => (error ? 'step-end' : 'step-start')};\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n`\n\nconst InputContainer = styled.div`\n flex: 1;\n padding: 1rem;\n`\n\nconst Input = styled.input<{ error?: boolean }>`\n font-size: 1.25rem;\n outline: none;\n border: none;\n flex: 1 1 auto;\n width: 0;\n background-color: ${({ theme }) => theme.colors.invertedContrast};\n transition: color 300ms ${({ error }) => (error ? 'step-end' : 'step-start')};\n color: ${({ error, theme }) => (error ? theme.colors.failure : theme.colors.primary)};\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 500;\n width: 100%;\n ::placeholder {\n color: ${({ theme }) => theme.colors.textDisabled};\n }\n padding: 0px;\n -webkit-appearance: textfield;\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n ::-webkit-outer-spin-button,\n ::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n\n ::placeholder {\n color: ${({ theme }) => theme.colors.textDisabled};\n }\n`\n\nexport default function AddressInputPanel({\n id,\n value,\n onChange,\n}: {\n id?: string\n // the typed string value\n value: string\n // triggers whenever the typed value changes\n onChange: (value: string) => void\n}) {\n const { chainId } = useActiveWeb3React()\n const TranslateString = useI18n()\n const { address, loading, name } = useENS(value)\n\n const handleInput = useCallback(\n (event) => {\n const input = event.target.value\n const withoutSpaces = input.replace(/\\s+/g, '')\n onChange(withoutSpaces)\n },\n [onChange]\n )\n\n const error = Boolean(value.length > 0 && !loading && !address)\n\n return (\n \n \n \n \n \n \n {TranslateString(1138, 'Recipient')}\n \n {address && chainId && (\n \n {TranslateString(116, '(View on BscScan)')}\n \n )}\n \n \n \n \n \n \n )\n}\n","import { Percent } from '@doublemoondev/sdk'\nimport React from 'react'\nimport { ONE_BIPS } from '../../constants'\nimport { warningSeverity } from '../../utils/prices'\nimport { ErrorText } from './styleds'\n\n/**\n * Formatted version of price impact text with warning colors\n */\nexport default function FormattedPriceImpact({ priceImpact }: { priceImpact?: Percent }) {\n return (\n \n {priceImpact ? (priceImpact.lessThan(ONE_BIPS) ? '<0.01%' : `${priceImpact.toFixed(2)}%`) : '-'}\n \n )\n}\n","import { Trade, TradeType } from '@doublemoondev/sdk'\nimport React, { useMemo, useState } from 'react'\nimport { Text, Button } from '@doublemoondev/doublemoon-uikit'\nimport { Repeat } from 'react-feather'\n\nimport useI18n from 'hooks/useI18n'\nimport { Field } from '../../state/swap/actions'\nimport {\n computeSlippageAdjustedAmounts,\n computeTradePriceBreakdown,\n formatExecutionPrice,\n warningSeverity,\n} from '../../utils/prices'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { AutoRow, RowBetween, RowFixed } from '../Row'\nimport FormattedPriceImpact from './FormattedPriceImpact'\nimport { StyledBalanceMaxMini, SwapCallbackError } from './styleds'\n\nexport default function SwapModalFooter({\n trade,\n onConfirm,\n allowedSlippage,\n swapErrorMessage,\n disabledConfirm,\n}: {\n trade: Trade\n allowedSlippage: number\n onConfirm: () => void\n swapErrorMessage: string | undefined\n disabledConfirm: boolean\n}) {\n const [showInverted, setShowInverted] = useState(false)\n const slippageAdjustedAmounts = useMemo(() => computeSlippageAdjustedAmounts(trade, allowedSlippage), [\n allowedSlippage,\n trade,\n ])\n const { priceImpactWithoutFee, realizedLPFee } = useMemo(() => computeTradePriceBreakdown(trade), [trade])\n const severity = warningSeverity(priceImpactWithoutFee)\n const TranslateString = useI18n()\n\n return (\n <>\n \n \n Price\n \n {formatExecutionPrice(trade, showInverted)}\n setShowInverted(!showInverted)}>\n \n \n \n \n\n \n \n \n {trade.tradeType === TradeType.EXACT_INPUT\n ? TranslateString(1210, 'Minimum received')\n : TranslateString(220, 'Maximum sold')}\n \n \n \n \n \n {trade.tradeType === TradeType.EXACT_INPUT\n ? slippageAdjustedAmounts[Field.OUTPUT]?.toSignificant(4) ?? '-'\n : slippageAdjustedAmounts[Field.INPUT]?.toSignificant(4) ?? '-'}\n \n \n {trade.tradeType === TradeType.EXACT_INPUT\n ? trade.outputAmount.currency.symbol\n : trade.inputAmount.currency.symbol}\n \n \n \n \n \n {TranslateString(226, 'Price Impact')}\n \n \n \n \n \n \n {TranslateString(228, 'Liquidity Provider Fee')}\n \n \n \n {realizedLPFee ? `${realizedLPFee?.toSignificant(6)} ${trade.inputAmount.currency.symbol}` : '-'}\n \n \n \n\n \n 2 ? 'danger' : 'primary'}\n mt=\"10px\"\n id=\"confirm-swap-or-send\"\n width=\"100%\"\n >\n {severity > 2 ? 'Swap Anyway' : 'Confirm Swap'}\n \n\n {swapErrorMessage ? : null}\n \n \n )\n}\n","import React, { useContext, useMemo } from 'react'\nimport styled, { ThemeContext } from 'styled-components'\nimport { Trade, TradeType } from '@doublemoondev/sdk'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport { ArrowDown, AlertTriangle } from 'react-feather'\nimport { Field } from '../../state/swap/actions'\nimport { isAddress, shortenAddress } from '../../utils'\nimport { computeSlippageAdjustedAmounts, computeTradePriceBreakdown, warningSeverity } from '../../utils/prices'\nimport { AutoColumn } from '../Column'\nimport CurrencyLogo from '../CurrencyLogo'\nimport { RowBetween, RowFixed } from '../Row'\nimport { SwapShowAcceptChanges } from './styleds'\n\nconst PriceInfoText = styled(Text)`\n font-style: italic;\n line-height: 1.3;\n\n span {\n color: ${({ theme }) => theme.colors.primary};\n font-weight: 600;\n }\n`\n\nexport default function SwapModalHeader({\n trade,\n allowedSlippage,\n recipient,\n showAcceptChanges,\n onAcceptChanges,\n}: {\n trade: Trade\n allowedSlippage: number\n recipient: string | null\n showAcceptChanges: boolean\n onAcceptChanges: () => void\n}) {\n const slippageAdjustedAmounts = useMemo(() => computeSlippageAdjustedAmounts(trade, allowedSlippage), [\n trade,\n allowedSlippage,\n ])\n const { priceImpactWithoutFee } = useMemo(() => computeTradePriceBreakdown(trade), [trade])\n const priceImpactSeverity = warningSeverity(priceImpactWithoutFee)\n\n const theme = useContext(ThemeContext)\n\n return (\n \n \n \n \n \n {trade.inputAmount.toSignificant(6)}\n \n \n \n \n {trade.inputAmount.currency.symbol}\n \n \n \n \n \n \n \n \n \n 2\n ? theme.colors.failure\n : showAcceptChanges && trade.tradeType === TradeType.EXACT_INPUT\n ? theme.colors.primary\n : 'text'\n }\n >\n {trade.outputAmount.toSignificant(6)}\n \n \n \n \n {trade.outputAmount.currency.symbol}\n \n \n \n {showAcceptChanges ? (\n \n \n \n \n Price Updated\n \n \n \n \n ) : null}\n \n {trade.tradeType === TradeType.EXACT_INPUT ? (\n \n {`Output is estimated. You will receive at least `}\n \n {slippageAdjustedAmounts[Field.OUTPUT]?.toSignificant(6)} {trade.outputAmount.currency.symbol}\n \n {' or the transaction will revert.'}\n \n ) : (\n \n {`Input is estimated. You will sell at most `}\n \n {slippageAdjustedAmounts[Field.INPUT]?.toSignificant(6)} {trade.inputAmount.currency.symbol}\n \n {' or the transaction will revert.'}\n \n )}\n \n {recipient !== null ? (\n \n \n Output will be sent to{' '}\n {isAddress(recipient) ? shortenAddress(recipient) : recipient}\n \n \n ) : null}\n \n )\n}\n","import { currencyEquals, Trade } from '@doublemoondev/sdk'\nimport React, { useCallback, useMemo } from 'react'\nimport TransactionConfirmationModal, {\n ConfirmationModalContent,\n TransactionErrorContent\n} from '../TransactionConfirmationModal'\nimport SwapModalFooter from './SwapModalFooter'\nimport SwapModalHeader from './SwapModalHeader'\n\n/**\n * Returns true if the trade requires a confirmation of details before we can submit it\n * @param tradeA trade A\n * @param tradeB trade B\n */\nfunction tradeMeaningfullyDiffers(tradeA: Trade, tradeB: Trade): boolean {\n return (\n tradeA.tradeType !== tradeB.tradeType ||\n !currencyEquals(tradeA.inputAmount.currency, tradeB.inputAmount.currency) ||\n !tradeA.inputAmount.equalTo(tradeB.inputAmount) ||\n !currencyEquals(tradeA.outputAmount.currency, tradeB.outputAmount.currency) ||\n !tradeA.outputAmount.equalTo(tradeB.outputAmount)\n )\n}\n\nexport default function ConfirmSwapModal({\n trade,\n originalTrade,\n onAcceptChanges,\n allowedSlippage,\n onConfirm,\n onDismiss,\n recipient,\n swapErrorMessage,\n isOpen,\n attemptingTxn,\n txHash\n}: {\n isOpen: boolean\n trade: Trade | undefined\n originalTrade: Trade | undefined\n attemptingTxn: boolean\n txHash: string | undefined\n recipient: string | null\n allowedSlippage: number\n onAcceptChanges: () => void\n onConfirm: () => void\n swapErrorMessage: string | undefined\n onDismiss: () => void\n}) {\n const showAcceptChanges = useMemo(\n () => Boolean(trade && originalTrade && tradeMeaningfullyDiffers(trade, originalTrade)),\n [originalTrade, trade]\n )\n\n const modalHeader = useCallback(() => {\n return trade ? (\n \n ) : null\n }, [allowedSlippage, onAcceptChanges, recipient, showAcceptChanges, trade])\n\n const modalBottom = useCallback(() => {\n return trade ? (\n \n ) : null\n }, [allowedSlippage, onConfirm, showAcceptChanges, swapErrorMessage, trade])\n\n // text to show while loading\n const pendingText = `Swapping ${trade?.inputAmount?.toSignificant(6)} ${\n trade?.inputAmount?.currency?.symbol\n } for ${trade?.outputAmount?.toSignificant(6)} ${trade?.outputAmount?.currency?.symbol}`\n\n const confirmationContent = useCallback(\n () =>\n swapErrorMessage ? (\n \n ) : (\n \n ),\n [onDismiss, modalBottom, modalHeader, swapErrorMessage]\n )\n\n return (\n \n )\n}\n","import { Trade } from '@doublemoondev/sdk'\nimport React, { Fragment, memo, useContext } from 'react'\nimport { ChevronRight } from 'react-feather'\nimport { Flex, Text } from '@doublemoondev/doublemoon-uikit'\nimport { ThemeContext } from 'styled-components'\nimport CurrencyLogo from '../CurrencyLogo'\n\nexport default memo(function SwapRoute({ trade }: { trade: Trade }) {\n const theme = useContext(ThemeContext)\n return (\n \n {trade.route.path.map((token, i, path) => {\n const isLastItem: boolean = i === path.length - 1\n return (\n // eslint-disable-next-line react/no-array-index-key\n \n \n \n \n {token.symbol}\n \n \n {isLastItem ? null : }\n \n )\n })}\n
\n )\n})\n","import React from 'react'\nimport { Trade, TradeType } from '@doublemoondev/sdk'\nimport { Card, CardBody, Text } from '@doublemoondev/doublemoon-uikit'\nimport useI18n from 'hooks/useI18n'\nimport { Field } from '../../state/swap/actions'\nimport { useUserSlippageTolerance } from '../../state/user/hooks'\nimport { computeSlippageAdjustedAmounts, computeTradePriceBreakdown } from '../../utils/prices'\nimport { AutoColumn } from '../Column'\nimport QuestionHelper from '../QuestionHelper'\nimport { RowBetween, RowFixed } from '../Row'\nimport FormattedPriceImpact from './FormattedPriceImpact'\nimport { SectionBreak } from './styleds'\nimport SwapRoute from './SwapRoute'\n\nfunction TradeSummary({ trade, allowedSlippage }: { trade: Trade; allowedSlippage: number }) {\n const { priceImpactWithoutFee, realizedLPFee } = computeTradePriceBreakdown(trade)\n const isExactIn = trade.tradeType === TradeType.EXACT_INPUT\n const slippageAdjustedAmounts = computeSlippageAdjustedAmounts(trade, allowedSlippage)\n const TranslateString = useI18n()\n\n return (\n \n \n \n \n \n {isExactIn ? TranslateString(1210, 'Minimum received') : TranslateString(220, 'Maximum sold')}\n \n \n \n \n \n {isExactIn\n ? `${slippageAdjustedAmounts[Field.OUTPUT]?.toSignificant(4)} ${trade.outputAmount.currency.symbol}` ??\n '-'\n : `${slippageAdjustedAmounts[Field.INPUT]?.toSignificant(4)} ${trade.inputAmount.currency.symbol}` ??\n '-'}\n \n \n \n \n \n {TranslateString(226, 'Price Impact')}\n \n \n \n \n\n \n \n {TranslateString(228, 'Liquidity Provider Fee')}\n \n \n \n {realizedLPFee ? `${realizedLPFee.toSignificant(4)} ${trade.inputAmount.currency.symbol}` : '-'}\n \n \n \n \n )\n}\n\nexport interface AdvancedSwapDetailsProps {\n trade?: Trade\n}\n\nexport function AdvancedSwapDetails({ trade }: AdvancedSwapDetailsProps) {\n const [allowedSlippage] = useUserSlippageTolerance()\n const TranslateString = useI18n()\n const showRoute = Boolean(trade && trade.route.path.length > 2)\n\n return (\n \n {trade && (\n <>\n \n {showRoute && (\n <>\n \n \n \n Route\n \n \n \n \n \n )}\n \n )}\n \n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { useLastTruthy } from '../../hooks/useLast'\nimport { AdvancedSwapDetails, AdvancedSwapDetailsProps } from './AdvancedSwapDetails'\n\nconst AdvancedDetailsFooter = styled.div<{ show: boolean }>`\n padding-top: calc(16px + 2rem);\n padding-bottom: 20px;\n margin-top: -2rem;\n width: 100%;\n max-width: 400px;\n border-bottom-left-radius: 20px;\n border-bottom-right-radius: 20px;\n color: ${({ theme }) => theme.colors.textSubtle};\n z-index: 1;\n\n transform: ${({ show }) => (show ? 'translateY(0%)' : 'translateY(-100%)')};\n transition: transform 300ms ease-in-out;\n`\n\nexport default function AdvancedSwapDetailsDropdown({ trade, ...rest }: AdvancedSwapDetailsProps) {\n const lastTrade = useLastTruthy(trade)\n\n return (\n \n \n \n )\n}\n","import React from 'react'\nimport { Price } from '@doublemoondev/sdk'\nimport { SyncAltIcon, Text } from '@doublemoondev/doublemoon-uikit'\nimport { StyledBalanceMaxMini } from './styleds'\n\ninterface TradePriceProps {\n price?: Price\n showInverted: boolean\n setShowInverted: (showInverted: boolean) => void\n}\n\nexport default function TradePrice({ price, showInverted, setShowInverted }: TradePriceProps) {\n const formattedPrice = showInverted ? price?.toSignificant(6) : price?.invert()?.toSignificant(6)\n\n const show = Boolean(price?.baseCurrency && price?.quoteCurrency)\n const label = showInverted\n ? `${price?.quoteCurrency?.symbol} per ${price?.baseCurrency?.symbol}`\n : `${price?.baseCurrency?.symbol} per ${price?.quoteCurrency?.symbol}`\n\n return (\n \n {show ? (\n <>\n {formattedPrice ?? '-'} {label}\n setShowInverted(!showInverted)}>\n \n \n \n ) : (\n '-'\n )}\n \n )\n}\n","import { Token } from '@doublemoondev/sdk'\nimport { transparentize } from 'polished'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport React, { useCallback, useMemo, useState } from 'react'\nimport styled from 'styled-components'\nimport { AlertTriangle } from 'react-feather'\nimport useI18n from 'hooks/useI18n'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAllTokens } from '../../hooks/Tokens'\nimport { getBscScanLink, shortenAddress } from '../../utils'\nimport { ExternalLink } from '../Shared'\nimport CurrencyLogo from '../CurrencyLogo'\nimport Modal from '../Modal'\nimport { AutoRow, RowBetween } from '../Row'\nimport { AutoColumn } from '../Column'\n\nconst Wrapper = styled.div<{ error: boolean }>`\n background: ${({ theme }) => transparentize(0.6, theme.colors.tertiary)};\n padding: 0.75rem;\n border-radius: 20px;\n`\n\nconst WarningContainer = styled.div`\n max-width: 420px;\n width: 100%;\n padding: 1rem;\n background: rgba(242, 150, 2, 0.05);\n border: 1px solid #f3841e;\n border-radius: 20px;\n overflow: auto;\n`\n\nconst StyledWarningIcon = styled(AlertTriangle)`\n stroke: ${({ theme }) => theme.colors.failure};\n`\n\ninterface TokenWarningCardProps {\n token?: Token\n}\n\nfunction TokenWarningCard({ token }: TokenWarningCardProps) {\n const { chainId } = useActiveWeb3React()\n const TranslateString = useI18n()\n const tokenSymbol = token?.symbol?.toLowerCase() ?? ''\n const tokenName = token?.name?.toLowerCase() ?? ''\n\n const allTokens = useAllTokens()\n\n const duplicateNameOrSymbol = useMemo(() => {\n if (!token || !chainId) return false\n\n return Object.keys(allTokens).some((tokenAddress) => {\n const userToken = allTokens[tokenAddress]\n if (userToken.equals(token)) {\n return false\n }\n return userToken.symbol?.toLowerCase() === tokenSymbol || userToken.name?.toLowerCase() === tokenName\n })\n }, [token, chainId, allTokens, tokenSymbol, tokenName])\n\n if (!token) return null\n\n return (\n \n \n \n \n
\n
\n \n \n {token && token.name && token.symbol && token.name !== token.symbol\n ? `${token.name} (${token.symbol})`\n : token.name || token.symbol}{' '}\n \n {chainId && (\n \n \n {shortenAddress(token.address)} {TranslateString(116, '(View on BscScan)')}\n \n \n )}\n \n
\n
\n )\n}\n\nexport default function TokenWarningModal({\n isOpen,\n tokens,\n onConfirm,\n}: {\n isOpen: boolean\n tokens: Token[]\n onConfirm: () => void\n}) {\n const [understandChecked, setUnderstandChecked] = useState(false)\n const toggleUnderstand = useCallback(() => setUnderstandChecked((uc) => !uc), [])\n const TranslateString = useI18n()\n\n const handleDismiss = useCallback(() => null, [])\n return (\n \n \n \n \n \n {TranslateString(1128, 'Token imported')}\n \n \n {TranslateString(\n 1130,\n 'Anyone can create a BEP20 token on BSC with any name, including creating fake versions of existing tokens and tokens that claim to represent projects that do not have a token.'\n )}\n \n \n {TranslateString(\n 1132,\n 'This interface can load arbitrary tokens by token addresses. Please take extra caution and do your research when interacting with arbitrary BEP20 tokens.'\n )}\n \n {TranslateString(1134, 'If you purchase an arbitrary token, you may be unable to sell it back.')}\n {tokens.map((token) => {\n return \n })}\n \n
\n \n
\n {\n onConfirm()\n }}\n >\n {TranslateString(150, 'Continue')}\n \n
\n
\n
\n
\n )\n}\n","import React, { useCallback, useState } from 'react'\nimport styled from 'styled-components'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport { AlertTriangle } from 'react-feather'\nimport Modal from '../Modal'\nimport { AutoRow, RowBetween } from '../Row'\nimport { AutoColumn } from '../Column'\n\nconst WarningContainer = styled.div`\n max-width: 420px;\n width: 100%;\n padding: 1rem;\n background: rgba(242, 150, 2, 0.05);\n border: 1px solid #f3841e;\n border-radius: 20px;\n overflow: auto;\n`\n\nconst StyledWarningIcon = styled(AlertTriangle)`\n stroke: ${({ theme }) => theme.colors.failure};\n`\n\nexport default function SyrupWarningModal({\n isOpen,\n transactionType,\n onConfirm,\n}: {\n isOpen: boolean\n transactionType: string | null\n onConfirm: () => void\n}) {\n const [understandChecked, setUnderstandChecked] = useState(false)\n const toggleUnderstand = useCallback(() => setUnderstandChecked((uc) => !uc), [])\n\n const handleDismiss = useCallback(() => null, [])\n return (\n \n \n \n \n \n Syrup Warning\n \n {transactionType !== '' && (\n <>\n \n Please be careful when {transactionType} SYRUP.\n \n \n {transactionType === 'Buying'\n ? 'You will not receive CAKE rewards for holding purchased SYRUP.'\n : 'You will need to buy back the same amount of SYRUP to be able to convert back to CAKE.'}\n \n \n )}\n \n
\n \n
\n {\n setUnderstandChecked(false)\n onConfirm()\n }}\n >\n Continue\n \n
\n
\n
\n
\n )\n}\n","import React, { useCallback, useState } from 'react'\nimport styled from 'styled-components'\nimport { Button, Text } from '@doublemoondev/doublemoon-uikit'\nimport { AlertTriangle } from 'react-feather'\nimport Modal from '../Modal'\nimport { AutoRow, RowBetween } from '../Row'\nimport { AutoColumn } from '../Column'\n\nconst WarningContainer = styled.div`\n max-width: 420px;\n width: 100%;\n padding: 1rem;\n background: rgba(242, 150, 2, 0.05);\n border: 1px solid #f3841e;\n border-radius: 20px;\n overflow: auto;\n`\n\nconst StyledWarningIcon = styled(AlertTriangle)`\n stroke: ${({ theme }) => theme.colors.binance};\n`\n\nexport default function SafeMoonWarningModal({ isOpen, onConfirm }: { isOpen: boolean; onConfirm: () => void }) {\n const [understandChecked, setUnderstandChecked] = useState(false)\n const toggleUnderstand = useCallback(() => setUnderstandChecked((uc) => !uc), [])\n\n const handleDismiss = useCallback(() => null, [])\n return (\n \n \n \n \n \n Notice for trading SafeMoon\n \n <>\n \n To trade SAFEMOON, you must click on the settings icon and{' '}\n set your slippage tolerance to 12%+\n \n This is because SafeMoon taxes a 10% fee on each transaction.\n • 5% fee = redistributed to all existing holders\n • 5% fee = used to add liquidity\n \n \n
\n \n
\n {\n setUnderstandChecked(false)\n onConfirm()\n }}\n >\n Continue\n \n
\n
\n
\n
\n )\n}\n","import React from 'react'\nimport styled from 'styled-components'\nimport { transparentize } from 'polished'\nimport { RowBetween } from '../Row'\nimport { AutoColumn } from '../Column'\n\nconst Wrapper = styled(AutoColumn)`\n margin-top: 1.25rem;\n`\n\nconst Grouping = styled(RowBetween)`\n width: 50%;\n`\n\nconst Circle = styled.div<{ confirmed?: boolean; disabled?: boolean }>`\n min-width: 20px;\n min-height: 20px;\n background-color: ${({ theme, confirmed, disabled }) =>\n disabled ? theme.colors.backgroundDisabled : confirmed ? theme.colors.success : theme.colors.primary};\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 8px;\n font-size: 12px;\n color: ${({ theme, confirmed, disabled }) =>\n disabled ? theme.colors.text : confirmed ? theme.colors.success : '#FFFFFF'};\n`\n\nconst CircleRow = styled.div`\n width: calc(100% - 20px);\n display: flex;\n align-items: center;\n`\n\nconst Connector = styled.div<{ prevConfirmed?: boolean }>`\n width: 100%;\n height: 2px;\n background-color: ;\n background: linear-gradient(\n 90deg,\n ${({ theme, prevConfirmed }) => transparentize(0.5, prevConfirmed ? theme.colors.success : theme.colors.primary)} 0%,\n ${({ theme, prevConfirmed }) => (prevConfirmed ? theme.colors.primary : theme.colors.backgroundDisabled)} 80%\n );\n opacity: 0.6;\n`\n\ninterface ProgressCirclesProps {\n steps: boolean[]\n}\n\n/**\n * Based on array of steps, create a step counter of circles.\n * A circle can be enabled, disabled, or confirmed. States are derived\n * from previous step.\n *\n * An extra circle is added to represent the ability to swap, add, or remove.\n * This step will never be marked as complete (because no 'txn done' state in body ui).\n *\n * @param steps array of booleans where true means step is complete\n */\nexport default function ProgressCircles({ steps }: ProgressCirclesProps) {\n return (\n \n \n {steps.map((step, i) => {\n return (\n // eslint-disable-next-line react/no-array-index-key\n \n \n {step ? '✓' : i + 1}\n \n \n \n )\n })}\n {steps.length + 1}\n \n \n )\n}\n","import { BigNumber } from '@ethersproject/bignumber'\nimport { Contract } from '@ethersproject/contracts'\nimport { JSBI, Percent, Router, SwapParameters, Trade, TradeType } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\nimport { BIPS_BASE, DEFAULT_DEADLINE_FROM_NOW, INITIAL_ALLOWED_SLIPPAGE } from '../constants'\nimport { useTransactionAdder } from '../state/transactions/hooks'\nimport { calculateGasMargin, getRouterContract, isAddress, shortenAddress } from '../utils'\nimport isZero from '../utils/isZero'\nimport { useActiveWeb3React } from './index'\nimport useENS from './useENS'\n\n enum SwapCallbackState {\n INVALID,\n LOADING,\n VALID,\n}\n\ninterface SwapCall {\n contract: Contract\n parameters: SwapParameters\n}\n\ninterface SuccessfulCall {\n call: SwapCall\n gasEstimate: BigNumber\n}\n\ninterface FailedCall {\n call: SwapCall\n error: Error\n}\n\ntype EstimatedSwapCall = SuccessfulCall | FailedCall\n\n/**\n * Returns the swap calls that can be used to make the trade\n * @param trade trade to execute\n * @param allowedSlippage user allowed slippage\n * @param deadline the deadline for the trade\n * @param recipientAddressOrName\n */\nfunction useSwapCallArguments(\n trade: Trade | undefined, // trade to execute, required\n allowedSlippage: number = INITIAL_ALLOWED_SLIPPAGE, // in bips\n deadline: number = DEFAULT_DEADLINE_FROM_NOW, // in seconds from now\n recipientAddressOrName: string | null // the ENS name or address of the recipient of the trade, or null if swap should be returned to sender\n): SwapCall[] {\n const { account, chainId, library } = useActiveWeb3React()\n\n const { address: recipientAddress } = useENS(recipientAddressOrName)\n const recipient = recipientAddressOrName === null ? account : recipientAddress\n\n return useMemo(() => {\n if (!trade || !recipient || !library || !account || !chainId) return []\n\n const contract: Contract | null = getRouterContract(chainId, library, account)\n if (!contract) {\n return []\n }\n\n const swapMethods = []\n\n swapMethods.push(\n // @ts-ignore\n Router.swapCallParameters(trade, {\n feeOnTransfer: false,\n allowedSlippage: new Percent(JSBI.BigInt(Math.floor(allowedSlippage)), BIPS_BASE),\n recipient,\n ttl: deadline,\n })\n )\n\n if (trade.tradeType === TradeType.EXACT_INPUT) {\n swapMethods.push(\n // @ts-ignore\n Router.swapCallParameters(trade, {\n feeOnTransfer: true,\n allowedSlippage: new Percent(JSBI.BigInt(Math.floor(allowedSlippage)), BIPS_BASE),\n recipient,\n ttl: deadline,\n })\n )\n }\n\n return swapMethods.map((parameters) => ({ parameters, contract }))\n }, [account, allowedSlippage, chainId, deadline, library, recipient, trade])\n}\n\n// returns a function that will execute a swap, if the parameters are all valid\n// and the user has approved the slippage adjusted input amount for the trade\nexport function useSwapCallback(\n trade: Trade | undefined, // trade to execute, required\n allowedSlippage: number = INITIAL_ALLOWED_SLIPPAGE, // in bips\n deadline: number = DEFAULT_DEADLINE_FROM_NOW, // in seconds from now\n recipientAddressOrName: string | null // the ENS name or address of the recipient of the trade, or null if swap should be returned to sender\n): { state: SwapCallbackState; callback: null | (() => Promise); error: string | null } {\n const { account, chainId, library } = useActiveWeb3React()\n\n const swapCalls = useSwapCallArguments(trade, allowedSlippage, deadline, recipientAddressOrName)\n\n const addTransaction = useTransactionAdder()\n\n const { address: recipientAddress } = useENS(recipientAddressOrName)\n const recipient = recipientAddressOrName === null ? account : recipientAddress\n\n return useMemo(() => {\n if (!trade || !library || !account || !chainId) {\n return { state: SwapCallbackState.INVALID, callback: null, error: 'Missing dependencies' }\n }\n if (!recipient) {\n if (recipientAddressOrName !== null) {\n return { state: SwapCallbackState.INVALID, callback: null, error: 'Invalid recipient' }\n }\n return { state: SwapCallbackState.LOADING, callback: null, error: null }\n }\n\n return {\n state: SwapCallbackState.VALID,\n callback: async function onSwap(): Promise {\n const estimatedCalls: EstimatedSwapCall[] = await Promise.all(\n swapCalls.map((call) => {\n const {\n parameters: { methodName, args, value },\n contract,\n } = call\n const options = !value || isZero(value) ? {} : { value }\n\n return contract.estimateGas[methodName](...args, options)\n .then((gasEstimate) => {\n return {\n call,\n gasEstimate,\n }\n })\n .catch((gasError) => {\n console.info('Gas estimate failed, trying eth_call to extract error', call)\n\n return contract.callStatic[methodName](...args, options)\n .then((result) => {\n console.info('Unexpected successful call after failed estimate gas', call, gasError, result)\n return { call, error: new Error('Unexpected issue with estimating the gas. Please try again.') }\n })\n .catch((callError) => {\n console.info('Call threw error', call, callError)\n let errorMessage: string\n switch (callError.reason) {\n case 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT':\n case 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT':\n errorMessage =\n 'This transaction will not succeed either due to price movement or fee on transfer. Try increasing your slippage tolerance.'\n break\n default:\n errorMessage = `The transaction cannot succeed due to error: ${callError.reason}. This is probably an issue with one of the tokens you are swapping.`\n }\n return { call, error: new Error(errorMessage) }\n })\n })\n })\n )\n\n // a successful estimation is a bignumber gas estimate and the next call is also a bignumber gas estimate\n const successfulEstimation = estimatedCalls.find(\n (el, ix, list): el is SuccessfulCall =>\n 'gasEstimate' in el && (ix === list.length - 1 || 'gasEstimate' in list[ix + 1])\n )\n\n if (!successfulEstimation) {\n const errorCalls = estimatedCalls.filter((call): call is FailedCall => 'error' in call)\n if (errorCalls.length > 0) throw errorCalls[errorCalls.length - 1].error\n throw new Error('Unexpected error. Please contact support: none of the calls threw an error')\n }\n\n const {\n call: {\n contract,\n parameters: { methodName, args, value },\n },\n gasEstimate,\n } = successfulEstimation\n\n return contract[methodName](...args, {\n gasLimit: calculateGasMargin(gasEstimate),\n ...(value && !isZero(value) ? { value, from: account } : { from: account }),\n })\n .then((response: any) => {\n const inputSymbol = trade.inputAmount.currency.symbol\n const outputSymbol = trade.outputAmount.currency.symbol\n const inputAmount = trade.inputAmount.toSignificant(3)\n const outputAmount = trade.outputAmount.toSignificant(3)\n\n const base = `Swap ${inputAmount} ${inputSymbol} for ${outputAmount} ${outputSymbol}`\n const withRecipient =\n recipient === account\n ? base\n : `${base} to ${\n recipientAddressOrName && isAddress(recipientAddressOrName)\n ? shortenAddress(recipientAddressOrName)\n : recipientAddressOrName\n }`\n\n addTransaction(response, {\n summary: withRecipient,\n })\n\n return response.hash\n })\n .catch((error: any) => {\n // if the user rejected the tx, pass this along\n if (error?.code === 4001) {\n throw new Error('Transaction rejected.')\n } else {\n // otherwise, the error was unexpected and we need to convey that\n console.error(`Swap failed`, error, methodName, args, value)\n throw new Error(`Swap failed: ${error.message}`)\n }\n })\n },\n error: null,\n }\n }, [trade, library, account, chainId, recipient, recipientAddressOrName, swapCalls, addTransaction])\n}\n\nexport default useSwapCallback","import { Currency, currencyEquals, ETHER, WETH } from '@doublemoondev/sdk'\nimport { useMemo } from 'react'\nimport { tryParseAmount } from '../state/swap/hooks'\nimport { useTransactionAdder } from '../state/transactions/hooks'\nimport { useCurrencyBalance } from '../state/wallet/hooks'\nimport { useActiveWeb3React } from './index'\nimport { useWETHContract } from './useContract'\n\nexport enum WrapType {\n NOT_APPLICABLE,\n WRAP,\n UNWRAP\n}\n\nconst NOT_APPLICABLE = { wrapType: WrapType.NOT_APPLICABLE }\n/**\n * Given the selected input and output currency, return a wrap callback\n * @param inputCurrency the selected input currency\n * @param outputCurrency the selected output currency\n * @param typedValue the user input value\n */\nexport default function useWrapCallback(\n inputCurrency: Currency | undefined,\n outputCurrency: Currency | undefined,\n typedValue: string | undefined\n): { wrapType: WrapType; execute?: undefined | (() => Promise); inputError?: string } {\n const { chainId, account } = useActiveWeb3React()\n const wethContract = useWETHContract()\n const balance = useCurrencyBalance(account ?? undefined, inputCurrency)\n // we can always parse the amount typed as the input currency, since wrapping is 1:1\n const inputAmount = useMemo(() => tryParseAmount(typedValue, inputCurrency), [inputCurrency, typedValue])\n const addTransaction = useTransactionAdder()\n\n return useMemo(() => {\n if (!wethContract || !chainId || !inputCurrency || !outputCurrency) return NOT_APPLICABLE\n\n const sufficientBalance = inputAmount && balance && !balance.lessThan(inputAmount)\n\n if (inputCurrency === ETHER && currencyEquals(WETH[chainId], outputCurrency)) {\n return {\n wrapType: WrapType.WRAP,\n execute:\n sufficientBalance && inputAmount\n ? async () => {\n try {\n const txReceipt = await wethContract.deposit({ value: `0x${inputAmount.raw.toString(16)}` })\n addTransaction(txReceipt, { summary: `Wrap ${inputAmount.toSignificant(6)} BNB to WBNB` })\n } catch (error) {\n console.error('Could not deposit', error)\n }\n }\n : undefined,\n inputError: sufficientBalance ? undefined : 'Insufficient BNB balance'\n }\n } if (currencyEquals(WETH[chainId], inputCurrency) && outputCurrency === ETHER) {\n return {\n wrapType: WrapType.UNWRAP,\n execute:\n sufficientBalance && inputAmount\n ? async () => {\n try {\n const txReceipt = await wethContract.withdraw(`0x${inputAmount.raw.toString(16)}`)\n addTransaction(txReceipt, { summary: `Unwrap ${inputAmount.toSignificant(6)} WBNB to BNB` })\n } catch (error) {\n console.error('Could not withdraw', error)\n }\n }\n : undefined,\n inputError: sufficientBalance ? undefined : 'Insufficient WBNB balance'\n }\n } \n return NOT_APPLICABLE\n \n }, [wethContract, chainId, inputCurrency, outputCurrency, inputAmount, balance, addTransaction])\n}\n","import { CurrencyAmount, JSBI, Token, Trade } from '@doublemoondev/sdk'\nimport React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'\nimport { ArrowDown } from 'react-feather'\nimport { CardBody, ArrowDownIcon, Button, IconButton, Text } from '@doublemoondev/doublemoon-uikit'\nimport { ThemeContext } from 'styled-components'\nimport AddressInputPanel from 'components/AddressInputPanel'\nimport Card, { GreyCard } from 'components/Card'\nimport { AutoColumn } from 'components/Column'\nimport ConfirmSwapModal from 'components/swap/ConfirmSwapModal'\nimport CurrencyInputPanel from 'components/CurrencyInputPanel'\nimport CardNav from 'components/CardNav'\nimport { AutoRow, RowBetween } from 'components/Row'\nimport AdvancedSwapDetailsDropdown from 'components/swap/AdvancedSwapDetailsDropdown'\nimport confirmPriceImpactWithoutFee from 'components/swap/confirmPriceImpactWithoutFee'\nimport { ArrowWrapper, BottomGrouping, SwapCallbackError, Wrapper } from 'components/swap/styleds'\nimport TradePrice from 'components/swap/TradePrice'\nimport TokenWarningModal from 'components/TokenWarningModal'\nimport SyrupWarningModal from 'components/SyrupWarningModal'\nimport SafeMoonWarningModal from 'components/SafeMoonWarningModal'\nimport ProgressSteps from 'components/ProgressSteps'\n\nimport { INITIAL_ALLOWED_SLIPPAGE } from 'constants/index'\nimport { useActiveWeb3React } from 'hooks'\nimport { useCurrency } from 'hooks/Tokens'\nimport { ApprovalState, useApproveCallbackFromTrade } from 'hooks/useApproveCallback'\nimport { useSwapCallback } from 'hooks/useSwapCallback'\nimport useWrapCallback, { WrapType } from 'hooks/useWrapCallback'\nimport { Field } from 'state/swap/actions'\nimport { useDefaultsFromURLSearch, useDerivedSwapInfo, useSwapActionHandlers, useSwapState } from 'state/swap/hooks'\nimport { useExpertModeManager, useUserDeadline, useUserSlippageTolerance } from 'state/user/hooks'\nimport { LinkStyledButton } from 'components/Shared'\nimport { maxAmountSpend } from 'utils/maxAmountSpend'\nimport { computeTradePriceBreakdown, warningSeverity } from 'utils/prices'\nimport Loader from 'components/Loader'\nimport useI18n from 'hooks/useI18n'\nimport PageHeader from 'components/PageHeader'\nimport ConnectWalletButton from 'components/ConnectWalletButton'\nimport AppBody from '../AppBody'\n\nconst Swap = () => {\n const loadedUrlParams = useDefaultsFromURLSearch()\n const TranslateString = useI18n()\n\n // token warning stuff\n const [loadedInputCurrency, loadedOutputCurrency] = [\n useCurrency(loadedUrlParams?.inputCurrencyId),\n useCurrency(loadedUrlParams?.outputCurrencyId),\n ]\n const [dismissTokenWarning, setDismissTokenWarning] = useState(false)\n const [transactionWarning, setTransactionWarning] = useState<{\n selectedToken: string | null\n purchaseType: string | null\n }>({\n selectedToken: null,\n purchaseType: null,\n })\n const urlLoadedTokens: Token[] = useMemo(\n () => [loadedInputCurrency, loadedOutputCurrency]?.filter((c): c is Token => c instanceof Token) ?? [],\n [loadedInputCurrency, loadedOutputCurrency]\n )\n const handleConfirmTokenWarning = useCallback(() => {\n setDismissTokenWarning(true)\n }, [])\n\n const handleConfirmWarning = () => {\n setTransactionWarning({\n selectedToken: null,\n purchaseType: null,\n })\n }\n\n const { account } = useActiveWeb3React()\n const theme = useContext(ThemeContext)\n\n const [isExpertMode] = useExpertModeManager()\n\n // get custom setting values for user\n const [deadline] = useUserDeadline()\n const [allowedSlippage] = useUserSlippageTolerance()\n\n // swap state\n const { independentField, typedValue, recipient } = useSwapState()\n const { v2Trade, currencyBalances, parsedAmount, currencies, inputError: swapInputError } = useDerivedSwapInfo()\n const { wrapType, execute: onWrap, inputError: wrapInputError } = useWrapCallback(\n currencies[Field.INPUT],\n currencies[Field.OUTPUT],\n typedValue\n )\n const showWrap: boolean = wrapType !== WrapType.NOT_APPLICABLE\n const trade = showWrap ? undefined : v2Trade\n\n const parsedAmounts = showWrap\n ? {\n [Field.INPUT]: parsedAmount,\n [Field.OUTPUT]: parsedAmount,\n }\n : {\n [Field.INPUT]: independentField === Field.INPUT ? parsedAmount : trade?.inputAmount,\n [Field.OUTPUT]: independentField === Field.OUTPUT ? parsedAmount : trade?.outputAmount,\n }\n\n const { onSwitchTokens, onCurrencySelection, onUserInput, onChangeRecipient } = useSwapActionHandlers()\n const isValid = !swapInputError\n const dependentField: Field = independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT\n\n const handleTypeInput = useCallback(\n (value: string) => {\n onUserInput(Field.INPUT, value)\n },\n [onUserInput]\n )\n const handleTypeOutput = useCallback(\n (value: string) => {\n onUserInput(Field.OUTPUT, value)\n },\n [onUserInput]\n )\n\n // modal and loading\n const [{ showConfirm, tradeToConfirm, swapErrorMessage, attemptingTxn, txHash }, setSwapState] = useState<{\n showConfirm: boolean\n tradeToConfirm: Trade | undefined\n attemptingTxn: boolean\n swapErrorMessage: string | undefined\n txHash: string | undefined\n }>({\n showConfirm: false,\n tradeToConfirm: undefined,\n attemptingTxn: false,\n swapErrorMessage: undefined,\n txHash: undefined,\n })\n\n const formattedAmounts = {\n [independentField]: typedValue,\n [dependentField]: showWrap\n ? parsedAmounts[independentField]?.toExact() ?? ''\n : parsedAmounts[dependentField]?.toSignificant(6) ?? '',\n }\n\n const route = trade?.route\n const userHasSpecifiedInputOutput = Boolean(\n currencies[Field.INPUT] && currencies[Field.OUTPUT] && parsedAmounts[independentField]?.greaterThan(JSBI.BigInt(0))\n )\n const noRoute = !route\n\n // check whether the user has approved the router on the input token\n const [approval, approveCallback] = useApproveCallbackFromTrade(trade, allowedSlippage)\n\n // check if user has gone through approval process, used to show two step buttons, reset on token change\n const [approvalSubmitted, setApprovalSubmitted] = useState(false)\n\n // mark when a user has submitted an approval, reset onTokenSelection for input field\n useEffect(() => {\n if (approval === ApprovalState.PENDING) {\n setApprovalSubmitted(true)\n }\n }, [approval, approvalSubmitted])\n\n const maxAmountInput: CurrencyAmount | undefined = maxAmountSpend(currencyBalances[Field.INPUT])\n const atMaxAmountInput = Boolean(maxAmountInput && parsedAmounts[Field.INPUT]?.equalTo(maxAmountInput))\n\n // the callback to execute the swap\n const { callback: swapCallback, error: swapCallbackError } = useSwapCallback(\n trade,\n allowedSlippage,\n deadline,\n recipient\n )\n\n const { priceImpactWithoutFee } = computeTradePriceBreakdown(trade)\n\n const handleSwap = useCallback(() => {\n if (priceImpactWithoutFee && !confirmPriceImpactWithoutFee(priceImpactWithoutFee)) {\n return\n }\n if (!swapCallback) {\n return\n }\n setSwapState((prevState) => ({ ...prevState, attemptingTxn: true, swapErrorMessage: undefined, txHash: undefined }))\n swapCallback()\n .then((hash) => {\n setSwapState((prevState) => ({\n ...prevState,\n attemptingTxn: false,\n swapErrorMessage: undefined,\n txHash: hash,\n }))\n })\n .catch((error) => {\n setSwapState((prevState) => ({\n ...prevState,\n attemptingTxn: false,\n swapErrorMessage: error.message,\n txHash: undefined,\n }))\n })\n }, [priceImpactWithoutFee, swapCallback, setSwapState])\n\n // errors\n const [showInverted, setShowInverted] = useState(false)\n\n // warnings on slippage\n const priceImpactSeverity = warningSeverity(priceImpactWithoutFee)\n\n // show approve flow when: no error on inputs, not approved or pending, or approved in current session\n // never show if price impact is above threshold in non expert mode\n const showApproveFlow =\n !swapInputError &&\n (approval === ApprovalState.NOT_APPROVED ||\n approval === ApprovalState.PENDING ||\n (approvalSubmitted && approval === ApprovalState.APPROVED)) &&\n !(priceImpactSeverity > 3 && !isExpertMode)\n\n const handleConfirmDismiss = useCallback(() => {\n setSwapState((prevState) => ({ ...prevState, showConfirm: false }))\n\n // if there was a tx hash, we want to clear the input\n if (txHash) {\n onUserInput(Field.INPUT, '')\n }\n }, [onUserInput, txHash, setSwapState])\n\n const handleAcceptChanges = useCallback(() => {\n setSwapState((prevState) => ({ ...prevState, tradeToConfirm: trade }))\n }, [trade])\n\n // This will check to see if the user has selected Syrup or SafeMoon to either buy or sell.\n // If so, they will be alerted with a warning message.\n const checkForWarning = useCallback(\n (selected: string, purchaseType: string) => {\n if (['SYRUP', 'SAFEMOON'].includes(selected)) {\n setTransactionWarning({\n selectedToken: selected,\n purchaseType,\n })\n }\n },\n [setTransactionWarning]\n )\n\n const handleInputSelect = useCallback(\n (inputCurrency) => {\n setApprovalSubmitted(false) // reset 2 step UI for approvals\n onCurrencySelection(Field.INPUT, inputCurrency)\n if (inputCurrency.symbol === 'SYRUP') {\n checkForWarning(inputCurrency.symbol, 'Selling')\n }\n if (inputCurrency.symbol === 'SAFEMOON') {\n checkForWarning(inputCurrency.symbol, 'Selling')\n }\n },\n [onCurrencySelection, setApprovalSubmitted, checkForWarning]\n )\n\n const handleMaxInput = useCallback(() => {\n if (maxAmountInput) {\n onUserInput(Field.INPUT, maxAmountInput.toExact())\n }\n }, [maxAmountInput, onUserInput])\n\n const handleOutputSelect = useCallback(\n (outputCurrency) => {\n onCurrencySelection(Field.OUTPUT, outputCurrency)\n if (outputCurrency.symbol === 'SYRUP') {\n checkForWarning(outputCurrency.symbol, 'Buying')\n }\n if (outputCurrency.symbol === 'SAFEMOON') {\n checkForWarning(outputCurrency.symbol, 'Buying')\n }\n },\n [onCurrencySelection, checkForWarning]\n )\n\n return (\n <>\n 0 && !dismissTokenWarning}\n tokens={urlLoadedTokens}\n onConfirm={handleConfirmTokenWarning}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n {\n setApprovalSubmitted(false) // reset 2 step UI for approvals\n onSwitchTokens()\n }}\n style={{ borderRadius: '50%' }}\n scale=\"sm\"\n >\n \n \n \n {recipient === null && !showWrap && isExpertMode ? (\n onChangeRecipient('')}>\n + Add a send (optional)\n \n ) : null}\n \n \n \n\n {recipient !== null && !showWrap ? (\n <>\n \n \n \n \n onChangeRecipient(null)}>\n - Remove send\n \n \n \n \n ) : null}\n\n {showWrap ? null : (\n \n \n {Boolean(trade) && (\n \n {TranslateString(1182, 'Price')}\n \n \n )}\n {allowedSlippage !== INITIAL_ALLOWED_SLIPPAGE && (\n \n {TranslateString(88, 'Slippage Tolerance')}\n {allowedSlippage / 100}%\n \n )}\n \n \n )}\n \n \n {!account ? (\n \n ) : showWrap ? (\n \n ) : noRoute && userHasSpecifiedInputOutput ? (\n \n {TranslateString(1194, 'Insufficient liquidity for this trade.')}\n \n ) : showApproveFlow ? (\n \n \n {approval === ApprovalState.PENDING ? (\n \n Approving \n \n ) : approvalSubmitted && approval === ApprovalState.APPROVED ? (\n 'Approved'\n ) : (\n `Approve ${currencies[Field.INPUT]?.symbol}`\n )}\n \n {\n if (isExpertMode) {\n handleSwap()\n } else {\n setSwapState({\n tradeToConfirm: trade,\n attemptingTxn: false,\n swapErrorMessage: undefined,\n showConfirm: true,\n txHash: undefined,\n })\n }\n }}\n style={{ width: '48%' }}\n id=\"swap-button\"\n disabled={\n !isValid || approval !== ApprovalState.APPROVED || (priceImpactSeverity > 3 && !isExpertMode)\n }\n variant={isValid && priceImpactSeverity > 2 ? 'danger' : 'primary'}\n >\n {priceImpactSeverity > 3 && !isExpertMode\n ? `Price Impact High`\n : `Swap${priceImpactSeverity > 2 ? ' Anyway' : ''}`}\n \n \n ) : (\n {\n if (isExpertMode) {\n handleSwap()\n } else {\n setSwapState({\n tradeToConfirm: trade,\n attemptingTxn: false,\n swapErrorMessage: undefined,\n showConfirm: true,\n txHash: undefined,\n })\n }\n }}\n id=\"swap-button\"\n disabled={!isValid || (priceImpactSeverity > 3 && !isExpertMode) || !!swapCallbackError}\n variant={isValid && priceImpactSeverity > 2 && !swapCallbackError ? 'danger' : 'primary'}\n width=\"100%\"\n >\n {swapInputError ||\n (priceImpactSeverity > 3 && !isExpertMode\n ? `Price Impact Too High`\n : `Swap${priceImpactSeverity > 2 ? ' Anyway' : ''}`)}\n \n )}\n {showApproveFlow && }\n {isExpertMode && swapErrorMessage ? : null}\n \n \n \n \n \n \n )\n}\n\nexport default Swap\n","import { Percent } from '@doublemoondev/sdk'\nimport { ALLOWED_PRICE_IMPACT_HIGH, PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN } from '../../constants'\n\n/**\n * Given the price impact, get user confirmation.\n *\n * @param priceImpactWithoutFee price impact of the trade without the fee.\n */\nexport default function confirmPriceImpactWithoutFee(priceImpactWithoutFee: Percent): boolean {\n if (!priceImpactWithoutFee.lessThan(PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN)) {\n return (\n window.prompt(\n `This swap has a price impact of at least ${PRICE_IMPACT_WITHOUT_FEE_CONFIRM_MIN.toFixed(\n 0\n )}%. Please type the word \"confirm\" to continue with this swap.`\n ) === 'confirm'\n )\n } if (!priceImpactWithoutFee.lessThan(ALLOWED_PRICE_IMPACT_HIGH)) {\n return window.confirm(\n `This swap has a price impact of at least ${ALLOWED_PRICE_IMPACT_HIGH.toFixed(\n 0\n )}%. Please confirm that you would like to continue with this swap.`\n )\n }\n return true\n}\n","import React from 'react'\nimport { Redirect, RouteComponentProps } from 'react-router-dom'\n\n// Redirects to swap but only replace the pathname\nexport function RedirectPathToSwapOnly({ location }: RouteComponentProps) {\n return \n}\n\nexport default RedirectPathToSwapOnly\n","export const EN = { code: 'en', language: 'English' }\nexport const AR = { code: 'ar', language: 'العربية' }\nexport const BN = { code: 'bn', language: 'বাংলা'}\nexport const ZHCN = { code: 'zh-CN', language: '简体中文' }\nexport const ZHTW = { code: 'zh-TW', language: '繁體中文' }\nexport const NL = { code: 'nl', language: 'Nederlands' }\nexport const FIL = { code: 'fil', language: 'Filipino' }\nexport const FI = { code: 'fi', language: 'Suomalainen' }\nexport const FR = { code: 'fr', language: 'Français' }\nexport const DE = { code: 'de', language: 'Deutsch' }\nexport const EL = { code: 'el', language: 'Ελληνικά' }\nexport const HI = { code: 'hi', language: 'हिंदी' }\nexport const HU = { code: 'hu', language: 'Magyar' }\nexport const ID = { code: 'id', language: 'Bahasa Indonesia' }\nexport const IT = { code: 'it', language: 'Italiano' }\nexport const JA = { code: 'ja', language: '日本語' }\nexport const KO = { code: 'ko', language: '한국어' }\nexport const PL = { code: 'pl', language: 'Polski' }\nexport const PTPT = { code: 'pt-PT', language: 'Português (Portugal)' }\nexport const PTBR = { code: 'pt-BR', language: 'Português (Brasil)' }\nexport const RO = { code: 'ro', language: 'Română' }\nexport const RU = { code: 'ru', language: 'Русский' }\nexport const ESES = { code: 'es-ES', language: 'Español' }\nexport const SVSE = { code: 'sv-SE', language: 'Svenska' }\nexport const TA = { code: 'ta', language: 'தமிழ்' }\nexport const TR = { code: 'tr', language: 'Türkçe' }\nexport const UK = { code: 'uk', language: 'Українська' }\nexport const VI = { code: 'vi', language: 'Tiếng Việt' }\n\nexport const allLanguages = [\n EN,\n AR,\n BN,\n ZHCN,\n ZHTW,\n NL,\n FIL,\n FI,\n FR,\n DE,\n EL,\n HI,\n HU,\n ID,\n IT,\n JA,\n KO,\n PL,\n PTPT,\n PTBR,\n RO,\n RU,\n ESES,\n SVSE,\n TA,\n TR,\n UK,\n VI\n]\n","import React, { createContext } from 'react'\nimport { LangType } from '@doublemoondev/doublemoon-uikit'\n\nexport interface LanguageObject {\n code: string\n language: string\n}\ninterface LanguageState {\n selectedLanguage: LanguageObject\n setSelectedLanguage: (langObject: LangType) => void\n translatedLanguage: LanguageObject\n setTranslatedLanguage: React.Dispatch>\n}\n\nconst defaultLanguageState: LanguageState = {\n selectedLanguage: { code: '', language: '' },\n setSelectedLanguage: (): void => undefined,\n translatedLanguage: { code: '', language: '' },\n setTranslatedLanguage: (): void => undefined,\n}\n\nexport const LanguageContext = createContext(defaultLanguageState as LanguageState)\n","import React, { useState } from 'react'\nimport { ThemeProvider as SCThemeProvider } from 'styled-components'\nimport { light, dark } from '@doublemoondev/doublemoon-uikit'\n\nconst CACHE_KEY = 'IS_DARK'\n\nexport interface ThemeContextType {\n isDark: boolean;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = React.createContext({ isDark: false, toggleTheme: () => null })\n\nconst ThemeContextProvider: React.FC = ({ children }) => {\n const [isDark, setIsDark] = useState(() => {\n const isDarkUserSetting = localStorage.getItem(CACHE_KEY)\n return isDarkUserSetting ? JSON.parse(isDarkUserSetting) : false\n })\n\n const toggleTheme = () => {\n setIsDark((prevState: any) => {\n localStorage.setItem(CACHE_KEY, JSON.stringify(!prevState))\n return !prevState\n })\n }\n\n return (\n \n {children}\n \n )\n}\n\nexport { ThemeContext, ThemeContextProvider }\n","import { useContext } from 'react'\nimport { ThemeContext as StyledThemeCopntext } from 'styled-components'\nimport { ThemeContext } from '../ThemeContext'\n\nconst useTheme = () => {\n const { isDark, toggleTheme } = useContext(ThemeContext)\n const theme = useContext(StyledThemeCopntext)\n return { isDark, toggleTheme, theme }\n}\n\nexport default useTheme\n","import { useEffect, useState } from 'react'\nimport Cookies from 'js-cookie'\nimport { useActiveWeb3React } from 'hooks'\n\nconst initialState = {\n profileLink: 'https://pancakeswap.finance/profile',\n noProfileLink: 'https://pancakeswap.finance/profile',\n}\n\n/**\n * Note - this will only work if the app is on the same domain\n */\nconst useGetLocalProfile = () => {\n const [profile, setProfile] = useState(initialState)\n const { account } = useActiveWeb3React()\n\n useEffect(() => {\n if (account) {\n try {\n const localData = Cookies.get(`profile_${account}`)\n\n if (localData) {\n const localProfile = JSON.parse(localData)\n\n setProfile((prevProfile) => ({\n ...prevProfile,\n username: localProfile.username,\n image: localProfile.avatar,\n }))\n }\n } catch (error) {\n setProfile(initialState)\n }\n } else {\n setProfile(initialState)\n }\n }, [account, setProfile])\n\n return profile\n}\n\nexport default useGetLocalProfile\n","import { MenuEntry, menuStatus } from '@doublemoondev/doublemoon-uikit'\n\nconst config: MenuEntry[] = [\n {\n label: \"Buy DBM\",\n icon: \"TradeIcon\",\n href: \"/swap\",\n },\n {\n label: \"Moon Lucky\",\n icon: \"TicketIcon\",\n href: \"https://app.doublemoon.finance/moon-lucky\",\n },\n {\n label: \"Moon Farms\",\n icon: \"FarmIcon\",\n href: \"https://app.doublemoon.finance/farms\",\n },\n {\n label: \"Moon Solo\",\n icon: 'SoloIcon',\n href: 'https://app.doublemoon.finance/pools',\n },\n {\n label: \"Moon Vaults\",\n icon: 'VaultIcon',\n href: 'https://app.doublemoon.finance/vaults',\n status: menuStatus.NEW,\n },\n {\n label: \"Moon Referral\",\n icon: \"ReferralIcon\",\n href: \"https://app.doublemoon.finance/referral\",\n },\n {\n label: \"Charts\",\n icon: \"ChartIcon\",\n items: [\n {\n label: \"DBM\",\n href: \"https://dex.guru/token/0x0314e5a39806c30d67b869ee1bcdabee7e08de74-bsc\",\n },\n {\n label: \"DMC\",\n href: \"https://dex.guru/token/0xa7bd090bc58e663388be63d5e8a7b683f5a3d4fc-bsc\",\n },\n ],\n },\n {\n label: \"Document\",\n icon: \"DocumentIcon\",\n href: \"https://whitepaper.doublemoon.finance/\",\n },\n]\n\nexport default config\n","import React, { useContext } from 'react'\nimport { Menu as UikitMenu} from '@doublemoondev/doublemoon-uikit'\nimport { useWeb3React } from '@web3-react/core'\nimport { allLanguages } from 'constants/localisation/languageCodes'\nimport { LanguageContext } from 'hooks/LanguageContext'\nimport useTheme from 'hooks/useTheme'\n// import useGetPriceData from 'hooks/useGetPriceData'\nimport useGetLocalProfile from 'hooks/useGetLocalProfile'\nimport useAuth from 'hooks/useAuth'\nimport links from './config'\nimport { CAKE } from '../../constants'\n\nconst Menu: React.FC = (props) => {\n const { account } = useWeb3React()\n const { login, logout } = useAuth()\n const { selectedLanguage, setSelectedLanguage } = useContext(LanguageContext)\n const { isDark, toggleTheme } = useTheme()\n // const priceData = useGetPriceData()\n const cakePriceUsd = undefined\n const profile = useGetLocalProfile()\n\n return (\n \n )\n}\n\nexport default Menu\n","import { useEffect } from 'react'\n\nconst useGetDocumentTitlePrice = () => {\n useEffect(() => {\n document.title = `DoubleMoon`\n })\n}\nexport default useGetDocumentTitlePrice\n","import React, { Suspense, useEffect, useState } from 'react'\nimport { HashRouter, Route, Switch } from 'react-router-dom'\nimport styled from 'styled-components'\nimport { Credentials, StringTranslations } from '@crowdin/crowdin-api-client'\nimport { LangType } from '@doublemoondev/doublemoon-uikit'\nimport Popups from '../components/Popups'\nimport Web3ReactManager from '../components/Web3ReactManager'\nimport { RedirectDuplicateTokenIds, RedirectOldAddLiquidityPathStructure } from './AddLiquidity/redirects'\nimport { RedirectOldRemoveLiquidityPathStructure } from './RemoveLiquidity/redirects'\nimport AddLiquidity from './AddLiquidity'\nimport Pool from './Pool'\nimport PoolFinder from './PoolFinder'\nimport RemoveLiquidity from './RemoveLiquidity'\nimport Swap from './Swap'\nimport { RedirectPathToSwapOnly } from './Swap/redirects'\nimport { EN, allLanguages } from '../constants/localisation/languageCodes'\nimport { LanguageContext } from '../hooks/LanguageContext'\nimport { TranslationsContext } from '../hooks/TranslationsContext'\n\nimport Menu from '../components/Menu'\nimport useGetDocumentTitlePrice from '../hooks/useGetDocumentTitlePrice'\n\nconst AppWrapper = styled.div`\n display: flex;\n flex-flow: column;\n align-items: flex-start;\n overflow-x: hidden;\n`\n\nconst BodyWrapper = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: 32px 16px;\n align-items: center;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n z-index: 1;\n justify-content: center;\n\n ${({ theme }) => theme.mediaQueries.xs} {\n background-size: auto;\n }\n`\n\nconst Marginer = styled.div`\n margin-top: 5rem;\n`\n\nconst CACHE_KEY = 'DoubleMoonSwapLanguage'\n\nexport default function App() {\n const [selectedLanguage, setSelectedLanguage] = useState(undefined)\n const [translatedLanguage, setTranslatedLanguage] = useState(undefined)\n const [translations, setTranslations] = useState>([])\n const apiKey = `${process.env.REACT_APP_CROWDIN_APIKEY}`\n const projectId = parseInt(`${process.env.REACT_APP_CROWDIN_PROJECTID}`)\n const fileId = 6\n\n const credentials: Credentials = {\n token: apiKey,\n }\n\n const stringTranslationsApi = new StringTranslations(credentials)\n\n const getStoredLang = (storedLangCode: string) => {\n return allLanguages.filter((language) => {\n return language.code === storedLangCode\n })[0]\n }\n\n useEffect(() => {\n const storedLangCode = localStorage.getItem(CACHE_KEY)\n if (storedLangCode) {\n const storedLang = getStoredLang(storedLangCode)\n setSelectedLanguage(storedLang)\n } else {\n setSelectedLanguage(EN)\n }\n }, [])\n\n const fetchTranslationsForSelectedLanguage = async () => {\n stringTranslationsApi\n .listLanguageTranslations(projectId, selectedLanguage.code, undefined, fileId, 200)\n .then((translationApiResponse) => {\n if (translationApiResponse.data.length < 1) {\n setTranslations(['error'])\n } else {\n setTranslations(translationApiResponse.data)\n }\n })\n .then(() => setTranslatedLanguage(selectedLanguage))\n .catch((error) => {\n setTranslations(['error'])\n console.error(error)\n })\n }\n\n useEffect(() => {\n if (selectedLanguage) {\n fetchTranslationsForSelectedLanguage()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedLanguage])\n\n const handleLanguageSelect = (langObject: LangType) => {\n setSelectedLanguage(langObject)\n localStorage.setItem(CACHE_KEY, langObject.code)\n }\n\n useGetDocumentTitlePrice()\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n {/* Redirection: These old routes are still used in the code base */}\n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n )\n}\n","import { useCallback, useEffect, useState } from 'react'\n\nconst VISIBILITY_STATE_SUPPORTED = 'visibilityState' in document\n\nfunction isWindowVisible() {\n return !VISIBILITY_STATE_SUPPORTED || document.visibilityState !== 'hidden'\n}\n\n/**\n * Returns whether the window is currently visible to the user.\n */\nexport default function useIsWindowVisible(): boolean {\n const [focused, setFocused] = useState(isWindowVisible())\n const listener = useCallback(() => {\n setFocused(isWindowVisible())\n }, [setFocused])\n\n useEffect(() => {\n if (!VISIBILITY_STATE_SUPPORTED) return undefined\n\n document.addEventListener('visibilitychange', listener)\n return () => {\n document.removeEventListener('visibilitychange', listener)\n }\n }, [listener])\n\n return focused\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport useDebounce from '../../hooks/useDebounce'\nimport useIsWindowVisible from '../../hooks/useIsWindowVisible'\nimport { updateBlockNumber } from './actions'\n\nexport default function Updater(): null {\n const { library, chainId } = useActiveWeb3React()\n const dispatch = useDispatch()\n\n const windowVisible = useIsWindowVisible()\n\n const [state, setState] = useState<{ chainId: number | undefined; blockNumber: number | null }>({\n chainId,\n blockNumber: null,\n })\n\n const blockNumberCallback = useCallback(\n (blockNumber: number) => {\n setState((s) => {\n if (chainId === s.chainId) {\n if (typeof s.blockNumber !== 'number') return { chainId, blockNumber }\n return { chainId, blockNumber: Math.max(blockNumber, s.blockNumber) }\n }\n return s\n })\n },\n [chainId, setState]\n )\n\n // attach/detach listeners\n useEffect(() => {\n if (!library || !chainId || !windowVisible) return undefined\n\n setState({ chainId, blockNumber: null })\n\n library\n .getBlockNumber()\n .then(blockNumberCallback)\n .catch((error) => console.error(`Failed to get block number for chainId: ${chainId}`, error))\n\n library.on('block', blockNumberCallback)\n return () => {\n library.removeListener('block', blockNumberCallback)\n }\n }, [dispatch, chainId, library, blockNumberCallback, windowVisible])\n\n const debouncedState = useDebounce(state, 100)\n\n useEffect(() => {\n if (!debouncedState.chainId || !debouncedState.blockNumber || !windowVisible) return\n dispatch(updateBlockNumber({ chainId: debouncedState.chainId, blockNumber: debouncedState.blockNumber }))\n }, [windowVisible, dispatch, debouncedState.blockNumber, debouncedState.chainId])\n\n return null\n}\n","import { getVersionUpgrade, minVersionBump, VersionUpgrade } from '@uniswap/token-lists'\nimport { useCallback, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useFetchListCallback } from '../../hooks/useFetchListCallback'\nimport useInterval from '../../hooks/useInterval'\nimport useIsWindowVisible from '../../hooks/useIsWindowVisible'\nimport { addPopup } from '../application/actions'\nimport { AppDispatch, AppState } from '../index'\nimport { acceptListUpdate } from './actions'\n\nexport default function Updater(): null {\n const { library } = useActiveWeb3React()\n const dispatch = useDispatch()\n const lists = useSelector((state) => state.lists.byUrl)\n\n const isWindowVisible = useIsWindowVisible()\n\n const fetchList = useFetchListCallback()\n\n const fetchAllListsCallback = useCallback(() => {\n if (!isWindowVisible) return\n Object.keys(lists).forEach((url) =>\n fetchList(url).catch((error) => console.error('interval list fetching error', error))\n )\n }, [fetchList, isWindowVisible, lists])\n\n // fetch all lists every 10 minutes, but only after we initialize library\n useInterval(fetchAllListsCallback, library ? 1000 * 60 * 10 : null)\n\n // whenever a list is not loaded and not loading, try again to load it\n useEffect(() => {\n Object.keys(lists).forEach((listUrl) => {\n const list = lists[listUrl]\n\n if (!list.current && !list.loadingRequestId && !list.error) {\n fetchList(listUrl).catch((error) => console.error('list added fetching error', error))\n }\n })\n }, [dispatch, fetchList, library, lists])\n\n // automatically update lists if versions are minor/patch\n useEffect(() => {\n Object.keys(lists).forEach((listUrl) => {\n const list = lists[listUrl]\n if (list.current && list.pendingUpdate) {\n const bump = getVersionUpgrade(list.current.version, list.pendingUpdate.version)\n switch (bump) {\n case VersionUpgrade.NONE:\n throw new Error('unexpected no version bump')\n case VersionUpgrade.PATCH:\n case VersionUpgrade.MINOR:\n const min = minVersionBump(list.current.tokens, list.pendingUpdate.tokens)\n // automatically update minor/patch as long as bump matches the min update\n if (bump >= min) {\n dispatch(acceptListUpdate(listUrl))\n dispatch(\n addPopup({\n key: listUrl,\n content: {\n listUpdate: {\n listUrl,\n oldList: list.current,\n newList: list.pendingUpdate,\n auto: true,\n },\n },\n })\n )\n } else {\n console.error(\n `List at url ${listUrl} could not automatically update because the version bump was only PATCH/MINOR while the update had breaking changes and should have been MAJOR`\n )\n }\n break\n\n case VersionUpgrade.MAJOR:\n dispatch(\n addPopup({\n key: listUrl,\n content: {\n listUpdate: {\n listUrl,\n auto: false,\n oldList: list.current,\n newList: list.pendingUpdate,\n },\n },\n removeAfterMs: null,\n })\n )\n }\n }\n })\n }, [dispatch, lists])\n\n return null\n}\n","function wait(ms: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction waitRandom(min: number, max: number): Promise {\n return wait(min + Math.round(Math.random() * Math.max(0, max - min)))\n}\n\n/**\n * This error is thrown if the function is cancelled before completing\n */\nexport class CancelledError extends Error {\n constructor() {\n super('Cancelled')\n }\n}\n\n/**\n * Throw this error if the function should retry\n */\nexport class RetryableError extends Error {}\n\n/**\n * Retries the function that returns the promise until the promise successfully resolves up to n retries\n * @param fn function to retry\n * @param n how many times to retry\n * @param minWait min wait between retries in ms\n * @param maxWait max wait between retries in ms\n */\nexport function retry(\n fn: () => Promise,\n { n, minWait, maxWait }: { n: number; minWait: number; maxWait: number }\n): { promise: Promise; cancel: () => void } {\n let completed = false\n let rejectCancelled: (error: Error) => void\n // eslint-disable-next-line no-async-promise-executor\n const promise = new Promise(async (resolve, reject) => {\n rejectCancelled = reject\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let result: T\n try {\n result = await fn()\n if (!completed) {\n resolve(result)\n completed = true\n }\n break\n } catch (error) {\n if (completed) {\n break\n }\n if (n <= 0 || !(error instanceof RetryableError)) {\n reject(error)\n completed = true\n break\n }\n n--\n }\n await waitRandom(minWait, maxWait)\n }\n })\n return {\n promise,\n cancel: () => {\n if (completed) return\n completed = true\n rejectCancelled(new CancelledError())\n },\n }\n}\n","import { Contract } from '@ethersproject/contracts'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useMulticallContract } from '../../hooks/useContract'\nimport useDebounce from '../../hooks/useDebounce'\nimport chunkArray from '../../utils/chunkArray'\nimport { CancelledError, retry, RetryableError } from '../../utils/retry'\nimport { useBlockNumber } from '../application/hooks'\nimport { AppDispatch, AppState } from '../index'\nimport {\n Call,\n errorFetchingMulticallResults,\n fetchingMulticallResults,\n parseCallKey,\n updateMulticallResults,\n} from './actions'\n\n// chunk calls so we do not exceed the gas limit\nconst CALL_CHUNK_SIZE = 500\n\n/**\n * Fetches a chunk of calls, enforcing a minimum block number constraint\n * @param multicallContract multicall contract to fetch against\n * @param chunk chunk of calls to make\n * @param minBlockNumber minimum block number of the result set\n */\nasync function fetchChunk(\n multicallContract: Contract,\n chunk: Call[],\n minBlockNumber: number\n): Promise<{ results: string[]; blockNumber: number }> {\n let resultsBlockNumber\n let returnData\n try {\n [resultsBlockNumber, returnData] = await multicallContract.aggregate(\n chunk.map((obj) => [obj.address, obj.callData])\n )\n } catch (error) {\n console.info('Failed to fetch chunk inside retry', error)\n throw error\n }\n if (resultsBlockNumber.toNumber() < minBlockNumber) {\n throw new RetryableError('Fetched for old block number')\n }\n return { results: returnData, blockNumber: resultsBlockNumber.toNumber() }\n}\n\n/**\n * From the current all listeners state, return each call key mapped to the\n * minimum number of blocks per fetch. This is how often each key must be fetched.\n * @param allListeners the all listeners state\n * @param chainId the current chain id\n */\nexport function activeListeningKeys(\n allListeners: AppState['multicall']['callListeners'],\n chainId?: number\n): { [callKey: string]: number } {\n if (!allListeners || !chainId) return {}\n const listeners = allListeners[chainId]\n if (!listeners) return {}\n\n return Object.keys(listeners).reduce<{ [callKey: string]: number }>((memo, callKey) => {\n const keyListeners = listeners[callKey]\n\n memo[callKey] = Object.keys(keyListeners)\n .filter((key) => {\n const blocksPerFetch = parseInt(key)\n if (blocksPerFetch <= 0) return false\n return keyListeners[blocksPerFetch] > 0\n })\n .reduce((previousMin, current) => {\n return Math.min(previousMin, parseInt(current))\n }, Infinity)\n return memo\n }, {})\n}\n\n/**\n * Return the keys that need to be refetched\n * @param callResults current call result state\n * @param listeningKeys each call key mapped to how old the data can be in blocks\n * @param chainId the current chain id\n * @param latestBlockNumber the latest block number\n */\nexport function outdatedListeningKeys(\n callResults: AppState['multicall']['callResults'],\n listeningKeys: { [callKey: string]: number },\n chainId: number | undefined,\n latestBlockNumber: number | undefined\n): string[] {\n if (!chainId || !latestBlockNumber) return []\n const results = callResults[chainId]\n // no results at all, load everything\n if (!results) return Object.keys(listeningKeys)\n\n return Object.keys(listeningKeys).filter((callKey) => {\n const blocksPerFetch = listeningKeys[callKey]\n\n const data = callResults[chainId][callKey]\n // no data, must fetch\n if (!data) return true\n\n const minDataBlockNumber = latestBlockNumber - (blocksPerFetch - 1)\n\n // already fetching it for a recent enough block, don't refetch it\n if (data.fetchingBlockNumber && data.fetchingBlockNumber >= minDataBlockNumber) return false\n\n // if data is older than minDataBlockNumber, fetch it\n return !data.blockNumber || data.blockNumber < minDataBlockNumber\n })\n}\n\nexport default function Updater(): null {\n const dispatch = useDispatch()\n const state = useSelector((s) => s.multicall)\n // wait for listeners to settle before triggering updates\n const debouncedListeners = useDebounce(state.callListeners, 100)\n const latestBlockNumber = useBlockNumber()\n const { chainId } = useActiveWeb3React()\n const multicallContract = useMulticallContract()\n const cancellations = useRef<{ blockNumber: number; cancellations: (() => void)[] }>()\n\n const listeningKeys: { [callKey: string]: number } = useMemo(() => {\n return activeListeningKeys(debouncedListeners, chainId)\n }, [debouncedListeners, chainId])\n\n const unserializedOutdatedCallKeys = useMemo(() => {\n return outdatedListeningKeys(state.callResults, listeningKeys, chainId, latestBlockNumber)\n }, [chainId, state.callResults, listeningKeys, latestBlockNumber])\n\n const serializedOutdatedCallKeys = useMemo(() => JSON.stringify(unserializedOutdatedCallKeys.sort()), [\n unserializedOutdatedCallKeys,\n ])\n\n useEffect(() => {\n if (!latestBlockNumber || !chainId || !multicallContract) return\n\n const outdatedCallKeys: string[] = JSON.parse(serializedOutdatedCallKeys)\n if (outdatedCallKeys.length === 0) return\n const calls = outdatedCallKeys.map((key) => parseCallKey(key))\n // .filter(item => item.address.toLowerCase() !== '0xBCfCcbde45cE874adCB698cC183deBcF17952812'.toLowerCase())\n\n const chunkedCalls = chunkArray(calls, CALL_CHUNK_SIZE)\n\n if (cancellations.current?.blockNumber !== latestBlockNumber) {\n cancellations.current?.cancellations?.forEach((c) => c())\n }\n\n dispatch(\n fetchingMulticallResults({\n calls,\n chainId,\n fetchingBlockNumber: latestBlockNumber,\n })\n )\n\n cancellations.current = {\n blockNumber: latestBlockNumber,\n cancellations: chunkedCalls.map((chunk, index) => {\n const { cancel, promise } = retry(() => fetchChunk(multicallContract, chunk, latestBlockNumber), {\n n: Infinity,\n minWait: 2500,\n maxWait: 3500,\n })\n promise\n .then(({ results: returnData, blockNumber: fetchBlockNumber }) => {\n cancellations.current = { cancellations: [], blockNumber: latestBlockNumber }\n\n // accumulates the length of all previous indices\n const firstCallKeyIndex = chunkedCalls.slice(0, index).reduce((memo, curr) => memo + curr.length, 0)\n const lastCallKeyIndex = firstCallKeyIndex + returnData.length\n\n dispatch(\n updateMulticallResults({\n chainId,\n results: outdatedCallKeys\n .slice(firstCallKeyIndex, lastCallKeyIndex)\n .reduce<{ [callKey: string]: string | null }>((memo, callKey, i) => {\n memo[callKey] = returnData[i] ?? null\n return memo\n }, {}),\n blockNumber: fetchBlockNumber,\n })\n )\n })\n .catch((error: any) => {\n if (error instanceof CancelledError) {\n console.error('Cancelled fetch for blockNumber', latestBlockNumber)\n return\n }\n console.error('Failed to fetch multicall chunk', chunk, chainId, error)\n dispatch(\n errorFetchingMulticallResults({\n calls: chunk,\n chainId,\n fetchingBlockNumber: latestBlockNumber,\n })\n )\n })\n return cancel\n }),\n }\n }, [chainId, multicallContract, dispatch, serializedOutdatedCallKeys, latestBlockNumber])\n\n return null\n}\n","// chunks array into chunks of maximum size\n// evenly distributes items among the chunks\nexport default function chunkArray(items: T[], maxChunkSize: number): T[][] {\n if (maxChunkSize < 1) throw new Error('maxChunkSize must be gte 1')\n if (items.length <= maxChunkSize) return [items]\n\n const numChunks: number = Math.ceil(items.length / maxChunkSize)\n const chunkSize = Math.ceil(items.length / numChunks)\n\n return [...Array(numChunks).keys()].map(ix => items.slice(ix * chunkSize, ix * chunkSize + chunkSize))\n}\n","import { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useActiveWeb3React } from '../../hooks'\nimport { useAddPopup, useBlockNumber } from '../application/hooks'\nimport { AppDispatch, AppState } from '../index'\nimport { checkedTransaction, finalizeTransaction } from './actions'\n\nexport function shouldCheck(\n lastBlockNumber: number,\n tx: { addedTime: number; receipt?: any; lastCheckedBlockNumber?: number }\n): boolean {\n if (tx.receipt) return false\n if (!tx.lastCheckedBlockNumber) return true\n const blocksSinceCheck = lastBlockNumber - tx.lastCheckedBlockNumber\n if (blocksSinceCheck < 1) return false\n const minutesPending = (new Date().getTime() - tx.addedTime) / 1000 / 60\n if (minutesPending > 60) {\n // every 10 blocks if pending for longer than an hour\n return blocksSinceCheck > 9\n }\n if (minutesPending > 5) {\n // every 3 blocks if pending more than 5 minutes\n return blocksSinceCheck > 2\n }\n // otherwise every block\n return true\n}\n\nexport default function Updater(): null {\n const { chainId, library } = useActiveWeb3React()\n\n const lastBlockNumber = useBlockNumber()\n\n const dispatch = useDispatch()\n const state = useSelector((s) => s.transactions)\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const transactions = chainId ? state[chainId] ?? {} : {}\n\n // show popup on confirm\n const addPopup = useAddPopup()\n\n useEffect(() => {\n if (!chainId || !library || !lastBlockNumber) return\n\n Object.keys(transactions)\n .filter((hash) => shouldCheck(lastBlockNumber, transactions[hash]))\n .forEach((hash) => {\n library\n .getTransactionReceipt(hash)\n .then((receipt) => {\n if (receipt) {\n dispatch(\n finalizeTransaction({\n chainId,\n hash,\n receipt: {\n blockHash: receipt.blockHash,\n blockNumber: receipt.blockNumber,\n contractAddress: receipt.contractAddress,\n from: receipt.from,\n status: receipt.status,\n to: receipt.to,\n transactionHash: receipt.transactionHash,\n transactionIndex: receipt.transactionIndex,\n },\n })\n )\n\n addPopup(\n {\n txn: {\n hash,\n success: receipt.status === 1,\n summary: transactions[hash]?.summary,\n },\n },\n hash\n )\n } else {\n dispatch(checkedTransaction({ chainId, hash, blockNumber: lastBlockNumber }))\n }\n })\n .catch((error) => {\n console.error(`failed to check transaction hash: ${hash}`, error)\n })\n })\n }, [chainId, library, transactions, lastBlockNumber, dispatch, addPopup])\n\n return null\n}\n","import React from 'react'\nimport { useSelector } from 'react-redux'\nimport { ToastContainer, Toast } from '@doublemoondev/doublemoon-uikit'\nimport useToast from 'hooks/useToast'\nimport { AppState } from '../../state'\n\nconst ToastListener = () => {\n const toasts: Toast[] = useSelector((state: AppState) => state.toasts.data)\n const { remove } = useToast()\n\n const handleRemove = (id: string) => remove(id)\n\n return \n}\n\nexport default ToastListener\n","import { createReducer, nanoid } from '@reduxjs/toolkit'\nimport {\n addPopup,\n PopupContent,\n removePopup,\n toggleWalletModal,\n toggleSettingsMenu,\n updateBlockNumber\n} from './actions'\n\ntype PopupList = Array<{ key: string; show: boolean; content: PopupContent; removeAfterMs: number | null }>\n\nexport interface ApplicationState {\n blockNumber: { [chainId: number]: number }\n popupList: PopupList\n walletModalOpen: boolean\n settingsMenuOpen: boolean\n}\n\nconst initialState: ApplicationState = {\n blockNumber: {},\n popupList: [],\n walletModalOpen: false,\n settingsMenuOpen: false\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(updateBlockNumber, (state, action) => {\n const { chainId, blockNumber } = action.payload\n if (typeof state.blockNumber[chainId] !== 'number') {\n state.blockNumber[chainId] = blockNumber\n } else {\n state.blockNumber[chainId] = Math.max(blockNumber, state.blockNumber[chainId])\n }\n })\n .addCase(toggleWalletModal, state => {\n state.walletModalOpen = !state.walletModalOpen\n })\n .addCase(toggleSettingsMenu, state => {\n state.settingsMenuOpen = !state.settingsMenuOpen\n })\n .addCase(addPopup, (state, { payload: { content, key, removeAfterMs = 15000 } }) => {\n state.popupList = (key ? state.popupList.filter(popup => popup.key !== key) : state.popupList).concat([\n {\n key: key || nanoid(),\n show: true,\n content,\n removeAfterMs\n }\n ])\n })\n .addCase(removePopup, (state, { payload: { key } }) => {\n state.popupList.forEach(p => {\n if (p.key === key) {\n p.show = false\n }\n })\n })\n)\n","import { createAction } from '@reduxjs/toolkit'\n\n// fired once when the app reloads but before the app renders\n// allows any updates to be applied to store data loaded from localStorage\nexport const updateVersion = createAction('global/updateVersion')\n\nexport default createAction\n","import { createReducer } from '@reduxjs/toolkit'\nimport { INITIAL_ALLOWED_SLIPPAGE, DEFAULT_DEADLINE_FROM_NOW } from '../../constants'\nimport { updateVersion } from '../global/actions'\nimport {\n addSerializedPair,\n addSerializedToken,\n removeSerializedPair,\n removeSerializedToken,\n SerializedPair,\n SerializedToken,\n updateMatchesDarkMode,\n updateUserDarkMode,\n updateUserExpertMode,\n updateUserSlippageTolerance,\n updateUserDeadline,\n muteAudio,\n unmuteAudio\n} from './actions'\n\nconst currentTimestamp = () => new Date().getTime()\n\nexport interface UserState {\n // the timestamp of the last updateVersion action\n lastUpdateVersionTimestamp?: number\n\n userDarkMode: boolean | null // the user's choice for dark mode or light mode\n matchesDarkMode: boolean // whether the dark mode media query matches\n\n userExpertMode: boolean\n\n // user defined slippage tolerance in bips, used in all txns\n userSlippageTolerance: number\n\n // deadline set by user in minutes, used in all txns\n userDeadline: number\n\n tokens: {\n [chainId: number]: {\n [address: string]: SerializedToken\n }\n }\n\n pairs: {\n [chainId: number]: {\n // keyed by token0Address:token1Address\n [key: string]: SerializedPair\n }\n }\n\n timestamp: number\n\n audioPlay: boolean\n}\n\nfunction pairKey(token0Address: string, token1Address: string) {\n return `${token0Address};${token1Address}`\n}\n\nexport const initialState: UserState = {\n userDarkMode: null,\n matchesDarkMode: false,\n userExpertMode: false,\n userSlippageTolerance: INITIAL_ALLOWED_SLIPPAGE,\n userDeadline: DEFAULT_DEADLINE_FROM_NOW,\n tokens: {},\n pairs: {},\n timestamp: currentTimestamp(),\n audioPlay: true\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(updateVersion, state => {\n // slippage isnt being tracked in local storage, reset to default\n // noinspection SuspiciousTypeOfGuard\n if (typeof state.userSlippageTolerance !== 'number') {\n state.userSlippageTolerance = INITIAL_ALLOWED_SLIPPAGE\n }\n\n // deadline isnt being tracked in local storage, reset to default\n // noinspection SuspiciousTypeOfGuard\n if (typeof state.userDeadline !== 'number') {\n state.userDeadline = DEFAULT_DEADLINE_FROM_NOW\n }\n\n state.lastUpdateVersionTimestamp = currentTimestamp()\n })\n .addCase(updateUserDarkMode, (state, action) => {\n state.userDarkMode = action.payload.userDarkMode\n state.timestamp = currentTimestamp()\n })\n .addCase(updateMatchesDarkMode, (state, action) => {\n state.matchesDarkMode = action.payload.matchesDarkMode\n state.timestamp = currentTimestamp()\n })\n .addCase(updateUserExpertMode, (state, action) => {\n state.userExpertMode = action.payload.userExpertMode\n state.timestamp = currentTimestamp()\n })\n .addCase(updateUserSlippageTolerance, (state, action) => {\n state.userSlippageTolerance = action.payload.userSlippageTolerance\n state.timestamp = currentTimestamp()\n })\n .addCase(updateUserDeadline, (state, action) => {\n state.userDeadline = action.payload.userDeadline\n state.timestamp = currentTimestamp()\n })\n .addCase(addSerializedToken, (state, { payload: { serializedToken } }) => {\n state.tokens[serializedToken.chainId] = state.tokens[serializedToken.chainId] || {}\n state.tokens[serializedToken.chainId][serializedToken.address] = serializedToken\n state.timestamp = currentTimestamp()\n })\n .addCase(removeSerializedToken, (state, { payload: { address, chainId } }) => {\n state.tokens[chainId] = state.tokens[chainId] || {}\n delete state.tokens[chainId][address]\n state.timestamp = currentTimestamp()\n })\n .addCase(addSerializedPair, (state, { payload: { serializedPair } }) => {\n if (\n serializedPair.token0.chainId === serializedPair.token1.chainId &&\n serializedPair.token0.address !== serializedPair.token1.address\n ) {\n const {chainId} = serializedPair.token0\n state.pairs[chainId] = state.pairs[chainId] || {}\n state.pairs[chainId][pairKey(serializedPair.token0.address, serializedPair.token1.address)] = serializedPair\n }\n state.timestamp = currentTimestamp()\n })\n .addCase(removeSerializedPair, (state, { payload: { chainId, tokenAAddress, tokenBAddress } }) => {\n if (state.pairs[chainId]) {\n // just delete both keys if either exists\n delete state.pairs[chainId][pairKey(tokenAAddress, tokenBAddress)]\n delete state.pairs[chainId][pairKey(tokenBAddress, tokenAAddress)]\n }\n state.timestamp = currentTimestamp()\n })\n .addCase(muteAudio, state => {\n state.audioPlay = false\n })\n .addCase(unmuteAudio, state => {\n state.audioPlay = true\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport {\n addTransaction,\n checkedTransaction,\n clearAllTransactions,\n finalizeTransaction,\n SerializableTransactionReceipt\n} from './actions'\n\nconst now = () => new Date().getTime()\n\nexport interface TransactionDetails {\n hash: string\n approval?: { tokenAddress: string; spender: string }\n summary?: string\n receipt?: SerializableTransactionReceipt\n lastCheckedBlockNumber?: number\n addedTime: number\n confirmedTime?: number\n from: string\n}\n\nexport interface TransactionState {\n [chainId: number]: {\n [txHash: string]: TransactionDetails\n }\n}\n\nexport const initialState: TransactionState = {}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(addTransaction, (transactions, { payload: { chainId, from, hash, approval, summary } }) => {\n if (transactions[chainId]?.[hash]) {\n throw Error('Attempted to add existing transaction.')\n }\n const txs = transactions[chainId] ?? {}\n txs[hash] = { hash, approval, summary, from, addedTime: now() }\n transactions[chainId] = txs\n })\n .addCase(clearAllTransactions, (transactions, { payload: { chainId } }) => {\n if (!transactions[chainId]) return\n transactions[chainId] = {}\n })\n .addCase(checkedTransaction, (transactions, { payload: { chainId, hash, blockNumber } }) => {\n const tx = transactions[chainId]?.[hash]\n if (!tx) {\n return\n }\n if (!tx.lastCheckedBlockNumber) {\n tx.lastCheckedBlockNumber = blockNumber\n } else {\n tx.lastCheckedBlockNumber = Math.max(blockNumber, tx.lastCheckedBlockNumber)\n }\n })\n .addCase(finalizeTransaction, (transactions, { payload: { hash, chainId, receipt } }) => {\n const tx = transactions[chainId]?.[hash]\n if (!tx) {\n return\n }\n tx.receipt = receipt\n tx.confirmedTime = now()\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport { Field, replaceSwapState, selectCurrency, setRecipient, switchCurrencies, typeInput } from './actions'\n\nexport interface SwapState {\n readonly independentField: Field\n readonly typedValue: string\n readonly [Field.INPUT]: {\n readonly currencyId: string | undefined\n }\n readonly [Field.OUTPUT]: {\n readonly currencyId: string | undefined\n }\n // the typed recipient address or ENS name, or null if swap should go to sender\n readonly recipient: string | null\n}\n\nconst initialState: SwapState = {\n independentField: Field.INPUT,\n typedValue: '',\n [Field.INPUT]: {\n currencyId: '',\n },\n [Field.OUTPUT]: {\n currencyId: '',\n },\n recipient: null,\n}\n\nexport default createReducer(initialState, (builder) =>\n builder\n .addCase(\n replaceSwapState,\n (state, { payload: { typedValue, recipient, field, inputCurrencyId, outputCurrencyId } }) => {\n return {\n [Field.INPUT]: {\n currencyId: inputCurrencyId,\n },\n [Field.OUTPUT]: {\n currencyId: outputCurrencyId,\n },\n independentField: field,\n typedValue,\n recipient,\n }\n }\n )\n .addCase(selectCurrency, (state, { payload: { currencyId, field } }) => {\n const otherField = field === Field.INPUT ? Field.OUTPUT : Field.INPUT\n if (currencyId === state[otherField].currencyId) {\n // the case where we have to swap the order\n return {\n ...state,\n independentField: state.independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT,\n [field]: { currencyId },\n [otherField]: { currencyId: state[field].currencyId },\n }\n }\n // the normal case\n return {\n ...state,\n [field]: { currencyId },\n }\n })\n .addCase(switchCurrencies, (state) => {\n return {\n ...state,\n independentField: state.independentField === Field.INPUT ? Field.OUTPUT : Field.INPUT,\n [Field.INPUT]: { currencyId: state[Field.OUTPUT].currencyId },\n [Field.OUTPUT]: { currencyId: state[Field.INPUT].currencyId },\n }\n })\n .addCase(typeInput, (state, { payload: { field, typedValue } }) => {\n return {\n ...state,\n independentField: field,\n typedValue,\n }\n })\n .addCase(setRecipient, (state, { payload: { recipient } }) => {\n state.recipient = recipient\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport { Field, resetMintState, typeInput } from './actions'\n\nexport interface MintState {\n readonly independentField: Field\n readonly typedValue: string\n readonly otherTypedValue: string // for the case when there's no liquidity\n}\n\nconst initialState: MintState = {\n independentField: Field.CURRENCY_A,\n typedValue: '',\n otherTypedValue: ''\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(resetMintState, () => initialState)\n .addCase(typeInput, (state, { payload: { field, typedValue, noLiquidity } }) => {\n if (noLiquidity) {\n // they're typing into the field they've last typed in\n if (field === state.independentField) {\n return {\n ...state,\n independentField: field,\n typedValue\n }\n }\n // they're typing into a new field, store the other value\n \n return {\n ...state,\n independentField: field,\n typedValue,\n otherTypedValue: state.typedValue\n }\n \n } \n return {\n ...state,\n independentField: field,\n typedValue,\n otherTypedValue: ''\n }\n \n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport { getVersionUpgrade, VersionUpgrade } from '@uniswap/token-lists'\n// eslint-disable-next-line import/no-unresolved\nimport { TokenList } from '@uniswap/token-lists/dist/types'\nimport { DEFAULT_LIST_OF_LISTS, DEFAULT_TOKEN_LIST_URL } from '../../constants/lists'\nimport { updateVersion } from '../global/actions'\nimport { acceptListUpdate, addList, fetchTokenList, removeList, selectList } from './actions'\nimport DEFAULT_LIST from '../../constants/token/doublemoonswap.json'\n\nexport interface ListsState {\n readonly byUrl: {\n readonly [url: string]: {\n readonly current: TokenList | null\n readonly pendingUpdate: TokenList | null\n readonly loadingRequestId: string | null\n readonly error: string | null\n }\n }\n // this contains the default list of lists from the last time the updateVersion was called, i.e. the app was reloaded\n readonly lastInitializedDefaultListOfLists?: string[]\n readonly selectedListUrl: string | undefined\n}\n\nconst NEW_LIST_STATE: ListsState['byUrl'][string] = {\n error: null,\n current: null,\n loadingRequestId: null,\n pendingUpdate: null,\n}\n\ntype Mutable = { -readonly [P in keyof T]: T[P] extends ReadonlyArray ? U[] : T[P] }\n\nconst initialState: ListsState = {\n lastInitializedDefaultListOfLists: DEFAULT_LIST_OF_LISTS,\n byUrl: {\n ...DEFAULT_LIST_OF_LISTS.reduce>((memo, listUrl) => {\n memo[listUrl] = NEW_LIST_STATE\n return memo\n }, {}),\n [DEFAULT_TOKEN_LIST_URL]: {\n error: null,\n current: DEFAULT_LIST,\n loadingRequestId: null,\n pendingUpdate: null,\n },\n },\n selectedListUrl: DEFAULT_TOKEN_LIST_URL,\n}\n\nexport default createReducer(initialState, (builder) =>\n builder\n .addCase(fetchTokenList.pending, (state, { payload: { requestId, url } }) => {\n state.byUrl[url] = {\n current: null,\n pendingUpdate: null,\n ...state.byUrl[url],\n loadingRequestId: requestId,\n error: null,\n }\n })\n .addCase(fetchTokenList.fulfilled, (state, { payload: { requestId, tokenList, url } }) => {\n const current = state.byUrl[url]?.current\n const loadingRequestId = state.byUrl[url]?.loadingRequestId\n\n // no-op if update does nothing\n if (current) {\n const upgradeType = getVersionUpgrade(current.version, tokenList.version)\n if (upgradeType === VersionUpgrade.NONE) return\n if (loadingRequestId === null || loadingRequestId === requestId) {\n state.byUrl[url] = {\n ...state.byUrl[url],\n loadingRequestId: null,\n error: null,\n current,\n pendingUpdate: tokenList,\n }\n }\n } else {\n state.byUrl[url] = {\n ...state.byUrl[url],\n loadingRequestId: null,\n error: null,\n current: tokenList,\n pendingUpdate: null,\n }\n }\n })\n .addCase(fetchTokenList.rejected, (state, { payload: { url, requestId, errorMessage } }) => {\n if (state.byUrl[url]?.loadingRequestId !== requestId) {\n // no-op since it's not the latest request\n return\n }\n\n state.byUrl[url] = {\n ...state.byUrl[url],\n loadingRequestId: null,\n error: errorMessage,\n current: null,\n pendingUpdate: null,\n }\n })\n .addCase(selectList, (state, { payload: url }) => {\n state.selectedListUrl = url\n // automatically adds list\n if (!state.byUrl[url]) {\n state.byUrl[url] = NEW_LIST_STATE\n }\n })\n .addCase(addList, (state, { payload: url }) => {\n if (!state.byUrl[url]) {\n state.byUrl[url] = NEW_LIST_STATE\n }\n })\n .addCase(removeList, (state, { payload: url }) => {\n if (state.byUrl[url]) {\n delete state.byUrl[url]\n }\n if (state.selectedListUrl === url) {\n state.selectedListUrl = Object.keys(state.byUrl)[0]\n }\n })\n .addCase(acceptListUpdate, (state, { payload: url }) => {\n if (!state.byUrl[url]?.pendingUpdate) {\n throw new Error('accept list update called without pending update')\n }\n state.byUrl[url] = {\n ...state.byUrl[url],\n pendingUpdate: null,\n current: state.byUrl[url].pendingUpdate,\n }\n })\n .addCase(updateVersion, (state) => {\n // state loaded from localStorage, but new lists have never been initialized\n if (!state.lastInitializedDefaultListOfLists) {\n state.byUrl = initialState.byUrl\n state.selectedListUrl = undefined\n } else if (state.lastInitializedDefaultListOfLists) {\n const lastInitializedSet = state.lastInitializedDefaultListOfLists.reduce>(\n (s, l) => s.add(l),\n new Set()\n )\n const newListOfListsSet = DEFAULT_LIST_OF_LISTS.reduce>((s, l) => s.add(l), new Set())\n\n DEFAULT_LIST_OF_LISTS.forEach((listUrl) => {\n if (!lastInitializedSet.has(listUrl)) {\n state.byUrl[listUrl] = NEW_LIST_STATE\n }\n })\n\n state.lastInitializedDefaultListOfLists.forEach((listUrl) => {\n if (!newListOfListsSet.has(listUrl)) {\n delete state.byUrl[listUrl]\n }\n })\n }\n\n state.lastInitializedDefaultListOfLists = DEFAULT_LIST_OF_LISTS\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport { Field, typeInput } from './actions'\n\nexport interface BurnState {\n readonly independentField: Field\n readonly typedValue: string\n}\n\nconst initialState: BurnState = {\n independentField: Field.LIQUIDITY_PERCENT,\n typedValue: '0'\n}\n\nexport default createReducer(initialState, builder =>\n builder.addCase(typeInput, (state, { payload: { field, typedValue } }) => {\n return {\n ...state,\n independentField: field,\n typedValue\n }\n })\n)\n","import { createReducer } from '@reduxjs/toolkit'\nimport {\n addMulticallListeners,\n errorFetchingMulticallResults,\n fetchingMulticallResults,\n removeMulticallListeners,\n toCallKey,\n updateMulticallResults\n} from './actions'\n\nexport interface MulticallState {\n callListeners?: {\n // on a per-chain basis\n [chainId: number]: {\n // stores for each call key the listeners' preferences\n [callKey: string]: {\n // stores how many listeners there are per each blocks per fetch preference\n [blocksPerFetch: number]: number\n }\n }\n }\n\n callResults: {\n [chainId: number]: {\n [callKey: string]: {\n data?: string | null\n blockNumber?: number\n fetchingBlockNumber?: number\n }\n }\n }\n}\n\nconst initialState: MulticallState = {\n callResults: {}\n}\n\nexport default createReducer(initialState, builder =>\n builder\n .addCase(addMulticallListeners, (state, { payload: { calls, chainId, options: { blocksPerFetch = 1 } = {} } }) => {\n const listeners: MulticallState['callListeners'] = state.callListeners\n ? state.callListeners\n : (state.callListeners = {})\n listeners[chainId] = listeners[chainId] ?? {}\n calls.forEach(call => {\n const callKey = toCallKey(call)\n listeners[chainId][callKey] = listeners[chainId][callKey] ?? {}\n listeners[chainId][callKey][blocksPerFetch] = (listeners[chainId][callKey][blocksPerFetch] ?? 0) + 1\n })\n })\n .addCase(\n removeMulticallListeners,\n (state, { payload: { chainId, calls, options: { blocksPerFetch = 1 } = {} } }) => {\n const listeners: MulticallState['callListeners'] = state.callListeners\n ? state.callListeners\n : (state.callListeners = {})\n\n if (!listeners[chainId]) return\n calls.forEach(call => {\n const callKey = toCallKey(call)\n if (!listeners[chainId][callKey]) return\n if (!listeners[chainId][callKey][blocksPerFetch]) return\n\n if (listeners[chainId][callKey][blocksPerFetch] === 1) {\n delete listeners[chainId][callKey][blocksPerFetch]\n } else {\n listeners[chainId][callKey][blocksPerFetch]--\n }\n })\n }\n )\n .addCase(fetchingMulticallResults, (state, { payload: { chainId, fetchingBlockNumber, calls } }) => {\n state.callResults[chainId] = state.callResults[chainId] ?? {}\n calls.forEach(call => {\n const callKey = toCallKey(call)\n const current = state.callResults[chainId][callKey]\n if (!current) {\n state.callResults[chainId][callKey] = {\n fetchingBlockNumber\n }\n } else {\n if ((current.fetchingBlockNumber ?? 0) >= fetchingBlockNumber) return\n state.callResults[chainId][callKey].fetchingBlockNumber = fetchingBlockNumber\n }\n })\n })\n .addCase(errorFetchingMulticallResults, (state, { payload: { fetchingBlockNumber, chainId, calls } }) => {\n state.callResults[chainId] = state.callResults[chainId] ?? {}\n calls.forEach(call => {\n const callKey = toCallKey(call)\n const current = state.callResults[chainId][callKey]\n if (!current) return // only should be dispatched if we are already fetching\n if (current.fetchingBlockNumber === fetchingBlockNumber) {\n delete current.fetchingBlockNumber\n current.data = null\n current.blockNumber = fetchingBlockNumber\n }\n })\n })\n .addCase(updateMulticallResults, (state, { payload: { chainId, results, blockNumber } }) => {\n state.callResults[chainId] = state.callResults[chainId] ?? {}\n Object.keys(results).forEach(callKey => {\n const current = state.callResults[chainId][callKey]\n if ((current?.blockNumber ?? 0) > blockNumber) return\n state.callResults[chainId][callKey] = {\n data: results[callKey],\n blockNumber\n }\n })\n })\n)\n","import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'\nimport { save, load } from 'redux-localstorage-simple'\n\nimport application from './application/reducer'\nimport { updateVersion } from './global/actions'\nimport user from './user/reducer'\nimport transactions from './transactions/reducer'\nimport swap from './swap/reducer'\nimport mint from './mint/reducer'\nimport lists from './lists/reducer'\nimport burn from './burn/reducer'\nimport multicall from './multicall/reducer'\nimport toasts from './toasts'\nimport { getThemeCache } from '../utils/theme'\n\ntype MergedState = {\n user: {\n [key: string]: any\n }\n transactions: {\n [key: string]: any\n }\n}\nconst PERSISTED_KEYS: string[] = ['user', 'transactions']\nconst loadedState = load({ states: PERSISTED_KEYS }) as MergedState\nif (loadedState.user) {\n loadedState.user.userDarkMode = getThemeCache()\n}\n\nconst store = configureStore({\n reducer: {\n application,\n user,\n transactions,\n swap,\n mint,\n burn,\n multicall,\n lists,\n toasts\n },\n middleware: [...getDefaultMiddleware({ thunk: false }), save({ states: PERSISTED_KEYS })],\n preloadedState: loadedState,\n})\n\nstore.dispatch(updateVersion())\n\nexport default store\n\nexport type AppState = ReturnType\nexport type AppDispatch = typeof store.dispatch\n","import { Web3Provider } from '@ethersproject/providers'\n\nexport default function getLibrary(provider: any): Web3Provider {\n const library = new Web3Provider(provider)\n library.pollingInterval = 15000\n return library\n}\n","import React from 'react'\nimport { createWeb3ReactRoot, Web3ReactProvider } from '@web3-react/core'\nimport { Provider } from 'react-redux'\nimport { ModalProvider } from '@doublemoondev/doublemoon-uikit'\nimport { NetworkContextName } from './constants'\nimport store from './state'\nimport getLibrary from './utils/getLibrary'\nimport { ThemeContextProvider } from './ThemeContext'\n\nconst Web3ProviderNetwork = createWeb3ReactRoot(NetworkContextName)\n\nconst Providers: React.FC = ({ children }) => {\n return (\n \n \n \n \n {children}\n \n \n \n \n )\n}\n\nexport default Providers\n","import i18next from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport XHR from 'i18next-xhr-backend'\nimport LanguageDetector from 'i18next-browser-languagedetector'\n\ni18next\n .use(XHR)\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n backend: {\n loadPath: `./locales/{{lng}}.json`\n },\n react: {\n useSuspense: true\n },\n fallbackLng: 'en',\n preload: ['en'],\n keySeparator: false,\n interpolation: { escapeValue: false }\n })\n\nexport default i18next\n","import React, { StrictMode } from 'react'\nimport ReactDOM from 'react-dom'\nimport { ResetCSS } from '@doublemoondev/doublemoon-uikit'\nimport GlobalStyle from './style/Global'\nimport App from './pages/App'\nimport ApplicationUpdater from './state/application/updater'\nimport ListsUpdater from './state/lists/updater'\nimport MulticallUpdater from './state/multicall/updater'\nimport TransactionUpdater from './state/transactions/updater'\nimport ToastListener from './components/ToastListener'\nimport Providers from './Providers'\nimport 'inter-ui'\nimport './i18n'\n\nif ('ethereum' in window) {\n (window.ethereum as any).autoRefreshOnNetworkChange = false\n}\n\nwindow.addEventListener('error', () => {\n localStorage?.removeItem('redux_localstorage_simple_lists')\n})\n\nReactDOM.render(\n \n \n <>\n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById('root')\n)\n"],"sourceRoot":""}