@cofhe/react 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/CofheProvider.tsx","../src/hooks/useEncryptInput.ts","../src/components/FnxEncryptInput.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/utils.ts","../src/utils/logging.ts"],"sourcesContent":["import { createContext, useContext, useEffect, useState } from 'react';\nimport type { CofhesdkClient } from '@cofhe/sdk';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index.js';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider({ children, client: providedClient, config }: CofheProviderProps) {\n const [client, setClient] = useState<CofhesdkClient | null>(providedClient || null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (providedClient) {\n setClient(providedClient);\n setIsInitialized(true);\n return;\n }\n\n if (config) {\n try {\n // Initialize client with config\n // This would need to be implemented based on the actual CofheClient constructor\n // const newClient = new CofheClient(config);\n // setClient(newClient);\n setIsInitialized(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to initialize CoFHE client'));\n }\n }\n }, [providedClient, config]);\n\n const contextValue: CofheContextValue = {\n client,\n isInitialized,\n error,\n };\n\n return (\n <CofheContext.Provider value={contextValue}>\n {children}\n </CofheContext.Provider>\n );\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../providers/CofheProvider.js';\nimport { Encryptable } from '@cofhe/sdk';\nimport type { EncryptableItem } from '@cofhe/sdk';\nimport type { FheTypeValue } from '../utils/utils.js';\nimport type { EncryptionStep } from '../types/component-types.js';\n\n// Map SDK encrypt steps to UI display info\nconst STEP_CONFIG: Record<EncryptionStep, { label: string; progress: number }> = {\n 'initTfhe': {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n 'fetchKeys': {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n 'pack': {\n label: 'Packing data...',\n progress: 40,\n },\n 'prove': {\n label: 'Generating proof...',\n progress: 70,\n },\n 'verify': {\n label: 'Verifying...',\n progress: 90,\n },\n 'done': {\n label: 'Encryption complete!',\n progress: 100,\n },\n};\n\nexport interface UseEncryptInputReturn {\n onEncryptInput: (_type: FheTypeValue, _value: string) => Promise<any>;\n isEncryptingInput: boolean;\n encryptionStep: EncryptionStep | null;\n encryptionProgress: number;\n encryptionProgressLabel: string;\n inputEncryptionDisabled: boolean;\n}\n\nexport function useEncryptInput(): UseEncryptInputReturn {\n const { client } = useCofheContext();\n const [isEncrypting, setIsEncrypting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [encryptionStep, setEncryptionStep] = useState<EncryptionStep | null>(null);\n const [encryptionProgress, setEncryptionProgress] = useState<number>(0);\n const [encryptionProgressLabel, setEncryptionProgressLabel] = useState<string>('');\n\n const onEncryptInput = useCallback(async (type: FheTypeValue, value: string) => {\n if (!client) {\n throw new Error('CoFHE client not initialized');\n }\n\n setIsEncrypting(true);\n setError(null);\n\n try {\n // Convert value based on type\n let convertedValue: number | bigint | boolean | string;\n \n if (type === 'bool') {\n convertedValue = value.toLowerCase() === 'true' || value === '1';\n } else if (type === 'address') {\n convertedValue = value as string | bigint;\n } else {\n // Numeric types\n convertedValue = value.includes('.') ? parseFloat(value) : parseInt(value, 10);\n }\n\n // Create encryptable item\n let encryptableItem: EncryptableItem;\n \n switch (type) {\n case 'bool':\n encryptableItem = Encryptable.bool(convertedValue as boolean);\n break;\n case 'uint8':\n encryptableItem = Encryptable.uint8(BigInt(convertedValue));\n break;\n case 'uint16':\n encryptableItem = Encryptable.uint16(BigInt(convertedValue));\n break;\n case 'uint32':\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n break;\n case 'uint64':\n encryptableItem = Encryptable.uint64(BigInt(convertedValue));\n break;\n case 'uint128':\n encryptableItem = Encryptable.uint128(BigInt(convertedValue));\n break;\n case 'address':\n encryptableItem = Encryptable.address(convertedValue as string | bigint);\n break;\n default:\n encryptableItem = Encryptable.uint32(BigInt(convertedValue));\n }\n\n // Perform encryption with real-time step tracking\n const encryptionBuilder = client.encryptInputs([encryptableItem]).setStepCallback((step, context) => {\n const stepConfig = STEP_CONFIG[step as EncryptionStep];\n \n if (stepConfig) {\n // Update UI with real step information\n setEncryptionStep(step as EncryptionStep);\n setEncryptionProgress(stepConfig.progress);\n setEncryptionProgressLabel(stepConfig.label);\n }\n \n // Log worker status for debugging (prove step only)\n if (step === 'prove' && context?.isEnd) {\n console.log('[Encryption] Worker Status:', {\n useWorker: context.useWorker,\n usedWorker: context.usedWorker,\n workerFailedError: context.workerFailedError,\n duration: context.duration + 'ms'\n });\n }\n });\n const result = await encryptionBuilder.encrypt();\n \n if (!result.success) {\n throw result.error;\n }\n\n // Complete\n setEncryptionStep('done');\n setEncryptionProgress(100);\n setEncryptionProgressLabel('Encryption complete!');\n\n // Reset after a short delay\n setTimeout(() => {\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n }, 1000);\n\n setIsEncrypting(false);\n return result.data[0]; // Return first (and only) encrypted item\n } catch (err) {\n // Reset on error\n setEncryptionStep(null);\n setEncryptionProgress(0);\n setEncryptionProgressLabel('');\n setIsEncrypting(false);\n const error = err instanceof Error ? err : new Error('Encryption failed');\n setError(error);\n throw error;\n }\n }, [client]);\n\n return {\n onEncryptInput,\n isEncryptingInput: isEncrypting,\n encryptionStep,\n encryptionProgress,\n encryptionProgressLabel,\n inputEncryptionDisabled: isEncrypting || !!error,\n };\n}\n","import { useState, useRef, useEffect } from 'react';\nimport type { BaseProps, DropdownOption, ComponentSize, EncryptionProgressData, EncryptionResultData, EncryptionStartData } from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList, type FheTypeValue } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { useEncryptInput } from '../hooks/useEncryptInput.js';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const { onEncryptInput, isEncryptingInput, encryptionStep, encryptionProgress, encryptionProgressLabel } = useEncryptInput();\n\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncryptingInput) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncryptingInput) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncryptingInput]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncryptingInput && encryptionStep && encryptionProgress !== null && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: encryptionStep.toString(),\n progress: encryptionProgress,\n label: encryptionProgressLabel\n });\n }\n }, [encryptionStep, encryptionProgress, encryptionProgressLabel, isEncryptingInput, onEncryptProgress]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' }\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError \n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500' \n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncryptingInput) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncryptingInput) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncryptingInput) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) => cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible \n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium' \n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500'\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') => cn(\n 'h-full transition-all duration-300 ease-out rounded-full',\n progressVariantClasses[variant]\n );\n\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n \n const typeInfo = FheTypesList.find(type => type.value === typeValue);\n if (!typeInfo) return false;\n \n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n \n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n \n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n \n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n \n return true;\n }\n \n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n \n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n \n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n \n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n \n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(encryptedResult, (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n }, 2); // Pretty format with 2 spaces\n \n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n \n // Show success indication\n setCopySuccess(true);\n \n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n \n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n \n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const encryptionResult = await onEncryptInput(type, textValue);\n \n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n \n const data = { value: textValue, encrypted: encryptionResult };\n \n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncryptingInput) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => (\n <SecurityIcon sx={{ fontSize: 14 }} />\n );\n\n const ChevronDownIcon = () => (\n <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />\n );\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n \n {/* Encryption status indicator */}\n {(isEncryptingInput || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncryptingInput ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">\n Encrypting...\n </div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess \n ? 'bg-green-600 cursor-default' \n : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? \"Copied to clipboard!\" : \"Copy encrypted result to clipboard\"}\n >\n <>\n {copySuccess ? (\n <CheckIcon sx={{ fontSize: 12 }} />\n ) : (\n <ContentCopyIcon sx={{ fontSize: 12 }} />\n )}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n \n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncryptingInput}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n \n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n \n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={!isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined}\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n \n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div \n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncryptingInput ? 'slideDownFadeIn 0.5s ease-out forwards' : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">\n {encryptionProgress || 0}%\n </span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{ \n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out'\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n \n </div>\n \n {/* Error message */}\n {hasError && errorMessage && (\n <p \n className=\"mt-2 text-sm text-red-600 dark:text-red-400\" \n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n };\n ","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n ): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n \n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n \n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n };\n ","// FHE Types for the current CoFHE SDK\nexport type FheTypeValue = 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'uint128' | 'bool' | 'address';\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n { \n label: \"Encrypted Bool\", \n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: \"Boolean value (true/false)\"\n },\n { \n label: \"Encrypted Uint8\", \n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: \"8-bit unsigned integer (0 to 255)\"\n },\n { \n label: \"Encrypted Uint16\", \n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: \"16-bit unsigned integer (0 to 65,535)\"\n },\n { \n label: \"Encrypted Uint32\", \n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: \"32-bit unsigned integer (0 to 4,294,967,295)\"\n },\n { \n label: \"Encrypted Uint64\", \n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: \"64-bit unsigned integer (0 to 18,446,744,073,709,551,615)\"\n },\n { \n label: \"Encrypted Uint128\", \n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: \"128-bit unsigned integer\"\n },\n { \n label: \"Encrypted Address\", \n value: 'address',\n maxValue: null, // Address validation is different\n description: \"Ethereum address (0x...)\"\n },\n];\n","import type { FheTypeValue } from './utils.js';\n\nexport const logBlockStart = (message: string) => {\n console.log(\"┌──────────────────┬──────────────────────────────────────────────────\");\n console.log(`│ [COFHE] │ ${message}`);\n console.log(\"├──────────────────┴──────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log(\"└─────────────────────────────────────────────────────────────────────\");\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return \"ebool\";\n case 'uint8':\n return \"euint8\";\n case 'uint16':\n return \"euint16\";\n case 'uint32':\n return \"euint32\";\n case 'uint64':\n return \"euint64\";\n case 'uint128':\n return \"euint128\";\n case 'address':\n return \"eaddress\";\n default:\n return \"unknown\";\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? \"true\" : \"false\";\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + \"..\" + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n"],"mappings":"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","names":["useState","useState","error","useState","useEffect","jsx","useState","useEffect","errorMessage"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/unreachable-case-error/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/assert/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/create-factory-with-constraint/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/is-exact/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/noop/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/index.ts","../src/providers/CofheProvider.tsx","../src/providers/QueryProvider.tsx","../src/utils/cn.ts","../src/utils/utils.ts","../src/types/token.ts","../src/utils/logging.ts","../src/utils/debounce.ts","../src/utils/errors.ts","../src/utils/waitUntilRpcAwareAndReadContract.ts","../src/components/FnxFloatingButton/FloatingButtonComponent.tsx","../src/components/FnxFloatingButton/FnxFloatingButtonContext.tsx","../src/utils/bigintJson.ts","../src/stores/transactionStore.ts","../src/hooks/useCofheConnection.ts","../src/hooks/useTrackPendingTransactions.ts","../src/hooks/useCofheReadContract.ts","../src/hooks/useCofhePermits.ts","../src/stores/portalModalStore.tsx","../src/stores/portalUIStore.tsx","../src/stores/portalStatuses.tsx","../src/components/FnxFloatingButton/pagesConfig/types.ts","../src/stores/portalNavigationStore.tsx","../src/components/FnxFloatingButton/components/ToastPrimitives.tsx","../src/components/FnxFloatingButton/components/HashLink.tsx","../src/stores/portalToasts.tsx","../src/hooks/useIsCofheErrorActive.ts","../src/constants/confidentialTokenABIs.ts","../src/hooks/useCofheTokenPublicBalance.ts","../src/hooks/useCofheTokenLists.ts","../src/constants/erc20ABIs.ts","../src/utils/format.ts","../src/hooks/useCofheTokenClaimable.ts","../src/utils/decryptionAwareReadContract.ts","../src/stores/decryptionWatchingStore.ts","../src/hooks/useIsWaitingForDecryptionToInvalidate.ts","../src/hooks/useStoredTransactions.ts","../src/hooks/usePendingTransactions.ts","../src/hooks/useTransactionGlobalLifecycle.ts","../src/hooks/useTrackDecryptingTransactions.ts","../src/hooks/useTransactionReceiptsByHash.ts","../src/hooks/useCofheReadDecryptionResults.ts","../src/hooks/useCofheClient.ts","../src/hooks/useCofheTokenDecryptedBalance.ts","../src/hooks/useCofheReadContractAndDecrypt.ts","../src/hooks/useCofheDecrypt.ts","../src/hooks/useCofheTokenTransfer.ts","../src/hooks/useCofheEncryptAndWriteContract.ts","../src/hooks/useCofheEncrypt.ts","../src/hooks/internal/useStepsState.ts","../src/hooks/useCofheWriteContract.ts","../src/hooks/useCofheTokenShield.ts","../src/hooks/useCofheTokenUnshield.ts","../src/hooks/useStoredTransaction.ts","../src/hooks/useOnceTransactionMined.ts","../src/hooks/useOnceDecrypted.ts","../src/hooks/useCofheTokenClaimUnshielded.ts","../src/hooks/useCofheTokensClaimable.ts","../src/hooks/useNormalizedList.ts","../src/hooks/useIsWaitingForDecryptionByAddress.ts","../src/hooks/permits/usePermitDuration.ts","../src/hooks/permits/usePermitForm.ts","../src/stores/portalPersisted.tsx","../src/hooks/permits/useCofheCreatePermitMutation.ts","../src/hooks/permits/usePermitsList.ts","../src/hooks/useCopyFeedback.ts","../src/hooks/permits/useCofheNavigateToCreatePermit.tsx","../src/hooks/permits/useReceivePermit.ts","../src/hooks/permits/usePermitDetailsPage.ts","../src/hooks/useCofheAutoConnect.ts","../src/providers/internalQueryHooks.ts","../src/hooks/useCofheConnect.ts","../src/hooks/useReschedulableTimeout.ts","../src/hooks/useWatchPermitStatus.ts","../src/hooks/useWatchClaimablesStatus.ts","../src/hooks/useCofheClaimableTokens.ts","../src/components/FhenixLogoIcon.tsx","../src/components/FnxFloatingButton/StatusBarSection.tsx","../src/components/FnxFloatingButton/StatusBarContent.tsx","../src/components/primitives/AnimatedZStack.tsx","../src/components/FnxFloatingButton/ContentSection.tsx","../src/components/FnxFloatingButton/pages/MainPage/WalletHeader.tsx","../src/components/FnxFloatingButton/components/AddressButton.tsx","../src/components/FnxFloatingButton/components/ConnectedChainIndicator.tsx","../src/assets/chains/11155111.svg","../src/assets/chains/84532.svg","../src/components/FnxFloatingButton/components/ChainIcon.tsx","../src/components/FnxFloatingButton/pages/MainPage/AssetCard.tsx","../src/components/FnxFloatingButton/components/TokenIcon.tsx","../src/components/FnxFloatingButton/components/LoadingDots.tsx","../src/components/FnxFloatingButton/components/TokenBalanceView.tsx","../src/components/FnxFloatingButton/components/CofheTokenConfidentialBalance.tsx","../src/hooks/useCofhePinnedTokenAddress.ts","../src/components/FnxFloatingButton/pages/MainPage/BottomNavigation.tsx","../src/hooks/useCofhePinnedToken.ts","../src/components/FnxFloatingButton/components/ActionButton.tsx","../src/components/FnxFloatingButton/components/AmountInput.tsx","../src/components/FnxFloatingButton/components/Button.tsx","../src/components/FnxFloatingButton/components/TransactionItem.tsx","../src/components/FnxFloatingButton/components/PageContainer.tsx","../src/components/FnxFloatingButton/pages/MainPage.tsx","../src/components/FnxFloatingButton/pages/SettingsPage.tsx","../src/components/FnxFloatingButton/stores/settingsStore.ts","../src/components/FnxFloatingButton/pages/TokenListPage.tsx","../src/components/FnxFloatingButton/pages/TokenListPage/TokenRow.tsx","../src/components/FnxFloatingButton/pages/permits/PermitsListPage/index.tsx","../src/components/FnxFloatingButton/Accordion.tsx","../src/components/FnxFloatingButton/pages/permits/components/PermitItem.tsx","../src/components/FnxFloatingButton/modals/InfoModalButton.tsx","../src/components/FnxFloatingButton/components/PermitCard.tsx","../src/components/StripedBackground.tsx","../src/components/FnxFloatingButton/pages/permits/GeneratePermitPage/index.tsx","../src/assets/fhenix-permit-icon.svg","../src/components/FnxFloatingButton/pages/permits/components/NameSection.tsx","../src/components/FnxFloatingButton/pages/permits/components/ExpirySection.tsx","../src/components/FnxFloatingButton/pages/permits/DelegatePermitPage/index.tsx","../src/components/FnxFloatingButton/pages/permits/components/ReceiverSection.tsx","../src/components/FnxFloatingButton/pages/permits/ImportPermitPage/index.tsx","../src/assets/fhenix-permit-receive.svg","../src/components/FnxFloatingButton/pages/permits/PermitDetailsPage/index.tsx","../src/components/FnxFloatingButton/pages/TokenInfoPage.tsx","../src/components/FnxFloatingButton/pages/SendPage.tsx","../src/components/FnxFloatingButton/pages/ShieldPageV2.tsx","../src/hooks/useIsUnshieldingMining.ts","../src/components/FnxFloatingButton/pages/ActivityPage.tsx","../src/components/FnxFloatingButton/pages/DebugPage.tsx","../src/components/FnxFloatingButton/pages/ClaimableTokens.tsx","../src/components/FnxFloatingButton/pagesConfig/const.ts","../src/components/FnxFloatingButton/modals/ExampleSelectionPage.tsx","../src/components/FnxFloatingButton/modals/ExampleInfoPage.tsx","../src/components/FnxFloatingButton/modals/PermitDetailsModal.tsx","../src/components/FnxFloatingButton/modals/BaseInfoModal.tsx","../src/components/FnxFloatingButton/modals/PermitTypeInfoModal.tsx","../src/components/FnxFloatingButton/modals/PermitInfoModal.tsx","../src/components/FnxFloatingButton/modals/index.ts","../src/components/FnxFloatingButton/ToastsSection.tsx","../src/components/FnxFloatingButton/FnxFloatingButtonBase.tsx","../src/providers/errors.tsx","../src/components/FnxFloatingButton/FnxFloatingButton.tsx","../src/config.ts","../src/components/FnxEncryptInput.tsx","../src/index.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJpbWl0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgc3ltYm9sIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbHQtaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCIuLi9wcmltaXRpdmVcIjtcblxuZXhwb3J0IHR5cGUgQnVpbHRpbiA9IFByaW1pdGl2ZSB8IEZ1bmN0aW9uIHwgRGF0ZSB8IEVycm9yIHwgUmVnRXhwO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIva2V5LW9mLWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEtleW9mQmFzZSA9IGtleW9mIGFueTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4Y2x1ZGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4Y2x1ZGU8VW5pb25UeXBlLCBFeGNsdWRlZE1lbWJlcnMgZXh0ZW5kcyBVbmlvblR5cGU+ID0gRXhjbHVkZTxVbmlvblR5cGUsIEV4Y2x1ZGVkTWVtYmVycz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4dHJhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4dHJhY3Q8VHlwZSwgVW5pb24gZXh0ZW5kcyBQYXJ0aWFsPFR5cGU+PiA9IEV4dHJhY3Q8VHlwZSwgVW5pb24+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LW9taXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgU3RyaWN0T21pdDxUeXBlIGV4dGVuZHMgQW55UmVjb3JkLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgQW55QXJyYXlcbiAgPyBuZXZlclxuICA6IE9taXQ8VHlwZSwgS2V5cz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFdyaXRhYmxlPFR5cGU+ID0geyAtcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXN5bmNPclN5bmM8VHlwZT4gPSBQcm9taXNlTGlrZTxUeXBlPiB8IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy10eXBlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY09yU3luYyB9IGZyb20gXCIuLi9hc3luYy1vci1zeW5jXCI7XG5cbmV4cG9ydCB0eXBlIEFzeW5jT3JTeW5jVHlwZTxBc3luY09yU3luY1R5cGU+ID0gQXN5bmNPclN5bmNUeXBlIGV4dGVuZHMgQXN5bmNPclN5bmM8aW5mZXIgVHlwZT4gPyBUeXBlIDogbmV2ZXI7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5b2ZCYXNlIH0gZnJvbSBcIi4uL2tleS1vZi1iYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c106IFR5cGUgfTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS12YWx1ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBgVmFsdWVPZmAgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5VmFsdWVzPFR5cGU+ID0gVHlwZVtrZXlvZiBUeXBlXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1lcmdlPE9iamVjdDEsIE9iamVjdDI+ID0gUHJldHRpZnk8T21pdDxPYmplY3QxLCBrZXlvZiBPYmplY3QyPiAmIE9iamVjdDI+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2Utbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVyZ2UgfSBmcm9tIFwiLi4vbWVyZ2VcIjtcblxudHlwZSBfTWVyZ2VOPFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFJlc3VsdD4gPSBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IF9NZXJnZU48VGFpbCwgTWVyZ2U8UmVzdWx0LCBIZWFkPj5cbiAgOiBSZXN1bHQ7XG5cbmV4cG9ydCB0eXBlIE1lcmdlTjxUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IF9NZXJnZU48VHVwbGUsIHt9PjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV3YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOZXdhYmxlPFJldHVyblR5cGU+IHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFJldHVyblR5cGU7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLW5ldmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25OZXZlcjxUeXBlIGV4dGVuZHMge30+ID0gUGljazxcbiAgVHlwZSxcbiAgeyBbS2V5IGluIGtleW9mIFR5cGVdOiBUeXBlW0tleV0gZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogS2V5IH1ba2V5b2YgVHlwZV1cbj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb21pdC1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPbWl0UHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7IFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IG5ldmVyIDogS2V5XTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3BhcXVlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFN0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBuZXZlciA6IFR5cGUpIDogbmV2ZXI7XG5cbmRlY2xhcmUgY29uc3QgX19PUEFRVUVfVFlQRV9fOiB1bmlxdWUgc3ltYm9sO1xuXG5leHBvcnQgdHlwZSBXaXRoT3BhcXVlPFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgW19fT1BBUVVFX1RZUEVfX106IFRva2VuO1xufTtcblxuZXhwb3J0IHR5cGUgT3BhcXVlPFR5cGUsIFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IFRva2VuIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbDxUb2tlbj4gPyBUeXBlICYgV2l0aE9wYXF1ZTxUb2tlbj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aC12YWx1ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gVE9ETzogbWVyZ2UgdG8gRXh0cmFjdEZyb21BcnJheVxudHlwZSBFeHRyYWN0RnJvbU9iamVjdDxPYmogZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+LCBLZXk+ID0gS2V5IGV4dGVuZHMga2V5b2YgT2JqXG4gID8gT2JqW0tleV1cbiAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTxPYmo+XG4gID8gTm9uTnVsbGFibGU8T2JqPltLZXldIHwgdW5kZWZpbmVkXG4gIDogdW5kZWZpbmVkO1xuXG4vLyBUT0RPOiBtZXJnZSB0byBFeHRyYWN0RnJvbU9iamVjdFxudHlwZSBFeHRyYWN0RnJvbUFycmF5PEFyciBleHRlbmRzIHJlYWRvbmx5IGFueVtdLCBLZXk+ID0gYW55W10gZXh0ZW5kcyBBcnJcbiAgPyBBcnIgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgVClbXVxuICAgID8gVCB8IHVuZGVmaW5lZFxuICAgIDogdW5kZWZpbmVkXG4gIDogS2V5IGV4dGVuZHMga2V5b2YgQXJyXG4gID8gQXJyW0tleV1cbiAgOiB1bmRlZmluZWQ7XG5cbnR5cGUgR2V0V2l0aEFycmF5PFR5cGUsIFBhdGgsIFByZXR0aWZpZWRUeXBlID0gUHJldHRpZnk8VHlwZT4+ID0gUGF0aCBleHRlbmRzIFtdXG4gID8gVHlwZVxuICA6IFBhdGggZXh0ZW5kcyBbaW5mZXIgS2V5LCAuLi5pbmZlciBSZXN0XVxuICA/IFByZXR0aWZpZWRUeXBlIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPlxuICAgID8gR2V0V2l0aEFycmF5PEV4dHJhY3RGcm9tT2JqZWN0PFByZXR0aWZpZWRUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdXG4gICAgPyBHZXRXaXRoQXJyYXk8RXh0cmFjdEZyb21BcnJheTxUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogdW5kZWZpbmVkXG4gIDogbmV2ZXI7XG5cbnR5cGUgUGF0aDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBLZXl9LiR7aW5mZXIgUmVzdH1gXG4gID8gW0tleSwgLi4uUGF0aDxSZXN0Pl1cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgS2V5fWBcbiAgPyBbS2V5XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBQYXRoVmFsdWU8VHlwZSwgU3RyaW5nUGF0aD4gPSBHZXRXaXRoQXJyYXk8VHlwZSwgUGF0aDxTdHJpbmdQYXRoPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzTmV2ZXIgfSBmcm9tIFwiLi4vaXMtbmV2ZXJcIjtcbmltcG9ydCB7IENyZWF0ZVR5cGVPcHRpb25zIH0gZnJvbSBcIi4uL2NyZWF0ZS10eXBlLW9wdGlvbnNcIjtcbmltcG9ydCB7IFZhbHVlT2YgfSBmcm9tIFwiLi4vdmFsdWUtb2ZcIjtcbmltcG9ydCB7IEhhc1BhcnNhYmxlUGF0aCB9IGZyb20gXCIuLi9oYXMtcGFyc2FibGUtcGF0aFwiO1xuXG50eXBlIFBhdGhhYmxlID0gc3RyaW5nIHwgbnVtYmVyO1xuXG50eXBlIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnMgPSB7XG4gIGRlcHRoOiBbXTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGRlcHRoIFRoaXMgb3B0aW9uIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpblxuICogYFJlY3Vyc2l2ZVBhdGhzT3B0aW9uc1snZGVwdGgnXVsnbGVuZ3RoJ11gLiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGhcbiAqIGBQYXRoc09wdGlvbnNbJ2RlcHRoJ11gXG4gKi9cbnR5cGUgUmVjdXJzaXZlUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogYW55W107XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBCeSBkZWZhdWx0LCB0aGUgZGVwdGggb3B0aW9uIGlzIHNldCB0byA3LiBJdCBzaG91bGQgY292ZXIgdGhlXG4gKiBtYWpvcml0eSBvZiB1c2UgY2FzZXMuIElmIGJ5IGFueSBjaGFuY2UgaXQgZG9lc24ndCBmaXQgeW91LCBmZWVsIGZyZWUgdG9cbiAqIGluY3JlYXNlIHRoZSB2YWx1ZS4gSG93ZXZlciwgdGhpcyBtYXkgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiBnZXR0aW5nXG4gKiBgVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlYCBlcnJvci5cbiAqXG4gKiBAcGFyYW0gYW55QXJyYXlJbmRleEFjY2Vzc29yIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gd2lsZGNhcmQgYWNjZXNzIHRvXG4gKiBhcnJheSBpbmRpY2VzIC0gdXNhZ2UgbXVzdCBiZSBpbnRlbnRpb25hbGx5IGNvbmZpZ3VyZWQuXG4gKi9cbnR5cGUgRGVmYXVsdFBhdGhzT3B0aW9ucyA9IHtcbiAgZGVwdGg6IDc7XG4gIGFueUFycmF5SW5kZXhBY2Nlc3NvcjogYCR7bnVtYmVyfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBUaGlzIG9wdGlvbiByZXN0cmljdHMgdGhlIGRlcHRoIG9mIHRoZSBwYXRocyBsb29rdXAgYW5kIHJlbW92ZXMgYFR5cGVcbiAqIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGVgIGVycm9ycyBmb3JcbiAqIHBvdGVudGlhbGx5IGluZmluaXRlIHR5cGVzLlxuICpcbiAqIEBwYXJhbSBhbnlBcnJheUluZGV4QWNjZXNzb3IgVGhpcyB3aWxkY2FyZCB3aWxsIHNhdGlzZnkgYW55IGFycmF5IGluZGV4IGlmIGRlZmluZWQuXG4gKi9cbnR5cGUgUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogbnVtYmVyO1xuICBhbnlBcnJheUluZGV4QWNjZXNzb3I6IHN0cmluZztcbn07XG5cbnR5cGUgQXBwZW5kPFR1cGxlIGV4dGVuZHMgYW55W10+ID0gWy4uLlR1cGxlLCAwXTtcblxudHlwZSBSZWN1cnNpdmVQYXRoczxcbiAgVHlwZSxcbiAgVXNlck9wdGlvbnMgZXh0ZW5kcyBSZXF1aXJlZDxQYXRoc09wdGlvbnM+LFxuICBDYWxsT3B0aW9ucyBleHRlbmRzIFJlY3Vyc2l2ZVBhdGhzT3B0aW9ucyxcbj4gPSBJc05ldmVyPGtleW9mIFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IG5ldmVyXG4gIDogLy8gYE5vbk51bGxhYmxlYCByZW1vdmVzIGB1bmRlZmluZWRgIHdoZW4gcGFydGlhbCBwcm9wZXJ0aWVzIGV4aXN0IGluIG9iamVjdFxuICAgIE5vbk51bGxhYmxlPFxuICAgICAgVmFsdWVPZjx7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgP1xuICAgICAgICAgICAgICB8IGAke0FueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSwgVXNlck9wdGlvbnM+fWBcbiAgICAgICAgICAgICAgfCAoQ2FsbE9wdGlvbnNbXCJkZXB0aFwiXVtcImxlbmd0aFwiXSBleHRlbmRzIFVzZXJPcHRpb25zW1wiZGVwdGhcIl1cbiAgICAgICAgICAgICAgICAgID8gLy8gU3RvcCBhdCB0aGUgY29uZmlndXJlZCBkZXB0aFxuICAgICAgICAgICAgICAgICAgICBuZXZlclxuICAgICAgICAgICAgICAgICAgOiBUeXBlW0tleV0gZXh0ZW5kcyBpbmZlciBWYWx1ZVxuICAgICAgICAgICAgICAgICAgPyBWYWx1ZSBleHRlbmRzIFZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gLy8gQXZvaWQgY2FsbGluZyBgVW5zYWZlUGF0aHNgIHRvIGtlZXAgYENhbGxPcHRpb25zYCBsb2NhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgSGFzUGFyc2FibGVQYXRoPFZhbHVlPiBleHRlbmRzIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICA/IFJlY3Vyc2l2ZVBhdGhzPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogQXBwZW5kPENhbGxPcHRpb25zW1wiZGVwdGhcIl0+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+IGV4dGVuZHMgaW5mZXIgUmVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBJc05ldmVyPFJlc3Q+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogUmVzdCBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7QW55QXJyYXlJbmRleEFjY2Vzc29yT3JLZXk8S2V5LCBVc2VyT3B0aW9ucz59LiR7UmVzdH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICA6IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgIDogbmV2ZXIpXG4gICAgICAgICAgOiBuZXZlcjtcbiAgICAgIH0+XG4gICAgPjtcblxudHlwZSBVbnNhZmVQYXRoczxUeXBlLCBPcHRpb25zIGV4dGVuZHMgUmVxdWlyZWQ8UGF0aHNPcHRpb25zPj4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIHRydWVcbiAgICA/IFJlY3Vyc2l2ZVBhdGhzPFR5cGUsIE9wdGlvbnMsIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnM+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIEFueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSBleHRlbmRzIFBhdGhhYmxlLCBVc2VyT3B0aW9ucyBleHRlbmRzIFJlcXVpcmVkPFBhdGhzT3B0aW9ucz4+ID0gS2V5IGV4dGVuZHMgbnVtYmVyXG4gID8gS2V5IHwgVXNlck9wdGlvbnNbXCJhbnlBcnJheUluZGV4QWNjZXNzb3JcIl1cbiAgOiBLZXk7XG5cbmV4cG9ydCB0eXBlIFBhdGhzPFR5cGUsIE92ZXJyaWRlUGF0aE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBhdGhzT3B0aW9ucz4gPSB7fT4gPSBVbnNhZmVQYXRoczxcbiAgVHlwZSxcbiAgQ3JlYXRlVHlwZU9wdGlvbnM8UGF0aHNPcHRpb25zLCBPdmVycmlkZVBhdGhPcHRpb25zLCBEZWZhdWx0UGF0aHNPcHRpb25zPlxuPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQaWNrUHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IEtleSA6IG5ldmVyXTogVHlwZVtLZXldO1xufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJldHRpZnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFByZXR0aWZ5PFR5cGU+ID0gVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gID8gVHlwZVxuICA6IEV4dHJhY3Q8XG4gICAgICB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IFR5cGVbS2V5XTtcbiAgICAgIH0sXG4gICAgICBUeXBlXG4gICAgPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2FmZS1kaWN0aW9uYXJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXlvZkJhc2UgfSBmcm9tIFwiLi4va2V5LW9mLWJhc2VcIjtcblxuZXhwb3J0IHR5cGUgU2FmZURpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c10/OiBUeXBlIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdW5pb24tdG8taW50ZXJzZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9IChVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6IFVuaW9uKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIEludGVyc2VjdGlvbixcbikgPT4gdm9pZFxuICA/IEludGVyc2VjdGlvblxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdmFsdWUtb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55RnVuY3Rpb24gfSBmcm9tIFwiLi4vYW55LWZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiLi4vcHJpbWl0aXZlXCI7XG5cbmV4cG9ydCB0eXBlIFZhbHVlT2Y8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlBcnJheVxuICA/IFR5cGVbbnVtYmVyXVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlGdW5jdGlvblxuICA/IFJldHVyblR5cGU8VHlwZT5cbiAgOiBUeXBlW2tleW9mIFR5cGVdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIveG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gV2hlbiBUeXBlMiBpcyB1bmtub3duLCBpdCBjcmVhdGVzIHR5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBleGNsdWRlZCBmcm9tIGl0XG4vLyBlLmcuIFdpdGhvdXQ8eyBmb286IG51bWJlcjsgYmFyOiBudW1iZXIgfSwgdW5rbm93bj4gaXMgeyBmb28/OiBuZXZlcjsgYmFyPzogbmV2ZXIgfVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RzLWVzc2VudGlhbHMvdHMtZXNzZW50aWFscy9pc3N1ZXMvNDAwXG5cbnR5cGUgV2l0aG91dDxUeXBlMSwgVHlwZTI+ID0gSXNVbmtub3duPFR5cGUyPiBleHRlbmRzIHRydWVcbiAgPyBuZXZlclxuICA6IHsgW1AgaW4gRXhjbHVkZTxrZXlvZiBUeXBlMSwga2V5b2YgVHlwZTI+XT86IG5ldmVyIH07XG5cbi8vIFRoaXMgdXRpbGl0eSB0eXBlIGJvZHkgaXMgYXV0b2dlbmVyYXRlZCBpbiBKUyBieSBydW5uaW5nOlxuLy8gY29uc3QgdHlwZXMgPSBBcnJheSg1MCkuZmlsbCgwKS5tYXAoKF8sIGluZGV4KSA9PiBgVHlwZSR7aW5kZXggKyAxfWApXG4vLyB0eXBlcy5tYXAodHlwZSA9PiBgV2l0aG91dDwke3R5cGVzLmZpbHRlcih0ID0+IHQgIT09IHR5cGUpLmpvaW4oJyYnKX0sICR7dHlwZX0+ICYgJHt0eXBlfWApLmpvaW4oJ3wnKVxuZXhwb3J0IHR5cGUgWE9SPFxuICBUeXBlMSxcbiAgVHlwZTIsXG4gIFR5cGUzID0gdW5rbm93bixcbiAgVHlwZTQgPSB1bmtub3duLFxuICBUeXBlNSA9IHVua25vd24sXG4gIFR5cGU2ID0gdW5rbm93bixcbiAgVHlwZTcgPSB1bmtub3duLFxuICBUeXBlOCA9IHVua25vd24sXG4gIFR5cGU5ID0gdW5rbm93bixcbiAgVHlwZTEwID0gdW5rbm93bixcbiAgVHlwZTExID0gdW5rbm93bixcbiAgVHlwZTEyID0gdW5rbm93bixcbiAgVHlwZTEzID0gdW5rbm93bixcbiAgVHlwZTE0ID0gdW5rbm93bixcbiAgVHlwZTE1ID0gdW5rbm93bixcbiAgVHlwZTE2ID0gdW5rbm93bixcbiAgVHlwZTE3ID0gdW5rbm93bixcbiAgVHlwZTE4ID0gdW5rbm93bixcbiAgVHlwZTE5ID0gdW5rbm93bixcbiAgVHlwZTIwID0gdW5rbm93bixcbiAgVHlwZTIxID0gdW5rbm93bixcbiAgVHlwZTIyID0gdW5rbm93bixcbiAgVHlwZTIzID0gdW5rbm93bixcbiAgVHlwZTI0ID0gdW5rbm93bixcbiAgVHlwZTI1ID0gdW5rbm93bixcbiAgVHlwZTI2ID0gdW5rbm93bixcbiAgVHlwZTI3ID0gdW5rbm93bixcbiAgVHlwZTI4ID0gdW5rbm93bixcbiAgVHlwZTI5ID0gdW5rbm93bixcbiAgVHlwZTMwID0gdW5rbm93bixcbiAgVHlwZTMxID0gdW5rbm93bixcbiAgVHlwZTMyID0gdW5rbm93bixcbiAgVHlwZTMzID0gdW5rbm93bixcbiAgVHlwZTM0ID0gdW5rbm93bixcbiAgVHlwZTM1ID0gdW5rbm93bixcbiAgVHlwZTM2ID0gdW5rbm93bixcbiAgVHlwZTM3ID0gdW5rbm93bixcbiAgVHlwZTM4ID0gdW5rbm93bixcbiAgVHlwZTM5ID0gdW5rbm93bixcbiAgVHlwZTQwID0gdW5rbm93bixcbiAgVHlwZTQxID0gdW5rbm93bixcbiAgVHlwZTQyID0gdW5rbm93bixcbiAgVHlwZTQzID0gdW5rbm93bixcbiAgVHlwZTQ0ID0gdW5rbm93bixcbiAgVHlwZTQ1ID0gdW5rbm93bixcbiAgVHlwZTQ2ID0gdW5rbm93bixcbiAgVHlwZTQ3ID0gdW5rbm93bixcbiAgVHlwZTQ4ID0gdW5rbm93bixcbiAgVHlwZTQ5ID0gdW5rbm93bixcbiAgVHlwZTUwID0gdW5rbm93bixcbj4gPSBQcmV0dGlmeTxcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMVxuICAgID4gJlxuICAgICAgVHlwZTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTJcbiAgICA+ICZcbiAgICAgIFR5cGUyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzXG4gICAgPiAmXG4gICAgICBUeXBlMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNFxuICAgID4gJlxuICAgICAgVHlwZTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTVcbiAgICA+ICZcbiAgICAgIFR5cGU1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU2XG4gICAgPiAmXG4gICAgICBUeXBlNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlN1xuICAgID4gJlxuICAgICAgVHlwZTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZThcbiAgICA+ICZcbiAgICAgIFR5cGU4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU5XG4gICAgPiAmXG4gICAgICBUeXBlOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxMFxuICAgID4gJlxuICAgICAgVHlwZTEwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTExXG4gICAgPiAmXG4gICAgICBUeXBlMTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTJcbiAgICA+ICZcbiAgICAgIFR5cGUxMilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxM1xuICAgID4gJlxuICAgICAgVHlwZTEzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE0XG4gICAgPiAmXG4gICAgICBUeXBlMTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTVcbiAgICA+ICZcbiAgICAgIFR5cGUxNSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxNlxuICAgID4gJlxuICAgICAgVHlwZTE2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE3XG4gICAgPiAmXG4gICAgICBUeXBlMTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMThcbiAgICA+ICZcbiAgICAgIFR5cGUxOClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxOVxuICAgID4gJlxuICAgICAgVHlwZTE5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIwXG4gICAgPiAmXG4gICAgICBUeXBlMjApXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjFcbiAgICA+ICZcbiAgICAgIFR5cGUyMSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyMlxuICAgID4gJlxuICAgICAgVHlwZTIyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIzXG4gICAgPiAmXG4gICAgICBUeXBlMjMpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjRcbiAgICA+ICZcbiAgICAgIFR5cGUyNClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyNVxuICAgID4gJlxuICAgICAgVHlwZTI1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI2XG4gICAgPiAmXG4gICAgICBUeXBlMjYpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjdcbiAgICA+ICZcbiAgICAgIFR5cGUyNylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyOFxuICAgID4gJlxuICAgICAgVHlwZTI4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI5XG4gICAgPiAmXG4gICAgICBUeXBlMjkpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzBcbiAgICA+ICZcbiAgICAgIFR5cGUzMClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzMVxuICAgID4gJlxuICAgICAgVHlwZTMxKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTMyXG4gICAgPiAmXG4gICAgICBUeXBlMzIpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzNcbiAgICA+ICZcbiAgICAgIFR5cGUzMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzNFxuICAgID4gJlxuICAgICAgVHlwZTM0KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM1XG4gICAgPiAmXG4gICAgICBUeXBlMzUpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzZcbiAgICA+ICZcbiAgICAgIFR5cGUzNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzN1xuICAgID4gJlxuICAgICAgVHlwZTM3KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM4XG4gICAgPiAmXG4gICAgICBUeXBlMzgpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzlcbiAgICA+ICZcbiAgICAgIFR5cGUzOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0MFxuICAgID4gJlxuICAgICAgVHlwZTQwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQxXG4gICAgPiAmXG4gICAgICBUeXBlNDEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDJcbiAgICA+ICZcbiAgICAgIFR5cGU0MilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0M1xuICAgID4gJlxuICAgICAgVHlwZTQzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ0XG4gICAgPiAmXG4gICAgICBUeXBlNDQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDVcbiAgICA+ICZcbiAgICAgIFR5cGU0NSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0NlxuICAgID4gJlxuICAgICAgVHlwZTQ2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ3XG4gICAgPiAmXG4gICAgICBUeXBlNDcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDhcbiAgICA+ICZcbiAgICAgIFR5cGU0OClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0OVxuICAgID4gJlxuICAgICAgVHlwZTQ5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5LFxuICAgICAgVHlwZTUwXG4gICAgPiAmXG4gICAgICBUeXBlNTApXG4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1vcHRpb25hbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1hcmtPcHRpb25hbDxUeXBlLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IFByZXR0aWZ5PFBhcnRpYWw8VHlwZT4gJiBSZXF1aXJlZDxPbWl0PFR5cGUsIEtleXMgfCBPcHRpb25hbEtleXM8VHlwZT4+Pj5cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSBcIi4uL3dyaXRhYmxlXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrUmVhZG9ubHk8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgS2V5cyB8IFJlYWRvbmx5S2V5czxUeXBlICYgb2JqZWN0Pj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuZXhwb3J0IHR5cGUgTWFya1JlcXVpcmVkPFR5cGUsIEtleXMgZXh0ZW5kcyBrZXlvZiBUeXBlPiA9IFR5cGUgZXh0ZW5kcyBUeXBlXG4gID8gUHJldHRpZnk8VHlwZSAmIFJlcXVpcmVkPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwiLi4vd3JpdGFibGVcIjtcbmltcG9ydCB7IFdyaXRhYmxlS2V5cyB9IGZyb20gXCIuLi93cml0YWJsZS1rZXlzXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrV3JpdGFibGU8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBXcml0YWJsZUtleXM8VHlwZSAmIG9iamVjdD4gfCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbGRhYmxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWVwUGFydGlhbCB9IGZyb20gXCIuLi9kZWVwLXBhcnRpYWxcIjtcbmltcG9ydCB7IERlZXBXcml0YWJsZSB9IGZyb20gXCIuLi9kZWVwLXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIEJ1aWxkYWJsZTxUeXBlPiA9IERlZXBQYXJ0aWFsPERlZXBXcml0YWJsZTxUeXBlPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLW9wdGlvbmFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtPcHRpb25hbCB9IGZyb20gXCIuLi9tYXJrLW9wdGlvbmFsXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWxTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtPcHRpb25hbDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8UmVjdXJzaXZlRGVlcE1hcmtPcHRpb25hbFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya09wdGlvbmFsPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLXJlcXVpcmVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtSZXF1aXJlZCB9IGZyb20gXCIuLi9tYXJrLXJlcXVpcmVkXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWRTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtSZXF1aXJlZDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8UmVjdXJzaXZlRGVlcE1hcmtSZXF1aXJlZFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya1JlcXVpcmVkPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1ub24tbnVsbGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWx0aW4gfSBmcm9tIFwiLi4vYnVpbHQtaW5cIjtcblxuZXhwb3J0IHR5cGUgRGVlcE5vbk51bGxhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBOb25OdWxsYWJsZTxUeXBlPlxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IE1hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seU1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcE5vbk51bGxhYmxlPEtleXM+LCBEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlcz5cbiAgPyBQcm9taXNlPERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcE5vbk51bGxhYmxlPFR5cGVbS2V5XT4gfVxuICA6IE5vbk51bGxhYmxlPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1udWxsYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwTnVsbGFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCBudWxsXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwTnVsbGFibGU8S2V5cz4sIERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrTWFwIGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPEtleXM+IGV4dGVuZHMgb2JqZWN0XG4gICAgPyBXZWFrTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrU2V0IGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPFZhbHVlcz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtTZXQ8RGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBUeXBlIGV4dGVuZHMgSXNUdXBsZTxUeXBlPlxuICAgID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB8IG51bGwgfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICAgIDogUmVhZG9ubHlBcnJheTxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBWYWx1ZT5cbiAgPyBQcm9taXNlPERlZXBOdWxsYWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB9XG4gIDogVHlwZSB8IG51bGw7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1vbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwT21pdDxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcE9taXQ8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyXG4gICAgICAgID8gRmlsdGVyW0tleV0gZXh0ZW5kcyB0cnVlXG4gICAgICAgICAgPyBuZXZlclxuICAgICAgICAgIDogS2V5XG4gICAgICAgIDogS2V5XTogS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gRGVlcE9taXQ8VHlwZVtLZXldLCBGaWx0ZXJbS2V5XT4gOiBUeXBlW0tleV07XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1wYXJ0aWFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFeGNsdWRlPEJ1aWx0aW4sIEVycm9yPlxuICA/IFR5cGVcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFBhcnRpYWw8S2V5cz4sIERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxpbmZlciBWYWx1ZXM+XG4gID8gVHlwZSBleHRlbmRzIElzVHVwbGU8VHlwZT5cbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXT86IERlZXBQYXJ0aWFsPFR5cGVbS2V5XT4gfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUGFydGlhbDxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdPzogRGVlcFBhcnRpYWw8VHlwZVtLZXldPiB9XG4gIDogSXNVbmtub3duPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IHVua25vd25cbiAgOiBQYXJ0aWFsPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1waWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGljazxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcFBpY2s8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICAvLyBpdGVyYXRlIG92ZXIga2V5cyBvZiBUeXBlLCB3aGljaCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQga2V5czogb3B0aW9uYWwsIHJlcXVpcmVkIG9yIHJlYWRvbmx5XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gS2V5IDogbmV2ZXJdOiBGaWx0ZXJbS2V5ICYga2V5b2YgRmlsdGVyXSBleHRlbmRzIHRydWVcbiAgICAgICAgPyBUeXBlW0tleV1cbiAgICAgICAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBGaWx0ZXJcbiAgICAgICAgPyBEZWVwUGljazxUeXBlW0tleV0sIEZpbHRlcltLZXldPlxuICAgICAgICA6IG5ldmVyO1xuICAgIH1cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5pbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUmVhZG9ubHk8VHlwZT4gPSBUeXBlIGV4dGVuZHMgRXhjbHVkZTxCdWlsdGluLCBFcnJvcj5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBSZWFkb25seTxLZXlzPiwgRGVlcFJlYWRvbmx5PFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFdlYWtNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlPlxuICA/IFByb21pc2U8RGVlcFJlYWRvbmx5PFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgQW55QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IElzTmV2ZXI8SXNUdXBsZTxUeXBlPj4gZXh0ZW5kcyBmYWxzZVxuICAgID8geyByZWFkb25seSBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwUmVhZG9ubHk8VHlwZVtLZXldPiB9XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFJlYWRvbmx5PFR5cGVbS2V5XT4gfVxuICA6IElzVW5rbm93bjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyB1bmtub3duXG4gIDogUmVhZG9ubHk8VHlwZT47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHR5cGUgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBSZXF1aXJlZDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFcnJvclxuICA/IFJlcXVpcmVkPFR5cGU+XG4gIDogVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUmVxdWlyZWQ8S2V5cz4sIERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUmVxdWlyZWQ8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBJc05ldmVyPElzVHVwbGU8VHlwZT4+IGV4dGVuZHMgZmFsc2VcbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXS0/OiBEZWVwUmVxdWlyZWQ8VHlwZVtLZXldPiB9XG4gICAgOiBUeXBlIGV4dGVuZHMgQXJyYXk8VmFsdWVzPlxuICAgID8gQXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgOiBUeXBlIGV4dGVuZHMge31cbiAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV0tPzogRGVlcFJlcXVpcmVkPFR5cGVbS2V5XT4gfVxuICA6IFJlcXVpcmVkPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC11bmRlZmluYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwVW5kZWZpbmFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCB1bmRlZmluZWRcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBVbmRlZmluYWJsZTxLZXlzPiwgRGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtNYXAga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8S2V5cz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBVbmRlZmluYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtTZXQga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPiBleHRlbmRzIG9iamVjdFxuICAgID8gV2Vha1NldDxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IFR5cGUgZXh0ZW5kcyBJc1R1cGxlPFR5cGU+XG4gICAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBVbmRlZmluYWJsZTxUeXBlW0tleV0+IHwgdW5kZWZpbmVkIH1cbiAgICA6IFR5cGUgZXh0ZW5kcyBBcnJheTxWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwVW5kZWZpbmFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFVuZGVmaW5hYmxlPFR5cGVbS2V5XT4gfVxuICA6IFR5cGUgfCB1bmRlZmluZWQ7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNVbmtub3duIH0gZnJvbSBcIi4uL2lzLXVua25vd25cIjtcblxuZXhwb3J0IHR5cGUgRGVlcFdyaXRhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEV4Y2x1ZGU8QnVpbHRpbiwgRXJyb3I+XG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5LCBpbmZlciBWYWx1ZT5cbiAgPyBNYXA8RGVlcFdyaXRhYmxlPEtleT4sIERlZXBXcml0YWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gTWFwPERlZXBXcml0YWJsZTxLZXk+LCBEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gV2Vha01hcDxEZWVwV3JpdGFibGU8S2V5PiwgRGVlcFdyaXRhYmxlPFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgLXJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBXcml0YWJsZTxUeXBlW0tleV0+IH1cbiAgOiBJc1Vua25vd248VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gdW5rbm93blxuICA6IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtb21pdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcE9taXQgfSBmcm9tIFwiLi4vZGVlcC1vbWl0XCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBPbWl0PFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcE9taXQ8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtcGljay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcFBpY2sgfSBmcm9tIFwiLi4vZGVlcC1waWNrXCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBQaWNrPFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcFBpY2s8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3B0aW9uYWwta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgT3B0aW9uYWxLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IGtleW9mIHtcbiAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlIGV4dGVuZHMgUmVxdWlyZWQ8UGljazxUeXBlLCBLZXk+PiA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1rZXlzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaWNrUHJvcGVydGllcyB9IGZyb20gXCIuLi9waWNrLXByb3BlcnRpZXNcIjtcblxuZXhwb3J0IHR5cGUgUGlja0tleXM8VHlwZSwgVmFsdWU+ID0ga2V5b2YgUGlja1Byb3BlcnRpZXM8VHlwZSwgVmFsdWU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHkta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNGdWxseVdyaXRhYmxlIH0gZnJvbSBcIi4uL2lzLWZ1bGx5LXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFJlYWRvbmx5S2V5czxUeXBlIGV4dGVuZHMgb2JqZWN0PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duXG4gID8ga2V5b2Yge1xuICAgICAgW0tleSBpbiBrZXlvZiBUeXBlIGFzIElzRnVsbHlXcml0YWJsZTxQaWNrPFR5cGUsIEtleT4+IGV4dGVuZHMgdHJ1ZSA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVxdWlyZWQta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIE9wdGlvbmFsS2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcblxuZXhwb3J0IHR5cGUgV3JpdGFibGVLZXlzPFR5cGUgZXh0ZW5kcyBvYmplY3Q+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIFJlYWRvbmx5S2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXhhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueVJlY29yZCB9IGZyb20gXCIuLi9hbnktcmVjb3JkXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5cbnR5cGUgSXNVbmlvbjxUVW5pb24+ID0gVW5pb25Ub1R1cGxlPFRVbmlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAxID8gZmFsc2UgOiB0cnVlO1xuXG50eXBlIFVuaW9uVG9GdW5jdGlvbkluc2VydGlvbjxUVW5pb24+ID0gKFRVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6ICgpID0+IFRVbmlvbikgPT4gYW55IDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIFRQYXJhbSxcbikgPT4gYW55XG4gID8gVFBhcmFtXG4gIDogbmV2ZXI7XG5cbi8vIE5PVEU6IFdoZW4gcmVwbGFjaW5nIHRoZSB1dGlsaXR5IHR5cGUgd2l0aCBgVW5pb25Ub1R1cGxlYCBmcm9tIGAuLi91bmlvbi10by10dXBsZWAsXG4vLyBgaXNCQyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgaXNCQ2AgYWxsb3dzIGBCQyB8IHtyZWFkb25seSBiOiAyO3JlYWRvbmx5IGM6IDM7fWAgYXMgcGFyYW1ldGVyPz8/XG50eXBlIFVuaW9uVG9UdXBsZTxUVW5pb24+ID0gVW5pb25Ub0Z1bmN0aW9uSW5zZXJ0aW9uPFRVbmlvbj4gZXh0ZW5kcyAoKSA9PiBpbmZlciBUUmV0dXJuVHlwZVxuICA/IFsuLi5VbmlvblRvVHVwbGU8RXhjbHVkZTxUVW5pb24sIFRSZXR1cm5UeXBlPj4sIFRSZXR1cm5UeXBlXVxuICA6IFtdO1xuXG50eXBlIEV4YWN0VW5pb25MZW5ndGg8VFZhbHVlLCBUU2hhcGU+ID0gVW5pb25Ub1R1cGxlPFRWYWx1ZT5bXCJsZW5ndGhcIl0gZXh0ZW5kcyBVbmlvblRvVHVwbGU8VFNoYXBlPltcImxlbmd0aFwiXVxuICA/IHRydWVcbiAgOiBmYWxzZTtcblxuLy8gTk9URTogYFhPUmAgY2Fubm90IGJlIHVzZWQgYXMgaXQncyBvbmx5IGhhbmR5IHdpdGggb2JqZWN0cywgbm90IGJvb2xlYW5zXG50eXBlIEJvb2xlYW5Yb3I8VCwgVT4gPSBUIGV4dGVuZHMgdHJ1ZSA/IChVIGV4dGVuZHMgdHJ1ZSA/IHRydWUgOiBmYWxzZSkgOiBVIGV4dGVuZHMgZmFsc2UgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgQm9vbGVhbkFuZDxUVHVwbGU+ID0gVFR1cGxlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFJlc3RdXG4gID8gSGVhZCBleHRlbmRzIHRydWVcbiAgICA/IEJvb2xlYW5BbmQ8UmVzdD5cbiAgICA6IGZhbHNlXG4gIDogVFR1cGxlIGV4dGVuZHMgW11cbiAgPyB0cnVlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gQm9vbGVhbkFuZDxcbiAgW0lzTmV2ZXI8RXhjbHVkZTxrZXlvZiBUVmFsdWUsIGtleW9mIFRTaGFwZT4+LCBJc05ldmVyPEV4Y2x1ZGU8a2V5b2YgVFNoYXBlLCBrZXlvZiBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0VmFsdWVEaWZmPFRWYWx1ZSwgVFNoYXBlPiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVFZhbHVlXTogRXhjbHVkZTxUVmFsdWVbVEtleV0sIFRTaGFwZVtUS2V5ICYga2V5b2YgVFNoYXBlXT47XG59W2tleW9mIFRWYWx1ZV07XG5cbnR5cGUgT2JqZWN0VmFsdWVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBCb29sZWFuQW5kPFxuICBbSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFZhbHVlLCBUU2hhcGU+PiwgSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFNoYXBlLCBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbVFNoYXBlXVxuICA/IEJvb2xlYW5BbmQ8XG4gICAgICBbXG4gICAgICAgIEJvb2xlYW5Yb3I8SXNVbmlvbjxUVmFsdWU+LCBJc1VuaW9uPFRTaGFwZT4+LFxuICAgICAgICBFeGFjdFVuaW9uTGVuZ3RoPFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgICAgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+LFxuICAgICAgICBPYmplY3RWYWx1ZUV4YWN0PFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgIF1cbiAgICA+IGV4dGVuZHMgdHJ1ZVxuICAgID8gVFZhbHVlXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIElzQXJyYXk8VFZhbHVlPiA9IFtUVmFsdWVdIGV4dGVuZHMgW3JlYWRvbmx5IGFueVtdXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1JlYWRvbmx5PFRBcnJheT4gPSBSZWFkb25seTxUQXJyYXk+IGV4dGVuZHMgVEFycmF5ID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFNhbWVMZW5ndGg8VFZhbHVlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFRTaGFwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IElzTmV2ZXI8XG4gIFByaW1pdGl2ZUV4YWN0PFRWYWx1ZVtcImxlbmd0aFwiXSwgVFNoYXBlW1wibGVuZ3RoXCJdPlxuPiBleHRlbmRzIHRydWVcbiAgPyBmYWxzZVxuICA6IHRydWU7XG5cbnR5cGUgQXJyYXlFeGFjdDxUVmFsdWUgZXh0ZW5kcyByZWFkb25seSBhbnlbXSwgVFNoYXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10+ID0gQm9vbGVhbkFuZDxcbiAgW1xuICAgIC8vIGJvdGggYXJyYXlzXG4gICAgSXNBcnJheTxUVmFsdWU+LFxuICAgIElzQXJyYXk8VFNoYXBlPixcbiAgICAvLyBzYW1lIGxlbmd0aFxuICAgIFNhbWVMZW5ndGg8VFZhbHVlLCBUU2hhcGU+LFxuICAgIC8vIGJvdGggcmVhZG9ubHkgb3Igbm90XG4gICAgQm9vbGVhblhvcjxJc1JlYWRvbmx5PFRWYWx1ZT4sIElzUmVhZG9ubHk8VFNoYXBlPj4sXG4gIF1cbj4gZXh0ZW5kcyB0cnVlXG4gID8gW1RWYWx1ZSwgVFNoYXBlXSBleHRlbmRzIFtyZWFkb25seSAoaW5mZXIgVFZhbHVlRWxlbWVudClbXSwgcmVhZG9ubHkgKGluZmVyIFRTaGFwZUVsZW1lbnQpW11dXG4gICAgPyBFeGFjdDxUVmFsdWVFbGVtZW50LCBUU2hhcGVFbGVtZW50PiBleHRlbmRzIFRWYWx1ZUVsZW1lbnRcbiAgICAgID8gVFZhbHVlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBOT1RFOiBXaGVuIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoIGBBcmVOb25EaXN0cmlidXRpdmVFcXVhbDxUVmFsdWUsIFRTaGFwZT4gZXh0ZW5kcyB0cnVlID8gVFZhbHVlIDogbmV2ZXJgLFxuLy8gYGlzQkNvckJDMyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgYmNPckJjM2AgaXMgaW5mZXJyZWQgYXMgYEJDYD8/P1xudHlwZSBQcmltaXRpdmVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBbVFZhbHVlXSBleHRlbmRzIFtUU2hhcGVdID8gKFtUU2hhcGVdIGV4dGVuZHMgW1RWYWx1ZV0gPyBUVmFsdWUgOiBuZXZlcikgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gID8gW1RTaGFwZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gICAgPyBBcnJheUV4YWN0PFRWYWx1ZSwgVFNoYXBlPlxuICAgIDogbmV2ZXJcbiAgOiBbVFZhbHVlXSBleHRlbmRzIFtBbnlSZWNvcmRdXG4gID8gT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+XG4gIDogUHJpbWl0aXZlRXhhY3Q8VFZhbHVlLCBUU2hhcGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtYW55L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTkyNzUyMy9kaXNhbGxvdy1jYWxsLXdpdGgtYW55LzQ5OTI4MzYwIzQ5OTI4MzYwXG5leHBvcnQgdHlwZSBJc0FueTxUeXBlPiA9IDAgZXh0ZW5kcyAxICYgVHlwZSA/IHRydWUgOiBmYWxzZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtbmV2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzTmV2ZXI8VHlwZT4gPSBbVHlwZV0gZXh0ZW5kcyBbbmV2ZXJdID8gdHJ1ZSA6IGZhbHNlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdW5rbm93bi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNBbnkgfSBmcm9tIFwiLi4vaXMtYW55XCI7XG5cbmV4cG9ydCB0eXBlIElzVW5rbm93bjxUeXBlPiA9IElzQW55PFR5cGU+IGV4dGVuZHMgdHJ1ZSA/IGZhbHNlIDogdW5rbm93biBleHRlbmRzIFR5cGUgPyB0cnVlIDogZmFsc2U7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzVHVwbGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPyAoYW55W10gZXh0ZW5kcyBUeXBlID8gbmV2ZXIgOiBUeXBlKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LW9iamVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgTm9uRW1wdHlPYmplY3Q8T2JqZWN0IGV4dGVuZHMgQW55UmVjb3JkPiA9IGtleW9mIE9iamVjdCBleHRlbmRzIG5ldmVyID8gbmV2ZXIgOiBPYmplY3Q7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlBcnJheTxUeXBlID0gYW55PiA9IEFycmF5PFR5cGU+IHwgUmVhZG9ubHlBcnJheTxUeXBlPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBcnJheU9yU2luZ2xlPFR5cGU+ID0gVHlwZSB8IFR5cGVbXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZWxlbWVudC1vZi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRWxlbWVudE9mPFR5cGUgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgKGluZmVyIFZhbHVlcylbXSA/IFZhbHVlcyA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaGVhZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIEhlYWQ8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duID8gKFR5cGVbXCJsZW5ndGhcIl0gZXh0ZW5kcyAwID8gbmV2ZXIgOiBUeXBlWzBdKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFR5cGU+ID0gW1R5cGUsIC4uLlR5cGVbXV07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHktYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBSZWFkb25seUFycmF5T3JTaW5nbGU8VHlwZT4gPSBUeXBlIHwgcmVhZG9ubHkgVHlwZVtdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdGFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIFRhaWw8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyByZWFkb25seSBbXVxuICA/IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IFthbnk/LCAuLi5pbmZlciBSZXN0XVxuICA/IFJlc3RcbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFR1cGxlPFR5cGUgPSBhbnk+ID0gW1R5cGU/LCAuLi5UeXBlW11dO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvY2FtZWwtY2FzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsidHlwZSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBmYWxzZSA6IHRydWUpIDogZmFsc2U7XG5cbnR5cGUgV29yZEluQ2FtZWxDYXNlPFR5cGUsIFdvcmQgZXh0ZW5kcyBzdHJpbmcgPSBcIlwiPiA9IFR5cGUgZXh0ZW5kcyBgJHtXb3JkfSR7aW5mZXIgTmV4dENoYXJhY3Rlcn0ke2luZmVyIF99YFxuICA/IE5leHRDaGFyYWN0ZXIgZXh0ZW5kcyBDYXBpdGFsaXplPE5leHRDaGFyYWN0ZXI+XG4gICAgPyBXb3JkXG4gICAgOiBXb3JkSW5DYW1lbENhc2U8VHlwZSwgYCR7V29yZH0ke05leHRDaGFyYWN0ZXJ9YD5cbiAgOiBXb3JkO1xuXG50eXBlIFNlcGFyYXRvciA9IFwiX1wiIHwgXCItXCI7XG5cbnR5cGUgSW5jbHVkZXNTZXBhcmF0b3I8VHlwZT4gPSBUeXBlIGV4dGVuZHMgYCR7c3RyaW5nfSR7U2VwYXJhdG9yfSR7c3RyaW5nfWAgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNPbmVXb3JkPFR5cGU+ID0gVHlwZSBleHRlbmRzIExvd2VyY2FzZTxUeXBlICYgc3RyaW5nPlxuICA/IHRydWVcbiAgOiBUeXBlIGV4dGVuZHMgVXBwZXJjYXNlPFR5cGUgJiBzdHJpbmc+XG4gID8gdHJ1ZVxuICA6IGZhbHNlO1xuXG50eXBlIElzQ2FtZWxDYXNlPFR5cGU+ID0gVHlwZSBleHRlbmRzIFVuY2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Bhc2NhbENhc2U8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQ2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxuLyoqIHNuYWtlX2Nhc2UsIENPTlNUQU5UX0NBU0UsIGtlYmFiLWNhc2Ugb3IgQ09CT0wtQ0FTRSAqL1xudHlwZSBTZXBhcmF0b3JDYXNlUGFyc2VyPFxuICBUeXBlLFxuICBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10sXG4+ID0gVHlwZSBleHRlbmRzIGAke2luZmVyIFdvcmR9JHtTZXBhcmF0b3J9JHtpbmZlciBUYWlsfWBcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFRhaWwsIFsuLi5UdXBsZSwgTG93ZXJjYXNlPFdvcmQ+XT5cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgV29yZH1gXG4gID8gWy4uLlR1cGxlLCBMb3dlcmNhc2U8V29yZD5dXG4gIDogVHVwbGU7XG5cbnR5cGUgQ2FtZWxDYXNlUGFyc2VyPFR5cGUsIFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPSBbXT4gPSBUeXBlIGV4dGVuZHMgXCJcIlxuICA/IFR1cGxlXG4gIDogVHlwZSBleHRlbmRzIGAke1dvcmRJbkNhbWVsQ2FzZTxUeXBlPn0ke2luZmVyIFRhaWx9YFxuICA/IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBXb3JkfSR7VGFpbH1gXG4gICAgPyBDYW1lbENhc2VQYXJzZXI8VW5jYXBpdGFsaXplPFRhaWw+LCBbLi4uVHVwbGUsIExvd2VyY2FzZTxXb3JkPl0+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBDb252ZXJ0IGZpcnN0IGNoYXJhY3RlciBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIGxvd2VyY2FzZSBhbmQgcmV1c2UgQ2FtZWxDYXNlUGFyc2VyXG50eXBlIFBhc2NhbENhc2VQYXJzZXI8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gQ2FtZWxDYXNlUGFyc2VyPFVuY2FwaXRhbGl6ZTxUeXBlPj4gOiBuZXZlcjtcblxudHlwZSBTcGxpdEFueUNhc2U8VHlwZT4gPSBJbmNsdWRlc1NlcGFyYXRvcjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNPbmVXb3JkPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFtMb3dlcmNhc2U8VHlwZSAmIHN0cmluZz5dXG4gIDogSXNDYW1lbENhc2U8VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gQ2FtZWxDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNQYXNjYWxDYXNlPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFBhc2NhbENhc2VQYXJzZXI8VHlwZT5cbiAgOiBbXTtcblxudHlwZSBQYXNjYWxDYXBpdGFsaXplcjxUeXBlLCBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IEhlYWQgZXh0ZW5kcyBzdHJpbmdcbiAgICA/IFBhc2NhbENhcGl0YWxpemVyPFRhaWwsIFsuLi5UdXBsZSwgQ2FwaXRhbGl6ZTxIZWFkPl0+XG4gICAgOiBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBUdXBsZT5cbiAgOiBUdXBsZTtcblxudHlwZSBDYW1lbENhcGl0YWxpemVyPFR5cGU+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBGaXJzdCwgLi4uaW5mZXIgVGFpbF0gPyBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBbRmlyc3RdPiA6IFtdO1xuXG50eXBlIEpvaW48VHlwZSwgSm9pbmVkU3RyaW5nIGV4dGVuZHMgc3RyaW5nID0gXCJcIj4gPSBUeXBlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFRhaWxdXG4gID8gSGVhZCBleHRlbmRzIHN0cmluZ1xuICAgID8gSm9pbjxUYWlsLCBgJHtKb2luZWRTdHJpbmd9JHtIZWFkfWA+XG4gICAgOiBKb2luPFRhaWw+XG4gIDogSm9pbmVkU3RyaW5nO1xuXG5leHBvcnQgdHlwZSBDYW1lbENhc2U8VHlwZT4gPSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gZXh0ZW5kcyB0cnVlID8gSm9pbjxDYW1lbENhcGl0YWxpemVyPFNwbGl0QW55Q2FzZTxUeXBlPj4+IDogVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1jYW1lbC1jYXNlLXByb3BlcnRpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbWVsQ2FzZSB9IGZyb20gXCIuLi9jYW1lbC1jYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBDYW1lbENhc2VQcm9wZXJ0aWVzPFR5cGU+ID0gVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGUgYXMgQ2FtZWxDYXNlPEtleT5dOiBEZWVwQ2FtZWxDYXNlUHJvcGVydGllczxUeXBlW0tleV0+IH1cbiAgOiBUeXBlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlGdW5jdGlvbjxBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUmV0dXJuVHlwZSA9IGFueT4gPSAoLi4uYXJnczogQXJncykgPT4gUmV0dXJuVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmVkaWNhdGVGdW5jdGlvbiA9ICh4OiBhbnksIC4uLl96OiBhbnlbXSkgPT4geCBpcyBhbnk7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLXR5cGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZWRpY2F0ZUZ1bmN0aW9uIH0gZnJvbSBcIi4uL3ByZWRpY2F0ZS1mdW5jdGlvblwiO1xuXG5leHBvcnQgdHlwZSBQcmVkaWNhdGVUeXBlPFR5cGUgZXh0ZW5kcyBQcmVkaWNhdGVGdW5jdGlvbj4gPSBUeXBlIGV4dGVuZHMgKFxuICB0YXJnZXQ6IGFueSxcbiAgLi4ucmVzdDogYW55W11cbikgPT4gdGFyZ2V0IGlzIGluZmVyIE5hcnJvd2VkVHlwZVxuICA/IE5hcnJvd2VkVHlwZVxuICA6IG5ldmVyO1xuIl19","export class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${value}`);\n }\n}\n","export function assert(condition: any, message: string = \"no additional info provided\"): asserts condition {\n if (!condition) {\n throw new Error(\"Assertion Error: \" + message);\n }\n}\n","export const createFactoryWithConstraint =\n <Constraint>() =>\n <Value extends Constraint>(value: Value): Value =>\n value;\n","import { Exact } from \"../../exact\";\n\nexport const isExact =\n <ExpectedShape>() =>\n <ActualShape>(x: Exact<ActualShape, ExpectedShape>) =>\n x as ExpectedShape;\n","export function noop(..._args: unknown[]): void {}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXdhaXRlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgYnVpbHRpbiBgQXdhaXRlZGAgKi9cbmV4cG9ydCB0eXBlIEF3YWl0ZWQ8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVmFsdWU+ID8gVmFsdWUgOiBuZXZlcjtcbiJdfQ==","// Basic\n\nexport * from \"./primitive\";\nexport * from \"./built-in\";\nexport * from \"./key-of-base\";\nexport * from \"./strict-exclude\";\nexport * from \"./strict-extract\";\nexport * from \"./strict-omit\";\nexport * from \"./writable\";\n\n// Utility types\n\nexport * from \"./async-or-sync\";\nexport * from \"./async-or-sync-type\";\nexport * from \"./dictionary\";\nexport * from \"./dictionary-values\";\nexport * from \"./merge\";\nexport * from \"./merge-n\";\nexport * from \"./newable\";\nexport * from \"./non-never\";\nexport * from \"./omit-properties\";\nexport * from \"./opaque\";\nexport * from \"./path-value\";\nexport * from \"./paths\";\nexport * from \"./pick-properties\";\nexport * from \"./prettify\";\nexport * from \"./safe-dictionary\";\nexport * from \"./union-to-intersection\";\nexport * from \"./value-of\";\nexport * from \"./xor\";\n\n// Mark wrapper types\n\nexport * from \"./mark-optional\";\nexport * from \"./mark-readonly\";\nexport * from \"./mark-required\";\nexport * from \"./mark-writable\";\n\n// Deep wrapper types\n\nexport * from \"./buildable\";\nexport * from \"./deep-mark-optional\";\nexport * from \"./deep-mark-required\";\nexport * from \"./deep-non-nullable\";\nexport * from \"./deep-nullable\";\nexport * from \"./deep-omit\";\nexport * from \"./deep-partial\";\nexport * from \"./deep-pick\";\nexport * from \"./deep-readonly\";\nexport * from \"./deep-required\";\nexport * from \"./deep-undefinable\";\nexport * from \"./deep-writable\";\nexport * from \"./strict-deep-omit\";\nexport * from \"./strict-deep-pick\";\n\n// Key types\n\nexport * from \"./optional-keys\";\nexport * from \"./pick-keys\";\nexport * from \"./readonly-keys\";\nexport * from \"./required-keys\";\nexport * from \"./writable-keys\";\n\n// Type checkers\n\nexport * from \"./exact\";\nexport * from \"./is-any\";\nexport * from \"./is-never\";\nexport * from \"./is-unknown\";\nexport * from \"./is-tuple\";\nexport * from \"./non-empty-object\";\n\n// Arrays and Tuples\n\nexport * from \"./any-array\";\nexport * from \"./array-or-single\";\nexport * from \"./element-of\";\nexport * from \"./head\";\nexport * from \"./non-empty-array\";\nexport * from \"./readonly-array-or-single\";\nexport * from \"./tail\";\nexport * from \"./tuple\";\n\n// Change case\n\nexport * from \"./camel-case\";\nexport * from \"./deep-camel-case-properties\";\n\n// Function types\n\nexport * from \"./any-function\";\nexport * from \"./predicate-function\";\nexport * from \"./predicate-type\";\n\n// Utility functions\n\nexport * from \"./functions/unreachable-case-error\";\nexport * from \"./functions/assert\";\nexport * from \"./functions/create-factory-with-constraint\";\nexport * from \"./functions/is-exact\";\nexport * from \"./functions/noop\";\n\n// Build-in types\n\nexport * from \"./awaited\";\n","import { createContext, useContext, useMemo, useState } from 'react';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index';\nimport { QueryProvider } from './QueryProvider';\nimport { createCofhesdkClient } from '@cofhe/sdk/web';\nimport { FnxFloatingButtonWithProvider } from '@/components/FnxFloatingButton/FnxFloatingButton';\nimport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\nimport { createCofhesdkConfig } from '@/config';\nimport { chains } from '@cofhe/sdk/chains';\nimport { assert } from 'ts-essentials';\nimport type { FloatingButtonPosition } from '@/components/FnxFloatingButton/types';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider(props: CofheProviderProps) {\n const { children, queryClient, publicClient, walletClient } = props;\n\n const config = useMemo(() => {\n // priority: explicit config prop > config from provided client > create default config\n if (props.config) return props.config;\n if (props.cofhesdkClient) {\n assert(config.environment === 'react', 'Provided cofhesdkClient must have react config');\n return props.cofhesdkClient.config;\n }\n return createCofhesdkConfig({ supportedChains: Object.values(chains) });\n }, [props.config, props.cofhesdkClient]);\n\n // use provided client or create a new one out of the config\n const cofhesdkClient = useMemo(\n () => props.cofhesdkClient ?? createCofhesdkClient(config),\n [props.cofhesdkClient, config]\n );\n\n // dynamic values\n const [position, setPosition] = useState<FloatingButtonPosition>(config.react.position);\n const [theme, setTheme] = useState(config.react.initialTheme);\n\n return (\n <CofheContext.Provider\n value={{\n client: cofhesdkClient,\n state: {\n position,\n setPosition,\n theme,\n setTheme,\n },\n }}\n >\n <QueryProvider queryClient={queryClient}>\n <AutoConnect walletClient={walletClient} publicClient={publicClient} />\n <FnxFloatingButtonWithProvider>{children}</FnxFloatingButtonWithProvider>\n </QueryProvider>\n </CofheContext.Provider>\n );\n}\n\nfunction AutoConnect({ walletClient, publicClient }: Pick<CofheProviderProps, 'walletClient' | 'publicClient'>) {\n useCofheAutoConnect({ walletClient, publicClient });\n return null;\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { QueryClient } from '@tanstack/react-query';\nimport { createContext, useContext, useMemo } from 'react';\nimport { shouldPassToErrorBoundary } from './errors';\n\nfunction isNonRetryableError(error: unknown): boolean {\n // NB: be granular here. F.x. no need to retry \"bad permit error\"\n // for now, disable retries on all errors that are whitelisted as handled by the err boundary\n return shouldPassToErrorBoundary(error);\n}\n\n// Internal context to expose the QueryClient used by this module\nconst InternalQueryClientContext = createContext<QueryClient | null>(null);\n\nexport const useInternalQueryClient = (): QueryClient => {\n const qc = useContext(InternalQueryClientContext);\n if (!qc) throw new Error('QueryClient not available. Wrap with CofheProvider/QueryProvider.');\n return qc;\n};\n\nexport const QueryProvider = ({\n children,\n queryClient: overridingQueryClient,\n}: {\n children: React.ReactNode;\n queryClient?: QueryClient;\n}) => {\n // Create a client if not provided\n const queryClient = useMemo(() => {\n if (overridingQueryClient) return overridingQueryClient;\n return new QueryClient({\n defaultOptions: {\n queries: {\n throwOnError: (error) => shouldPassToErrorBoundary(error),\n retry: (failureCount, error) =>\n // default query behavior - 3 retries\n isNonRetryableError(error) ? false : failureCount < 3,\n },\n },\n });\n }, [overridingQueryClient]);\n return <InternalQueryClientContext.Provider value={queryClient}>{children}</InternalQueryClientContext.Provider>;\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n};\n","import * as viemChains from 'viem/chains';\nimport { ETH_ADDRESS, type Token, type Erc20Pair } from '../types/token.js';\nimport type { FheTypeValue } from '@cofhe/sdk';\nimport { isValidElement } from 'react';\n\n// Build a lookup map of chainId -> viem chain (for block explorers, etc.)\nconst viemChainById = Object.values(viemChains).reduce<Record<number, (typeof viemChains)[keyof typeof viemChains]>>(\n (acc, chain) => {\n if (chain && typeof chain === 'object' && 'id' in chain) {\n acc[chain.id] = chain;\n }\n return acc;\n },\n {}\n);\n\n/**\n * Gets the block explorer URL for a given chain ID\n * @param chainId - The chain ID to look up\n * @returns The block explorer base URL, or undefined if not found\n */\nexport const getBlockExplorerUrl = (chainId: number): string | undefined => {\n const chain = viemChainById[chainId];\n return chain?.blockExplorers?.default?.url;\n};\n\n/**\n * Gets the block explorer transaction URL for a given chain ID and transaction hash\n * @param chainId - The chain ID\n * @param hash - The transaction hash\n * @returns The full transaction URL, or undefined if chain not found\n */\nexport const getBlockExplorerTxUrl = (chainId: number, hash: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/tx/${hash}` : undefined;\n};\n\n/**\n * Gets the block explorer address URL for a given chain ID and address\n * @param chainId - The chain ID\n * @param address - The address\n * @returns The full address URL, or undefined if chain not found\n */\nexport const getBlockExplorerAddressUrl = (chainId: number, address: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/address/${address}` : undefined;\n};\n\n/**\n * Gets the block explorer token URL for a given chain ID and token address\n * @param chainId - The chain ID\n * @param tokenAddress - The token contract address\n * @returns The full token URL, or undefined if chain not found\n */\nexport const getBlockExplorerTokenUrl = (chainId: number, tokenAddress: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/token/${tokenAddress}` : undefined;\n};\n\n// ============================================================================\n// Token Helper Functions\n// ============================================================================\n\n/**\n * Check if an erc20Pair address is the native ETH address\n * @param erc20Pair - The ERC20 pair object from token extensions\n * @returns True if the pair address matches ETH_ADDRESS\n */\nexport const isEthPair = (erc20Pair: Erc20Pair | undefined): boolean => {\n if (!erc20Pair) return false;\n return erc20Pair.address.toLowerCase() === ETH_ADDRESS.toLowerCase();\n};\n\n/**\n * Check if a token is a wrapped ETH token (ConfidentialETH)\n * @param token - The token object\n * @returns True if the token is a wrapped token with ETH as the underlying pair\n */\nexport const isWrappedEthToken = (token: Token): boolean => {\n if (token.extensions.fhenix.confidentialityType !== 'wrapped') return false;\n return isEthPair(token.extensions.fhenix.erc20Pair);\n};\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n {\n label: 'Encrypted Bool',\n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: 'Boolean value (true/false)',\n },\n {\n label: 'Encrypted Uint8',\n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: '8-bit unsigned integer (0 to 255)',\n },\n {\n label: 'Encrypted Uint16',\n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: '16-bit unsigned integer (0 to 65,535)',\n },\n {\n label: 'Encrypted Uint32',\n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: '32-bit unsigned integer (0 to 4,294,967,295)',\n },\n {\n label: 'Encrypted Uint64',\n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: '64-bit unsigned integer (0 to 18,446,744,073,709,551,615)',\n },\n {\n label: 'Encrypted Uint128',\n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: '128-bit unsigned integer',\n },\n {\n label: 'Encrypted Address',\n value: 'address',\n maxValue: null, // Address validation is different\n description: 'Ethereum address (0x...)',\n },\n];\n\nexport const NOOP_CALLBACK = () => () => {};\n\n/**\n * Truncates a hex string (address or hash) to show beginning and end with ellipsis\n * @param value - The hex string to truncate (address, hash, etc.)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated string, or original if too short\n *\n * @example\n * truncateHash('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport const truncateHash = (value: string, start = 6, end = 4): string => {\n if (value.length <= start + end) return value;\n return `${value.slice(0, start)}...${value.slice(-end)}`;\n};\n\n/**\n * Truncates an Ethereum address (alias for truncateHash with address-friendly defaults)\n * @param address - The full Ethereum address (0x...)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated address string, or undefined if address is invalid\n *\n * @example\n * truncateAddress('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport function truncateAddress(\n address: string | undefined | null,\n start: number = 6,\n end: number = 4\n): string | undefined {\n if (!address) return undefined;\n return truncateHash(address, start, end);\n}\n\n/**\n * Sanitizes numeric input to only allow numbers and a single decimal point\n * @param value - The input value to sanitize\n * @returns Sanitized value with only numbers and at most one decimal point\n *\n * @example\n * sanitizeNumericInput('123.45.67') // Returns: '123.4567'\n * sanitizeNumericInput('abc123.45') // Returns: '123.45'\n * sanitizeNumericInput('123') // Returns: '123'\n */\nexport function sanitizeNumericInput(value: string): string {\n // Only allow numbers and decimal point\n const cleaned = value.replace(/[^0-9.]/g, '');\n\n // Ensure only one decimal point\n const parts = cleaned.split('.');\n if (parts.length > 2) {\n return parts[0] + '.' + parts.slice(1).join('');\n }\n\n return cleaned;\n}\n\n/**\n * Formats a timestamp as a relative time string (e.g., \"2 hours ago\")\n * @param timestamp - Unix timestamp in milliseconds\n * @returns Formatted relative time string\n */\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n return 'Just now';\n};\n\nexport const formatExpirationLabel = (expiration?: number) => {\n if (!expiration) {\n return { label: 'Unknown', expired: false, expiringSoon: false };\n }\n\n const now = Math.floor(Date.now() / 1000);\n const diff = expiration - now;\n\n const expired = diff <= 0;\n const expiringSoon = diff <= 1 * 60 * 60;\n if (expired) {\n return { label: 'Expired', expired: true, expiringSoon: false };\n }\n\n const day = 60 * 60 * 24;\n const hour = 60 * 60;\n const minute = 60;\n\n if (diff >= day) {\n const days = Math.ceil(diff / day);\n return { label: `${days} Day${days === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n if (diff >= hour) {\n const hours = Math.ceil(diff / hour);\n return { label: `${hours} Hour${hours === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n const minutes = Math.max(1, Math.ceil(diff / minute));\n return { label: `${minutes} Minute${minutes === 1 ? '' : 's'}`, expired: false, expiringSoon };\n};\n\nexport function isReactNode(data: unknown): data is React.ReactNode {\n // Check for primitive types that are valid React nodes or if it's a valid React element\n if (\n data === null ||\n data === undefined ||\n typeof data === 'string' ||\n typeof data === 'number' ||\n typeof data === 'boolean' ||\n isValidElement(data)\n ) {\n return true;\n }\n\n // Check if it's an array of React nodes (recursive check)\n if (Array.isArray(data)) {\n return data.every(isReactNode);\n }\n\n return false;\n}\n","/**\n * Token types shared across hooks/components/utils.\n *\n * IMPORTANT: Keep this file dependency-free (no imports from hooks/providers/utils)\n * to avoid circular dependencies.\n */\n\nimport type { Address } from 'viem';\n\n/**\n * Special address representing native ETH (used in erc20Pair for ConfidentialETH tokens)\n */\nexport const ETH_ADDRESS = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const;\n\n/**\n * ERC20 pair information for wrapped confidential tokens\n */\nexport type Erc20Pair = {\n /** Address of the underlying ERC20 token (or ETH_ADDRESS for native ETH) */\n address: Address;\n symbol: string;\n decimals: number;\n logoURI?: string;\n};\n\nexport type Token = {\n chainId: number;\n address: `0x${string}`;\n symbol: string;\n decimals: number;\n name: string;\n logoURI?: string;\n extensions: Record<string, unknown> & {\n fhenix: {\n confidentialityType: 'wrapped' | 'pure' | 'dual';\n confidentialValueType: 'uint64' | 'uint128';\n /** ERC20 pair for wrapped tokens - contains underlying token info */\n erc20Pair?: Erc20Pair;\n };\n };\n};\n\n// just a sample token for examples and quick tests\nexport const WETH_SEPOLIA_TOKEN: Token = {\n chainId: 11155111,\n address: '0x87A3effB84CBE1E4caB6Ab430139eC41d156D55A',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\n","import type { FheTypeValue } from '@cofhe/sdk';\n\nexport const logBlockStart = (message: string) => {\n console.log('┌──────────────────┬──────────────────────────────────────────────────');\n console.log(`│ [COFHE] │ ${message}`);\n console.log('├──────────────────┴──────────────────────────────────────────────────');\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log('└─────────────────────────────────────────────────────────────────────');\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return 'ebool';\n case 'uint8':\n return 'euint8';\n case 'uint16':\n return 'euint16';\n case 'uint32':\n return 'euint32';\n case 'uint64':\n return 'euint64';\n case 'uint128':\n return 'euint128';\n case 'address':\n return 'eaddress';\n default:\n return 'unknown';\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? 'true' : 'false';\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + '..' + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n};\n","export enum ErrorCause {\n AttemptToFetchCustomData = 'attempt_to_fetch_custom_data',\n AttemptToFetchConfidentialBalance = 'attempt_to_fetch_confidential_balance',\n}\n\nexport function getErrorCause(error: unknown): ErrorCause | null {\n if (typeof error === 'object' && error !== null && '_cause' in error) {\n return (error as any)._cause as ErrorCause;\n }\n return null;\n}\n\n/**\n * Ensures that the provided error contains a cause that describes the failed operation.\n * If an error already has a cause, it is preserved by chaining it under the new cause node.\n */\nexport function attachCauseToError(error: unknown, cause: ErrorCause) {\n if (typeof error === 'object' && error !== null && 'message' in error) {\n if ('_cause' in error) {\n console.warn('Error already has a cause, chaining causes, not attching new cause', error, ' new cause:', cause);\n }\n (error as any)._cause = cause;\n } else {\n console.warn('Unfamiliar error type, not attaching cause:', error, ' cause:', cause);\n }\n}\n\n/**\n * Wraps a query function so that any thrown error is annotated with a cause message.\n * This keeps the original error instance intact (preserving instanceof checks) while\n * layering a descriptive cause that higher-level handlers can read.\n */\nexport function withQueryErrorCause<TArgs extends unknown[], TResult>(\n errorCause: ErrorCause,\n queryFn: (...args: TArgs) => Promise<TResult> | TResult\n): (...args: TArgs) => Promise<TResult> {\n return async (...args: TArgs): Promise<TResult> => {\n try {\n return await queryFn(...args);\n } catch (error) {\n attachCauseToError(error, errorCause);\n throw error;\n }\n };\n}\n","import {\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type ContractFunctionReturnType,\n type PublicClient,\n} from 'viem';\n\nexport type WaitUntilRpcAwareAndReadContractOptions = {\n onSuccess?: () => void;\n pollingInterval?: number;\n signal?: AbortSignal;\n};\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Waits until an RPC node is aware of a specific `blockHash`, then performs the\n * contract read.\n *\n * Implementation detail: the function issues two RPC calls concurrently:\n * - `eth_getBlockByHash(blockHash)` to confirm the node has the block\n * - `eth_call` (via `publicClient.call`) for the actual contract read\n *\n * If your viem client transport has batching enabled, these concurrent calls are\n * typically sent as a single JSON-RPC batch — which is important when your RPC\n * provider load-balances across nodes.\n */\nexport type ReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = ContractFunctionReturnType<\n TAbi,\n 'pure' | 'view',\n TfunctionName,\n ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>\n>;\nexport async function maybeWaitUntilRpcAwareAndReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n publicClient: PublicClient,\n params: {\n blockHashToBeAwareOf?: `0x${string}`;\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n },\n options: WaitUntilRpcAwareAndReadContractOptions = {}\n): Promise<ReadContractResult<TAbi, TfunctionName>> {\n // if no blockHash given to be aware of, just read directly\n if (!params.blockHashToBeAwareOf)\n return publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n });\n\n const pollingInterval = options.pollingInterval ?? 1_000;\n\n console.log(`Waiting until RPC is aware of block ${params.blockHashToBeAwareOf} to read contract...`);\n let done = false;\n while (!done) {\n if (options.signal?.aborted) throw abortError();\n\n const [blockRes, readRes] = await Promise.allSettled([\n publicClient.request({\n method: 'eth_getBlockByHash',\n params: [params.blockHashToBeAwareOf, false],\n }),\n publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }),\n ]);\n\n const blockKnown = blockRes.status === 'fulfilled' && blockRes.value != null;\n\n if (blockKnown && readRes.status === 'fulfilled') {\n options?.onSuccess?.();\n done = true;\n return readRes.value;\n }\n\n await sleep(pollingInterval, options.signal);\n }\n\n // Unreachable, but keeps TS happy.\n throw new Error('Unexpected exit from wait loop');\n}\n","import { cn } from '@/utils';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\nimport type { FnxStatusVariant } from './types';\n\nconst statusVariantStyles: Record<FnxStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nexport const FloatingButtonComponent: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n const { theme } = useFnxFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { portalOpen } = usePortalUI();\n\n const topStatusVariant = statuses[statuses.length - 1]?.variant;\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'fnx-panel fnx-floating-icon',\n 'w-12 h-12',\n 'flex items-center justify-center cursor-pointer flex-shrink-0',\n 'focus:outline-none',\n statusVariantStyles[topStatusVariant]\n )}\n >\n <div className=\"flex items-center justify-center\">\n {portalOpen && <CloseIcon className=\"w-6 h-6\" />}\n {!portalOpen && <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />}\n </div>\n </button>\n );\n};\n","import { type ReactNode, createContext, useContext } from 'react';\nimport type { FloatingButtonPosition } from './types';\nimport { useCofheContext } from '../../providers';\nimport { useTrackPendingTransactions } from '@/hooks/useTrackPendingTransactions';\nimport { useTrackDecryptingTransactions } from '@/hooks/useTrackDecryptingTransactions';\nimport { useWatchPermitStatus } from '@/hooks/useWatchPermitStatus';\nimport { useWatchClaimablesStatus } from '@/hooks/useWatchClaimablesStatus';\n\nexport type TokenListMode = 'view' | 'select';\n\ninterface FnxFloatingButtonContextValue {\n theme: 'dark' | 'light';\n effectivePosition: FloatingButtonPosition;\n isLeftSide: boolean;\n isTopSide: boolean;\n}\n\nconst FnxFloatingButtonContext = createContext<FnxFloatingButtonContextValue | null>(null);\n\ninterface FnxFloatingButtonProviderProps {\n children?: ReactNode;\n}\n\nexport const FnxFloatingButtonProvider: React.FC<FnxFloatingButtonProviderProps> = ({ children }) => {\n const { state } = useCofheContext();\n\n const theme = state.theme;\n const effectivePosition = state.position;\n const isLeftSide = effectivePosition.includes('left');\n const isTopSide = effectivePosition.includes('top');\n\n useTrackPendingTransactions();\n useTrackDecryptingTransactions();\n useWatchPermitStatus();\n useWatchClaimablesStatus();\n\n return (\n <FnxFloatingButtonContext.Provider\n value={{\n theme,\n effectivePosition,\n isLeftSide,\n isTopSide,\n }}\n >\n {children}\n </FnxFloatingButtonContext.Provider>\n );\n};\n\nexport const useFnxFloatingButtonContext = (): FnxFloatingButtonContextValue => {\n const context = useContext(FnxFloatingButtonContext);\n if (!context) {\n throw new Error('useFnxFloatingButtonContext must be used within FnxFloatingButtonProvider');\n }\n return context;\n};\n","export const BIGINT_JSON_MARKER_KEY = '__bigint__' as const;\n\ntype BigintMarker = { [BIGINT_JSON_MARKER_KEY]: string };\n\ntype JSONReviver = (key: string, value: unknown) => unknown;\ntype JSONReplacer = (key: string, value: unknown) => unknown;\n\nexport const bigintJSONReviver: JSONReviver = (_key, value) => {\n if (typeof value === 'object' && value !== null && BIGINT_JSON_MARKER_KEY in value) {\n return BigInt((value as BigintMarker)[BIGINT_JSON_MARKER_KEY]);\n }\n return value;\n};\n\nexport const bigintJSONReplacer: JSONReplacer = (_key, value) => {\n if (typeof value === 'bigint') {\n return { [BIGINT_JSON_MARKER_KEY]: value.toString() } satisfies BigintMarker;\n }\n return value;\n};\n\nexport const bigintJSONStorageOptions = {\n reviver: bigintJSONReviver,\n replacer: bigintJSONReplacer,\n} as const;\n","import type { Token } from '@/types/token';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\ntype ChainRecord<T> = Record<number, T>;\ntype HashRecord<T> = Record<string, T>;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport enum TransactionStatus {\n Pending = 'pending',\n Failed = 'failed',\n Confirmed = 'confirmed',\n}\nexport type TransactionStatusString = 'Pending' | 'Failed' | 'Confirmed';\n\nexport enum TransactionActionType {\n ShieldSend = 'shieldSend',\n Shield = 'shield',\n Unshield = 'unshield',\n Claim = 'claim',\n}\nexport type TransactionActionString = 'Shielded Transfer' | 'Shield' | 'Unshield' | 'Claim';\n\ntype BaseTransaction = {\n hash: `0x${string}`;\n status: TransactionStatus;\n timestamp: number;\n chainId: number;\n // actionType: Exclude<TransactionActionType, TransactionActionType.Unshield>;\n account: Address;\n\n token: Token;\n //\n\n tokenAmount: bigint;\n isPendingDecryption: boolean;\n};\n\ntype ShieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Shield;\n};\ntype SendingTransaction = BaseTransaction & {\n actionType: TransactionActionType.ShieldSend;\n};\ntype ClaimingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Claim;\n};\n\ntype UnshieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Unshield;\n};\n\nexport type Transaction = UnshieldingTransaction | ShieldingTransaction | SendingTransaction | ClaimingTransaction;\n\ntype NewTransaction = DistributiveOmit<Transaction, 'status' | 'timestamp'>;\n\nexport interface TransactionStore {\n // TODO: should be chainId -> account -> txHash -> Transaction\n transactions: ChainRecord<HashRecord<Transaction>>;\n addTransaction: (transaction: NewTransaction) => void;\n getTransaction: (chainId: number, hash: string) => Transaction | undefined;\n getAllTransactions: (chainId: number, account?: string) => Transaction[];\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string) => Transaction[];\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => void;\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => void;\n clearTransactions: (chainId?: number) => void;\n}\n\nconst actionToStringMap: Record<TransactionActionType, TransactionActionString> = {\n [TransactionActionType.ShieldSend]: 'Shielded Transfer',\n [TransactionActionType.Shield]: 'Shield',\n [TransactionActionType.Unshield]: 'Unshield',\n [TransactionActionType.Claim]: 'Claim',\n};\n\nexport const actionToString = (a: TransactionActionType): TransactionActionString => actionToStringMap[a];\n\nconst statusToStringMap: Record<TransactionStatus, TransactionStatusString> = {\n [TransactionStatus.Pending]: 'Pending',\n [TransactionStatus.Failed]: 'Failed',\n [TransactionStatus.Confirmed]: 'Confirmed',\n};\n\nexport const statusToString = (a: TransactionStatus): TransactionStatusString => statusToStringMap[a];\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<TransactionStore>(() => localStorage, bigintJSONStorageOptions);\n\nfunction constructNewTx(transaction: NewTransaction): Transaction {\n return {\n ...transaction,\n status: TransactionStatus.Pending,\n timestamp: Date.now(),\n };\n}\n\nexport const useTransactionStore = create<TransactionStore>()(\n persist(\n (set, get) => ({\n transactions: {},\n\n addTransaction: (transaction: NewTransaction) => {\n set((state) => {\n const chainTxs = state.transactions[transaction.chainId] || {};\n const pendingTx = constructNewTx(transaction);\n return {\n transactions: {\n ...state.transactions,\n [transaction.chainId]: {\n ...chainTxs,\n [transaction.hash]: pendingTx,\n },\n },\n };\n });\n },\n\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n status,\n // if tx failed, it's no longer pending decryption\n isPendingDecryption: status === TransactionStatus.Failed ? false : chainTxs[hash].isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n getTransaction: (chainId: number, hash: string): Transaction | undefined => {\n return get().transactions[chainId]?.[hash];\n },\n\n getAllTransactions: (chainId: number, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => !account || !tx.account || tx.account.toLowerCase() === account.toLowerCase())\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => {\n return tx.account.toLowerCase() === account?.toLowerCase();\n })\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n clearTransactions: (chainId?: number) => {\n set((state) => {\n if (chainId !== undefined) {\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {},\n },\n };\n }\n return { transactions: {} };\n });\n },\n }),\n {\n name: 'cofhe-transaction-store',\n storage: bigintStorage,\n }\n )\n);\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { CONNECT_STORE_DEFAULTS, type CofhesdkClient, type CofhesdkClientConnectionState } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { NOOP_CALLBACK } from '../utils';\n\nconst subscribeToConnectionConstructor = (client: CofhesdkClient) => (onStoreChange: () => void) => {\n return client.subscribe(() => {\n onStoreChange();\n });\n};\nconst getConnectionSnapshotConstructor = (client: CofhesdkClient) => () => client.getSnapshot();\n\nconst DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;\n\n// sync core store\nexport const useCofheConnection = (): CofhesdkClientConnectionState => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToConnectionConstructor(client),\n getConnectionSnapshot: client && getConnectionSnapshotConstructor(client),\n };\n }, [client]);\n\n return useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n};\n\nexport const useCofheIsConnected = (): boolean => {\n const { connected } = useCofheConnection();\n return connected;\n};\n\nexport const useCofheAccount = (): `0x${string}` | undefined => {\n const { account } = useCofheConnection();\n return account;\n};\n\nexport const useCofheChainId = (): number | undefined => {\n const { chainId } = useCofheConnection();\n return chainId;\n};\n\nexport const useCofheSupportedChains = () => {\n const client = useCofheContext().client;\n return client.config.supportedChains;\n};\n\nexport const useCofhePublicClient = () => useCofheConnection().publicClient;\n\nexport const useCofheWalletClient = () => useCofheConnection().walletClient;\n","import {\n TransactionActionType,\n TransactionStatus,\n useTransactionStore,\n type Transaction,\n} from '@/stores/transactionStore';\nimport { useCofhePublicClient } from './useCofheConnection';\nimport { useInternalQueries, useInternalQueryClient } from '@/providers';\nimport { assert } from 'ts-essentials';\nimport { constructCofheReadContractQueryForInvalidation } from './useCofheReadContract';\nimport { QueryClient, type QueriesOptions } from '@tanstack/react-query';\nimport type { Address, TransactionReceipt } from 'viem';\nimport { getTokenContractConfig } from '@/constants/confidentialTokenABIs';\nimport type { Token } from './useCofheTokenLists';\nimport { constructPublicTokenBalanceQueryKeyForInvalidation } from './useCofheTokenPublicBalance';\nimport { constructUnshieldClaimsQueryKeyForInvalidation, invalidateClaimableQueries } from './useCofheTokenClaimable';\nimport { usePendingTransactions } from './usePendingTransactions';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\nimport { useEffect, useRef } from 'react';\n\nfunction invalidateConfidentialTokenBalanceQueries(token: Token, queryClient: QueryClient) {\n const tokenBalanceQueryKey = constructCofheReadContractQueryForInvalidation({\n cofheChainId: token.chainId,\n address: token.address,\n functionName: getTokenContractConfig(token.extensions.fhenix.confidentialityType).functionName,\n });\n\n console.log('Invalidating shield/send read contract queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n // TODO: it can potentially invalidate irrelevenat queries who happen to belong to the same contract but different function. Not sure if worth fixing\n exact: false,\n });\n}\n\nfunction invalidatePublicTokenBalanceQueries(\n {\n tokenAddress,\n chainId,\n accountAddress,\n }: {\n tokenAddress: Address;\n chainId: number;\n accountAddress: Address;\n },\n queryClient: QueryClient\n) {\n const tokenBalanceQueryKey = constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n accountAddress,\n });\n\n console.log('Invalidating public token balance read contract queries for token:', tokenBalanceQueryKey);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n });\n}\n\nfunction invalidatePublicAndConfidentialTokenBalanceQueries(\n token: Token,\n accountAddress: Address,\n queryClient: QueryClient\n) {\n invalidateConfidentialTokenBalanceQueries(token, queryClient);\n\n const publicPairTokenAddress = token.extensions.fhenix.erc20Pair?.address;\n assert(publicPairTokenAddress, 'Public pair token address is required for shield transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicPairTokenAddress,\n chainId: token.chainId,\n accountAddress,\n },\n queryClient\n );\n}\n\ntype UseTrackPendingTransactionsInput = {\n onReceiptSuccess: (tx: Transaction, receipt: TransactionReceipt) => void;\n onReceiptFail?: (tx: Transaction, receipt: TransactionReceipt) => void;\n onFetchFailure?: (error: unknown, tx: Transaction) => void;\n};\nfunction useTrackPendingTransactionsBase({\n onReceiptSuccess,\n onReceiptFail,\n onFetchFailure,\n}: UseTrackPendingTransactionsInput) {\n // Batch check pending transactions using react-query's useQueries\n const accountsPendingTxs = usePendingTransactions();\n const publicClient = useCofhePublicClient();\n\n const queries: QueriesOptions<TransactionReceipt[]> = accountsPendingTxs.map((tx) => ({\n queryKey: ['tx-receipt', tx.chainId, tx.hash],\n queryFn: async () => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n try {\n const receipt = await publicClient.waitForTransactionReceipt({ hash: tx.hash as `0x${string}` });\n\n const status = receipt.status === 'success' ? TransactionStatus.Confirmed : TransactionStatus.Failed;\n // invalidate if tx was successful\n if (status === TransactionStatus.Confirmed) onReceiptSuccess(tx, receipt);\n else onReceiptFail?.(tx, receipt);\n\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, status);\n\n return receipt;\n } catch (e) {\n onFetchFailure?.(e, tx);\n // no need to invalidate on failure, since nothing has changed on chain\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, TransactionStatus.Failed);\n throw e;\n }\n },\n\n enabled: !!publicClient && accountsPendingTxs.length > 0,\n refetchOnWindowFocus: false,\n refetchOnReconnect: true,\n }));\n useInternalQueries({\n queries,\n });\n}\n\nfunction useHandleInvalidations() {\n const queryClient = useInternalQueryClient();\n\n const { upsert: upsertDecryptionWatcher, byKey } = useDecryptionWatchersStore();\n console.log('Scheduled invalidations store:', byKey);\n const handleInvalidations = (tx: Transaction) => {\n // TODO invalidate gas on all txs since any tx spends gas\n if (tx.actionType === TransactionActionType.ShieldSend) {\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n } else if (tx.actionType === TransactionActionType.Shield) {\n // on shield public balance decreases and private increases\n invalidatePublicAndConfidentialTokenBalanceQueries(tx.token, tx.account, queryClient);\n } else if (tx.actionType === TransactionActionType.Unshield) {\n // on unshield - private balance decreases, claimable increases, public remains the same\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n\n // schedule invalidation for unshield claims once decryption is observed\n upsertDecryptionWatcher({\n key: `${tx.actionType}-tx-${tx.hash}`,\n accountAddress: tx.account,\n createdAt: Date.now(),\n chainId: tx.chainId,\n triggerTxHash: tx.hash,\n queryKeys: [\n constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: tx.token.chainId,\n tokenAddress: tx.token.address,\n confidentialityType: tx.token.extensions.fhenix.confidentialityType,\n accountAddress: tx.account,\n }),\n ],\n });\n } else if (tx.actionType === TransactionActionType.Claim) {\n // on claim - claimable decreases, public increases, private remains the same\n const publicTokenAddress = tx.token.extensions.fhenix.erc20Pair?.address;\n assert(publicTokenAddress, 'Public pair token address is required for claim transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicTokenAddress,\n chainId: tx.token.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n invalidateClaimableQueries({\n token: tx.token,\n accountAddress: tx.account,\n\n queryClient,\n });\n } else {\n // @ts-expect-error actionType = \"never\" at this point\n console.warn('No invalidation logic for transaction action type:', tx.actionType);\n }\n };\n\n return handleInvalidations;\n}\n\nfunction useOnceTransactionSubmitted(onSubmit: (tx: Transaction) => void) {\n const pendingTransactions = usePendingTransactions();\n const previousPendingTxsRef = useRef<Transaction[]>([]);\n\n useEffect(() => {\n const newlySubmittedTxs = pendingTransactions.filter(\n (tx) => !previousPendingTxsRef.current.some((prevTx) => prevTx.hash === tx.hash)\n );\n\n for (const tx of newlySubmittedTxs) {\n onSubmit(tx);\n\n // You can add any additional logic you want to execute once per transaction submission here\n }\n\n previousPendingTxsRef.current = pendingTransactions;\n }, [onSubmit, pendingTransactions]);\n}\n\nexport function useTrackPendingTransactions() {\n const handleInvalidations = useHandleInvalidations();\n const { onTransactionMined, onWatchReceiptFailure, onTransactionSubmitted } = useTransactionGlobalLifecycle();\n\n // 1 tx submitted\n useOnceTransactionSubmitted(onTransactionSubmitted);\n\n useTrackPendingTransactionsBase({\n // 2.a. tx mined successfully\n onReceiptSuccess: (tx, receipt) => {\n handleInvalidations(tx);\n onTransactionMined(tx, receipt);\n },\n // 2.b. tx mined with failure\n onReceiptFail: (tx, receipt) => {\n onTransactionMined(tx, receipt);\n },\n\n // 2.c. fetch failure\n onFetchFailure: (error, tx) => {\n onWatchReceiptFailure(error, tx);\n },\n });\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport {\n type Address,\n type ContractFunctionReturnType,\n type ContractFunctionName,\n type ContractFunctionArgs,\n type ReadContractReturnType,\n} from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheActivePermit } from './useCofhePermits';\nimport { assert } from 'ts-essentials';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { useInternalQueries, useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi, type CofheReturnType, type ContractReturnType } from '@cofhe/abi';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContract';\n\nfunction serializeIfBigint(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n}\n\nfunction serializeBigintRecursively(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(serializeBigintRecursively);\n } else {\n return serializeIfBigint(value);\n }\n}\n\nexport function constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n enabled,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n args?: readonly unknown[];\n requiresPermit?: boolean;\n activePermitHash?: string;\n enabled?: boolean;\n}): readonly unknown[] {\n return [\n ...constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n }),\n\n args ? serializeBigintRecursively(args) : [],\n requiresPermit ? activePermitHash : undefined,\n // normally, \"enabled\" shouldn't be part of queryKey, but without adding it, there is a weird bug: when there's a CofheError, query still running queryFn resulting in the blank screen\n enabled,\n ];\n}\n\nexport function constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n // add more specificity if needed. Just make sure it matches the order of keys\n}): readonly unknown[] {\n return [QUERY_CACHE_PREFIX, cofheChainId, address, functionName];\n}\n\nexport type UseCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = Omit<UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error>, 'queryKey' | 'queryFn'> & {\n enabled?: boolean; // TODO: check callback variant, maybe it'll fix the issue above about forcing enable to be query key\n};\n\nexport function getEnabledForCofheReadContract(params: {\n isCofheErrorActive: boolean;\n publicClient: unknown;\n address?: Address;\n abi?: Abi;\n functionName?: string;\n requiresPermit: boolean;\n hasActivePermit: boolean;\n userEnabled?: boolean;\n}): boolean {\n const { isCofheErrorActive, publicClient, address, abi, functionName, requiresPermit, hasActivePermit, userEnabled } =\n params;\n\n return (\n !isCofheErrorActive &&\n !!publicClient &&\n !!address &&\n !!abi &&\n !!functionName &&\n (!requiresPermit || hasActivePermit) &&\n (userEnabled ?? true)\n );\n}\n\nfunction convertReadContractResultToCofheReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(\n value: ContractFunctionReturnType<TAbi, 'pure' | 'view', TfunctionName, TArgs>\n): ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n> {\n // TODO: convertViemReturnTypeToCofheReturnType -- need core typing changes, currently seems to not support fn overloads\n // viems inferred TArgs mismatch Cofhe's\n return value as ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n >;\n}\n\nexport function createCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(params: {\n enabled: boolean;\n cofheChainId?: number;\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: TArgs;\n requiresPermit: boolean;\n activePermitHash?: string;\n publicClient: ReturnType<typeof useCofhePublicClient>;\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n}): UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error> {\n const {\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n publicClient,\n queryOptions,\n } = params;\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return {\n enabled,\n queryKey: constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash,\n enabled,\n }),\n queryFn: async () => {\n assert(address, 'Contract address should be guaranteed by enabled check');\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(abi, 'ABI should be guaranteed by enabled check');\n assert(functionName, 'Function name should be guaranteed by enabled check');\n\n const out = await publicClient.readContract({\n address,\n abi,\n functionName,\n args,\n });\n\n const convertedOut = convertReadContractResultToCofheReturnType<TAbi, TfunctionName, TArgs>(out);\n\n const transformed = transformEncryptedReturnTypes(abi, functionName, convertedOut);\n\n return transformed;\n },\n ...restQueryOptions,\n };\n}\n\n/**\n * Generic hook: read a contract and return the result (with permit/error gating support).\n * is Cofhe-ABI aware: returns CofheReturnType (but doesn't support TArgs typing yet).\n */\nexport type UseCofheReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = UseQueryResult<CofheReturnType<TAbi, TfunctionName>, Error> & {\n disabledDueToMissingPermit: boolean;\n};\nexport function useCofheReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>\n): UseCofheReadContractResult<TAbi, TfunctionName> {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const isCofheErrorActive = useIsCofheErrorActive();\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const activePermit = useCofheActivePermit();\n\n const enabled = getEnabledForCofheReadContract({\n isCofheErrorActive,\n publicClient,\n address,\n abi,\n functionName,\n requiresPermit,\n hasActivePermit: !!activePermit,\n userEnabled: queryOptions?.enabled,\n });\n\n const result = useInternalQuery(\n createCofheReadContractQueryOptions({\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash: activePermit?.hash,\n publicClient,\n queryOptions,\n })\n );\n\n return {\n ...result,\n disabledDueToMissingPermit: requiresPermit && !activePermit,\n };\n}\n","import type { CofhesdkClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { NOOP_CALLBACK } from '../utils';\nimport { PERMIT_STORE_DEFAULTS, PermitUtils, type Permit } from '@cofhe/sdk/permits';\nimport { useCofheConnection } from './useCofheConnection';\nimport { usePortalToasts } from '@/stores';\n\nconst subscribeToPermitsConstructor = (client: CofhesdkClient) => (onStoreChange: () => void) => {\n return client.permits.subscribe(() => {\n onStoreChange();\n });\n};\n\nconst getPermitsSnapshotConstructor = (client: CofhesdkClient) => () => client.permits.getSnapshot();\n\n// type PermitsState = ReturnType<CofhesdkClientPermits['getSnapshot']>;\n\nconst DEFAULT_SNAPSHOT_GETTER = () => PERMIT_STORE_DEFAULTS;\n\nconst useCofhePermitsStore = () => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToPermitsConstructor(client),\n getConnectionSnapshot: client && getPermitsSnapshotConstructor(client),\n };\n }, [client]);\n\n const state = useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n return { state, client };\n};\n\nexport const useCofheActivePermit = ():\n | {\n hash: string;\n permit: Permit;\n isValid: boolean;\n }\n | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n // active permit\n\n const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : undefined;\n const serialized = hash && allPermits ? allPermits[hash] : undefined;\n\n const permitData = useMemo(() => {\n const _permit = serialized ? PermitUtils.deserialize(serialized) : undefined;\n if (!_permit || !hash) return undefined;\n return {\n permit: _permit,\n isValid: _permit ? PermitUtils.isValid(_permit).valid : false,\n hash,\n };\n }, [serialized, hash]);\n\n return connected ? permitData : undefined;\n};\n\nexport const useCofheActivePermitHash = (): string | undefined => {\n const activePermit = useCofheActivePermit();\n return useMemo(() => activePermit?.hash, [activePermit?.hash]);\n};\n\nexport const useCofheAllPermits = (): { hash: string; permit: Permit }[] => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n\n const allPermitsWithHashes = useMemo(\n () =>\n allPermits\n ? Object.keys(allPermits)\n .filter((hash) => !!allPermits[hash])\n .map((hash) => {\n const serializedPermit = allPermits[hash];\n if (!serializedPermit) throw new Error('Permit data missing');\n\n return {\n hash,\n permit: PermitUtils.deserialize(serializedPermit),\n };\n })\n : [],\n [allPermits]\n );\n\n return connected ? allPermitsWithHashes : [];\n};\n\nexport const useCofheRemovePermit = () => {\n const { account, chainId } = useCofheConnection();\n\n const { client } = useCofhePermitsStore();\n const { addToast } = usePortalToasts();\n\n return useCallback(\n async (hashToRemove: string) => {\n if (!client || !chainId || !account)\n throw new Error('Client, chainId, and account must be defined to remove a permit');\n\n addToast({\n variant: 'info',\n title: 'Permit has been removed',\n description: 'The selected permit has been successfully removed.',\n });\n await client.permits.removePermit(hashToRemove, chainId, account, true);\n },\n [client, chainId, account, addToast]\n );\n};\n\nexport const useCofheSelectPermit = () => {\n const { account, chainId } = useCofheConnection();\n\n const { client } = useCofhePermitsStore();\n\n const { addToast } = usePortalToasts();\n\n return useCallback(\n (hashToSet: string) => {\n if (!client || !chainId || !account)\n throw new Error('Client, chainId, and account must be defined to set active permit hash');\n client.permits.selectActivePermit(hashToSet, chainId, account);\n addToast({\n variant: 'info',\n title: 'Active Permit Updated',\n description: 'The active permit has been updated successfully.',\n });\n },\n [client, chainId, account, addToast]\n );\n};\n","import type {\n OpenPortalModalFn,\n PortalModal,\n PortalModalPropsMap,\n PortalModalState,\n} from '@/components/FnxFloatingButton/modals/types';\nimport { create } from 'zustand';\n\ntype PortalModalStore = {\n modalStack: PortalModalState[];\n};\n\ntype PortalModalActions = {\n openModal: OpenPortalModalFn;\n closeModal: (modal: PortalModal) => void;\n clearAllModals: () => void;\n};\n\nexport const usePortalModals = create<PortalModalStore & PortalModalActions>()((set, get) => ({\n modalStack: [],\n\n openModal: <M extends PortalModal>(\n ...args: PortalModalPropsMap[M] extends void ? [modal: M] : [modal: M, props: PortalModalPropsMap[M]]\n ) => {\n const [modal, props] = args;\n const onClose = () => get().closeModal(modal);\n const modalState = { modal, onClose, ...(props ?? {}) } as PortalModalState;\n set({ modalStack: [...get().modalStack, modalState] });\n },\n closeModal: (modal) => {\n set({ modalStack: get().modalStack.filter((m) => m.modal !== modal) });\n },\n clearAllModals: () => {\n set({ modalStack: [] });\n },\n}));\n","import { useMemo } from 'react';\nimport { create } from 'zustand';\nimport { usePortalStatuses } from './portalStatuses';\n\nconst ANIM_DURATION = 300;\n\ntype PortalUIStore = {\n portalOpen: boolean;\n statusPanelOpen: boolean;\n contentPanelOpen: boolean;\n contentHeights: Array<{ id: string; height: number }>;\n\n openTimeoutId: ReturnType<typeof setTimeout> | null;\n closeTimeoutId: ReturnType<typeof setTimeout> | null;\n};\n\ntype OpenPortalArgs = {\n onOpenBegin?: () => void;\n onOpenEnd?: () => void;\n};\ntype ClosePortalArgs = {\n onCloseBegin?: () => void;\n onCloseEnd?: () => void;\n};\ntype TogglePortalArgs = OpenPortalArgs & ClosePortalArgs;\n\ntype PortalUIActions = {\n clearTimeouts: () => void;\n openPortal: (args?: OpenPortalArgs) => void;\n closePortal: (args?: ClosePortalArgs) => void;\n togglePortal: (args?: TogglePortalArgs) => void;\n\n setContentHeight: (id: string, height: number) => void;\n removeContentHeight: (id: string) => void;\n};\n\nexport const usePortalUI = create<PortalUIStore & PortalUIActions>()((set, get) => ({\n portalOpen: false,\n statusPanelOpen: false,\n contentPanelOpen: false,\n contentHeights: [],\n\n openTimeoutId: null,\n closeTimeoutId: null,\n clearTimeouts: () => {\n const { openTimeoutId, closeTimeoutId } = get();\n if (openTimeoutId) clearTimeout(openTimeoutId);\n if (closeTimeoutId) clearTimeout(closeTimeoutId);\n set({ openTimeoutId: null, closeTimeoutId: null });\n },\n openPortal: (args = {}) => {\n const { onOpenBegin, onOpenEnd } = args;\n const { closeTimeoutId, statusPanelOpen } = get();\n\n // Open portal\n onOpenBegin?.();\n set({ portalOpen: true });\n\n // Cancel closing timeout\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n set({ closeTimeoutId: null });\n }\n\n // Open status panel immediately\n set({ statusPanelOpen: true });\n\n const hasOpenStatus = usePortalStatuses.getState().statuses.length > 0;\n if (statusPanelOpen || hasOpenStatus) {\n // Open content immediately if status panel visible or statuses exist\n set({ contentPanelOpen: true });\n onOpenEnd?.();\n } else {\n // Open content after delay\n const id = setTimeout(() => {\n set({ contentPanelOpen: true, openTimeoutId: null });\n onOpenEnd?.();\n }, ANIM_DURATION);\n\n set({ openTimeoutId: id });\n }\n },\n closePortal: (args = {}) => {\n const { onCloseBegin, onCloseEnd } = args;\n const { openTimeoutId } = get();\n\n // Close portal\n onCloseBegin?.();\n set({ portalOpen: false });\n\n // Cancel opening timeout\n if (openTimeoutId) {\n clearTimeout(openTimeoutId);\n set({ openTimeoutId: null });\n }\n\n // Close content immediately\n set({ contentPanelOpen: false });\n\n // Close status panel after delay\n const id = setTimeout(() => {\n set({ statusPanelOpen: false, closeTimeoutId: null });\n onCloseEnd?.();\n }, ANIM_DURATION);\n\n set({ closeTimeoutId: id });\n },\n togglePortal: (args) => {\n get().portalOpen ? get().closePortal(args) : get().openPortal(args);\n },\n\n setContentHeight: (id, height) => {\n const existing = get().contentHeights;\n const updated = [...existing.filter((h) => h.id !== id), { id, height }];\n set({ contentHeights: updated });\n },\n removeContentHeight: (id) => {\n set({ contentHeights: get().contentHeights.filter((height) => height.id !== id) });\n },\n}));\n\nexport const usePortalUIMaxContentHeight = () => {\n const { contentHeights } = usePortalUI();\n return useMemo(() => {\n return contentHeights.reduce((max, height) => Math.max(max, height.height), 0);\n }, [contentHeights]);\n};\n","import type { FnxStatus } from '@/components/FnxFloatingButton/types';\nimport { create } from 'zustand';\n\ntype PortalStatusesStore = {\n statuses: FnxStatus[];\n};\n\ntype PortalStatusesActions = {\n addStatus: (status: FnxStatus) => void;\n removeStatus: (id: string) => void;\n hasStatus: (id: string) => boolean;\n};\n\nexport const usePortalStatuses = create<PortalStatusesStore & PortalStatusesActions>()((set, get) => ({\n statuses: [],\n addStatus: (status) => {\n // avoid duplicates\n if (get().hasStatus(status.id)) return;\n\n const existing = get().statuses;\n set({ statuses: [...existing, status] });\n },\n removeStatus: (id) => {\n const existing = get().statuses;\n set({ statuses: existing.filter((s) => s.id !== id) });\n },\n hasStatus: (id) => {\n return get().statuses.some((s) => s.id === id);\n },\n}));\n","export enum FloatingButtonPage {\n Main = 'main',\n Settings = 'settings',\n TokenList = 'tokenlist',\n TokenInfo = 'tokeninfo',\n Send = 'send',\n Shield = 'shield',\n Activity = 'activity',\n Permits = 'permits',\n GeneratePermits = 'generatePermit',\n DelegatePermits = 'delegatePermit',\n ReceivePermits = 'receivePermit',\n PermitDetails = 'permitDetails',\n Debug = 'debug',\n ClaimableTokens = 'claimableTokens',\n}\n\n// Registry interface to be augmented by each page's types nearby the page.\n// This lets page prop types live next to their components without creating cycles.\nexport interface FloatingButtonPagePropsRegistry {}\n\n// Consumers can augment this map via declaration merging or module-local typing.\n// By default, every page has `void` props unless explicitly provided\n// via `FloatingButtonPagePropsRegistry` through declaration merging.\nexport type FloatingButtonPagePropsMap = {\n [K in FloatingButtonPage]: K extends keyof FloatingButtonPagePropsRegistry\n ? FloatingButtonPagePropsRegistry[K]\n : void;\n};\n\nexport type PageState<K extends keyof FloatingButtonPagePropsMap = FloatingButtonPage> = {\n page: K;\n props?: FloatingButtonPagePropsMap[K];\n};\n\nexport type PagesWithProps = {\n [K in keyof FloatingButtonPagePropsMap]: FloatingButtonPagePropsMap[K] extends void ? never : K;\n}[FloatingButtonPage];\n\nexport type PagesWithoutProps = {\n [K in keyof FloatingButtonPagePropsMap]: FloatingButtonPagePropsMap[K] extends void ? K : never;\n}[FloatingButtonPage];\n\nexport function isPageWithProps<K extends FloatingButtonPage>(page: K): page is K & PagesWithProps {\n return !(page in ({} as Record<PagesWithoutProps, true>));\n}\n\nexport function isPageWithoutProps<K extends FloatingButtonPage>(page: K): page is K & PagesWithoutProps {\n return page in ({} as Record<PagesWithoutProps, true>);\n}\n","/* eslint-disable no-redeclare */\nimport {\n FloatingButtonPage,\n type FloatingButtonPagePropsMap,\n type PageState,\n type PagesWithProps,\n} from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { create } from 'zustand';\n\nexport type NavigateParams = {\n // When true, do not append to history; override current page instead\n skipPagesHistory?: boolean;\n};\n\nexport type NavigateArgs<K extends FloatingButtonPage> = {\n pageProps?: FloatingButtonPagePropsMap[K];\n navigateParams?: NavigateParams;\n};\n\ntype NavigateToFn = <K extends FloatingButtonPage>(\n page: K,\n ...rest: K extends PagesWithProps ? [args: NavigateArgs<K>] : [args?: NavigateArgs<K>]\n) => void;\n\ntype PortalNavigationStore = {\n pageHistory: PageState[];\n overridingPage: PageState | null;\n};\n\ntype PortalNavigationActions = {\n navigateTo: NavigateToFn;\n navigateBack: () => void;\n replace: NavigateToFn;\n clearNavigationHistory: () => void;\n};\n\nexport const usePortalNavigation = create<PortalNavigationStore & PortalNavigationActions>()((set, get) => {\n function clearNavigationHistory(): void {\n set({ pageHistory: [{ page: FloatingButtonPage.Main }], overridingPage: null });\n }\n\n function warnIfAlreadyOnPage<K extends FloatingButtonPage>(page: K): boolean {\n const currentPage = get().overridingPage ?? get().pageHistory[get().pageHistory.length - 1];\n const onPage = currentPage?.page === page;\n if (onPage) {\n console.warn(`Attempted to navigate to page ${page} but already on that page`);\n }\n return onPage;\n }\n\n const navigateTo: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n const args = rest[0];\n const props = args?.pageProps;\n const skipPagesHistory = args?.navigateParams?.skipPagesHistory === true;\n if (skipPagesHistory) {\n set({ overridingPage: { page, props } });\n } else {\n const existing = get().pageHistory;\n const updated = [...existing, { page, props }];\n set({ pageHistory: updated });\n }\n };\n\n const replace: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n clearNavigationHistory();\n\n navigateTo(page, ...rest);\n };\n\n return {\n pageHistory: [{ page: FloatingButtonPage.Main }],\n overridingPage: null,\n\n clearNavigationHistory,\n navigateTo,\n navigateBack: () => {\n if (get().overridingPage !== null) {\n // if currently there is an overriding page, just remove it\n set({ overridingPage: null });\n } else {\n // otherwise pop last page from history\n set({ pageHistory: get().pageHistory.slice(0, -1) });\n }\n },\n replace,\n };\n});\n\nexport const usePortalCurrentPage = () => {\n const { overridingPage, pageHistory } = usePortalNavigation();\n return overridingPage ?? pageHistory[pageHistory.length - 1];\n};\n","import { TbAlertTriangle, TbInfoCircle, TbCircleCheck, TbX } from 'react-icons/tb';\nimport { motion } from 'motion/react';\nimport { HashLink } from './HashLink';\nimport { cn } from '@/utils';\nimport type { FnxToastVariant, FnxToastImperativeParams, FnxToastInjectedProps } from '../types';\n\nexport type ToastPrimitiveProps = FnxToastImperativeParams & FnxToastInjectedProps;\n\nconst variantIconMap: Record<FnxToastVariant, React.ReactNode> = {\n info: <TbInfoCircle className=\"text-blue-500 size-5\" />,\n success: <TbCircleCheck className=\"text-green-500 size-5\" />,\n error: <TbAlertTriangle className=\"text-red-500 size-5\" />,\n warning: <TbAlertTriangle className=\"text-yellow-500 size-5\" />,\n};\n\nconst variantClassNameMap: Record<FnxToastVariant, string> = {\n info: 'bg-blue-50 border-blue-200 text-blue-800',\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n};\n\nconst variantProgressBarColorMap: Record<FnxToastVariant | 'base', string> = {\n base: 'bg-gray-500',\n info: 'bg-blue-500',\n success: 'bg-green-500',\n error: 'bg-red-500',\n warning: 'bg-yellow-500',\n};\n\nconst ToastCloseButton: React.FC<Pick<ToastPrimitiveProps, 'onDismiss'>> = ({ onDismiss }) => {\n return (\n <button className=\"self-start\" onClick={() => onDismiss?.()}>\n <TbX className=\"text-gray-500 size-5\" />\n </button>\n );\n};\n\nconst ToastActionButton: React.FC<Pick<ToastPrimitiveProps, 'action' | 'onDismiss'>> = ({ action, onDismiss }) => {\n if (action == null) return null;\n\n return (\n <button\n onClick={() => {\n onDismiss?.();\n action.onClick();\n }}\n >\n {action.label}\n </button>\n );\n};\n\nconst ToastDurationIndicator: React.FC<\n Pick<ToastPrimitiveProps, 'duration' | 'remainingMs' | 'paused' | 'variant'>\n> = ({ duration, remainingMs, paused, variant }) => {\n if (remainingMs == null || remainingMs <= 0 || duration == null || duration === 'infinite') return null;\n\n const progress = remainingMs / duration;\n const progressColor = variantProgressBarColorMap[variant ?? 'base'];\n\n return (\n <div className=\"absolute bottom-0 left-0 w-full h-1 overflow-hidden\">\n {paused ? (\n <div className={cn(progressColor, 'h-full origin-right')} style={{ transform: `scaleX(${progress})` }} />\n ) : (\n <motion.div\n className={cn('h-full origin-right', progressColor)}\n initial={{ scaleX: progress }}\n animate={{ scaleX: 0 }}\n transition={{\n duration: remainingMs / 1000,\n ease: 'linear',\n }}\n />\n )}\n </div>\n );\n};\n\nexport const ToastPrimitiveBase: React.FC<\n FnxToastInjectedProps & { variant?: FnxToastVariant; children: React.ReactNode }\n> = ({ id, duration, remainingMs, variant, paused, children, onPause, onDismiss }) => {\n return (\n <div\n className={cn(\n 'flex flex-row gap-3 p-2 relative items-center justify-start pb-3',\n variant != null && variantClassNameMap[variant]\n )}\n onMouseEnter={() => {\n if (id == null) return;\n onPause?.(true);\n }}\n onMouseLeave={() => {\n if (id == null) return;\n onPause?.(false);\n }}\n >\n {variant != null && variantIconMap[variant]}\n <div className=\"flex-1\">{children}</div>\n <ToastCloseButton onDismiss={onDismiss} />\n {duration !== 'infinite' && (\n <ToastDurationIndicator duration={duration} remainingMs={remainingMs} paused={paused} variant={variant} />\n )}\n </div>\n );\n};\n\nconst ToastContent: React.FC<\n Pick<ToastPrimitiveProps, 'title' | 'description' | 'transaction' | 'action' | 'onDismiss'>\n> = ({ title, description, transaction, action, onDismiss }) => {\n return (\n <>\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-sm font-medium\">{title}</h3>\n {description != null && <p className=\"text-xs\">{description}</p>}\n {transaction != null && <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} />}\n </div>\n <div className=\"flex-1\" />\n <ToastActionButton action={action} onDismiss={onDismiss} />\n </>\n );\n};\n\nexport const ToastPrimitive: React.FC<ToastPrimitiveProps> = (props) => {\n return (\n <ToastPrimitiveBase {...props}>\n <ToastContent {...props} />\n </ToastPrimitiveBase>\n );\n};\n","import { useState } from 'react';\nimport { LuCopy, LuCheck, LuExternalLink } from 'react-icons/lu';\nimport { cn } from '../../../utils/cn.js';\nimport {\n truncateHash,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n} from '../../../utils/utils.js';\n\nexport type HashLinkType = 'tx' | 'address' | 'token';\n\ninterface HashLinkProps {\n type: HashLinkType;\n hash: string;\n chainId?: number;\n className?: string;\n copyable?: boolean;\n iconSize?: number;\n /** Use extra short truncation (5...3 instead of 6...4) */\n extraShort?: boolean;\n}\n\nexport const HashLink: React.FC<HashLinkProps> = ({\n type,\n hash,\n chainId,\n className,\n copyable = true,\n iconSize = 14,\n extraShort = false,\n}) => {\n const start = extraShort ? 5 : 6;\n const end = extraShort ? 3 : 4;\n const ellipsed = truncateHash(hash, start, end);\n\n const getHref = (): string | undefined => {\n if (!chainId) return undefined;\n switch (type) {\n case 'tx':\n return getBlockExplorerTxUrl(chainId, hash);\n case 'address':\n return getBlockExplorerAddressUrl(chainId, hash);\n case 'token':\n return getBlockExplorerTokenUrl(chainId, hash);\n }\n };\n\n const href = getHref();\n\n const handleClick = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {copyable && <CopyButton text={hash} size={iconSize} />}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={!href}\n className={cn(\n 'flex items-center gap-1 font-mono text-xs hover:underline',\n 'fnx-text-primary opacity-60 hover:opacity-100 transition-opacity',\n !href && 'cursor-default hover:no-underline',\n className\n )}\n >\n <span>{ellipsed}</span>\n {href && <LuExternalLink style={{ width: iconSize, height: iconSize }} />}\n </button>\n </div>\n );\n};\n\ninterface CopyButtonProps {\n text: string;\n size?: number;\n className?: string;\n}\n// TODO: This will be replaced with the new copy system from another PR\nexport const CopyButton: React.FC<CopyButtonProps> = ({ text, size = 14, className }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 800);\n } catch (err) {\n console.error('Failed to copy address:', err);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn('fnx-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer', className)}\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <LuCheck style={{ width: size, height: size }} className=\"text-green-500\" />\n ) : (\n <LuCopy style={{ width: size, height: size }} />\n )}\n </button>\n );\n};\n","import { ToastPrimitive } from '@/components/FnxFloatingButton/components/ToastPrimitives';\nimport type { FnxFloatingButtonToast, FnxToastImperativeParams } from '@/components/FnxFloatingButton/types';\nimport { isReactNode } from '@/utils';\nimport { create } from 'zustand';\n\ntype PortalToastsStore = {\n toasts: FnxFloatingButtonToast[];\n};\n\ntype PortalToastsActions = {\n addToast: (toast: React.ReactNode | FnxToastImperativeParams, duration?: number | 'infinite') => void;\n pauseToast: (id: string, paused: boolean) => void;\n removeToast: (id: string) => void;\n};\n\nexport const usePortalToasts = create<PortalToastsStore & PortalToastsActions>()((set, get) => ({\n toasts: [],\n\n addToast: (toast, duration = 5000) => {\n const content = isReactNode(toast) ? toast : <ToastPrimitive {...toast} />;\n const existing = get().toasts;\n const updated = [\n ...existing,\n {\n id: crypto.randomUUID(),\n duration,\n startMs: Date.now(),\n remainingMs: duration === 'infinite' ? Infinity : duration,\n paused: false,\n content,\n },\n ];\n set({ toasts: updated });\n },\n pauseToast: (id, paused) => {\n const existing = get().toasts;\n const updated = existing.map((t) => {\n if (t.id !== id) return t;\n if (t.paused === paused) return t;\n\n let remainingMs = t.remainingMs;\n let startMs = Date.now();\n if (paused) {\n const elapsedMs = Date.now() - t.startMs;\n remainingMs = Math.max(0, t.remainingMs - elapsedMs);\n }\n\n return { ...t, paused, startMs, remainingMs };\n });\n set({ toasts: updated });\n },\n removeToast: (id) => {\n const existing = get().toasts;\n set({ toasts: existing.filter((t) => t.id !== id) });\n },\n}));\n","import { CofhesdkError } from '@cofhe/sdk';\nimport { useContext } from 'react';\nimport { ErrorBoundaryContext } from 'react-error-boundary';\n\n/**\n *\n * @returns check if ErrorBoundary is currently handling a CofhesdkError.\n * This is useful to prevent/block interactions with Cofhe until the error is resolved by the handling logic and the error is reset\n */\nexport function useIsCofheErrorActive(): boolean {\n const errorBoundaryContext = useContext(ErrorBoundaryContext);\n return errorBoundaryContext?.error instanceof CofhesdkError;\n}\n","import type { Token } from '@/types/token';\nimport { parseAbi, type Abi } from 'viem';\n\n// ============================================================================\n// ERC20 Standard ABIs (for approval flow)\n// ============================================================================\n\n/**\n * ABI for ERC20 allowance check\n */\nexport const ERC20_ALLOWANCE_ABI = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n]);\n\n/**\n * ABI for ERC20 approve\n */\nexport const ERC20_APPROVE_ABI = parseAbi(['function approve(address spender, uint256 amount) returns (bool)']);\n\n// ============================================================================\n// Confidential Token Balance ABIs\n// ============================================================================\n\n/**\n * ABI for wrapped confidentiality type tokens (e.g., Redact)\n * Uses `encBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_WRAPPED_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'encBalanceOf',\n outputs: [\n {\n internalType: 'euint128',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for pure confidentiality type tokens (e.g., Base mini app)\n * Uses `confidentialBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_PURE_ABI = parseAbi([\n 'function confidentialBalanceOf(address account) view returns (uint256)',\n]);\n\n/**\n * ABI for dual confidentiality type tokens\n * Uses `confidentialBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_DUAL_ABI = parseAbi([\n 'function confidentialBalanceOf(address account) view returns (uint256)',\n]);\n\n/**\n * Map confidentialityType to balance ABIs and function names\n */\nexport const CONFIDENTIAL_ABIS = {\n wrapped: {\n abi: CONFIDENTIAL_TYPE_WRAPPED_ABI,\n functionName: 'encBalanceOf' as const,\n },\n pure: {\n abi: CONFIDENTIAL_TYPE_PURE_ABI,\n functionName: 'confidentialBalanceOf' as const,\n },\n dual: {\n abi: CONFIDENTIAL_TYPE_DUAL_ABI,\n functionName: 'confidentialBalanceOf' as const,\n },\n} as const;\n\n// ============================================================================\n// Confidential Token Transfer ABIs\n// ============================================================================\n\n/**\n * ABI for wrapped confidentiality type token transfers\n * Uses `encTransfer(address to, InEuint128 inValue)` function\n */\nexport const WRAPPED_TRANSFER_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'ctHash',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'securityZone',\n type: 'uint8',\n },\n {\n internalType: 'uint8',\n name: 'utype',\n type: 'uint8',\n },\n {\n internalType: 'bytes',\n name: 'signature',\n type: 'bytes',\n },\n ],\n internalType: 'struct InEuint128',\n name: 'inValue',\n type: 'tuple',\n },\n ],\n name: 'encTransfer',\n outputs: [\n {\n internalType: 'euint128',\n name: 'transferred',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for pure confidentiality type token transfers\n * Uses `confidentialTransfer(address to, InEuint64 inValue)` function\n */\nexport const PURE_TRANSFER_ABI = [\n {\n name: 'confidentialTransfer',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n {\n name: 'inValue',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'securityZone', type: 'uint8' },\n { name: 'utype', type: 'uint8' },\n { name: 'signature', type: 'bytes' },\n ],\n },\n ],\n outputs: [{ name: 'transferred', type: 'uint256' }],\n },\n] as const satisfies Abi;\n\n/**\n * ABI for dual confidentiality type token transfers (TBD - to be implemented)\n * Uses `TBD_DUAL_FUNCTION_NAME(address to, InEuintXXX inValue)` function\n */\nexport const DUAL_TRANSFER_ABI = [\n {\n name: 'TBD_DUAL_FUNCTION_NAME',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n {\n name: 'inValue',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'securityZone', type: 'uint8' },\n { name: 'utype', type: 'uint8' },\n { name: 'signature', type: 'bytes' },\n ],\n },\n ],\n outputs: [{ name: 'transferred', type: 'uint256' }],\n },\n] as const satisfies Abi;\n\n/**\n * Map confidentialityType to transfer ABIs and function names\n */\nexport const TRANSFER_ABIS = {\n wrapped: {\n abi: WRAPPED_TRANSFER_ABI,\n functionName: 'encTransfer' as const,\n },\n pure: {\n abi: PURE_TRANSFER_ABI,\n functionName: 'confidentialTransfer' as const,\n },\n dual: {\n // Placeholder for dual type\n abi: DUAL_TRANSFER_ABI,\n functionName: 'TBD_DUAL_FUNCTION_NAME' as const,\n },\n} as const;\n\n// ============================================================================\n// Shield/Unshield ABIs (for dual and wrapped tokens)\n// ============================================================================\n\n/**\n * ABI for dual token shield - converts regular balance to confidential\n * Takes plaintext uint256 amount\n */\nexport const DUAL_SHIELD_ABI = parseAbi(['function shield(uint256 amount) public']);\n\n/**\n * ABI for dual token unshield - initiates conversion from confidential to regular\n * Takes plaintext uint64 amount\n */\nexport const DUAL_UNSHIELD_ABI = parseAbi(['function unshield(uint64 amount) public']);\n\n/**\n * ABI to claim unshielded tokens after decryption completes\n */\nexport const DUAL_CLAIM_UNSHIELD_ABI = parseAbi(['function claimUnshielded() public']);\n\n/**\n * ABI to check pending unshield claim status\n * Returns UnshieldClaim struct with: ctHash, requestedAmount, decryptedAmount, decrypted, claimed\n */\nexport const DUAL_GET_UNSHIELD_CLAIM_ABI = [\n {\n name: 'getUserUnshieldClaim',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'user', type: 'address' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint64' },\n { name: 'decryptedAmount', type: 'uint64' },\n { name: 'decrypted', type: 'bool' },\n { name: 'claimed', type: 'bool' },\n ],\n },\n ],\n },\n] as const satisfies Abi;\n\n/**\n * ABI for wrapped token encrypt (shield) - requires prior ERC20 approval\n * Transfers ERC20 tokens to wrapper and mints confidential tokens\n */\nexport const WRAPPED_ENCRYPT_ABI = parseAbi(['function encrypt(address to, uint128 value) public']);\n\n/**\n * ABI for wrapped token decrypt (unshield) - initiates conversion back to ERC20\n * Burns confidential tokens and creates a claim for ERC20\n */\nexport const WRAPPED_DECRYPT_ABI = parseAbi(['function decrypt(address to, uint128 value) public']);\n\n/**\n * ABI for wrapped token claim decrypted - claims ERC20 after decryption\n */\nexport const WRAPPED_CLAIM_DECRYPTED_ABI = parseAbi(['function claimDecrypted(uint256 ctHash) public']);\n\n/**\n * ABI for wrapped token claim all decrypted - claims all pending ERC20\n */\nexport const WRAPPED_CLAIM_ALL_DECRYPTED_ABI = parseAbi(['function claimAllDecrypted() public']);\n\n/**\n * ABI for wrapped token getUserClaims - returns all pending claims for a user\n * Returns array of Claim structs: { ctHash, requestedAmount, decryptedAmount, decrypted, to, claimed }\n */\nexport const WRAPPED_GET_USER_CLAIMS_ABI = [\n {\n inputs: [{ name: 'user', type: 'address' }],\n name: 'getUserClaims',\n outputs: [\n {\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint128' },\n { name: 'decryptedAmount', type: 'uint128' },\n { name: 'decrypted', type: 'bool' },\n { name: 'to', type: 'address' },\n { name: 'claimed', type: 'bool' },\n ],\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for wrapped ETH encrypt with ETH value\n */\nexport const WRAPPED_ETH_ENCRYPT_ETH_ABI = parseAbi(['function encryptETH(address to) public payable']);\n\n/**\n * ABI for wrapped ETH encrypt with WETH\n */\nexport const WRAPPED_ETH_ENCRYPT_WETH_ABI = parseAbi(['function encryptWETH(address to, uint128 value) public']);\n\n/**\n * Map confidentialityType to shield ABIs and function names\n */\nexport const SHIELD_ABIS = {\n dual: {\n abi: DUAL_SHIELD_ABI,\n functionName: 'shield' as const,\n },\n wrapped: {\n // TBD - needs approval flow and underlying token reference\n abi: WRAPPED_ENCRYPT_ABI,\n functionName: 'encrypt' as const,\n },\n} as const;\n\n/**\n * Map confidentialityType to unshield ABIs and function names\n */\nexport const UNSHIELD_ABIS = {\n dual: {\n abi: DUAL_UNSHIELD_ABI,\n functionName: 'unshield' as const,\n },\n wrapped: {\n // TBD - needs claim flow\n abi: WRAPPED_DECRYPT_ABI,\n functionName: 'decrypt' as const,\n },\n} as const;\n\n/**\n * Map confidentialityType to claim ABIs and function names\n */\nexport const CLAIM_ABIS = {\n dual: {\n abi: DUAL_CLAIM_UNSHIELD_ABI,\n functionName: 'claimUnshielded' as const,\n },\n wrapped: {\n abi: WRAPPED_CLAIM_ALL_DECRYPTED_ABI,\n functionName: 'claimAllDecrypted' as const,\n },\n} as const;\n\nexport function getTokenContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n return CONFIDENTIAL_ABIS[confidentialityType];\n}\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheAccount, useCofhePublicClient } from './useCofheConnection';\nimport { type Token, ETH_ADDRESS } from './useCofheTokenLists';\nimport { ERC20_BALANCE_OF_ABI } from '../constants/erc20ABIs';\nimport { assert } from 'ts-essentials';\nimport { useInternalQuery } from '../providers/index';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\n\nfunction constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId?: number;\n accountAddress?: Address;\n tokenAddress?: Address;\n}): readonly unknown[] {\n return ['tokenBalance', chainId, accountAddress?.toLowerCase(), tokenAddress?.toLowerCase()];\n}\n\nexport function constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId: number;\n accountAddress: Address;\n tokenAddress: Address;\n}) {\n return constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n });\n}\n\ntype UseTokenBalanceInput = {\n /** Token contract address */\n tokenAddress?: Address;\n /** Account address to check balance for (optional, defaults to connected account) */\n accountAddress?: Address;\n};\n\ntype UseTokenBalanceOptions<TSelectedData = bigint> = Omit<\n UseQueryOptions<bigint, Error, TSelectedData>,\n 'queryKey' | 'queryFn'\n>;\n/**\n * Hook to get ERC20 token balance and return normalized display value\n * @param input - Token address, decimals, and optional publicClient/accountAddress\n * @param queryOptions - Optional React Query options\n * @returns Query result with normalized balance as string\n */\nfunction useTokenBalance<TSelectedData = bigint>(\n { tokenAddress, accountAddress }: UseTokenBalanceInput,\n queryOptions?: UseTokenBalanceOptions<TSelectedData>\n) {\n const publicClient = useCofhePublicClient();\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions ?? {};\n const baseEnabled = !!publicClient && !!accountAddress && !!tokenAddress;\n const enabled = baseEnabled && (userEnabled ?? true);\n\n const queryKey = constructPublicTokenBalanceQueryKey({\n chainId: publicClient?.chain?.id,\n accountAddress,\n tokenAddress,\n });\n\n return useInternalQuery({\n queryKey,\n queryFn: async () => {\n assert(tokenAddress, 'Token address is required to fetch token balance');\n assert(publicClient, 'PublicClient is required to fetch token balance');\n assert(accountAddress, 'Account address is required to fetch token balance');\n\n const isNativeToken = tokenAddress.toLowerCase() === ETH_ADDRESS.toLowerCase();\n\n // Read balance from contract\n const balance = isNativeToken\n ? publicClient.getBalance({\n address: accountAddress,\n })\n : publicClient.readContract({\n address: tokenAddress,\n abi: ERC20_BALANCE_OF_ABI,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n\n return balance;\n },\n enabled,\n refetchOnMount: false,\n ...restQueryOptions,\n });\n}\n\n// ============================================================================\n// Unified Public Balance Hook\n// ============================================================================\n\ntype UsePublicTokenBalanceInput = {\n /** Token from token list */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UsePublicTokenBalanceResult = {\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Hook to get public (non-confidential) balance for a token.\n * Handles both dual tokens (balanceOf on token address) and wrapped tokens (balanceOf on erc20Pair or native ETH).\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenPublicBalance(\n { token, accountAddress, displayDecimals = 5 }: UsePublicTokenBalanceInput,\n options?: Omit<UseTokenBalanceOptions, 'select'> // disallow passing 'select' because it's harder to type\n): UsePublicTokenBalanceResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress || connectedAccount;\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n // Determine token type\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n const underlyingErc20 = token?.extensions.fhenix.erc20Pair;\n\n const tokenToFetchBalanceFrom =\n confidentialityType === 'wrapped'\n ? // if it's a wrapped token, fetch balance from underlying ERC20 (or ETH)\n underlyingErc20\n : confidentialityType === 'dual'\n ? // if it's a dual token, fetch balance from the token address itself\n token\n : undefined;\n\n const { data, isFetching, refetch } = useTokenBalance(\n {\n tokenAddress: tokenToFetchBalanceFrom?.address,\n accountAddress: account,\n },\n {\n enabled: userEnabled,\n select: (value) => {\n assert(\n typeof tokenToFetchBalanceFrom?.decimals === 'number',\n 'Token decimals must be defined to format public token balance'\n );\n return formatTokenAmount(value, tokenToFetchBalanceFrom.decimals, displayDecimals);\n },\n ...restOptions,\n }\n );\n\n return {\n data,\n isFetching,\n refetch,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useCofheContext } from '../providers/CofheProvider';\nimport { useMemo } from 'react';\nimport { ETH_ADDRESS, type Erc20Pair, type Token } from '../types/token.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport type { Address } from 'viem';\nimport { useCofheChainId } from './useCofheConnection';\n\nexport { ETH_ADDRESS, type Token, type Erc20Pair };\n\ntype TokenList = {\n name: string;\n timestamp: string;\n version: {\n major: number;\n minor: number;\n patch: number;\n };\n tokens: Token[];\n};\n\ntype UseTokenListsResult = UseQueryResult<TokenList, Error>[];\ntype UseTokenListsInput = {\n chainId?: number;\n};\ntype UseTokenListsOptions = Omit<UseQueryOptions<TokenList, Error>, 'queryKey' | 'queryFn' | 'select'>;\n// Returns array of query results for token lists for the current network\nexport function useCofheTokenLists(\n { chainId }: UseTokenListsInput,\n queryOptions?: UseTokenListsOptions\n): UseTokenListsResult {\n const widgetConfig = useCofheContext().client.config.react;\n const tokensListsUrls = chainId ? widgetConfig.tokenLists[chainId] : [];\n\n const queriesOptions: UseQueryOptions<TokenList, Error>[] =\n tokensListsUrls?.map((url) => ({\n cacheTime: Infinity,\n staleTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: ['tokenList', chainId, url],\n queryFn: async ({ signal }): Promise<TokenList> => {\n const timestamp = Date.now();\n const urlWithCacheBust = `${url}${url.includes('?') ? '&' : '?'}v=${timestamp}`;\n const res = await fetch(urlWithCacheBust, { signal });\n if (!res.ok) {\n throw new Error(`Failed to fetch token list: ${res.status} ${res.statusText}`);\n }\n return await res.json();\n },\n select: (data: TokenList): TokenList => {\n // filter only tokens for the current chain (some lists contain multiple chains)\n return {\n ...data,\n tokens: data.tokens.filter((token) => token.chainId === chainId),\n };\n },\n ...queryOptions,\n })) || [];\n\n const result = useInternalQueries({\n queries: queriesOptions,\n });\n\n return result;\n}\n\nexport function selectTokensFromTokensList(tokenList: TokenList): Token[] {\n return tokenList.tokens;\n}\n\nexport function useCofheTokens(chainId?: number): Token[] {\n const tokenLists = useCofheTokenLists({ chainId });\n const tokens = useMemo(() => {\n const map = new Map<string, Token>();\n tokenLists.forEach((result) => {\n if (!result.data) return;\n\n result.data.tokens.forEach((token) => {\n const key = `${token.chainId}-${token.address.toLowerCase()}`;\n if (map.has(key)) return;\n map.set(key, token);\n });\n });\n return Array.from(map.values());\n }, [tokenLists]);\n return tokens;\n}\n\nexport function useCofheToken(\n { chainId: _chainId, address }: { chainId?: number; address?: Address },\n // TODO: after adding this functionality, don't fetch if not enabled\n metdataQueryOptions?: Omit<UseQueryOptions<Token | undefined, Error>, 'queryKey' | 'queryFn' | 'select'>\n) {\n const cofheChainId = useCofheChainId();\n const chainId = _chainId ?? cofheChainId;\n\n const tokens = useCofheTokens(chainId);\n const tokenFromList = useMemo(() => {\n if (!address || !chainId) return;\n return tokens.find((t) => t.chainId === chainId && t.address.toLowerCase() === address.toLowerCase());\n }, [address, chainId, tokens]);\n\n // TODO: fetch from chain (metadata) if all the token lists have been loaded but token is not found\n\n return tokenFromList;\n}\n","import { parseAbi } from 'viem';\n\n// ============================================================================\n// Standard ERC20 ABIs\n// ============================================================================\n\n/**\n * Standard ERC20 balanceOf function ABI\n */\nexport const ERC20_BALANCE_OF_ABI = parseAbi(['function balanceOf(address owner) view returns (uint256)']);\n\n/**\n * Standard ERC20 decimals function ABI\n */\nexport const ERC20_DECIMALS_ABI = parseAbi(['function decimals() view returns (uint8)']);\n\n/**\n * Standard ERC20 symbol function ABI\n */\nexport const ERC20_SYMBOL_ABI = parseAbi(['function symbol() view returns (string)']);\n\n/**\n * Standard ERC20 name function ABI\n */\nexport const ERC20_NAME_ABI = parseAbi(['function name() view returns (string)']);\n","import BigNumber from 'bignumber.js';\n\nexport type TokenFormatOutput = {\n /** Raw balance in smallest unit (bigint) */\n wei: bigint;\n /** Numeric balance value */\n unit: BigNumber;\n /** Formatted balance string */\n formatted: string;\n};\n\nexport function formatTokenAmount(amount: bigint, decimals: number, displayDecimals?: number): TokenFormatOutput {\n const amountBN = new BigNumber(amount).dividedBy(10 ** decimals);\n return {\n wei: amount,\n unit: amountBN,\n formatted: displayDecimals\n ? amountBN\n .toFixed(displayDecimals)\n // remove trailing zeros\n .replace(/\\.?0+$/, '')\n : amountBN.toFixed(), // the only precise way, without parseFloat\n };\n}\n\nexport function unitToWei(amount: string, decimals: number): bigint {\n return BigInt(new BigNumber(amount).multipliedBy(10 ** decimals).toFixed(0));\n}\n","import { QueryClient, type QueryKey, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { DUAL_GET_UNSHIELD_CLAIM_ABI, WRAPPED_GET_USER_CLAIMS_ABI } from '../constants/confidentialTokenABIs.js';\nimport { useInternalQuery } from '../providers/index.js';\nimport { decryptionAwareReadContract } from '@/utils/decryptionAwareReadContract.js';\nimport { useIsWaitingForDecryptionToInvalidate } from './useIsWaitingForDecryptionToInvalidate.js';\nimport { assert } from 'ts-essentials';\n\nexport function constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number | undefined;\n tokenAddress: Address | undefined;\n confidentialityType: string | undefined;\n accountAddress: Address | undefined;\n}) {\n return ['unshieldClaims', chainId, tokenAddress, confidentialityType, accountAddress];\n}\nexport function invalidateClaimableQueries({\n token,\n accountAddress,\n queryClient,\n}: {\n token: Token;\n accountAddress: Address;\n queryClient: QueryClient;\n}) {\n console.log('Invalidating unshield claims queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress,\n }),\n });\n}\n\nexport function constructUnshieldClaimsQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number;\n tokenAddress: Address;\n confidentialityType: string;\n accountAddress: Address;\n}) {\n return constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n });\n}\n\nexport const DEFAULT_UNSHIELD_CLAIM_SUMMARY: UnshieldClaimsSummary = {\n claimableAmount: 0n,\n pendingAmount: 0n,\n hasClaimable: false,\n hasPending: false,\n};\n\nexport function isTokenConfidentialityTypeClaimable(type: string | undefined): type is 'dual' | 'wrapped' {\n return type === 'dual' || type === 'wrapped';\n}\n\nexport type FetchUnshieldClaimsSummaryInput = {\n publicClient: NonNullable<ReturnType<typeof useCofhePublicClient>>;\n token: Token;\n accountAddress: Address;\n confidentialityType: 'dual' | 'wrapped';\n queryKey: QueryKey;\n signal: AbortSignal;\n};\n\nexport async function fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress,\n confidentialityType,\n queryKey,\n signal,\n}: FetchUnshieldClaimsSummaryInput): Promise<UnshieldClaimsSummary> {\n if (confidentialityType === 'dual') {\n const claim = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: DUAL_GET_UNSHIELD_CLAIM_ABI,\n functionName: 'getUserUnshieldClaim',\n args: [accountAddress],\n },\n });\n\n if (claim.ctHash === 0n || claim.claimed) return DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n\n return {\n claimableAmount: claim.decrypted ? claim.decryptedAmount : 0n,\n pendingAmount: claim.decrypted ? 0n : claim.requestedAmount,\n hasClaimable: claim.decrypted && claim.decryptedAmount > 0n,\n hasPending: !claim.decrypted,\n };\n }\n\n if (confidentialityType === 'wrapped') {\n const result = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: WRAPPED_GET_USER_CLAIMS_ABI,\n functionName: 'getUserClaims',\n args: [accountAddress],\n },\n });\n\n const claims = result.filter((c) => !c.claimed);\n\n const { claimableAmount, pendingAmount } = claims.reduce(\n (acc, claim) => {\n if (claim.decrypted) {\n acc.claimableAmount += claim.decryptedAmount;\n } else {\n acc.pendingAmount += claim.requestedAmount;\n }\n return acc;\n },\n { claimableAmount: 0n, pendingAmount: 0n }\n );\n\n return {\n claimableAmount,\n pendingAmount,\n hasClaimable: claimableAmount > 0n,\n hasPending: pendingAmount > 0n,\n };\n }\n\n return DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n}\n\n// ============================================================================\n// Unified Unshield Claims Hook\n// ============================================================================\n\n/**\n * Unified unshield claims summary - works for both dual and wrapped tokens\n */\nexport type UnshieldClaimsSummary = {\n /** Total amount that can be claimed now (decrypted and not claimed) */\n claimableAmount: bigint;\n /** Total amount pending decryption */\n pendingAmount: bigint;\n /** Whether there are any claimable amounts */\n hasClaimable: boolean;\n /** Whether there are any pending (not yet decrypted) claims */\n hasPending: boolean;\n};\n\ntype UseUnshieldClaimsInput = {\n /** Token object with confidentialityType */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsOptions = Omit<UseQueryOptions<UnshieldClaimsSummary, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Unified hook to fetch unshield claims for any token type (dual or wrapped)\n * @param input - Token object and optional account address\n * @param queryOptions - Optional React Query options\n * @returns Query result with UnshieldClaimsSummary\n */\nexport function useCofheTokenClaimable(\n { accountAddress: account, token }: UseUnshieldClaimsInput,\n queryOptions?: UseUnshieldClaimsOptions\n): UseQueryResult<UnshieldClaimsSummary, Error> & {\n isWaitingForDecryption: boolean;\n} {\n const publicClient = useCofhePublicClient();\n\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token?.chainId,\n tokenAddress: token?.address,\n confidentialityType,\n accountAddress: account,\n });\n // is waiting for decryption finalization -> once Unshield tx mined, but before Decryption result available\n const isWaitingForDecryption = useIsWaitingForDecryptionToInvalidate(queryKey);\n\n const result = useInternalQuery({\n queryKey,\n queryFn: async ({ signal, queryKey }): Promise<UnshieldClaimsSummary> => {\n assert(token, 'token is guaranteed to be defined in query function due to `enabled` condition');\n assert(confidentialityType, 'token.confidentialityType is guaranteed to be defined in query function');\n assert(account, 'account is guaranteed to be defined in query function due to `enabled` condition');\n assert(publicClient, 'publicClient is guaranteed to be defined in query function due to `enabled` condition');\n\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType is guaranteed to be claimable type due to `enabled` condition'\n );\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: !!publicClient && !!account && !!token && isTokenConfidentialityTypeClaimable(confidentialityType),\n ...queryOptions,\n });\n\n return {\n ...result,\n isWaitingForDecryption,\n };\n}\n","import { type QueryKey } from '@tanstack/react-query';\nimport { type Abi, type Address, type ContractFunctionArgs, type ContractFunctionName, type PublicClient } from 'viem';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore.js';\nimport {\n maybeWaitUntilRpcAwareAndReadContract,\n type ReadContractResult,\n type WaitUntilRpcAwareAndReadContractOptions,\n} from '../utils/waitUntilRpcAwareAndReadContract.js';\n\nexport const BLOCK_AWARENESS_POLLING_INTERVAL = 3_000; // 5 seconds\n\ntype Input<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> = {\n publicClient: PublicClient;\n queryKey: QueryKey;\n signal: AbortSignal;\n readContractParams: {\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n };\n};\nexport function decryptionAwareReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>({\n publicClient,\n queryKey,\n signal,\n readContractParams,\n}: Input<TAbi, TfunctionName>): Promise<ReadContractResult<TAbi, TfunctionName>> {\n const decryptionWatchersState = useDecryptionWatchersStore.getState();\n\n // if there was a tx previously, which caused the need to invalidae this query upon decryption observation,\n // and if decryption has been observed for it, use the block hash to ensure RPC is aware of it\n // so that readContract can read up-to-date data\n const blockHashToBeAwareOf =\n decryptionWatchersState.findObservedDecryption(queryKey)?.decryptionObservedAt?.blockHash;\n\n console.log('Tracked decryption block for unshield claims:', blockHashToBeAwareOf);\n\n const rpcAwarenessOptions: WaitUntilRpcAwareAndReadContractOptions = {\n signal,\n pollingInterval: BLOCK_AWARENESS_POLLING_INTERVAL,\n onSuccess: () => {\n // once we have successfully read decrypted data, remove the invalidation tracking\n decryptionWatchersState.removeQueryKeyFromWatchers(queryKey);\n },\n };\n\n return maybeWaitUntilRpcAwareAndReadContract(\n publicClient,\n {\n blockHashToBeAwareOf,\n ...readContractParams,\n },\n rpcAwarenessOptions\n );\n}\n","import type { QueryKey } from '@tanstack/react-query';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { TransactionActionType } from './transactionStore';\n\nexport type DecryptionWatcherStatus = 'scheduled' | 'executed';\n\nexport type DecryptionWatcher = {\n key: `${TransactionActionType}-tx-0x${string}`;\n createdAt: number;\n triggerTxHash: `0x${string}`;\n decryptionObservedAt?: {\n blockNumber: bigint;\n timestamp: number;\n blockHash?: `0x${string}`;\n };\n chainId: number;\n accountAddress: Address;\n queryKeys: QueryKey[];\n};\n\ntype DecryptionWatchersState = {\n byKey: Record<string, DecryptionWatcher>;\n\n upsert: (input: Omit<DecryptionWatcher, 'status'> & { status?: DecryptionWatcherStatus }) => void;\n setDecryptionObservedAt: (params: { key: string; blockNumber: bigint; blockHash?: `0x${string}` }) => void;\n findObservedDecryption: (queryKey: QueryKey) => DecryptionWatcher | undefined;\n removeQueryKeyFromWatchers: (queryKey: QueryKey) => void;\n};\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<DecryptionWatchersState>(() => localStorage, bigintJSONStorageOptions);\n\nexport const useDecryptionWatchersStore = create<DecryptionWatchersState>()(\n persist(\n (set, get) => ({\n byKey: {},\n\n upsert: (input) => {\n set((state) => {\n return {\n byKey: {\n ...state.byKey,\n [input.key]: input,\n },\n };\n });\n },\n findObservedDecryption: (queryKey) => {\n return Object.values(get().byKey).find((item) =>\n item.queryKeys.some((key) => JSON.stringify(key) === JSON.stringify(queryKey) && !!item.decryptionObservedAt)\n );\n },\n removeQueryKeyFromWatchers: (queryKey) => {\n set((state) => {\n const updatedByKey = { ...state.byKey };\n // remove the queryKey from all scheduled invalidations\n for (const [key, item] of Object.entries(updatedByKey)) {\n const matchingIndex = item.queryKeys.findIndex(\n (keyInItem) => JSON.stringify(keyInItem) === JSON.stringify(queryKey)\n );\n if (matchingIndex !== -1) {\n const newQueryKeys = [...item.queryKeys];\n newQueryKeys.splice(matchingIndex, 1);\n updatedByKey[key] = {\n ...item,\n queryKeys: newQueryKeys,\n };\n }\n }\n\n // if any invalidation has no more queryKeys, remove it entirely\n for (const [key, item] of Object.entries(updatedByKey)) {\n if (item.queryKeys.length === 0) {\n delete updatedByKey[key];\n }\n }\n return {\n byKey: updatedByKey,\n };\n });\n },\n\n setDecryptionObservedAt: ({\n key,\n blockNumber,\n blockHash,\n }: {\n key: string;\n blockNumber: bigint;\n blockHash?: `0x${string}`;\n }) => {\n set((state) => {\n const existing = state.byKey[key];\n if (!existing) return state;\n return {\n byKey: {\n ...state.byKey,\n [key]: {\n ...existing,\n decryptionObservedAt: {\n blockNumber,\n blockHash,\n timestamp: Date.now(),\n },\n },\n },\n };\n });\n },\n }),\n {\n name: 'cofhe-scheduled-invalidations',\n storage: bigintStorage,\n version: 1,\n }\n )\n);\n","import { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useMemo } from 'react';\nimport type { QueryKey } from '@tanstack/react-query';\n\nexport function useAwaitingDecryptionQueryKeySet(): ReadonlySet<string> {\n const { byKey } = useDecryptionWatchersStore();\n\n const cacheKeysAwaitingDecryption = useMemo(() => Object.values(byKey).flatMap((item) => item.queryKeys), [byKey]);\n\n return useMemo(\n () => new Set(cacheKeysAwaitingDecryption.map((key) => JSON.stringify(key))),\n [cacheKeysAwaitingDecryption]\n );\n}\n\nexport function useIsWaitingForDecryptionToInvalidate(queryKey: QueryKey): boolean {\n const cacheKeySet = useAwaitingDecryptionQueryKeySet();\n\n const result = useMemo(() => cacheKeySet.has(JSON.stringify(queryKey)), [cacheKeySet, queryKey]);\n\n console.log(`isWaitingForDecryption for queryKey ${JSON.stringify(queryKey)}:`, result);\n\n return result;\n}\n","import { useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransactions<T>({\n chainId,\n account,\n filter,\n reducer,\n}: {\n chainId?: number;\n account?: string;\n filter?: (tx: Transaction) => boolean;\n reducer?: (txs: Transaction[]) => T;\n}) {\n const transactions = useTransactionStore((state) => state.transactions);\n\n const transactionsAsArray = useMemo(\n () =>\n Object.values(\n chainId\n ? // if chainId provided -- will filter on chain's txs first\n transactions[chainId] ?? {}\n : // if chainId not provided -- will filter on all txs\n Object.values(transactions).flatMap((chainTxs) => Object.values(chainTxs))\n ),\n [transactions, chainId]\n );\n\n const filtered = useMemo(\n () =>\n transactionsAsArray.filter((tx) => {\n if (account && tx.account.toLowerCase() !== account.toLowerCase()) return false;\n\n if (filter && !filter(tx)) return false;\n\n return true;\n }),\n [transactionsAsArray, filter, account]\n );\n\n const reduced = useMemo(() => {\n return reducer?.(filtered);\n }, [filtered, reducer]);\n\n const uniqueHashes = new Set(filtered.map((tx) => tx.hash));\n\n assert(\n uniqueHashes.size === filtered.length,\n 'There should be no duplicate transactions with the same hash in the result'\n );\n\n const filteredTxsByHash = useMemo(\n () =>\n filtered.reduce<Record<`0x${string}`, Transaction>>((acc, tx) => {\n return {\n ...acc,\n [tx.hash]: tx,\n };\n }, {}),\n [filtered]\n );\n return {\n filteredTxs: filtered,\n hashes: uniqueHashes,\n filteredTxsByHash,\n reduced,\n };\n}\n","import { TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useStoredTransactions } from './useStoredTransactions';\n\nconst filter = (tx: Transaction) => tx.status === TransactionStatus.Pending;\nexport function usePendingTransactions(): Transaction[] {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs } = useStoredTransactions({\n chainId,\n account,\n filter,\n });\n return filteredTxs;\n}\n","import { usePortalToasts } from '@/stores';\nimport type { DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport type { Transaction } from '@/stores/transactionStore';\nimport type { TransactionReceipt } from 'viem';\n\nconst TOAST_DELAY_MS = 10_000;\nfunction useTransactionGlobalToastsLifecycle() {\n const { addToast } = usePortalToasts();\n return {\n // 1.tx is submitted\n onTransactionSubmitted: (transaction: Transaction) => {\n console.log('____ Transaction submitted:', transaction);\n addToast(\n {\n variant: 'info',\n title: `${transaction.actionType} Transaction Submitted`,\n description: `${transaction.actionType} transaction has been submitted.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n onTransactionSubmitError: (error: unknown, transactionType: Transaction['actionType']) => {\n console.error('____ Transaction submission failed for type:', transactionType, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transactionType} Transaction Submission Failed`,\n description:\n error instanceof Error ? error.message : 'An unknown error occurred during transaction submission.',\n },\n TOAST_DELAY_MS\n );\n },\n\n // 2.a. tx is mined (could be success or fail)\n onTransactionMined: (transaction: Transaction, receipt: TransactionReceipt /* could be fail or success */) => {\n console.log('____ Transaction mined:', transaction, 'with receipt:', receipt);\n if (receipt.status === 'success') {\n const descriptionPostfix = transaction.isPendingDecryption ? ' It is pending decryption now.' : '';\n addToast(\n {\n variant: transaction.isPendingDecryption ? 'info' : 'success', // if pending decryption, show as info\n title: `${transaction.actionType} Transaction Mined`,\n description: `${transaction.actionType} transaction has been mined.${descriptionPostfix}`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n } else {\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Failed`,\n description: `${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n }\n },\n // 2.b. tx receipt fetch failed\n onWatchReceiptFailure: (error: unknown, transaction: Transaction) => {\n console.error('____ Transaction receipt fetch failed for tx:', transaction, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Fetch Failed`,\n description: `Fetching ${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n\n // 3. tx is decrypted (if applicable)\n onTransactionDecrypted: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => {\n console.log('____ Transaction decrypted:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n addToast(\n {\n variant: 'success',\n title: `${decryptionCausingTx.actionType} Decryption Succeeded`,\n description: `${decryptionCausingTx.actionType} transaction has been decrypted.`,\n transaction: {\n hash: decryptionCausingTx.hash,\n chainId: decryptionCausingTx.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n };\n}\n\nexport function useTransactionGlobalLifecycle() {\n const {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n } = useTransactionGlobalToastsLifecycle();\n\n // You can add more lifecycle handlers here in the future if needed. For now only toasts. Cache invalidations are built-in in other, lower-level hooks.\n return {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n };\n}\n","import { TransactionStatus, useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useTransactionReceiptsByHash } from './useTransactionReceiptsByHash';\nimport { assert } from 'ts-essentials';\nimport { useCofheReadDecryptionResults } from './useCofheReadDecryptionResults';\nimport { useInternalQueryClient } from '@/providers';\nimport { useDecryptionWatchersStore, type DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\n\nfunction useHandleInvalidationsAfterDecryption() {\n const queryClient = useInternalQueryClient();\n return useCallback<UseTrackDecryptingTransactionsBaseInput['onDecryptionResolve']>(\n async (tx, decryptionWatcher) => {\n console.log('Invalidating queries for decryption watcher:', decryptionWatcher);\n for (const queryKey of decryptionWatcher.queryKeys) {\n console.log('Invalidating query due to observed decryption:', queryKey);\n // query invalidation will cause __decryption-block-aware__ readContract calls to wait until RPC is aware of the decryption block\n // and on successful read, the queryKey will be removed from the decryption watchers store,\n // and then if a watcher doesn't have queryKeys anymore, it will be removed entirely from the store\n // which ends the tracking lifecycle for that decryption event\n await queryClient.invalidateQueries({ queryKey });\n }\n },\n [queryClient]\n );\n}\n\nconst filter = (tx: Transaction) => tx.isPendingDecryption && tx.status === TransactionStatus.Confirmed;\ntype UseTrackDecryptingTransactionsBaseInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\nfunction useTrackDecryptingTransactionsBase({ onDecryptionResolve }: UseTrackDecryptingTransactionsBaseInput) {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n // step 1: get all mined txs that are pending decryption\n const { hashes, filteredTxsByHash: minedTxsPendingDecryptionByHash } = useStoredTransactions({\n filter,\n account,\n chainId,\n });\n\n // todo: first check if pending queries cache already has that, might spare a request\n // step 2: get their receipts (to parse logs and find ciphertexts to watch)\n const { receiptsByHash } = useTransactionReceiptsByHash({\n hashes,\n });\n\n // step 3: from receipts, find ciphertexts to watch\n const minedTxsWithCiphertextsToWatch = useMemo(() => {\n return Object.entries(minedTxsPendingDecryptionByHash)\n .filter(([, tx]) => receiptsByHash[tx.hash] !== undefined)\n .map(([, tx]) => {\n const ciphertextToWatch = findDecryptRequestLog(tx.account, receiptsByHash[tx.hash].logs)?.ciphertext;\n assert(\n ciphertextToWatch,\n 'Ciphertext to watch should be found in the transaction logs if a tx that isPendingDecryption and has a receipt'\n );\n return {\n tx,\n receipt: receiptsByHash[tx.hash],\n ciphertextToWatch,\n };\n });\n }, [minedTxsPendingDecryptionByHash, receiptsByHash]);\n\n const ciphertextsToWatch = useMemo(() => {\n return new Set(minedTxsWithCiphertextsToWatch.map(({ ciphertextToWatch }) => ciphertextToWatch));\n }, [minedTxsWithCiphertextsToWatch]);\n\n // step 4: use decryption results polling hook to watch for decryption results\n const decryptionResults = useCofheReadDecryptionResults(ciphertextsToWatch);\n\n const queryClient = useInternalQueryClient();\n\n const { setDecryptionObservedAt } = useDecryptionWatchersStore();\n\n // step 5: when decryption results arrive, update store and and set decryptionObservedAt info to trigger invalidations\n useEffect(() => {\n const txsWithDecryptionResults = minedTxsWithCiphertextsToWatch\n .filter(({ ciphertextToWatch }) => decryptionResults[ciphertextToWatch] !== undefined)\n .map((item) => {\n const decryptionResult = decryptionResults[item.ciphertextToWatch];\n assert(decryptionResult, 'decryptionResult must be defined here');\n return {\n ...item,\n decryptionResult: decryptionResult,\n };\n });\n\n for (const { tx, decryptionResult, receipt, ciphertextToWatch } of txsWithDecryptionResults) {\n // update store\n useTransactionStore.getState().setTransactionDecryptionStatus(\n tx.chainId,\n tx.hash,\n false // no longer pending decryption\n );\n\n console.log('Decryption completed for tx, invalidating relevant queries', {\n tx,\n decryptionResult,\n receipt,\n ciphertextToWatch,\n });\n // before cache invalidation, make sure the request that follows will use up-to-date block number\n setDecryptionObservedAt({\n key: `${tx.actionType}-tx-${tx.hash}`,\n blockNumber: decryptionResult.observedAt.blockNumber,\n blockHash: decryptionResult.observedAt.blockHash,\n });\n }\n }, [decryptionResults, queryClient, setDecryptionObservedAt, minedTxsWithCiphertextsToWatch]);\n\n // step 6: invalidate relevant queries when decryption is observed\n useOnDecryptionCallback({\n onDecryptionResolve,\n });\n}\n\ntype OnDecryptionInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\nfunction useOnDecryptionCallback({ onDecryptionResolve }: OnDecryptionInput) {\n const { byKey } = useDecryptionWatchersStore();\n\n // step 1: get all query keys that need to be invalidated due to observed decryption\n const watchersWithObservedDecryption = useMemo(\n () => Object.values(byKey).filter((item) => item.decryptionObservedAt !== undefined),\n [byKey]\n );\n\n console.log('All observed decryptions:', watchersWithObservedDecryption);\n\n const handleDecryptionResolve = useCallback(async () => {\n const transactionStore = useTransactionStore.getState().transactions;\n for (const sch of watchersWithObservedDecryption) {\n const tx = transactionStore[sch.chainId]?.[sch.triggerTxHash];\n onDecryptionResolve(tx, sch);\n }\n }, [watchersWithObservedDecryption, onDecryptionResolve]);\n\n const stableHandleDecryptionResolve = useRef(handleDecryptionResolve);\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n\n useEffect(() => {\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n }, [handleDecryptionResolve]);\n\n useEffect(() => {\n if (watchersWithObservedDecryption.length > 0) {\n console.log('All observed decryption query keys subject to invalidate:', watchersWithObservedDecryption);\n stableHandleDecryptionResolve.current();\n }\n }, [watchersWithObservedDecryption]);\n}\n\nfunction findDecryptRequestLog(account: string, logs: { topics: string[]; data: string }[] = []) {\n for (const log of logs) {\n const result = safeParseDecryptRequestLog(log, account);\n if (result) return result;\n }\n return undefined;\n}\n\nfunction safeParseDecryptRequestLog(\n log: { topics: string[]; data: string },\n account: string\n):\n | false\n | {\n ciphertext: string;\n } {\n const topic0Correct = log.topics[0]\n ?.toLowerCase()\n .startsWith('0xe9de54a3e7ddf0c48cc6e1134185300d5a71acbf2d8c21fcdefa9d9dd9e20ac1');\n const topic1Correct = log.topics[1] === undefined;\n const strippedData = log.data.startsWith('0x') ? log.data.slice(2) : log.data;\n const dataAsWords = strippedData.match(/.{1,64}/g) || [];\n\n const word1IsCorrect =\n dataAsWords[1]?.toLowerCase() === '00000000000000000000000000000000000000000000000000000000000000a0';\n const word2IsCorrect = dataAsWords[2]?.toLowerCase() === account.toLowerCase().slice(2).padStart(64, '0');\n return topic0Correct && topic1Correct && word1IsCorrect && word2IsCorrect\n ? {\n ciphertext: '0x' + dataAsWords[0],\n }\n : false;\n}\n\nexport function useTrackDecryptingTransactions() {\n const handleInvalidationsAfterDecryption = useHandleInvalidationsAfterDecryption();\n const { onTransactionDecrypted } = useTransactionGlobalLifecycle();\n\n useTrackDecryptingTransactionsBase({\n onDecryptionResolve: async (decryptionCausingTx, decryptionWatcher) => {\n console.log('Decryption resolved for tx:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n handleInvalidationsAfterDecryption(decryptionCausingTx, decryptionWatcher);\n onTransactionDecrypted(decryptionCausingTx, decryptionWatcher);\n },\n });\n}\n","import { useMemo } from 'react';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { TransactionReceipt } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\n\ntype TxReceiptQueryKey = readonly ['tx-receipt', number | undefined, `0x${string}`];\n\nexport type UseTransactionReceiptsByHashInput = {\n hashes?: Set<`0x${string}`>;\n /** Defaults to the connected chain id. */\n chainId?: number;\n enabled?: boolean;\n /** Additional TanStack query options applied to each receipt query. */\n queryOptions?: Omit<\n UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>,\n 'queryKey' | 'queryFn' | 'enabled'\n >;\n};\n\nexport type UseTransactionReceiptsByHashResult = {\n queriesResults: UseQueryResult<TransactionReceipt, Error>[];\n receiptsByHash: Record<`0x${string}`, TransactionReceipt>;\n};\n\n/**\n * Fetch receipts for a list of already-mined transaction hashes.\n * Uses the internal TanStack QueryClient via `useInternalQueries`.\n */\nexport function useTransactionReceiptsByHash(\n { hashes, chainId: chainIdInput, enabled: enabledInput = true, queryOptions }: UseTransactionReceiptsByHashInput = {\n enabled: true,\n }\n): UseTransactionReceiptsByHashResult {\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const chainId = chainIdInput ?? cofheChainId;\n\n const enabled = !!publicClient && !!chainId && enabledInput && hashes !== undefined && hashes?.size > 0;\n\n const queries = useMemo(() => {\n if (!hashes) return [];\n return Array.from(hashes).map((hash) => {\n const queryKey: TxReceiptQueryKey = ['tx-receipt', chainId, hash];\n\n return {\n queryKey,\n enabled,\n queryFn: async (): Promise<TransactionReceipt> => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n // The caller guarantees these txs are already mined.\n return await publicClient.getTransactionReceipt({ hash });\n },\n notifyOnChangeProps: ['data'],\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n ...queryOptions,\n } satisfies UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>;\n });\n }, [chainId, enabled, hashes, publicClient, queryOptions]);\n\n const queriesResults: UseQueryResult<TransactionReceipt, Error>[] = useInternalQueries({\n queries,\n });\n\n const receiptsByHash = useMemo<Record<`0x${string}`, TransactionReceipt>>(() => {\n console.log('useTransactionReceiptsByHash - receiptsByHash recalculated');\n if (!hashes) return {};\n return Array.from(hashes).reduce<Record<`0x${string}`, TransactionReceipt>>((acc, hash, i) => {\n // skip those that don't have receipt data yet\n if (!queriesResults[i]?.data) return acc;\n\n acc[hash] = queriesResults[i].data;\n return acc;\n }, {});\n }, [hashes, queriesResults]);\n\n return { queriesResults, receiptsByHash };\n}\n","import { useMemo } from 'react';\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n// TODO: find proper place to put this constant, it's also duped now (exists in hardhat package)\nexport const TASK_MANAGER_ADDRESS = '0xeA30c4B8b44078Bbf8a6ef5b9f1eC1626C7848D9';\n\n// function getDecryptResultSafe(uint256 ctHash) external view returns (uint256, bool)\nconst TASK_MANAGER_ABI = [\n {\n type: 'function',\n name: 'getDecryptResultSafe',\n inputs: [\n {\n name: 'ctHash',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'result',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'decrypted',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n\nconst DECRYPTION_RESULT_POLLING_INTERVAL_MS = 5_000;\nexport type DecryptionResultWithObservedBlock = {\n result: bigint;\n decrypted: true;\n observedAt: {\n blockNumber: bigint;\n blockHash: `0x${string}`;\n };\n};\nexport function useCofheReadDecryptionResults(ciphertexts: Set<string>) {\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n\n const queries = useMemo(() => {\n return Array.from(ciphertexts).map((ct) => {\n return {\n queryKey: ['decryptionResult', chainId, ct] as const,\n queryFn: async ({ signal }: { signal: AbortSignal }) => {\n if (!publicClient) throw new Error('PublicClient is required');\n\n // Keep the query in-flight until the decryption result is available.\n // This way `isFetching` reflects the real \"waiting for decryption\" period.\n while (!signal.aborted) {\n // Try to fetch (1) decryption result and (2) latest block header together.\n // If the transport batches, these should go in one JSON-RPC batch.\n const [res, block] = await Promise.allSettled([\n publicClient.readContract({\n address: TASK_MANAGER_ADDRESS,\n abi: TASK_MANAGER_ABI,\n functionName: 'getDecryptResultSafe',\n args: [BigInt(ct)],\n }),\n publicClient.getBlock(),\n ]);\n\n if (\n res.status === 'fulfilled' &&\n block.status === 'fulfilled' &&\n block.value?.hash &&\n block.value?.number\n ) {\n const decoded = res.value;\n const result = decoded[0];\n const decrypted = decoded[1];\n\n if (decrypted) {\n const data: DecryptionResultWithObservedBlock = {\n result,\n decrypted: true,\n observedAt: {\n blockNumber: block.value.number,\n blockHash: block.value.hash,\n },\n };\n\n return data;\n }\n }\n\n await sleep(DECRYPTION_RESULT_POLLING_INTERVAL_MS, signal);\n }\n\n throw abortError();\n },\n enabled: !!publicClient && !!chainId && ct !== undefined,\n };\n });\n }, [chainId, ciphertexts, publicClient]);\n\n const results = useInternalQueries({ queries });\n\n const isDecryptedByCt = useMemo(() => {\n return results.reduce<Record<string, DecryptionResultWithObservedBlock | undefined>>((record, res, index) => {\n const ct = Array.from(ciphertexts)[index];\n\n record[ct] = res.data;\n\n return record;\n }, {});\n }, [ciphertexts, results]);\n\n return isDecryptedByCt;\n}\n","import type { CofhesdkClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport type { CofhesdkConfigWithReact } from '@/config';\n\nexport const useCofheClient = (): CofhesdkClient<CofhesdkConfigWithReact> => {\n return useCofheContext().client;\n};\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { FheTypes } from '@cofhe/sdk';\nimport { type Token } from './useCofheTokenLists';\nimport { CONFIDENTIAL_ABIS, getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport { assert } from 'ts-essentials';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport { useCofheReadContractAndDecrypt } from './useCofheReadContractAndDecrypt';\nimport { ErrorCause } from '@/utils';\n\n// ============================================================================\n// Unified Confidential Balance Hook\n// ============================================================================\n\ntype UseConfidentialTokenBalanceInput = {\n /** Token from token list */\n token?: Token;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UseConfidentialTokenBalanceOptions = Omit<UseQueryOptions<bigint, Error>, 'queryKey' | 'queryFn' | 'select'> & {\n enabled?: boolean;\n};\n\ntype UseConfidentialTokenBalanceResult = {\n /** Raw balance in smallest unit (bigint) */\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n disabledDueToMissingPermit: boolean;\n};\n\n/**\n * Hook to get confidential (encrypted) balance for a token with convenient formatting.\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with raw bigint, formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenDecryptedBalance(\n { token, accountAddress, displayDecimals = 5 }: UseConfidentialTokenBalanceInput,\n options?: UseConfidentialTokenBalanceOptions\n): UseConfidentialTokenBalanceResult {\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const fheType = token?.extensions.fhenix.confidentialValueType === 'uint64' ? FheTypes.Uint64 : FheTypes.Uint128;\n\n const contractConfig = token && getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n\n const {\n decrypted: { data: decryptedData, isFetching: isDecryptionFetching },\n encrypted: { isFetching: isEncryptedFetching, refetch: refetchCiphertext },\n disabledDueToMissingPermit,\n } = useCofheReadContractAndDecrypt(\n {\n address: token?.address,\n abi: contractConfig?.abi,\n functionName: contractConfig?.functionName,\n args: accountAddress ? [accountAddress] : undefined,\n requiresPermit: true,\n potentialDecryptErrorCause: ErrorCause.AttemptToFetchConfidentialBalance,\n },\n {\n readQueryOptions: {\n refetchOnMount: false,\n enabled: userEnabled && !!token,\n },\n decryptingQueryOptions: {\n refetchOnMount: false,\n select: (amountWei) => {\n assert(token, 'Token must be defined to format confidential balance');\n if (typeof amountWei !== 'bigint') {\n throw new Error('Expected bigint from confidential decryption');\n }\n return formatTokenAmount(amountWei, token.decimals, displayDecimals);\n },\n },\n ...restOptions,\n }\n );\n\n return {\n disabledDueToMissingPermit,\n\n data: decryptedData,\n\n isFetching: isDecryptionFetching || isEncryptedFetching,\n refetch: refetchCiphertext,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address, type Abi, type ContractFunctionName, type ContractFunctionArgs } from 'viem';\nimport { FheTypes, type UnsealedItem } from '@cofhe/sdk';\nimport { ErrorCause } from '@/utils/errors';\nimport { useCofheDecrypt } from './useCofheDecrypt';\nimport {\n useCofheReadContract,\n type UseCofheReadContractQueryOptions,\n type UseCofheReadContractResult,\n} from './useCofheReadContract';\nimport type { CofheFirstReturnFheType, CofheReturnType, EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\ntype SupportedFheTypeFromReturn<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> =\n CofheFirstReturnFheType<TAbi, TfunctionName> extends FheTypes\n ? CofheFirstReturnFheType<TAbi, TfunctionName>\n : FheTypes;\n\nfunction isEncryptedValue<TFheType extends FheTypes>(value: unknown): value is EncryptedReturnTypeByUtype<TFheType> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'ctHash' in value &&\n 'utype' in value &&\n Object.values<unknown>(FheTypes).includes(value.utype)\n );\n}\n\nfunction convertCofheReturnTypeToEncryptedReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes,\n>(value: CofheReturnType<TAbi, TfunctionName>): EncryptedReturnTypeByUtype<TFheType> {\n if (isEncryptedValue<TFheType>(value)) return value;\n\n // TODO: convertCofheReturnTypeToEncryptedReturnType -- support for mixed return types (e.g., structs with both encrypted and plain values)\n throw new Error(\n 'Auto-decryption now only supports a case where the contract function returns a single encrypted value'\n );\n}\n/**\n * Generic hook: read a confidential contract value and decrypt it.\n */\n// TODO: useCofheReadContractAndDecrypt only works for a scenario when the contract function returns a signle plain encrypted value (i.e. not struct etc)\nexport function useCofheReadContractAndDecrypt<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes = SupportedFheTypeFromReturn<TAbi, TfunctionName>,\n TDecryptedSelectedData = UnsealedItem<TFheType>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n potentialDecryptErrorCause: ErrorCause;\n },\n\n {\n readQueryOptions,\n decryptingQueryOptions,\n }: {\n readQueryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n decryptingQueryOptions?: Omit<\n UseQueryOptions<UnsealedItem<TFheType>, Error, TDecryptedSelectedData>,\n 'queryKey' | 'queryFn'\n >;\n } = {}\n): {\n encrypted: UseCofheReadContractResult<TAbi, TfunctionName>;\n decrypted: UseQueryResult<TDecryptedSelectedData, Error>;\n disabledDueToMissingPermit: boolean;\n} {\n const { address, abi, functionName, args, requiresPermit = true, potentialDecryptErrorCause } = params;\n\n const encrypted = useCofheReadContract({ address, abi, functionName, args, requiresPermit }, readQueryOptions);\n\n const encryptedData = encrypted.data;\n\n const asEncryptedReturnType = encryptedData\n ? convertCofheReturnTypeToEncryptedReturnType<TAbi, TfunctionName, TFheType>(encryptedData)\n : undefined;\n\n const decrypted = useCofheDecrypt(\n {\n input: asEncryptedReturnType,\n\n cause: potentialDecryptErrorCause,\n },\n decryptingQueryOptions\n );\n\n return {\n encrypted,\n decrypted,\n disabledDueToMissingPermit: encrypted.disabledDueToMissingPermit,\n };\n}\n","import { useCofheContext, useInternalQuery } from '@/providers';\nimport { FheTypes, type UnsealedItem } from '@cofhe/sdk';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { ErrorCause, withQueryErrorCause } from '@/utils';\nimport { assert } from 'ts-essentials';\nimport type { EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\n/**\n * Hook to decrypt a ciphertext using the Cofhe SDK client.\n * @param input - Ciphertext and FHE type\n * @param queryOptions - Optional React Query options\n * @returns Decrypted balance as bigint\n */\nexport function useCofheDecrypt<U extends FheTypes, TSeletedData = UnsealedItem<U>>(\n {\n input,\n cause,\n }: {\n input?: EncryptedReturnTypeByUtype<U>;\n cause: ErrorCause;\n },\n queryOptions?: Omit<UseQueryOptions<UnsealedItem<U>, Error, TSeletedData>, 'queryKey' | 'queryFn'>\n): UseQueryResult<TSeletedData, Error> {\n const { client } = useCofheContext();\n const isCofheErrorActive = useIsCofheErrorActive();\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions || {};\n const enabled = !!input && input.ctHash > 0n && !isCofheErrorActive && !!client && (userEnabled ?? true);\n\n return useInternalQuery({\n enabled,\n queryKey: ['decryptCiphertext', input?.ctHash.toString(), input?.utype],\n queryFn: withQueryErrorCause(cause, async () => {\n assert(input, 'input is guaranteed to be defined by enabled condition');\n return client.decryptHandle(input.ctHash, input.utype).decrypt();\n }),\n ...restQueryOptions,\n });\n}\n","import { type Address } from 'viem';\nimport type { Token } from './useCofheTokenLists.js';\nimport { TRANSFER_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { type EncryptableItem } from '@cofhe/sdk';\nimport { useCofheEncryptAndWriteContract } from './useCofheEncryptAndWriteContract.js';\nimport type { useCofheWriteContractOptions } from './useCofheWriteContract.js';\nimport type { EncryptionOptions } from './useCofheEncrypt.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\ntype TokenTransferExtras = { token: Token; amount: bigint; userAddress: Address };\ntype UseCofheTokenTransferOptions = Pick<\n useCofheWriteContractOptions<TokenTransferExtras>,\n 'onSuccess' | 'onError' | 'onMutate'\n>;\n\ntype EncryptAndSendInput = {\n input: {\n token: Token;\n to: Address;\n amount: bigint;\n userAddress: Address;\n };\n encryptionOptions?: EncryptionOptions<EncryptableItem>;\n};\n\nexport function useCofheTokenTransfer(writeMutationOptions?: UseCofheTokenTransferOptions) {\n const { onSuccess: passedOnSuccess, onError: passedOnError, ...restOfOptions } = writeMutationOptions || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n const { encryption, write, encryptAndWrite } = useCofheEncryptAndWriteContract<TokenTransferExtras>({\n writingMutationOptions: {\n onError: (error, variables, onMutateResult, context) => {\n if (passedOnError) passedOnError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.ShieldSend);\n },\n onSuccess: (hash, variables, onMutateResult, context) => {\n if (passedOnSuccess) passedOnSuccess(hash, variables, onMutateResult, context);\n\n const extras =\n typeof variables === 'object' && variables !== null && 'extras' in variables ? variables.extras : null;\n\n if (!extras) return;\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: extras.token,\n tokenAmount: extras.amount,\n chainId: extras.token.chainId,\n actionType: TransactionActionType.ShieldSend,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account: extras.userAddress,\n });\n },\n ...restOfOptions,\n },\n });\n\n return {\n encryption,\n write,\n isPending: encryption.isPending || write.isPending,\n data: write.data,\n encryptAmountAndSendToken: ({ input, encryptionOptions }: EncryptAndSendInput) => {\n const { token, to, amount, userAddress } = input;\n\n const { input: _ignoredInput, ...encryptionOpts } = encryptionOptions ?? {};\n const contractConfig = TRANSFER_ABIS[token.extensions.fhenix.confidentialityType];\n\n return encryptAndWrite({\n params: {\n address: token.address,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n account: userAddress,\n chain: undefined,\n },\n args: [to, amount] as const,\n extras: {\n token,\n amount,\n userAddress,\n },\n encryptionOptions: encryptionOpts,\n });\n },\n };\n}\n","import type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n WriteContractParameters,\n WriteContractReturnType,\n} from 'viem';\nimport { type CofheInputArgsPreTransform, extractEncryptableValues, insertEncryptedValues } from '@cofhe/abi';\nimport type { EncryptableItem, EncryptedItemInput } from '@cofhe/sdk';\nimport { useCofheEncrypt, type EncryptInputsOptions, type UseCofheEncryptOptions } from './useCofheEncrypt';\nimport { useCofheWriteContract, type useCofheWriteContractOptions } from './useCofheWriteContract';\n\ntype NoInferLocal<T> = [T][T extends any ? 0 : never];\n\ntype ConfidentialityAwareAbiArgs<TAbi extends Abi | readonly unknown[], TFunctionName extends string> = NoInferLocal<\n Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n>;\n\nexport async function _encryptAndWriteContract<\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>({\n params,\n args,\n encrypt,\n write,\n}: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n // Don't let args participate in inferring `TAbi`/`TFunctionName`.\n // Otherwise, an incorrect args shape can cause TS to widen TAbi to `readonly unknown[]`\n // (and then args become `unknown[]`, silently accepting anything).\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>;\n write: (\n writeParams: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >\n ) => Promise<WriteContractReturnType>;\n}): Promise<WriteContractReturnType> {\n const transformer = constructEncryptAndTransform<TAbi, TFunctionName, TChainOverride>(\n params.abi,\n params.functionName,\n encrypt\n );\n const transformedArgs: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'] = await transformer(args);\n\n // You can’t fix that spot “purely” (no as … and no any) while keeping this wrapper fully-generic over TAbi/TFunctionName.\n // Reason: viem’s WriteContractParameters ultimately includes a conditional type that depends on:\n // readonly [] extends ContractFunctionArgs<TAbi, ..., TFunctionName>\n // Inside a generic function body, TypeScript must typecheck for all possible TAbi/TFunctionName, so it cannot prove which branch you’re in. That’s why it rejects constructing/passing newParams as WriteContractParameters<...> even when your runtime object is correct.\n const newParams = {\n ...params,\n args: transformedArgs,\n } as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >;\n\n return write(newParams);\n}\n\nfunction constructEncryptAndTransform<\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>(\n abi: TAbi,\n functionName: TFunctionName,\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>\n): (\n mixedArgs: Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n) => Promise<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args']\n> {\n // encrypts inputs that need to be encrypted and transform them\n return async (mixedArgs) => {\n const extracted = extractEncryptableValues(abi, functionName, mixedArgs);\n const encrypted = await encrypt(extracted);\n const merged = insertEncryptedValues(abi, functionName, mixedArgs, encrypted);\n\n // TODO: mismatch between CofheInputArgs<TAbi, TFunctionName> and WriteContractParameters<...>['args'] types\n return merged as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'];\n };\n}\n\nexport function useCofheEncryptAndWriteContract<TExtraVars = unknown>({\n encrypingMutationOptions,\n writingMutationOptions,\n}: {\n encrypingMutationOptions?: UseCofheEncryptOptions;\n writingMutationOptions?: useCofheWriteContractOptions<TExtraVars>;\n} = {}) {\n const encryption = useCofheEncrypt(encrypingMutationOptions);\n const write = useCofheWriteContract<TExtraVars>(writingMutationOptions);\n\n const encryptAndWrite = async <\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n >(args: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n extras?: TExtraVars;\n encryptionOptions?: EncryptInputsOptions;\n }) =>\n _encryptAndWriteContract<TAbi, TFunctionName, TChainOverride>({\n ...args,\n encrypt: (encryptableItems) =>\n encryption.encryptInputsAsync({\n items: encryptableItems as readonly EncryptableItem[],\n ...(args.encryptionOptions ?? {}),\n }),\n write: (writeParams) => {\n const vars =\n 'extras' in args ? { writeContractInput: writeParams, extras: args.extras as TExtraVars } : writeParams;\n\n return write.writeContractAsync<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride\n >(vars);\n },\n });\n\n return {\n encryptAndWrite,\n encryption,\n write,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport {\n assertCorrectEncryptedItemInput,\n EncryptStep,\n type EncryptableItem,\n type EncryptedItemInput,\n type EncryptStepCallbackContext,\n type EncryptedItemInputs,\n isLastEncryptionStep,\n} from '@cofhe/sdk';\nimport { assert } from 'ts-essentials';\nimport { useStepsState, type EncryptionStep, type StepsState } from './internal/useStepsState';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheContext } from '../providers/index.js';\nexport type EncryptableArray = readonly EncryptableItem[];\nexport type EncryptionOptions<T extends EncryptableItem | EncryptableArray> = {\n input?: T;\n account?: string;\n chainId?: number;\n securityZone?: number; // TODO: potential conflifct/ambiguity with createEncryptable arg - figure it out\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\ntype StepConfig = { label: string; progress: number };\nconst STEP_CONFIG: Record<EncryptStep, StepConfig> = {\n initTfhe: {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n fetchKeys: {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n pack: {\n label: 'Packing data...',\n progress: 40,\n },\n prove: {\n label: 'Generating proof...',\n progress: 70,\n },\n verify: {\n label: 'Verifying...',\n progress: 90,\n },\n};\n\nconst DONE_STEP_CONFIG: StepConfig = {\n label: 'Encryption complete!',\n progress: 100,\n};\n\nexport function getStepConfig(step: EncryptionStep) {\n if (isLastEncryptionStep(step.step) && step.context?.isEnd) return DONE_STEP_CONFIG;\n\n return STEP_CONFIG[step.step];\n}\ntype EncryptInputsResult<T extends readonly EncryptableItem[]> = EncryptedItemInputs<[...T]>;\n\nexport type EncryptInputsOptions = {\n account?: string;\n chainId?: number;\n securityZone?: number;\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\nexport type EncryptInputsVariables<T extends readonly EncryptableItem[] = readonly EncryptableItem[]> =\n | T\n | ({\n items: T;\n } & EncryptInputsOptions);\n\nfunction hasEncryptInputsOptions<T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n): variables is { items: T } & EncryptInputsOptions {\n return typeof variables === 'object' && variables !== null && 'items' in variables;\n}\n\nfunction assertEncryptInputsResult<T extends readonly EncryptableItem[]>(\n inputs: T,\n encrypted: readonly EncryptedItemInput[]\n): asserts encrypted is EncryptInputsResult<T> {\n if (encrypted.length !== inputs.length) {\n throw new Error(`Encryption result length mismatch (expected ${inputs.length}, got ${encrypted.length})`);\n }\n\n for (let i = 0; i < encrypted.length; i++) {\n const encryptedItem = encrypted[i];\n const inputItem = inputs[i];\n\n assertCorrectEncryptedItemInput(encryptedItem);\n\n if (encryptedItem.utype !== inputItem.utype) {\n throw new Error(`Encryption result type mismatch at index ${i}`);\n }\n }\n}\n\nexport type UseCofheEncryptOptions = Omit<\n UseMutationOptions<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: encrypt a list of EncryptableItems into encrypted input structs.\n *\n */\nexport function useCofheEncrypt(options?: UseCofheEncryptOptions): UseMutationResult<\n readonly EncryptedItemInput[],\n Error,\n EncryptInputsVariables,\n void\n> & {\n encryptInputsAsync: <const T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n ) => Promise<EncryptInputsResult<T>>;\n encryptInputs: (variables: EncryptInputsVariables) => void;\n isEncrypting: boolean;\n stepsState: StepsState;\n} {\n const client = useCofheContext().client;\n const stepsState = useStepsState();\n const { onStep: handleStepStateChange, onSetKey: handleStepSetKey } = stepsState;\n\n const mutation = useInternalMutation<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'encryptInputs'],\n mutationFn: async (variables) => {\n assert(client, 'CoFHE client not initialized');\n\n const key = crypto.randomUUID();\n handleStepSetKey(key);\n\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n // SDK expects a mutable array type; copy preserves runtime value while satisfying typing.\n const mutableItems = Array.from(items);\n\n const builder = client.encryptInputs(mutableItems);\n\n const externalOnStepChange = hasEncryptInputsOptions(variables) ? variables.onStepChange : undefined;\n\n const combinedOnStepChange = (step: EncryptStep, context?: EncryptStepCallbackContext) => {\n handleStepStateChange(key, step, context);\n externalOnStepChange?.(step, context);\n };\n\n // Always set callback so we can track steps consistently.\n builder.setStepCallback(combinedOnStepChange);\n\n if (hasEncryptInputsOptions(variables)) {\n if (variables.account) builder.setAccount(variables.account);\n if (variables.chainId) builder.setChainId(variables.chainId);\n if (variables.securityZone) builder.setSecurityZone(variables.securityZone);\n }\n\n return builder.encrypt();\n },\n });\n\n return {\n ...mutation,\n encryptInputsAsync: async <const T extends readonly EncryptableItem[]>(variables: EncryptInputsVariables<T>) => {\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n const result = await mutation.mutateAsync(variables);\n assertEncryptInputsResult(items, result);\n return result;\n },\n encryptInputs: (variables) => mutation.mutate(variables),\n isEncrypting: mutation.isPending,\n stepsState,\n };\n}\n","import { EncryptStep, type EncryptStepCallbackContext } from '@cofhe/sdk';\nimport { useCallback, useMemo, useState } from 'react';\n\nexport type EncryptionStep = { step: EncryptStep; context?: EncryptStepCallbackContext };\n\ntype StepWithOrder = `${number}_${EncryptStep}_${'start' | 'stop'}`;\ntype CompactSteps = Partial<Record<StepWithOrder, number | undefined>>;\n\nfunction validateAndCompactizeSteps(encSteps: EncryptionStep[]): CompactSteps {\n const result: CompactSteps = {};\n encSteps.forEach((encStep, index) => {\n const postfix = encStep.context?.isStart ? 'start' : encStep.context?.isEnd ? 'stop' : null;\n if (!postfix) throw new Error('Invalid step context: must be start or end');\n\n const idx: StepWithOrder = `${index}_${encStep.step}_${postfix}`;\n\n result[idx] = encStep.context?.duration;\n });\n\n return result;\n}\n\n// Key is identifier for each encryption mutation call\nexport type StepsState = {\n onStep: (key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n onSetKey: (key: string | null) => void;\n compactSteps: CompactSteps;\n lastStep: EncryptionStep | null;\n};\n\nexport function useStepsState(): StepsState {\n const [steps, setSteps] = useState<Record<string, EncryptionStep[]>>({});\n const [currentKey, setCurrentKey] = useState<string | null>(null);\n\n const onStep = useCallback((key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => {\n if (step === EncryptStep.InitTfhe && context?.isStart) {\n // init with a single-element array\n setSteps((prev) => ({ ...prev, [key]: [{ step, context }] }));\n } else {\n setSteps((prev) => ({ ...prev, [key]: [...prev[key], { step, context }] }));\n }\n }, []);\n\n const onSetKey = useCallback((key: string | null) => {\n setCurrentKey(key);\n }, []);\n\n const compactSteps = useMemo(\n () => validateAndCompactizeSteps(currentKey ? steps[currentKey] : []),\n [steps, currentKey]\n );\n\n const lastStep = currentKey ? steps[currentKey][steps[currentKey].length - 1] : null;\n\n return {\n onStep,\n onSetKey,\n compactSteps,\n lastStep,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n Hash,\n WalletClient,\n WriteContractParameters,\n} from 'viem';\nimport { assert } from 'ts-essentials';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheWalletClient } from './useCofheConnection.js';\n\ntype WalletWriteContractParamsAny = Parameters<WalletClient['writeContract']>[0];\n\nexport type WalletWriteContractInputWithExtras<TExtras> = {\n writeContractInput: WalletWriteContractParamsAny;\n extras: TExtras;\n};\n\ntype WalletWriteContractMutationVariables<TExtras> =\n | WalletWriteContractParamsAny\n | WalletWriteContractInputWithExtras<TExtras>;\n\nfunction hasExtras<TExtras>(\n variables: WalletWriteContractMutationVariables<TExtras>\n): variables is WalletWriteContractInputWithExtras<TExtras> {\n return (\n typeof variables === 'object' && variables !== null && 'writeContractInput' in variables && 'extras' in variables\n );\n}\n\nexport type WalletWriteContractParams<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n> = WriteContractParameters<TAbi, TFunctionName, TArgs, Chain | undefined, Account | undefined, TChainOverride>;\n\nexport type useCofheWriteContractOptions<TExtras = unknown> = Omit<\n UseMutationOptions<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: call `walletClient.writeContract`.\n *\n * Unlike `useCofheWriteContract`, this accepts viem's full `writeContract` parameter type.\n */\nexport function useCofheWriteContract<TExtras = unknown>(\n options?: useCofheWriteContractOptions<TExtras>\n): UseMutationResult<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown> & {\n writeContractAsync: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => Promise<Hash>;\n writeContract: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => void;\n} {\n const walletClient = useCofheWalletClient();\n\n const mutation = useInternalMutation<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'walletWriteContract'],\n mutationFn: async (variables) => {\n assert(walletClient, 'WalletClient is required to write to a contract');\n\n const writeContractInput = hasExtras(variables) ? variables.writeContractInput : variables;\n return walletClient.writeContract(writeContractInput);\n },\n });\n\n const writeContractAsync = async <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutateAsync(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n const writeContract = <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutate(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n return {\n ...mutation,\n writeContractAsync,\n writeContract,\n };\n}\n","import {\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token, ETH_ADDRESS } from './useCofheTokenLists.js';\nimport {\n SHIELD_ABIS,\n UNSHIELD_ABIS,\n CLAIM_ABIS,\n DUAL_GET_UNSHIELD_CLAIM_ABI,\n WRAPPED_ETH_ENCRYPT_ETH_ABI,\n WRAPPED_ENCRYPT_ABI,\n WRAPPED_GET_USER_CLAIMS_ABI,\n ERC20_ALLOWANCE_ABI,\n ERC20_APPROVE_ABI,\n} from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation, useInternalQuery } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UnshieldClaim = {\n ctHash: bigint;\n requestedAmount: bigint;\n decryptedAmount: bigint;\n decrypted: boolean;\n claimed: boolean;\n};\n\ntype UseTokenShieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to shield (in token's smallest unit) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenShieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseTokenShieldInput>, 'mutationFn'>;\n\n// ============================================================================\n// Shield Hook\n// ============================================================================\n\n/**\n * Hook to shield tokens (convert regular balance to confidential)\n * - Dual tokens: calls `shield(uint256 amount)`\n * - Wrapped tokens: TBD (needs approval flow)\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenShield(\n options?: UseTokenShieldOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenShieldInput> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseTokenShieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token shield');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token shield');\n }\n\n // Only dual and wrapped support shielding\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Shield not supported for confidentialityType: ${confidentialityType}`);\n }\n\n let hash: `0x${string}`;\n\n if (confidentialityType === 'wrapped') {\n // Check if this is a wrapped ETH token (erc20Pair is ETH_ADDRESS)\n const erc20PairAddress = input.token.extensions.fhenix.erc20Pair?.address as Address | undefined;\n const isEth = erc20PairAddress?.toLowerCase() === ETH_ADDRESS.toLowerCase();\n\n if (isEth) {\n // For ETH: use encryptETH(address to) with value\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: WRAPPED_ETH_ENCRYPT_ETH_ABI,\n functionName: 'encryptETH',\n args: [walletClient.account.address],\n value: input.amount,\n account: walletClient.account,\n chain: undefined,\n });\n } else {\n // For ERC20 wrapped tokens: need to check allowance and approve if needed\n if (!erc20PairAddress) {\n throw new Error('erc20Pair address is required for wrapped ERC20 tokens');\n }\n\n if (!publicClient) {\n throw new Error('PublicClient is required for allowance check');\n }\n\n // Check current allowance\n input.onStatusChange?.('Checking allowance...');\n const currentAllowance = await publicClient.readContract({\n address: erc20PairAddress,\n abi: ERC20_ALLOWANCE_ABI,\n functionName: 'allowance',\n args: [walletClient.account.address, tokenAddress],\n });\n\n // If allowance is insufficient, request approval\n if (currentAllowance < input.amount) {\n input.onStatusChange?.('Approval required - please confirm in wallet...');\n // Request approval for the exact amount (or max uint256 for unlimited)\n const approvalHash = await walletClient.writeContract({\n address: erc20PairAddress,\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [tokenAddress, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n\n // Wait for approval transaction to be confirmed\n input.onStatusChange?.('Waiting for approval confirmation...');\n await publicClient.waitForTransactionReceipt({ hash: approvalHash });\n input.onStatusChange?.('Approved! Now shielding...');\n }\n\n // Now call encrypt\n input.onStatusChange?.('Please confirm shield in wallet...');\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: WRAPPED_ENCRYPT_ABI,\n functionName: 'encrypt',\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n } else {\n // Dual tokens: use shield(uint256 amount)\n const contractConfig = SHIELD_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for shield: ${confidentialityType}`);\n }\n\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Shield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token shield');\n assert(account, 'Wallet account is required for token shield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Shield,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type MutationFunctionContext, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { UNSHIELD_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, TransactionStatus, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useOnceTransactionMined } from './useOnceTransactionMined.js';\nimport { useOnceDecrypted } from './useOnceDecrypted.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Unshield Hook\n// ============================================================================\ntype UseTokenUnshieldMutationInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to unshield (in token's smallest unit, uint64 max for dual) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenUnshieldMutationOptions = Omit<\n UseMutationOptions<`0x${string}`, Error, UseTokenUnshieldMutationInput>,\n 'mutationFn'\n>;\n/**\n * Hook to unshield tokens (initiate conversion from confidential to regular)\n * - Dual tokens: calls `unshield(uint64 amount)`, then need to claim\n * - Wrapped tokens: TBD\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nfunction useCofheTokenUnshieldMutation(\n options?: UseTokenUnshieldMutationOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenUnshieldMutationInput> {\n const walletClient = useCofheWalletClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n\n const { onSuccess, onError, ...restOfOptions } = options || {};\n\n return useInternalMutation({\n mutationFn: async (input: UseTokenUnshieldMutationInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token unshield');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token unshield');\n }\n\n // Only dual and wrapped support unshielding\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Unshield not supported for confidentialityType: ${confidentialityType}`);\n }\n\n const contractConfig = UNSHIELD_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for unshield: ${confidentialityType}`);\n }\n\n let hash: `0x${string}`;\n\n input.onStatusChange?.('Please confirm in wallet...');\n\n if (confidentialityType === 'wrapped') {\n // Wrapped tokens: decrypt(address to, uint128 value)\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n } else {\n // For dual tokens, unshield takes uint64\n const amount = BigInt.asUintN(64, input.amount);\n\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Unshield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token unshield');\n assert(account, 'Wallet account is required for token unshield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Unshield,\n isPendingDecryption: true, // is tx that requires decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n\ntype UseCofheTokenUnshieldInput = {\n onUserSignatureRequest?: (variables: UseTokenUnshieldMutationInput, context: MutationFunctionContext) => void;\n onTransactionSubmitSuccess?: (hash: `0x${string}`) => void;\n onTransactionSubmitError?: (error: Error) => void;\n onceMined?: (transaction: { hash: `0x${string}`; status: TransactionStatus }) => void;\n onceDecrypted?: () => void;\n};\nexport function useCofheTokenUnshield(input: UseCofheTokenUnshieldInput) {\n const unshieldMutation = useCofheTokenUnshieldMutation({\n onMutate: input.onUserSignatureRequest,\n onSuccess: input.onTransactionSubmitSuccess,\n onError: input.onTransactionSubmitError,\n });\n\n const { isMining: isTokenUnshieldMining } = useOnceTransactionMined({\n txHash: unshieldMutation.data,\n onceMined: input.onceMined,\n });\n\n const { isPendingDecryption } = useOnceDecrypted({\n txHash: unshieldMutation.data,\n onceDecrypted: input.onceDecrypted,\n });\n\n return {\n ...unshieldMutation,\n isTokenUnshieldMining,\n isPendingDecryption,\n };\n}\n","import { type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransaction(txHash: `0x${string}` | undefined) {\n const filter = useMemo(() => {\n return (tx: Transaction) => tx.hash === txHash;\n }, [txHash]);\n const { filteredTxs } = useStoredTransactions({ filter });\n assert(filteredTxs.length <= 1, 'There should be at most one transaction with a given hash');\n\n return filteredTxs[0];\n}\n","import type { Transaction, TransactionStatus } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when transaction is mined (i.e. goes from pending to final status - confirmed/failed)\n// i.e. it wont fire again if component re-renders or transaction status changes again (which shouldn't ever happen unless exception, as it's final data from the chain)\n\n// use this hook for ad-hock UI effects that should happen once tx is mined (e.g. show a toast, navigate, etc)\n// DO NOT use this hook for balance invalidation as it's handled in useTrackPendingTransactions\nexport function useOnceTransactionMined({\n txHash,\n onceMined,\n}: {\n txHash: `0x${string}` | undefined;\n onceMined?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange: onceMined\n ? (prevStatus, newStatus, transaction) => {\n if (prevStatus === 'pending' && (newStatus === 'confirmed' || newStatus === 'failed')) {\n onceMined(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isMining: transaction?.status === 'pending',\n };\n}\n\nfunction useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange,\n}: {\n txHash: `0x${string}` | undefined;\n onTransactionStatusChange?: (\n prevStatus: TransactionStatus | undefined,\n newStatus: TransactionStatus,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onTransactionStatusChange) return;\n\n // if status changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.status !== transaction?.status && !!transaction) {\n onTransactionStatusChange(previousTransactionRef.current?.status, transaction.status, transaction);\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onTransactionStatusChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import type { Transaction } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when a transaction enters \"pending decryption\" state\n// i.e. it won't fire again if component re-renders etc\nexport function useOnceDecrypted({\n txHash,\n onceDecrypted,\n}: {\n txHash: `0x${string}` | undefined;\n onceDecrypted?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange: onceDecrypted\n ? (prevIsPendingDecryption, newIsPendingDecryption, transaction) => {\n if (prevIsPendingDecryption === true && newIsPendingDecryption === false) {\n onceDecrypted(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isPendingDecryption: transaction?.isPendingDecryption === true,\n };\n}\n\nfunction useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange,\n}: {\n txHash: `0x${string}` | undefined;\n onDecryptionPendingChange?: (\n prevIsPendingDecryption: boolean | undefined,\n newIsPendingDecryption: boolean,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onDecryptionPendingChange) return;\n // if flag changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.isPendingDecryption !== transaction?.isPendingDecryption && !!transaction) {\n onDecryptionPendingChange(\n previousTransactionRef.current?.isPendingDecryption,\n transaction.isPendingDecryption,\n transaction\n );\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onDecryptionPendingChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import { type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { CLAIM_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Claim Unshield Hook\n// ============================================================================\ntype UseClaimUnshieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount being claimed (for activity logging) */\n amount: bigint;\n};\ntype UseClaimUnshieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseClaimUnshieldInput>, 'mutationFn'>;\n/**\n * Hook to claim unshielded tokens after decryption completes\n * - Dual tokens: calls `claimUnshielded()`\n * - Wrapped tokens: calls `claimAllDecrypted()`\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenClaimUnshielded(\n options?: UseClaimUnshieldOptions\n): UseMutationResult<`0x${string}`, Error, UseClaimUnshieldInput> {\n const walletClient = useCofheWalletClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseClaimUnshieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for claim');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for claim');\n }\n\n // Only dual and wrapped support claiming\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Claim not supported for confidentialityType: ${confidentialityType}`);\n }\n\n const contractConfig = CLAIM_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for claim: ${confidentialityType}`);\n }\n\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [],\n account: walletClient.account,\n chain: undefined,\n });\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Claim);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for claim');\n assert(account, 'Wallet account is required for claim');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n\n token: input.token,\n tokenAmount: input.amount,\n\n chainId,\n actionType: TransactionActionType.Claim,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type QueryFunctionContext, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { type Address } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport { useNormalizedList } from './useNormalizedList.js';\nimport { useIsWaitingForDecryptionByAddress } from './useIsWaitingForDecryptionByAddress.js';\nimport {\n constructUnshieldClaimsQueryKey,\n DEFAULT_UNSHIELD_CLAIM_SUMMARY,\n fetchUnshieldClaimsSummary,\n isTokenConfidentialityTypeClaimable,\n type UnshieldClaimsSummary,\n} from './useCofheTokenClaimable.js';\nimport { useStoredTransactions } from './useStoredTransactions.js';\nimport { TransactionActionType, TransactionStatus } from '@/stores/transactionStore.js';\n\nexport type UnshieldClaimsSummaryByTokenAddress = Record<Address, UnshieldClaimsSummary>;\nexport type ClaimableAmountByTokenAddress = Record<Address, bigint>;\nexport type BooleanByAddress = Record<Address, boolean>;\n\ntype UseUnshieldClaimsManyInput = {\n tokens: Token[];\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsManyOptions = Omit<\n UseQueryOptions<\n UnshieldClaimsSummary,\n Error,\n UnshieldClaimsSummary,\n ReturnType<typeof constructUnshieldClaimsQueryKey>\n >,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\ntype ClaimableToken = Token & {\n extensions: Token['extensions'] & {\n fhenix: Token['extensions']['fhenix'] & {\n confidentialityType: 'dual' | 'wrapped';\n };\n };\n};\n\nfunction isClaimableToken(token: Token): token is ClaimableToken {\n return isTokenConfidentialityTypeClaimable(token.extensions?.fhenix?.confidentialityType);\n}\n\nfunction claimableDedupeKey(token: ClaimableToken): string {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n return `${token.chainId}:${token.address.toLowerCase()}:${confidentialityType}`;\n}\n\nfunction claimableSort(a: ClaimableToken, b: ClaimableToken): number {\n if (a.chainId !== b.chainId) return a.chainId - b.chainId;\n return a.address.toLowerCase().localeCompare(b.address.toLowerCase());\n}\ntype CombinedResult = {\n summariesByTokenAddress: UnshieldClaimsSummaryByTokenAddress;\n claimableByTokenAddress: ClaimableAmountByTokenAddress;\n isWaitingForDecryptionByTokenAddress?: BooleanByAddress;\n isUnshieldingInProgressByTokenAddress?: BooleanByAddress;\n isClaimingByTokenAddress?: BooleanByAddress;\n queries: UseQueryResult<UnshieldClaimsSummary, Error>[];\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n totalTokensClaimable: number;\n error: Error | null;\n};\n\nconst pendingClaimsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Claim && tx.status === TransactionStatus.Pending;\n\nconst pendingUnshieldsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Unshield && tx.status === TransactionStatus.Pending;\n\nconst asBooleanByTokenAddressLowercase = (\n txs: { token: { address: string }; actionType: TransactionActionType; status: TransactionStatus }[]\n) => {\n return txs.reduce<Record<string, boolean>>((acc, tx) => {\n const key = tx.token.address.toLowerCase();\n acc[key] = true;\n\n return acc;\n }, {});\n};\n\nexport function useCofheTokensClaimable(\n { tokens, accountAddress: account }: UseUnshieldClaimsManyInput,\n queryOptions?: UseUnshieldClaimsManyOptions\n): CombinedResult {\n const publicClient = useCofhePublicClient();\n\n const normalizedTokens = useNormalizedList(tokens, {\n filter: isClaimableToken,\n dedupeKey: claimableDedupeKey,\n sort: claimableSort,\n });\n\n const enabledBase = !!publicClient && !!account && normalizedTokens.length > 0;\n\n const waitingEntries = useMemo(() => {\n if (!account) return [];\n return normalizedTokens.map((token) => ({\n address: token.address,\n queryKey: constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress: account,\n }),\n }));\n }, [account, normalizedTokens]);\n\n const isWaitingForDecryptionByTokenAddress = useIsWaitingForDecryptionByAddress(waitingEntries);\n\n const chainId = useCofheChainId();\n\n const { reduced: isUnshieldingInProgressByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingUnshieldsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const { reduced: isClaimingByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingClaimsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const combined = useInternalQueries({\n queries: normalizedTokens.map((token) => {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType,\n accountAddress: account,\n });\n\n return {\n queryKey,\n queryFn: async ({\n signal,\n queryKey,\n }: QueryFunctionContext<ReturnType<typeof constructUnshieldClaimsQueryKey>>) => {\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType narrowed by token guard'\n );\n\n assert(account, 'account is required to fetch unshield claims');\n assert(publicClient, 'publicClient is required to fetch unshield claims');\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: enabledBase,\n ...queryOptions,\n };\n }),\n combine: (results) => {\n return results.reduce<\n Omit<\n CombinedResult,\n 'isWaitingForDecryptionByTokenAddress' | 'isUnshieldingInProgressByTokenAddress' | 'isClaimingByTokenAddress'\n >\n >(\n (acc, result, index) => {\n const token = normalizedTokens[index];\n if (!token) return acc;\n\n const summary = result.data ?? DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n acc.summariesByTokenAddress[token.address] = summary;\n acc.claimableByTokenAddress[token.address] = summary.claimableAmount;\n\n if (summary.hasClaimable) {\n acc.totalTokensClaimable += 1;\n }\n\n acc.isLoading = acc.isLoading || result.isLoading;\n acc.isFetching = acc.isFetching || result.isFetching;\n acc.isError = acc.isError || result.isError;\n if (!acc.error && result.error) acc.error = result.error;\n\n return acc;\n },\n {\n summariesByTokenAddress: {},\n claimableByTokenAddress: {},\n totalTokensClaimable: 0,\n queries: results,\n isLoading: false,\n isFetching: false,\n isError: false,\n error: null,\n }\n );\n },\n });\n\n return {\n summariesByTokenAddress: combined.summariesByTokenAddress,\n claimableByTokenAddress: combined.claimableByTokenAddress,\n totalTokensClaimable: combined.totalTokensClaimable,\n queries: combined.queries,\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n isWaitingForDecryptionByTokenAddress,\n isUnshieldingInProgressByTokenAddress,\n isClaimingByTokenAddress,\n };\n}\n","import { useMemo } from 'react';\n\nexport type NormalizeOptions<T, U extends T = T> = {\n /** Optional filter; can be a type guard to narrow the output type */\n filter?: (item: T) => item is U;\n /** Optional de-dupe key function */\n dedupeKey?: (item: U) => string;\n /** Optional deterministic sort */\n sort?: (a: U, b: U) => number;\n};\n\nexport function useNormalizedList<T, U extends T = T>(items: T[] | undefined, options?: NormalizeOptions<T, U>): U[] {\n return useMemo(() => {\n if (!items || items.length === 0) return [];\n\n const filter = options?.filter;\n const dedupeKey = options?.dedupeKey;\n const sort = options?.sort;\n\n const filtered = (filter ? items.filter(filter) : (items as unknown as U[])) as U[];\n\n const deduped = (() => {\n if (!dedupeKey) return filtered;\n const seen = new Set<string>();\n const unique: U[] = [];\n for (const item of filtered) {\n const key = dedupeKey(item);\n if (seen.has(key)) continue;\n seen.add(key);\n unique.push(item);\n }\n return unique;\n })();\n\n if (sort) deduped.sort(sort);\n\n return deduped;\n }, [items, options?.dedupeKey, options?.filter, options?.sort]);\n}\n\n// Compatibility aliases (internal/private helper; keep naming flexible)\nexport const useNormalizedItems = useNormalizedList;\nexport const useNormalizedTokens = useNormalizedList;\n","import { useMemo } from 'react';\nimport { isAddress, type Address } from 'viem';\nimport { assert } from 'ts-essentials';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { useAwaitingDecryptionQueryKeySet } from './useIsWaitingForDecryptionToInvalidate.js';\n\nexport type IsWaitingForDecryptionByAddress = Record<Address, boolean>;\n\nexport type WaitingForDecryptionEntry = {\n address: Address;\n queryKey: QueryKey;\n};\n\n/**\n * Given a list of entries and the invalidation-store snapshot, computes whether each address\n * is currently awaiting decryption invalidation.\n */\nexport function useIsWaitingForDecryptionByAddress(\n entries: WaitingForDecryptionEntry[]\n): IsWaitingForDecryptionByAddress {\n const awaitingDecryptionKeySet = useAwaitingDecryptionQueryKeySet();\n\n return useMemo(() => {\n const map: IsWaitingForDecryptionByAddress = {};\n\n for (const entry of entries) {\n assert(isAddress(entry.address), 'address is valid');\n map[entry.address] = awaitingDecryptionKeySet.has(JSON.stringify(entry.queryKey));\n }\n\n return map;\n }, [awaitingDecryptionKeySet, entries]);\n}\n","import { useState, useCallback, useMemo } from 'react';\n\nexport type DurationUnit = 'hours' | 'days' | 'weeks' | 'months';\n\nexport interface UsePermitDurationOptions {\n onDurationChange: (seconds: number) => void;\n initialSeconds?: number;\n}\n\nexport interface DurationPreset {\n label: string;\n seconds: number;\n}\n\nexport interface UsePermitDurationResult {\n durationSeconds: number;\n customCount: number | '';\n customUnit: DurationUnit;\n presets: readonly DurationPreset[];\n units: readonly DurationUnit[];\n selectPreset: (seconds: number) => void;\n setCustomCount: (value: number | '') => void;\n setCustomUnit: (unit: DurationUnit) => void;\n applyCustom: (count: number | '', unit: DurationUnit) => void;\n unitSeconds: Readonly<Record<DurationUnit, number>>;\n}\n\nexport function usePermitDuration(options: UsePermitDurationOptions): UsePermitDurationResult {\n const { onDurationChange, initialSeconds = 7 * 24 * 60 * 60 } = options;\n\n const presets: readonly DurationPreset[] = useMemo(\n () => [\n { label: '1 day', seconds: 1 * 24 * 60 * 60 },\n { label: '1 week', seconds: 7 * 24 * 60 * 60 },\n { label: '1 month', seconds: 30 * 24 * 60 * 60 },\n ],\n []\n );\n\n const unitSeconds: Readonly<Record<DurationUnit, number>> = useMemo(\n () => ({\n hours: 60 * 60,\n days: 24 * 60 * 60,\n weeks: 7 * 24 * 60 * 60,\n months: 30 * 24 * 60 * 60,\n }),\n []\n );\n\n const [durationSeconds, setDurationSecondsState] = useState(initialSeconds);\n const [customCount, setCustomCountState] = useState<number | ''>('');\n const [customUnit, setCustomUnitState] = useState<DurationUnit>('days');\n\n const selectPreset = useCallback(\n (seconds: number) => {\n setDurationSecondsState(seconds);\n onDurationChange(seconds);\n },\n [onDurationChange]\n );\n\n const applyCustom = useCallback(\n (count: number | '', unit: DurationUnit) => {\n setCustomCountState(count);\n setCustomUnitState(unit);\n if (typeof count === 'number' && count > 0) {\n const computed = count * unitSeconds[unit];\n setDurationSecondsState(computed);\n onDurationChange(computed);\n }\n },\n [unitSeconds, onDurationChange]\n );\n\n const setCustomCount = useCallback((value: number | '') => applyCustom(value, customUnit), [applyCustom, customUnit]);\n const setCustomUnit = useCallback((unit: DurationUnit) => applyCustom(customCount, unit), [applyCustom, customCount]);\n\n return {\n durationSeconds,\n customCount,\n customUnit,\n presets,\n units: ['days', 'weeks', 'months', 'hours'] as const,\n selectPreset,\n setCustomCount,\n setCustomUnit,\n applyCustom,\n unitSeconds,\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useCofheCreatePermitMutation, type CreatePermitArgs } from './useCofheCreatePermitMutation';\n\nexport interface UsePermitFormOptions {\n isDelegate?: boolean;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UsePermitFormResult {\n permitName: string;\n receiver: string;\n error: string | null; // global/submit error\n nameError: string | null; // field-specific error for name\n receiverError: string | null;\n isValid: boolean;\n isSubmitting: boolean;\n durationSeconds: number;\n handleNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n handleReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n setDurationSeconds: (seconds: number) => void;\n handleSubmit: () => Promise<void>;\n reset: () => void;\n}\n\nexport function usePermitForm(options: UsePermitFormOptions = {}): UsePermitFormResult {\n const { onSuccess, onError, isDelegate = false } = options;\n const [permitName, setPermitName] = useState('');\n const [receiver, setReceiver] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [nameError, setNameError] = useState<string | null>(null);\n const [receiverError, setReceiverError] = useState<string | null>(null);\n const [durationSeconds, setDurationSeconds] = useState(7 * 24 * 60 * 60);\n const { mutateAsync: createPermitMutateAsync, isPending: isPermitCreationPending } = useCofheCreatePermitMutation({\n onSuccess,\n onError,\n });\n\n const recipientAddressValid = isDelegate ? isValidAddress(receiver) : true;\n const isValid = !!permitName.trim() && recipientAddressValid;\n\n const handleNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setPermitName(e.target.value);\n if (nameError) setNameError(null);\n },\n [nameError]\n );\n\n const handleReceiverChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setReceiver(e.target.value);\n if (receiverError) setReceiverError(null);\n },\n [receiverError]\n );\n\n const handleSubmit = useCallback(async () => {\n if (isPermitCreationPending) return;\n const nameToUse = permitName.trim();\n if (!nameToUse) {\n setNameError('Permit name is required.');\n return;\n }\n if (isDelegate) {\n if (!isValidAddress(receiver)) {\n setReceiverError('Valid receiver address is required.');\n return;\n }\n }\n try {\n const expirationSeconds = Math.floor(Date.now() / 1000) + durationSeconds;\n const args: CreatePermitArgs = isDelegate\n ? { name: nameToUse, isSelf: false, receiver: receiver.trim() as `0x${string}`, expirationSeconds }\n : { name: nameToUse, isSelf: true, expirationSeconds };\n\n await createPermitMutateAsync(args);\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n } catch (e: any) {\n setError(e?.message ?? 'Failed to create permit');\n }\n }, [isPermitCreationPending, permitName, isDelegate, receiver, durationSeconds, createPermitMutateAsync]);\n\n const reset = useCallback(() => {\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n }, []);\n\n return {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting: isPermitCreationPending,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n reset,\n };\n}\n\nfunction isValidAddress(address: string): boolean {\n const a = address.trim();\n return /^0x[a-fA-F0-9]{40}$/.test(a);\n}\n","// Persisted store for long running flags / settings / etc\n\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\n\ntype PortalPersistedStore = {\n hasCreatedFirstPermit: boolean;\n};\n\ntype PortalPersistedActions = {\n setHasCreatedFirstPermit: (hasCreated: boolean) => void;\n};\n\nexport const usePortalPersisted = create<PortalPersistedStore & PortalPersistedActions>()(\n persist(\n (set, get) => ({\n hasCreatedFirstPermit: false,\n\n setHasCreatedFirstPermit: (hasCreated) => set({ hasCreatedFirstPermit: hasCreated }),\n }),\n {\n name: 'cofhesdk-react-persisted',\n storage: createJSONStorage(() => localStorage),\n }\n )\n);\n","import { usePortalPersisted } from '@/stores/portalPersisted.js';\nimport { useInternalMutation } from '../../providers/index.js';\nimport { useCofheClient } from '../useCofheClient.js';\nimport { usePortalToasts } from '@/stores/portalToasts.js';\n\nexport type CreatePermitArgs =\n | {\n name: string;\n isSelf: true;\n expirationSeconds: number; // unix timestamp (seconds)\n }\n | {\n name: string;\n isSelf: false;\n receiver: `0x${string}`;\n expirationSeconds: number; // unix timestamp (seconds)\n };\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\nexport const useCofheCreatePermitMutation = ({ onSuccess, onError }: Input = {}) => {\n const cofheClient = useCofheClient();\n const { setHasCreatedFirstPermit } = usePortalPersisted();\n const { addToast } = usePortalToasts();\n\n return useInternalMutation<void, Error, CreatePermitArgs>({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit Created',\n description: 'The permit has been created successfully.',\n });\n\n onSuccess?.();\n },\n onError: (error) => {\n onError?.(error);\n },\n onSettled: () => {\n // Mark that the user has created at least one permit - from now on, we know the user is aware of permits and will show him warnnings and notifications accordingly\n setHasCreatedFirstPermit(true);\n },\n mutationFn: async (args) => {\n const { name, isSelf, expirationSeconds } = args;\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n\n if (isSelf) {\n await cofheClient.permits.createSelf({\n expiration: expirationSeconds,\n issuer: account,\n name: name.trim(),\n });\n return;\n }\n\n await cofheClient.permits.createSharing({\n expiration: expirationSeconds,\n issuer: account,\n recipient: args.receiver,\n name: name.trim(),\n });\n },\n });\n};\n","import { useCallback, useMemo } from 'react';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useCofheActivePermit, useCofheAllPermits, useCofheRemovePermit } from '../useCofhePermits';\nimport { useCopyFeedback } from '../useCopyFeedback';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { useCofheNavigateToCreatePermit } from './useCofheNavigateToCreatePermit';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/FnxFloatingButton/modals/types';\n\nexport type PermitStatus = 'active' | 'valid' | 'expired';\nexport type QuickActionId = 'generate' | 'delegate' | 'import';\n\nexport const usePermitsList = () => {\n const allPermits = useCofheAllPermits();\n const removePermit = useCofheRemovePermit();\n const activePermit = useCofheActivePermit();\n const { navigateBack, navigateTo } = usePortalNavigation();\n const { openModal } = usePortalModals();\n const { isCopied, copyWithFeedback } = useCopyFeedback();\n\n const activePermitHash = useMemo(() => {\n return activePermit?.hash;\n }, [activePermit?.hash]);\n\n const selfPermits = useMemo<{ permit: Permit; hash: string }[]>(() => {\n return allPermits.filter(({ permit }) => permit.type === 'self');\n }, [allPermits]);\n\n const delegatedPermits = useMemo<{ permit: Permit; hash: string }[]>(() => {\n return allPermits.filter(({ permit }) => permit.type === 'sharing');\n }, [allPermits]);\n\n const importedPermits = useMemo<{ permit: Permit; hash: string }[]>(() => {\n return allPermits.filter(({ permit }) => permit.type === 'recipient');\n }, [allPermits]);\n\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n const handleQuickAction = useCallback(\n (actionId: QuickActionId) => {\n if (actionId === 'generate') {\n navigateToGeneratePermit();\n return;\n }\n if (actionId === 'delegate') {\n navigateTo(FloatingButtonPage.DelegatePermits, {});\n return;\n }\n if (actionId === 'import') {\n navigateTo(FloatingButtonPage.ReceivePermits);\n }\n },\n [navigateTo, navigateToGeneratePermit]\n );\n\n const handlePermitSelect = useCallback(\n (permitId: string) => {\n openModal(PortalModal.PermitDetails, { hash: permitId });\n },\n [openModal]\n );\n\n const handleDelete = useCallback(\n (permitId: string) => {\n removePermit(permitId);\n },\n [removePermit]\n );\n\n const handleCopy = useCallback(\n (permitId: string) => {\n const permit = allPermits.find((p) => p.hash === permitId);\n if (!permit) return;\n const { type, issuer, recipient, issuerSignature, expiration, validatorContract, validatorId } = permit.permit;\n const textToCopy = JSON.stringify(\n {\n type,\n issuer,\n recipient,\n issuerSignature,\n expiration,\n validatorContract,\n validatorId,\n },\n null,\n 2\n );\n void copyWithFeedback(permitId, textToCopy);\n },\n [allPermits, copyWithFeedback]\n );\n\n return {\n activePermitHash,\n selfPermits,\n delegatedPermits,\n importedPermits,\n isCopied,\n handleQuickAction,\n handleCopy,\n handleDelete,\n handlePermitSelect,\n navigateBack,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * useCopyFeedback\n * - Copies provided text to clipboard and exposes transient \"copied\" state per key.\n * - Useful for lists where each row has a copy action and needs quick feedback.\n */\nexport function useCopyFeedback(defaultDurationMs: number = 2000) {\n const [copiedKeys, setCopiedKeys] = useState<Set<string>>(new Set());\n const timersRef = useRef<Map<string, number>>(new Map());\n\n const isCopied = useCallback((key: string) => copiedKeys.has(key), [copiedKeys]);\n\n const clearTimer = useCallback((key: string) => {\n const timers = timersRef.current;\n const existing = timers.get(key);\n if (existing) {\n window.clearTimeout(existing);\n timers.delete(key);\n }\n }, []);\n\n const copyWithFeedback = useCallback(\n async (key: string, text: string, durationMs?: number): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text);\n\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n\n clearTimer(key);\n const timeout = window.setTimeout(() => {\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n timersRef.current.delete(key);\n }, durationMs ?? defaultDurationMs);\n timersRef.current.set(key, timeout);\n return true;\n } catch {\n return false;\n }\n },\n [clearTimer, defaultDurationMs]\n );\n\n // Cleanup timers on unmount\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n for (const id of timersRef.current.values()) {\n window.clearTimeout(id);\n }\n timersRef.current.clear();\n };\n }, []);\n\n return { copiedKeys, isCopied, copyWithFeedback };\n}\n","import { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\n\nimport { useCallback } from 'react';\n\ntype Input = {\n ReasonBody?: React.FC;\n};\nexport const useCofheNavigateToCreatePermit = ({ ReasonBody }: Input = {}) => {\n const { navigateTo, navigateBack } = usePortalNavigation();\n const { portalOpen, openPortal } = usePortalUI();\n\n return useCallback(() => {\n if (!portalOpen) openPortal();\n navigateTo(FloatingButtonPage.GeneratePermits, {\n pageProps: { overridingBody: ReasonBody ? <ReasonBody /> : undefined, onSuccessNavigateTo: () => navigateBack() },\n navigateParams: { skipPagesHistory: true },\n });\n }, [ReasonBody, openPortal, portalOpen, navigateBack, navigateTo]);\n};\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../../providers/CofheProvider.js';\nimport { PermitUtils, type RecipientPermit } from '@cofhe/sdk/permits';\n\nexport type UseReceivePermitReturn = {\n importedPermit: RecipientPermit | null;\n permitData: string;\n setPermitData: (v: string) => void;\n permitName: string;\n setPermitName: (v: string) => void;\n isSubmitting: boolean;\n errorMsg: string | null;\n successMsg: string | null;\n submit: () => Promise<void>;\n};\n\nexport function useReceivePermit(onSuccess?: () => void): UseReceivePermitReturn {\n const { client } = useCofheContext();\n\n const [importedPermit, setImportedPermit] = useState<RecipientPermit | null>(null);\n const [permitData, setPermitData] = useState('');\n const [permitName, setPermitName] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n\n const submit = useCallback(async () => {\n setErrorMsg(null);\n setSuccessMsg(null);\n if (!permitData.trim()) {\n setErrorMsg('Please paste permit data.');\n return;\n }\n\n try {\n setIsSubmitting(true);\n // If user provided a name, override the incoming permit's name\n let importArg: any | string = permitData.trim();\n if (permitName.trim()) {\n try {\n const parsed = JSON.parse(permitData.trim());\n importArg = { ...parsed, name: permitName.trim() };\n } catch (e) {\n setErrorMsg('Invalid permit data. Expected JSON.');\n setIsSubmitting(false);\n return;\n }\n }\n\n await client.permits.importShared(importArg);\n\n setSuccessMsg('Permit received and set active.');\n if (onSuccess) onSuccess();\n } catch (err: any) {\n const message = err?.message ?? 'Failed to import permit';\n setErrorMsg(message);\n } finally {\n setIsSubmitting(false);\n }\n }, [client, permitData, permitName, onSuccess]);\n\n const handleSetPermitData = useCallback((v: string) => {\n setPermitData(v);\n try {\n const permit = PermitUtils.importShared(v);\n setImportedPermit(permit);\n setErrorMsg(null);\n } catch (e) {\n console.error('Error parsing pasted permit data', e);\n setImportedPermit(null);\n // TODO: Improve error message, we have the error message in the caught error but its a zod error so its messy\n setErrorMsg(`Invalid permit data. Expected JSON.`);\n }\n }, []);\n\n return {\n importedPermit,\n permitData,\n setPermitData: handleSetPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { zeroAddress } from 'viem';\nimport { PermitUtils } from '@cofhe/sdk/permits';\nimport { useCofheActivePermit, useCofheAllPermits, useCofheSelectPermit } from '../useCofhePermits.js';\nimport { useCopyFeedback } from '../useCopyFeedback.js';\nimport { formatExpirationLabel, truncateAddress } from '@/utils/utils.js';\nimport { usePortalNavigation } from '@/stores';\n\nconst COPY_KEY = 'permit-details-json';\n\nexport const usePermitDetailsPage = (selectedPermitHash: string) => {\n const allPermits = useCofheAllPermits();\n const activePermit = useCofheActivePermit();\n const selectActivePermit = useCofheSelectPermit();\n const { navigateBack } = usePortalNavigation();\n const { isCopied, copyWithFeedback } = useCopyFeedback();\n\n const selectedPermit = useMemo(() => {\n return allPermits.find((entry) => entry.hash === selectedPermitHash);\n }, [allPermits, selectedPermitHash]);\n\n const permitLabel = useMemo(() => {\n const permit = selectedPermit?.permit;\n if (!permit) return undefined;\n if (permit.name?.trim()) return permit.name;\n const fallbackAddress =\n permit.recipient && permit.recipient !== zeroAddress ? permit.recipient : permit.issuer || zeroAddress;\n return truncateAddress(fallbackAddress, 4, 4) ?? fallbackAddress;\n }, [selectedPermit]);\n\n const expirationInfo = useMemo(\n () => formatExpirationLabel(selectedPermit?.permit.expiration),\n [selectedPermit?.permit.expiration]\n );\n\n const permitJson = useMemo(() => {\n if (!selectedPermit) return undefined;\n return PermitUtils.export(selectedPermit.permit);\n }, [selectedPermit]);\n\n const handleBack = useCallback(() => {\n navigateBack();\n }, [navigateBack]);\n\n const handleCopy = useCallback(() => {\n if (!permitJson) return;\n void copyWithFeedback(COPY_KEY, permitJson);\n }, [copyWithFeedback, permitJson]);\n\n const handleViewAs = useCallback(() => {\n if (!selectedPermit) return;\n selectActivePermit(selectedPermit.hash);\n }, [selectActivePermit, selectedPermit]);\n\n const isActivePermit = selectedPermit ? activePermit?.hash === selectedPermit.hash : false;\n\n const expirationDate = selectedPermit\n ? new Date(selectedPermit.permit.expiration * 1000).toLocaleString()\n : undefined;\n\n const isShareablePermit = selectedPermit?.permit?.type === 'sharing';\n\n return {\n permit: selectedPermit?.permit,\n permitLabel,\n permitJson,\n expirationInfo,\n expirationDate,\n handleBack,\n handleCopy,\n handleViewAs,\n hasSelection: Boolean(selectedPermit),\n isCopyComplete: isCopied(COPY_KEY),\n isActivePermit,\n isShareablePermit,\n };\n};\n","import type { PublicClient, WalletClient } from 'viem';\nimport { useCofheClient } from './useCofheClient';\nimport { useEffect } from 'react';\nimport { useCofheConnect } from './useCofheConnect';\n\ntype Input = {\n publicClient?: PublicClient;\n walletClient?: WalletClient;\n};\nexport const useCofheAutoConnect = ({ walletClient, publicClient }: Input) => {\n // TODO: if the user switches in the wallet to a chain that's not supported by the dapp, should show error message or disconnect?\n const client = useCofheClient();\n\n const connectMutationFn = useCofheConnect().mutate;\n\n useEffect(() => {\n if (!publicClient || !walletClient || client.connecting) return;\n connectMutationFn({ publicClient, walletClient });\n }, [publicClient, walletClient, client.connecting, connectMutationFn]);\n};\n","import {\n useQuery as rqUseQuery,\n useMutation as rqUseMutation,\n useQueries as rqUseQueries,\n type UseQueryOptions,\n type UseQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useInternalQueryClient } from './QueryProvider';\n\n/**\n * Internal wrapper for TanStack's useQuery that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalQuery(options)`.\n */\nexport function useInternalQuery<TData = unknown, TError = Error, TSelectedData = TData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryResult<TSelectedData, TError> {\n const qc = useInternalQueryClient();\n return rqUseQuery<TData, TError, TSelectedData>(options, qc);\n}\n\n/**\n * Internal wrapper for TanStack's useMutation that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalMutation(options)`.\n */\nexport function useInternalMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(\n options: UseMutationOptions<TData, TError, TVariables, TContext>\n): UseMutationResult<TData, TError, TVariables, TContext> {\n const qc = useInternalQueryClient();\n return rqUseMutation<TData, TError, TVariables, TContext>(options, qc);\n}\n\n/**\n * Internal wrapper for TanStack's useQueries that always uses the module's QueryClient.\n * Typing mirrors `rqUseQueries` so all generics and inference are preserved.\n */\nexport const useInternalQueries: typeof rqUseQueries = (options, _ignoredQueryClient) => {\n const qc = useInternalQueryClient();\n return rqUseQueries(options, qc);\n};\n","import type { PublicClient, WalletClient } from 'viem';\nimport type { UseMutationOptions } from '@tanstack/react-query';\nimport { useCofheClient } from './useCofheClient';\nimport { useInternalMutation } from '@/providers/internalQueryHooks';\n\ntype ConnectVars = { publicClient: PublicClient; walletClient: WalletClient };\n\ntype ConnectMutationOptions = Omit<UseMutationOptions<void, Error, ConnectVars, unknown>, 'mutationKey' | 'mutationFn'>;\n\nexport const useCofheConnect = (options?: ConnectMutationOptions) => {\n const client = useCofheClient();\n return useInternalMutation<void, Error, ConnectVars>({\n // spread user-provided options first; enforce critical keys afterwards\n ...options,\n mutationKey: ['cofhe', 'connect'],\n mutationFn: async ({ publicClient, walletClient }) => {\n await client.connect(publicClient, walletClient);\n },\n });\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * A reusable hook to schedule a timeout that can be rescheduled and safely cleaned up.\n * Useful for auto-clearing messages, debounced effects, or any delayed callback.\n */\nexport function useReschedulableTimeout(callback: () => void, defaultTimeout: number) {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const schedule = (timeout?: number) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n callback();\n }, timeout ?? defaultTimeout);\n };\n\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n return { schedule, cancel };\n}\n","import { useCofheActivePermit } from '@/hooks';\nimport { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\nimport { truncateHash } from '@/utils';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useEffect, useRef } from 'react';\nimport { FloatingButtonPage } from '../components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalPersisted } from '@/stores/portalPersisted';\n\nconst STATUS_ID_MISSING_PERMIT = 'missing-permit';\nconst STATUS_ID_PERMIT_EXPIRED = 'permit-expired';\nconst STATUS_ID_PERMIT_EXPIRING_SOON = 'permit-expiring-soon';\nconst STATUS_ID_PERMIT_SHARED = 'permit-shared';\n\nexport const showMissingPermitStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_MISSING_PERMIT,\n variant: 'error',\n title: 'Missing permit',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\n\nexport const hideMissingPermitStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_MISSING_PERMIT);\n};\n\nexport const showPermitExpiredStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRED,\n variant: 'error',\n title: 'Permit expired',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiredStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRED);\n};\n\nexport const showPermitExpiringSoonStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRING_SOON,\n variant: 'warning',\n title: 'Permit expiring soon',\n description: `Expires at ${new Date(permit.expiration * 1000).toLocaleTimeString()}`,\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiringSoonStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n};\n\nexport const showPermitSharedStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_SHARED,\n variant: 'info',\n title: 'Imported permit active',\n description: `Viewing ${truncateHash(permit.issuer, 4, 4)}'s data`,\n });\n};\nexport const hidePermitSharedStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_SHARED);\n};\n\n/**\n * Watches the user's active permit and displays statuses if:\n * - Warning - permit will expire in less that 1 hour\n * - Error - permit has expired\n * - Info - using a shared permit\n */\nexport const useWatchPermitStatus = () => {\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const activePermit = useCofheActivePermit();\n\n useEffect(() => {\n const updateStatuses = (permit: Permit | undefined) => {\n const hasCreatedFirstPermit = usePortalPersisted.getState().hasCreatedFirstPermit;\n const missingPermitStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_MISSING_PERMIT);\n const expiredStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRED);\n const expiringSoonStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n const sharedStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_SHARED);\n\n if (permit == null) {\n if (hasCreatedFirstPermit && !missingPermitStatusShown) {\n showMissingPermitStatus();\n }\n if (expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n if (expiringSoonStatusShown) {\n hidePermitExpiringSoonStatus();\n }\n if (sharedStatusShown) {\n hidePermitSharedStatus();\n }\n return;\n }\n\n if (permit != null && missingPermitStatusShown) {\n hideMissingPermitStatus();\n }\n\n const timestamp = Math.floor(Date.now() / 1000);\n const expiration = permit.expiration;\n\n // Expired status\n const isExpired = expiration < timestamp;\n if (isExpired && !expiredStatusShown) {\n showPermitExpiredStatus();\n }\n if (!isExpired && expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n\n // Expiring soon status\n const isExpiringSoon = expiration - timestamp < 1 * 60 * 60;\n if (!isExpired && isExpiringSoon && !expiringSoonStatusShown) {\n showPermitExpiringSoonStatus(permit);\n }\n if ((!isExpiringSoon && expiringSoonStatusShown) || isExpired) {\n hidePermitExpiringSoonStatus();\n }\n\n // Shared status\n const isShared = permit.type === 'recipient';\n if (isShared && !sharedStatusShown) {\n showPermitSharedStatus(permit);\n }\n if (!isShared && sharedStatusShown) {\n hidePermitSharedStatus();\n }\n };\n\n updateStatuses(activePermit?.permit);\n intervalRef.current = setInterval(() => {\n updateStatuses(activePermit?.permit);\n }, 2000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [activePermit]);\n};\n","import { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\n\nimport { useEffect } from 'react';\n\nimport { useCofheClaimableTokens } from './useCofheClaimableTokens';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\n\nconst CLAIMS_AVAILABLE_STATUS_ID = 'claims-available';\ntype Input = {\n onClick: () => void;\n};\nexport const showClaimsAvailableStatus = ({ onClick }: Input) => {\n usePortalStatuses.getState().addStatus({\n id: CLAIMS_AVAILABLE_STATUS_ID,\n variant: 'info',\n title: '', // TODO: no title per design\n description: `You have unclaimed encrypted tokens`,\n action: {\n label: 'VIEW',\n onClick,\n },\n });\n};\nexport const hideClaimsAvailableStatus = () => {\n usePortalStatuses.getState().removeStatus(CLAIMS_AVAILABLE_STATUS_ID);\n};\n\nexport const useWatchClaimablesStatus = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n\n useEffect(() => {\n const claimsAvailableStatusShown = usePortalStatuses.getState().hasStatus(CLAIMS_AVAILABLE_STATUS_ID);\n if (totalTokensClaimable > 0 && !claimsAvailableStatusShown) {\n showClaimsAvailableStatus({\n onClick: () => {\n openPortal();\n navigateTo(FloatingButtonPage.ClaimableTokens);\n },\n });\n }\n }, [navigateTo, openPortal, totalTokensClaimable]);\n};\n","import { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { useCofheTokensClaimable } from './useCofheTokensClaimable';\n\nexport function useCofheClaimableTokens() {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const result = useCofheTokensClaimable({\n accountAddress: account,\n tokens: allTokens,\n });\n\n return result;\n}\n","import { cn } from '@/utils';\nimport fhenixIconBlack from '@/assets/fhenix-icon-black.png';\nimport fhenixIconWhite from '@/assets/fhenix-icon-white.png';\n\nexport const FhenixLogoIcon: React.FC<{ theme: 'dark' | 'light'; className?: string }> = ({ theme, className }) => {\n return (\n <img\n className={cn('w-10 h-10', className)}\n src={theme === 'dark' ? fhenixIconWhite : fhenixIconBlack}\n alt=\"Fhenix Logo Icon\"\n />\n );\n};\n","import { type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\n\nexport const StatusBarSection: React.FC<{ children?: ReactNode }> = ({ children }) => {\n const { isLeftSide } = useFnxFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { statusPanelOpen } = usePortalUI();\n\n return (\n <AnimatePresence>\n {(statusPanelOpen || statuses.length > 0) && (\n <motion.div\n className=\"relative flex flex-1 h-12 items-center justify-between\"\n initial={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineSettings } from 'react-icons/md';\nimport { IoIosCheckmarkCircleOutline } from 'react-icons/io';\nimport { cn } from '@/utils';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { FloatingButtonPage } from './pagesConfig/types';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport type { FnxStatus, FnxStatusVariant } from './types';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { usePortalNavigation, usePortalStatuses } from '@/stores';\n\nconst ConnectionStatus: React.FC = () => {\n const { theme } = useFnxFloatingButtonContext();\n const { navigateTo } = usePortalNavigation();\n\n return (\n <div className=\"fnx-panel w-full h-full flex px-4 items-center justify-between\">\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status */}\n <div className=\"flex items-center gap-1 ml-auto mr-2\">\n <IoIosCheckmarkCircleOutline className=\"text-green-500\" />\n <span className=\"font-medium\">Connected*</span>\n </div>\n\n {/* Settings Icon */}\n <button\n onClick={() => navigateTo(FloatingButtonPage.Settings)}\n className={cn('p-1 rounded fnx-hover-overlay transition-colors', 'fnx-text-primary')}\n >\n <MdOutlineSettings className=\"w-4 h-4\" />\n </button>\n </div>\n );\n};\n\nconst statusTextColorMap: Record<FnxStatusVariant, string> = {\n error: 'text-red-500',\n warning: 'text-yellow-500',\n info: 'text-blue-500',\n};\n\nconst statusBorderColorMap: Record<FnxStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nconst ActiveStatusContent: React.FC<{ status: FnxStatus }> = ({ status }) => {\n const { theme } = useFnxFloatingButtonContext();\n\n return (\n <div\n className={cn(\n 'fnx-panel w-full h-full flex px-4 items-center justify-between',\n statusBorderColorMap[status.variant]\n )}\n >\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status Info */}\n <div className=\"flex flex-col ml-2 mr-auto\">\n <h3 className={cn('text-sm font-medium', statusTextColorMap[status.variant])}>{status.title}</h3>\n {status.description != null && (\n <p className={cn('text-xs', statusTextColorMap[status.variant])}>{status.description}</p>\n )}\n </div>\n\n {/* Action Button */}\n {status.action != null && (\n <button\n onClick={status.action?.onClick}\n className={cn('p-1 rounded fnx-hover-overlay transition-colors', 'fnx-text-primary')}\n >\n {status.action.label}\n </button>\n )}\n </div>\n );\n};\n\nexport const StatusBarContent: React.FC = () => {\n const { statuses } = usePortalStatuses();\n\n return (\n <AnimatedZStack>\n {/* Connection status showing connection state and chain */}\n <ConnectionStatus />\n\n {/* Active errors or warnings to be resolved */}\n {statuses.map((status) => (\n <ActiveStatusContent key={status.id} status={status} />\n ))}\n </AnimatedZStack>\n );\n};\n","// eslint-disable-next-line no-redeclare\nimport React from 'react';\nimport { cn } from '@/utils';\nimport type { ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\n\ntype AnimatedZStackItemProps = {\n children?: ReactNode;\n stackOffset: number;\n stackScale: number;\n index: number;\n length: number;\n className?: string;\n};\n\nconst AnimatedZStackItem: React.FC<AnimatedZStackItemProps> = ({\n children,\n stackOffset,\n stackScale,\n index,\n length,\n className,\n}) => {\n // Primary item is always index 0, and does not translate on entry/exit\n // Additional items animate in from the bottom and out to the bottom\n // All items animate opacity\n const isPrimaryItem = index === 0;\n const entryStyle = isPrimaryItem\n ? {\n opacity: 0,\n }\n : {\n opacity: 0,\n top: stackOffset,\n scale: 1 + stackScale,\n };\n\n // invIndex is the depth of the card in the stack\n // As the length of the stack increases, the depth of the card decreases\n // Deeper items scale down and move up\n const invIndex = length - index - 1;\n const animStyle = {\n opacity: 1,\n top: invIndex * -stackOffset,\n scale: 1 - invIndex * stackScale,\n zIndex: index,\n };\n\n return (\n <motion.div\n className={cn('w-full h-full absolute origin-top', invIndex === 0 && 'events-none', className)}\n initial={entryStyle}\n exit={entryStyle}\n animate={animStyle}\n >\n {children}\n </motion.div>\n );\n};\n\ntype AnimatedZStackProps = {\n children?: ReactNode;\n stackOffset?: number;\n stackScale?: number;\n itemClassName?: string;\n};\n\nexport const AnimatedZStack: React.FC<AnimatedZStackProps> = ({\n children,\n stackOffset = 8,\n stackScale = 0.05,\n itemClassName,\n}) => {\n const filteredChildren = React.Children.toArray(children).filter(Boolean);\n\n return (\n <AnimatePresence>\n {filteredChildren.map((child, index) => (\n <AnimatedZStackItem\n key={index}\n stackOffset={stackOffset}\n stackScale={stackScale}\n index={index}\n length={filteredChildren.length}\n className={itemClassName}\n >\n {child}\n </AnimatedZStackItem>\n ))}\n </AnimatePresence>\n );\n};\n","import { useEffect, useMemo, useRef, type ReactNode } from 'react';\n\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { pages } from './pagesConfig/const';\nimport { type PageState } from './pagesConfig/types';\nimport { type PortalModalState } from './modals/types';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { modals } from './modals';\nimport { usePortalUI, usePortalCurrentPage, usePortalUIMaxContentHeight, usePortalModals } from '@/stores';\nimport { cn } from '@/utils';\n\ninterface ContentSectionProps {\n overriddingPage?: PageState;\n}\n\nconst MeasuredContentRenderer: React.FC<{\n children?: ReactNode;\n id: string;\n isModal?: boolean;\n onModalOverlayClick?: () => void;\n}> = ({ children, id, isModal, onModalOverlayClick }) => {\n const { setContentHeight, removeContentHeight } = usePortalUI();\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!contentRef.current) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.borderBoxSize?.[0]?.blockSize ?? entry.target.getBoundingClientRect().height;\n setContentHeight(id, height);\n }\n });\n\n observer.observe(contentRef.current);\n return () => {\n observer.disconnect();\n removeContentHeight(id);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return (\n <>\n {isModal && (\n <div\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onModalOverlayClick?.();\n }}\n className=\"absolute flex w-full h-full bg-[#0E2F3F]/30 origin-top translate-y-[-8px] scale-[0.95]\"\n />\n )}\n <div className=\"relative flex w-full h-full overflow-y-hidden pointer-events-none\">\n <div className={cn('fnx-panel absolute flex left-0 w-full p-4 top-0 pointer-events-auto')} ref={contentRef}>\n {children}\n </div>\n </div>\n </>\n );\n};\n\nconst ContentRenderer: React.FC<{ page: PageState }> = ({ page }) => {\n const content = useMemo(() => {\n const PageComp = pages[page.page];\n const props = page.props ?? {};\n return <PageComp {...props} />;\n }, [page]);\n\n return <MeasuredContentRenderer id=\"content\">{content}</MeasuredContentRenderer>;\n};\n\nconst ModalRenderer: React.FC<{ modal: PortalModalState }> = ({ modal }) => {\n const content = useMemo(() => {\n const ModalComp = modals[modal.modal] as React.FC<typeof modal>;\n return <ModalComp {...modal} />;\n }, [modal]);\n\n return (\n <MeasuredContentRenderer id={`${modal.modal}-modal`} isModal onModalOverlayClick={modal.onClose}>\n {content}\n </MeasuredContentRenderer>\n );\n};\n\nexport const ContentSection: React.FC<ContentSectionProps> = ({ overriddingPage }) => {\n const { isTopSide } = useFnxFloatingButtonContext();\n const { contentPanelOpen } = usePortalUI();\n const { modalStack } = usePortalModals();\n const maxContentHeight = usePortalUIMaxContentHeight();\n const currentPage = usePortalCurrentPage();\n const pageOrOverridingPage = overriddingPage ?? currentPage;\n\n return (\n <AnimatePresence>\n {contentPanelOpen && (\n <motion.div\n className=\"relative flex w-full z-50\"\n initial={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n animate={{ opacity: 1, y: 0, height: `${maxContentHeight}px`, maxHeight: `${maxContentHeight}px` }}\n exit={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n >\n <AnimatedZStack>\n <ContentRenderer page={pageOrOverridingPage} />\n {modalStack.map((modal) => {\n return <ModalRenderer key={modal.modal} modal={modal} />;\n })}\n </AnimatedZStack>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineAccountBalanceWallet } from 'react-icons/md';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { AddressButton } from '../../components/AddressButton';\nimport { ConnectedChainIndicator } from '../../components/ConnectedChainIndicator';\n\nexport const WalletHeader: React.FC = () => {\n const walletAddress = useCofheAccount();\n\n return (\n <div className=\"flex items-center justify-between\">\n {/* Left: Wallet Address */}\n <AddressButton address={walletAddress} icon={<MdOutlineAccountBalanceWallet className=\"w-4 h-4\" />} />\n\n {/* Right: Network Selector + Settings */}\n <div className=\"flex items-center gap-2\">\n <ConnectedChainIndicator />\n </div>\n </div>\n );\n};\n","import { useState } from 'react';\nimport { MdContentCopy, MdCheck } from 'react-icons/md';\nimport { cn } from '../../../utils/cn.js';\nimport { truncateAddress } from '../../../utils/utils.js';\n\ninterface AddressButtonProps {\n address: string | null | undefined;\n className?: string;\n icon?: React.ReactNode;\n showCopyIcon?: boolean;\n}\n\nexport const AddressButton: React.FC<AddressButtonProps> = ({ address, className, icon, showCopyIcon = true }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopyAddress = async () => {\n if (!address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy address:', err);\n }\n };\n\n const truncatedAddress = truncateAddress(address) || 'Not connected';\n\n return (\n <button\n onClick={handleCopyAddress}\n disabled={!address}\n className={cn(\n 'flex items-center gap-2 px-2 py-1 rounded fnx-hover-overlay transition-colors',\n 'fnx-text-primary text-sm',\n className\n )}\n >\n {icon}\n <span className=\"font-mono\">{truncatedAddress}</span>\n {showCopyIcon && address && (copied ? <MdCheck className=\"w-3 h-3\" /> : <MdContentCopy className=\"w-3 h-3\" />)}\n {copied && !showCopyIcon && <span className=\"text-xs opacity-70\">Copied!</span>}\n </button>\n );\n};\n","import { getChainById } from '@cofhe/sdk/chains';\nimport { ChainIcon } from './ChainIcon';\nimport { cn } from '@/utils/cn';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\n\nexport const ConnectedChainIndicator: React.FC = () => {\n const chainId = useCofheChainId();\n\n // Get network name from SDK chains\n const chain = chainId ? getChainById(chainId) : undefined;\n const currentNetwork = chain?.name || 'Eth';\n\n return (\n <div\n className={cn(\n 'flex items-center gap-1 px-2 py-1 rounded fnx-hover-overlay transition-colors',\n 'fnx-text-primary text-sm outline-none border fnx-dropdown-border',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n <ChainIcon chainId={chainId} />\n <span className=\"font-medium\">{currentNetwork}</span>\n </div>\n );\n};\n","import type { SVGProps } from \"react\";\nconst Svg11155111 = (props: SVGProps<SVGSVGElement>) => <svg id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlnsXlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 1920 1920\" enableBackground=\"new 0 0 1920 1920\" xmlSpace=\"preserve\" {...props}><g><polygon fill=\"#8A92B2\" points=\"959.8,80.7 420.1,976.3 959.8,731 \" /><polygon fill=\"#62688F\" points=\"959.8,731 420.1,976.3 959.8,1295.4 \" /><polygon fill=\"#62688F\" points=\"1499.6,976.3 959.8,80.7 959.8,731 \" /><polygon fill=\"#454A75\" points=\"959.8,1295.4 1499.6,976.3 959.8,731 \" /><polygon fill=\"#8A92B2\" points=\"420.1,1078.7 959.8,1839.3 959.8,1397.6 \" /><polygon fill=\"#62688F\" points=\"959.8,1397.6 959.8,1839.3 1499.9,1078.7 \" /></g></svg>;\nexport default Svg11155111;","import type { SVGProps } from \"react\";\nconst Svg84532 = (props: SVGProps<SVGSVGElement>) => <svg width={256} height={256} viewBox=\"0 0 256 256\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M256 128C256 198.692 198.592 256 127.777 256C60.5909 256 5.47394 204.417 0 138.759H169.482V117.24H0C5.47394 51.583 60.5909 0 127.777 0C198.592 0 256 57.3074 256 128Z\" fill=\"#0052FF\" /></svg>;\nexport default Svg84532;","import { cn } from '@/utils';\n\n// The icons probably needs to be part of the SDK chains package\n// Import chain icons\nimport sepolia from '@/assets/chains/11155111.svg';\nimport baseSepolia from '@/assets/chains/84532.svg';\n\nconst chainIcons: Record<number, React.FC<React.SVGProps<SVGSVGElement>>> = {\n 11155111: sepolia,\n 84532: baseSepolia,\n};\n\ninterface ChainIconProps {\n chainId: number | undefined;\n className?: string;\n}\n\nexport const ChainIcon: React.FC<ChainIconProps> = ({ chainId, className }) => {\n const Icon = chainId ? chainIcons[chainId] : undefined;\n\n if (Icon) {\n return <Icon className={cn('w-4 h-4 flex-shrink-0', className)} />;\n }\n\n // Fallback icon\n return (\n <div className={cn('w-4 h-4 rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0', className)}>\n <span className=\"text-[8px]\">⟠</span>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { useCofheToken } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../../components/TokenIcon';\nimport { CofheTokenConfidentialBalance } from '../../components/CofheTokenConfidentialBalance';\nimport { useCofhePinnedTokenAddress } from '@/hooks/useCofhePinnedTokenAddress';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\n\nexport const AssetCard: React.FC = () => {\n // TODO: show Native token if no pinned token address\n\n const { navigateTo } = usePortalNavigation();\n // const pinnedTokenAddress = \"0x8ee52408ED5b0e396aA779Fd52F7fbc20A4b33Fb\"; // Base sepolia\n // const pinnedTokenAddress = \"0xbED96aa98a49FeA71fcC55d755b915cF022a9159\"; // Redact (Sepolia)\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n\n // Find token from token lists to get icon and confidentialityType\n const tokenFromList = useCofheToken({\n address: pinnedTokenAddress,\n });\n\n const handleClick = () => {\n // TODO: figure out best handling for this error\n if (!tokenFromList) throw new Error('Token not found in token list');\n\n if (pinnedTokenAddress) {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: { token: tokenFromList },\n });\n } else {\n // TODO: native token support\n alert('Native token info navigation is not implemented yet.');\n }\n };\n\n return (\n <div\n onClick={handleClick}\n className={cn('fnx-card-bg p-4 cursor-pointer', 'hover:opacity-90 transition-opacity', 'border fnx-card-border')}\n >\n <div className=\"flex items-center justify-between\">\n {/* Left Side: Icon, Ticker, Privacy Metrics */}\n <div className=\"flex items-center gap-3 flex-1\">\n {/* Asset Icon */}\n <TokenIcon logoURI={tokenFromList?.logoURI} alt={tokenFromList?.symbol} size=\"md\" />\n\n {/* Ticker and Privacy */}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-lg font-bold fnx-text-primary\">{tokenFromList?.symbol}</h3>\n\n {/* Privacy Metrics Placeholder for future implementation */}\n {/* <div className=\"flex items-center gap-2 text-xs fnx-text-primary opacity-80\">\n <div className=\"flex items-center gap-1\">\n <VisibilityOffIcon className=\"w-3 h-3\" />\n <span>{asset.privacyHidden}%</span>\n </div>\n <span>|</span>\n <div className=\"flex items-center gap-1\">\n <VisibilityIcon className=\"w-3 h-3\" />\n <span>{asset.privacyVisible}%</span>\n </div>\n </div> */}\n </div>\n </div>\n\n {/* Right Side: Balance, Change, Arrow */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col items-end\">\n {/* // TODO: add suport for displaying native token balance if no pinned address */}\n <CofheTokenConfidentialBalance\n token={tokenFromList}\n showSymbol={false}\n size=\"xl\"\n decimalPrecision={5}\n className=\"font-bold\"\n />\n {/* <div className=\"text-sm fnx-positive-change font-medium\">\n {asset.change}\n </div> */}\n </div>\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60\" />\n </div>\n </div>\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { cn } from '@/utils';\nimport defaultTokenIcon from '@/assets/default-token.webp';\n\ntype TokenIconSize = 'sm' | 'md' | 'lg' | 'xl';\n\ninterface TokenIconProps {\n /** Token logo URI */\n logoURI?: string | null;\n /** Alt text for the image */\n alt?: string;\n /** Size variant */\n size?: TokenIconSize;\n /** CSS class name for the container div (overrides size if provided) */\n className?: string;\n /** CSS class name for the image */\n imageClassName?: string;\n}\n\nconst sizeClasses: Record<TokenIconSize, string> = {\n sm: 'w-5 h-5',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n xl: 'w-16 h-16',\n};\n\nexport const TokenIcon: React.FC<TokenIconProps> = ({\n logoURI,\n alt = 'Token',\n size = 'sm',\n className,\n imageClassName = 'w-full h-full object-cover',\n}) => {\n const [iconError, setIconError] = useState(false);\n\n // Reset error when logoURI changes\n useEffect(() => {\n setIconError(false);\n }, [logoURI]);\n\n const containerClassName =\n className ||\n cn(sizeClasses[size], 'rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0 overflow-hidden');\n\n return (\n <div className={containerClassName}>\n <img\n src={iconError || !logoURI ? defaultTokenIcon : logoURI}\n alt={alt}\n className={imageClassName}\n onError={() => setIconError(true)}\n />\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\n\nexport interface LoadingDotsProps {\n /** Size variant for the dots */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Custom className for the container */\n className?: string;\n /** Color variant - defaults to primary text color */\n variant?: 'primary' | 'secondary';\n}\n\nconst sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n};\n\nexport const LoadingDots: React.FC<LoadingDotsProps> = ({ size = 'md', className, variant = 'primary' }) => {\n return (\n <span\n className={cn(\n 'fnx-loading-dots',\n sizeClasses[size],\n variant === 'primary' ? 'fnx-text-primary' : 'opacity-70',\n className\n )}\n >\n <span>•</span>\n <span>•</span>\n <span>•</span>\n </span>\n );\n};\n","import { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nimport { CREATE_PERMITT_BODY_BY_ERROR_CAUSE } from '@/providers/errors';\nimport { cn, ErrorCause } from '@/utils';\nimport { LoadingDots } from './LoadingDots';\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-xl',\n xl: 'text-2xl',\n};\n\ntype TokenBalanceViewProps = {\n className?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n formattedBalance?: string;\n symbol?: string;\n isFetching?: boolean;\n hidden?: boolean;\n};\nexport const TokenBalanceView: React.FC<TokenBalanceViewProps> = ({\n className,\n size = 'md',\n formattedBalance,\n symbol,\n isFetching,\n hidden,\n}) => {\n return (\n <span className={cn(sizeClasses[size], 'font-medium fnx-text-primary', className)}>\n {hidden ? <ConfidentialValuePlaceholder /> : isFetching ? <LoadingDots size={size} /> : formattedBalance}\n {symbol && ` ${symbol}`}\n </span>\n );\n};\n\nconst ConfidentialValuePlaceholder: React.FC = () => {\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit({\n ReasonBody: CREATE_PERMITT_BODY_BY_ERROR_CAUSE[ErrorCause.AttemptToFetchConfidentialBalance],\n });\n\n return (\n <span\n className=\"cursor-pointer hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n navigateToGeneratePermit();\n }}\n >\n {'* * *'}\n </span>\n );\n};\n","import type { Address } from 'viem';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { TokenBalanceView } from './TokenBalanceView';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\n\nexport enum BalanceType {\n Public = 'public',\n Confidential = 'confidential',\n}\n\ninterface TokenBalanceProps {\n /** Token object from token list (for non-native tokens) */\n token?: Token;\n /** Account address to fetch balance for */\n accountAddress?: Address;\n\n /** Number of decimal places to show (default: 5) */\n decimalPrecision?: number;\n /** Whether to show the token symbol */\n showSymbol?: boolean;\n\n /** Custom className for the balance text */\n className?: string;\n /** Size variant for the balance display */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nconst DEFAULT_DISPLAY_DECIMALS = 5;\n\nexport const CofheTokenConfidentialBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n // Determine which account address to use\n const effectiveAccountAddress = accountAddress ?? account;\n\n // Use unified hook for confidential balance fetching\n const {\n data: { formatted: confidentialBalanceFormatted } = {},\n isFetching: isFetchingConfidential,\n disabledDueToMissingPermit,\n } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: effectiveAccountAddress,\n displayDecimals: decimalPrecision,\n });\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n hidden={disabledDueToMissingPermit}\n isFetching={isFetchingConfidential}\n formattedBalance={confidentialBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n\nexport const CofheTokenPublicBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n const effectiveAccountAddress = accountAddress ?? account;\n\n const { data: { formatted: publicBalanceFormatted } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance(\n { token, accountAddress: effectiveAccountAddress, displayDecimals: decimalPrecision }\n );\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n isFetching={isFetchingPublic}\n formattedBalance={publicBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n","import { useCofheContext } from '@/providers';\nimport { useCofheChainId } from './useCofheConnection';\n\n/**\n * Hook to get pinned token address for the current chain\n * @returns Pinned token address for current chain, or undefined if none\n */\nexport function useCofhePinnedTokenAddress() {\n const widgetConfig = useCofheContext().client.config.react;\n const chainId = useCofheChainId();\n const pinnedTokenAddress = chainId ? widgetConfig.pinnedTokens[chainId?.toString()] : undefined;\n return pinnedTokenAddress;\n}\n","import { cn } from '@/utils/cn';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { IoMdKey } from 'react-icons/io';\nimport { AiOutlinePieChart } from 'react-icons/ai';\nimport { TbShieldPlus } from 'react-icons/tb';\nimport { FaBug } from 'react-icons/fa';\nimport type { ComponentType, ReactNode } from 'react';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { assert, type ElementOf } from 'ts-essentials';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\nimport { Button } from '../../components';\nimport { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\n\nconst iconClassName = 'w-4 h-4';\n\nconst ShieldIcon = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n\n const badgeText = totalTokensClaimable > 99 ? '99+' : totalTokensClaimable > 0 ? `+${totalTokensClaimable}` : null;\n\n return (\n <span className=\"relative inline-flex items-center justify-center w-6 h-6 shrink-0\">\n <TbShieldPlus className={iconClassName} />\n {badgeText && (\n <span\n className={cn(\n 'pointer-events-none',\n 'absolute top-0 right-0',\n 'translate-x-[35%] -translate-y-[35%]',\n 'min-w-[18px] h-[18px] px-1',\n 'rounded-full',\n 'flex items-center justify-center',\n 'text-[10px] leading-none font-semibold',\n 'bg-[#6EE7F5] text-[#003B4A]',\n 'outline outline-2 outline-[var(--fnx-button-bg)]',\n 'shadow-sm'\n )}\n >\n {badgeText}\n </span>\n )}\n </span>\n );\n};\n\ntype PagesInBottomMenu =\n | FloatingButtonPage.Send\n | FloatingButtonPage.Shield\n | FloatingButtonPage.TokenList\n | FloatingButtonPage.Permits\n | FloatingButtonPage.Debug;\n\nconst baseNavItems: {\n id: PagesInBottomMenu;\n label: string;\n icon: ReactNode | ComponentType<{}>;\n}[] = [\n {\n id: FloatingButtonPage.Send,\n label: 'Send',\n icon: <GoArrowUpRight className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Shield,\n label: 'Shield',\n icon: ShieldIcon,\n },\n {\n id: FloatingButtonPage.TokenList,\n label: 'Portfolio',\n icon: <AiOutlinePieChart className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Permits,\n label: 'Permits',\n icon: <IoMdKey className={iconClassName} />,\n },\n] as const;\n\nconst debugNavItem = {\n id: FloatingButtonPage.Debug,\n label: 'Debug',\n icon: <FaBug className={iconClassName} />,\n} as const;\n\n/**\n * Checks if we're in production by checking multiple environment variable sources\n * Supports: process.env (Node.js/webpack), import.meta.env (Vite), and other common patterns\n */\nconst isProduction = (): boolean => {\n // Check process.env (Node.js, webpack, etc.)\n // eslint-disable-next-line turbo/no-undeclared-env-vars, no-undef\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n return false;\n }\n\n // Check import.meta.env (Vite)\n if (typeof import.meta !== 'undefined') {\n // {\n // \"BASE_URL\": \"/\",\n // \"DEV\": true,\n // \"MODE\": \"development\",\n // \"PROD\": false,\n // \"SSR\": false\n // }\n const metaEnv = (import.meta as any).env;\n\n // ONLY if ALL flags indicate development AND prod flag doesn't indicate prod, treat as development\n if (metaEnv && metaEnv.MODE === 'development' && metaEnv.DEV === true && metaEnv.PROD === false) {\n return false;\n }\n }\n\n // Default to hiding debug in library context\n return true;\n};\n\nconst navItems = [...baseNavItems, ...(!isProduction() ? [debugNavItem] : [])] as const;\n\nexport const BottomNavigation: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n const defaultToken = useCofhePinnedToken();\n\n const handleNavClick = (page: ElementOf<typeof baseNavItems>['id']) => {\n openPortal();\n\n if (page === FloatingButtonPage.TokenList) {\n navigateTo(FloatingButtonPage.TokenList, {\n pageProps: {\n title: 'Portfolio',\n mode: 'view',\n backToPageState: {\n page: FloatingButtonPage.TokenInfo,\n },\n },\n });\n return;\n }\n\n if (page === FloatingButtonPage.Send) {\n assert(defaultToken, 'No pinned token available for Send page');\n navigateTo(FloatingButtonPage.Send, { pageProps: { token: defaultToken } });\n return;\n }\n\n if (page === FloatingButtonPage.Shield) {\n assert(defaultToken, 'No pinned token available for Shield page');\n navigateTo(FloatingButtonPage.Shield, { pageProps: { token: defaultToken } });\n return;\n }\n\n navigateTo(page);\n };\n\n return (\n <div className=\"flex gap-2\">\n {navItems.map((item) => (\n <Button\n key={item.id}\n onClick={() => handleNavClick(item.id)}\n icon={typeof item.icon === 'function' ? <item.icon /> : item.icon}\n iconPosition=\"top\"\n label={item.label}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n};\n","import { useCofhePinnedTokenAddress } from './useCofhePinnedTokenAddress';\nimport { useCofheToken } from './useCofheTokenLists';\n\nexport function useCofhePinnedToken({ enabled }: { enabled?: boolean } = {}) {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const token = useCofheToken(\n {\n address: pinnedTokenAddress,\n },\n {\n // only fetch metadata if pinned token address is defined\n enabled: enabled !== false && !!pinnedTokenAddress,\n }\n );\n return token;\n}\n","import { cn } from '../../../utils/cn.js';\nimport type { ReactNode } from 'react';\n\ninterface ActionButtonProps {\n onClick: () => void;\n disabled?: boolean;\n icon?: ReactNode;\n label: string;\n className?: string;\n variant?: 'default' | 'tab';\n pressed?: boolean;\n}\n\n/**\n * Reusable action button styled like the bottom navigation buttons with sharp edges.\n */\nexport const ActionButton: React.FC<ActionButtonProps> = ({\n onClick,\n disabled = false,\n icon,\n label,\n className,\n variant = 'default',\n pressed = false,\n}) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'w-full font-medium flex items-center justify-center gap-1',\n variant === 'tab' ? 'py-2 px-2 text-sm' : 'py-1.5 px-2 text-xs',\n 'fnx-nav-button',\n pressed && 'fnx-nav-button-active',\n 'transition-all',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n >\n {icon}\n <span>{label}</span>\n </button>\n );\n};\n","import { sanitizeNumericInput } from '../../../utils/utils.js';\n\ninterface AmountInputProps {\n value: string;\n onChange: (value: string) => void;\n onMaxClick: () => void;\n placeholder?: string;\n className?: string;\n}\n\n/**\n * Reusable amount input with max button for token operations.\n */\nexport const AmountInput: React.FC<AmountInputProps> = ({\n value,\n onChange,\n onMaxClick,\n placeholder = '0',\n className,\n}) => {\n return (\n <div className={`flex items-center gap-1 w-full ${className ?? ''}`}>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={value}\n onChange={(e) => onChange(sanitizeNumericInput(e.target.value))}\n placeholder={placeholder}\n className=\"flex-1 min-w-0 bg-transparent text-sm font-medium fnx-text-primary outline-none placeholder:opacity-50 text-center border-b fnx-card-border pb-1\"\n />\n <button onClick={onMaxClick} className=\"fnx-max-button text-xxxs font-medium px-1 py-0.5 rounded flex-shrink-0\">\n max\n </button>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport type { ReactNode } from 'react';\n\nexport type ButtonVariant = 'primary' | 'default' | 'error' | 'warning' | 'ghost' | 'outline';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Button variant style */\n variant?: ButtonVariant;\n /** Button size */\n size?: ButtonSize;\n /** Text content (alternative to children) */\n label?: string;\n /** Icon component to display */\n icon?: ReactNode;\n /** Icon position relative to text */\n iconPosition?: 'left' | 'right' | 'top';\n /** Override default className */\n className?: string;\n /** Button content (alternative to text prop) */\n children?: ReactNode;\n}\n\n/**\n * Reusable button component with support for light/dark mode, multiple variants, and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"default\" size=\"md\" text=\"Sign\" />\n * <Button variant=\"error\" size=\"sm\" text=\"Cancel\" icon={<Icon />} />\n * <Button variant=\"outline\" size=\"lg\">\n * Click me\n * </Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'default',\n size = 'md',\n label,\n icon,\n iconPosition = 'left',\n className,\n children,\n disabled,\n ...props\n}) => {\n // Determine content - prefer text prop over children\n const content = label ?? children;\n\n // Determine if layout should be vertical\n const isVertical = iconPosition === 'top';\n\n // Base classes\n const baseClasses = cn(\n 'inline-flex items-center justify-center',\n isVertical && 'flex-col',\n 'font-medium',\n 'border transition-all',\n 'focus:outline-none focus:ring-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors duration-200'\n );\n\n // Size classes - adjust gap for vertical layout\n const sizeClasses: Record<ButtonSize, string> = {\n sm: isVertical ? 'px-2 py-1 text-xs gap-1' : 'px-2 py-1 text-xs gap-1.5',\n md: isVertical ? 'px-3 py-1.5 text-xs gap-1' : 'px-3 py-1.5 text-xs gap-1.5',\n lg: isVertical ? 'px-4 py-2 text-sm gap-1.5' : 'px-4 py-2 text-sm gap-2',\n // xl: isVertical ? 'px-6 py-3 text-base gap-2' : 'px-6 py-3 text-base gap-2.5',\n };\n\n // Variant classes for light mode\n const variantClassesLight: Record<ButtonVariant, string> = {\n primary: cn('bg-[#80E6E6] hover:bg-[#6DD5D5]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#80E6E6]'),\n default: cn(\n 'bg-white hover:bg-[#6DD5D5]',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n error: cn('bg-[#FFB399] hover:bg-[#FF9F80]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFB399]'),\n warning: cn('bg-[#FFD699] hover:bg-[#FFC966]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFD699]'),\n ghost: cn('bg-transparent hover:bg-gray-100', 'text-[#003366]', 'border-transparent', 'focus:ring-gray-300'),\n outline: cn(\n 'bg-white hover:bg-gray-50',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n };\n\n // Variant classes for dark mode\n const variantClassesDark: Record<ButtonVariant, string> = {\n primary: cn(\n 'dark:bg-[#2E9D9D] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#2E9D9D]'\n ),\n default: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n error: cn(\n 'dark:bg-[#D9532E] dark:hover:bg-[#C0441F]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#D9532E]'\n ),\n warning: cn(\n 'dark:bg-[#E67E22] dark:hover:bg-[#D35400]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#E67E22]'\n ),\n ghost: cn(\n 'dark:bg-transparent dark:hover:bg-[#374151]',\n 'dark:text-white',\n 'dark:border-transparent',\n 'dark:focus:ring-gray-600'\n ),\n outline: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#4A4A4A]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n };\n\n // Combine all classes\n const buttonClasses = cn(\n baseClasses,\n sizeClasses[size],\n variantClassesLight[variant],\n variantClassesDark[variant],\n className\n );\n\n // Icon wrapper classes - flex container that doesn't constrain icon size\n const iconWrapperClasses = 'flex items-center justify-center flex-shrink-0';\n\n return (\n <button className={buttonClasses} disabled={disabled} {...props}>\n {icon && iconPosition === 'top' && <span className={iconWrapperClasses}>{icon}</span>}\n {icon && iconPosition === 'left' && <span className={iconWrapperClasses}>{icon}</span>}\n {content}\n {icon && iconPosition === 'right' && <span className={iconWrapperClasses}>{icon}</span>}\n </button>\n );\n};\n","import { formatUnits } from 'viem';\nimport { cn } from '../../../utils/cn.js';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { TbShieldPlus, TbShieldMinus, TbShieldCheck } from 'react-icons/tb';\nimport {\n type Transaction,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n} from '../../../stores/transactionStore.js';\nimport { formatRelativeTime } from '../../../utils/utils.js';\nimport { HashLink } from './HashLink.js';\n\ninterface TransactionItemProps {\n transaction: Transaction;\n}\n\nconst ActionIcon: React.FC<{ actionType: TransactionActionType }> = ({ actionType }) => {\n const iconClassName = 'w-5 h-5';\n\n switch (actionType) {\n case TransactionActionType.ShieldSend:\n return <GoArrowUpRight className={iconClassName} />;\n case TransactionActionType.Shield:\n return <TbShieldPlus className={iconClassName} />;\n case TransactionActionType.Unshield:\n return <TbShieldMinus className={iconClassName} />;\n case TransactionActionType.Claim:\n return <TbShieldCheck className={iconClassName} />;\n default:\n return <GoArrowUpRight className={iconClassName} />;\n }\n};\n\nexport const TransactionItem: React.FC<TransactionItemProps> = ({ transaction }) => {\n const statusColorClass =\n transaction.status === TransactionStatus.Pending\n ? 'text-yellow-600 dark:text-yellow-400'\n : transaction.status === TransactionStatus.Confirmed\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400';\n\n return (\n <div className=\"fnx-card-bg p-3 rounded-lg border fnx-dropdown-border\">\n <div className=\"flex items-start gap-3\">\n {/* Action Icon */}\n <div className=\"w-8 h-8 rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0 fnx-text-primary\">\n <ActionIcon actionType={transaction.actionType} />\n </div>\n\n {/* Transaction Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold fnx-text-primary\">{actionToString(transaction.actionType)}</span>\n <span className=\"text-sm font-semibold fnx-text-primary\">\n {formatUnits(transaction.tokenAmount, transaction.token.decimals)} {transaction.token.symbol}\n </span>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 mt-1\">\n <span className={cn('text-xs font-medium', statusColorClass)}>{statusToString(transaction.status)}</span>\n <span className=\"text-xs fnx-text-primary opacity-60\">{formatRelativeTime(transaction.timestamp)}</span>\n </div>\n\n <div className=\"mt-1\">\n <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} copyable />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { type ReactNode } from 'react';\n\ninterface PageContainerProps {\n /** Whether the page is a modal */\n isModal?: boolean;\n /** Optional header component that will be fixed at the top */\n header?: ReactNode;\n /** Body content that will be scrollable if it overflows */\n content?: ReactNode;\n /** Optional footer component that will be pinned to the bottom */\n footer?: ReactNode;\n}\n\n/**\n * PageContainer provides a consistent layout structure for pages with:\n * - Optional header (fixed at top)\n * - Scrollable body content\n * - Optional footer (pinned at bottom)\n * - Max height of 500px, but shrinks to fit content when smaller\n */\nexport const PageContainer: React.FC<PageContainerProps> = ({ isModal, header, content, footer }) => {\n return (\n <div className={cn('flex flex-col max-h-[500px] w-full gap-4', isModal ? '' : 'h-full')}>\n {/* Header - fixed at top, doesn't scroll */}\n {header && <div className=\"flex-shrink-0\">{header}</div>}\n\n {/* Body - scrollable middle section that fills available space */}\n {content && <div className=\"flex-1 min-h-0 overflow-y-auto\">{content}</div>}\n\n {/* Footer - fixed at bottom, doesn't scroll */}\n {footer && <div className=\"flex-shrink-0\">{footer}</div>}\n </div>\n );\n};\n","import { WalletHeader } from './MainPage/WalletHeader';\nimport { AssetCard } from './MainPage/AssetCard';\nimport { BottomNavigation } from './MainPage/BottomNavigation';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const MainPage: React.FC = () => (\n <PageContainer header={<WalletHeader />} content={<AssetCard />} footer={<BottomNavigation />} />\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useSettingsStore, ShieldPageVariant, SHIELD_PAGE_VARIANT_LABELS } from '../stores/settingsStore.js';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const SettingsPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { shieldPageVariant, setShieldPageVariant } = useSettingsStore();\n\n const variants = Object.values(ShieldPageVariant);\n\n return (\n <PageContainer\n header={\n <button onClick={navigateBack} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Settings</span>\n </button>\n }\n content={\n <div className=\"space-y-3\">\n <p className=\"text-sm font-medium\">A/B Testing</p>\n\n {/* Shield Page Variant */}\n <div className=\"space-y-2\">\n <p className=\"text-xs opacity-70\">Shield Page</p>\n <div className=\"space-y-1\">\n {variants.map((variant) => (\n <label key={variant} className=\"flex items-center gap-2 text-xs cursor-pointer\">\n <input\n type=\"radio\"\n name=\"shieldPageVariant\"\n checked={shieldPageVariant === variant}\n onChange={() => setShieldPageVariant(variant)}\n />\n <span>{SHIELD_PAGE_VARIANT_LABELS[variant]}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n }\n />\n );\n};\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\n// ============================================================================\n// Shield Page Variants (A/B Testing)\n// ============================================================================\n\nexport enum ShieldPageVariant {\n Option1 = 'option1',\n Option2 = 'option2',\n}\n\nexport const SHIELD_PAGE_VARIANT_LABELS: Record<ShieldPageVariant, string> = {\n [ShieldPageVariant.Option1]: 'Modern UI',\n [ShieldPageVariant.Option2]: 'Classic UI',\n};\n\n// ============================================================================\n// Settings Store\n// ============================================================================\n\ninterface SettingsState {\n /** Selected shield page variant for A/B testing */\n shieldPageVariant: ShieldPageVariant;\n\n /** Set the shield page variant */\n setShieldPageVariant: (variant: ShieldPageVariant) => void;\n}\n\nexport const useSettingsStore = create<SettingsState>()(\n persist(\n (set) => ({\n shieldPageVariant: ShieldPageVariant.Option1,\n\n setShieldPageVariant: (variant) => set({ shieldPageVariant: variant }),\n }),\n {\n name: 'cofhe-settings',\n }\n )\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { type TokenListMode } from '../FnxFloatingButtonContext.js';\nimport { useCofheTokens } from '@/hooks/useCofheTokenLists.js';\nimport { useCofheChainId } from '@/hooks/useCofheConnection.js';\nimport { TokenRow } from './TokenListPage/TokenRow.js';\nimport { isPageWithProps, type FloatingButtonPage, type PageState } from '../pagesConfig/types.js';\nimport { assert } from 'ts-essentials';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\n\ntype PageStateWithoutTokenProp = Omit<PageState, 'props'> & { props?: Omit<PageState['props'], 'token'> };\n\ntype TokenListPageProps = { title?: string; backToPageState: PageStateWithoutTokenProp; mode: TokenListMode };\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.TokenList]: TokenListPageProps;\n }\n}\n\nexport const TokenListPage: React.FC<TokenListPageProps> = ({ title, backToPageState, mode: tokenListMode }) => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n\n const defaultTitle = tokenListMode === 'select' ? 'Select token to transfer' : 'Token List';\n const pageTitle = title ?? defaultTitle;\n\n return (\n <PageContainer\n header={\n <button onClick={navigateBack} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">{pageTitle}</p>\n </button>\n }\n content={\n <div className=\"fnx-token-list-container\">\n {allTokens.length === 0 ? (\n <p className=\"text-xs opacity-70 py-4 text-center\">No tokens found</p>\n ) : (\n allTokens.map((token) => (\n <TokenRow\n onClick={() => {\n assert(isPageWithProps(backToPageState.page), 'backToPageState must be a page with props');\n navigateTo(backToPageState.page, { pageProps: { ...backToPageState.props, token } });\n }}\n key={token.address}\n token={token}\n />\n ))\n )}\n </div>\n }\n />\n );\n};\n","import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { cn } from '../../../../utils/cn';\nimport type { Token } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../../components/TokenIcon';\nimport { CofheTokenConfidentialBalance } from '../../components';\n\nexport const TokenRow: React.FC<{\n token: Token;\n onClick: () => void;\n}> = ({ token, onClick }) => {\n return (\n <div\n onClick={onClick}\n className={cn(\n 'flex items-center justify-between p-1',\n 'hover:bg-white hover:bg-opacity-5 transition-colors',\n 'cursor-pointer'\n )}\n >\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"sm\" />\n\n {/* Token Name and Symbol */}\n <div className=\"flex items-center gap-1 min-w-0 flex-1\">\n <span className=\"text-sm font-medium fnx-text-primary truncate\">{token.name}</span>\n <span className=\"text-xxxs opacity-70 fnx-text-primary\">({token.symbol})</span>\n </div>\n </div>\n\n {/* Balance and Arrow */}\n <div className=\"flex items-center gap-2\">\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium\"\n />\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60 flex-shrink-0\" />\n </div>\n </div>\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { FaKey, FaDownload, FaPlus } from 'react-icons/fa';\nimport DeleteOutlineIcon from '@mui/icons-material/DeleteOutline';\nimport { type ElementType, type FC } from 'react';\nimport { Accordion, AccordionSection } from '../../../Accordion.js';\nimport { PermitItem } from '../components/PermitItem.js';\nimport { usePermitsList } from '@/hooks/permits/index.js';\nimport type { QuickActionId } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer.js';\nimport { useCofheActivePermit } from '@/hooks/useCofhePermits.js';\nimport type { Permit } from '@cofhe/sdk/permits';\nimport { Button } from '@/components/FnxFloatingButton/components/Button.js';\nimport { InfoModalButton } from '@/components/FnxFloatingButton/modals/InfoModalButton.js';\nimport { usePortalModals } from '@/stores';\nimport { PortalModal } from '@/components/FnxFloatingButton/modals/types.js';\nimport { PermitCard } from '@/components/FnxFloatingButton/components/PermitCard.js';\n\ntype QuickAction = { id: QuickActionId; label: string; icon: ElementType };\n\nconst quickActions: QuickAction[] = [\n { id: 'generate', label: 'Generate', icon: FaPlus },\n { id: 'delegate', label: 'Delegate', icon: FaKey },\n { id: 'import', label: 'Import', icon: FaDownload },\n];\n\ntype Args = {\n generatedPermitsCount: number;\n receivedPermitsCount: number;\n activePermit?: Permit;\n};\n\nfunction computeDefaultActiveAccordionId({ activePermit }: Args): 'self' | 'received' {\n if (activePermit?.type === 'recipient') {\n return 'received';\n }\n return 'self';\n}\n\nexport const PermitsListPage: React.FC = () => {\n const {\n activePermitHash,\n selfPermits,\n delegatedPermits,\n importedPermits,\n handleQuickAction,\n handlePermitSelect,\n navigateBack,\n } = usePermitsList();\n const { openModal } = usePortalModals();\n\n const { permit } = useCofheActivePermit() ?? {};\n\n const defaultActiveAccordionId = computeDefaultActiveAccordionId({\n generatedPermitsCount: selfPermits.length,\n receivedPermitsCount: importedPermits.length,\n activePermit: permit,\n });\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-3\">\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={navigateBack}\n type=\"button\"\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Permits</span>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitInfo)} />\n </button>\n {activePermitHash != null && (\n <PermitCard\n hash={activePermitHash}\n className=\"-ml-4 -mr-4\"\n header={<p className=\"text-sm font-semibold\">Active Permit:</p>}\n />\n )}\n </div>\n }\n content={\n <div className=\"gap-4\">\n <Accordion defaultActiveId={defaultActiveAccordionId}>\n <div className=\"flex flex-col gap-3\">\n <AccordionSection\n id=\"self\"\n renderHeader={() => (\n <>\n <span>Self: ({selfPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'self' })} />\n </>\n )}\n >\n {selfPermits.length === 0 ? (\n <div className=\"pl-4 text-xs p-2 px-4 italic\">No self permits.</div>\n ) : (\n <div>\n {selfPermits.map(({ permit, hash }) => {\n return (\n <PermitItem\n key={hash}\n activePermitHash={activePermitHash}\n hash={hash}\n permit={permit}\n onSelect={() => handlePermitSelect(hash)}\n />\n );\n })}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"delegated\"\n renderHeader={() => (\n <>\n <span>Delegated: ({delegatedPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'sharing' })} />\n </>\n )}\n >\n {delegatedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No delegated permits.</div>\n ) : (\n <div>\n {delegatedPermits.map(({ permit, hash }) => (\n <PermitItem key={hash} hash={hash} permit={permit} onSelect={() => handlePermitSelect(hash)} />\n ))}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"received\"\n renderHeader={() => (\n <>\n <span>Imported: ({importedPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'recipient' })} />\n </>\n )}\n >\n {importedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No imported permits.</div>\n ) : (\n <div>\n {importedPermits.map(({ permit, hash }) => (\n <PermitItem\n key={hash}\n activePermitHash={activePermitHash}\n hash={hash}\n permit={permit}\n onSelect={() => handlePermitSelect(hash)}\n />\n ))}\n </div>\n )}\n </AccordionSection>\n </div>\n </Accordion>\n </div>\n }\n footer={\n <div className=\"grid grid-cols-3 gap-2\">\n {quickActions.map(({ id, label, icon: Icon }) => (\n <Button key={id} onClick={() => handleQuickAction(id)} icon={<Icon />} iconPosition=\"top\" label={label} />\n ))}\n </div>\n }\n />\n );\n};\n\nconst BasePermitActionButton: FC<{\n ariaLabel: string;\n title?: string;\n disabled?: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}> = ({ ariaLabel, title, disabled, onClick, children }) => (\n <button\n className=\"rounded-md border border-[#0E2F3F]/40 p-1.5 transition-colors hover:bg-[#0E2F3F]/10 dark:border-white/40 dark:hover:bg-white/10\"\n aria-label={ariaLabel}\n type=\"button\"\n title={title ?? ariaLabel}\n disabled={Boolean(disabled)}\n onClick={onClick}\n >\n {children}\n </button>\n);\n\nconst CopyPermitActionButton: FC<{ copied: boolean; onClick: () => void }> = ({ copied, onClick }) => (\n <BasePermitActionButton ariaLabel={copied ? 'Copied!' : 'Copy permit'} disabled={copied} onClick={onClick}>\n {copied ? <CheckIcon fontSize=\"small\" color=\"success\" /> : <ContentCopyIcon fontSize=\"small\" />}\n </BasePermitActionButton>\n);\n\nconst DeletePermitActionButton: FC<{ onClick: () => void }> = ({ onClick }) => (\n <BasePermitActionButton ariaLabel=\"Remove permit\" title=\"Remove permit\" onClick={onClick}>\n <DeleteOutlineIcon fontSize=\"small\" />\n </BasePermitActionButton>\n);\n","import { cn } from '@/utils';\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\nimport { Button } from './components';\nimport { FaChevronDown, FaChevronUp } from 'react-icons/fa6';\n\ninterface AccordionContextValue {\n activeId: string | null;\n toggle: (id: string) => void;\n}\n\nconst AccordionContext = createContext<AccordionContextValue | undefined>(undefined);\n\ninterface AccordionProps {\n children: ReactNode;\n defaultActiveId?: string | null;\n}\n\nexport const Accordion = ({ children, defaultActiveId = null }: AccordionProps) => {\n const [activeId, setActiveId] = useState<string | null>(defaultActiveId);\n\n const handleToggle = useCallback(\n (id: string) => {\n setActiveId(activeId === id ? null : id);\n },\n [activeId]\n );\n\n const contextValue = useMemo<AccordionContextValue>(\n () => ({\n activeId,\n toggle: handleToggle,\n }),\n [handleToggle, activeId]\n );\n\n return <AccordionContext.Provider value={contextValue}>{children}</AccordionContext.Provider>;\n};\n\nconst useAccordionContext = () => {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('Accordion components must be used within an Accordion');\n }\n\n return context;\n};\n\ninterface AccordionSectionProps {\n id: string;\n renderHeader: (isOpen: boolean) => ReactNode;\n children: ReactNode;\n sectionClassName?: string;\n triggerClassName?: string;\n contentClassName?: string;\n}\n\nexport const AccordionSection = ({\n id,\n renderHeader,\n children,\n sectionClassName,\n triggerClassName,\n contentClassName,\n}: AccordionSectionProps) => {\n const { activeId, toggle } = useAccordionContext();\n const isOpen = activeId === id;\n\n return (\n <section className={sectionClassName}>\n <Button\n variant=\"ghost\"\n className={cn('!justify-start w-full text-md py-2', triggerClassName)}\n aria-expanded={isOpen}\n onClick={() => toggle(id)}\n >\n {renderHeader(isOpen)}\n <span className=\"flex flex-1\" />\n {isOpen ? <FaChevronUp /> : <FaChevronDown />}\n </Button>\n {isOpen ? (\n <div className={cn('relative', contentClassName)}>\n <span\n className=\"absolute left-0 top-0 bottom-0 border-l border-[#0E2F3F]/30 dark:border-white/40\"\n aria-hidden\n />\n {children}\n </div>\n ) : null}\n </section>\n );\n};\n","import type { PermitStatus } from '@/hooks/permits/index.js';\nimport { ValidationUtils, type Permit } from '@cofhe/sdk/permits';\nimport type { FC, ReactNode } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nconst statusStyles: Record<PermitStatus, string> = {\n active: 'bg-[#01D082] text-[#0D3547] border border-[#068571]',\n valid: 'bg-[#247AFF] text-white border border-[#247AFF]',\n expired: 'bg-[#F0784F] text-[#4A1004] border border-[#A1421F]',\n};\n\nconst statusToLabel: Record<PermitStatus, string> = {\n active: 'Active',\n valid: 'Valid',\n expired: 'Expired',\n};\n\ninterface PermitItemProps {\n permit: Permit;\n hash: string;\n activePermitHash?: string;\n onSelect?: (id: string) => void;\n}\n\nexport const PermitItem: FC<PermitItemProps> = ({ permit, onSelect, hash, activePermitHash }) => {\n const status: PermitStatus = ValidationUtils.isExpired(permit)\n ? 'expired'\n : hash === activePermitHash\n ? 'active'\n : 'valid';\n\n return (\n <Button\n variant=\"ghost\"\n className=\"flex flex-row w-full items-centera !justify-start gap-3 p-0.5\"\n onClick={() => onSelect?.(hash)}\n >\n <span\n className={cn(\n 'inline-flex items-center justify-center px-1 py-1 text-sm font-semibold h-6 w-24',\n statusStyles[status]\n )}\n >\n {statusToLabel[status]}\n </span>\n {permit.name}\n </Button>\n );\n};\n","import { FaCircleInfo } from 'react-icons/fa6';\n\nexport const InfoModalButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n return (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className=\"inline-flex self-center\"\n >\n <FaCircleInfo />\n </button>\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport { usePermitDetailsPage } from '@/hooks/permits/index.js';\nimport { zeroAddress } from 'viem';\nimport { cn, formatExpirationLabel, truncateAddress } from '@/utils';\nimport { useCopyFeedback } from '@/hooks/useCopyFeedback';\nimport { PermitUtils, type Permit, type PermitType } from '@cofhe/sdk/permits';\nimport { PermitStripedBackground } from '@/components/StripedBackground';\nimport { useCofheActivePermitHash } from '@/hooks/useCofhePermits';\nimport { useMemo } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst CopyButton: React.FC<{ hash: string }> = ({ hash }) => {\n const { copiedKeys, copyWithFeedback } = useCopyFeedback();\n\n return (\n <button type=\"button\" onClick={() => copyWithFeedback(hash, hash)}>\n {copiedKeys.has(hash) ? <FaCheck /> : <FaRegCopy />}\n </button>\n );\n};\n\nexport const BasePermitCard: React.FC<{ permit: Permit; className?: string; header?: React.ReactNode }> = ({\n permit,\n className,\n header,\n}) => {\n const activePermitHash = useCofheActivePermitHash();\n const expirationInfo = formatExpirationLabel(permit.expiration);\n\n const metadataTags = useMemo(() => {\n const isActivePermit = PermitUtils.getHash(permit) === activePermitHash;\n const tags: string[] = [];\n if (expirationInfo.expired) tags.push('expired');\n if (expirationInfo.expiringSoon) tags.push('expiring soon');\n if (isActivePermit) tags.push('active');\n return tags;\n }, [expirationInfo.expired, expirationInfo.expiringSoon, activePermitHash, permit]);\n\n return (\n <div\n className={cn(\n 'relative gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n <PermitStripedBackground\n variant={expirationInfo.expired ? 'error' : expirationInfo.expiringSoon ? 'warning' : permit.type}\n className=\"absolute inset-0 z-[1]\"\n />\n <div className=\"relative z-[2] flex flex-1 flex-col gap-3\">\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left\">\n <b>-- {PermitTypeLabel[permit.type].toUpperCase()} PERMIT --</b>\n <br />\n Name: <b>{permit.name}</b>\n <br />\n Issuer: <b>{truncateAddress(permit.issuer, 6, 6)}</b> <CopyButton hash={permit.issuer} />\n <br />\n Expiration:{' '}\n <b>\n {permit.expiration} <i>({expirationInfo.label})</i>\n </b>\n <br />\n {permit.recipient != null && permit.recipient !== zeroAddress && (\n <>\n Recipient: <b>{truncateAddress(permit.recipient, 6, 6)}</b> <CopyButton hash={permit.recipient} />\n <br />\n </>\n )}\n {permit.validatorContract != null && permit.validatorContract !== zeroAddress && (\n <>\n Validator:\n <br />\n {' '}Contract: <b>{truncateAddress(permit.validatorContract, 6, 6)}</b>{' '}\n <CopyButton hash={permit.validatorContract} />\n <br />\n {' '}ID: <b>{permit.validatorId}</b>\n <br />\n </>\n )}\n {metadataTags.length > 0 && <br />}\n {metadataTags.map((tag) => (\n <b key={tag}>\n -- {tag.toUpperCase()} --\n <br />\n </b>\n ))}\n </pre>\n </div>\n </div>\n );\n};\n\nexport const PermitCard: React.FC<{ hash: string; className?: string; header?: React.ReactNode }> = ({\n hash,\n className,\n header,\n}) => {\n const { permit } = usePermitDetailsPage(hash);\n\n if (permit == null) {\n return (\n <div\n className={cn(\n 'gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n {header}\n <div className=\"flex flex-col size-3\"></div>\n <pre className=\"whitespace-pre-wrap break-words text-left italic p-10\">Permit not found.</pre>\n </div>\n );\n }\n\n return <BasePermitCard permit={permit} className={className} header={header} />;\n};\n","import { cn } from '@/utils/cn';\nimport { type CSSProperties, useMemo } from 'react';\n\ntype StripeProps = {\n /** CSS color for stripes: \"#f00\", \"rgb(...)\", \"hsl(...)\", \"currentColor\", etc. Use \"currentColor\" with Tailwind text color classes. */\n stripeColor?: string;\n /** Background/base color behind the stripes */\n baseColor?: string;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport function StripedBackground({\n stripeColor = 'rgba(255,255,255,0.18)',\n baseColor = 'transparent',\n className,\n style,\n children,\n}: StripeProps) {\n const bgImage = useMemo(() => {\n // 2px stripe, 2px gap, repeating at 45 degrees (positive diagonal)\n return `repeating-linear-gradient(\n 45deg,\n ${stripeColor} 0px,\n ${stripeColor} 2px,\n transparent 2px,\n transparent 4px\n )`;\n }, [stripeColor]);\n\n const mergedStyle: CSSProperties = {\n backgroundColor: baseColor,\n backgroundImage: bgImage,\n ...style,\n };\n\n return (\n <div className={className} style={mergedStyle}>\n {children}\n </div>\n );\n}\n\ntype PermitStripedProps = {\n variant: 'self' | 'sharing' | 'recipient' | 'error' | 'warning';\n className?: string;\n children?: React.ReactNode;\n};\n\nconst PermitStripedVariantColors: Record<PermitStripedProps['variant'], string> = {\n self: 'text-blue-500',\n sharing: 'text-green-500',\n recipient: 'text-purple-500',\n error: 'text-red-500',\n warning: 'text-yellow-500',\n};\n\nconst PermitStripedVariantOpacities: Record<PermitStripedProps['variant'], string> = {\n self: 'opacity-15',\n sharing: 'opacity-15',\n recipient: 'opacity-15',\n error: 'opacity-30',\n warning: 'opacity-30',\n};\n\nexport const PermitStripedBackground = ({ variant, className, children }: PermitStripedProps) => {\n const color = PermitStripedVariantColors[variant];\n const opacity = PermitStripedVariantOpacities[variant];\n return (\n <StripedBackground stripeColor=\"currentColor\" className={cn(color, opacity, className)}>\n {children}\n </StripedBackground>\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport type { GeneratePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nexport const GeneratePermitPage: React.FC<GeneratePermitPageProps> = ({ onSuccessNavigateTo, onCancel, onBack }) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n error,\n nameError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: false,\n onSuccess: () => {\n // TODO: also add toast here in any case\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Create Self-usage Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form creates a \"SELF\" permit, which only grants access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitIcon = (props: SVGProps<SVGSVGElement>) => <svg width={19} height={22} viewBox=\"0 0 19 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16 19V21.97H14V19H11V17H14V14H16V17H19V19H16ZM18 10C18 10.9 17.9 11.78 17.71 12.65C17.13 12.35 16.5 12.15 15.81 12.05C15.93 11.45 16 10.83 16 10.22V5.3L9 2.18L2 5.3V10.22C2 14.54 5.25 19 9 20L9.31 19.91C9.5 20.53 9.83 21.11 10.22 21.62L9 22C3.84 20.74 0 15.55 0 10V4L9 0L18 4V10Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitIcon;","export type NameSectionProps = {\n permitName: string;\n error?: string | null;\n onNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const NameSection: React.FC<NameSectionProps> = ({ permitName, error, onNameChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Name:</span>\n </div>\n <input\n id=\"permit-name\"\n type=\"text\"\n placeholder=\"Human readable name\"\n value={permitName}\n onChange={onNameChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Permit name\"\n />\n {error && (\n <p role=\"alert\" className=\"px-4 pt-1 text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {error}\n </p>\n )}\n </div>\n);\n","import { Button } from '@/components/FnxFloatingButton/components';\n\nexport const ExpirySection = <U extends string>({\n presets,\n units,\n durationSeconds,\n customCount,\n customUnit,\n selectPreset,\n setCustomUnit,\n applyCustom,\n}: {\n presets: ReadonlyArray<{ label: string; seconds: number }>;\n units: ReadonlyArray<U>;\n durationSeconds: number;\n customCount: number | '';\n customUnit: U;\n selectPreset: (seconds: number) => void;\n setCustomUnit: (u: U) => void;\n applyCustom: (count: number | '', unit: U) => void;\n}) => (\n <div className=\"flex flex-col w-full gap-2\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Expiration:</span>\n </div>\n <div className=\"grid grid-cols-3 gap-3\">\n {presets.map((option) => {\n const isActive = durationSeconds === option.seconds;\n return (\n <Button\n key={option.label}\n variant={isActive ? 'primary' : 'default'}\n onClick={() => selectPreset(option.seconds)}\n label={option.label}\n />\n );\n })}\n </div>\n\n {/* TODO: Re-enable custom duration input */}\n {/* <p className=\"text-base font-semibold text-[#0E2F3F] dark:text-white\">- or -</p>\n <div className=\"flex flex-row w-full items-center gap-3\">\n <div className=\"flex-1\">\n <input\n id=\"custom-duration-count\"\n type=\"number\"\n min={1}\n placeholder=\"#\"\n value={customCount}\n onChange={(e) => {\n const raw = e.target.value;\n const v = raw === '' ? '' : Math.max(1, Number(raw));\n applyCustom(v, customUnit);\n }}\n className=\"border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Custom duration count\"\n />\n </div>\n <div className=\"flex items-center gap-2 rounded-xl border border-[#0E2F3F]/40 px-3 py-2 text-base font-semibold text-[#0E2F3F] dark:border-white/40 dark:text-white\">\n <div className=\"flex-1\">\n <label htmlFor=\"custom-duration-unit\" className=\"sr-only\">\n Custom duration unit\n </label>\n </div>\n <select\n id=\"custom-duration-unit\"\n value={customUnit}\n onChange={(e) => setCustomUnit(e.target.value as U)}\n className=\"bg-transparent outline-none appearance-none pr-5\"\n aria-label=\"Custom duration unit\"\n >\n {units.map((u) => (\n <option key={u as string} value={u as string} className=\"text-[#0E2F3F]\">\n {u}\n </option>\n ))}\n </select>\n </div>\n </div> */}\n </div>\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ReceiverSection } from '../components/ReceiverSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport type { DelegatePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nexport const DelegatePermitPage: React.FC<DelegatePermitPageProps> = ({ onSuccessNavigateTo, onCancel, onBack }) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: true,\n onSuccess: () => {\n // TODO: also add toast here in any case\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n description: 'Copy and share data with recipient',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Delegate Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form generates a permit that can be copied and shared with \"recipient\". Recipient will be granted\n access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n <ReceiverSection receiver={receiver} receiverError={receiverError} onReceiverChange={handleReceiverChange} />\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","export type ReceiverSectionProps = {\n receiver: string;\n receiverError?: string | null;\n onReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const ReceiverSection: React.FC<ReceiverSectionProps> = ({ receiver, receiverError, onReceiverChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Receiver:</span>\n </div>\n <input\n id=\"receiver-address\"\n type=\"text\"\n placeholder=\"Receiver address (0x...)\"\n value={receiver}\n onChange={onReceiverChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Receiver address\"\n />\n {receiverError && (\n <p role=\"alert\" className=\"text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {receiverError}\n </p>\n )}\n </div>\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport PermitReceiveIcon from '@/assets/fhenix-permit-receive.svg';\nimport { useReceivePermit } from '@/hooks/permits/index.js';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components/Button.js';\nimport { BasePermitCard } from '@/components/FnxFloatingButton/components/PermitCard.js';\n\nexport const ImportPermitPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const {\n importedPermit,\n permitData,\n setPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n } = useReceivePermit(() => navigateBack());\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Import permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitReceiveIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE import permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n This form importes a permit that has been shared with you.\n <br />\n Paste the permit data into the input below to import it.\n </p>\n\n {importedPermit == null && (\n <textarea\n id=\"fnx-permit-data\"\n rows={8}\n placeholder=\"Paste permit data\"\n className=\"w-full border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitData}\n onChange={(e) => setPermitData(e.target.value)}\n />\n )}\n\n {importedPermit != null && (\n <>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"fnx-permit-name\">\n Imported Permit:\n </label>\n <BasePermitCard permit={importedPermit} />\n </div>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"fnx-permit-name\">\n Name override:\n </label>\n <input\n id=\"fnx-permit-name\"\n type=\"text\"\n placeholder={importedPermit.name ?? 'Permit name...'}\n className=\"w-full rounded-xl border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitName}\n onChange={(e) => setPermitName(e.target.value)}\n />\n </div>\n </>\n )}\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {errorMsg && <div className=\"text-red-600 text-sm\">{errorMsg}</div>}\n {successMsg && <div className=\"text-green-600 text-sm\">{successMsg}</div>}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button variant=\"default\" onClick={navigateBack}>\n Cancel\n </Button>\n <Button variant=\"primary\" disabled={isSubmitting} onClick={submit}>\n {isSubmitting ? 'Importing...' : 'Import Permit'}\n </Button>\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitReceive = (props: SVGProps<SVGSVGElement>) => <svg width={21} height={21} viewBox=\"0 0 21 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M8 12C9.1 12 10 12.89 10 14C10 15.11 9.11 16 8 16C6.89 16 6 15.11 6 14C6 12.89 6.9 12 8 12ZM16 0C13.24 0 11 2.24 11 5V7H2C0.9 7 0 7.9 0 9V19C0 20.1 0.9 21 2 21H14C15.1 21 16 20.1 16 19V9C16 7.9 15.1 7 14 7H13V5C13 3.34 14.34 2 16 2C17.66 2 19 3.34 19 5V7H21V5C21 2.24 18.76 0 16 0ZM14 9V19H2V9H14Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitReceive;","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { usePermitDetailsPage } from '@/hooks/permits/index.js';\nimport type { PermitDetailsPageProps } from './types';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\n\nexport const PermitDetailsPage: React.FC<PermitDetailsPageProps> = ({ selectedPermitHash }) => {\n const {\n permitLabel,\n permitJson,\n expirationInfo,\n expirationDate,\n handleBack,\n handleCopy,\n handleViewAs,\n hasSelection,\n isCopyComplete,\n isActivePermit,\n isShareablePermit,\n } = usePermitDetailsPage(selectedPermitHash);\n\n if (!hasSelection) {\n return (\n <div className=\"fnx-text-primary text-sm\">\n <div className=\"rounded-2xl border border-[#154054] bg-white p-5 text-center shadow-[0_25px_60px_rgba(13,53,71,0.15)] dark:border-[#2C6D80] dark:bg-[#1F1F1F]\">\n <p className=\"text-base font-semibold text-[#0E2F3F] dark:text-white\">No permit selected</p>\n <p className=\"mt-1 text-sm text-[#0E2F3F]/70 dark:text-white/70\">\n Choose a permit from the list to view its details.\n </p>\n <button\n type=\"button\"\n className=\"mt-4 inline-flex items-center justify-center gap-2 rounded-lg border border-[#0E2F3F] px-4 py-2 text-sm font-semibold text-[#0E2F3F] transition-colors hover:bg-[#0E2F3F]/10 dark:border-white/70 dark:text-white dark:hover:bg-white/10\"\n onClick={handleBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Back to permits</span>\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={handleBack}\n type=\"button\"\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>{permitLabel ?? 'Permit details'}</span>\n </button>\n }\n content={\n <div className=\"rounded-2xl border border-[#154054] bg-white p-5 shadow-[0_25px_60px_rgba(13,53,71,0.15)] transition-colors dark:border-[#2C6D80] dark:bg-[#1F1F1F]\">\n <div className=\"space-y-5\">\n <div>\n <div className=\"flex items-center justify-between text-sm font-semibold text-[#0E2F3F] dark:text-white\">\n <span>Permit data</span>\n {isShareablePermit ? (\n <button\n type=\"button\"\n className=\"rounded-md border border-[#0E2F3F]/30 p-1.5 text-[#0E2F3F] transition-colors hover:bg-[#0E2F3F]/10 dark:border-white/30 dark:text-white dark:hover:bg-white/10\"\n onClick={handleCopy}\n aria-label={isCopyComplete ? 'Copied permit data' : 'Copy permit data'}\n title={isCopyComplete ? 'Copied permit data' : 'Copy permit data'}\n >\n {isCopyComplete ? (\n <CheckIcon fontSize=\"small\" color=\"success\" />\n ) : (\n <ContentCopyIcon fontSize=\"small\" />\n )}\n </button>\n ) : null}\n </div>\n <div className=\"mt-3 rounded-xl border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80\">\n <pre className=\"max-h-60 whitespace-pre-wrap break-words text-left\">{permitJson}</pre>\n </div>\n </div>\n\n <div className=\"rounded-xl border border-[#0E2F3F]/15 bg-[#EEF6F8] p-4 dark:border-white/10 dark:bg-[#102027]\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-[#0E2F3F]/70 dark:text-white/70\">\n Expiring in\n </p>\n <p\n className={`mt-1 text-2xl font-semibold ${\n expirationInfo.expired ? 'text-[#D14324]' : 'text-[#0E2F3F] dark:text-white'\n }`}\n >\n {expirationInfo.label}\n </p>\n {expirationDate ? (\n <p className=\"mt-1 text-xs text-[#0E2F3F]/70 dark:text-white/70\">\n {expirationInfo.expired ? 'Expired on' : 'Expires on'} {expirationDate}\n </p>\n ) : null}\n </div>\n </div>\n </div>\n }\n footer={\n <button\n type=\"button\"\n className=\"w-full rounded-xl border border-[#68D8EB] bg-[#A8F3FB] px-4 py-3 text-base font-semibold text-[#00314E] transition-colors hover:bg-[#90edf7] disabled:cursor-not-allowed disabled:opacity-60 dark:border-[#1F6B7D] dark:bg-[#114C5A] dark:text-white dark:hover:bg-[#0f3f4b]\"\n onClick={handleViewAs}\n disabled={isActivePermit}\n >\n {isActivePermit ? 'Active permit' : 'View as'}\n </button>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { AddressButton } from '../components/AddressButton';\nimport { CofheTokenConfidentialBalance } from '../components/CofheTokenConfidentialBalance';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer';\n\ntype TokenInfoPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.TokenInfo]: TokenInfoPageProps;\n }\n}\n\nexport const TokenInfoPage: React.FC<TokenInfoPageProps> = ({ token }) => {\n const { navigateBack } = usePortalNavigation();\n\n return (\n <PageContainer\n header={\n <button onClick={navigateBack} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">{token.name}</p>\n </button>\n }\n content={\n <>\n {/* Token Icon and Name */}\n <div className=\"flex flex-col items-center gap-3\">\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"xl\" />\n <div className=\"flex flex-col items-center gap-1\">\n <h2 className=\"text-xl font-bold\">{token.name}</h2>\n <p className=\"text-sm opacity-70\">{token.symbol}</p>\n </div>\n </div>\n\n {/* Balance Section */}\n <div className=\"fnx-card-bg rounded-lg p-4 border fnx-card-border\">\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xs opacity-70\">Balance</p>\n <CofheTokenConfidentialBalance token={token} size=\"xl\" decimalPrecision={5} className=\"font-bold\" />\n </div>\n </div>\n\n {/* Token Details */}\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-medium\">Token Details</h3>\n\n {/* Address */}\n <div className=\"fnx-card-bg rounded-lg p-3 border fnx-card-border\">\n <div className=\"flex flex-col gap-2\">\n <p className=\"text-xxxs opacity-70\">Contract Address</p>\n <AddressButton address={token.address} className=\"w-full justify-start\" />\n </div>\n </div>\n\n {/* Decimals */}\n <div className=\"fnx-card-bg rounded-lg p-3 border fnx-card-border\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xxxs opacity-70\">Decimals</p>\n <p className=\"text-sm font-medium\">{token.decimals}</p>\n </div>\n </div>\n\n {/* Confidentiality Type */}\n {token && (\n <div className=\"fnx-card-bg rounded-lg p-3 border fnx-card-border\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xxxs opacity-70\">Confidentiality Type</p>\n <p className=\"text-sm font-medium capitalize\">{token.extensions.fhenix.confidentialityType}</p>\n </div>\n </div>\n )}\n\n {/* Confidential Value Type */}\n {token && (\n <div className=\"fnx-card-bg rounded-lg p-3 border fnx-card-border\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-xxxs opacity-70\">Value Type</p>\n <p className=\"text-sm font-medium\">{token.extensions.fhenix.confidentialValueType}</p>\n </div>\n </div>\n )}\n </div>\n </>\n }\n />\n );\n};\n","import { useState, useMemo } from 'react';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { isAddress, maxUint128 } from 'viem';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheTokenTransfer } from '@/hooks/useCofheTokenTransfer';\nimport { cn } from '../../../utils/cn';\nimport { truncateAddress, sanitizeNumericInput } from '../../../utils/utils';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { unitToWei } from '@/utils/format';\nimport { assert } from 'ts-essentials';\nimport { CofheTokenConfidentialBalance } from '../components';\nimport { type Token } from '@/hooks';\nimport { getStepConfig } from '@/hooks/useCofheEncrypt';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer';\n\nexport type SendPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Send]: SendPageProps;\n }\n}\n\nexport const SendPage: React.FC<SendPageProps> = ({ token }) => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n\n const account = useCofheAccount();\n const {\n encryptAmountAndSendToken,\n data: txHash,\n isPending: isEncryptingOrSendingTx,\n write: { isPending: isSending },\n encryption: {\n stepsState: { lastStep },\n isEncrypting: isEncryptingInput,\n },\n } = useCofheTokenTransfer({\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to send tokens';\n setError(errorMessage);\n console.error('Send tx submit error:', error);\n },\n onMutate: () => {\n setError(null);\n setSuccess(null);\n },\n onSuccess: (hash) => {\n setSuccess(`Transaction sent! Hash: ${truncateAddress(hash)}. Is being mined...`);\n setAmount('');\n setRecipientAddress('');\n },\n });\n\n useOnceTransactionMined({\n txHash,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setSuccess(`Transaction confirmed! Hash: ${truncateAddress(transaction.hash)}`);\n } else if (transaction.status === 'failed') {\n setError(`Transaction failed! Hash: ${truncateAddress(transaction.hash)}`);\n }\n },\n });\n\n const { data: { unit: confidentialUnitBalance } = {} } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: account,\n });\n\n const encryptionProgressLabel = useMemo(() => lastStep?.step && getStepConfig(lastStep).label, [lastStep]);\n\n const [amount, setAmount] = useState('');\n const [recipientAddress, setRecipientAddress] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // Validate recipient address\n const isValidAddress = isAddress(recipientAddress);\n\n // Validate amount\n const isValidAmount = (amount.length > 0 && confidentialUnitBalance && confidentialUnitBalance.gte(amount)) ?? false;\n\n const handleSend = async () => {\n assert(isAddress(recipientAddress), 'Recipient address is not valid');\n\n // Check if amount exceeds uint128 max value (2^128 - 1)\n // Convert amount to token's smallest unit (considering decimals)\n const amountWei = unitToWei(amount, token.decimals);\n // TODO: Does this need to be different if the confidential token uses euint64 for the balance precision?\n assert(amountWei <= maxUint128, 'Amount exceeds maximum supported value (uint128 max)');\n assert(account, 'Sender account is required');\n\n // Use the token transfer hook to send encrypted tokens\n await encryptAmountAndSendToken({\n input: {\n token,\n to: recipientAddress,\n amount: amountWei,\n userAddress: account,\n },\n });\n };\n\n const handleMaxAmount = () => {\n // Calculate available balance for MAX button\n if (confidentialUnitBalance) setAmount(confidentialUnitBalance.toFixed());\n };\n\n return (\n <PageContainer\n header={\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shielded Transfer</p>\n </button>\n }\n content={\n <>\n {/* Asset Section */}\n <div className=\"fnx-card-bg p-2 border fnx-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Asset to be sent</label>\n </div>\n <div className=\"flex items-center gap-3\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"md\" />\n\n {/* Amount Input and Symbol on same line, centered with logo */}\n <div className=\"flex-1 flex items-center gap-1 min-w-0\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => {\n setAmount(sanitizeNumericInput(e.target.value));\n }}\n placeholder=\"0.00\"\n className=\"flex-1 min-w-0 bg-transparent text-2xl font-bold fnx-text-primary outline-none placeholder:opacity-50\"\n />\n <button\n onClick={() => {\n // navigateToTokenListForSelection()\n navigateTo(FloatingButtonPage.TokenList, {\n pageProps: {\n mode: 'select',\n title: 'Select token to transfer',\n backToPageState: { page: FloatingButtonPage.Send },\n },\n });\n }}\n className=\"flex items-center gap-1 text-2xl font-bold fnx-text-primary hover:opacity-80 transition-opacity whitespace-nowrap flex-shrink-0\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60 flex-shrink-0\" />\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-3 -mt-1 text-xs opacity-70\">\n {/* Invisible placeholder to align with icon above */}\n <div className=\"w-10 flex-shrink-0\" />\n\n {/* Available text and MAX button */}\n <div className=\"flex-1 flex items-center justify-start min-w-0 gap-2\">\n <span className=\"text-xs opacity-70\">Available </span>\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={true}\n size=\"sm\"\n decimalPrecision={5}\n className=\"text-xs opacity-70 font-medium\"\n />\n <button\n onClick={handleMaxAmount}\n className=\"fnx-max-button text-xxxs ml-1 font-medium px-0.5 py-0.2 rounded\"\n >\n MAX\n </button>\n </div>\n </div>\n </div>\n\n {/* Down Arrow */}\n <div className=\"flex justify-center\">\n <div className=\"w-8 h-8 rounded-full fnx-icon-bg flex items-center justify-center\">\n <span className=\"text-lg\">↓</span>\n </div>\n </div>\n\n {/* Recipient Address */}\n <div className=\"fnx-card-bg p-4 border fnx-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Recipient Address:</label>\n </div>\n <input\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"0x...\"\n className={cn(\n 'w-full bg-transparent fnx-text-primary outline-none border-b pb-2 px-2',\n 'placeholder:opacity-50',\n isValidAddress ? 'border-green-500' : recipientAddress ? 'border-red-500' : 'fnx-card-border'\n )}\n />\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-3\">\n <p className=\"text-sm text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Success Message */}\n {success && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-3\">\n <p className=\"text-sm text-green-800 dark:text-green-200\">{success}</p>\n </div>\n )}\n\n {/* Encryption Status */}\n {isEncryptingOrSendingTx && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-3\">\n <p className=\"text-sm text-blue-800 dark:text-blue-200\">\n {isEncryptingInput ? encryptionProgressLabel || 'Encrypting amount...' : 'Sending transaction...'}\n </p>\n </div>\n )}\n </>\n }\n footer={\n <button\n onClick={handleSend}\n disabled={!isValidAddress || !isValidAmount || isSending || isEncryptingInput}\n className={cn(\n 'fnx-send-button w-full py-3 px-4 font-small',\n 'flex items-center justify-center gap-2',\n isValidAddress && isValidAmount && !isSending && !isEncryptingInput\n ? 'fnx-send-button-enabled'\n : 'fnx-send-button-disabled'\n )}\n >\n <span>Send</span>\n <span className=\"text-lg\">↗</span>\n </button>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { TbShieldPlus, TbShieldMinus } from 'react-icons/tb';\nimport { useState } from 'react';\nimport { parseUnits } from 'viem';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { useCofheTokenShield } from '@/hooks/useCofheTokenShield';\nimport { cn } from '../../../utils/cn';\nimport { truncateHash } from '../../../utils/utils';\nimport { ActionButton, AmountInput, CofheTokenConfidentialBalance, TokenIcon } from '../components/index';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { formatTokenAmount, unitToWei } from '@/utils/format';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useCofheTokenClaimUnshielded, useCofheTokenUnshield, useCofheTokenClaimable, useOnceDecrypted } from '@/hooks';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { useReschedulableTimeout } from '@/hooks/useReschedulableTimeout';\nimport { assert } from 'ts-essentials';\nimport type { BigNumber } from 'bignumber.js';\nimport { usePortalNavigation } from '@/stores';\nimport { CofheTokenPublicBalance } from '../components/CofheTokenConfidentialBalance';\nimport { useIsUnshieldingMining } from '@/hooks/useIsUnshieldingMining';\nimport { PageContainer } from '../components/PageContainer';\n\nconst AUTOCLEAR_TX_STATUS_TIMEOUT = 5000;\nconst DISPLAY_DECIMALS = 5;\n\ntype Mode = 'shield' | 'unshield';\n\nexport type ShieldPageProps = {\n token: Token;\n defaultMode?: Mode;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Shield]: ShieldPageProps;\n }\n}\n\nfunction useLifecycleStore() {\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<{ message: string; type: 'info' | 'success' } | null>(null);\n return {\n error,\n setError,\n status,\n setStatus,\n };\n}\n\n// Reusable hook to safely auto-clear a status message after a delay\n// (moved) useReschedulableTimeout is now in '@/hooks/useReschedulableTimeout'\n\nfunction useClaimUnshieldedWithLifecycle() {\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const claimUnshield = useCofheTokenClaimUnshielded({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing claim transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: `Claim transaction sent! Hash: ${truncateHash(hash)}. Waiting for confirmation...`,\n type: 'info',\n });\n },\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to claim unshielded tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Claim tx submit error:', error);\n },\n });\n\n const { isMining: isClaimingMining } = useOnceTransactionMined({\n txHash: claimUnshield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: `Claim transaction confirmed! Hash: ${truncateHash(transaction.hash)}`,\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(`Claim transaction failed! Hash: ${truncateHash(transaction.hash)}`);\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n return {\n claimUnshield,\n isClaimingMining,\n error,\n status,\n };\n}\n\ntype ShieldAndUnshieldViewProps = Omit<ShieldPageViewProps, 'token' | 'mode' | 'setMode'>;\n\nfunction useShieldWithLifecycle(token: Token): ShieldAndUnshieldViewProps {\n const account = useCofheAccount();\n const [shieldAmount, setShieldAmount] = useState('');\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const tokenShield = useCofheTokenShield({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing shielding transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: `Shield transaction sent! Hash: ${truncateHash(hash)}. Waiting for confirmation...`,\n type: 'info',\n });\n setShieldAmount('');\n },\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to shield tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Shield tx submit error:', error);\n },\n });\n const { isMining: isTokenShieldMining } = useOnceTransactionMined({\n txHash: tokenShield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: `Shield transaction confirmed! Hash: ${truncateHash(transaction.hash)}`,\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(`Shield transaction failed! Hash: ${truncateHash(transaction.hash)}`);\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n const handleShield = async () => {\n const amountWei = unitToWei(shieldAmount, token.decimals);\n await tokenShield.mutateAsync({\n token,\n amount: amountWei,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: publicBalanceUnit } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance({\n token,\n accountAddress: account,\n });\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n\n const handleShieldMax = () => {\n if (publicBalanceUnit) setShieldAmount(publicBalanceUnit.toFixed());\n };\n\n const isValidShieldAmount = (shieldAmount.length > 0 && publicBalanceUnit?.gte(shieldAmount)) ?? false;\n\n return {\n status,\n error,\n isProcessing: tokenShield.isPending || isTokenShieldMining,\n inputAmount: shieldAmount,\n setInputAmount: setShieldAmount,\n onMaxClick: handleShieldMax,\n isValidAmount: isValidShieldAmount,\n sourceSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n destSymbol: token.symbol,\n sourceLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n destLogoURI: token.logoURI,\n handlePrimaryAction: handleShield,\n primaryLabel: 'Shield',\n primaryIcon: <TbShieldPlus className=\"w-3 h-3\" />,\n };\n}\n\nfunction useUnshieldWithLifecycle(token: Token): ShieldAndUnshieldViewProps {\n const account = useCofheAccount();\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const [unshieldAmount, setUnshieldAmount] = useState('');\n const tokenUnshield = useCofheTokenUnshield({\n onUserSignatureRequest: (hash) => {\n () => {\n setError(null);\n setStatus({ message: 'Preparing unshielding transaction...', type: 'info' });\n };\n },\n onTransactionSubmitSuccess: (hash) => {\n setStatus({\n message: `Unshield transaction sent! Hash: ${truncateHash(hash)}. Waiting for confirmation...`,\n type: 'info',\n });\n setUnshieldAmount('');\n },\n onTransactionSubmitError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to unshield tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Unshield tx submit error:', error);\n },\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: `Unshield transaction confirmed! Hash: ${truncateHash(transaction.hash)}. Now waiting for decryption...`,\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(`Unshield transaction failed! Hash: ${truncateHash(transaction.hash)}`);\n setStatus(null);\n }\n },\n onceDecrypted: () => {\n setStatus({ message: 'Unshield decryption completed!', type: 'success' });\n scheduleStatusClear();\n },\n });\n const handleUnshield = async () => {\n const amountInSmallestUnit = parseUnits(unshieldAmount, token.decimals);\n tokenUnshield.mutateAsync({\n token,\n amount: amountInSmallestUnit,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n const handleUnshieldMax = () => {\n if (confidentialBalanceUnit) setUnshieldAmount(confidentialBalanceUnit.toFixed());\n };\n const isValidUnshieldAmount = (unshieldAmount.length > 0 && confidentialBalanceUnit?.gte(unshieldAmount)) ?? false;\n\n return {\n status,\n error,\n isProcessing: tokenUnshield.isPending || tokenUnshield.isTokenUnshieldMining || tokenUnshield.isPendingDecryption,\n inputAmount: unshieldAmount,\n setInputAmount: setUnshieldAmount,\n onMaxClick: handleUnshieldMax,\n isValidAmount: isValidUnshieldAmount ?? false,\n sourceSymbol: token.symbol,\n destSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n sourceLogoURI: token.logoURI,\n destLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n handlePrimaryAction: handleUnshield,\n primaryLabel: 'Unshield',\n primaryIcon: <TbShieldMinus className=\"w-3 h-3\" />,\n };\n}\n\nconst shieldableTypes = new Set(['dual', 'wrapped']);\n\nexport const ShieldPageV2: React.FC<ShieldPageProps> = ({ token, defaultMode }) => {\n const [mode, setMode] = useState<Mode>(defaultMode ?? 'shield');\n\n return mode === 'shield' ? (\n <ShieldTab token={token} mode={mode} setMode={setMode} />\n ) : (\n <UnshieldTab token={token} mode={mode} setMode={setMode} />\n );\n};\n\ntype ShieldPageViewProps = {\n error: string | null;\n token: Token;\n mode: Mode;\n status: { message: string; type: 'info' | 'success' } | null;\n setMode: (mode: Mode) => void;\n\n isProcessing: boolean;\n inputAmount: string;\n setInputAmount: (value: string) => void;\n onMaxClick: () => void;\n isValidAmount: boolean;\n sourceSymbol: string | undefined;\n destSymbol: string | undefined;\n\n sourceLogoURI: string | undefined;\n destLogoURI: string | undefined;\n handlePrimaryAction: () => void;\n primaryLabel: string;\n primaryIcon: React.ReactNode;\n};\n\nfunction ShieldTab({ token, mode, setMode }: { token: Token; mode: Mode; setMode: (mode: Mode) => void }) {\n const shieldViewProps = useShieldWithLifecycle(token);\n return <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} {...shieldViewProps} />;\n}\n\nfunction UnshieldTab({ token, mode, setMode }: { token: Token; mode: Mode; setMode: (mode: Mode) => void }) {\n const unshieldViewProps = useUnshieldWithLifecycle(token);\n return <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} {...unshieldViewProps} />;\n}\n\nfunction ClaimingSection({ token }: { token: Token }) {\n const account = useCofheAccount();\n const {\n data: unshieldedClaims,\n isFetching: isFetchingClaims,\n isWaitingForDecryption: isWaitingForNewClaimsDecryption,\n } = useCofheTokenClaimable({\n token,\n accountAddress: account,\n });\n const {\n claimUnshield,\n error: claimingError,\n status: claimingStatus,\n isClaimingMining,\n } = useClaimUnshieldedWithLifecycle();\n\n const pairedSymbol = token.extensions.fhenix.erc20Pair?.symbol;\n const handleClaim = async () => {\n assert(unshieldedClaims, 'Unshield claims data is required to claim unshielded tokens');\n claimUnshield.mutateAsync({\n token,\n amount: unshieldedClaims.claimableAmount,\n });\n };\n\n const isUnshieldingMining = useIsUnshieldingMining(token);\n\n return (\n <>\n {/* Claim + pending (same logic as ShieldPage) */}\n {unshieldedClaims?.hasClaimable && (\n <ActionButton\n onClick={handleClaim}\n disabled={\n claimUnshield.isPending ||\n isClaimingMining ||\n isFetchingClaims ||\n isWaitingForNewClaimsDecryption ||\n isUnshieldingMining\n }\n label={\n claimUnshield.isPending\n ? 'Claiming...'\n : `Claim ${isFetchingClaims || isWaitingForNewClaimsDecryption ? '...' : formatTokenAmount(unshieldedClaims.claimableAmount, token.decimals, 5).formatted} ${pairedSymbol}`\n }\n className=\"mt-1\"\n />\n )}\n\n {unshieldedClaims?.hasPending && token && !unshieldedClaims.hasClaimable && (\n <p className=\"text-xxs text-yellow-600 dark:text-yellow-400 text-center\">\n Pending: {formatTokenAmount(unshieldedClaims.pendingAmount, token.decimals).formatted} {pairedSymbol}\n </p>\n )}\n <StatusAndError status={claimingStatus} error={claimingError} />\n </>\n );\n}\n\nfunction StatusAndError({\n status,\n error,\n}: {\n status: { message: string; type: 'info' | 'success' } | null;\n error: string | null;\n}) {\n return (\n <>\n {/* Error */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-2\">\n <p className=\"text-xs text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Status */}\n {status && (\n <div\n className={cn(\n 'rounded-lg p-2 border',\n status.type === 'success'\n ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'\n : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n >\n <p\n className={cn(\n 'text-xs',\n status.type === 'success' ? 'text-green-800 dark:text-green-200' : 'text-blue-800 dark:text-blue-200'\n )}\n >\n {status.message}\n </p>\n </div>\n )}\n </>\n );\n}\n\nconst ShieldAndUnshieldPageView: React.FC<ShieldPageViewProps> = ({\n error,\n token,\n mode,\n setMode,\n status,\n\n isProcessing,\n inputAmount,\n setInputAmount,\n onMaxClick,\n isValidAmount,\n sourceSymbol,\n destSymbol,\n\n sourceLogoURI,\n destLogoURI,\n handlePrimaryAction,\n primaryLabel,\n primaryIcon,\n}) => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n const isShieldableToken = shieldableTypes.has(token.extensions.fhenix.confidentialityType);\n\n // TODO: probably can be refactored into a view with more stramlined logic\n return (\n <PageContainer\n header={\n <div className=\"flex items-center justify-between\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shield / Unshield</p>\n </button>\n\n <button\n onClick={() =>\n // navigateToTokenListForSelection(mode === 'shield' ? 'Select token to shield' : 'Select token to unshield')\n navigateTo(FloatingButtonPage.TokenList, {\n pageProps: {\n mode: 'select',\n title: mode === 'shield' ? 'Select token to shield' : 'Select token to unshield',\n backToPageState: { page: FloatingButtonPage.Shield, props: { defaultMode: mode } },\n },\n })\n }\n className=\"flex items-center gap-1 text-sm font-bold fnx-text-primary hover:opacity-80 transition-opacity\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowDownIcon style={{ fontSize: 16 }} className=\"opacity-60\" />\n </button>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {/* Tabs */}\n <div className=\"flex gap-2\">\n <ActionButton\n onClick={() => setMode('shield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'shield'}\n label=\"Shield\"\n />\n <ActionButton\n onClick={() => setMode('unshield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'unshield'}\n label=\"Unshield\"\n />\n </div>\n\n {/* Two-panel layout */}\n <div className=\"space-y-2\">\n {/* Source */}\n <div className=\"fnx-card-bg border fnx-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Asset to be shielded' : 'Asset to be unshielded'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={sourceLogoURI} alt={sourceSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <AmountInput\n value={inputAmount}\n onChange={setInputAmount}\n onMaxClick={onMaxClick}\n className=\"w-28\"\n />\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{sourceSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Available{' '}\n {mode === 'unshield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-center text-xl opacity-80\">↓</div>\n\n {/* Received (read-only) */}\n <div className=\"fnx-card-bg border fnx-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Shielded asset received' : 'Unshielded asset received'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={destLogoURI} alt={destSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <p className=\"text-lg font-bold leading-none\">{inputAmount || '0'}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{destSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Balance\n {mode === 'shield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary action */}\n <ActionButton\n onClick={handlePrimaryAction}\n disabled={!isValidAmount || isProcessing || !isShieldableToken}\n icon={primaryIcon}\n label={primaryLabel}\n className=\"py-2\"\n />\n <StatusAndError status={status} error={error} />\n <ClaimingSection token={token} />\n\n {/* Not Shieldable Token Warning */}\n {!isShieldableToken && (\n <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-2\">\n <p className=\"text-xs text-yellow-800 dark:text-yellow-200\">\n This token does not support shielding/unshielding.\n </p>\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import { TransactionActionType, TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount } from './useCofheConnection';\nimport type { Token } from './useCofheTokenLists';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useCallback } from 'react';\n\nexport function useIsUnshieldingMining(token: Token) {\n const account = useCofheAccount();\n const filter = useCallback(\n (tx: Transaction) => {\n return (\n tx.token.address === token.address &&\n tx.actionType === TransactionActionType.Unshield &&\n tx.status === TransactionStatus.Pending\n );\n },\n [token.address]\n );\n const allPendingTxs = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter,\n });\n\n return allPendingTxs.filteredTxs.length > 0;\n}\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useCofheChainId, useCofheAccount } from '@/hooks/useCofheConnection.js';\nimport { TransactionItem } from '../components/TransactionItem.js';\nimport { usePortalNavigation } from '@/stores';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const ActivityPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs: transactions } = useStoredTransactions({\n chainId,\n account,\n });\n\n return (\n <PageContainer\n header={\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Activity</p>\n </button>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {transactions.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm fnx-text-primary opacity-60\">No transactions found</p>\n </div>\n ) : (\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\n {transactions.map((tx) => (\n <TransactionItem key={tx.hash} transaction={tx} />\n ))}\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { ToastPrimitive, ToastPrimitiveBase } from '../components/ToastPrimitives.js';\nimport { useState } from 'react';\nimport { PortalModal } from '../modals/types';\nimport { usePortalNavigation, usePortalStatuses, usePortalModals, usePortalToasts } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\nimport { useCofheClient } from '@/hooks/useCofheClient.js';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { createWalletClient, http } from 'viem';\nimport { arbitrumSepolia } from 'viem/chains';\nimport { usePortalPersisted } from '@/stores/portalPersisted.js';\n\ntype Tab = 'modal' | 'status' | 'toast' | 'permit';\n\nexport const DebugPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { statuses, addStatus, removeStatus } = usePortalStatuses();\n const { addToast } = usePortalToasts();\n const { openModal } = usePortalModals();\n const [modalSelection, setModalSelection] = useState<string | undefined>(undefined);\n const [activeTab, setActiveTab] = useState<Tab>('modal');\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Back</span>\n </button>\n <div className=\"flex gap-2 border-b\">\n <button onClick={() => setActiveTab('modal')} className={activeTab === 'modal' ? 'font-bold' : ''}>\n Modal\n </button>\n <button onClick={() => setActiveTab('status')} className={activeTab === 'status' ? 'font-bold' : ''}>\n Status\n </button>\n <button onClick={() => setActiveTab('toast')} className={activeTab === 'toast' ? 'font-bold' : ''}>\n Toast\n </button>\n <button onClick={() => setActiveTab('permit')} className={activeTab === 'permit' ? 'font-bold' : ''}>\n Permit\n </button>\n </div>\n </div>\n }\n content={\n <>\n {activeTab === 'modal' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n openModal(PortalModal.ExampleSelection, {\n onSelect: (selection: string) => {\n setModalSelection(selection);\n },\n });\n }}\n >\n Open selection modal: selection: {modalSelection}\n </button>\n <button\n onClick={() => {\n openModal(PortalModal.ExampleInfo);\n }}\n >\n Open info modal\n </button>\n </div>\n )}\n\n {activeTab === 'status' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-warning-status');\n if (isPresent) {\n removeStatus('test-warning-status');\n } else {\n addStatus({\n id: 'test-warning-status',\n variant: 'warning',\n title: 'Warning status',\n description: 'This is a warning status',\n });\n }\n }}\n >\n \"test-warning-status\" (toggle)\n </button>\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-error-status');\n if (isPresent) {\n removeStatus('test-error-status');\n } else {\n addStatus({\n id: 'test-error-status',\n variant: 'error',\n title: 'Error status',\n description: 'This is an error status',\n });\n }\n }}\n >\n \"test-error-status\" (toggle)\n </button>\n <button\n onClick={() => {\n addStatus({\n id: 'test-status-with-action',\n variant: 'warning',\n title: 'Warning status',\n action: {\n label: 'RESOLVE',\n onClick: () => {\n removeStatus('test-status-with-action');\n },\n },\n });\n }}\n >\n \"test-status-with-action\" (open)\n </button>\n </div>\n )}\n\n {activeTab === 'toast' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n addToast(\n <ToastPrimitiveBase>\n <div>Custom content</div>\n </ToastPrimitiveBase>\n );\n }}\n >\n Custom content toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'info',\n title: \"This toast won't go away on its own\",\n description: 'Click the X to dismiss it',\n },\n 'infinite'\n );\n }}\n >\n Non-expiring Toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'warning',\n title: 'Warning toast',\n description: 'Take the action',\n action: {\n label: 'ACTION',\n onClick: () => {\n alert('Action taken');\n },\n },\n },\n 'infinite'\n );\n }}\n >\n Toast with Action\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"info\"\n title=\"Info toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Info Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"success\"\n title=\"Success toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Success Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"error\"\n title=\"Error toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Error Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"warning\"\n title=\"Warning toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Warning Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'info',\n title: 'Info toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Info Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Success toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Success Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Error toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Error Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'warning',\n title: 'Warning toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Warning Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Permit invalid',\n description: 'Unable to decrypt data with this permit',\n action: {\n label: 'OPEN PERMITS',\n onClick: () => {\n alert('open permits');\n },\n },\n });\n }}\n >\n Invalid Permit\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Permit created successfully',\n });\n }}\n >\n Permit created\n </button>\n </div>\n )}\n\n {activeTab === 'permit' && (\n <div className=\"flex flex-col gap-3\">\n <FirstPermitDebug />\n <CreateSelfExpiringPermitButton />\n <CreateAndUseReceivingPermitButton />\n </div>\n )}\n </>\n }\n />\n );\n};\n\nconst FirstPermitDebug = () => {\n const { hasCreatedFirstPermit, setHasCreatedFirstPermit } = usePortalPersisted();\n return (\n <div>\n <p>Has created first permit: {hasCreatedFirstPermit ? '[Y]' : '[N]'}</p>\n <button\n onClick={() => {\n setHasCreatedFirstPermit(false);\n }}\n >\n Reset first permit created flag\n </button>\n </div>\n );\n};\n\nconst CreateSelfExpiringPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const create = async () => {\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n const expiration = Math.floor(Date.now() / 1000) + 2 * 60;\n await cofheClient.permits.createSelf({\n name: `Exp ${expiration}`,\n issuer: account,\n expiration: expiration,\n });\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={create}>Create self permit (expires in 2 minutes)</button>;\n};\n\nconst CreateAndUseReceivingPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const receiveAndUse = async () => {\n const { account, publicClient } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n if (!publicClient) throw new Error('No public client found');\n\n // Create account to create the sharing permit from private key\n const sharingAccount = privateKeyToAccount('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80');\n const sharingWalletClient = createWalletClient({\n chain: publicClient!.chain,\n transport: http(),\n account: sharingAccount,\n });\n\n // Create a sharing permit with account {sharingAccount} and recipient {account}\n const sharedPermit = await cofheClient.permits.createSharing(\n {\n name: 'Sharing permit',\n issuer: sharingAccount.address,\n expiration: Math.floor(Date.now() / 1000) + 120 * 60,\n recipient: account,\n },\n {\n publicClient,\n walletClient: sharingWalletClient,\n }\n );\n\n // Receive shared permit\n await cofheClient.permits.importShared(sharedPermit);\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={receiveAndUse}>Create and use receiving permit</button>;\n};\n","import { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { PageContainer } from '../components/PageContainer';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokens } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { formatTokenAmount } from '@/utils/format';\nimport { useMemo, useState } from 'react';\nimport { useCofheTokenClaimUnshielded } from '@/hooks';\nimport { cn } from '@/utils';\nimport { Button } from '../components';\nimport type { Address } from 'viem';\nimport { assert } from 'ts-essentials';\nexport function ClaimableTokens() {\n // TODO: or show multichain, with switching?\n\n const chainsClaimableTokens = useCofheClaimableTokens();\n const claimableByTokenAddress = chainsClaimableTokens.claimableByTokenAddress;\n const unshieldingInProgressByTokenAddress = chainsClaimableTokens.isUnshieldingInProgressByTokenAddress;\n const waitingByTokenAddress = chainsClaimableTokens.isWaitingForDecryptionByTokenAddress;\n const isClaimingByTokenAddress = chainsClaimableTokens.isClaimingByTokenAddress;\n const { navigateBack } = usePortalNavigation();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const claimMutation = useCofheTokenClaimUnshielded();\n\n const rows = useMemo(() => {\n const byLower = new Map(allTokens.map((t) => [t.address.toLowerCase(), t] as const));\n // TODO: show those that have zero claimable right now but is maybe ongoing unshielding/decryption?\n return Object.entries(claimableByTokenAddress)\n .filter(([_t, amount]) => amount > 0n)\n .map(([tokenAddress, claimableAmount]) => {\n const token = byLower.get(tokenAddress.toLowerCase());\n return token ? { token, claimableAmount } : null;\n })\n .filter((x): x is NonNullable<typeof x> => Boolean(x));\n }, [allTokens, claimableByTokenAddress]);\n\n const handleClaim = async (tokenAddress: string) => {\n const row = rows.find((r) => r.token.address.toLowerCase() === tokenAddress.toLowerCase());\n assert(row, 'token not found for claim');\n\n await claimMutation.mutateAsync({ token: row.token, amount: row.claimableAmount });\n };\n\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-3\">\n <button\n className=\"flex items-center gap-2 text-xl font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n </button>\n <span>Claimable Tokens list</span>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-4 pr-1\">\n {rows.map(({ token, claimableAmount }) => {\n const isDecrypting = waitingByTokenAddress?.[token.address] ?? false;\n const isUnshielding =\n unshieldingInProgressByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n const formatted = formatTokenAmount(claimableAmount, token.decimals, 5).formatted;\n const isClaimingThis = isClaimingByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n\n return (\n <div key={token.address} className=\"grid grid-cols-[1fr,auto,auto] items-center gap-4\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <TokenIcon\n logoURI={token.logoURI}\n alt={token.name}\n size=\"md\"\n className={cn(\n 'w-10 h-10 rounded-full',\n 'fnx-icon-bg',\n 'border border-[var(--fnx-button-default-border)]',\n 'flex items-center justify-center flex-shrink-0 overflow-hidden'\n )}\n />\n <div className=\"min-w-0\">\n <div className=\"text-xl font-semibold fnx-text-primary truncate\">{token.name}</div>\n </div>\n </div>\n\n <div className=\"text-2xl font-semibold fnx-text-primary tabular-nums\">{formatted}</div>\n\n <Button\n type=\"button\"\n onClick={() => handleClaim(token.address)}\n disabled={isUnshielding || isDecrypting || isClaimingThis || claimMutation.isPending}\n >\n {isDecrypting ? 'Decrypting' : isUnshielding ? 'Unshielding' : 'Claim'}\n </Button>\n </div>\n );\n })}\n\n {rows.length === 0 && <div className=\"text-sm opacity-70 fnx-text-primary\">No claimable tokens.</div>}\n </div>\n }\n />\n );\n}\n","import type { FC } from 'react';\nimport {\n ActivityPage,\n GeneratePermitPage,\n MainPage,\n PermitDetailsPage,\n PermitsListPage,\n SendPage,\n SettingsPage,\n TokenInfoPage,\n TokenListPage,\n DebugPage,\n ShieldPageV2,\n DelegatePermitPage,\n ImportPermitPage,\n} from '../pages';\nimport { FloatingButtonPage } from './types';\nimport { ClaimableTokens } from '../pages/ClaimableTokens';\n\nexport const pages: Record<FloatingButtonPage, FC<any>> = {\n [FloatingButtonPage.Main]: MainPage,\n [FloatingButtonPage.Settings]: SettingsPage,\n [FloatingButtonPage.TokenList]: TokenListPage,\n [FloatingButtonPage.TokenInfo]: TokenInfoPage,\n [FloatingButtonPage.Send]: SendPage,\n [FloatingButtonPage.Shield]: ShieldPageV2,\n [FloatingButtonPage.Activity]: ActivityPage,\n [FloatingButtonPage.Permits]: PermitsListPage,\n [FloatingButtonPage.GeneratePermits]: GeneratePermitPage,\n [FloatingButtonPage.DelegatePermits]: DelegatePermitPage,\n [FloatingButtonPage.ReceivePermits]: ImportPermitPage,\n [FloatingButtonPage.PermitDetails]: PermitDetailsPage,\n [FloatingButtonPage.Debug]: DebugPage,\n [FloatingButtonPage.ClaimableTokens]: ClaimableTokens,\n};\n","import { PortalModal, type PortalModalStateMap } from './types';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleSelectionPage: React.FC<PortalModalStateMap[PortalModal.ExampleSelection]> = ({\n onClose,\n onSelect,\n}) => {\n const options = ['1', '2', '3'];\n\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Select an option</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n {options.map((option) => (\n <button\n key={option}\n onClick={() => {\n onSelect(option);\n onClose();\n }}\n >\n Option {option}\n </button>\n ))}\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Close</span>\n </button>\n </div>\n }\n />\n );\n};\n","import CloseIcon from '@mui/icons-material/Close';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleInfoPage: React.FC<PortalModalStateMap[PortalModal.ExampleInfo]> = ({ onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">More info</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n <p>Cofhesdk is complex, so we have created this modal to help you understand.</p>\n <p>\n You probably clicked on a ? button next to some functionality. And in this modal you'll get your information\n or explanation.\n </p>\n <p>This is another paragraph of explanation.</p>\n <p>Now that you're done reading, you can click \"Got It\" at the bottom to close this modal.</p>\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Got It</span>\n </button>\n </div>\n }\n />\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { usePermitDetailsPage } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { useCopyFeedback } from '@/hooks/useCopyFeedback';\nimport { Button } from '../components';\nimport { InfoModalButton } from './InfoModalButton';\nimport { usePortalModals, usePortalToasts } from '@/stores';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { PermitCard } from '../components/PermitCard';\nimport { truncateAddress } from '@/utils';\nimport { useCallback, useState } from 'react';\nimport { useCofheRemovePermit } from '@/hooks';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst NoPermitFoundModal: React.FC<{ onClose: () => void }> = ({ onClose }) => {\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\">\n No permit found\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n <p>No permit found</p>\n </div>\n }\n />\n );\n};\n\nexport const PermitDetailsModal: React.FC<PortalModalStateMap[PortalModal.PermitDetails]> = ({ hash, onClose }) => {\n const { permit, expirationInfo, handleViewAs, isActivePermit, isShareablePermit, handleCopy, isCopyComplete } =\n usePermitDetailsPage(hash);\n const { openModal } = usePortalModals();\n const { addToast } = usePortalToasts();\n const removePermit = useCofheRemovePermit();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const handlePermitSelect = useCallback(() => {\n onClose();\n handleViewAs();\n addToast({\n variant: 'success',\n title: `Permit selected (${permit?.name})`,\n description:\n permit?.type === 'self'\n ? 'Accessing own encrypted data.'\n : `Accessing ${truncateAddress(permit?.issuer, 4, 4)}'s encrypted data.`,\n });\n }, [handleViewAs, onClose, addToast, permit]);\n\n const handlePermitShare = useCallback(() => {\n handleCopy();\n addToast({\n variant: 'success',\n title: 'Permit data copied',\n description: 'Copied data can be sent to recipient.',\n });\n }, [handleCopy, addToast]);\n\n const handlePermitDelete = useCallback(async () => {\n if (!confirmDelete) {\n setConfirmDelete(true);\n return;\n }\n try {\n await removePermit(hash);\n } catch (error) {\n addToast({\n variant: 'error',\n title: 'Failed to delete permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n onClose();\n addToast({\n variant: 'success',\n title: 'Permit deleted',\n });\n }, [confirmDelete, hash, onClose, addToast, removePermit]);\n\n if (permit == null) {\n return <NoPermitFoundModal onClose={onClose} />;\n }\n\n return (\n <PageContainer\n isModal\n header={\n <PermitCard\n hash={hash}\n className=\"-mt-4 -ml-4 -mr-4\"\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={onClose}\n type=\"button\"\n >\n <CloseIcon fontSize=\"small\" />\n <span>Permit</span>\n </button>\n }\n />\n }\n content={\n permit != null && (\n <div className=\"flex flex-col gap-3\">\n <p className=\"flex flex-row gap-2 text-sm\">\n Type: <b>{PermitTypeLabel[permit.type]}</b>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: permit.type })} />\n </p>\n\n <p className=\"text-sm\">\n Expires in: <b>{expirationInfo.label}</b>\n </p>\n\n {permit.type === 'self' && (\n <p className=\"text-sm\">\n To select this permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is active, you\n will be able to view your own encrypted data.\n </p>\n )}\n {permit.type === 'sharing' && (\n <p className=\"text-sm\">\n To share this permit with <b>recipient</b>, click the <b>\"SHARE\"</b> button below to copy the permit\n data to your clipboard. Share the copied permit data with <b>recipient</b> to grant them access to your\n encrypted data.\n <br />\n <br />\n <i>\n <b>Note:</b> The copied permit data is not sensitive and can be sent to recipient via any\n communication channel.\n </i>\n </p>\n )}\n {permit.type === 'recipient' && (\n <p className=\"text-sm\">\n To select this imported permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is\n active, you will be able to view <b>issuer</b>'s ({truncateAddress(permit.issuer, 4, 4)}) encrypted\n data.\n </p>\n )}\n </div>\n )\n }\n footer={\n <div className=\"flex flex-row gap-3 w-full\">\n {isShareablePermit && (\n <Button variant=\"primary\" onClick={handlePermitShare}>\n {isCopyComplete ? <FaCheck /> : <FaRegCopy />}\n {isCopyComplete ? 'COPIED' : 'SHARE'}\n </Button>\n )}\n {!isShareablePermit && (\n <Button\n variant=\"primary\"\n label={isActivePermit ? 'ALREADY ACTIVE' : 'SELECT'}\n onClick={handlePermitSelect}\n disabled={isActivePermit}\n />\n )}\n <Button label={confirmDelete ? 'CONFIRM' : 'DELETE'} onClick={handlePermitDelete} variant=\"error\" />\n <Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />\n </div>\n }\n />\n );\n};\n","import CloseIcon from '@mui/icons-material/Close';\nimport { PageContainer } from '../components/PageContainer';\nimport { Button } from '../components';\n\ntype Props = {\n header: React.ReactNode | string;\n content: React.ReactNode;\n onClose: () => void;\n};\n\nexport const BaseInfoModal: React.FC<Props> = ({ header, content, onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button\n onClick={onClose}\n className=\"flex items-center gap-1 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n >\n <CloseIcon style={{ fontSize: 16 }} />\n {typeof header === 'string' ? (\n <p className=\"text-base font-semibold tracking-tight text-[#0E2F3F]\">{header}</p>\n ) : (\n header\n )}\n </button>\n }\n content={<div className=\"flex flex-1 flex-col w-full gap-3 items-start justify-start\">{content}</div>}\n footer={\n <div className=\"flex flex-row\">\n <Button onClick={onClose}>\n <span>Close</span>\n </Button>\n </div>\n }\n />\n );\n};\n","import type { PortalModal, PortalModalStateMap } from './types';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nexport const PermitTypeInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitTypeInfo]> = ({ type, onClose }) => {\n return (\n <BaseInfoModal\n header={`${PermitTypeLabel[type]} Permit`}\n content={\n <>\n {/* TODO: Improve copy */}\n {type === 'self' && (\n <p>\n \"Self\" permits are created by a user to access their own encrypted data. The provided signature is\n verified on-chain by the ACL (Access Control List).\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'sharing' && (\n <p>\n \"Delegated\" permits are created by a user (Issuer) to share their encrypted data with another user\n (Recipient). Both Issuer and Rceipient must sign as a handshake. Issuer's signature is verified on-chain\n by the ACL (Access Control List) and grants access to Recipient, and Recipient's signature applies and\n verifies the re-encryption key.\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'recipient' && (\n <p>\n \"Imported\" permits are imported by a user (Recipient) to access encrypted data that has been shared with\n them by the permit's Issuer. Both Issuer and Rceipient must sign as a handshake. Issuer's signature is\n verified on-chain by the ACL (Access Control List) and grants access to Recipient, and Recipient's\n signature applies and verifies the re-encryption key.\n </p>\n )}\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nexport const PermitInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitInfo]> = ({ onClose }) => {\n return (\n <BaseInfoModal\n header=\"Permit\"\n content={\n <>\n <div className=\"flex flex-col w-full justify-center items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <PermitIcon className=\"h-7 w-7 fill-black dark:fill-white\" aria-label=\"CoFHE permit icon\" />\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n CoFHE permits are used to authenticate your identity and grant access to your encrypted data.\n </p>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Generating a permit requires a signature, which will open your connected wallet to sign a message (EIP712).\n This signed message contains only info used to authenticate and grant access.\n </p>\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import { ExampleSelectionPage } from './ExampleSelectionPage';\nimport { ExampleInfoPage } from './ExampleInfoPage';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { PermitDetailsModal } from './PermitDetailsModal';\nimport { PermitTypeInfoModal } from './PermitTypeInfoModal';\nimport { PermitInfoModal } from './PermitInfoModal';\n\nexport const modals: { [M in PortalModal]: React.FC<PortalModalStateMap[M]> } = {\n [PortalModal.ExampleSelection]: ExampleSelectionPage,\n [PortalModal.ExampleInfo]: ExampleInfoPage,\n [PortalModal.PermitDetails]: PermitDetailsModal,\n [PortalModal.PermitTypeInfo]: PermitTypeInfoModal,\n [PortalModal.PermitInfo]: PermitInfoModal,\n};\n","import { isValidElement, cloneElement, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\n\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport type { FnxFloatingButtonToast } from './types';\nimport { cn } from '@/utils';\nimport { usePortalToasts } from '@/stores';\n\nconst ToastClearer = ({ id, paused, remainingMs }: { id: string; paused: boolean; remainingMs: number }) => {\n const { removeToast } = usePortalToasts();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (remainingMs <= 0) {\n removeToast(id);\n return;\n }\n\n // Clear the timer if the toast has been paused\n if (paused && timerRef.current != null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n // Start the timer if the toast has been unpaused\n if (!paused) {\n timerRef.current = setTimeout(() => removeToast(id), remainingMs);\n }\n\n return () => {\n if (timerRef.current == null) return;\n clearTimeout(timerRef.current);\n timerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [remainingMs, paused]);\n\n return null;\n};\n\nconst ToastComponent: React.FC<FnxFloatingButtonToast> = ({ id, duration, paused, startMs, remainingMs, content }) => {\n const { isTopSide } = useFnxFloatingButtonContext();\n const { pauseToast, removeToast } = usePortalToasts();\n\n const handlePause = (paused: boolean) => {\n pauseToast(id, paused);\n };\n\n const handleDismiss = () => {\n removeToast(id);\n };\n\n // Inject id and paused into content if it's a React element\n const injectedContent = isValidElement(content)\n ? cloneElement(content, {\n id,\n paused,\n startMs,\n remainingMs,\n duration,\n onPause: handlePause,\n onDismiss: handleDismiss,\n ...content.props,\n })\n : content;\n\n return (\n <motion.div\n key={id}\n initial={{ opacity: 0, y: isTopSide ? -4 : 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: isTopSide ? 4 : -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className={cn('min-h-8 bg-white border items-center justify-start w-full max-w-full')}\n >\n {injectedContent}\n {duration != 'infinite' && <ToastClearer id={id} paused={paused} remainingMs={remainingMs} />}\n </motion.div>\n );\n};\n\nexport const ToastsSection: React.FC = () => {\n const { toasts } = usePortalToasts();\n return (\n <div className=\"flex flex-col gap-3 w-full max-w-full\">\n <AnimatePresence>\n {toasts.map((toast) => (\n <ToastComponent key={toast.id} {...toast} />\n ))}\n </AnimatePresence>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { FloatingButtonComponent } from './FloatingButtonComponent';\nimport { StatusBarSection } from './StatusBarSection';\nimport { StatusBarContent } from './StatusBarContent';\nimport { ContentSection } from './ContentSection';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport type { FloatingButtonPosition, FnxFloatingButtonProps } from './types';\nimport { ToastsSection } from './ToastsSection';\nimport { usePortalModals, usePortalNavigation, usePortalUI } from '@/stores';\n\nconst positionStyles: Record<FloatingButtonPosition, string> = {\n 'top-left': 'top-4 left-4',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n};\n\nexport const FnxFloatingButtonBase: React.FC<FnxFloatingButtonProps> = ({\n className,\n testId,\n zIndex = 9999,\n positionType = 'fixed',\n overriddingPage,\n}) => {\n const { effectivePosition, isTopSide, isLeftSide, theme } = useFnxFloatingButtonContext();\n const { togglePortal } = usePortalUI();\n const { clearAllModals } = usePortalModals();\n const { clearNavigationHistory } = usePortalNavigation();\n const darkMode = theme === 'dark';\n\n return (\n <div\n data-testid={testId}\n className={cn(\n 'fnx-floating-button',\n darkMode && 'dark',\n positionType,\n 'flex gap-3',\n positionStyles[effectivePosition],\n // bottom-* opens UP (popup above), top-* opens DOWN (popup below)\n isTopSide ? 'flex-col-reverse items-start' : 'flex-col items-start',\n `z-[${zIndex}]`,\n className\n )}\n >\n <ToastsSection />\n\n <ContentSection overriddingPage={overriddingPage} />\n\n {/* Button and Bar Row */}\n <div className={cn('flex w-full gap-3 items-center', isLeftSide ? 'flex-row' : 'flex-row-reverse')}>\n <FloatingButtonComponent\n onClick={() =>\n togglePortal({\n onCloseEnd: () => {\n clearNavigationHistory();\n clearAllModals();\n },\n })\n }\n />\n\n <StatusBarSection>\n <StatusBarContent />\n </StatusBarSection>\n </div>\n </div>\n );\n};\n","import { FnxFloatingButtonBase } from '@/components/FnxFloatingButton/FnxFloatingButtonBase';\nimport { type PageState } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { CofhesdkError, CofhesdkErrorCode } from '@cofhe/sdk';\nimport { QueryErrorResetBoundary } from '@tanstack/react-query';\nimport { useEffect, useMemo } from 'react';\nimport { ErrorBoundary, useErrorBoundary, type FallbackProps } from 'react-error-boundary';\nimport { ErrorCause, getErrorCause } from '@/utils/index';\nimport type { FnxFloatingButtonProps } from '@/components/FnxFloatingButton/types';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalUI } from '@/stores';\n\nclass CofheFallbackError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CofheFallbackError';\n }\n}\n\nexport const CREATE_PERMITT_BODY_BY_ERROR_CAUSE: Record<ErrorCause, React.FC> = {\n [ErrorCause.AttemptToFetchConfidentialBalance]: () =>\n 'In order to fetch confidential token balance, need to generate a new permit.',\n [ErrorCause.AttemptToFetchCustomData]: () => 'In order to fetch custom data, need to generate a new permit.',\n};\n\n// only whitelisted errors will reach error boundary (refer to `shouldPassToErrorBoundary`)\nconst FALLBACK_BY_ERROR_TYPE: ErrorFallbackDefinition[] = [\n {\n // if it's Permit error - redirect to Permit Creation screen\n checkFn: (error: unknown) => error instanceof CofhesdkError && error.code === CofhesdkErrorCode.PermitNotFound,\n componentConstructor: ({ floatingButtonProps, restOfTheChildren }) => {\n const Component: React.FC<FallbackProps> = ({ error, resetErrorBoundary }) => {\n const { portalOpen, openPortal } = usePortalUI();\n const overriddingPage = useMemo<PageState>(() => {\n const errorCause = getErrorCause(error);\n const OverridingBodyComponent = errorCause ? CREATE_PERMITT_BODY_BY_ERROR_CAUSE[errorCause] : undefined;\n return {\n page: FloatingButtonPage.GeneratePermits,\n props: {\n overridingBody: (\n <div>{OverridingBodyComponent ? <OverridingBodyComponent /> : (error as Error)?.message}</div>\n ),\n // resetting error boundary will re-render previously failed components (i.e. the normal aka {children}, non-fallback flow), so essentially will navigate the user back\n onSuccessNavigateTo: () => resetErrorBoundary(),\n onCancel: () => {\n resetErrorBoundary();\n },\n onBack: () => {\n resetErrorBoundary();\n },\n },\n };\n }, [error, resetErrorBoundary]);\n useEffect(() => {\n if (!portalOpen) openPortal();\n }, [openPortal, portalOpen]);\n return (\n <>\n <FnxFloatingButtonBase {...floatingButtonProps} overriddingPage={overriddingPage} />\n {restOfTheChildren}\n </>\n );\n };\n return Component;\n },\n },\n];\n\ntype ErrorFallback = {\n checkFn: (error: unknown) => boolean;\n component: React.FC<FallbackProps>;\n};\n\ntype ErrorFallbackDefinition = {\n checkFn: (error: unknown) => boolean;\n componentConstructor: (deps: {\n floatingButtonProps: FnxFloatingButtonProps;\n restOfTheChildren: React.ReactNode;\n }) => React.FC<FallbackProps>;\n};\n\nexport function constructErrorFallbacksWithFloatingButtonProps(\n props: FnxFloatingButtonProps,\n restOfTheChildren: React.ReactNode\n): ErrorFallback[] {\n return FALLBACK_BY_ERROR_TYPE.map(({ checkFn, componentConstructor }) => ({\n checkFn,\n component: componentConstructor({ floatingButtonProps: props, restOfTheChildren }),\n }));\n}\n\nexport function shouldPassToErrorBoundary(_error: unknown): boolean {\n // only if there's a matching defined handler, pass to error boundary\n return FALLBACK_BY_ERROR_TYPE.some(({ checkFn }) => checkFn(_error));\n}\n\nfunction constructFallbackRouter(errorFallbacks: ErrorFallback[]): React.FC<FallbackProps> {\n const fallback: React.FC<FallbackProps> = ({ error, resetErrorBoundary }) => {\n for (const { checkFn, component: Component } of errorFallbacks) {\n if (checkFn(error)) {\n return <Component error={error} resetErrorBoundary={resetErrorBoundary} />;\n }\n }\n // if none matched - it' means there's logic error.\n // we'll re-throw the error, which will result into the original logs as if there was no error boundary + error log about the fallback error\n throw new CofheFallbackError(\"Error couldn't be handled:\" + error?.message);\n };\n\n return fallback;\n}\n\nconst UncaughtPromisesHandler = function UncaughtPromisesHandler() {\n const { showBoundary } = useErrorBoundary();\n // Listen for unhandled promise rejections (\"Uncaught (in promise)\") not caught by ErrorBoundary\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const onUnhandled = (event: PromiseRejectionEvent) => {\n // if we can't handle it - ignore\n if (!shouldPassToErrorBoundary(event.reason)) return;\n\n // if we do handle it - no need to log it further\n event.preventDefault();\n event.stopPropagation();\n\n try {\n // eslint-disable-next-line no-console\n console.warn('[observed UnhandledRejection that is handled by CofheSDK]', event.reason);\n // Show fallback without rethrowing during render\n showBoundary(event.reason);\n // eslint-disable-next-line no-empty\n } catch {}\n };\n window.addEventListener('unhandledrejection', onUnhandled);\n return () => {\n window.removeEventListener('unhandledrejection', onUnhandled);\n };\n }, [showBoundary]);\n return null;\n};\n\nexport const CofheErrorBoundary: React.FC<{ children: React.ReactNode; errorFallbacks: ErrorFallback[] }> = ({\n children,\n errorFallbacks,\n}) => {\n const FallbackRouter = useMemo(() => constructFallbackRouter(errorFallbacks), [errorFallbacks]);\n return (\n <QueryErrorResetBoundary>\n {({ reset: queryReset }) => (\n <ErrorBoundary\n onReset={queryReset}\n // FallbackRouter will route to appropriate component based on the error type and code\n FallbackComponent={FallbackRouter}\n onError={(error, info) => {\n console.error('[cofhesdk][ErrorBoundary] error:', error, info);\n }}\n >\n <UncaughtPromisesHandler />\n {children}\n </ErrorBoundary>\n )}\n </QueryErrorResetBoundary>\n );\n};\n","import { CofheErrorBoundary, constructErrorFallbacksWithFloatingButtonProps } from '@/providers/errors';\nimport { FnxFloatingButtonBase } from './FnxFloatingButtonBase';\nimport { FnxFloatingButtonProvider } from './FnxFloatingButtonContext';\nimport type { FnxFloatingButtonProps } from './types';\n\nexport const FnxFloatingButtonWithProvider: React.FC<FnxFloatingButtonProps> = (props) => {\n return (\n <FnxFloatingButtonProvider>\n <CofheErrorBoundary errorFallbacks={constructErrorFallbacksWithFloatingButtonProps(props, props.children)}>\n <FnxFloatingButtonBase {...props} />\n {props.children}\n </CofheErrorBoundary>\n </FnxFloatingButtonProvider>\n );\n};\n","import { z } from 'zod';\nimport { type CofhesdkConfig, type CofhesdkInputConfig } from '@cofhe/sdk';\nimport { createCofhesdkConfig as createCofhesdkConfigWeb } from '@cofhe/sdk/web';\n\n/**\n * Zod schema for react configuration validation\n */\nexport type HexAddress = `0x${string}`;\nconst HexAddressSchema = z.custom<HexAddress>(\n (v) => typeof v === 'string' && /^0x[a-fA-F0-9]{40}$/.test(v),\n 'Invalid address'\n);\n\nexport const CofhesdkReactConfigSchema = z.object({\n shareablePermits: z.boolean().optional().default(false),\n enableShieldUnshield: z.boolean().optional().default(true),\n autogeneratePermits: z.boolean().optional().default(true),\n permitExpirationOptions: z\n .array(\n z.object({\n label: z.string(),\n intervalSeconds: z.number().min(0),\n })\n )\n .optional()\n .default([\n { label: '1 Day', intervalSeconds: 86400 },\n { label: '1 Week', intervalSeconds: 604800 },\n { label: '1 Month', intervalSeconds: 2592000 },\n ]),\n defaultPermitExpirationSeconds: z.number().optional().default(604800), // 1 week\n pinnedTokens: z.record(HexAddressSchema).optional().default({\n 11155111: '0x87A3effB84CBE1E4caB6Ab430139eC41d156D55A', // sepolia weth\n 84532: '0xbED96aa98a49FeA71fcC55d755b915cF022a9159', // base sepolia weth\n // 421613: '0x980b62da83eff3d4576c647993b0c1d7faf17c73', // arbitrum sepolia weth\n }),\n tokenLists: z\n .record(z.array(z.string()))\n .optional()\n .default({\n 11155111: ['https://storage.googleapis.com/cofhesdk/sepolia.json'],\n 84532: ['https://storage.googleapis.com/cofhesdk/base-sepolia.json'],\n // 421613: ['https://tokens.cofhe.io/arbitrum-sepolia.json'],\n })\n .transform((lists) => lists as Partial<Record<number, string[]>>),\n position: z.enum(['bottom-right', 'bottom-left', 'top-right', 'top-left']).optional().default('bottom-right'),\n initialTheme: z.enum(['dark', 'light']).optional().default('light'),\n});\n\n/**\n * Input config type inferred from the schema\n */\nexport type CofhesdkReactInputConfig = CofhesdkInputConfig & {\n react?: z.input<typeof CofhesdkReactConfigSchema>;\n};\n\nexport type CofhesdkConfigWithReact = CofhesdkConfig & {\n react: z.output<typeof CofhesdkReactConfigSchema>;\n};\n/**\n * Creates a CoFHE SDK client plus React react configuration with reasonable defaults.\n * @param config - Cofhesdk client input merged with a `react` object (fheKeyStorage defaults to IndexedDB when omitted).\n * @returns The combined client configuration with a validated `react` section and Web defaults applied.\n */\nexport function createCofhesdkConfig(config: CofhesdkReactInputConfig): CofhesdkConfigWithReact {\n const { react: reactConfigInput = {}, ...webConfig } = config;\n\n const webClientConfig = createCofhesdkConfigWeb({\n environment: 'react',\n ...webConfig,\n });\n const reactConfigResult = CofhesdkReactConfigSchema.safeParse(reactConfigInput);\n\n if (!reactConfigResult.success) {\n throw new Error(`Invalid cofhesdk react configuration: ${reactConfigResult.error.message}`);\n }\n\n return {\n ...webClientConfig,\n react: reactConfigResult.data,\n };\n}\n","import { useState, useRef, useEffect, useMemo } from 'react';\nimport type {\n BaseProps,\n DropdownOption,\n ComponentSize,\n EncryptionProgressData,\n EncryptionResultData,\n EncryptionStartData,\n} from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { Encryptable, type FheTypeValue } from '@cofhe/sdk';\nimport { getStepConfig, useCofheEncrypt } from '@/hooks/useCofheEncrypt';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError,\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const {\n encryptInputsAsync: encrypt,\n isEncrypting,\n stepsState: { lastStep: lastEncryptionStep },\n } = useCofheEncrypt();\n\n const { progress: encryptionProgress, label: encryptionProgressLabel } = useMemo(() => {\n return lastEncryptionStep\n ? getStepConfig(lastEncryptionStep)\n : {\n progress: undefined,\n label: undefined,\n };\n }, [lastEncryptionStep]);\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncrypting) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncrypting) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncrypting]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncrypting && lastEncryptionStep && encryptionProgress && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: lastEncryptionStep.step,\n progress: encryptionProgress,\n label: encryptionProgressLabel,\n });\n }\n }, [encryptionProgress, encryptionProgressLabel, onEncryptProgress, isEncrypting, lastEncryptionStep]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' },\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError\n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500'\n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncrypting) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncrypting) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncrypting) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) =>\n cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible\n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium'\n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500',\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') =>\n cn('h-full transition-all duration-300 ease-out rounded-full', progressVariantClasses[variant]);\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n\n const typeInfo = FheTypesList.find((type) => type.value === typeValue);\n if (!typeInfo) return false;\n\n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n\n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n\n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n\n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n\n return true;\n }\n\n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n\n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n\n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n\n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n\n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(\n encryptedResult,\n (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n },\n 2\n ); // Pretty format with 2 spaces\n\n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n\n // Show success indication\n setCopySuccess(true);\n\n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n\n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n\n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const [encryptionResult] = await encrypt([Encryptable.create(type, textValue)]);\n\n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n\n const data = { value: textValue, encrypted: encryptionResult };\n\n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncrypting) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => <SecurityIcon sx={{ fontSize: 14 }} />;\n\n const ChevronDownIcon = () => <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n\n {/* Encryption status indicator */}\n {(isEncrypting || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncrypting ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">Encrypting...</div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess ? 'bg-green-600 cursor-default' : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? 'Copied to clipboard!' : 'Copy encrypted result to clipboard'}\n >\n <>\n {copySuccess ? <CheckIcon sx={{ fontSize: 12 }} /> : <ContentCopyIcon sx={{ fontSize: 12 }} />}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n\n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n\n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n\n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={\n !isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined\n }\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div\n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncrypting\n ? 'slideDownFadeIn 0.5s ease-out forwards'\n : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">{encryptionProgress || 0}%</span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{\n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out',\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {hasError && errorMessage && (\n <p\n className=\"mt-2 text-sm text-red-600 dark:text-red-400\"\n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n","// Styles\nimport './styles.css';\n\n// Providers\nexport { CofheProvider, useCofheContext } from './providers/index';\n\n// Hooks\nexport {\n useCofheConnection,\n useCofheActivePermit,\n useCofheAllPermits,\n useCofheRemovePermit,\n useCofheSelectPermit,\n useCofhePublicClient,\n useCofheWalletClient,\n useCofheEncrypt,\n useCofheWriteContract,\n useCofheClient,\n useCofheTokens,\n useCofheTokenLists,\n useCofheTokenShield,\n useCofheTokenUnshield,\n useCofheTokenClaimUnshielded,\n useCofheTokenClaimable,\n useCofheTokensClaimable,\n useCofheTokenDecryptedBalance,\n useCofheTokenTransfer,\n useTransactionReceiptsByHash,\n ETH_ADDRESS,\n type Erc20Pair,\n type UnshieldClaim,\n type UnshieldClaimsSummary,\n type UnshieldClaimsSummaryByTokenAddress,\n type ClaimableAmountByTokenAddress,\n type UseTransactionReceiptsByHashInput,\n} from '@/hooks/index';\n\nexport { useCofheEncryptAndWriteContract } from '@/hooks/useCofheEncryptAndWriteContract';\nexport { useCofheReadContractAndDecrypt } from '@/hooks/useCofheReadContractAndDecrypt';\n\n// Components\nexport { FnxEncryptInput, FnxFloatingButtonWithProvider } from './components/index';\nexport { MainPage, SettingsPage, TokenListPage } from './components/FnxFloatingButton/pages/index';\n\n// Utils\nexport {\n FheTypesList,\n fheTypeToString,\n encryptedValueToString,\n getBlockExplorerUrl,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n formatRelativeTime,\n truncateHash,\n isEthPair,\n isWrappedEthToken,\n} from './utils/index';\n\n// Stores\nexport {\n useTransactionStore,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n type Transaction,\n type TransactionStore,\n type TransactionStatusString,\n type TransactionActionString,\n} from './stores/transactionStore';\n\nexport { createCofhesdkConfig } from './config';\n\n// Types\nexport type { CofheContextValue, CofheProviderProps, CofheClientConfig } from './types/index';\n\nexport type { FnxFloatingButtonProps } from './components/FnxFloatingButton/types';\n\nexport type { FloatingButtonPosition } from './components/FnxFloatingButton/types';\n\nexport { createCofhesdkClient } from '@cofhe/sdk/web';\n\nexport { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nexport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\nexport { CREATE_PERMITT_BODY_BY_ERROR_CAUSE } from './providers/errors';\nexport { ErrorCause } from './utils/errors';\n\nexport type { CofhesdkConfigWithReact } from './config';\n\nexport type { Token } from './types/token';\n\nexport { useInternalQueryClient } from './providers/index';\n"],"mappings":"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","names":["assert","createContext","useContext","useMemo","useState","QueryClient","createContext","useContext","useMemo","ErrorCause","useContext","TransactionStatus","TransactionActionType","import_ts_essentials","useMemo","useSyncExternalStore","create","useMemo","create","create","create","useMemo","create","jsx","jsxs","create","jsx","DEFAULT_SNAPSHOT_GETTER","useMemo","useSyncExternalStore","useMemo","useInternalQueries","useMemo","parseAbi","import_ts_essentials","create","createJSONStorage","persist","bigintStorage","createJSONStorage","create","persist","useMemo","import_ts_essentials","queryKey","import_ts_essentials","useMemo","filter","useInternalQueries","useCallback","useEffect","useMemo","useRef","import_ts_essentials","useMemo","useMemo","useInternalQueries","import_ts_essentials","useMemo","abortError","sleep","useMemo","useInternalQueries","useCallback","filter","useMemo","useEffect","useRef","FheTypes","import_ts_essentials","FheTypes","import_ts_essentials","FheTypes","FheTypes","import_ts_essentials","useCallback","useMemo","useState","import_ts_essentials","import_ts_essentials","import_ts_essentials","useMemo","import_ts_essentials","filter","useMemo","useEffect","useRef","transaction","useEffect","useRef","transaction","import_ts_essentials","import_ts_essentials","useMemo","useMemo","filter","import_ts_essentials","useMemo","useMemo","useMemo","useInternalQueries","queryKey","useState","useCallback","useMemo","useCallback","useState","create","createJSONStorage","persist","useState","useCallback","useCallback","useMemo","useCallback","useEffect","useRef","useState","useCallback","jsx","useMemo","useCallback","useState","useCallback","PermitUtils","useState","useCallback","useCallback","useMemo","PermitUtils","useMemo","PermitUtils","useCallback","useEffect","useInternalQueries","useEffect","useEffect","useRef","useEffect","useRef","useRef","useEffect","useEffect","useEffect","jsx","useContext","jsx","jsx","jsxs","motion","jsx","motion","AnimatePresence","motion","jsx","jsx","jsxs","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","jsx","jsxs","jsx","__default","jsx","__default","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","jsx","jsxs","sizeClasses","jsx","jsxs","sizeClasses","jsx","jsx","jsx","jsxs","GoArrowUpRight","TbShieldPlus","import_ts_essentials","jsx","jsxs","jsx","jsxs","jsx","jsxs","sizeClasses","jsx","jsxs","iconClassName","jsx","jsxs","TbShieldPlus","GoArrowUpRight","jsx","jsxs","jsx","create","persist","ShieldPageVariant","jsx","jsxs","ArrowBackIcon","KeyboardArrowRightIcon","jsx","jsxs","KeyboardArrowRightIcon","import_ts_essentials","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","createContext","useCallback","useContext","useMemo","useState","jsx","jsxs","createContext","useState","useCallback","useMemo","useContext","jsx","jsxs","jsx","zeroAddress","PermitUtils","useMemo","jsx","useMemo","Fragment","jsx","jsxs","CopyButton","PermitUtils","zeroAddress","Fragment","jsx","jsxs","ArrowBackIcon","permit","ArrowBackIcon","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","error","ArrowBackIcon","ArrowBackIcon","jsx","jsxs","jsx","jsxs","error","ArrowBackIcon","ArrowBackIcon","jsx","Fragment","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","ContentCopyIcon","CheckIcon","jsx","jsxs","ArrowBackIcon","CheckIcon","ContentCopyIcon","ArrowBackIcon","Fragment","jsx","jsxs","ArrowBackIcon","useState","useMemo","ArrowBackIcon","KeyboardArrowRightIcon","isAddress","import_ts_essentials","Fragment","jsx","jsxs","error","useMemo","useState","isValidAddress","isAddress","ArrowBackIcon","KeyboardArrowRightIcon","ArrowBackIcon","TbShieldPlus","TbShieldMinus","useState","import_ts_essentials","useCallback","filter","Fragment","jsx","jsxs","useState","error","TbShieldPlus","TbShieldMinus","ArrowBackIcon","ArrowBackIcon","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","useState","Fragment","jsx","jsxs","useState","ArrowBackIcon","create","ArrowBackIcon","useMemo","import_ts_essentials","jsx","jsxs","useMemo","ArrowBackIcon","AnimatePresence","motion","CloseIcon","jsx","jsxs","CloseIcon","CloseIcon","jsx","jsxs","CloseIcon","FaCheck","FaRegCopy","CloseIcon","useCallback","useState","jsx","jsxs","PermitTypeLabel","useState","useCallback","CloseIcon","FaCheck","FaRegCopy","CloseIcon","jsx","jsxs","CloseIcon","Fragment","jsx","jsxs","PermitTypeLabel","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","useMemo","AnimatePresence","motion","isValidElement","useEffect","useRef","motion","AnimatePresence","jsx","jsxs","useRef","useEffect","paused","isValidElement","motion","AnimatePresence","jsx","jsxs","CofhesdkError","useEffect","useMemo","Fragment","jsx","jsxs","CofhesdkError","useMemo","useEffect","UncaughtPromisesHandler","jsx","createContext","useContext","useMemo","QueryClient","jsx","jsxs","import_ts_essentials","jsx","jsxs","createContext","useMemo","useState","useContext","useState","useRef","useEffect","useMemo","KeyboardArrowDownIcon","ContentCopyIcon","CheckIcon","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","sizeClasses","errorMessage","ShieldIcon","KeyboardArrowDownIcon","CheckIcon","ContentCopyIcon","createCofhesdkClient"]}