@cedros/login-react 0.0.1 → 0.0.2
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/README.md +142 -2
- package/dist/AuthenticationSettings-CMQhep61.js +9 -0
- package/dist/AuthenticationSettings-CMQhep61.js.map +1 -0
- package/dist/AuthenticationSettings-Cro76kIC.cjs +1 -0
- package/dist/AuthenticationSettings-Cro76kIC.cjs.map +1 -0
- package/dist/CreditSystemSettings-AM7qDk1E.js +9 -0
- package/dist/CreditSystemSettings-AM7qDk1E.js.map +1 -0
- package/dist/CreditSystemSettings-CGR-uzuh.cjs +1 -0
- package/dist/CreditSystemSettings-CGR-uzuh.cjs.map +1 -0
- package/dist/DepositsSection-BVNd63B7.js +47 -0
- package/dist/DepositsSection-BVNd63B7.js.map +1 -0
- package/dist/DepositsSection-Ct1gjgIg.cjs +1 -0
- package/dist/DepositsSection-Ct1gjgIg.cjs.map +1 -0
- package/dist/EmailRegisterForm-B-ys4E3C.cjs +1 -0
- package/dist/EmailRegisterForm-B-ys4E3C.cjs.map +1 -0
- package/dist/EmailRegisterForm-BChCiZ5B.js +961 -0
- package/dist/EmailRegisterForm-BChCiZ5B.js.map +1 -0
- package/dist/EmailSettings-DFZ13JbX.cjs +1 -0
- package/dist/EmailSettings-DFZ13JbX.cjs.map +1 -0
- package/dist/EmailSettings-Di4GSWgb.js +9 -0
- package/dist/EmailSettings-Di4GSWgb.js.map +1 -0
- package/dist/EmbeddedWalletSettings-Cmn_aVL7.js +9 -0
- package/dist/EmbeddedWalletSettings-Cmn_aVL7.js.map +1 -0
- package/dist/EmbeddedWalletSettings-DRWeIJKb.cjs +1 -0
- package/dist/EmbeddedWalletSettings-DRWeIJKb.cjs.map +1 -0
- package/dist/{ErrorMessage-Bm1j5mBT.js → ErrorMessage-C8vKB0JG.js} +9 -9
- package/dist/ErrorMessage-C8vKB0JG.js.map +1 -0
- package/dist/ErrorMessage-CntMyn93.cjs.map +1 -1
- package/dist/{GoogleLoginButton-CvDoOc-0.js → GoogleLoginButton-Ceo2sYvX.js} +1 -1
- package/dist/{GoogleLoginButton-CvDoOc-0.js.map → GoogleLoginButton-Ceo2sYvX.js.map} +1 -1
- package/dist/ServerSettings-D8w8EpoE.cjs +1 -0
- package/dist/ServerSettings-D8w8EpoE.cjs.map +1 -0
- package/dist/ServerSettings-Wg_odW46.js +9 -0
- package/dist/ServerSettings-Wg_odW46.js.map +1 -0
- package/dist/{SolanaLoginButton-h32xN2PQ.js → SolanaLoginButton-CqVOcPa7.js} +1 -1
- package/dist/{SolanaLoginButton-h32xN2PQ.js.map → SolanaLoginButton-CqVOcPa7.js.map} +1 -1
- package/dist/TeamSection-Bj89WSC0.js +128 -0
- package/dist/TeamSection-Bj89WSC0.js.map +1 -0
- package/dist/TeamSection-DQ4nfUHN.cjs +1 -0
- package/dist/TeamSection-DQ4nfUHN.cjs.map +1 -0
- package/dist/UsersSection-BiZceDV3.cjs +1 -0
- package/dist/UsersSection-BiZceDV3.cjs.map +1 -0
- package/dist/UsersSection-W19ddPsw.js +81 -0
- package/dist/UsersSection-W19ddPsw.js.map +1 -0
- package/dist/WebhookSettings-a1c4iMvr.js +9 -0
- package/dist/WebhookSettings-a1c4iMvr.js.map +1 -0
- package/dist/WebhookSettings-onJWLytD.cjs +1 -0
- package/dist/WebhookSettings-onJWLytD.cjs.map +1 -0
- package/dist/WithdrawalsSection-BBw9gWMR.js +20 -0
- package/dist/WithdrawalsSection-BBw9gWMR.js.map +1 -0
- package/dist/WithdrawalsSection-Cws8inf6.cjs +1 -0
- package/dist/WithdrawalsSection-Cws8inf6.cjs.map +1 -0
- package/dist/admin/AdminShell.d.ts +38 -0
- package/dist/admin/icons.d.ts +2 -0
- package/dist/admin/index.d.ts +10 -0
- package/dist/admin/plugin.d.ts +3 -0
- package/dist/admin/sections/AuthenticationSettings.d.ts +3 -0
- package/dist/admin/sections/CreditSystemSettings.d.ts +3 -0
- package/dist/admin/sections/DepositsSection.d.ts +3 -0
- package/dist/admin/sections/EmailSettings.d.ts +3 -0
- package/dist/admin/sections/EmbeddedWalletSettings.d.ts +3 -0
- package/dist/admin/sections/FeatureSettings.d.ts +3 -0
- package/dist/admin/sections/InvitesSection.d.ts +3 -0
- package/dist/admin/sections/MembersSection.d.ts +3 -0
- package/dist/admin/sections/ServerSettings.d.ts +3 -0
- package/dist/admin/sections/SettingsSections.d.ts +7 -0
- package/dist/admin/sections/TeamSection.d.ts +3 -0
- package/dist/admin/sections/UsersSection.d.ts +3 -0
- package/dist/admin/sections/WebhookSettings.d.ts +3 -0
- package/dist/admin/sections/WithdrawalsSection.d.ts +3 -0
- package/dist/admin/types.d.ts +167 -0
- package/dist/components/admin/AdminUserDetail.d.ts +3 -1
- package/dist/components/admin/AdminUserList.d.ts +3 -7
- package/dist/components/admin/CedrosAdminDashboard.d.ts +7 -3
- package/dist/components/admin/PermissionsSection.d.ts +7 -0
- package/dist/components/admin/ProfileDropdown.d.ts +34 -0
- package/dist/components/admin/SetupWizard.d.ts +30 -0
- package/dist/components/admin/StatsBar.d.ts +17 -0
- package/dist/components/admin/settings/AuthenticationSettings.d.ts +4 -0
- package/dist/components/admin/settings/AutosaveStatus.d.ts +6 -0
- package/dist/components/admin/settings/CreditSystemSettings.d.ts +6 -0
- package/dist/components/admin/settings/EmailSettings.d.ts +4 -0
- package/dist/components/admin/settings/EmbeddedWalletSettings.d.ts +4 -0
- package/dist/components/admin/settings/FeatureSettings.d.ts +4 -0
- package/dist/components/admin/settings/MessagingSettings.d.ts +4 -0
- package/dist/components/admin/settings/SecuritySettings.d.ts +4 -0
- package/dist/components/admin/settings/ServerSettings.d.ts +4 -0
- package/dist/components/admin/settings/SettingsPageLayout.d.ts +16 -0
- package/dist/components/admin/settings/SsoProvidersSettings.d.ts +4 -0
- package/dist/components/admin/settings/WebhookSettings.d.ts +4 -0
- package/dist/components/admin/settings/index.d.ts +31 -0
- package/dist/components/admin/settings/settingsInputs.d.ts +79 -0
- package/dist/components/admin/settings/settingsMetadata.d.ts +18 -0
- package/dist/components/deposit/admin/AdminWithdrawalStats.d.ts +10 -0
- package/dist/components/deposit/admin/FeatureDisabledMessage.d.ts +15 -0
- package/dist/components/deposit/admin/featureDisabled.d.ts +9 -0
- package/dist/components/deposit/admin/index.d.ts +5 -0
- package/dist/components/invites/InviteForm.d.ts +1 -1
- package/dist/components/org/OrgSelector.d.ts +2 -1
- package/dist/components/profile/UserProfileSettings.d.ts +35 -0
- package/dist/components/profile/index.d.ts +2 -0
- package/dist/crypto/secureWipe.d.ts +0 -19
- package/dist/crypto/webauthnPrf.d.ts +0 -10
- package/dist/email-only.cjs +1 -1
- package/dist/email-only.js +2 -2
- package/dist/google-only.js +2 -2
- package/dist/hooks/useDashboardPermissions.d.ts +45 -0
- package/dist/hooks/useProfile.d.ts +35 -0
- package/dist/hooks/useServerFeatures.d.ts +55 -0
- package/dist/hooks/useSettingsAutosave.d.ts +29 -0
- package/dist/hooks/useSetup.d.ts +25 -0
- package/dist/hooks/useSsoProviders.d.ts +52 -0
- package/dist/index-BHR_WTP2.js +19636 -0
- package/dist/index-BHR_WTP2.js.map +1 -0
- package/dist/index-JsIJkPin.cjs +2061 -0
- package/dist/index-JsIJkPin.cjs.map +1 -0
- package/dist/index.cjs +1 -2061
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +21 -3
- package/dist/index.js +117 -14908
- package/dist/index.js.map +1 -1
- package/dist/login-react.css +1 -1
- package/dist/silentWalletEnroll-CQK5i65l.js +42 -0
- package/dist/silentWalletEnroll-CQK5i65l.js.map +1 -0
- package/dist/silentWalletEnroll-DBfS2sLe.cjs +1 -0
- package/dist/silentWalletEnroll-DBfS2sLe.cjs.map +1 -0
- package/dist/solana-only.js +2 -2
- package/dist/solanaKeypair-BD7Kq1Mw.js +1932 -0
- package/dist/solanaKeypair-BD7Kq1Mw.js.map +1 -0
- package/dist/solanaKeypair-CBQxm2hw.cjs +1 -0
- package/dist/solanaKeypair-CBQxm2hw.cjs.map +1 -0
- package/dist/types/adminUser.d.ts +56 -0
- package/dist/types/deposit.d.ts +2 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/org.d.ts +34 -2
- package/dist/types/profile.d.ts +56 -0
- package/dist/types/setup.d.ts +45 -0
- package/dist/types/systemSettings.d.ts +5 -1
- package/dist/utils/adminUserApi.d.ts +10 -1
- package/dist/utils/profileApi.d.ts +26 -0
- package/dist/utils/setupApi.d.ts +21 -0
- package/package.json +1 -1
- package/dist/EmailRegisterForm-D_uCEdX9.cjs +0 -1
- package/dist/EmailRegisterForm-D_uCEdX9.cjs.map +0 -1
- package/dist/EmailRegisterForm-m3rX3A6X.js +0 -2923
- package/dist/EmailRegisterForm-m3rX3A6X.js.map +0 -1
- package/dist/ErrorMessage-Bm1j5mBT.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorMessage-C8vKB0JG.js","sources":["../src/context/CedrosLoginContext.ts","../src/hooks/useThemeManager.ts","../src/utils/tokenManager.ts","../src/utils/tabSync.ts","../src/utils/csrf.ts","../src/hooks/useAuthSession.ts","../src/context/useCedrosLogin.ts","../src/crypto/types.ts","../src/crypto/entropy.ts","../src/crypto/secureWipe.ts","../src/crypto/aesGcm.ts","../src/crypto/hkdf.ts","../node_modules/hash-wasm/dist/index.esm.js","../src/crypto/argon2.ts","../src/crypto/webauthnPrf.ts","../src/crypto/capabilities.ts","../src/utils/apiClient.ts","../src/utils/unlockCredential.ts","../src/hooks/useWalletMaterial.ts","../src/hooks/useWallet.ts","../src/utils/embeddedWallet.ts","../src/context/EmbeddedWalletExposure.tsx","../src/context/CedrosLoginProvider.tsx","../src/hooks/useAuth.ts","../src/components/shared/LoadingSpinner.tsx","../src/components/shared/ErrorMessage.tsx"],"sourcesContent":["import { createContext } from 'react';\nimport type { CedrosLoginConfig, AuthUser, AuthState, AuthError, TokenPair } from '../types';\n\n/**\n * Internal helpers for auth hooks (not part of public API)\n */\nexport interface CedrosLoginInternalAPI {\n handleLoginSuccess: (user: AuthUser, tokens?: TokenPair) => void;\n getAccessToken: () => string | null;\n}\n\n/**\n * Context value provided by CedrosLoginProvider\n */\nexport interface CedrosLoginContextValue {\n // Config\n config: CedrosLoginConfig;\n\n // Auth state\n user: AuthUser | null;\n authState: AuthState;\n error: AuthError | null;\n\n // Actions\n logout: () => Promise<void>;\n refreshUser: () => Promise<void>;\n\n // Modal control\n isModalOpen: boolean;\n openModal: () => void;\n closeModal: () => void;\n\n // Internal API (for auth hooks)\n _internal?: CedrosLoginInternalAPI;\n}\n\nexport const CedrosLoginContext = createContext<CedrosLoginContextValue | null>(null);\n","import { useEffect } from 'react';\nimport type { ThemeMode, ThemeOverrides } from '../types';\n\nexport interface UseThemeManagerOptions {\n theme?: ThemeMode;\n themeOverrides?: ThemeOverrides;\n}\n\n/**\n * Hook that manages theme application to the document root.\n * Handles light/dark/auto themes and custom CSS variable overrides.\n * Properly cleans up styles on unmount to prevent memory leaks.\n */\nexport function useThemeManager({ theme, themeOverrides }: UseThemeManagerOptions): void {\n useEffect(() => {\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n return;\n }\n\n const root = document.documentElement;\n\n // Track whether we added the dark class (for cleanup)\n let addedDarkClass = false;\n\n // Apply theme mode\n if (theme === 'dark') {\n root.classList.add('cedros-dark');\n addedDarkClass = true;\n } else if (theme === 'light') {\n root.classList.remove('cedros-dark');\n } else {\n // Auto: check system preference\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n if (prefersDark) {\n root.classList.add('cedros-dark');\n addedDarkClass = true;\n } else {\n root.classList.remove('cedros-dark');\n }\n }\n\n // Track applied overrides for cleanup (store previous values)\n const appliedOverrides: Map<string, string> = new Map();\n\n // Apply theme overrides\n if (themeOverrides) {\n Object.entries(themeOverrides).forEach(([key, value]) => {\n if (value) {\n // Store previous value for restoration on cleanup\n const previousValue = root.style.getPropertyValue(key);\n appliedOverrides.set(key, previousValue);\n root.style.setProperty(key, value);\n }\n });\n }\n\n // Cleanup: restore previous state on unmount or when theme changes\n return () => {\n // Remove dark class if we added it\n if (addedDarkClass) {\n root.classList.remove('cedros-dark');\n }\n\n // Restore previous CSS variable values\n appliedOverrides.forEach((previousValue, key) => {\n if (previousValue) {\n root.style.setProperty(key, previousValue);\n } else {\n root.style.removeProperty(key);\n }\n });\n };\n }, [theme, themeOverrides]);\n}\n","import type { TokenPair, SessionStorage } from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'cedros_tokens';\nconst REFRESH_BUFFER_MS = 60_000; // Refresh 1 minute before expiry\n\ninterface StoredTokenData {\n tokens: TokenPair;\n expiresAt: number; // Unix timestamp in ms\n}\n\n/**\n * Token manager for storing and auto-refreshing tokens\n *\n * ## Security Warning: localStorage Storage\n *\n * When using `localStorage` or `sessionStorage`, tokens are stored in the browser\n * and are **vulnerable to XSS attacks**. Any JavaScript running\n * on your page (including third-party scripts, browser extensions, or malicious\n * code injected via XSS) can read these tokens.\n *\n * **Recommendations:**\n * - Use `cookie` storage with httpOnly cookies (tokens stored server-side)\n * - If localStorage is required, implement strong Content Security Policy (CSP)\n * - Sanitize all user input and output\n * - Regularly audit third-party dependencies\n *\n * @example\n * // Recommended: cookie storage (tokens in httpOnly cookies)\n * const manager = new TokenManager('cookie');\n *\n * // Use with caution: localStorage (XSS vulnerable)\n * const manager = new TokenManager('localStorage');\n */\nexport interface TokenManagerOptions {\n /**\n * Allow `localStorage`/`sessionStorage` token persistence.\n *\n * @security This is intentionally opt-in because these storage modes are vulnerable\n * to XSS token theft.\n */\n allowWebStorage?: boolean;\n}\n\nexport class TokenManager {\n private storage: SessionStorage;\n private requestedStorage: SessionStorage;\n private storageKey: string;\n private tokens: TokenPair | null = null;\n private expiresAt: number = 0;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private onRefreshNeeded: (() => Promise<void>) | null = null;\n private onSessionExpired: (() => void) | null = null;\n private onRefreshError: ((error: Error) => void) | null = null;\n // P-02: Track destruction to prevent timer callbacks from executing after cleanup\n private isDestroyed: boolean = false;\n private allowWebStorage: boolean;\n\n constructor(\n storage: SessionStorage = 'cookie',\n persistKey: string = DEFAULT_STORAGE_KEY,\n options: TokenManagerOptions = {}\n ) {\n this.requestedStorage = storage;\n this.storage = storage;\n this.storageKey = persistKey;\n this.allowWebStorage = options.allowWebStorage ?? false;\n\n this.warnIfLocalStorage();\n\n // UI-03: Web storage is explicit opt-in. If not enabled, downgrade to memory\n // so callers don't accidentally assume persistence across reloads.\n if (\n !this.allowWebStorage &&\n (this.requestedStorage === 'localStorage' || this.requestedStorage === 'sessionStorage')\n ) {\n this.storage = 'memory';\n }\n this.loadFromStorage();\n }\n\n /**\n * S-18/UI-XSS: Warn about localStorage XSS vulnerability in all environments.\n * Security warnings should not be suppressed in production - operators need\n * to be aware of the security implications of their storage choices.\n */\n private warnIfLocalStorage(): void {\n if (\n (this.requestedStorage === 'localStorage' || this.requestedStorage === 'sessionStorage') &&\n typeof console !== 'undefined'\n ) {\n const suffix = this.allowWebStorage\n ? ''\n : ' (web storage disabled by default; set allowWebStorage=true to enable)';\n\n console.warn(\n '[cedros-login] SECURITY: Using web storage for token storage. ' +\n 'Tokens are vulnerable to XSS attacks.' +\n suffix +\n ' PRODUCTION RECOMMENDATIONS: (1) Use httpOnly cookie storage instead, ' +\n '(2) If web storage required: implement strict Content-Security-Policy, ' +\n 'sanitize all input/output, audit third-party scripts. ' +\n 'See https://owasp.org/www-community/attacks/xss/'\n );\n }\n }\n\n /**\n * Set the callback for when tokens need to be refreshed\n */\n setRefreshCallback(callback: () => Promise<void>): void {\n this.onRefreshNeeded = callback;\n this.scheduleRefresh();\n }\n\n /**\n * Set the callback for when session expires\n */\n setSessionExpiredCallback(callback: () => void): void {\n this.onSessionExpired = callback;\n }\n\n /**\n * Set the callback for when token refresh fails\n * This allows the UI to show an error message to the user\n */\n setRefreshErrorCallback(callback: (error: Error) => void): void {\n this.onRefreshError = callback;\n }\n\n /**\n * Store tokens and schedule auto-refresh\n */\n setTokens(tokens: TokenPair): void {\n this.tokens = tokens;\n this.expiresAt = Date.now() + tokens.expiresIn * 1000;\n this.saveToStorage();\n this.scheduleRefresh();\n }\n\n /**\n * Get the current access token\n * UI-4 FIX: Store token in local variable before expiry check to eliminate TOCTOU race.\n * UI-TOK-01 FIX: Check isDestroyed to prevent access after manager is cleaned up.\n */\n getAccessToken(): string | null {\n // UI-TOK-01: Prevent token access after destruction\n if (this.isDestroyed) return null;\n const token = this.tokens?.accessToken;\n if (!token) return null;\n if (Date.now() >= this.expiresAt) {\n // Token expired, clear and notify\n this.clear();\n this.onSessionExpired?.();\n return null;\n }\n return token;\n }\n\n /**\n * Get the current refresh token\n */\n getRefreshToken(): string | null {\n return this.tokens?.refreshToken ?? null;\n }\n\n /**\n * Clear stored tokens\n */\n clear(): void {\n this.tokens = null;\n this.expiresAt = 0;\n this.cancelRefresh();\n this.clearStorage();\n }\n\n /**\n * Check if tokens are stored\n */\n hasTokens(): boolean {\n return this.tokens !== null && Date.now() < this.expiresAt;\n }\n\n /**\n * Destroy the token manager and clean up resources.\n * Call this when unmounting components or cleaning up to prevent memory leaks.\n * P-02: Also sets isDestroyed flag to prevent timer callbacks from executing.\n */\n destroy(): void {\n this.isDestroyed = true;\n this.cancelRefresh();\n this.onRefreshNeeded = null;\n this.onSessionExpired = null;\n this.onRefreshError = null;\n this.tokens = null;\n }\n\n /**\n * Get time until token expiry in ms\n */\n getTimeUntilExpiry(): number {\n if (!this.tokens) return 0;\n return Math.max(0, this.expiresAt - Date.now());\n }\n\n private scheduleRefresh(): void {\n this.cancelRefresh();\n\n if (!this.tokens || !this.onRefreshNeeded) return;\n\n const timeUntilExpiry = this.getTimeUntilExpiry();\n const refreshIn = Math.max(0, timeUntilExpiry - REFRESH_BUFFER_MS);\n\n if (refreshIn <= 0) {\n // Token is about to expire or expired, refresh immediately\n // P-02: Check if destroyed before executing\n if (this.isDestroyed) return;\n this.onRefreshNeeded().catch((err) => {\n if (this.isDestroyed) return;\n const error = err instanceof Error ? err : new Error('Token refresh failed');\n this.onRefreshError?.(error);\n this.clear();\n this.onSessionExpired?.();\n });\n return;\n }\n\n this.refreshTimer = setTimeout(() => {\n // P-02: Check if destroyed before executing timer callback\n if (this.isDestroyed) return;\n this.onRefreshNeeded?.().catch((err) => {\n if (this.isDestroyed) return;\n const error = err instanceof Error ? err : new Error('Token refresh failed');\n this.onRefreshError?.(error);\n this.clear();\n this.onSessionExpired?.();\n });\n }, refreshIn);\n }\n\n private cancelRefresh(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n private loadFromStorage(): void {\n if (this.storage === 'memory') return;\n if (typeof window === 'undefined') return;\n\n // SEC-04: Web storage is an explicit opt-in. If not enabled, treat this as\n // memory storage and do not read persisted tokens.\n if (\n !this.allowWebStorage &&\n (this.storage === 'localStorage' || this.storage === 'sessionStorage')\n ) {\n return;\n }\n\n try {\n if (this.storage === 'localStorage' || this.storage === 'sessionStorage') {\n const storage = this.storage === 'localStorage' ? localStorage : sessionStorage;\n const data = storage.getItem(this.storageKey);\n if (data) {\n const parsed = JSON.parse(data) as unknown;\n if (this.isValidStoredTokenData(parsed)) {\n if (parsed.expiresAt > Date.now()) {\n this.tokens = parsed.tokens;\n this.expiresAt = parsed.expiresAt;\n } else {\n storage.removeItem(this.storageKey);\n }\n } else {\n // Invalid data structure, clear it\n storage.removeItem(this.storageKey);\n }\n }\n }\n // Cookie storage is handled by the server\n } catch {\n // Ignore storage errors, clear corrupted data\n if (this.storage === 'localStorage' || this.storage === 'sessionStorage') {\n const storage = this.storage === 'localStorage' ? localStorage : sessionStorage;\n try {\n storage.removeItem(this.storageKey);\n } catch {\n // Ignore\n }\n }\n }\n }\n\n /**\n * Validate that parsed data matches expected StoredTokenData structure\n */\n private isValidStoredTokenData(data: unknown): data is StoredTokenData {\n if (typeof data !== 'object' || data === null) return false;\n\n const obj = data as Record<string, unknown>;\n\n if (typeof obj.expiresAt !== 'number') return false;\n if (typeof obj.tokens !== 'object' || obj.tokens === null) return false;\n\n const tokens = obj.tokens as Record<string, unknown>;\n if (typeof tokens.accessToken !== 'string') return false;\n if (typeof tokens.refreshToken !== 'string') return false;\n if (typeof tokens.expiresIn !== 'number') return false;\n\n return true;\n }\n\n private saveToStorage(): void {\n if (this.storage === 'memory' || !this.tokens) return;\n if (typeof window === 'undefined') return;\n\n // SEC-04: Web storage is an explicit opt-in.\n if (\n !this.allowWebStorage &&\n (this.storage === 'localStorage' || this.storage === 'sessionStorage')\n ) {\n return;\n }\n\n try {\n if (this.storage === 'localStorage' || this.storage === 'sessionStorage') {\n const storage = this.storage === 'localStorage' ? localStorage : sessionStorage;\n const data: StoredTokenData = {\n tokens: this.tokens,\n expiresAt: this.expiresAt,\n };\n storage.setItem(this.storageKey, JSON.stringify(data));\n }\n // Cookie storage is handled by the server\n } catch {\n // Ignore storage errors\n }\n }\n\n private clearStorage(): void {\n if (this.storage === 'memory') return;\n if (typeof window === 'undefined') return;\n\n // SEC-04: If web storage isn't allowed, we should not mutate it either.\n if (\n !this.allowWebStorage &&\n (this.storage === 'localStorage' || this.storage === 'sessionStorage')\n ) {\n return;\n }\n\n try {\n if (this.storage === 'localStorage' || this.storage === 'sessionStorage') {\n const storage = this.storage === 'localStorage' ? localStorage : sessionStorage;\n storage.removeItem(this.storageKey);\n }\n // Cookie storage is handled by the server\n } catch {\n // Ignore storage errors\n }\n }\n}\n","import type { AuthUser } from '../types';\n\nconst CHANNEL_NAME = 'cedros_auth_sync';\n\ntype AuthSyncEvent = { type: 'login'; user: AuthUser } | { type: 'logout' } | { type: 'refresh' };\n\ntype AuthSyncCallback = (event: AuthSyncEvent) => void;\n\n/**\n * Cross-tab synchronization for auth state using BroadcastChannel\n * UI-6 FIX: Use addEventListener/removeEventListener for proper cleanup.\n */\nexport class TabSync {\n private channel: BroadcastChannel | null = null;\n private callback: AuthSyncCallback | null = null;\n private boundHandler: ((event: MessageEvent<AuthSyncEvent>) => void) | null = null;\n\n constructor() {\n if (typeof window !== 'undefined' && 'BroadcastChannel' in window) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n // UI-6: Store bound handler reference for proper removal\n this.boundHandler = this.handleMessage.bind(this);\n this.channel.addEventListener('message', this.boundHandler);\n }\n }\n\n /**\n * Handle incoming sync messages\n */\n private handleMessage(event: MessageEvent<AuthSyncEvent>): void {\n this.callback?.(event.data);\n }\n\n /**\n * Set the callback for sync events from other tabs\n */\n setCallback(callback: AuthSyncCallback): void {\n this.callback = callback;\n }\n\n /**\n * Broadcast login event to other tabs\n */\n broadcastLogin(user: AuthUser): void {\n this.channel?.postMessage({ type: 'login', user });\n }\n\n /**\n * Broadcast logout event to other tabs\n */\n broadcastLogout(): void {\n this.channel?.postMessage({ type: 'logout' });\n }\n\n /**\n * Broadcast token refresh event to other tabs\n */\n broadcastRefresh(): void {\n this.channel?.postMessage({ type: 'refresh' });\n }\n\n /**\n * Close the channel and clean up references\n * UI-6: Use removeEventListener for proper cleanup\n */\n close(): void {\n if (this.channel) {\n if (this.boundHandler) {\n this.channel.removeEventListener('message', this.boundHandler);\n this.boundHandler = null;\n }\n this.channel.close();\n this.channel = null;\n }\n this.callback = null;\n }\n}\n","// UI-CSRF: Minimum CSRF token length to prevent weak/trivial tokens\nconst MIN_CSRF_TOKEN_LENGTH = 20;\n\nexport function getCsrfToken(): string | null {\n if (typeof document === 'undefined') return null;\n\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\n if (metaTag) {\n const content = metaTag.getAttribute('content');\n // UI-CSRF: Reject weak tokens\n if (content && content.length >= MIN_CSRF_TOKEN_LENGTH) {\n return content;\n }\n }\n\n // UI-2 FIX: Use case-insensitive comparison for cookie names.\n // Server may set cookie with different casing (XSRF-TOKEN, xsrf-token, etc.)\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [name, ...rest] = cookie.trim().split('=');\n const value = rest.join('=');\n const nameLower = name.toLowerCase();\n if (nameLower === 'xsrf-token' || nameLower === 'csrf-token') {\n try {\n const decoded = decodeURIComponent(value.trim());\n // UI-CSRF: Reject weak tokens\n if (decoded.length >= MIN_CSRF_TOKEN_LENGTH) {\n return decoded;\n }\n } catch {\n // Malformed URL-encoded value - skip this cookie\n continue;\n }\n }\n }\n\n return null;\n}\n","import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport type { AuthUser, AuthState, TokenPair, SessionConfig, AuthCallbacks } from '../types';\nimport { TokenManager } from '../utils/tokenManager';\nimport { TabSync } from '../utils/tabSync';\nimport { getCsrfToken } from '../utils/csrf';\n\nexport interface UseAuthSessionOptions {\n serverUrl: string;\n session?: SessionConfig;\n callbacks?: AuthCallbacks;\n requestTimeoutMs?: number;\n}\n\nexport interface UseAuthSessionReturn {\n user: AuthUser | null;\n authState: AuthState;\n handleLoginSuccess: (user: AuthUser, tokens?: TokenPair) => void;\n logout: () => Promise<void>;\n refreshUser: () => Promise<void>;\n getAccessToken: () => string | null;\n}\n\n/**\n * UI-5 FIX: Type guard to validate user response from server.\n * Ensures data.user exists and has required fields before setting state.\n */\nfunction isValidUserResponse(data: unknown): data is { user: AuthUser } {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n if (typeof obj.user !== 'object' || obj.user === null) return false;\n const user = obj.user as Record<string, unknown>;\n // Validate required fields exist\n return typeof user.id === 'string' && user.id.length > 0;\n}\n\n/**\n * UI-RESP: Type guard to validate token response from refresh endpoint.\n * Ensures tokens object has required fields before storing.\n */\nfunction isValidTokenResponse(tokens: unknown): tokens is TokenPair {\n if (typeof tokens !== 'object' || tokens === null) return false;\n const obj = tokens as Record<string, unknown>;\n return (\n typeof obj.accessToken === 'string' &&\n obj.accessToken.length > 0 &&\n typeof obj.refreshToken === 'string' &&\n obj.refreshToken.length > 0 &&\n typeof obj.expiresIn === 'number' &&\n obj.expiresIn > 0\n );\n}\n\n/**\n * Hook that manages authentication session state, token refresh, and tab sync.\n */\nexport function useAuthSession({\n serverUrl,\n session,\n callbacks,\n requestTimeoutMs,\n}: UseAuthSessionOptions): UseAuthSessionReturn {\n const [user, setUser] = useState<AuthUser | null>(null);\n const [authState, setAuthState] = useState<AuthState>('idle');\n\n const tokenManagerRef = useRef<TokenManager | null>(null);\n const tabSyncRef = useRef<TabSync | null>(null);\n const callbacksRef = useRef(callbacks);\n const isMountedRef = useRef(true);\n const refreshInFlightRef = useRef<Promise<void> | null>(null);\n\n // Keep callbacks ref in sync\n useEffect(() => {\n callbacksRef.current = callbacks;\n }, [callbacks]);\n\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n\n const setUserIfMounted = useCallback((nextUser: AuthUser | null) => {\n if (isMountedRef.current) {\n setUser(nextUser);\n }\n }, []);\n\n const setAuthStateIfMounted = useCallback((nextState: AuthState) => {\n if (isMountedRef.current) {\n setAuthState(nextState);\n }\n }, []);\n\n // Memoize session config to prevent unnecessary effect reruns\n const sessionConfig = useMemo(\n () => ({\n storage: session?.storage ?? 'cookie',\n autoRefresh: session?.autoRefresh ?? true,\n syncTabs: session?.syncTabs ?? true,\n persistKey: session?.persistKey,\n allowWebStorage: session?.allowWebStorage ?? false,\n }),\n [\n session?.storage,\n session?.autoRefresh,\n session?.syncTabs,\n session?.persistKey,\n session?.allowWebStorage,\n ]\n );\n\n // Initialize managers on mount\n useEffect(() => {\n tokenManagerRef.current = new TokenManager(sessionConfig.storage, sessionConfig.persistKey, {\n allowWebStorage: sessionConfig.allowWebStorage,\n });\n\n if (sessionConfig.syncTabs) {\n tabSyncRef.current = new TabSync();\n }\n\n return () => {\n tokenManagerRef.current?.destroy();\n tokenManagerRef.current = null;\n tabSyncRef.current?.close();\n };\n }, [\n sessionConfig.storage,\n sessionConfig.syncTabs,\n sessionConfig.persistKey,\n sessionConfig.allowWebStorage,\n ]);\n\n // Token refresh function\n const refreshTokens = useCallback(async (): Promise<void> => {\n // UI-RACE: Check for in-flight request first\n if (refreshInFlightRef.current) {\n return refreshInFlightRef.current;\n }\n\n const refreshToken = tokenManagerRef.current?.getRefreshToken();\n const hasRefreshToken = Boolean(refreshToken);\n const csrfToken = getCsrfToken();\n const headers: Record<string, string> = {};\n\n if (hasRefreshToken) {\n headers['Content-Type'] = 'application/json';\n }\n if (csrfToken) {\n headers['X-CSRF-Token'] = csrfToken;\n }\n\n // UI-RACE FIX: Create the promise and assign ref synchronously before any await.\n // The IIFE executes synchronously until its first internal await, but the ref\n // must be set immediately to prevent concurrent calls from passing the check.\n const refreshPromise = (async () => {\n const controller = new AbortController();\n const timeoutMs = requestTimeoutMs ?? 10_000;\n const timeoutId = window.setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(`${serverUrl}/refresh`, {\n method: 'POST',\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n credentials: 'include',\n body: hasRefreshToken ? JSON.stringify({ refreshToken }) : undefined,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error('Token refresh failed');\n }\n\n const data = await response.json();\n // UI-RESP: Validate token structure before storing\n if (data.tokens) {\n if (!isValidTokenResponse(data.tokens)) {\n throw new Error('Invalid token response structure');\n }\n tokenManagerRef.current?.setTokens(data.tokens);\n } else if (sessionConfig.storage !== 'cookie') {\n throw new Error('Token refresh failed');\n }\n tabSyncRef.current?.broadcastRefresh();\n } finally {\n window.clearTimeout(timeoutId);\n }\n })();\n\n // UI-RACE: Assign synchronously right after promise creation - this is safe\n // because JavaScript runs synchronously until we await refreshPromise below.\n refreshInFlightRef.current = refreshPromise;\n\n try {\n await refreshPromise;\n } finally {\n refreshInFlightRef.current = null;\n }\n }, [serverUrl, sessionConfig.storage, requestTimeoutMs]);\n\n const getAuthHeaders = useCallback((): Record<string, string> | undefined => {\n if (sessionConfig.storage === 'cookie') return undefined;\n const accessToken = tokenManagerRef.current?.getAccessToken();\n if (!accessToken) return undefined;\n return { Authorization: `Bearer ${accessToken}` };\n }, [sessionConfig.storage]);\n\n // Handle session expiry\n const handleSessionExpired = useCallback(() => {\n tokenManagerRef.current?.clear();\n setUserIfMounted(null);\n setAuthStateIfMounted('unauthenticated');\n callbacksRef.current?.onSessionExpired?.();\n }, [setAuthStateIfMounted, setUserIfMounted]);\n\n // Setup token manager callbacks\n useEffect(() => {\n if (!tokenManagerRef.current) return;\n\n if (sessionConfig.autoRefresh) {\n tokenManagerRef.current.setRefreshCallback(refreshTokens);\n }\n tokenManagerRef.current.setSessionExpiredCallback(handleSessionExpired);\n }, [sessionConfig.autoRefresh, refreshTokens, handleSessionExpired]);\n\n // Refresh user data from server\n const refreshUser = useCallback(async () => {\n try {\n const response = await fetch(`${serverUrl}/user`, {\n credentials: 'include',\n headers: getAuthHeaders(),\n });\n\n if (response.ok) {\n const data = await response.json();\n if (isValidUserResponse(data)) {\n setUserIfMounted(data.user);\n setAuthStateIfMounted('authenticated');\n return;\n }\n }\n\n if (response.status === 401 && sessionConfig.autoRefresh) {\n try {\n await refreshTokens();\n } catch {\n handleSessionExpired();\n return;\n }\n const retryResponse = await fetch(`${serverUrl}/user`, {\n credentials: 'include',\n headers: getAuthHeaders(),\n });\n if (retryResponse.ok) {\n const data = await retryResponse.json();\n if (isValidUserResponse(data)) {\n setUserIfMounted(data.user);\n setAuthStateIfMounted('authenticated');\n return;\n }\n }\n }\n\n setUserIfMounted(null);\n setAuthStateIfMounted('unauthenticated');\n } catch {\n // Keep current state on error\n }\n }, [\n serverUrl,\n sessionConfig.autoRefresh,\n refreshTokens,\n getAuthHeaders,\n handleSessionExpired,\n setAuthStateIfMounted,\n setUserIfMounted,\n ]);\n\n // Setup tab sync callbacks\n useEffect(() => {\n if (!tabSyncRef.current || !sessionConfig.syncTabs) return;\n\n tabSyncRef.current.setCallback((event) => {\n switch (event.type) {\n case 'login':\n setUserIfMounted(event.user);\n setAuthStateIfMounted('authenticated');\n break;\n case 'logout':\n setUserIfMounted(null);\n setAuthStateIfMounted('unauthenticated');\n tokenManagerRef.current?.clear();\n break;\n case 'refresh':\n refreshUser();\n break;\n default: {\n // Exhaustiveness check - TypeScript will error if a new event type is added\n const _exhaustiveCheck: never = event;\n console.warn('[Cedros Login] Unhandled tab sync event:', _exhaustiveCheck);\n }\n }\n });\n }, [sessionConfig.syncTabs, refreshUser, setAuthStateIfMounted, setUserIfMounted]);\n\n // Check for existing session on mount\n useEffect(() => {\n const controller = new AbortController();\n // UI-TIMEOUT: Add timeout to session check fetch (default 10s, same as refresh)\n const timeoutMs = requestTimeoutMs ?? 10_000;\n const timeoutId = window.setTimeout(() => controller.abort(), timeoutMs);\n\n const checkSession = async () => {\n setAuthStateIfMounted('loading');\n try {\n const response = await fetch(`${serverUrl}/user`, {\n credentials: 'include',\n headers: getAuthHeaders(),\n signal: controller.signal,\n });\n\n if (response.ok) {\n const data = await response.json();\n if (isValidUserResponse(data)) {\n setUserIfMounted(data.user);\n setAuthStateIfMounted('authenticated');\n return;\n }\n }\n\n if (response.status === 401 && sessionConfig.autoRefresh) {\n try {\n await refreshTokens();\n } catch {\n handleSessionExpired();\n return;\n }\n const retryResponse = await fetch(`${serverUrl}/user`, {\n credentials: 'include',\n headers: getAuthHeaders(),\n signal: controller.signal,\n });\n if (retryResponse.ok) {\n const data = await retryResponse.json();\n if (isValidUserResponse(data)) {\n setUserIfMounted(data.user);\n setAuthStateIfMounted('authenticated');\n return;\n }\n }\n }\n\n setUserIfMounted(null);\n setAuthStateIfMounted('unauthenticated');\n } catch {\n setUserIfMounted(null);\n setAuthStateIfMounted('unauthenticated');\n }\n };\n\n checkSession();\n return () => {\n window.clearTimeout(timeoutId);\n controller.abort();\n };\n }, [\n serverUrl,\n sessionConfig.autoRefresh,\n refreshTokens,\n getAuthHeaders,\n handleSessionExpired,\n setAuthStateIfMounted,\n setUserIfMounted,\n requestTimeoutMs,\n ]);\n\n // Handle successful login\n const handleLoginSuccess = useCallback(\n (authUser: AuthUser, tokens?: TokenPair) => {\n // UI-01: Use mounted-safe setters to prevent state updates after unmount\n setUserIfMounted(authUser);\n setAuthStateIfMounted('authenticated');\n if (tokens) {\n tokenManagerRef.current?.setTokens(tokens);\n }\n // M-05: Guard broadcast with mounted check to avoid calling closed TabSync\n if (isMountedRef.current) {\n tabSyncRef.current?.broadcastLogin(authUser);\n }\n },\n [setUserIfMounted, setAuthStateIfMounted]\n );\n\n // Logout function\n const logout = useCallback(async () => {\n const csrfToken = getCsrfToken();\n try {\n await fetch(`${serverUrl}/logout`, {\n method: 'POST',\n headers: {\n ...(csrfToken ? { 'X-CSRF-Token': csrfToken } : {}),\n ...(getAuthHeaders() ?? {}),\n },\n credentials: 'include',\n });\n } catch {\n // Ignore logout errors\n } finally {\n // UI-01: Use mounted-safe setters to prevent state updates after unmount\n setUserIfMounted(null);\n setAuthStateIfMounted('unauthenticated');\n tokenManagerRef.current?.clear();\n tabSyncRef.current?.broadcastLogout();\n callbacksRef.current?.onLogout?.();\n }\n }, [serverUrl, getAuthHeaders, setUserIfMounted, setAuthStateIfMounted]);\n\n // Get access token\n const getAccessToken = useCallback(() => {\n return tokenManagerRef.current?.getAccessToken() ?? null;\n }, []);\n\n return {\n user,\n authState,\n handleLoginSuccess,\n logout,\n refreshUser,\n getAccessToken,\n };\n}\n","import { useContext } from 'react';\nimport { CedrosLoginContext, type CedrosLoginContextValue } from './CedrosLoginContext';\n\n/**\n * Hook to access the Cedros Login context.\n * Must be used within a CedrosLoginProvider.\n */\nexport function useCedrosLogin(): CedrosLoginContextValue {\n const context = useContext(CedrosLoginContext);\n if (!context) {\n throw new Error('useCedrosLogin must be used within a CedrosLoginProvider');\n }\n return context;\n}\n\n/**\n * Optional version of useCedrosLogin that returns null instead of throwing\n * when used outside a CedrosLoginProvider. Useful for components that need\n * to work in both provider and non-provider contexts (e.g., Storybook demos).\n */\nexport function useCedrosLoginOptional(): CedrosLoginContextValue | null {\n return useContext(CedrosLoginContext);\n}\n","/**\n * Cryptographic type definitions for SSS wallet implementation\n *\n * Security: These types define the structure for client-side key material.\n * The server never receives plaintext seeds or derived keys.\n */\n\n/** 16-byte seed for wallet derivation (128 bits, standard Solana format) */\nexport type Seed = Uint8Array & { readonly _brand: 'Seed' };\n\n/** 16-byte Shamir share (128 bits) */\nexport type ShamirShare = Uint8Array & { readonly _brand: 'ShamirShare' };\n\n/** 32-byte encryption key */\nexport type EncryptionKey = Uint8Array & { readonly _brand: 'EncryptionKey' };\n\n/** 12-byte AES-GCM nonce */\nexport type AesNonce = Uint8Array & { readonly _brand: 'AesNonce' };\n\n/** 16+ byte Argon2 salt */\nexport type Argon2Salt = Uint8Array & { readonly _brand: 'Argon2Salt' };\n\n/** 32-byte PRF salt */\nexport type PrfSalt = Uint8Array & { readonly _brand: 'PrfSalt' };\n\n/** Argon2id KDF parameters (OWASP recommended) */\nexport interface KdfParams {\n /** Memory cost in KiB (default: 19456 = 19 MiB) */\n mCost: number;\n /** Time cost / iterations (default: 2) */\n tCost: number;\n /** Parallelism (default: 1) */\n pCost: number;\n}\n\n/** Default OWASP-recommended Argon2id parameters */\nexport const DEFAULT_KDF_PARAMS: KdfParams = {\n mCost: 19456, // 19 MiB\n tCost: 2,\n pCost: 1,\n};\n\n/** Encrypted data with nonce for AES-GCM */\nexport interface EncryptedData {\n /** Base64-encoded ciphertext */\n ciphertext: string;\n /** Base64-encoded 12-byte nonce */\n nonce: string;\n}\n\n/** Enrollment flow state */\nexport type EnrollmentStep =\n | 'idle'\n | 'generating_seed'\n | 'splitting_shares'\n | 'encrypting_shares'\n | 'registering_passkey'\n | 'uploading'\n | 'showing_recovery'\n | 'complete'\n | 'error';\n\n/** Enrollment flow state machine */\nexport interface EnrollmentState {\n step: EnrollmentStep;\n error?: string;\n /** BIP-39 mnemonic words (only during showing_recovery step) */\n recoveryPhrase?: string[];\n /** Solana public key (after complete) */\n solanaPubkey?: string;\n}\n\n/** Recovery flow state */\nexport type RecoveryStep =\n | 'idle'\n | 'entering_phrase'\n | 'validating'\n | 'prompting_password'\n | 'registering_passkey'\n | 'encrypting'\n | 'uploading'\n | 'complete'\n | 'error';\n\n/** Recovery flow state machine */\nexport interface RecoveryState {\n step: RecoveryStep;\n error?: string;\n /**\n * New recovery phrase (12 words) shown ONLY on successful completion.\n * SECURITY: Must be displayed to user immediately and never logged.\n * User should write down and securely store this phrase.\n */\n recoveryPhrase?: string[];\n}\n\n/** Crypto capability detection results */\nexport interface CryptoCapabilities {\n /** WebCrypto API available */\n webCrypto: boolean;\n /** AES-GCM supported */\n aesGcm: boolean;\n /** HKDF supported */\n hkdf: boolean;\n /** Ed25519 signing supported */\n ed25519: boolean;\n /** WebAuthn available */\n webAuthn: boolean;\n /** WebAuthn PRF extension supported */\n webAuthnPrf: boolean;\n /** Argon2 WASM can be loaded */\n argon2: boolean;\n /** All required capabilities available */\n allSupported: boolean;\n}\n\n/** Wallet status */\nexport type WalletStatus =\n | 'loading'\n | 'not_enrolled'\n | 'enrolled_locked'\n | 'enrolled_unlocked'\n | 'unlocked'\n | 'error';\n\n/** Type guard: verify Seed length (16 bytes) */\nexport function isSeed(data: Uint8Array): data is Seed {\n return data.length === 16;\n}\n\n/** Type guard: verify ShamirShare is valid\n * CRYPTO-4: Improved validation to check secrets.js format markers.\n * secrets.js produces shares with format: {bits}{id}{data}\n *\n * Note: BIP-39 mnemonic system stores 16-byte entropy without secrets.js\n * metadata, so we also accept exactly 16-byte arrays for compatibility.\n */\nexport function isShamirShare(data: Uint8Array): data is ShamirShare {\n // Accept 16-byte arrays (used by BIP-39 mnemonic system for Share C)\n if (data.length === 16) return true;\n\n // For secrets.js shares with metadata (>16 bytes)\n if (data.length < 18) return false;\n\n // CRYPTO-4: Check for secrets.js 8-bit mode marker\n // When hex share starts with \"80\", first byte after hex decode is 0x80\n const firstByte = data[0];\n if (firstByte !== 0x80 && firstByte !== 0x08) return false;\n\n return true;\n}\n\n/** Type guard: verify EncryptionKey length */\nexport function isEncryptionKey(data: Uint8Array): data is EncryptionKey {\n return data.length === 32;\n}\n\n/** Type guard: verify AesNonce length */\nexport function isAesNonce(data: Uint8Array): data is AesNonce {\n return data.length === 12;\n}\n\n/** Type guard: verify Argon2Salt length (16+ bytes) */\nexport function isArgon2Salt(data: Uint8Array): data is Argon2Salt {\n return data.length >= 16;\n}\n\n/** Type guard: verify PrfSalt length */\nexport function isPrfSalt(data: Uint8Array): data is PrfSalt {\n return data.length === 32;\n}\n\n/** Create branded Seed from Uint8Array (throws if invalid) */\nexport function toSeed(data: Uint8Array): Seed {\n if (!isSeed(data)) {\n throw new Error(`Invalid seed length: expected 16, got ${data.length}`);\n }\n return data as Seed;\n}\n\n/** Create branded ShamirShare from Uint8Array (throws if invalid) */\nexport function toShamirShare(data: Uint8Array): ShamirShare {\n if (!isShamirShare(data)) {\n throw new Error(`Invalid share length: expected >=16, got ${data.length}`);\n }\n return data as ShamirShare;\n}\n\n/** Create branded EncryptionKey from Uint8Array (throws if invalid) */\nexport function toEncryptionKey(data: Uint8Array): EncryptionKey {\n if (!isEncryptionKey(data)) {\n throw new Error(`Invalid key length: expected 32, got ${data.length}`);\n }\n return data as EncryptionKey;\n}\n\n/** Create branded AesNonce from Uint8Array (throws if invalid) */\nexport function toAesNonce(data: Uint8Array): AesNonce {\n if (!isAesNonce(data)) {\n throw new Error(`Invalid nonce length: expected 12, got ${data.length}`);\n }\n return data as AesNonce;\n}\n\n/** Create branded Argon2Salt from Uint8Array (throws if invalid) */\nexport function toArgon2Salt(data: Uint8Array): Argon2Salt {\n if (!isArgon2Salt(data)) {\n throw new Error(`Invalid salt length: expected >=16, got ${data.length}`);\n }\n return data as Argon2Salt;\n}\n\n/** Create branded PrfSalt from Uint8Array (throws if invalid) */\nexport function toPrfSalt(data: Uint8Array): PrfSalt {\n if (!isPrfSalt(data)) {\n throw new Error(`Invalid PRF salt length: expected 32, got ${data.length}`);\n }\n return data as PrfSalt;\n}\n\n/**\n * Cast branded Uint8Array types to BufferSource for Web Crypto API compatibility.\n *\n * Web Crypto APIs (importKey, encrypt, decrypt, etc.) expect BufferSource which only\n * accepts plain Uint8Array with ArrayBuffer (not ArrayBufferLike), not our branded types.\n * This function returns a new Uint8Array backed by a plain ArrayBuffer to satisfy the type.\n *\n * @param data - Any branded Uint8Array type (Seed, EncryptionKey, AesNonce, etc.)\n * @returns BufferSource suitable for Web Crypto APIs\n */\nexport function toBufferSource<T extends Uint8Array>(data: T): BufferSource {\n // Create a new Uint8Array backed by a plain ArrayBuffer to satisfy TypeScript's\n // strict BufferSource type which doesn't accept ArrayBufferLike\n return new Uint8Array(data) as BufferSource;\n}\n","/**\n * Secure entropy generation using Web Crypto API\n *\n * Security: Uses crypto.getRandomValues() for cryptographically secure\n * random number generation. This is the only source of entropy for\n * wallet seed generation.\n */\n\nimport {\n type Seed,\n type AesNonce,\n type Argon2Salt,\n type PrfSalt,\n toSeed,\n toAesNonce,\n toArgon2Salt,\n toPrfSalt,\n} from './types';\n\n/**\n * Get cryptographically secure random bytes\n *\n * @param length - Number of bytes to generate\n * @returns Random bytes\n * @throws Error if WebCrypto is not available\n */\nexport function getRandomBytes(length: number): Uint8Array {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error(\n 'WebCrypto API not available. Secure random generation requires a modern browser.'\n );\n }\n\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n return bytes;\n}\n\n/**\n * Generate a cryptographically secure 16-byte seed for wallet derivation\n *\n * Note: 16 bytes (128 bits) matches standard Solana wallet format.\n *\n * @returns 16-byte seed\n * @throws Error if WebCrypto is not available\n */\nexport function generateSeed(): Seed {\n return toSeed(getRandomBytes(16));\n}\n\n/**\n * Generate a 12-byte nonce for AES-GCM encryption\n *\n * Security: AES-GCM requires a unique nonce per encryption with the same key.\n * Using random nonces is safe for reasonable message counts (< 2^32).\n *\n * CRYPTO-03: For high-volume encryption scenarios (>2^30 messages with same key),\n * the birthday bound risk of nonce collision increases. Recommendations:\n * 1. Rotate encryption keys periodically (e.g., every 2^20 encryptions)\n * 2. Use counter-based nonces instead of random for sequential encryption\n * 3. Monitor encryption count and trigger re-keying before limits are reached\n *\n * For typical wallet use cases (encrypting seed once), random nonces are safe.\n *\n * @returns 12-byte nonce\n * @throws Error if WebCrypto is not available\n */\nexport function generateNonce(): AesNonce {\n return toAesNonce(getRandomBytes(12));\n}\n\n/**\n * Generate a 16-byte salt for Argon2id KDF\n *\n * Security: Salt must be unique per user/password combination.\n * 16 bytes provides sufficient uniqueness.\n *\n * @returns 16-byte salt\n * @throws Error if WebCrypto is not available\n */\nexport function generateArgon2Salt(): Argon2Salt {\n return toArgon2Salt(getRandomBytes(16));\n}\n\n/**\n * Generate a 32-byte salt for WebAuthn PRF extension\n *\n * Security: PRF salt is used as input to the PRF to derive unique\n * per-credential keys. Must be stored alongside encrypted share.\n *\n * @returns 32-byte PRF salt\n * @throws Error if WebCrypto is not available\n */\nexport function generatePrfSalt(): PrfSalt {\n return toPrfSalt(getRandomBytes(32));\n}\n","/**\n * Secure memory wiping utilities\n *\n * Security: JavaScript does not guarantee memory clearing due to GC and\n * JIT optimization. These functions provide best-effort clearing of\n * sensitive data. For truly sensitive operations, consider using\n * WebAssembly with explicit memory management.\n *\n * IMPORTANT - String vs Uint8Array:\n * - Uint8Array CAN be wiped (wipeBytes) - use for keys, seeds, passwords\n * - Strings CANNOT be wiped in JavaScript - they are immutable\n * - Always prefer Uint8Array for sensitive cryptographic material\n *\n * Best practices:\n * - Call wipe functions as soon as sensitive data is no longer needed\n * - Use try/finally blocks to ensure wiping on errors\n * - Keep sensitive data lifetime as short as possible\n * - Convert sensitive strings to Uint8Array immediately, wipe after use\n */\n\n/**\n * Best-effort wipe of a Uint8Array by zeroing all bytes\n *\n * Warning: JavaScript JIT may optimize away this operation. This provides\n * defense-in-depth but is not a guarantee against memory inspection.\n *\n * @param data - Array to wipe\n */\nexport function wipeBytes(data: Uint8Array): void {\n if (!data || data.length === 0) return;\n\n // Fill with zeros\n data.fill(0);\n\n // Additional pass with random-looking pattern to defeat simple optimizations\n for (let i = 0; i < data.length; i++) {\n data[i] = (i * 0x5a) & 0xff;\n }\n\n // Final zero pass\n data.fill(0);\n}\n\n/**\n * Wipe multiple byte arrays\n *\n * @param arrays - Arrays to wipe\n */\nexport function wipeAll(...arrays: (Uint8Array | undefined | null)[]): void {\n for (const arr of arrays) {\n if (arr) {\n wipeBytes(arr);\n }\n }\n}\n\n/**\n * Execute a function with automatic cleanup of byte arrays\n *\n * @param arrays - Arrays to wipe after function completes\n * @param fn - Function to execute\n * @returns Result of function\n */\nexport async function withSecureCleanup<T>(arrays: Uint8Array[], fn: () => Promise<T>): Promise<T> {\n try {\n return await fn();\n } finally {\n wipeAll(...arrays);\n }\n}\n\n/**\n * Execute a synchronous function with automatic cleanup of byte arrays\n *\n * @param arrays - Arrays to wipe after function completes\n * @param fn - Function to execute\n * @returns Result of function\n */\nexport function withSecureCleanupSync<T>(arrays: Uint8Array[], fn: () => T): T {\n try {\n return fn();\n } finally {\n wipeAll(...arrays);\n }\n}\n\n/**\n * Create a scoped container for sensitive byte data with automatic cleanup\n *\n * Usage:\n * ```typescript\n * const container = createSecureContainer();\n * try {\n * const key = container.track(generateKey());\n * // use key...\n * } finally {\n * container.wipeAll();\n * }\n * ```\n */\nexport function createSecureContainer(): SecureContainer {\n const tracked: Uint8Array[] = [];\n\n return {\n track<T extends Uint8Array>(data: T): T {\n tracked.push(data);\n return data;\n },\n wipeAll(): void {\n for (const arr of tracked) {\n wipeBytes(arr);\n }\n tracked.length = 0;\n },\n };\n}\n\nexport interface SecureContainer {\n /** Track a byte array for later cleanup */\n track<T extends Uint8Array>(data: T): T;\n /** Wipe all tracked arrays */\n wipeAll(): void;\n}\n","/**\n * AES-256-GCM encryption/decryption using Web Crypto API\n *\n * Security:\n * - Uses authenticated encryption (GCM mode provides integrity)\n * - Requires unique 12-byte nonce per encryption with same key\n * - 256-bit key provides strong security margin\n */\n\nimport type { EncryptionKey, AesNonce } from './types';\nimport { toEncryptionKey, toBufferSource } from './types';\nimport { generateNonce } from './entropy';\nimport { wipeBytes } from './secureWipe';\n\n/** Result of AES-GCM encryption */\nexport interface AesGcmEncryptResult {\n /** Ciphertext including authentication tag */\n ciphertext: Uint8Array;\n /** 12-byte nonce used */\n nonce: AesNonce;\n}\n\n/**\n * Import a raw 256-bit key for AES-GCM operations\n *\n * ## PERF-05: Key Caching Opportunity\n *\n * This function is called on every encrypt/decrypt operation. For high-frequency\n * use cases (e.g., bulk encryption in a loop), consider caching the CryptoKey:\n *\n * ```ts\n * const cryptoKey = await importAesKey(key); // cache once\n * for (const item of items) {\n * // reuse cryptoKey for multiple operations\n * }\n * ```\n *\n * Current callers (share encryption, unlock verification) are low-frequency,\n * so caching is not implemented here to avoid added complexity.\n *\n * @param keyBytes - 32-byte raw key material\n * @returns CryptoKey for AES-GCM operations\n * @throws Error if key import fails\n */\nasync function importAesKey(keyBytes: EncryptionKey): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'raw',\n toBufferSource(keyBytes),\n { name: 'AES-GCM', length: 256 },\n false, // not extractable\n ['encrypt', 'decrypt']\n );\n}\n\n/**\n * Encrypt plaintext using AES-256-GCM\n *\n * @param plaintext - Data to encrypt\n * @param key - 32-byte encryption key\n * @param nonce - Optional 12-byte nonce (generated if not provided)\n * @returns Ciphertext and nonce\n * @throws Error if encryption fails\n */\nexport async function aesGcmEncrypt(\n plaintext: Uint8Array,\n key: EncryptionKey,\n nonce?: AesNonce\n): Promise<AesGcmEncryptResult> {\n const iv = nonce ?? generateNonce();\n const cryptoKey = await importAesKey(key);\n\n const ciphertext = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv: toBufferSource(iv) },\n cryptoKey,\n toBufferSource(plaintext)\n );\n\n return {\n ciphertext: new Uint8Array(ciphertext),\n nonce: iv,\n };\n}\n\n/**\n * Decrypt ciphertext using AES-256-GCM\n *\n * @param ciphertext - Data to decrypt (includes auth tag)\n * @param key - 32-byte encryption key\n * @param nonce - 12-byte nonce used during encryption\n * @returns Decrypted plaintext\n * @throws Error if decryption or authentication fails\n */\nexport async function aesGcmDecrypt(\n ciphertext: Uint8Array,\n key: EncryptionKey,\n nonce: AesNonce\n): Promise<Uint8Array> {\n const cryptoKey = await importAesKey(key);\n\n try {\n const plaintext = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv: toBufferSource(nonce) },\n cryptoKey,\n toBufferSource(ciphertext)\n );\n\n return new Uint8Array(plaintext);\n } catch {\n // GCM authentication failure - don't leak details\n throw new Error('Decryption failed: invalid key or corrupted data');\n }\n}\n\n/**\n * Encrypt plaintext and return base64-encoded results\n *\n * @param plaintext - Data to encrypt\n * @param key - 32-byte encryption key\n * @returns Base64-encoded ciphertext and nonce\n */\nexport async function aesGcmEncryptToBase64(\n plaintext: Uint8Array,\n key: EncryptionKey\n): Promise<{ ciphertext: string; nonce: string }> {\n const result = await aesGcmEncrypt(plaintext, key);\n\n return {\n ciphertext: uint8ArrayToBase64(result.ciphertext),\n nonce: uint8ArrayToBase64(result.nonce),\n };\n}\n\n/**\n * Decrypt base64-encoded ciphertext\n *\n * @param ciphertextB64 - Base64-encoded ciphertext\n * @param nonceB64 - Base64-encoded nonce\n * @param key - 32-byte encryption key\n * @returns Decrypted plaintext\n */\nexport async function aesGcmDecryptFromBase64(\n ciphertextB64: string,\n nonceB64: string,\n key: EncryptionKey\n): Promise<Uint8Array> {\n const ciphertext = base64ToUint8Array(ciphertextB64);\n const nonce = base64ToUint8Array(nonceB64);\n\n if (nonce.length !== 12) {\n throw new Error(`Invalid nonce length: expected 12, got ${nonce.length}`);\n }\n\n return aesGcmDecrypt(ciphertext, key, nonce as AesNonce);\n}\n\n/**\n * Encrypt with automatic key derivation from password\n *\n * This is a convenience wrapper that combines Argon2 KDF with AES-GCM.\n * For more control, use argon2 and aesGcmEncrypt separately.\n *\n * @param plaintext - Data to encrypt\n * @param passwordKey - Key derived from password via Argon2\n * @returns Encrypted result with nonce\n */\nexport async function encryptWithPasswordKey(\n plaintext: Uint8Array,\n passwordKey: Uint8Array\n): Promise<AesGcmEncryptResult> {\n if (passwordKey.length !== 32) {\n throw new Error(`Invalid password key length: expected 32, got ${passwordKey.length}`);\n }\n\n return aesGcmEncrypt(plaintext, toEncryptionKey(passwordKey));\n}\n\n/**\n * Decrypt with password-derived key\n *\n * @param ciphertext - Data to decrypt\n * @param nonce - Nonce used during encryption\n * @param passwordKey - Key derived from password via Argon2\n * @returns Decrypted plaintext\n */\nexport async function decryptWithPasswordKey(\n ciphertext: Uint8Array,\n nonce: AesNonce,\n passwordKey: Uint8Array\n): Promise<Uint8Array> {\n if (passwordKey.length !== 32) {\n throw new Error(`Invalid password key length: expected 32, got ${passwordKey.length}`);\n }\n\n return aesGcmDecrypt(ciphertext, toEncryptionKey(passwordKey), nonce);\n}\n\n// --- Base64 utilities ---\n\n/**\n * Convert Uint8Array to base64 string\n *\n * MAINT-01: Uses chunked String.fromCharCode for O(n) performance.\n * Simple concatenation (`binary += char`) would be O(n²).\n */\nexport function uint8ArrayToBase64(bytes: Uint8Array): string {\n // String.fromCharCode has argument limits (~65536), so process in chunks\n const CHUNK_SIZE = 0x8000; // 32KB chunks\n const parts: string[] = [];\n\n for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {\n const chunk = bytes.subarray(i, Math.min(i + CHUNK_SIZE, bytes.length));\n parts.push(String.fromCharCode(...chunk));\n }\n\n return btoa(parts.join(''));\n}\n\n/**\n * Convert base64 string to Uint8Array\n *\n * @throws Error if input is not valid base64\n */\nexport function base64ToUint8Array(base64: string): Uint8Array {\n // M-07: Validate base64 input to provide meaningful error message\n // atob() throws DOMException on invalid input, which is not descriptive\n let binary: string;\n try {\n binary = atob(base64);\n } catch {\n throw new Error('Invalid base64 string: input is malformed or contains invalid characters');\n }\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Encrypt and securely wipe plaintext after encryption\n *\n * @param plaintext - Data to encrypt (will be wiped)\n * @param key - Encryption key\n * @returns Encrypted result\n */\nexport async function encryptAndWipe(\n plaintext: Uint8Array,\n key: EncryptionKey\n): Promise<AesGcmEncryptResult> {\n try {\n return await aesGcmEncrypt(plaintext, key);\n } finally {\n wipeBytes(plaintext);\n }\n}\n","/**\n * HKDF (HMAC-based Key Derivation Function) using Web Crypto API\n *\n * Used to derive encryption keys from WebAuthn PRF output.\n *\n * Security:\n * - RFC 5869 compliant\n * - Uses SHA-256 as underlying hash\n * - Provides cryptographically strong key derivation\n *\n * L-10: Domain Collision Warning\n * =============================\n * The `deriveKeyWithDomain` function constructs info strings using the pattern\n * `cedros-wallet-${domain}`. Callers MUST ensure domain strings are unique across\n * the codebase to prevent accidental key reuse, which would be a serious security issue.\n *\n * Reserved domain prefixes (do not use these patterns elsewhere):\n * - \"share-a-encryption\" - Server-stored encrypted share\n * - \"share-b-encryption\" - Device-stored encrypted share (see deriveKeyFromPrf)\n * - \"signing\" - Transaction signing keys\n * - \"encryption\" - General encryption keys\n *\n * When adding new derivations:\n * 1. Choose a unique, descriptive domain string\n * 2. Add it to the reserved list above\n * 3. Consider using a versioned suffix if the derivation might change (e.g., \"auth-v1\")\n */\n\nimport type { EncryptionKey } from './types';\nimport { toEncryptionKey, toBufferSource } from './types';\n\n/**\n * Derive an encryption key using HKDF-SHA256\n *\n * @param inputKeyMaterial - Raw key material (e.g., from PRF)\n * @param salt - Optional salt (if not provided, uses zero-filled buffer)\n * @param info - Context/application-specific info string\n * @param outputLength - Desired output key length in bytes (default: 32)\n * @returns Derived key\n */\nexport async function hkdfDerive(\n inputKeyMaterial: Uint8Array,\n salt: Uint8Array | undefined,\n info: string,\n outputLength: number = 32\n): Promise<Uint8Array> {\n // Import input key material for HKDF\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n toBufferSource(inputKeyMaterial),\n 'HKDF',\n false,\n ['deriveBits']\n );\n\n // Convert info string to bytes\n const infoBytes = new TextEncoder().encode(info);\n\n // Derive bits using HKDF\n const derivedBits = await crypto.subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: toBufferSource(salt ?? new Uint8Array(32)), // Zero salt if not provided\n info: toBufferSource(infoBytes),\n },\n baseKey,\n outputLength * 8 // bits\n );\n\n return new Uint8Array(derivedBits);\n}\n\n/**\n * Derive a 256-bit encryption key from PRF output\n *\n * @param prfOutput - Output from WebAuthn PRF extension (typically 32 bytes)\n * @param prfSalt - Salt used with PRF (stored with encrypted share)\n * @returns 32-byte encryption key suitable for AES-256-GCM\n */\nexport async function deriveKeyFromPrf(\n prfOutput: Uint8Array,\n prfSalt: Uint8Array\n): Promise<EncryptionKey> {\n const derived = await hkdfDerive(prfOutput, prfSalt, 'cedros-wallet-share-b-encryption', 32);\n\n return toEncryptionKey(derived);\n}\n\n/**\n * Derive a key with domain separation for different purposes\n *\n * @param inputKeyMaterial - Base key material\n * @param domain - Domain separator string (e.g., 'signing', 'encryption')\n * @param salt - Optional salt\n * @returns Derived key\n *\n * @security Domain strings MUST be unique across the codebase. Using the same\n * domain with the same input key material will produce identical keys, which\n * could lead to key reuse vulnerabilities. See module-level docs for reserved domains.\n */\nexport async function deriveKeyWithDomain(\n inputKeyMaterial: Uint8Array,\n domain: string,\n salt?: Uint8Array\n): Promise<Uint8Array> {\n return hkdfDerive(inputKeyMaterial, salt, `cedros-wallet-${domain}`, 32);\n}\n\n/**\n * Check if HKDF is supported in the current environment\n *\n * @returns true if HKDF is available\n */\nexport async function isHkdfSupported(): Promise<boolean> {\n try {\n // Try to import a test key for HKDF\n const testKey = await crypto.subtle.importKey('raw', new Uint8Array(32), 'HKDF', false, [\n 'deriveBits',\n ]);\n\n // Try to derive bits\n await crypto.subtle.deriveBits(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: new Uint8Array(32),\n info: new Uint8Array(0),\n },\n testKey,\n 256\n );\n\n return true;\n } catch {\n return false;\n }\n}\n","/*!\n * hash-wasm (https://www.npmjs.com/package/hash-wasm)\n * (c) Dani Biro\n * @license MIT\n */\n\nvar name$l = \"adler32\";\nvar data$l = \"AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAgUEAQECAgYOAn8BQYCJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEK6wkGBQBBgAkLCgBBAEEBNgKECAvjCAEHf0EAKAKECCIBQf//A3EhAiABQRB2IQMCQAJAIABBAUcNACACQQAtAIAJaiIBQY+AfGogASABQfD/A0sbIgEgA2oiBEEQdCIFQYCAPGogBSAEQfD/A0sbIAFyIQEMAQsCQAJAAkACQAJAIABBEEkNAEGACSEGIABBsCtJDQFBgAkhBgNAQQAhBQNAIAYgBWoiASgCACIEQf8BcSACaiICIANqIAIgBEEIdkH/AXFqIgJqIAIgBEEQdkH/AXFqIgJqIAIgBEEYdmoiAmogAiABQQRqKAIAIgRB/wFxaiICaiACIARBCHZB/wFxaiICaiACIARBEHZB/wFxaiICaiACIARBGHZqIgJqIAIgAUEIaigCACIEQf8BcWoiAmogAiAEQQh2Qf8BcWoiAmogAiAEQRB2Qf8BcWoiAmogAiAEQRh2aiIEaiAEIAFBDGooAgAiAUH/AXFqIgRqIAQgAUEIdkH/AXFqIgRqIAQgAUEQdkH/AXFqIgRqIAQgAUEYdmoiAmohAyAFQRBqIgVBsCtHDQALIANB8f8DcCEDIAJB8f8DcCECIAZBsCtqIQYgAEHQVGoiAEGvK0sNAAsgAEUNBCAAQQ9LDQEMAgsCQCAARQ0AAkACQCAAQQNxIgUNAEGACSEBIAAhBAwBCyAAQXxxIQRBACEBA0AgAiABQYAJai0AAGoiAiADaiEDIAUgAUEBaiIBRw0ACyAFQYAJaiEBCyAAQQRJDQADQCACIAEtAABqIgUgAS0AAWoiBiABLQACaiIAIAFBA2otAABqIgIgACAGIAUgA2pqamohAyABQQRqIQEgBEF8aiIEDQALCyACQY+AfGogAiACQfD/A0sbIANB8f8DcEEQdHIhAQwECwNAIAYoAgAiAUH/AXEgAmoiBCADaiAEIAFBCHZB/wFxaiIEaiAEIAFBEHZB/wFxaiIEaiAEIAFBGHZqIgRqIAQgBkEEaigCACIBQf8BcWoiBGogBCABQQh2Qf8BcWoiBGogBCABQRB2Qf8BcWoiBGogBCABQRh2aiIEaiAEIAZBCGooAgAiAUH/AXFqIgRqIAQgAUEIdkH/AXFqIgRqIAQgAUEQdkH/AXFqIgRqIAQgAUEYdmoiBGogBCAGQQxqKAIAIgFB/wFxaiIEaiAEIAFBCHZB/wFxaiIEaiAEIAFBEHZB/wFxaiIEaiAEIAFBGHZqIgJqIQMgBkEQaiEGIABBcGoiAEEPSw0ACyAARQ0BCyAAQX9qIQcCQCAAQQNxIgVFDQAgAEF8cSEAIAUhBCAGIQEDQCACIAEtAABqIgIgA2ohAyABQQFqIQEgBEF/aiIEDQALIAYgBWohBgsgB0EDSQ0AA0AgAiAGLQAAaiIBIAYtAAFqIgQgBi0AAmoiBSAGQQNqLQAAaiICIAUgBCABIANqampqIQMgBkEEaiEGIABBfGoiAA0ACwsgA0Hx/wNwIQMgAkHx/wNwIQILIAIgA0EQdHIhAQtBACABNgKECAsxAQF/QQBBACgChAgiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AoAJCwUAQYQICzsAQQBBATYChAggABACQQBBACgChAgiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AoAJCwsVAgBBgAgLBAQAAAAAQYQICwQBAAAA\";\nvar hash$l = \"02ddbd17\";\nvar wasmJson$l = {\n\tname: name$l,\n\tdata: data$l,\n\thash: hash$l\n};\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nclass Mutex {\n constructor() {\n this.mutex = Promise.resolve();\n }\n lock() {\n let begin = () => { };\n this.mutex = this.mutex.then(() => new Promise(begin));\n return new Promise((res) => {\n begin = res;\n });\n }\n dispatch(fn) {\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.lock();\n try {\n return yield Promise.resolve(fn());\n }\n finally {\n unlock();\n }\n });\n }\n}\n\nvar _a;\nfunction getGlobal() {\n if (typeof globalThis !== \"undefined\")\n return globalThis;\n if (typeof self !== \"undefined\")\n return self;\n if (typeof window !== \"undefined\")\n return window;\n return global;\n}\nconst globalObject = getGlobal();\nconst nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;\nconst textEncoder = globalObject.TextEncoder\n ? new globalObject.TextEncoder()\n : null;\nfunction intArrayToString(arr, len) {\n return String.fromCharCode(...arr.subarray(0, len));\n}\nfunction hexCharCodesToInt(a, b) {\n return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |\n ((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));\n}\nfunction writeHexToUInt8(buf, str) {\n const size = str.length >> 1;\n for (let i = 0; i < size; i++) {\n const index = i << 1;\n buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));\n }\n}\nfunction hexStringEqualsUInt8(str, buf) {\n if (str.length !== buf.length * 2) {\n return false;\n }\n for (let i = 0; i < buf.length; i++) {\n const strIndex = i << 1;\n if (buf[i] !==\n hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {\n return false;\n }\n }\n return true;\n}\nconst alpha = \"a\".charCodeAt(0) - 10;\nconst digit = \"0\".charCodeAt(0);\nfunction getDigestHex(tmpBuffer, input, hashLength) {\n let p = 0;\n for (let i = 0; i < hashLength; i++) {\n let nibble = input[i] >>> 4;\n tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;\n nibble = input[i] & 0xf;\n tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;\n }\n return String.fromCharCode.apply(null, tmpBuffer);\n}\nconst getUInt8Buffer = nodeBuffer !== null\n ? (data) => {\n if (typeof data === \"string\") {\n const buf = nodeBuffer.from(data, \"utf8\");\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);\n }\n if (nodeBuffer.isBuffer(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.length);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n throw new Error(\"Invalid data type!\");\n }\n : (data) => {\n if (typeof data === \"string\") {\n return textEncoder.encode(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n throw new Error(\"Invalid data type!\");\n };\nconst base64Chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst base64Lookup = new Uint8Array(256);\nfor (let i = 0; i < base64Chars.length; i++) {\n base64Lookup[base64Chars.charCodeAt(i)] = i;\n}\nfunction encodeBase64(data, pad = true) {\n const len = data.length;\n const extraBytes = len % 3;\n const parts = [];\n const len2 = len - extraBytes;\n for (let i = 0; i < len2; i += 3) {\n const tmp = ((data[i] << 16) & 0xff0000) +\n ((data[i + 1] << 8) & 0xff00) +\n (data[i + 2] & 0xff);\n const triplet = base64Chars.charAt((tmp >> 18) & 0x3f) +\n base64Chars.charAt((tmp >> 12) & 0x3f) +\n base64Chars.charAt((tmp >> 6) & 0x3f) +\n base64Chars.charAt(tmp & 0x3f);\n parts.push(triplet);\n }\n if (extraBytes === 1) {\n const tmp = data[len - 1];\n const a = base64Chars.charAt(tmp >> 2);\n const b = base64Chars.charAt((tmp << 4) & 0x3f);\n parts.push(`${a}${b}`);\n if (pad) {\n parts.push(\"==\");\n }\n }\n else if (extraBytes === 2) {\n const tmp = (data[len - 2] << 8) + data[len - 1];\n const a = base64Chars.charAt(tmp >> 10);\n const b = base64Chars.charAt((tmp >> 4) & 0x3f);\n const c = base64Chars.charAt((tmp << 2) & 0x3f);\n parts.push(`${a}${b}${c}`);\n if (pad) {\n parts.push(\"=\");\n }\n }\n return parts.join(\"\");\n}\nfunction getDecodeBase64Length(data) {\n let bufferLength = Math.floor(data.length * 0.75);\n const len = data.length;\n if (data[len - 1] === \"=\") {\n bufferLength -= 1;\n if (data[len - 2] === \"=\") {\n bufferLength -= 1;\n }\n }\n return bufferLength;\n}\nfunction decodeBase64(data) {\n const bufferLength = getDecodeBase64Length(data);\n const len = data.length;\n const bytes = new Uint8Array(bufferLength);\n let p = 0;\n for (let i = 0; i < len; i += 4) {\n const encoded1 = base64Lookup[data.charCodeAt(i)];\n const encoded2 = base64Lookup[data.charCodeAt(i + 1)];\n const encoded3 = base64Lookup[data.charCodeAt(i + 2)];\n const encoded4 = base64Lookup[data.charCodeAt(i + 3)];\n bytes[p] = (encoded1 << 2) | (encoded2 >> 4);\n p += 1;\n bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n p += 1;\n bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n p += 1;\n }\n return bytes;\n}\n\nconst MAX_HEAP = 16 * 1024;\nconst WASM_FUNC_HASH_LENGTH = 4;\nconst wasmMutex = new Mutex();\nconst wasmModuleCache = new Map();\nfunction WASMInterface(binary, hashLength) {\n return __awaiter(this, void 0, void 0, function* () {\n let wasmInstance = null;\n let memoryView = null;\n let initialized = false;\n if (typeof WebAssembly === \"undefined\") {\n throw new Error(\"WebAssembly is not supported in this environment!\");\n }\n const writeMemory = (data, offset = 0) => {\n memoryView.set(data, offset);\n };\n const getMemory = () => memoryView;\n const getExports = () => wasmInstance.exports;\n const setMemorySize = (totalSize) => {\n wasmInstance.exports.Hash_SetMemorySize(totalSize);\n const arrayOffset = wasmInstance.exports.Hash_GetBuffer();\n const memoryBuffer = wasmInstance.exports.memory.buffer;\n memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);\n };\n const getStateSize = () => {\n const view = new DataView(wasmInstance.exports.memory.buffer);\n const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);\n return stateSize;\n };\n const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {\n if (!wasmModuleCache.has(binary.name)) {\n const asm = decodeBase64(binary.data);\n const promise = WebAssembly.compile(asm);\n wasmModuleCache.set(binary.name, promise);\n }\n const module = yield wasmModuleCache.get(binary.name);\n wasmInstance = yield WebAssembly.instantiate(module, {\n // env: {\n // emscripten_memcpy_big: (dest, src, num) => {\n // const memoryBuffer = wasmInstance.exports.memory.buffer;\n // const memView = new Uint8Array(memoryBuffer, 0);\n // memView.set(memView.subarray(src, src + num), dest);\n // },\n // print_memory: (offset, len) => {\n // const memoryBuffer = wasmInstance.exports.memory.buffer;\n // const memView = new Uint8Array(memoryBuffer, 0);\n // console.log('print_int32', memView.subarray(offset, offset + len));\n // },\n // },\n });\n // wasmInstance.exports._start();\n }));\n const setupInterface = () => __awaiter(this, void 0, void 0, function* () {\n if (!wasmInstance) {\n yield loadWASMPromise;\n }\n const arrayOffset = wasmInstance.exports.Hash_GetBuffer();\n const memoryBuffer = wasmInstance.exports.memory.buffer;\n memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);\n });\n const init = (bits = null) => {\n initialized = true;\n wasmInstance.exports.Hash_Init(bits);\n };\n const updateUInt8Array = (data) => {\n let read = 0;\n while (read < data.length) {\n const chunk = data.subarray(read, read + MAX_HEAP);\n read += chunk.length;\n memoryView.set(chunk);\n wasmInstance.exports.Hash_Update(chunk.length);\n }\n };\n const update = (data) => {\n if (!initialized) {\n throw new Error(\"update() called before init()\");\n }\n const Uint8Buffer = getUInt8Buffer(data);\n updateUInt8Array(Uint8Buffer);\n };\n const digestChars = new Uint8Array(hashLength * 2);\n const digest = (outputType, padding = null) => {\n if (!initialized) {\n throw new Error(\"digest() called before init()\");\n }\n initialized = false;\n wasmInstance.exports.Hash_Final(padding);\n if (outputType === \"binary\") {\n // the data is copied to allow GC of the original memory object\n return memoryView.slice(0, hashLength);\n }\n return getDigestHex(digestChars, memoryView, hashLength);\n };\n const save = () => {\n if (!initialized) {\n throw new Error(\"save() can only be called after init() and before digest()\");\n }\n const stateOffset = wasmInstance.exports.Hash_GetState();\n const stateLength = getStateSize();\n const memoryBuffer = wasmInstance.exports.memory.buffer;\n const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);\n // prefix is 4 bytes from SHA1 hash of the WASM binary\n // it is used to detect incompatible internal states between different versions of hash-wasm\n const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);\n writeHexToUInt8(prefixedState, binary.hash);\n prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);\n return prefixedState;\n };\n const load = (state) => {\n if (!(state instanceof Uint8Array)) {\n throw new Error(\"load() expects an Uint8Array generated by save()\");\n }\n const stateOffset = wasmInstance.exports.Hash_GetState();\n const stateLength = getStateSize();\n const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;\n const memoryBuffer = wasmInstance.exports.memory.buffer;\n if (state.length !== overallLength) {\n throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);\n }\n if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {\n throw new Error(\"This state was written by an incompatible hash implementation\");\n }\n const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);\n new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);\n initialized = true;\n };\n const isDataShort = (data) => {\n if (typeof data === \"string\") {\n // worst case is 4 bytes / char\n return data.length < MAX_HEAP / 4;\n }\n return data.byteLength < MAX_HEAP;\n };\n let canSimplify = isDataShort;\n switch (binary.name) {\n case \"argon2\":\n case \"scrypt\":\n canSimplify = () => true;\n break;\n case \"blake2b\":\n case \"blake2s\":\n // if there is a key at blake2 then cannot simplify\n canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);\n break;\n case \"blake3\":\n // if there is a key at blake3 then cannot simplify\n canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);\n break;\n case \"xxhash64\": // cannot simplify\n case \"xxhash3\":\n case \"xxhash128\":\n case \"crc64\":\n canSimplify = () => false;\n break;\n }\n // shorthand for (init + update + digest) for better performance\n const calculate = (data, initParam = null, digestParam = null) => {\n if (!canSimplify(data, initParam)) {\n init(initParam);\n update(data);\n return digest(\"hex\", digestParam);\n }\n const buffer = getUInt8Buffer(data);\n memoryView.set(buffer);\n wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);\n return getDigestHex(digestChars, memoryView, hashLength);\n };\n yield setupInterface();\n return {\n getMemory,\n writeMemory,\n getExports,\n setMemorySize,\n init,\n update,\n digest,\n save,\n load,\n calculate,\n hashLength,\n };\n });\n}\n\nfunction lockedCreate(mutex, binary, hashLength) {\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield mutex.lock();\n const wasm = yield WASMInterface(binary, hashLength);\n unlock();\n return wasm;\n });\n}\n\nconst mutex$l = new Mutex();\nlet wasmCache$l = null;\n/**\n * Calculates Adler-32 hash. The resulting 32-bit hash is stored in\n * network byte order (big-endian).\n *\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction adler32(data) {\n if (wasmCache$l === null) {\n return lockedCreate(mutex$l, wasmJson$l, 4).then((wasm) => {\n wasmCache$l = wasm;\n return wasmCache$l.calculate(data);\n });\n }\n try {\n const hash = wasmCache$l.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new Adler-32 hash instance\n */\nfunction createAdler32() {\n return WASMInterface(wasmJson$l, 4).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 4,\n digestSize: 4,\n };\n return obj;\n });\n}\n\nvar name$k = \"argon2\";\nvar data$k = \"AGFzbQEAAAABKQVgAX8Bf2AAAX9gEH9/f39/f39/f39/f39/f38AYAR/f39/AGACf38AAwYFAAECAwQFBgEBAoCAAgYIAX8BQZCoBAsHQQQGbWVtb3J5AgASSGFzaF9TZXRNZW1vcnlTaXplAAAOSGFzaF9HZXRCdWZmZXIAAQ5IYXNoX0NhbGN1bGF0ZQAECvEyBVgBAn9BACEBAkAgAEEAKAKICCICRg0AAkAgACACayIAQRB2IABBgIB8cSAASWoiAEAAQX9HDQBB/wHADwtBACEBQQBBACkDiAggAEEQdK18NwOICAsgAcALcAECfwJAQQAoAoAIIgANAEEAPwBBEHQiADYCgAhBACgCiAgiAUGAgCBGDQACQEGAgCAgAWsiAEEQdiAAQYCAfHEgAElqIgBAAEF/Rw0AQQAPC0EAQQApA4gIIABBEHStfDcDiAhBACgCgAghAAsgAAvcDgECfiAAIAQpAwAiECAAKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAMIBAgDCkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgBCAQIAQpAwCFQiiJIhA3AwAgACAQIAApAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAwgECAMKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAEIBAgBCkDAIVCAYk3AwAgASAFKQMAIhAgASkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDSAQIA0pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAEgECABKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACANIBAgDSkDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAIgBikDACIQIAIpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIA4gECAOKQMAhUIgiSIQNwMAIAogECAKKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACACIBAgAikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDiAQIA4pAwCFQjCJIhA3AwAgCiAQIAopAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACADIAcpAwAiECADKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAPIBAgDykDAIVCIIkiEDcDACALIBAgCykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAyAQIAMpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA8gECAPKQMAhUIwiSIQNwMAIAsgECALKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgACAFKQMAIhAgACkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDyAQIA8pAwCFQiCJIhA3AwAgCiAQIAopAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAUgECAFKQMAhUIoiSIQNwMAIAAgECAAKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAPIBAgDykDAIVCMIkiEDcDACAKIBAgCikDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBSAQIAUpAwCFQgGJNwMAIAEgBikDACIQIAEpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAwgECAMKQMAhUIgiSIQNwMAIAsgECALKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACAGIBAgBikDAIVCKIkiEDcDACABIBAgASkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgDCAQIAwpAwCFQjCJIhA3AwAgCyAQIAspAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIAYgECAGKQMAhUIBiTcDACACIAcpAwAiECACKQMAIhF8IBFCAYZC/v///x+DIBBC/////w+DfnwiEDcDACANIBAgDSkDAIVCIIkiEDcDACAIIBAgCCkDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgByAQIAcpAwCFQiiJIhA3AwAgAiAQIAIpAwAiEXwgEEL/////D4MgEUIBhkL+////H4N+fCIQNwMAIA0gECANKQMAhUIwiSIQNwMAIAggECAIKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAHIBAgBykDAIVCAYk3AwAgAyAEKQMAIhAgAykDACIRfCARQgGGQv7///8fgyAQQv////8Pg358IhA3AwAgDiAQIA4pAwCFQiCJIhA3AwAgCSAQIAkpAwAiEXwgEUIBhkL+////H4MgEEL/////D4N+fCIQNwMAIAQgECAEKQMAhUIoiSIQNwMAIAMgECADKQMAIhF8IBBC/////w+DIBFCAYZC/v///x+DfnwiEDcDACAOIBAgDikDAIVCMIkiEDcDACAJIBAgCSkDACIRfCAQQv////8PgyARQgGGQv7///8fg358IhA3AwAgBCAQIAQpAwCFQgGJNwMAC98aAQN/QQAhBEEAIAIpAwAgASkDAIU3A5AIQQAgAikDCCABKQMIhTcDmAhBACACKQMQIAEpAxCFNwOgCEEAIAIpAxggASkDGIU3A6gIQQAgAikDICABKQMghTcDsAhBACACKQMoIAEpAyiFNwO4CEEAIAIpAzAgASkDMIU3A8AIQQAgAikDOCABKQM4hTcDyAhBACACKQNAIAEpA0CFNwPQCEEAIAIpA0ggASkDSIU3A9gIQQAgAikDUCABKQNQhTcD4AhBACACKQNYIAEpA1iFNwPoCEEAIAIpA2AgASkDYIU3A/AIQQAgAikDaCABKQNohTcD+AhBACACKQNwIAEpA3CFNwOACUEAIAIpA3ggASkDeIU3A4gJQQAgAikDgAEgASkDgAGFNwOQCUEAIAIpA4gBIAEpA4gBhTcDmAlBACACKQOQASABKQOQAYU3A6AJQQAgAikDmAEgASkDmAGFNwOoCUEAIAIpA6ABIAEpA6ABhTcDsAlBACACKQOoASABKQOoAYU3A7gJQQAgAikDsAEgASkDsAGFNwPACUEAIAIpA7gBIAEpA7gBhTcDyAlBACACKQPAASABKQPAAYU3A9AJQQAgAikDyAEgASkD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\";\nvar hash$k = \"e4cdc523\";\nvar wasmJson$k = {\n\tname: name$k,\n\tdata: data$k,\n\thash: hash$k\n};\n\nvar name$j = \"blake2b\";\nvar data$j = \"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\";\nvar hash$j = \"c6f286e6\";\nvar wasmJson$j = {\n\tname: name$j,\n\tdata: data$j,\n\thash: hash$j\n};\n\nconst mutex$k = new Mutex();\nlet wasmCache$k = null;\nfunction validateBits$4(bits) {\n if (!Number.isInteger(bits) || bits < 8 || bits > 512 || bits % 8 !== 0) {\n return new Error(\"Invalid variant! Valid values: 8, 16, ..., 512\");\n }\n return null;\n}\nfunction getInitParam$1(outputBits, keyBits) {\n return outputBits | (keyBits << 16);\n}\n/**\n * Calculates BLAKE2b hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param bits Number of output bits, which has to be a number\n * divisible by 8, between 8 and 512. Defaults to 512.\n * @param key Optional key (string, Buffer or TypedArray). Maximum length is 64 bytes.\n * @returns Computed hash as a hexadecimal string\n */\nfunction blake2b(data, bits = 512, key = null) {\n if (validateBits$4(bits)) {\n return Promise.reject(validateBits$4(bits));\n }\n let keyBuffer = null;\n let initParam = bits;\n if (key !== null) {\n keyBuffer = getUInt8Buffer(key);\n if (keyBuffer.length > 64) {\n return Promise.reject(new Error(\"Max key length is 64 bytes\"));\n }\n initParam = getInitParam$1(bits, keyBuffer.length);\n }\n const hashLength = bits / 8;\n if (wasmCache$k === null || wasmCache$k.hashLength !== hashLength) {\n return lockedCreate(mutex$k, wasmJson$j, hashLength).then((wasm) => {\n wasmCache$k = wasm;\n if (initParam > 512) {\n wasmCache$k.writeMemory(keyBuffer);\n }\n return wasmCache$k.calculate(data, initParam);\n });\n }\n try {\n if (initParam > 512) {\n wasmCache$k.writeMemory(keyBuffer);\n }\n const hash = wasmCache$k.calculate(data, initParam);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new BLAKE2b hash instance\n * @param bits Number of output bits, which has to be a number\n * divisible by 8, between 8 and 512. Defaults to 512.\n * @param key Optional key (string, Buffer or TypedArray). Maximum length is 64 bytes.\n */\nfunction createBLAKE2b(bits = 512, key = null) {\n if (validateBits$4(bits)) {\n return Promise.reject(validateBits$4(bits));\n }\n let keyBuffer = null;\n let initParam = bits;\n if (key !== null) {\n keyBuffer = getUInt8Buffer(key);\n if (keyBuffer.length > 64) {\n return Promise.reject(new Error(\"Max key length is 64 bytes\"));\n }\n initParam = getInitParam$1(bits, keyBuffer.length);\n }\n const outputSize = bits / 8;\n return WASMInterface(wasmJson$j, outputSize).then((wasm) => {\n if (initParam > 512) {\n wasm.writeMemory(keyBuffer);\n }\n wasm.init(initParam);\n const obj = {\n init: initParam > 512\n ? () => {\n wasm.writeMemory(keyBuffer);\n wasm.init(initParam);\n return obj;\n }\n : () => {\n wasm.init(initParam);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 128,\n digestSize: outputSize,\n };\n return obj;\n });\n}\n\nfunction encodeResult(salt, options, res) {\n const parameters = [\n `m=${options.memorySize}`,\n `t=${options.iterations}`,\n `p=${options.parallelism}`,\n ].join(\",\");\n return `$argon2${options.hashType}$v=19$${parameters}$${encodeBase64(salt, false)}$${encodeBase64(res, false)}`;\n}\nconst uint32View = new DataView(new ArrayBuffer(4));\nfunction int32LE(x) {\n uint32View.setInt32(0, x, true);\n return new Uint8Array(uint32View.buffer);\n}\nfunction hashFunc(blake512, buf, len) {\n return __awaiter(this, void 0, void 0, function* () {\n if (len <= 64) {\n const blake = yield createBLAKE2b(len * 8);\n blake.update(int32LE(len));\n blake.update(buf);\n return blake.digest(\"binary\");\n }\n const r = Math.ceil(len / 32) - 2;\n const ret = new Uint8Array(len);\n blake512.init();\n blake512.update(int32LE(len));\n blake512.update(buf);\n let vp = blake512.digest(\"binary\");\n ret.set(vp.subarray(0, 32), 0);\n for (let i = 1; i < r; i++) {\n blake512.init();\n blake512.update(vp);\n vp = blake512.digest(\"binary\");\n ret.set(vp.subarray(0, 32), i * 32);\n }\n const partialBytesNeeded = len - 32 * r;\n let blakeSmall;\n if (partialBytesNeeded === 64) {\n blakeSmall = blake512;\n blakeSmall.init();\n }\n else {\n blakeSmall = yield createBLAKE2b(partialBytesNeeded * 8);\n }\n blakeSmall.update(vp);\n vp = blakeSmall.digest(\"binary\");\n ret.set(vp.subarray(0, partialBytesNeeded), r * 32);\n return ret;\n });\n}\nfunction getHashType(type) {\n switch (type) {\n case \"d\":\n return 0;\n case \"i\":\n return 1;\n default:\n return 2;\n }\n}\nfunction argon2Internal(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const { parallelism, iterations, hashLength } = options;\n const password = getUInt8Buffer(options.password);\n const salt = getUInt8Buffer(options.salt);\n const version = 0x13;\n const hashType = getHashType(options.hashType);\n const { memorySize } = options; // in KB\n const secret = getUInt8Buffer((_a = options.secret) !== null && _a !== void 0 ? _a : \"\");\n const [argon2Interface, blake512] = yield Promise.all([\n WASMInterface(wasmJson$k, 1024),\n createBLAKE2b(512),\n ]);\n // last block is for storing the init vector\n argon2Interface.setMemorySize(memorySize * 1024 + 1024);\n const initVector = new Uint8Array(24);\n const initVectorView = new DataView(initVector.buffer);\n initVectorView.setInt32(0, parallelism, true);\n initVectorView.setInt32(4, hashLength, true);\n initVectorView.setInt32(8, memorySize, true);\n initVectorView.setInt32(12, iterations, true);\n initVectorView.setInt32(16, version, true);\n initVectorView.setInt32(20, hashType, true);\n argon2Interface.writeMemory(initVector, memorySize * 1024);\n blake512.init();\n blake512.update(initVector);\n blake512.update(int32LE(password.length));\n blake512.update(password);\n blake512.update(int32LE(salt.length));\n blake512.update(salt);\n blake512.update(int32LE(secret.length));\n blake512.update(secret);\n blake512.update(int32LE(0)); // associatedData length + associatedData\n const segments = Math.floor(memorySize / (parallelism * 4)); // length of each lane\n const lanes = segments * 4;\n const param = new Uint8Array(72);\n const H0 = blake512.digest(\"binary\");\n param.set(H0);\n for (let lane = 0; lane < parallelism; lane++) {\n param.set(int32LE(0), 64);\n param.set(int32LE(lane), 68);\n let position = lane * lanes;\n let chunk = yield hashFunc(blake512, param, 1024);\n argon2Interface.writeMemory(chunk, position * 1024);\n position += 1;\n param.set(int32LE(1), 64);\n chunk = yield hashFunc(blake512, param, 1024);\n argon2Interface.writeMemory(chunk, position * 1024);\n }\n const C = new Uint8Array(1024);\n writeHexToUInt8(C, argon2Interface.calculate(new Uint8Array([]), memorySize));\n const res = yield hashFunc(blake512, C, hashLength);\n if (options.outputType === \"hex\") {\n const digestChars = new Uint8Array(hashLength * 2);\n return getDigestHex(digestChars, res, hashLength);\n }\n if (options.outputType === \"encoded\") {\n return encodeResult(salt, options, res);\n }\n // return binary format\n return res;\n });\n}\nconst validateOptions$3 = (options) => {\n var _a;\n if (!options || typeof options !== \"object\") {\n throw new Error(\"Invalid options parameter. It requires an object.\");\n }\n if (!options.password) {\n throw new Error(\"Password must be specified\");\n }\n options.password = getUInt8Buffer(options.password);\n if (options.password.length < 1) {\n throw new Error(\"Password must be specified\");\n }\n if (!options.salt) {\n throw new Error(\"Salt must be specified\");\n }\n options.salt = getUInt8Buffer(options.salt);\n if (options.salt.length < 8) {\n throw new Error(\"Salt should be at least 8 bytes long\");\n }\n options.secret = getUInt8Buffer((_a = options.secret) !== null && _a !== void 0 ? _a : \"\");\n if (!Number.isInteger(options.iterations) || options.iterations < 1) {\n throw new Error(\"Iterations should be a positive number\");\n }\n if (!Number.isInteger(options.parallelism) || options.parallelism < 1) {\n throw new Error(\"Parallelism should be a positive number\");\n }\n if (!Number.isInteger(options.hashLength) || options.hashLength < 4) {\n throw new Error(\"Hash length should be at least 4 bytes.\");\n }\n if (!Number.isInteger(options.memorySize)) {\n throw new Error(\"Memory size should be specified.\");\n }\n if (options.memorySize < 8 * options.parallelism) {\n throw new Error(\"Memory size should be at least 8 * parallelism.\");\n }\n if (options.outputType === undefined) {\n options.outputType = \"hex\";\n }\n if (![\"hex\", \"binary\", \"encoded\"].includes(options.outputType)) {\n throw new Error(`Insupported output type ${options.outputType}. Valid values: ['hex', 'binary', 'encoded']`);\n }\n};\n/**\n * Calculates hash using the argon2i password-hashing function\n * @returns Computed hash\n */\nfunction argon2i(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateOptions$3(options);\n return argon2Internal(Object.assign(Object.assign({}, options), { hashType: \"i\" }));\n });\n}\n/**\n * Calculates hash using the argon2id password-hashing function\n * @returns Computed hash\n */\nfunction argon2id(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateOptions$3(options);\n return argon2Internal(Object.assign(Object.assign({}, options), { hashType: \"id\" }));\n });\n}\n/**\n * Calculates hash using the argon2d password-hashing function\n * @returns Computed hash\n */\nfunction argon2d(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateOptions$3(options);\n return argon2Internal(Object.assign(Object.assign({}, options), { hashType: \"d\" }));\n });\n}\nconst getHashParameters = (password, encoded, secret) => {\n const regex = /^\\$argon2(id|i|d)\\$v=([0-9]+)\\$((?:[mtp]=[0-9]+,){2}[mtp]=[0-9]+)\\$([A-Za-z0-9+/]+)\\$([A-Za-z0-9+/]+)$/;\n const match = encoded.match(regex);\n if (!match) {\n throw new Error(\"Invalid hash\");\n }\n const [, hashType, version, parameters, salt, hash] = match;\n if (version !== \"19\") {\n throw new Error(`Unsupported version: ${version}`);\n }\n const parsedParameters = {};\n const paramMap = { m: \"memorySize\", p: \"parallelism\", t: \"iterations\" };\n for (const x of parameters.split(\",\")) {\n const [n, v] = x.split(\"=\");\n parsedParameters[paramMap[n]] = Number(v);\n }\n return Object.assign(Object.assign({}, parsedParameters), { password,\n secret, hashType: hashType, salt: decodeBase64(salt), hashLength: getDecodeBase64Length(hash), outputType: \"encoded\" });\n};\nconst validateVerifyOptions$1 = (options) => {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"Invalid options parameter. It requires an object.\");\n }\n if (options.hash === undefined || typeof options.hash !== \"string\") {\n throw new Error(\"Hash should be specified\");\n }\n};\n/**\n * Verifies password using the argon2 password-hashing function\n * @returns True if the encoded hash matches the password\n */\nfunction argon2Verify(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateVerifyOptions$1(options);\n const params = getHashParameters(options.password, options.hash, options.secret);\n validateOptions$3(params);\n const hashStart = options.hash.lastIndexOf(\"$\") + 1;\n const result = (yield argon2Internal(params));\n return result.substring(hashStart) === options.hash.substring(hashStart);\n });\n}\n\nvar name$i = \"blake2s\";\nvar data$i = \"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\";\nvar hash$i = \"5c0ff166\";\nvar wasmJson$i = {\n\tname: name$i,\n\tdata: data$i,\n\thash: hash$i\n};\n\nconst mutex$j = new Mutex();\nlet wasmCache$j = null;\nfunction validateBits$3(bits) {\n if (!Number.isInteger(bits) || bits < 8 || bits > 256 || bits % 8 !== 0) {\n return new Error(\"Invalid variant! Valid values: 8, 16, ..., 256\");\n }\n return null;\n}\nfunction getInitParam(outputBits, keyBits) {\n return outputBits | (keyBits << 16);\n}\n/**\n * Calculates BLAKE2s hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param bits Number of output bits, which has to be a number\n * divisible by 8, between 8 and 256. Defaults to 256.\n * @param key Optional key (string, Buffer or TypedArray). Maximum length is 32 bytes.\n * @returns Computed hash as a hexadecimal string\n */\nfunction blake2s(data, bits = 256, key = null) {\n if (validateBits$3(bits)) {\n return Promise.reject(validateBits$3(bits));\n }\n let keyBuffer = null;\n let initParam = bits;\n if (key !== null) {\n keyBuffer = getUInt8Buffer(key);\n if (keyBuffer.length > 32) {\n return Promise.reject(new Error(\"Max key length is 32 bytes\"));\n }\n initParam = getInitParam(bits, keyBuffer.length);\n }\n const hashLength = bits / 8;\n if (wasmCache$j === null || wasmCache$j.hashLength !== hashLength) {\n return lockedCreate(mutex$j, wasmJson$i, hashLength).then((wasm) => {\n wasmCache$j = wasm;\n if (initParam > 512) {\n wasmCache$j.writeMemory(keyBuffer);\n }\n return wasmCache$j.calculate(data, initParam);\n });\n }\n try {\n if (initParam > 512) {\n wasmCache$j.writeMemory(keyBuffer);\n }\n const hash = wasmCache$j.calculate(data, initParam);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new BLAKE2s hash instance\n * @param bits Number of output bits, which has to be a number\n * divisible by 8, between 8 and 256. Defaults to 256.\n * @param key Optional key (string, Buffer or TypedArray). Maximum length is 32 bytes.\n */\nfunction createBLAKE2s(bits = 256, key = null) {\n if (validateBits$3(bits)) {\n return Promise.reject(validateBits$3(bits));\n }\n let keyBuffer = null;\n let initParam = bits;\n if (key !== null) {\n keyBuffer = getUInt8Buffer(key);\n if (keyBuffer.length > 32) {\n return Promise.reject(new Error(\"Max key length is 32 bytes\"));\n }\n initParam = getInitParam(bits, keyBuffer.length);\n }\n const outputSize = bits / 8;\n return WASMInterface(wasmJson$i, outputSize).then((wasm) => {\n if (initParam > 512) {\n wasm.writeMemory(keyBuffer);\n }\n wasm.init(initParam);\n const obj = {\n init: initParam > 512\n ? () => {\n wasm.writeMemory(keyBuffer);\n wasm.init(initParam);\n return obj;\n }\n : () => {\n wasm.init(initParam);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: outputSize,\n };\n return obj;\n });\n}\n\nvar name$h = \"blake3\";\nvar data$h = \"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IQEgAkFAaiICQcAASw0ACwsCQEHAACAHQf8BcSIGayIFIAIgBSACSRsiCUUNACAJQQNxIQtBACEFAkAgCUEESQ0AIAAgBmohByAJQfwAcSEIQQAhBQNAIAcgBWoiAkEoaiABIAVqIgotAAA6AAAgAkEpaiAKQQFqLQAAOgAAIAJBKmogCkECai0AADoAACACQStqIApBA2otAAA6AAAgCCAFQQRqIgVHDQALCwJAIAtFDQAgASAFaiEBIAUgBmogAGpBKGohBQNAIAUgAS0AADoAACABQQFqIQEgBUEBaiEFIAtBf2oiCw0ACwsgAC0AaCEHCyAAIAcgCWo6AGggA0HAAGokAAveAwQFfwN+BX8GfiMAQdABayIBJAACQCAAe6ciAkEALQCQigEiA08NAEEALQCKigFBBHIhBCABQShqIQVBACkDmIkBIQBBACkDkIkBIQZBACkDiIkBIQdBACkDgIkBIQggAyEJA0AgASAANwMYIAEgBjcDECABIAc3AwggASAINwMAIAEgA0EFdCIDQdGJAWoiCikDADcDKCABIANB2YkBaiILKQMANwMwIAEgA0HhiQFqIgwpAwA3AzggASADQemJAWoiDSkDADcDQCABIANB8YkBaikDADcDSCABIANB+YkBaikDADcDUCABIANBgYoBaikDADcDWCADQYmKAWopAwAhDiABQcAAOgBoIAEgDjcDYCABQgA3AyAgASAEOgBpIAEgADcDiAEgASAGNwOAASABIAc3A3ggASAINwNwIAFBkAFqIAFB8ABqIAVBwABCACAEQf8BcRACIAEpA7ABIQ4gASkDkAEhDyABKQO4ASEQIAEpA5gBIREgASkDwAEhEiABKQOgASETIA0gASkDyAEgASkDqAGFNwMAIAwgEiAThTcDACALIBAgEYU3AwAgCiAOIA+FNwMAIAlBf2oiCUH/AXEiAyACSw0AC0EAIAk6AJCKAQsgAUHQAWokAAvHCQIKfwV+IwBB4AJrIgUkAAJAAkAgAUGACEsNACAFIAA2AvwBIAVB/AFqIAFBgAhGIgZBECACQQEgA0EBQQIgBBABIAZBCnQiByABTw0BIAVB4ABqIgZCADcDACAFQdgAaiIIQgA3AwAgBUHQAGoiCUIANwMAIAVByABqIgpCADcDACAFQcAAaiILQgA3AwAgBUE4aiIMQgA3AwAgBUEwaiINQgA3AwAgBSADOgBqIAVCADcDKCAFQQA7AWggBUEAKQOAiQE3AwAgBUEAKQOIiQE3AwggBUEAKQOQiQE3AxAgBUEAKQOYiQE3AxggBSABQYAIRiIOrSACfDcDICAFIAAgB2pBACABIA4bEAQgBUGIAWpBMGogDSkDADcDACAFQYgBakE4aiAMKQMANwMAIAUgBSkDACIPNwOIASAFIAUpAwgiEDcDkAEgBSAFKQMQIhE3A5gBIAUgBSkDGCISNwOgASAFIAUpAyg3A7ABIAUtAGohACAFLQBpIQcgBSkDICECIAUtAGghASAFQYgBakHAAGogCykDADcDACAFQYgBakHIAGogCikDADcDACAFQYgBakHQAGogCSkDADcDACAFQYgBakHYAGogCCkDADcDACAFQYgBakHgAGogBikDADcDACAFIAE6APABIAUgAjcDqAEgBSAAIAdFckECciIAOgDxASAFIBI3A5gCIAUgETcDkAIgBSAQNwOIAiAFIA83A4ACIAVBoAJqIAVBgAJqIAVBsAFqIAEgAiAAQf8BcRACIAUpA8ACIQIgBSkDoAIhDyAFKQPIAiEQIAUpA6gCIREgBSkD0AIhEiAFKQOwAiETIAQgDkEFdGoiASAFKQPYAiAFKQO4AoU3AxggASASIBOFNwMQIAEgECARhTcDCCABIAIgD4U3AwBBAkEBIA4bIQYMAQsgAEIBIAFBf2pBCnZBAXKteUI/hYYiD6dBCnQiDiACIAMgBRAGIQcgACAOaiABIA5rIA9C////AYMgAnwgAyAFQcAAQSAgDkGACEsbahAGIQECQCAHQQFHDQAgBCAFKQMANwMAIAQgBSkDCDcDCCAEIAUpAxA3AxAgBCAFKQMYNwMYIAQgBSkDIDcDICAEIAUpAyg3AyggBCAFKQMwNwMwIAQgBSkDODcDOEECIQYMAQtBACEGQQAhAAJAIAEgB2oiCUECSQ0AIAlBfmoiCkEBdkEBaiIGQQNxIQ5BACEHAkAgCkEGSQ0AIAZB/P///wdxIQhBACEHIAVBiAFqIQEgBSEAA0AgASAANgIAIAFBDGogAEHAAWo2AgAgAUEIaiAAQYABajYCACABQQRqIABBwABqNgIAIABBgAJqIQAgAUEQaiEBIAggB0EEaiIHRw0ACwsgCkF+cSEIAkAgDkUNACAFIAdBBnRqIQEgBUGIAWogB0ECdGohAANAIAAgATYCACABQcAAaiEBIABBBGohACAOQX9qIg4NAAsLIAhBAmohAAsgBUGIAWogBkEBQgBBACADQQRyQQBBACAEEAEgACAJTw0AIAQgBkEFdGoiASAFIAZBBnRqIgApAwA3AwAgASAAKQMINwMIIAEgACkDEDcDECABIAApAxg3AxggBkEBaiEGCyAFQeACaiQAIAYLrRAIAn8EfgF/AX4EfwR+BH8EfiMAQfABayIBJAACQCAARQ0AAkBBAC0AkIoBIgINACABQTBqQQApA9CJATcDACABQThqQQApA9iJATcDACABQQApA6CJASIDNwMAIAFBACkDqIkBIgQ3AwggAUEAKQOwiQEiBTcDECABQQApA7iJASIGNwMYIAFBACkDyIkBNwMoQQAtAIqKASECQQAtAImKASEHQQApA8CJASEIQQAtAIiKASEJIAFBwABqQQApA+CJATcDACABQcgAakEAKQPoiQE3AwAgAUHQAGpBACkD8IkBNwMAIAFB2ABqQQApA/iJATcDACABQeAAakEAKQOAigE3AwAgASAJOgBoIAEgCDcDICABIAIgB0VyIgJBAnI6AGkgAUEoaiEKQgAhCEGACSELIAJBCnJB/wFxIQwDQCABQbABaiABIAogCUH/AXEgCCAMEAIgASABKQPQASINIAEpA7ABhTcDcCABIAEpA9gBIg4gASkDuAGFNwN4IAEgASkD4AEiDyABKQPAAYU3A4ABIAEgASkD6AEiECAGhTcDqAEgASAPIAWFNwOgASABIA4gBIU3A5gBIAEgDSADhTcDkAEgASAQIAEpA8gBhTcDiAEgAEHAACAAQcAASRsiEUF/aiESAkACQCARQQdxIhMNACABQfAAaiECIAshByARIRQMAQsgEUH4AHEhFCABQfAAaiECIAshBwNAIAcgAi0AADoAACAHQQFqIQcgAkEBaiECIBNBf2oiEw0ACwsCQCASQQdJDQADQCAHIAIpAAA3AAAgB0EIaiEHIAJBCGohAiAUQXhqIhQNAAsLIAhCAXwhCCALIBFqIQsgACARayIADQAMAgsLAkACQAJAQQAtAImKASIHQQZ0QQBBAC0AiIoBIhFrRg0AIAEgEToAaCABQQApA4CKATcDYCABQQApA/iJATcDWCABQQApA/CJATcDUCABQQApA+iJATcDSCABQQApA+CJATcDQCABQQApA9iJATcDOCABQQApA9CJATcDMCABQQApA8iJATcDKCABQQApA8CJASIINwMgIAFBACkDuIkBIgM3AxggAUEAKQOwiQEiBDcDECABQQApA6iJASIFNwMIIAFBACkDoIkBIgY3AwAgAUEALQCKigEiEyAHRXJBAnIiCzoAaSATQQRyIRNBACkDmIkBIQ1BACkDkIkBIQ5BACkDiIkBIQ9BACkDgIkBIRAMAQtBwAAhESABQcAAOgBoQgAhCCABQgA3AyAgAUEAKQOYiQEiDTcDGCABQQApA5CJASIONwMQIAFBACkDiIkBIg83AwggAUEAKQOAiQEiEDcDACABQQAtAIqKAUEEciITOgBpIAEgAkF+aiICQQV0IgdByYoBaikDADcDYCABIAdBwYoBaikDADcDWCABIAdBuYoBaikDADcDUCABIAdBsYoBaikDADcDSCABIAdBqYoBaikDADcDQCABIAdBoYoBaikDADcDOCABIAdBmYoBaikDADcDMCABIAdBkYoBaikDADcDKCATIQsgECEGIA8hBSAOIQQgDSEDIAJFDQELIAJBf2oiB0EFdCIUQZGKAWopAwAhFSAUQZmKAWopAwAhFiAUQaGKAWopAwAhFyAUQamKAWopAwAhGCABIAM3A4gBIAEgBDcDgAEgASAFNwN4IAEgBjcDcCABQbABaiABQfAAaiABQShqIhQgESAIIAtB/wFxEAIgASATOgBpIAFBwAA6AGggASAYNwNAIAEgFzcDOCABIBY3AzAgASAVNwMoIAFCADcDICABIA03AxggASAONwMQIAEgDzcDCCABIBA3AwAgASABKQPoASABKQPIAYU3A2AgASABKQPgASABKQPAAYU3A1ggASABKQPYASABKQO4AYU3A1AgASABKQPQASABKQOwAYU3A0ggB0UNACACQQV0QemJAWohAiATQf8BcSERA0AgAkFoaikDACEIIAJBcGopAwAhAyACQXhqKQMAIQQgAikDACEFIAEgDTcDiAEgASAONwOAASABIA83A3ggASAQNwNwIAFBsAFqIAFB8ABqIBRBwABCACAREAIgASATOgBpIAFBwAA6AGggASAFNwNAIAEgBDcDOCABIAM3AzAgASAINwMoIAFCADcDICABIA03AxggASAONwMQIAEgDzcDCCABIBA3AwAgASABKQPoASABKQPIAYU3A2AgASABKQPgASABKQPAAYU3A1ggASABKQPYASABKQO4AYU3A1AgASABKQPQASABKQOwAYU3A0ggAkFgaiECIAdBf2oiBw0ACwsgAUEoaiEJQgAhCEGACSELIBNBCHJB/wFxIQoDQCABQbABaiABIAlBwAAgCCAKEAIgASABKQPQASIDIAEpA7ABhTcDcCABIAEpA9gBIgQgASkDuAGFNwN4IAEgASkD4AEiBSABKQPAAYU3A4ABIAEgDSABKQPoASIGhTcDqAEgASAOIAWFNwOgASABIA8gBIU3A5gBIAEgECADhTcDkAEgASAGIAEpA8gBhTcDiAEgAEHAACAAQcAASRsiEUF/aiESAkACQCARQQdxIhMNACABQfAAaiECIAshByARIRQMAQsgEUH4AHEhFCABQfAAaiECIAshBwNAIAcgAi0AADoAACAHQQFqIQcgAkEBaiECIBNBf2oiEw0ACwsCQCASQQdJDQADQCAHIAIpAAA3AAAgB0EIaiEHIAJBCGohAiAUQXhqIhQNAAsLIAhCAXwhCCALIBFqIQsgACARayIADQALCyABQfABaiQAC6MCAQR+AkACQCAAQSBGDQBCq7OP/JGjs/DbACEBQv+kuYjFkdqCm38hAkLy5rvjo6f9p6V/IQNC58yn0NbQ67O7fyEEQQAhAAwBC0EAKQOYCSEBQQApA5AJIQJBACkDiAkhA0EAKQOACSEEQRAhAAtBACAAOgCKigFBAEIANwOAigFBAEIANwP4iQFBAEIANwPwiQFBAEIANwPoiQFBAEIANwPgiQFBAEIANwPYiQFBAEIANwPQiQFBAEIANwPIiQFBAEIANwPAiQFBACABNwO4iQFBACACNwOwiQFBACADNwOoiQFBACAENwOgiQFBACABNwOYiQFBACACNwOQiQFBACADNwOIiQFBACAENwOAiQFBAEEAOgCQigFBAEEAOwGIigELBgAgABADCwYAIAAQBwsGAEGAiQELqwIBBH4CQAJAIAFBIEYNAEKrs4/8kaOz8NsAIQNC/6S5iMWR2oKbfyEEQvLmu+Ojp/2npX8hBULnzKfQ1tDrs7t/IQZBACEBDAELQQApA5gJIQNBACkDkAkhBEEAKQOICSEFQQApA4AJIQZBECEBC0EAIAE6AIqKAUEAQgA3A4CKAUEAQgA3A/iJAUEAQgA3A/CJAUEAQgA3A+iJAUEAQgA3A+CJAUEAQgA3A9iJAUEAQgA3A9CJAUEAQgA3A8iJAUEAQgA3A8CJAUEAIAM3A7iJAUEAIAQ3A7CJAUEAIAU3A6iJAUEAIAY3A6CJAUEAIAM3A5iJAUEAIAQ3A5CJAUEAIAU3A4iJAUEAIAY3A4CJAUEAQQA6AJCKAUEAQQA7AYiKASAAEAMgAhAHCwsLAQBBgAgLBHgHAAA=\";\nvar hash$h = \"215d875f\";\nvar wasmJson$h = {\n\tname: name$h,\n\tdata: data$h,\n\thash: hash$h\n};\n\nconst mutex$i = new Mutex();\nlet wasmCache$i = null;\nfunction validateBits$2(bits) {\n if (!Number.isInteger(bits) || bits < 8 || bits % 8 !== 0) {\n return new Error(\"Invalid variant! Valid values: 8, 16, ...\");\n }\n return null;\n}\n/**\n * Calculates BLAKE3 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param bits Number of output bits, which has to be a number\n * divisible by 8. Defaults to 256.\n * @param key Optional key (string, Buffer or TypedArray). Length should be 32 bytes.\n * @returns Computed hash as a hexadecimal string\n */\nfunction blake3(data, bits = 256, key = null) {\n if (validateBits$2(bits)) {\n return Promise.reject(validateBits$2(bits));\n }\n let keyBuffer = null;\n let initParam = 0; // key is empty by default\n if (key !== null) {\n keyBuffer = getUInt8Buffer(key);\n if (keyBuffer.length !== 32) {\n return Promise.reject(new Error(\"Key length must be exactly 32 bytes\"));\n }\n initParam = 32;\n }\n const hashLength = bits / 8;\n const digestParam = hashLength;\n if (wasmCache$i === null || wasmCache$i.hashLength !== hashLength) {\n return lockedCreate(mutex$i, wasmJson$h, hashLength).then((wasm) => {\n wasmCache$i = wasm;\n if (initParam === 32) {\n wasmCache$i.writeMemory(keyBuffer);\n }\n return wasmCache$i.calculate(data, initParam, digestParam);\n });\n }\n try {\n if (initParam === 32) {\n wasmCache$i.writeMemory(keyBuffer);\n }\n const hash = wasmCache$i.calculate(data, initParam, digestParam);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new BLAKE3 hash instance\n * @param bits Number of output bits, which has to be a number\n * divisible by 8. Defaults to 256.\n * @param key Optional key (string, Buffer or TypedArray). Length should be 32 bytes.\n */\nfunction createBLAKE3(bits = 256, key = null) {\n if (validateBits$2(bits)) {\n return Promise.reject(validateBits$2(bits));\n }\n let keyBuffer = null;\n let initParam = 0; // key is empty by default\n if (key !== null) {\n keyBuffer = getUInt8Buffer(key);\n if (keyBuffer.length !== 32) {\n return Promise.reject(new Error(\"Key length must be exactly 32 bytes\"));\n }\n initParam = 32;\n }\n const outputSize = bits / 8;\n const digestParam = outputSize;\n return WASMInterface(wasmJson$h, outputSize).then((wasm) => {\n if (initParam === 32) {\n wasm.writeMemory(keyBuffer);\n }\n wasm.init(initParam);\n const obj = {\n init: initParam === 32\n ? () => {\n wasm.writeMemory(keyBuffer);\n wasm.init(initParam);\n return obj;\n }\n : () => {\n wasm.init(initParam);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType, digestParam),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: outputSize,\n };\n return obj;\n });\n}\n\nvar name$g = \"crc32\";\nvar data$g = \"AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwgHAAEBAQIAAwUEAQECAgYOAn8BQZDJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAgtIYXNoX1VwZGF0ZQADCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKkggHBQBBgAkLwwMBA39BgIkBIQFBACECA0AgAUEAQQBBAEEAQQBBAEEAQQAgAkEBcWsgAHEgAkEBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnMiA0EBcWsgAHEgA0EBdnM2AgAgAUEEaiEBIAJBAWoiAkGAAkcNAAtBACEAA0AgAEGEkQFqIABBhIkBaigCACICQf8BcUECdEGAiQFqKAIAIAJBCHZzIgI2AgAgAEGEmQFqIAJB/wFxQQJ0QYCJAWooAgAgAkEIdnMiAjYCACAAQYShAWogAkH/AXFBAnRBgIkBaigCACACQQh2cyICNgIAIABBhKkBaiACQf8BcUECdEGAiQFqKAIAIAJBCHZzIgI2AgAgAEGEsQFqIAJB/wFxQQJ0QYCJAWooAgAgAkEIdnMiAjYCACAAQYS5AWogAkH/AXFBAnRBgIkBaigCACACQQh2cyICNgIAIABBhMEBaiACQf8BcUECdEGAiQFqKAIAIAJBCHZzNgIAIABBBGoiAEH8B0cNAAsLJwACQEEAKAKAyQEgAEYNACAAEAFBACAANgKAyQELQQBBADYChMkBC4gDAQN/QQAoAoTJAUF/cyEBQYAJIQICQCAAQQhJDQBBgAkhAgNAIAJBBGooAgAiA0EOdkH8B3FBgJEBaigCACADQRZ2QfwHcUGAiQFqKAIAcyADQQZ2QfwHcUGAmQFqKAIAcyADQf8BcUECdEGAoQFqKAIAcyACKAIAIAFzIgFBFnZB/AdxQYCpAWooAgBzIAFBDnZB/AdxQYCxAWooAgBzIAFBBnZB/AdxQYC5AWooAgBzIAFB/wFxQQJ0QYDBAWooAgBzIQEgAkEIaiECIABBeGoiAEEHSw0ACwsCQCAARQ0AAkACQCAAQQFxDQAgACEDDAELIAFB/wFxIAItAABzQQJ0QYCJAWooAgAgAUEIdnMhASACQQFqIQIgAEF/aiEDCyAAQQFGDQADQCABQf8BcSACLQAAc0ECdEGAiQFqKAIAIAFBCHZzIgFB/wFxIAJBAWotAABzQQJ0QYCJAWooAgAgAUEIdnMhASACQQJqIQIgA0F+aiIDDQALC0EAIAFBf3M2AoTJAQsyAQF/QQBBACgChMkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgKACQsGAEGEyQELWQACQEEAKAKAyQEgAUYNACABEAFBACABNgKAyQELQQBBADYChMkBIAAQA0EAQQAoAoTJASIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCgAkLCwsBAEGACAsEBAAAAA==\";\nvar hash$g = \"d2eba587\";\nvar wasmJson$g = {\n\tname: name$g,\n\tdata: data$g,\n\thash: hash$g\n};\n\nconst mutex$h = new Mutex();\nlet wasmCache$h = null;\nfunction validatePoly(poly) {\n if (!Number.isInteger(poly) || poly < 0 || poly > 0xffffffff) {\n return new Error(\"Polynomial must be a valid 32-bit long unsigned integer\");\n }\n return null;\n}\n/**\n * Calculates CRC-32 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param polynomial Input polynomial (defaults to 0xedb88320, for CRC32C use 0x82f63b78)\n * @returns Computed hash as a hexadecimal string\n */\nfunction crc32(data, polynomial = 0xedb88320) {\n if (validatePoly(polynomial)) {\n return Promise.reject(validatePoly(polynomial));\n }\n if (wasmCache$h === null) {\n return lockedCreate(mutex$h, wasmJson$g, 4).then((wasm) => {\n wasmCache$h = wasm;\n return wasmCache$h.calculate(data, polynomial);\n });\n }\n try {\n const hash = wasmCache$h.calculate(data, polynomial);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new CRC-32 hash instance\n * @param polynomial Input polynomial (defaults to 0xedb88320, for CRC32C use 0x82f63b78)\n */\nfunction createCRC32(polynomial = 0xedb88320) {\n if (validatePoly(polynomial)) {\n return Promise.reject(validatePoly(polynomial));\n }\n return WASMInterface(wasmJson$g, 4).then((wasm) => {\n wasm.init(polynomial);\n const obj = {\n init: () => {\n wasm.init(polynomial);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 4,\n digestSize: 4,\n };\n return obj;\n });\n}\n\nvar name$f = \"crc64\";\nvar data$f = \"AGFzbQEAAAABDANgAAF/YAAAYAF/AAMHBgABAgEAAQUEAQECAgYOAn8BQZCJBgt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwAAw1IYXNoX0dldFN0YXRlAAQOSGFzaF9DYWxjdWxhdGUABQpTVEFURV9TSVpFAwEKgwgGBQBBgAkL9QMDAX4BfwJ+AkBBACkDgIkCQQApA4AJIgBRDQBBgIkBIQFCACECA0AgAUIAQgBCAEIAQgBCAEIAQgAgAkIBg30gAIMgAkIBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIUiA0IBg30gAIMgA0IBiIU3AwAgAUEIaiEBIAJCAXwiAkKAAlINAAtBACEBA0AgAUGImQFqIAFBiIkBaikDACICp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiKkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiLkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiMkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiNkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiOkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhSICNwMAIAFBiPkBaiACp0H/AXFBA3RBgIkBaikDACACQgiIhTcDACABQQhqIgFB+A9HDQALQQAgADcDgIkCC0EAQgA3A4iJAguUAwIBfgJ/QQApA4iJAkJ/hSEBQYAJIQICQCAAQQhJDQBBgAkhAgNAIAIpAwAgAYUiAUIwiKdB/wFxQQN0QYCZAWopAwAgAUI4iKdBA3RBgIkBaikDAIUgAUIoiKdB/wFxQQN0QYCpAWopAwCFIAFCIIinQf8BcUEDdEGAuQFqKQMAhSABpyIDQRV2QfgPcUGAyQFqKQMAhSADQQ12QfgPcUGA2QFqKQMAhSADQQV2QfgPcUGA6QFqKQMAhSADQf8BcUEDdEGA+QFqKQMAhSEBIAJBCGohAiAAQXhqIgBBB0sNAAsLAkAgAEUNAAJAAkAgAEEBcQ0AIAAhAwwBCyABQv8BgyACMQAAhadBA3RBgIkBaikDACABQgiIhSEBIAJBAWohAiAAQX9qIQMLIABBAUYNAANAIAFC/wGDIAIxAACFp0EDdEGAiQFqKQMAIAFCCIiFIgFC/wGDIAJBAWoxAACFp0EDdEGAiQFqKQMAIAFCCIiFIQEgAkECaiECIANBfmoiAw0ACwtBACABQn+FNwOIiQILZAEBfkEAQQApA4iJAiIAQjiGIABCgP4Dg0IohoQgAEKAgPwHg0IYhiAAQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwOACQsGAEGIiQILAgALCwsBAEGACAsECAAAAA==\";\nvar hash$f = \"c5ac6c16\";\nvar wasmJson$f = {\n\tname: name$f,\n\tdata: data$f,\n\thash: hash$f\n};\n\nconst mutex$g = new Mutex();\nlet wasmCache$g = null;\nconst polyBuffer = new Uint8Array(8);\nfunction parsePoly(poly) {\n const errText = \"Polynomial must be provided as a 16 char long hex string\";\n if (typeof poly !== \"string\" || poly.length !== 16) {\n return { hi: 0, lo: 0, err: new Error(errText) };\n }\n const hi = Number(`0x${poly.slice(0, 8)}`);\n const lo = Number(`0x${poly.slice(8)}`);\n if (Number.isNaN(hi) || Number.isNaN(lo)) {\n return { hi, lo, err: new Error(errText) };\n }\n return { hi, lo, err: null };\n}\nfunction writePoly(arr, lo, hi) {\n // write in little-endian format\n const buffer = new DataView(arr);\n buffer.setUint32(0, lo, true);\n buffer.setUint32(4, hi, true);\n}\n/**\n * Calculates CRC-64 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param polynomial Input polynomial (defaults to 'c96c5795d7870f42' - ECMA)\n * @returns Computed hash as a hexadecimal string\n */\nfunction crc64(data, polynomial = \"c96c5795d7870f42\") {\n const { hi, lo, err } = parsePoly(polynomial);\n if (err !== null) {\n return Promise.reject(err);\n }\n if (wasmCache$g === null) {\n return lockedCreate(mutex$g, wasmJson$f, 8).then((wasm) => {\n wasmCache$g = wasm;\n writePoly(polyBuffer.buffer, lo, hi);\n wasmCache$g.writeMemory(polyBuffer);\n return wasmCache$g.calculate(data);\n });\n }\n try {\n writePoly(polyBuffer.buffer, lo, hi);\n wasmCache$g.writeMemory(polyBuffer);\n const hash = wasmCache$g.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new CRC-64 hash instance\n * @param polynomial Input polynomial (defaults to 'c96c5795d7870f42' - ECMA)\n */\nfunction createCRC64(polynomial = \"c96c5795d7870f42\") {\n const { hi, lo, err } = parsePoly(polynomial);\n if (err !== null) {\n return Promise.reject(err);\n }\n return WASMInterface(wasmJson$f, 8).then((wasm) => {\n const instanceBuffer = new Uint8Array(8);\n writePoly(instanceBuffer.buffer, lo, hi);\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n const obj = {\n init: () => {\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 8,\n digestSize: 8,\n };\n return obj;\n });\n}\n\nvar name$e = \"md4\";\nvar data$e = \"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\";\nvar hash$e = \"bd8ce7c7\";\nvar wasmJson$e = {\n\tname: name$e,\n\tdata: data$e,\n\thash: hash$e\n};\n\nconst mutex$f = new Mutex();\nlet wasmCache$f = null;\n/**\n * Calculates MD4 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction md4(data) {\n if (wasmCache$f === null) {\n return lockedCreate(mutex$f, wasmJson$e, 16).then((wasm) => {\n wasmCache$f = wasm;\n return wasmCache$f.calculate(data);\n });\n }\n try {\n const hash = wasmCache$f.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new MD4 hash instance\n */\nfunction createMD4() {\n return WASMInterface(wasmJson$e, 16).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 16,\n };\n return obj;\n });\n}\n\nvar name$d = \"md5\";\nvar data$d = \"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\";\nvar hash$d = \"e6508e4b\";\nvar wasmJson$d = {\n\tname: name$d,\n\tdata: data$d,\n\thash: hash$d\n};\n\nconst mutex$e = new Mutex();\nlet wasmCache$e = null;\n/**\n * Calculates MD5 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction md5(data) {\n if (wasmCache$e === null) {\n return lockedCreate(mutex$e, wasmJson$d, 16).then((wasm) => {\n wasmCache$e = wasm;\n return wasmCache$e.calculate(data);\n });\n }\n try {\n const hash = wasmCache$e.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new MD5 hash instance\n */\nfunction createMD5() {\n return WASMInterface(wasmJson$d, 16).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 16,\n };\n return obj;\n });\n}\n\nvar name$c = \"sha1\";\nvar data$c = \"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\";\nvar hash$c = \"6b530c24\";\nvar wasmJson$c = {\n\tname: name$c,\n\tdata: data$c,\n\thash: hash$c\n};\n\nconst mutex$d = new Mutex();\nlet wasmCache$d = null;\n/**\n * Calculates SHA-1 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction sha1(data) {\n if (wasmCache$d === null) {\n return lockedCreate(mutex$d, wasmJson$c, 20).then((wasm) => {\n wasmCache$d = wasm;\n return wasmCache$d.calculate(data);\n });\n }\n try {\n const hash = wasmCache$d.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SHA-1 hash instance\n */\nfunction createSHA1() {\n return WASMInterface(wasmJson$c, 20).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 20,\n };\n return obj;\n });\n}\n\nvar name$b = \"sha3\";\nvar data$b = \"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\";\nvar hash$b = \"fb24e536\";\nvar wasmJson$b = {\n\tname: name$b,\n\tdata: data$b,\n\thash: hash$b\n};\n\nconst mutex$c = new Mutex();\nlet wasmCache$c = null;\nfunction validateBits$1(bits) {\n if (![224, 256, 384, 512].includes(bits)) {\n return new Error(\"Invalid variant! Valid values: 224, 256, 384, 512\");\n }\n return null;\n}\n/**\n * Calculates SHA-3 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param bits Number of output bits. Valid values: 224, 256, 384, 512\n * @returns Computed hash as a hexadecimal string\n */\nfunction sha3(data, bits = 512) {\n if (validateBits$1(bits)) {\n return Promise.reject(validateBits$1(bits));\n }\n const hashLength = bits / 8;\n if (wasmCache$c === null || wasmCache$c.hashLength !== hashLength) {\n return lockedCreate(mutex$c, wasmJson$b, hashLength).then((wasm) => {\n wasmCache$c = wasm;\n return wasmCache$c.calculate(data, bits, 0x06);\n });\n }\n try {\n const hash = wasmCache$c.calculate(data, bits, 0x06);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SHA-3 hash instance\n * @param bits Number of output bits. Valid values: 224, 256, 384, 512\n */\nfunction createSHA3(bits = 512) {\n if (validateBits$1(bits)) {\n return Promise.reject(validateBits$1(bits));\n }\n const outputSize = bits / 8;\n return WASMInterface(wasmJson$b, outputSize).then((wasm) => {\n wasm.init(bits);\n const obj = {\n init: () => {\n wasm.init(bits);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType, 0x06),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 200 - 2 * outputSize,\n digestSize: outputSize,\n };\n return obj;\n });\n}\n\nconst mutex$b = new Mutex();\nlet wasmCache$b = null;\nfunction validateBits(bits) {\n if (![224, 256, 384, 512].includes(bits)) {\n return new Error(\"Invalid variant! Valid values: 224, 256, 384, 512\");\n }\n return null;\n}\n/**\n * Calculates Keccak hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param bits Number of output bits. Valid values: 224, 256, 384, 512\n * @returns Computed hash as a hexadecimal string\n */\nfunction keccak(data, bits = 512) {\n if (validateBits(bits)) {\n return Promise.reject(validateBits(bits));\n }\n const hashLength = bits / 8;\n if (wasmCache$b === null || wasmCache$b.hashLength !== hashLength) {\n return lockedCreate(mutex$b, wasmJson$b, hashLength).then((wasm) => {\n wasmCache$b = wasm;\n return wasmCache$b.calculate(data, bits, 0x01);\n });\n }\n try {\n const hash = wasmCache$b.calculate(data, bits, 0x01);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new Keccak hash instance\n * @param bits Number of output bits. Valid values: 224, 256, 384, 512\n */\nfunction createKeccak(bits = 512) {\n if (validateBits(bits)) {\n return Promise.reject(validateBits(bits));\n }\n const outputSize = bits / 8;\n return WASMInterface(wasmJson$b, outputSize).then((wasm) => {\n wasm.init(bits);\n const obj = {\n init: () => {\n wasm.init(bits);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType, 0x01),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 200 - 2 * outputSize,\n digestSize: outputSize,\n };\n return obj;\n });\n}\n\nvar name$a = \"sha256\";\nvar data$a = \"AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwgHAAEBAQIAAwUEAQECAgYOAn8BQfCJBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKnEoHBQBBgAkLnQEAQQBCADcDwIkBQQBBHEEgIABB4AFGIgAbNgLoiQFBAEKnn+anxvST/b5/Qquzj/yRo7Pw2wAgABs3A+CJAUEAQrGWgP6fooWs6ABC/6S5iMWR2oKbfyAAGzcD2IkBQQBCl7rDg5Onlod3QvLmu+Ojp/2npX8gABs3A9CJAUEAQti9loj8oLW+NkLnzKfQ1tDrs7t/IAAbNwPIiQEL7wICAX4Gf0EAQQApA8CJASIBIACtfDcDwIkBAkACQAJAIAGnQT9xIgINAEGACSEDDAELAkBBwAAgAmsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFIAJBgIkBaiEGQQAhAgJAIANBBEkNACADQfwAcSEHQQAhAgNAIAYgAmoiAyACQYAJai0AADoAACADQQFqIAJBgQlqLQAAOgAAIANBAmogAkGCCWotAAA6AAAgA0EDaiACQYMJai0AADoAACAHIAJBBGoiAkcNAAsLIAVFDQADQCAGIAJqIAJBgAlqLQAAOgAAIAJBAWohAiAFQX9qIgUNAAsLIAAgBEkNAUGAiQEQAyAAIARrIQAgBEGACWohAwsCQCAAQcAASQ0AA0AgAxADIANBwABqIQMgAEFAaiIAQT9LDQALCyAARQ0AQQAhAkEAIQUDQCACQYCJAWogAyACai0AADoAACACQQFqIQIgACAFQQFqIgVB/wFxSw0ACwsLoz4BRX9BACAAKAI8IgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyIgFBGXcgAUEOd3MgAUEDdnMgACgCOCICQRh0IAJBgP4DcUEIdHIgAkEIdkGA/gNxIAJBGHZyciICaiAAKAIgIgNBGHQgA0GA/gNxQQh0ciADQQh2QYD+A3EgA0EYdnJyIgRBGXcgBEEOd3MgBEEDdnMgACgCHCIDQRh0IANBgP4DcUEIdHIgA0EIdkGA/gNxIANBGHZyciIFaiAAKAIEIgNBGHQgA0GA/gNxQQh0ciADQQh2QYD+A3EgA0EYdnJyIgZBGXcgBkEOd3MgBkEDdnMgACgCACIDQRh0IANBgP4DcUEIdHIgA0EIdkGA/gNxIANBGHZyciIHaiAAKAIkIgNBGHQgA0GA/gNxQQh0ciADQQh2QYD+A3EgA0EYdnJyIghqIAJBD3cgAkENd3MgAkEKdnNqIgNqIAAoAhgiCUEYdCAJQYD+A3FBCHRyIAlBCHZBgP4DcSAJQRh2cnIiCkEZdyAKQQ53cyAKQQN2cyAAKAIUIglBGHQgCUGA/gNxQQh0ciAJQQh2QYD+A3EgCUEYdnJyIgtqIAJqIAAoAhAiCUEYdCAJQYD+A3FBCHRyIAlBCHZBgP4DcSAJQRh2cnIiDEEZdyAMQQ53cyAMQQN2cyAAKAIMIglBGHQgCUGA/gNxQQh0ciAJQQh2QYD+A3EgCUEYdnJyIg1qIAAoAjAiCUEYdCAJQYD+A3FBCHRyIAlBCHZBgP4DcSAJQRh2cnIiDmogACgCCCIJQRh0IAlBgP4DcUEIdHIgCUEIdkGA/gNxIAlBGHZyciIPQRl3IA9BDndzIA9BA3ZzIAZqIAAoAigiCUEYdCAJQYD+A3FBCHRyIAlBCHZBgP4DcSAJQRh2cnIiEGogAUEPdyABQQ13cyABQQp2c2oiCUEPdyAJQQ13cyAJQQp2c2oiEUEPdyARQQ13cyARQQp2c2oiEkEPdyASQQ13cyASQQp2c2oiE2ogACgCNCIUQRh0IBRBgP4DcUEIdHIgFEEIdkGA/gNxIBRBGHZyciIVQRl3IBVBDndzIBVBA3ZzIA5qIBJqIAAoAiwiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnIiFkEZdyAWQQ53cyAWQQN2cyAQaiARaiAIQRl3IAhBDndzIAhBA3ZzIARqIAlqIAVBGXcgBUEOd3MgBUEDdnMgCmogAWogC0EZdyALQQ53cyALQQN2cyAMaiAVaiANQRl3IA1BDndzIA1BA3ZzIA9qIBZqIANBD3cgA0ENd3MgA0EKdnNqIhRBD3cgFEENd3MgFEEKdnNqIhdBD3cgF0ENd3MgF0EKdnNqIhhBD3cgGEENd3MgGEEKdnNqIhlBD3cgGUENd3MgGUEKdnNqIhpBD3cgGkENd3MgGkEKdnNqIhtBD3cgG0ENd3MgG0EKdnNqIhxBGXcgHEEOd3MgHEEDdnMgAkEZdyACQQ53cyACQQN2cyAVaiAYaiAOQRl3IA5BDndzIA5BA3ZzIBZqIBdqIBBBGXcgEEEOd3MgEEEDdnMgCGogFGogE0EPdyATQQ13cyATQQp2c2oiHUEPdyAdQQ13cyAdQQp2c2oiHkEPdyAeQQ13cyAeQQp2c2oiH2ogE0EZdyATQQ53cyATQQN2cyAYaiADQRl3IANBDndzIANBA3ZzIAFqIBlqIB9BD3cgH0ENd3MgH0EKdnNqIiBqIBJBGXcgEkEOd3MgEkEDdnMgF2ogH2ogEUEZdyARQQ53cyARQQN2cyAUaiAeaiAJQRl3IAlBDndzIAlBA3ZzIANqIB1qIBxBD3cgHEENd3MgHEEKdnNqIiFBD3cgIUENd3MgIUEKdnNqIiJBD3cgIkENd3MgIkEKdnNqIiNBD3cgI0ENd3MgI0EKdnNqIiRqIBtBGXcgG0EOd3MgG0EDdnMgHmogI2ogGkEZdyAaQQ53cyAaQQN2cyAdaiAiaiAZQRl3IBlBDndzIBlBA3ZzIBNqICFqIBhBGXcgGEEOd3MgGEEDdnMgEmogHGogF0EZdyAXQQ53cyAXQQN2cyARaiAbaiAUQRl3IBRBDndzIBRBA3ZzIAlqIBpqICBBD3cgIEENd3MgIEEKdnNqIiVBD3cgJUENd3MgJUEKdnNqIiZBD3cgJkENd3MgJkEKdnNqIidBD3cgJ0ENd3MgJ0EKdnNqIihBD3cgKEENd3MgKEEKdnNqIilBD3cgKUENd3MgKUEKdnNqIipBD3cgKkENd3MgKkEKdnNqIitBGXcgK0EOd3MgK0EDdnMgH0EZdyAfQQ53cyAfQQN2cyAbaiAnaiAeQRl3IB5BDndzIB5BA3ZzIBpqICZqIB1BGXcgHUEOd3MgHUEDdnMgGWogJWogJEEPdyAkQQ13cyAkQQp2c2oiLEEPdyAsQQ13cyAsQQp2c2oiLUEPdyAtQQ13cyAtQQp2c2oiLmogJEEZdyAkQQ53cyAkQQN2cyAnaiAgQRl3ICBBDndzICBBA3ZzIBxqIChqIC5BD3cgLkENd3MgLkEKdnNqIi9qICNBGXcgI0EOd3MgI0EDdnMgJmogLmogIkEZdyAiQQ53cyAiQQN2cyAlaiAtaiAhQRl3ICFBDndzICFBA3ZzICBqICxqICtBD3cgK0ENd3MgK0EKdnNqIjBBD3cgMEENd3MgMEEKdnNqIjFBD3cgMUENd3MgMUEKdnNqIjJBD3cgMkENd3MgMkEKdnNqIjNqICpBGXcgKkEOd3MgKkEDdnMgLWogMmogKUEZdyApQQ53cyApQQN2cyAsaiAxaiAoQRl3IChBDndzIChBA3ZzICRqIDBqICdBGXcgJ0EOd3MgJ0EDdnMgI2ogK2ogJkEZdyAmQQ53cyAmQQN2cyAiaiAqaiAlQRl3ICVBDndzICVBA3ZzICFqIClqIC9BD3cgL0ENd3MgL0EKdnNqIjRBD3cgNEENd3MgNEEKdnNqIjVBD3cgNUENd3MgNUEKdnNqIjZBD3cgNkENd3MgNkEKdnNqIjdBD3cgN0ENd3MgN0EKdnNqIjhBD3cgOEENd3MgOEEKdnNqIjlBD3cgOUENd3MgOUEKdnNqIjogOCA0IC4gLCAhIBsgGSADIA4gBEEAKALYiQEiO0EadyA7QRV3cyA7QQd3c0EAKALkiQEiPGpBACgC4IkBIj1BACgC3IkBIj5zIDtxID1zaiAHakGY36iUBGoiB0EAKALUiQEiP2oiACAMaiA7IA1qID4gD2ogPSAGaiAAID4gO3NxID5zaiAAQRp3IABBFXdzIABBB3dzakGRid2JB2oiQEEAKALQiQEiQWoiDCAAIDtzcSA7c2ogDEEadyAMQRV3cyAMQQd3c2pBz/eDrntqIkJBACgCzIkBIkNqIg0gDCAAc3EgAHNqIA1BGncgDUEVd3MgDUEHd3NqQaW3181+aiJEQQAoAsiJASIAaiIPIA0gDHNxIAxzaiAPQRp3IA9BFXdzIA9BB3dzakHbhNvKA2oiRSBBIEMgAHNxIEMgAHFzIABBHncgAEETd3MgAEEKd3NqIAdqIgZqIgdqIAUgD2ogCiANaiALIAxqIAcgDyANc3EgDXNqIAdBGncgB0EVd3MgB0EHd3NqQfGjxM8FaiIKIAYgAHMgQ3EgBiAAcXMgBkEedyAGQRN3cyAGQQp3c2ogQGoiDGoiBCAHIA9zcSAPc2ogBEEadyAEQRV3cyAEQQd3c2pBpIX+kXlqIgsgDCAGcyAAcSAMIAZxcyAMQR53IAxBE3dzIAxBCndzaiBCaiINaiIPIAQgB3NxIAdzaiAPQRp3IA9BFXdzIA9BB3dzakHVvfHYemoiQCANIAxzIAZxIA0gDHFzIA1BHncgDUETd3MgDUEKd3NqIERqIgZqIgcgDyAEc3EgBHNqIAdBGncgB0EVd3MgB0EHd3NqQZjVnsB9aiJCIAYgDXMgDHEgBiANcXMgBkEedyAGQRN3cyAGQQp3c2ogRWoiDGoiBWogFiAHaiAQIA9qIAggBGogBSAHIA9zcSAPc2ogBUEadyAFQRV3cyAFQQd3c2pBgbaNlAFqIgggDCAGcyANcSAMIAZxcyAMQR53IAxBE3dzIAxBCndzaiAKaiINaiIPIAUgB3NxIAdzaiAPQRp3IA9BFXdzIA9BB3dzakG+i8ahAmoiDiANIAxzIAZxIA0gDHFzIA1BHncgDUETd3MgDUEKd3NqIAtqIgZqIgcgDyAFc3EgBXNqIAdBGncgB0EVd3MgB0EHd3NqQcP7sagFaiIQIAYgDXMgDHEgBiANcXMgBkEedyAGQRN3cyAGQQp3c2ogQGoiDGoiBCAHIA9zcSAPc2ogBEEadyAEQRV3cyAEQQd3c2pB9Lr5lQdqIhYgDCAGcyANcSAMIAZxcyAMQR53IAxBE3dzIAxBCndzaiBCaiINaiIFaiABIARqIAIgB2ogFSAPaiAFIAQgB3NxIAdzaiAFQRp3IAVBFXdzIAVBB3dzakH+4/qGeGoiByANIAxzIAZxIA0gDHFzIA1BHncgDUETd3MgDUEKd3NqIAhqIgFqIgYgBSAEc3EgBHNqIAZBGncgBkEVd3MgBkEHd3NqQaeN8N55aiIEIAEgDXMgDHEgASANcXMgAUEedyABQRN3cyABQQp3c2ogDmoiAmoiDCAGIAVzcSAFc2ogDEEadyAMQRV3cyAMQQd3c2pB9OLvjHxqIgUgAiABcyANcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAQaiIDaiINIAwgBnNxIAZzaiANQRp3IA1BFXdzIA1BB3dzakHB0+2kfmoiCCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBZqIgFqIg8gF2ogESANaiAUIAxqIAkgBmogDyANIAxzcSAMc2ogD0EadyAPQRV3cyAPQQd3c2pBho/5/X5qIgYgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAHaiICaiIJIA8gDXNxIA1zaiAJQRp3IAlBFXdzIAlBB3dzakHGu4b+AGoiDCACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIARqIgNqIhEgCSAPc3EgD3NqIBFBGncgEUEVd3MgEUEHd3NqQczDsqACaiINIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogBWoiAWoiFCARIAlzcSAJc2ogFEEadyAUQRV3cyAUQQd3c2pB79ik7wJqIg8gASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAIaiICaiIXaiATIBRqIBggEWogEiAJaiAXIBQgEXNxIBFzaiAXQRp3IBdBFXdzIBdBB3dzakGqidLTBGoiGCACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIAZqIgNqIgkgFyAUc3EgFHNqIAlBGncgCUEVd3MgCUEHd3NqQdzTwuUFaiIUIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogDGoiAWoiESAJIBdzcSAXc2ogEUEadyARQRV3cyARQQd3c2pB2pHmtwdqIhcgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiANaiICaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakHSovnBeWoiGSACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIA9qIgNqIhNqIB4gEmogGiARaiAdIAlqIBMgEiARc3EgEXNqIBNBGncgE0EVd3MgE0EHd3NqQe2Mx8F6aiIaIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogGGoiAWoiCSATIBJzcSASc2ogCUEadyAJQRV3cyAJQQd3c2pByM+MgHtqIhggASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAUaiICaiIRIAkgE3NxIBNzaiARQRp3IBFBFXdzIBFBB3dzakHH/+X6e2oiFCACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBdqIgNqIhIgESAJc3EgCXNqIBJBGncgEkEVd3MgEkEHd3NqQfOXgLd8aiIXIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogGWoiAWoiE2ogICASaiAcIBFqIB8gCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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\";\nvar hash$a = \"8c18dd94\";\nvar wasmJson$a = {\n\tname: name$a,\n\tdata: data$a,\n\thash: hash$a\n};\n\nconst mutex$a = new Mutex();\nlet wasmCache$a = null;\n/**\n * Calculates SHA-2 (SHA-224) hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction sha224(data) {\n if (wasmCache$a === null) {\n return lockedCreate(mutex$a, wasmJson$a, 28).then((wasm) => {\n wasmCache$a = wasm;\n return wasmCache$a.calculate(data, 224);\n });\n }\n try {\n const hash = wasmCache$a.calculate(data, 224);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SHA-2 (SHA-224) hash instance\n */\nfunction createSHA224() {\n return WASMInterface(wasmJson$a, 28).then((wasm) => {\n wasm.init(224);\n const obj = {\n init: () => {\n wasm.init(224);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 28,\n };\n return obj;\n });\n}\n\nconst mutex$9 = new Mutex();\nlet wasmCache$9 = null;\n/**\n * Calculates SHA-2 (SHA-256) hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction sha256(data) {\n if (wasmCache$9 === null) {\n return lockedCreate(mutex$9, wasmJson$a, 32).then((wasm) => {\n wasmCache$9 = wasm;\n return wasmCache$9.calculate(data, 256);\n });\n }\n try {\n const hash = wasmCache$9.calculate(data, 256);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SHA-2 (SHA-256) hash instance\n */\nfunction createSHA256() {\n return WASMInterface(wasmJson$a, 32).then((wasm) => {\n wasm.init(256);\n const obj = {\n init: () => {\n wasm.init(256);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 32,\n };\n return obj;\n });\n}\n\nvar name$9 = \"sha512\";\nvar data$9 = \"AGFzbQEAAAABEQRgAAF/YAF/AGAAAGACf38AAwgHAAEBAQIAAwUEAQECAgYOAn8BQdCKBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKlWgHBQBBgAkLmwIAQQBCADcDgIoBQQBBMEHAACAAQYADRiIAGzYCyIoBQQBCpJ/p99uD0trHAEL5wvibkaOz8NsAIAAbNwPAigFBAEKnn+an1sGLhltC6/qG2r+19sEfIAAbNwO4igFBAEKRquDC9tCS2o5/Qp/Y+dnCkdqCm38gABs3A7CKAUEAQrGWgP7/zMmZ5wBC0YWa7/rPlIfRACAAGzcDqIoBQQBCubK5uI+b+5cVQvHt9Pilp/2npX8gABs3A6CKAUEAQpe6w4Ojq8CskX9Cq/DT9K/uvLc8IAAbNwOYigFBAEKHqvOzo6WKzeIAQrvOqqbY0Ouzu38gABs3A5CKAUEAQti9lojcq+fdS0KIkvOd/8z5hOoAIAAbNwOIigEL8gICAX4Gf0EAQQApA4CKASIBIACtfDcDgIoBAkACQAJAIAGnQf8AcSICDQBBgAkhAwwBCwJAQYABIAJrIgQgACAEIABJGyIDRQ0AIANBA3EhBSACQYCJAWohBkEAIQICQCADQQRJDQAgA0H8AXEhB0EAIQIDQCAGIAJqIgMgAkGACWotAAA6AAAgA0EBaiACQYEJai0AADoAACADQQJqIAJBgglqLQAAOgAAIANBA2ogAkGDCWotAAA6AAAgByACQQRqIgJHDQALCyAFRQ0AA0AgBiACaiACQYAJai0AADoAACACQQFqIQIgBUF/aiIFDQALCyAAIARJDQFBgIkBEAMgACAEayEAIARBgAlqIQMLAkAgAEGAAUkNAANAIAMQAyADQYABaiEDIABBgH9qIgBB/wBLDQALCyAARQ0AQQAhAkEAIQUDQCACQYCJAWogAyACai0AADoAACACQQFqIQIgACAFQQFqIgVB/wFxSw0ACwsL3FYBVn5BACAAKQMIIgFCOIYgAUKA/gODQiiGhCABQoCA/AeDQhiGIAFCgICA+A+DQgiGhIQgAUIIiEKAgID4D4MgAUIYiEKAgPwHg4QgAUIoiEKA/gODIAFCOIiEhIQiAkI/iSACQjiJhSACQgeIhSAAKQMAIgFCOIYgAUKA/gODQiiGhCABQoCA/AeDQhiGIAFCgICA+A+DQgiGhIQgAUIIiEKAgID4D4MgAUIYiEKAgPwHg4QgAUIoiEKA/gODIAFCOIiEhIQiA3wgACkDSCIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4DgyABQjiIhISEIgR8IAApA3AiAUI4hiABQoD+A4NCKIaEIAFCgID8B4NCGIYgAUKAgID4D4NCCIaEhCABQgiIQoCAgPgPgyABQhiIQoCA/AeDhCABQiiIQoD+A4MgAUI4iISEhCIFQi2JIAVCA4mFIAVCBoiFfCIGQj+JIAZCOImFIAZCB4iFIAApA3giAUI4hiABQoD+A4NCKIaEIAFCgID8B4NCGIYgAUKAgID4D4NCCIaEhCABQgiIQoCAgPgPgyABQhiIQoCA/AeDhCABQiiIQoD+A4MgAUI4iISEhCIHfCAEQj+JIARCOImFIARCB4iFIAApA0AiAUI4hiABQoD+A4NCKIaEIAFCgID8B4NCGIYgAUKAgID4D4NCCIaEhCABQgiIQoCAgPgPgyABQhiIQoCA/AeDhCABQiiIQoD+A4MgAUI4iISEhCIIfCAAKQMQIgFCOIYgAUKA/gODQiiGhCABQoCA/AeDQhiGIAFCgICA+A+DQgiGhIQgAUIIiEKAgID4D4MgAUIYiEKAgPwHg4QgAUIoiEKA/gODIAFCOIiEhIQiCUI/iSAJQjiJhSAJQgeIhSACfCAAKQNQIgFCOIYgAUKA/gODQiiGhCABQoCA/AeDQhiGIAFCgICA+A+DQgiGhIQgAUIIiEKAgID4D4MgAUIYiEKAgPwHg4QgAUIoiEKA/gODIAFCOIiEhIQiCnwgB0ItiSAHQgOJhSAHQgaIhXwiC3wgACkDOCIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4DgyABQjiIhISEIgxCP4kgDEI4iYUgDEIHiIUgACkDMCIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4DgyABQjiIhISEIg18IAd8IAApAygiAUI4hiABQoD+A4NCKIaEIAFCgID8B4NCGIYgAUKAgID4D4NCCIaEhCABQgiIQoCAgPgPgyABQhiIQoCA/AeDhCABQiiIQoD+A4MgAUI4iISEhCIOQj+JIA5COImFIA5CB4iFIAApAyAiAUI4hiABQoD+A4NCKIaEIAFCgID8B4NCGIYgAUKAgID4D4NCCIaEhCABQgiIQoCAgPgPgyABQhiIQoCA/AeDhCABQiiIQoD+A4MgAUI4iISEhCIPfCAAKQNoIgFCOIYgAUKA/gODQiiGhCABQoCA/AeDQhiGIAFCgICA+A+DQgiGhIQgAUIIiEKAgID4D4MgAUIYiEKAgPwHg4QgAUIoiEKA/gODIAFCOIiEhIQiEHwgACkDGCIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4DgyABQjiIhISEIhFCP4kgEUI4iYUgEUIHiIUgCXwgACkDWCIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4DgyABQjiIhISEIhJ8IAZCLYkgBkIDiYUgBkIGiIV8IhNCLYkgE0IDiYUgE0IGiIV8IhRCLYkgFEIDiYUgFEIGiIV8IhVCLYkgFUIDiYUgFUIGiIV8IhZ8IAVCP4kgBUI4iYUgBUIHiIUgEHwgFXwgACkDYCIBQjiGIAFCgP4Dg0IohoQgAUKAgPwHg0IYhiABQoCAgPgPg0IIhoSEIAFCCIhCgICA+A+DIAFCGIhCgID8B4OEIAFCKIhCgP4DgyABQjiIhISEIhdCP4kgF0I4iYUgF0IHiIUgEnwgFHwgCkI/iSAKQjiJhSAKQgeIhSAEfCATfCAIQj+JIAhCOImFIAhCB4iFIAx8IAZ8IA1CP4kgDUI4iYUgDUIHiIUgDnwgBXwgD0I/iSAPQjiJhSAPQgeIhSARfCAXfCALQi2JIAtCA4mFIAtCBoiFfCIYQi2JIBhCA4mFIBhCBoiFfCIZQi2JIBlCA4mFIBlCBoiFfCIaQi2JIBpCA4mFIBpCBoiFfCIbQi2JIBtCA4mFIBtCBoiFfCIcQi2JIBxCA4mFIBxCBoiFfCIdQi2JIB1CA4mFIB1CBoiFfCIeQj+JIB5COImFIB5CB4iFIAdCP4kgB0I4iYUgB0IHiIUgBXwgGnwgEEI/iSAQQjiJhSAQQgeIhSAXfCAZfCASQj+JIBJCOImFIBJCB4iFIAp8IBh8IBZCLYkgFkIDiYUgFkIGiIV8Ih9CLYkgH0IDiYUgH0IGiIV8IiBCLYkgIEIDiYUgIEIGiIV8IiF8IBZCP4kgFkI4iYUgFkIHiIUgGnwgC0I/iSALQjiJhSALQgeIhSAGfCAbfCAhQi2JICFCA4mFICFCBoiFfCIifCAVQj+JIBVCOImFIBVCB4iFIBl8ICF8IBRCP4kgFEI4iYUgFEIHiIUgGHwgIHwgE0I/iSATQjiJhSATQgeIhSALfCAffCAeQi2JIB5CA4mFIB5CBoiFfCIjQi2JICNCA4mFICNCBoiFfCIkQi2JICRCA4mFICRCBoiFfCIlQi2JICVCA4mFICVCBoiFfCImfCAdQj+JIB1COImFIB1CB4iFICB8ICV8IBxCP4kgHEI4iYUgHEIHiIUgH3wgJHwgG0I/iSAbQjiJhSAbQgeIhSAWfCAjfCAaQj+JIBpCOImFIBpCB4iFIBV8IB58IBlCP4kgGUI4iYUgGUIHiIUgFHwgHXwgGEI/iSAYQjiJhSAYQgeIhSATfCAcfCAiQi2JICJCA4mFICJCBoiFfCInQi2JICdCA4mFICdCBoiFfCIoQi2JIChCA4mFIChCBoiFfCIpQi2JIClCA4mFIClCBoiFfCIqQi2JICpCA4mFICpCBoiFfCIrQi2JICtCA4mFICtCBoiFfCIsQi2JICxCA4mFICxCBoiFfCItQj+JIC1COImFIC1CB4iFICFCP4kgIUI4iYUgIUIHiIUgHXwgKXwgIEI/iSAgQjiJhSAgQgeIhSAcfCAofCAfQj+JIB9COImFIB9CB4iFIBt8ICd8ICZCLYkgJkIDiYUgJkIGiIV8Ii5CLYkgLkIDiYUgLkIGiIV8Ii9CLYkgL0IDiYUgL0IGiIV8IjB8ICZCP4kgJkI4iYUgJkIHiIUgKXwgIkI/iSAiQjiJhSAiQgeIhSAefCAqfCAwQi2JIDBCA4mFIDBCBoiFfCIxfCAlQj+JICVCOImFICVCB4iFICh8IDB8ICRCP4kgJEI4iYUgJEIHiIUgJ3wgL3wgI0I/iSAjQjiJhSAjQgeIhSAifCAufCAtQi2JIC1CA4mFIC1CBoiFfCIyQi2JIDJCA4mFIDJCBoiFfCIzQi2JIDNCA4mFIDNCBoiFfCI0Qi2JIDRCA4mFIDRCBoiFfCI1fCAsQj+JICxCOImFICxCB4iFIC98IDR8ICtCP4kgK0I4iYUgK0IHiIUgLnwgM3wgKkI/iSAqQjiJhSAqQgeIhSAmfCAyfCApQj+JIClCOImFIClCB4iFICV8IC18IChCP4kgKEI4iYUgKEIHiIUgJHwgLHwgJ0I/iSAnQjiJhSAnQgeIhSAjfCArfCAxQi2JIDFCA4mFIDFCBoiFfCI2Qi2JIDZCA4mFIDZCBoiFfCI3Qi2JIDdCA4mFIDdCBoiFfCI4Qi2JIDhCA4mFIDhCBoiFfCI5Qi2JIDlCA4mFIDlCBoiFfCI6Qi2JIDpCA4mFIDpCBoiFfCI7Qi2JIDtCA4mFIDtCBoiFfCI8Qj+JIDxCOImFIDxCB4iFIDBCP4kgMEI4iYUgMEIHiIUgLHwgOHwgL0I/iSAvQjiJhSAvQgeIhSArfCA3fCAuQj+JIC5COImFIC5CB4iFICp8IDZ8IDVCLYkgNUIDiYUgNUIGiIV8Ij1CLYkgPUIDiYUgPUIGiIV8Ij5CLYkgPkIDiYUgPkIGiIV8Ij98IDVCP4kgNUI4iYUgNUIHiIUgOHwgMUI/iSAxQjiJhSAxQgeIhSAtfCA5fCA/Qi2JID9CA4mFID9CBoiFfCJAfCA0Qj+JIDRCOImFIDRCB4iFIDd8ID98IDNCP4kgM0I4iYUgM0IHiIUgNnwgPnwgMkI/iSAyQjiJhSAyQgeIhSAxfCA9fCA8Qi2JIDxCA4mFIDxCBoiFfCJBQi2JIEFCA4mFIEFCBoiFfCJCQi2JIEJCA4mFIEJCBoiFfCJDQi2JIENCA4mFIENCBoiFfCJEfCA7Qj+JIDtCOImFIDtCB4iFID58IEN8IDpCP4kgOkI4iYUgOkIHiIUgPXwgQnwgOUI/iSA5QjiJhSA5QgeIhSA1fCBBfCA4Qj+JIDhCOImFIDhCB4iFIDR8IDx8IDdCP4kgN0I4iYUgN0IHiIUgM3wgO3wgNkI/iSA2QjiJhSA2QgeIhSAyfCA6fCBAQi2JIEBCA4mFIEBCBoiFfCJFQi2JIEVCA4mFIEVCBoiFfCJGQi2JIEZCA4mFIEZCBoiFfCJHQi2JIEdCA4mFIEdCBoiFfCJIQi2JIEhCA4mFIEhCBoiFfCJJQi2JIElCA4mFIElCBoiFfCJKQi2JIEpCA4mFIEpCBoiFfCJLIEkgRSA/ID0gMiAsICogIiAgIBYgBiAXIAhBACkDqIoBIkxCMokgTEIuiYUgTEIXiYVBACkDwIoBIk18QQApA7iKASJOQQApA7CKASJPhSBMgyBOhXwgA3xCotyiuY3zi8XCAHwiA0EAKQOgigEiUHwiASAPfCBMIBF8IE8gCXwgTiACfCABIE8gTIWDIE+FfCABQjKJIAFCLomFIAFCF4mFfELNy72fkpLRm/EAfCJRQQApA5iKASJSfCIJIAEgTIWDIEyFfCAJQjKJIAlCLomFIAlCF4mFfEKv9rTi/vm+4LV/fCJTQQApA5CKASJUfCIPIAkgAYWDIAGFfCAPQjKJIA9CLomFIA9CF4mFfEK8t6eM2PT22ml8IlVBACkDiIoBIgF8IhEgDyAJhYMgCYV8IBFCMokgEUIuiYUgEUIXiYV8Qrjqopq/y7CrOXwiViBSIFQgAYWDIFQgAYOFIAFCJIkgAUIeiYUgAUIZiYV8IAN8IgJ8IgN8IAwgEXwgDSAPfCAOIAl8IAMgESAPhYMgD4V8IANCMokgA0IuiYUgA0IXiYV8Qpmgl7CbvsT42QB8Ig0gAiABhSBUgyACIAGDhSACQiSJIAJCHomFIAJCGYmFfCBRfCIJfCIIIAMgEYWDIBGFfCAIQjKJIAhCLomFIAhCF4mFfEKbn+X4ytTgn5J/fCIOIAkgAoUgAYMgCSACg4UgCUIkiSAJQh6JhSAJQhmJhXwgU3wiD3wiESAIIAOFgyADhXwgEUIyiSARQi6JhSARQheJhXxCmIK2093al46rf3wiUSAPIAmFIAKDIA8gCYOFIA9CJIkgD0IeiYUgD0IZiYV8IFV8IgJ8IgMgESAIhYMgCIV8IANCMokgA0IuiYUgA0IXiYV8QsKEjJiK0+qDWHwiUyACIA+FIAmDIAIgD4OFIAJCJIkgAkIeiYUgAkIZiYV8IFZ8Igl8Igx8IBIgA3wgCiARfCAEIAh8IAwgAyARhYMgEYV8IAxCMokgDEIuiYUgDEIXiYV8Qr7fwauU4NbBEnwiBCAJIAKFIA+DIAkgAoOFIAlCJIkgCUIeiYUgCUIZiYV8IA18Ig98IhEgDCADhYMgA4V8IBFCMokgEUIuiYUgEUIXiYV8Qozlkvfkt+GYJHwiCiAPIAmFIAKDIA8gCYOFIA9CJIkgD0IeiYUgD0IZiYV8IA58IgJ8IgMgESAMhYMgDIV8IANCMokgA0IuiYUgA0IXiYV8QuLp/q+9uJ+G1QB8IhIgAiAPhSAJgyACIA+DhSACQiSJIAJCHomFIAJCGYmFfCBRfCIJfCIIIAMgEYWDIBGFfCAIQjKJIAhCLomFIAhCF4mFfELvku6Tz66X3/IAfCIXIAkgAoUgD4MgCSACg4UgCUIkiSAJQh6JhSAJQhmJhXwgU3wiD3wiDHwgByAIfCAFIAN8IBAgEXwgDCAIIAOFgyADhXwgDEIyiSAMQi6JhSAMQheJhXxCsa3a2OO/rO+Af3wiAyAPIAmFIAKDIA8gCYOFIA9CJIkgD0IeiYUgD0IZiYV8IAR8IgV8IgIgDCAIhYMgCIV8IAJCMokgAkIuiYUgAkIXiYV8QrWknK7y1IHum398IgggBSAPhSAJgyAFIA+DhSAFQiSJIAVCHomFIAVCGYmFfCAKfCIGfCIJIAIgDIWDIAyFfCAJQjKJIAlCLomFIAlCF4mFfEKUzaT7zK78zUF8IgwgBiAFhSAPgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCASfCIHfCIPIAkgAoWDIAKFfCAPQjKJIA9CLomFIA9CF4mFfELSlcX3mbjazWR8IgQgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAXfCIFfCIRIBR8IBggD3wgEyAJfCALIAJ8IBEgDyAJhYMgCYV8IBFCMokgEUIuiYUgEUIXiYV8QuPLvMLj8JHfb3wiAiAFIAeFIAaDIAUgB4OFIAVCJIkgBUIeiYUgBUIZiYV8IAN8IgZ8IgsgESAPhYMgD4V8IAtCMokgC0IuiYUgC0IXiYV8QrWrs9zouOfgD3wiCSAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IAh8Igd8IhMgCyARhYMgEYV8IBNCMokgE0IuiYUgE0IXiYV8QuW4sr3HuaiGJHwiDyAHIAaFIAWDIAcgBoOFIAdCJIkgB0IeiYUgB0IZiYV8IAx8IgV8IhQgEyALhYMgC4V8IBRCMokgFEIuiYUgFEIXiYV8QvWErMn1jcv0LXwiESAFIAeFIAaDIAUgB4OFIAVCJIkgBUIeiYUgBUIZiYV8IAR8IgZ8Ihh8IBogFHwgFSATfCAZIAt8IBggFCAThYMgE4V8IBhCMokgGEIuiYUgGEIXiYV8QoPJm/WmlaG6ygB8IhYgBiAFhSAHgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCACfCIHfCILIBggFIWDIBSFfCALQjKJIAtCLomFIAtCF4mFfELU94fqy7uq2NwAfCIZIAcgBoUgBYMgByAGg4UgB0IkiSAHQh6JhSAHQhmJhXwgCXwiBXwiEyALIBiFgyAYhXwgE0IyiSATQi6JhSATQheJhXxCtafFmKib4vz2AHwiGCAFIAeFIAaDIAUgB4OFIAVCJIkgBUIeiYUgBUIZiYV8IA98IgZ8IhQgEyALhYMgC4V8IBRCMokgFEIuiYUgFEIXiYV8Qqu/m/OuqpSfmH98IhogBiAFhSAHgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCARfCIHfCIVfCAcIBR8IB8gE3wgGyALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfEKQ5NDt0s3xmKh/fCIbIAcgBoUgBYMgByAGg4UgB0IkiSAHQh6JhSAHQhmJhXwgFnwiBXwiCyAVIBSFgyAUhXwgC0IyiSALQi6JhSALQheJhXxCv8Lsx4n5yYGwf3wiFiAFIAeFIAaDIAUgB4OFIAVCJIkgBUIeiYUgBUIZiYV8IBl8IgZ8IhMgCyAVhYMgFYV8IBNCMokgE0IuiYUgE0IXiYV8QuSdvPf7+N+sv398IhkgBiAFhSAHgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCAYfCIHfCIUIBMgC4WDIAuFfCAUQjKJIBRCLomFIBRCF4mFfELCn6Lts/6C8EZ8IhggByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAafCIFfCIVfCAeIBR8ICEgE3wgHSALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfEKlzqqY+ajk01V8IhogBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAbfCIGfCILIBUgFIWDIBSFfCALQjKJIAtCLomFIAtCF4mFfELvhI6AnuqY5QZ8IhsgBiAFhSAHgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCAWfCIHfCITIAsgFYWDIBWFfCATQjKJIBNCLomFIBNCF4mFfELw3LnQ8KzKlBR8IhYgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAZfCIFfCIUIBMgC4WDIAuFfCAUQjKJIBRCLomFIBRCF4mFfEL838i21NDC2yd8IhkgBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAYfCIGfCIVICh8ICQgFHwgJyATfCAjIAt8IBUgFCAThYMgE4V8IBVCMokgFUIuiYUgFUIXiYV8QqaSm+GFp8iNLnwiGCAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBp8Igd8IgsgFSAUhYMgFIV8IAtCMokgC0IuiYUgC0IXiYV8Qu3VkNbFv5uWzQB8IhogByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAbfCIFfCITIAsgFYWDIBWFfCATQjKJIBNCLomFIBNCF4mFfELf59bsuaKDnNMAfCIbIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgFnwiBnwiFCATIAuFgyALhXwgFEIyiSAUQi6JhSAUQheJhXxC3se93cjqnIXlAHwiFiAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBl8Igd8IhV8ICYgFHwgKSATfCAlIAt8IBUgFCAThYMgE4V8IBVCMokgFUIuiYUgFUIXiYV8Qqjl3uOz14K19gB8IhkgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAYfCIFfCILIBUgFIWDIBSFfCALQjKJIAtCLomFIAtCF4mFfELm3ba/5KWy4YF/fCIYIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgGnwiBnwiEyALIBWFgyAVhXwgE0IyiSATQi6JhSATQheJhXxCu+qIpNGQi7mSf3wiGiAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBt8Igd8IhQgEyALhYMgC4V8IBRCMokgFEIuiYUgFEIXiYV8QuSGxOeUlPrfon98IhsgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAWfCIFfCIVfCAvIBR8ICsgE3wgLiALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfEKB4Ijiu8mZjah/fCIWIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgGXwiBnwiCyAVIBSFgyAUhXwgC0IyiSALQi6JhSALQheJhXxCka/ih43u4qVCfCIZIAYgBYUgB4MgBiAFg4UgBkIkiSAGQh6JhSAGQhmJhXwgGHwiB3wiEyALIBWFgyAVhXwgE0IyiSATQi6JhSATQheJhXxCsPzSsrC0lLZHfCIYIAcgBoUgBYMgByAGg4UgB0IkiSAHQh6JhSAHQhmJhXwgGnwiBXwiFCATIAuFgyALhXwgFEIyiSAUQi6JhSAUQheJhXxCmKS9t52DuslRfCIaIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgG3wiBnwiFXwgMSAUfCAtIBN8IDAgC3wgFSAUIBOFgyAThXwgFUIyiSAVQi6JhSAVQheJhXxCkNKWq8XEwcxWfCIbIAYgBYUgB4MgBiAFg4UgBkIkiSAGQh6JhSAGQhmJhXwgFnwiB3wiCyAVIBSFgyAUhXwgC0IyiSALQi6JhSALQheJhXxCqsDEu9WwjYd0fCIWIAcgBoUgBYMgByAGg4UgB0IkiSAHQh6JhSAHQhmJhXwgGXwiBXwiEyALIBWFgyAVhXwgE0IyiSATQi6JhSATQheJhXxCuKPvlYOOqLUQfCIZIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgGHwiBnwiFCATIAuFgyALhXwgFEIyiSAUQi6JhSAUQheJhXxCyKHLxuuisNIZfCIYIAYgBYUgB4MgBiAFg4UgBkIkiSAGQh6JhSAGQhmJhXwgGnwiB3wiFSA0fCA3IBR8IDMgE3wgNiALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfELT1oaKhYHbmx58IhogByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAbfCIFfCILIBUgFIWDIBSFfCALQjKJIAtCLomFIAtCF4mFfEKZ17v8zemdpCd8IhsgBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAWfCIGfCITIAsgFYWDIBWFfCATQjKJIBNCLomFIBNCF4mFfEKoke2M3pav2DR8IhYgBiAFhSAHgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCAZfCIHfCIUIBMgC4WDIAuFfCAUQjKJIBRCLomFIBRCF4mFfELjtKWuvJaDjjl8IhkgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAYfCIFfCIVfCA5IBR8IDUgE3wgOCALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfELLlYaarsmq7M4AfCIYIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgGnwiBnwiCyAVIBSFgyAUhXwgC0IyiSALQi6JhSALQheJhXxC88aPu/fJss7bAHwiGiAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBt8Igd8IhMgCyAVhYMgFYV8IBNCMokgE0IuiYUgE0IXiYV8QqPxyrW9/puX6AB8IhsgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAWfCIFfCIUIBMgC4WDIAuFfCAUQjKJIBRCLomFIBRCF4mFfEL85b7v5d3gx/QAfCIWIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgGXwiBnwiFXwgOyAUfCA+IBN8IDogC3wgFSAUIBOFgyAThXwgFUIyiSAVQi6JhSAVQheJhXxC4N7cmPTt2NL4AHwiGSAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBh8Igd8IgsgFSAUhYMgFIV8IAtCMokgC0IuiYUgC0IXiYV8QvLWwo/Kgp7khH98IhggByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAafCIFfCITIAsgFYWDIBWFfCATQjKJIBNCLomFIBNCF4mFfELs85DTgcHA44x/fCIaIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgG3wiBnwiFCATIAuFgyALhXwgFEIyiSAUQi6JhSAUQheJhXxCqLyMm6L/v9+Qf3wiGyAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBZ8Igd8IhV8IEEgFHwgQCATfCA8IAt8IBUgFCAThYMgE4V8IBVCMokgFUIuiYUgFUIXiYV8Qun7ivS9nZuopH98IhYgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAZfCIFfCILIBUgFIWDIBSFfCALQjKJIAtCLomFIAtCF4mFfEKV8pmW+/7o/L5/fCIZIAUgB4UgBoMgBSAHg4UgBUIkiSAFQh6JhSAFQhmJhXwgGHwiBnwiEyALIBWFgyAVhXwgE0IyiSATQi6JhSATQheJhXxCq6bJm66e3rhGfCIYIAYgBYUgB4MgBiAFg4UgBkIkiSAGQh6JhSAGQhmJhXwgGnwiB3wiFCATIAuFgyALhXwgFEIyiSAUQi6JhSAUQheJhXxCnMOZ0e7Zz5NKfCIaIAcgBoUgBYMgByAGg4UgB0IkiSAHQh6JhSAHQhmJhXwgG3wiBXwiFSBHfCBDIBR8IEYgE3wgQiALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfEKHhIOO8piuw1F8IhsgBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAWfCIGfCILIBUgFIWDIBSFfCALQjKJIAtCLomFIAtCF4mFfEKe1oPv7Lqf7Wp8IhYgBiAFhSAHgyAGIAWDhSAGQiSJIAZCHomFIAZCGYmFfCAZfCIHfCITIAsgFYWDIBWFfCATQjKJIBNCLomFIBNCF4mFfEL4orvz/u/TvnV8IhkgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAYfCIFfCIUIBMgC4WDIAuFfCAUQjKJIBRCLomFIBRCF4mFfEK6392Qp/WZ+AZ8IhwgBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAafCIGfCIVfCA9Qj+JID1COImFID1CB4iFIDl8IEV8IERCLYkgREIDiYUgREIGiIV8IhggFHwgSCATfCBEIAt8IBUgFCAThYMgE4V8IBVCMokgFUIuiYUgFUIXiYV8QqaxopbauN+xCnwiGiAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBt8Igd8IgsgFSAUhYMgFIV8IAtCMokgC0IuiYUgC0IXiYV8Qq6b5PfLgOafEXwiGyAHIAaFIAWDIAcgBoOFIAdCJIkgB0IeiYUgB0IZiYV8IBZ8IgV8IhMgCyAVhYMgFYV8IBNCMokgE0IuiYUgE0IXiYV8QpuO8ZjR5sK4G3wiHSAFIAeFIAaDIAUgB4OFIAVCJIkgBUIeiYUgBUIZiYV8IBl8IgZ8IhQgEyALhYMgC4V8IBRCMokgFEIuiYUgFEIXiYV8QoT7kZjS/t3tKHwiHiAGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBx8Igd8IhV8ID9CP4kgP0I4iYUgP0IHiIUgO3wgR3wgPkI/iSA+QjiJhSA+QgeIhSA6fCBGfCAYQi2JIBhCA4mFIBhCBoiFfCIWQi2JIBZCA4mFIBZCBoiFfCIZIBR8IEogE3wgFiALfCAVIBQgE4WDIBOFfCAVQjKJIBVCLomFIBVCF4mFfEKTyZyGtO+q5TJ8IgsgByAGhSAFgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCAafCIFfCITIBUgFIWDIBSFfCATQjKJIBNCLomFIBNCF4mFfEK8/aauocGvzzx8IhogBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAbfCIGfCIUIBMgFYWDIBWFfCAUQjKJIBRCLomFIBRCF4mFfELMmsDgyfjZjsMAfCIbIAYgBYUgB4MgBiAFg4UgBkIkiSAGQh6JhSAGQhmJhXwgHXwiB3wiFSAUIBOFgyAThXwgFUIyiSAVQi6JhSAVQheJhXxCtoX52eyX9eLMAHwiHCAHIAaFIAWDIAcgBoOFIAdCJIkgB0IeiYUgB0IZiYV8IB58IgV8IhYgTXw3A8CKAUEAIFAgBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCALfCIGIAWFIAeDIAYgBYOFIAZCJIkgBkIeiYUgBkIZiYV8IBp8IgcgBoUgBYMgByAGg4UgB0IkiSAHQh6JhSAHQhmJhXwgG3wiBSAHhSAGgyAFIAeDhSAFQiSJIAVCHomFIAVCGYmFfCAcfCILfDcDoIoBQQAgTiBAQj+JIEBCOImFIEBCB4iFIDx8IEh8IBlCLYkgGUIDiYUgGUIGiIV8IhkgE3wgFiAVIBSFgyAUhXwgFkIyiSAWQi6JhSAWQheJhXxCqvyV48+zyr/ZAHwiGiAGfCITfDcDuIoBQQAgUiALIAWFIAeDIAsgBYOFIAtCJIkgC0IeiYUgC0IZiYV8IBp8IgZ8NwOYigFBACBPIEFCP4kgQUI4iYUgQUIHiIUgQHwgGHwgS0ItiSBLQgOJhSBLQgaIhXwgFHwgEyAWIBWFgyAVhXwgE0IyiSATQi6JhSATQheJhXxC7PXb1rP12+XfAHwiGCAHfCIUfDcDsIoBQQAgVCAGIAuFIAWDIAYgC4OFIAZCJIkgBkIeiYUgBkIZiYV8IBh8Igd8NwOQigFBACBMIEVCP4kgRUI4iYUgRUIHiIUgQXwgSXwgGUItiSAZQgOJhSAZQgaIhXwgFXwgFCATIBaFgyAWhXwgFEIyiSAUQi6JhSAUQheJhXxCl7Cd0sSxhqLsAHwiEyAFfHw3A6iKAUEAIAEgByAGhSALgyAHIAaDhSAHQiSJIAdCHomFIAdCGYmFfCATfHw3A4iKAQvzCQIBfgR/QQApA4CKASIAp0EDdkEPcSIBQQN0QYCJAWoiAiACKQMAQn8gAEIDhiIAhkJ/hYNCgAEgAIaFNwMAIAFBAWohAwJAIAFBDkkNAAJAIANBD0cNAEEAQgA3A/iJAQtBgIkBEANBACEDCyADIQQCQEEHIANrQQdxIgJFDQAgAyACaiEEIANBA3RBgIkBaiEBA0AgAUIANwMAIAFBCGohASACQX9qIgINAAsLAkAgA0F4akEHSQ0AIARBA3QhAQNAIAFBuIkBakIANwMAIAFBsIkBakIANwMAIAFBqIkBakIANwMAIAFBoIkBakIANwMAIAFBmIkBakIANwMAIAFBkIkBakIANwMAIAFBiIkBakIANwMAIAFBgIkBakIANwMAIAFBwABqIgFB+ABHDQALC0EAIQFBAEEAKQOAigEiAEI7hiAAQiuGQoCAgICAgMD/AIOEIABCG4ZCgICAgIDgP4MgAEILhkKAgICA8B+DhIQgAEIFiEKAgID4D4MgAEIViEKAgPwHg4QgAEIliEKA/gODIABCA4ZCOIiEhIQ3A/iJAUGAiQEQA0EAQQApA8CKASIAQjiGIABCgP4Dg0IohoQgAEKAgPwHg0IYhiAAQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwPAigFBAEEAKQO4igEiAEI4hiAAQoD+A4NCKIaEIABCgID8B4NCGIYgAEKAgID4D4NCCIaEhCAAQgiIQoCAgPgPgyAAQhiIQoCA/AeDhCAAQiiIQoD+A4MgAEI4iISEhDcDuIoBQQBBACkDsIoBIgBCOIYgAEKA/gODQiiGhCAAQoCA/AeDQhiGIABCgICA+A+DQgiGhIQgAEIIiEKAgID4D4MgAEIYiEKAgPwHg4QgAEIoiEKA/gODIABCOIiEhIQ3A7CKAUEAQQApA6iKASIAQjiGIABCgP4Dg0IohoQgAEKAgPwHg0IYhiAAQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwOoigFBAEEAKQOgigEiAEI4hiAAQoD+A4NCKIaEIABCgID8B4NCGIYgAEKAgID4D4NCCIaEhCAAQgiIQoCAgPgPgyAAQhiIQoCA/AeDhCAAQiiIQoD+A4MgAEI4iISEhDcDoIoBQQBBACkDmIoBIgBCOIYgAEKA/gODQiiGhCAAQoCA/AeDQhiGIABCgICA+A+DQgiGhIQgAEIIiEKAgID4D4MgAEIYiEKAgPwHg4QgAEIoiEKA/gODIABCOIiEhIQ3A5iKAUEAQQApA5CKASIAQjiGIABCgP4Dg0IohoQgAEKAgPwHg0IYhiAAQoCAgPgPg0IIhoSEIABCCIhCgICA+A+DIABCGIhCgID8B4OEIABCKIhCgP4DgyAAQjiIhISENwOQigFBAEEAKQOIigEiAEI4hiAAQoD+A4NCKIaEIABCgID8B4NCGIYgAEKAgID4D4NCCIaEhCAAQgiIQoCAgPgPgyAAQhiIQoCA/AeDhCAAQiiIQoD+A4MgAEI4iISEhDcDiIoBAkBBACgCyIoBIgNFDQBBACECA0AgAUGACWogAUGIigFqLQAAOgAAIAFBAWohASADIAJBAWoiAkH/AXFLDQALCwsGAEGAiQELoQIAQQBCADcDgIoBQQBBMEHAACABQYADRiIBGzYCyIoBQQBCpJ/p99uD0trHAEL5wvibkaOz8NsAIAEbNwPAigFBAEKnn+an1sGLhltC6/qG2r+19sEfIAEbNwO4igFBAEKRquDC9tCS2o5/Qp/Y+dnCkdqCm38gARs3A7CKAUEAQrGWgP7/zMmZ5wBC0YWa7/rPlIfRACABGzcDqIoBQQBCubK5uI+b+5cVQvHt9Pilp/2npX8gARs3A6CKAUEAQpe6w4Ojq8CskX9Cq/DT9K/uvLc8IAEbNwOYigFBAEKHqvOzo6WKzeIAQrvOqqbY0Ouzu38gARs3A5CKAUEAQti9lojcq+fdS0KIkvOd/8z5hOoAIAEbNwOIigEgABACEAQLCwsBAEGACAsE0AAAAA==\";\nvar hash$9 = \"f2e40eb1\";\nvar wasmJson$9 = {\n\tname: name$9,\n\tdata: data$9,\n\thash: hash$9\n};\n\nconst mutex$8 = new Mutex();\nlet wasmCache$8 = null;\n/**\n * Calculates SHA-2 (SHA-384) hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction sha384(data) {\n if (wasmCache$8 === null) {\n return lockedCreate(mutex$8, wasmJson$9, 48).then((wasm) => {\n wasmCache$8 = wasm;\n return wasmCache$8.calculate(data, 384);\n });\n }\n try {\n const hash = wasmCache$8.calculate(data, 384);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SHA-2 (SHA-384) hash instance\n */\nfunction createSHA384() {\n return WASMInterface(wasmJson$9, 48).then((wasm) => {\n wasm.init(384);\n const obj = {\n init: () => {\n wasm.init(384);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 128,\n digestSize: 48,\n };\n return obj;\n });\n}\n\nconst mutex$7 = new Mutex();\nlet wasmCache$7 = null;\n/**\n * Calculates SHA-2 (SHA-512) hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction sha512(data) {\n if (wasmCache$7 === null) {\n return lockedCreate(mutex$7, wasmJson$9, 64).then((wasm) => {\n wasmCache$7 = wasm;\n return wasmCache$7.calculate(data, 512);\n });\n }\n try {\n const hash = wasmCache$7.calculate(data, 512);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SHA-2 (SHA-512) hash instance\n */\nfunction createSHA512() {\n return WASMInterface(wasmJson$9, 64).then((wasm) => {\n wasm.init(512);\n const obj = {\n init: () => {\n wasm.init(512);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 128,\n digestSize: 64,\n };\n return obj;\n });\n}\n\nvar name$8 = \"xxhash32\";\nvar data$8 = \"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\";\nvar hash$8 = \"4bb12485\";\nvar wasmJson$8 = {\n\tname: name$8,\n\tdata: data$8,\n\thash: hash$8\n};\n\nconst mutex$6 = new Mutex();\nlet wasmCache$6 = null;\nfunction validateSeed$3(seed) {\n if (!Number.isInteger(seed) || seed < 0 || seed > 0xffffffff) {\n return new Error(\"Seed must be a valid 32-bit long unsigned integer.\");\n }\n return null;\n}\n/**\n * Calculates xxHash32 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param seed Number used to initialize the internal state of the algorithm (defaults to 0)\n * @returns Computed hash as a hexadecimal string\n */\nfunction xxhash32(data, seed = 0) {\n if (validateSeed$3(seed)) {\n return Promise.reject(validateSeed$3(seed));\n }\n if (wasmCache$6 === null) {\n return lockedCreate(mutex$6, wasmJson$8, 4).then((wasm) => {\n wasmCache$6 = wasm;\n return wasmCache$6.calculate(data, seed);\n });\n }\n try {\n const hash = wasmCache$6.calculate(data, seed);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new xxHash32 hash instance\n * @param data Input data (string, Buffer or TypedArray)\n * @param seed Number used to initialize the internal state of the algorithm (defaults to 0)\n */\nfunction createXXHash32(seed = 0) {\n if (validateSeed$3(seed)) {\n return Promise.reject(validateSeed$3(seed));\n }\n return WASMInterface(wasmJson$8, 4).then((wasm) => {\n wasm.init(seed);\n const obj = {\n init: () => {\n wasm.init(seed);\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 16,\n digestSize: 4,\n };\n return obj;\n });\n}\n\nvar name$7 = \"xxhash64\";\nvar data$7 = \"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\";\nvar hash$7 = \"177fbfa3\";\nvar wasmJson$7 = {\n\tname: name$7,\n\tdata: data$7,\n\thash: hash$7\n};\n\nconst mutex$5 = new Mutex();\nlet wasmCache$5 = null;\nconst seedBuffer$2 = new Uint8Array(8);\nfunction validateSeed$2(seed) {\n if (!Number.isInteger(seed) || seed < 0 || seed > 0xffffffff) {\n return new Error(\"Seed must be given as two valid 32-bit long unsigned integers (lo + high).\");\n }\n return null;\n}\nfunction writeSeed$2(arr, low, high) {\n // write in little-endian format\n const buffer = new DataView(arr);\n buffer.setUint32(0, low, true);\n buffer.setUint32(4, high, true);\n}\n/**\n * Calculates xxHash64 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param seedLow Lower 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @param seedHigh Higher 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @returns Computed hash as a hexadecimal string\n */\nfunction xxhash64(data, seedLow = 0, seedHigh = 0) {\n if (validateSeed$2(seedLow)) {\n return Promise.reject(validateSeed$2(seedLow));\n }\n if (validateSeed$2(seedHigh)) {\n return Promise.reject(validateSeed$2(seedHigh));\n }\n if (wasmCache$5 === null) {\n return lockedCreate(mutex$5, wasmJson$7, 8).then((wasm) => {\n wasmCache$5 = wasm;\n writeSeed$2(seedBuffer$2.buffer, seedLow, seedHigh);\n wasmCache$5.writeMemory(seedBuffer$2);\n return wasmCache$5.calculate(data);\n });\n }\n try {\n writeSeed$2(seedBuffer$2.buffer, seedLow, seedHigh);\n wasmCache$5.writeMemory(seedBuffer$2);\n const hash = wasmCache$5.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new xxHash64 hash instance\n * @param seedLow Lower 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @param seedHigh Higher 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n */\nfunction createXXHash64(seedLow = 0, seedHigh = 0) {\n if (validateSeed$2(seedLow)) {\n return Promise.reject(validateSeed$2(seedLow));\n }\n if (validateSeed$2(seedHigh)) {\n return Promise.reject(validateSeed$2(seedHigh));\n }\n return WASMInterface(wasmJson$7, 8).then((wasm) => {\n const instanceBuffer = new Uint8Array(8);\n writeSeed$2(instanceBuffer.buffer, seedLow, seedHigh);\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n const obj = {\n init: () => {\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 32,\n digestSize: 8,\n };\n return obj;\n });\n}\n\nvar name$6 = \"xxhash3\";\nvar data$6 = \"AGFzbQEAAAABNAhgAAF/YAR/f39/AGAHf39/f39/fwBgBH9+fn4BfmAEf39/fgF+YAN/f34BfmAAAGABfwADDg0AAQIDBAUFBQYHBgAGBQQBAQICBg4CfwFBwI4FC38AQcAJCwdwCAZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACUhhc2hfSW5pdAAIC0hhc2hfVXBkYXRlAAkKSGFzaF9GaW5hbAAKDUhhc2hfR2V0U3RhdGUACw5IYXNoX0NhbGN1bGF0ZQAMClNUQVRFX1NJWkUDAQr6QQ0FAEGACgvkAwMPfgF/AX4CQCADRQ0AIAApAzAhBCAAKQM4IQUgACkDICEGIAApAyghByAAKQMQIQggACkDGCEJIAApAwAhCiAAKQMIIQsDQCAFIAFBMGopAwAiDHwgAkE4aikDACABQThqKQMAIg2FIgVCIIggBUL/////D4N+fCEFIAcgAUEgaikDACIOfCACQShqKQMAIAFBKGopAwAiD4UiB0IgiCAHQv////8Pg358IQcgCSABQRBqKQMAIhB8IAJBGGopAwAgAUEYaikDACIRhSIJQiCIIAlC/////w+DfnwhCSALIAEpAwAiEnwgAkEIaiITKQMAIAFBCGopAwAiFIUiC0IgiCALQv////8Pg358IQsgAkEwaikDACAMhSIMQiCIIAxC/////w+DfiAEfCANfCEEIAJBIGopAwAgDoUiDEIgiCAMQv////8Pg34gBnwgD3whBiACQRBqKQMAIBCFIgxCIIggDEL/////D4N+IAh8IBF8IQggAikDACAShSIMQiCIIAxC/////w+DfiAKfCAUfCEKIAFBwABqIQEgEyECIANBf2oiAw0ACyAAIAk3AxggACAKNwMAIAAgCzcDCCAAIAc3AyggACAINwMQIAAgBTcDOCAAIAY3AyAgACAENwMwCwveAgIBfwF+AkAgBCACIAEoAgAiB2siAkkNACAAIAMgBSAHQQN0aiACEAEgACAFIAZqIgcpAwAgACkDACIIQi+IhSAIhUKx893xCX43AwAgACAHKQMIIAApAwgiCEIviIUgCIVCsfPd8Ql+NwMIIAAgBykDECAAKQMQIghCL4iFIAiFQrHz3fEJfjcDECAAIAcpAxggACkDGCIIQi+IhSAIhUKx893xCX43AxggACAHKQMgIAApAyAiCEIviIUgCIVCsfPd8Ql+NwMgIAAgBykDKCAAKQMoIghCL4iFIAiFQrHz3fEJfjcDKCAAIAcpAzAgACkDMCIIQi+IhSAIhUKx893xCX43AzAgACAHKQM4IAApAzgiCEIviIUgCIVCsfPd8Ql+NwM4IAAgAyACQQZ0aiAFIAQgAmsiBxABIAEgBzYCAA8LIAAgAyAFIAdBA3RqIAQQASABIAcgBGo2AgALhQEBAX8gAiABhSADpyIEQRh0IARBgP4DcUEIdHIgBEEIdkGA/gNxIARBGHZycq1CIIYgA4V9QQA1AoCMAUIghiAAQfyLAWo1AgCEhSIDQjGJIANCGImFIAOFQqW+4/TRjIfZn39+IgNCI4ggAK18IAOFQqW+4/TRjIfZn39+IgNCHIggA4ULZwAgAiABc60gA3wiA0IhiEEALQCAjAFBEHQgAEEIdHIgAEEBdkGAjAFqLQAAQRh0ciAAQf+LAWotAAByrYUgA4VCz9bTvtLHq9lCfiIDQh2IIAOFQvnz3fGZ9pmrFn4iA0IgiCADhQuJAwEEfgJAIABBCUkNAEEAKQOAjAEgASkDICABKQMYhSACfIUiA0I4hiADQoD+A4NCKIaEIANCgID8B4NCGIYgA0KAgID4D4NCCIaEhCADQgiIQoCAgPgPgyADQhiIQoCA/AeDhCADQiiIQoD+A4MgA0I4iISEhCAArXwgAEH4iwFqKQMAIAEpAzAgASkDKIUgAn2FIgJ8IAJC/////w+DIgQgA0IgiCIFfiIGQv////8PgyACQiCIIgIgA0L/////D4MiA358IAQgA34iA0IgiHwiBEIghiADQv////8Pg4QgBkIgiCACIAV+fCAEQiCIfIV8IgNCJYggA4VC+fPd8ZnymasWfiIDQiCIIAOFDwsCQCAAQQRJDQAgACABQQhqKQMAIAFBEGopAwAgAhADDwsCQCAARQ0AIAAgASgCACABQQRqKAIAIAIQBA8LIAEpAzggASkDQIUgAoUiA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC94IAQZ+IACtQoeVr6+Ytt6bnn9+IQMCQCAAQSFJDQACQCAAQcEASQ0AAkAgAEHhAEkNACABKQNoIAJ9QQApA7iMAYUiBEL/////D4MiBSABKQNgIAJ8QQApA7CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDeCACfSAAQciLAWopAwCFIgNC/////w+DIgQgASkDcCACfCAAQcCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQNIIAJ9QQApA6iMAYUiBEL/////D4MiBSABKQNAIAJ8QQApA6CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDWCACfSAAQdiLAWopAwCFIgNC/////w+DIgQgASkDUCACfCAAQdCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQMoIAJ9QQApA5iMAYUiBEL/////D4MiBSABKQMgIAJ8QQApA5CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDOCACfSAAQeiLAWopAwCFIgNC/////w+DIgQgASkDMCACfCAAQeCLAWopAwCFIgVCIIgiBn4iB0L/////D4MgA0IgiCIDIAVC/////w+DIgV+fCAEIAV+IgRCIIh8IgVCIIYgBEL/////D4OEIAdCIIggAyAGfnwgBUIgiHyFfCEDCyABKQMIIAJ9QQApA4iMAYUiBEL/////D4MiBSABKQMAIAJ8QQApA4CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgA3wgASkDGCACfSAAQfiLAWopAwCFIgNC/////w+DIgQgASkDECACfCAAQfCLAWopAwCFIgJCIIgiBX4iBkL/////D4MgA0IgiCIDIAJC/////w+DIgJ+fCAEIAJ+IgJCIIh8IgRCIIYgAkL/////D4OEIAZCIIggAyAFfnwgBEIgiHyFfCICQiWIIAKFQvnz3fGZ8pmrFn4iAkIgiCAChQv8CgQBfwV+An8BfkEAIQMgASkDeCACfUEAKQP4jAGFIgRC/////w+DIgUgASkDcCACfEEAKQPwjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpA2ggAn1BACkD6IwBhSIEQv////8PgyIFIAEpA2AgAnxBACkD4IwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSABKQNYIAJ9QQApA9iMAYUiBEL/////D4MiBSABKQNQIAJ8QQApA9CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgASkDSCACfUEAKQPIjAGFIgRC/////w+DIgUgASkDQCACfEEAKQPAjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpAzggAn1BACkDuIwBhSIEQv////8PgyIFIAEpAzAgAnxBACkDsIwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSABKQMoIAJ9QQApA6iMAYUiBEL/////D4MiBSABKQMgIAJ8QQApA6CMAYUiBkIgiCIHfiIIQv////8PgyAEQiCIIgQgBkL/////D4MiBn58IAUgBn4iBUIgiHwiBkIghiAFQv////8Pg4QgCEIgiCAEIAd+fCAGQiCIfIUgASkDGCACfUEAKQOYjAGFIgRC/////w+DIgUgASkDECACfEEAKQOQjAGFIgZCIIgiB34iCEL/////D4MgBEIgiCIEIAZC/////w+DIgZ+fCAFIAZ+IgVCIIh8IgZCIIYgBUL/////D4OEIAhCIIggBCAHfnwgBkIgiHyFIAEpAwggAn1BACkDiIwBhSIEQv////8PgyIFIAEpAwAgAnxBACkDgIwBhSIGQiCIIgd+IghC/////w+DIARCIIgiBCAGQv////8PgyIGfnwgBSAGfiIFQiCIfCIGQiCGIAVC/////w+DhCAIQiCIIAQgB358IAZCIIh8hSAArUKHla+vmLbem55/fnx8fHx8fHx8IgRCJYggBIVC+fPd8ZnymasWfiIEQiCIIASFIQQCQCAAQZABSA0AIABBBHZBeGohCQNAIAEgA2oiCkELaikDACACfSADQYiNAWopAwCFIgVC/////w+DIgYgCkEDaikDACACfCADQYCNAWopAwCFIgdCIIgiCH4iC0L/////D4MgBUIgiCIFIAdC/////w+DIgd+fCAGIAd+IgZCIIh8IgdCIIYgBkL/////D4OEIAtCIIggBSAIfnwgB0IgiHyFIAR8IQQgA0EQaiEDIAlBf2oiCQ0ACwsgASkDfyACfSAAQfiLAWopAwCFIgVC/////w+DIgYgASkDdyACfCAAQfCLAWopAwCFIgJCIIgiB34iCEL/////D4MgBUIgiCIFIAJC/////w+DIgJ+fCAGIAJ+IgJCIIh8IgZCIIYgAkL/////D4OEIAhCIIggBSAHfnwgBkIgiHyFIAR8IgJCJYggAoVC+fPd8ZnymasWfiICQiCIIAKFC98FAgF+AX8CQAJAQQApA4AKIgBQRQ0AQYAIIQFCACEADAELAkBBACkDoI4BIABSDQBBACEBDAELQQAhAUEAQq+v79e895Kg/gAgAH03A/iLAUEAIABCxZbr+djShYIofDcD8IsBQQBCj/Hjja2P9JhOIAB9NwPoiwFBACAAQqus+MXV79HQfHw3A+CLAUEAQtOt1LKShbW0nn8gAH03A9iLAUEAIABCl5r0jvWWvO3JAHw3A9CLAUEAQsWDgv2v/8SxayAAfTcDyIsBQQAgAELqi7OdyOb09UN8NwPAiwFBAELIv/rLnJveueQAIAB9NwO4iwFBACAAQoqjgd/Ume2sMXw3A7CLAUEAQvm57738+MKnHSAAfTcDqIsBQQAgAEKo9dv7s5ynmj98NwOgiwFBAEK4sry3lNW31lggAH03A5iLAUEAIABC8cihuqm0w/zOAHw3A5CLAUEAQoihl9u445SXo38gAH03A4iLAUEAIABCvNDI2pvysIBLfDcDgIsBQQBC4OvAtJ7QjpPMACAAfTcD+IoBQQAgAEK4kZii9/6Qko5/fDcD8IoBQQBCgrXB7sf5v7khIAB9NwPoigFBACAAQsvzmffEmfDy+AB8NwPgigFBAELygJGl+vbssx8gAH03A9iKAUEAIABC3qm3y76Q5MtbfDcD0IoBQQBC/IKE5PK+yNYcIAB9NwPIigFBACAAQrj9s8uzhOmlvn98NwPAigELQQBCADcDkI4BQQBCADcDiI4BQQBCADcDgI4BQQBCvdzKlQw3A4CKAUEAQoeVr6+Ytt6bnn83A4iKAUEAQs/W077Sx6vZQjcDkIoBQQBC+fPd8Zn2masWNwOYigFBAELj3MqV/M7y9YV/NwOgigFBAEL3lK+vCDcDqIoBQQBCxc/ZsvHluuonNwOwigFBAEKx893xCTcDuIoBQQAgADcDoI4BQQAgATYCsI4BQQBCkICAgIAQNwOYjgEL9AkBCH9BAEEAKQOQjgEgAK18NwOQjgECQAJAAkBBACgCgI4BIgEgAGoiAkGAAksNACABQYCMAWohA0GACiEEAkAgAEEITw0AIAAhAQwCCwJAAkAgAEF4aiIFQQN2QQFqQQdxIgYNAEGACiEEIAAhAQwBCyAGQQN0IQFBgAohBANAIAMgBCkDADcDACADQQhqIQMgBEEIaiEEIAZBf2oiBg0ACyAAIAFrIQELIAVBOEkNAQNAIAMgBCkDADcDACADQQhqIARBCGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBGGogBEEYaikDADcDACADQSBqIARBIGopAwA3AwAgA0EoaiAEQShqKQMANwMAIANBMGogBEEwaikDADcDACADQThqIARBOGopAwA3AwAgA0HAAGohAyAEQcAAaiEEIAFBQGoiAUEHSw0ADAILC0GACiEEIABBgApqIQVBACgCsI4BIgNBwIoBIAMbIQYCQCABRQ0AIAFBgIwBaiEDQYAKIQQCQAJAQYACIAFrIgdBCE8NACAHIQAMAQsCQAJAQfgBIAFrIghBA3ZBAWpBB3EiAg0AQYAKIQQgByEADAELQYAKIQQgAkEDdCIAIQIDQCADIAQpAwA3AwAgA0EIaiEDIARBCGohBCACQXhqIgINAAtBgAIgASAAamshAAsgCEE4SQ0AA0AgAyAEKQMANwMAIANBCGogBEEIaikDADcDACADQRBqIARBEGopAwA3AwAgA0EYaiAEQRhqKQMANwMAIANBIGogBEEgaikDADcDACADQShqIARBKGopAwA3AwAgA0EwaiAEQTBqKQMANwMAIANBOGogBEE4aikDADcDACADQcAAaiEDIARBwABqIQQgAEFAaiIAQQdLDQALCwJAIABFDQACQAJAIABBB3EiAg0AIAAhAQwBCyAAQXhxIQEDQCADIAQtAAA6AAAgA0EBaiEDIARBAWohBCACQX9qIgINAAsLIABBCEkNAANAIAMgBCkAADcAACADQQhqIQMgBEEIaiEEIAFBeGoiAQ0ACwtBgIoBQYiOAUEAKAKYjgFBgIwBQQQgBkEAKAKcjgEQAkEAQQA2AoCOASAHQYAKaiEECwJAIARBgAJqIAVPDQAgBUGAfmohAgNAQYCKAUGIjgFBACgCmI4BIAQiA0EEIAZBACgCnI4BEAIgA0GAAmoiBCACSQ0AC0EAIAMpA8ABNwPAjQFBACADKQPIATcDyI0BQQAgAykD0AE3A9CNAUEAIAMpA9gBNwPYjQFBACADKQPgATcD4I0BQQAgAykD6AE3A+iNAUEAIAMpA/ABNwPwjQFBACADKQP4ATcD+I0BC0GAjAEhAwJAAkAgBSAEayICQQhPDQAgAiEGDAELQYCMASEDIAIhBgNAIAMgBCkDADcDACADQQhqIQMgBEEIaiEEIAZBeGoiBkEHSw0ACwsgBkUNAQNAIAMgBC0AADoAACADQQFqIQMgBEEBaiEEIAZBf2oiBg0ADAILCyABRQ0AAkACQCABQQdxIgYNACABIQIMAQsgAUF4cSECA0AgAyAELQAAOgAAIANBAWohAyAEQQFqIQQgBkF/aiIGDQALCwJAIAFBCEkNAANAIAMgBCkAADcAACADQQhqIQMgBEEIaiEEIAJBeGoiAg0ACwtBACgCgI4BIABqIQILQQAgAjYCgI4BC/ISBQR/A34BfxV+BX8jACIAIQEgAEGAAWtBQHEiAiQAQQAoArCOASIAQcCKASAAGyEDAkACQEEAKQOQjgEiBELxAVQNACACQQApA4CKATcDACACQQApA4iKATcDCCACQQApA5CKATcDECACQQApA5iKATcDGCACQQApA6CKATcDICACQQApA6iKATcDKCACQQApA7CKASIFNwMwIAJBACkDuIoBIgY3AzgCQAJAQQAoAoCOASIHQcAASQ0AIAJBACgCiI4BNgJAIAIgAkHAAGpBACgCmI4BQYCMASAHQX9qQQZ2IANBACgCnI4BIgAQAiADIABqIgBBeWopAwAhCCAAKQMJIQkgACkDGSEKIAApAykhCyAHQcCLAWopAwAhBSAAKQMBIQwgB0HIiwFqKQMAIQYgB0HQiwFqKQMAIQ0gACkDESEOIAdB2IsBaikDACEPIAdB4IsBaikDACEQIAApAyEhESAHQeiLAWopAwAhEiACKQMAIRMgAikDECEUIAIpAyAhFSACKQMwIRYgAikDCCEXIAIpAxghGCACKQMoIRkgAiACKQM4IAdB8IsBaikDACIafCAAKQMxIAdB+IsBaikDACIbhSIcQiCIIBxC/////w+Dfnw3AzggGSAQfCARIBKFIhFCIIggEUL/////D4N+fCERIBggDXwgDiAPhSIOQiCIIA5C/////w+DfnwhDiAXIAV8IAwgBoUiDEIgiCAMQv////8Pg358IQwgGyAWIAsgGoUiC0IgiCALQv////8Pg358fCELIBIgFSAKIBCFIhBCIIggEEL/////D4N+fHwhECAPIBQgCSANhSINQiCIIA1C/////w+Dfnx8IRIgBiATIAggBYUiBUIgiCAFQv////8Pg358fCEIDAELIAdBwI0BaiEdQcAAIAdrIR4gAkHAAGohAAJAAkACQCAHQThNDQAgHiEfDAELAkACQEE4IAdrQQN2QQFqQQdxIh8NACACQcAAaiEAIB4hHwwBCyACQcAAaiEAIB9BA3QiICEfA0AgACAdKQMANwMAIABBCGohACAdQQhqIR0gH0F4aiIfDQALQcAAIAcgIGprIR8LAkAgBw0AA0AgACAdKQMANwMAIABBCGogHUEIaikDADcDACAAQRBqIB1BEGopAwA3AwAgAEEYaiAdQRhqKQMANwMAIABBIGogHUEgaikDADcDACAAQShqIB1BKGopAwA3AwAgAEEwaiAdQTBqKQMANwMAIABBOGogHUE4aikDADcDACAAQcAAaiEAIB1BwABqIR0gH0FAaiIfQQdLDQALCyAfRQ0BCyAfQX9qISECQCAfQQdxIiBFDQAgH0F4cSEfA0AgACAdLQAAOgAAIABBAWohACAdQQFqIR0gIEF/aiIgDQALCyAhQQdJDQADQCAAIB0pAAA3AAAgAEEIaiEAIB1BCGohHSAfQXhqIh8NAAsLIAJBwABqIB5qIR1BgIwBIQACQAJAAkAgB0EISQ0AAkAgB0E4akEDdkEBakEHcSIfDQAMAgsgH0EDdCEgQYCMASEAA0AgHSAAKQMANwMAIB1BCGohHSAAQQhqIQAgH0F/aiIfDQALIAcgIGshBwsgB0UNAQJAAkAgB0EHcSIgDQAgByEfDAELIAdBeHEhHwNAIB0gAC0AADoAACAdQQFqIR0gAEEBaiEAICBBf2oiIA0ACwsgB0EISQ0BCwNAIB0gACkAADcAACAdQQhqIR0gAEEIaiEAIB9BeGoiHw0ACwsgA0EAKAKcjgFqIgBBeWopAwAhCiAAKQMJIRMgACkDGSEUIAApAykhCyAAKQMBIQwgACkDESEOIAApAyEhESACKQMAIRUgAikDECEWIAIpAyAhFyACKQMIIRggAikDQCENIAIpA0ghDyACKQMYIRkgAikDUCESIAIpA1ghCCACKQMoIRogAikDYCEQIAIpA2ghCSACIAYgAikDcCIbfCAAKQMxIAIpA3giBoUiHEIgiCAcQv////8Pg358NwM4IBogEHwgESAJhSIRQiCIIBFC/////w+DfnwhESAZIBJ8IA4gCIUiDkIgiCAOQv////8Pg358IQ4gGCANfCAMIA+FIgxCIIggDEL/////D4N+fCEMIAYgCyAbhSILQiCIIAtC/////w+DfiAFfHwhCyAJIBcgFCAQhSIFQiCIIAVC/////w+Dfnx8IRAgCCAWIBMgEoUiBUIgiCAFQv////8Pg358fCESIA8gFSAKIA2FIgVCIIggBUL/////D4N+fHwhCAsgAykDQyACKQM4hSIFQv////8PgyIGIAMpAzsgC4UiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDMyARhSIFQv////8PgyIGIAMpAysgEIUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDIyAOhSIFQv////8PgyIGIAMpAxsgEoUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgAykDEyAMhSIFQv////8PgyIGIAMpAwsgCIUiC0IgiCINfiIPQv////8PgyAFQiCIIgUgC0L/////D4MiC358IAYgC34iBkIgiHwiC0IghiAGQv////8Pg4QgD0IgiCAFIA1+fCALQiCIfIUgBEKHla+vmLbem55/fnx8fHwiBEIliCAEhUL5893xmfKZqxZ+IgRCIIggBIUhBAwBCyAEpyEAAkBBACkDoI4BIgRQDQACQCAAQRBLDQAgAEGACCAEEAUhBAwCCwJAIABBgAFLDQAgAEGACCAEEAYhBAwCCyAAQYAIIAQQByEEDAELAkAgAEEQSw0AIAAgA0IAEAUhBAwBCwJAIABBgAFLDQAgACADQgAQBiEEDAELIAAgA0IAEAchBAtBACAEQjiGIARCgP4Dg0IohoQgBEKAgPwHg0IYhiAEQoCAgPgPg0IIhoSEIARCCIhCgICA+A+DIARCGIhCgID8B4OEIARCKIhCgP4DgyAEQjiIhISENwOACiABJAALBgBBgIoBCwIACwvMAQEAQYAIC8QBuP5sOSOkS758AYEs9yGtHN7UbemDkJfbckCkpLezZx/LeeZOzMDleIJa0H3M/3IhuAhGdPdDJI7gNZDmgTomTDwoUruRwwDLiNBlixtTLqNxZEiXog35TjgZ70ap3qzYqPp2P+OcND/53LvHxwtPHYpR4EvNtFkxyJ9+ydl4c2TqxayDNNPrw8WBoP/6E2PrFw3dUbfw2knTFlUmKdRonisWvlh9R6H8j/i40XrQMc5FyzqPlRYEKK/X+8q7S0B+QAIAAA==\";\nvar hash$6 = \"5a2fbdbb\";\nvar wasmJson$6 = {\n\tname: name$6,\n\tdata: data$6,\n\thash: hash$6\n};\n\nconst mutex$4 = new Mutex();\nlet wasmCache$4 = null;\nconst seedBuffer$1 = new Uint8Array(8);\nfunction validateSeed$1(seed) {\n if (!Number.isInteger(seed) || seed < 0 || seed > 0xffffffff) {\n return new Error(\"Seed must be given as two valid 32-bit long unsigned integers (lo + high).\");\n }\n return null;\n}\nfunction writeSeed$1(arr, low, high) {\n // write in little-endian format\n const buffer = new DataView(arr);\n buffer.setUint32(0, low, true);\n buffer.setUint32(4, high, true);\n}\n/**\n * Calculates xxHash3 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param seedLow Lower 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @param seedHigh Higher 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @returns Computed hash as a hexadecimal string\n */\nfunction xxhash3(data, seedLow = 0, seedHigh = 0) {\n if (validateSeed$1(seedLow)) {\n return Promise.reject(validateSeed$1(seedLow));\n }\n if (validateSeed$1(seedHigh)) {\n return Promise.reject(validateSeed$1(seedHigh));\n }\n if (wasmCache$4 === null) {\n return lockedCreate(mutex$4, wasmJson$6, 8).then((wasm) => {\n wasmCache$4 = wasm;\n writeSeed$1(seedBuffer$1.buffer, seedLow, seedHigh);\n wasmCache$4.writeMemory(seedBuffer$1);\n return wasmCache$4.calculate(data);\n });\n }\n try {\n writeSeed$1(seedBuffer$1.buffer, seedLow, seedHigh);\n wasmCache$4.writeMemory(seedBuffer$1);\n const hash = wasmCache$4.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new xxHash3 hash instance\n * @param seedLow Lower 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @param seedHigh Higher 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n */\nfunction createXXHash3(seedLow = 0, seedHigh = 0) {\n if (validateSeed$1(seedLow)) {\n return Promise.reject(validateSeed$1(seedLow));\n }\n if (validateSeed$1(seedHigh)) {\n return Promise.reject(validateSeed$1(seedHigh));\n }\n return WASMInterface(wasmJson$6, 8).then((wasm) => {\n const instanceBuffer = new Uint8Array(8);\n writeSeed$1(instanceBuffer.buffer, seedLow, seedHigh);\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n const obj = {\n init: () => {\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 512,\n digestSize: 8,\n };\n return obj;\n });\n}\n\nvar name$5 = \"xxhash128\";\nvar data$5 = \"AGFzbQEAAAABKwdgAAF/YAR/f39/AGAHf39/f39/fwBgA39/fgF+YAR/f39+AGAAAGABfwADDQwAAQIDBAQEBQYFAAUFBAEBAgIGDgJ/AUHAjgULfwBBwAkLB3AIBm1lbW9yeQIADkhhc2hfR2V0QnVmZmVyAAAJSGFzaF9Jbml0AAcLSGFzaF9VcGRhdGUACApIYXNoX0ZpbmFsAAkNSGFzaF9HZXRTdGF0ZQAKDkhhc2hfQ2FsY3VsYXRlAAsKU1RBVEVfU0laRQMBCqBNDAUAQYAKC+QDAw9+AX8BfgJAIANFDQAgACkDMCEEIAApAzghBSAAKQMgIQYgACkDKCEHIAApAxAhCCAAKQMYIQkgACkDACEKIAApAwghCwNAIAUgAUEwaikDACIMfCACQThqKQMAIAFBOGopAwAiDYUiBUIgiCAFQv////8Pg358IQUgByABQSBqKQMAIg58IAJBKGopAwAgAUEoaikDACIPhSIHQiCIIAdC/////w+DfnwhByAJIAFBEGopAwAiEHwgAkEYaikDACABQRhqKQMAIhGFIglCIIggCUL/////D4N+fCEJIAsgASkDACISfCACQQhqIhMpAwAgAUEIaikDACIUhSILQiCIIAtC/////w+DfnwhCyACQTBqKQMAIAyFIgxCIIggDEL/////D4N+IAR8IA18IQQgAkEgaikDACAOhSIMQiCIIAxC/////w+DfiAGfCAPfCEGIAJBEGopAwAgEIUiDEIgiCAMQv////8Pg34gCHwgEXwhCCACKQMAIBKFIgxCIIggDEL/////D4N+IAp8IBR8IQogAUHAAGohASATIQIgA0F/aiIDDQALIAAgCTcDGCAAIAo3AwAgACALNwMIIAAgBzcDKCAAIAg3AxAgACAFNwM4IAAgBjcDICAAIAQ3AzALC94CAgF/AX4CQCAEIAIgASgCACIHayICSQ0AIAAgAyAFIAdBA3RqIAIQASAAIAUgBmoiBykDACAAKQMAIghCL4iFIAiFQrHz3fEJfjcDACAAIAcpAwggACkDCCIIQi+IhSAIhUKx893xCX43AwggACAHKQMQIAApAxAiCEIviIUgCIVCsfPd8Ql+NwMQIAAgBykDGCAAKQMYIghCL4iFIAiFQrHz3fEJfjcDGCAAIAcpAyAgACkDICIIQi+IhSAIhUKx893xCX43AyAgACAHKQMoIAApAygiCEIviIUgCIVCsfPd8Ql+NwMoIAAgBykDMCAAKQMwIghCL4iFIAiFQrHz3fEJfjcDMCAAIAcpAzggACkDOCIIQi+IhSAIhUKx893xCX43AzggACADIAJBBnRqIAUgBCACayIHEAEgASAHNgIADwsgACADIAUgB0EDdGogBBABIAEgByAEajYCAAvtAwEFfiABKQM4IAApAziFIgNC/////w+DIgQgASkDMCAAKQMwhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMoIAApAyiFIgNC/////w+DIgQgASkDICAAKQMghSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMYIAApAxiFIgNC/////w+DIgQgASkDECAAKQMQhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSABKQMIIAApAwiFIgNC/////w+DIgQgASkDACAAKQMAhSIFQiCIIgZ+IgdC/////w+DIANCIIgiAyAFQv////8PgyIFfnwgBCAFfiIEQiCIfCIFQiCGIARC/////w+DhCAHQiCIIAMgBn58IAVCIIh8hSACfHx8fCICQiWIIAKFQvnz3fGZ8pmrFn4iAkIgiCAChQu6CAIFfgN/AkAgAUEJSQ0AIAAgAUH4iwFqKQMAIgQgAikDOCACKQMwhSADfIUiBUL/////D4NC95Svrwh+IAVCgICAgHCDfEEAKQOAjAEgAikDKCACKQMghSADfYUgBIUiA0IgiCIEQrHz3fEJfnwgBEKHla+vCH4iBEIgiHwgBEL/////D4MgA0L/////D4MiA0Kx893xCX58IANCh5Wvrwh+IgRCIIh8IgVCIIh8IgNCOIYgA0KA/gODQiiGhCADQoCA/AeDQhiGIANCgICA+A+DQgiGhIQgA0IIiEKAgID4D4MgA0IYiEKAgPwHg4QgA0IoiEKA/gODIANCOIiEhIQgBEL/////D4MgAUF/aq1CNoaEIAVCIIZ8hSIEQiCIIgVCz9bTvgJ+IgZC/////w+DIARC/////w+DIgRCvdzKlQx+fCAEQs/W074CfiIEQiCIfCIHQiCGIghCJYggCCAEQv////8Pg4SFQvnz3fGZ8pmrFn4iBEIgiCAEhTcDACAAIAVCvdzKlQx+IANCz9bTvtLHq9lCfnwgBkIgiHwgB0IgiHwiA0IliCADhUL5893xmfKZqxZ+IgNCIIggA4U3AwgPCwJAIAFBBEkNACAAIAIpAxggAikDEIUgA6ciAkEYdCACQYD+A3FBCHRyIAJBCHZBgP4DcSACQRh2cnKtQiCGIAOFfCABQfyLAWo1AgBCIIZBADUCgIwBhIUiA0IgiCIEIAFBAnRBh5Wvr3hqrSIFfiIGQiCIIARCsfPd8Ql+fCAGQv////8PgyADQv////8PgyIDQrHz3fEJfnwgAyAFfiIDQiCIfCIEQiCIfCAEQiCGIANC/////w+DhCIEQgGGfCIDQiWIIAOFQvnz3fGZ8pmrFn4iBUIgiCAFhTcDCCAAIANCA4ggBIUiA0IjiCADhUKlvuP00YyH2Z9/fiIDQhyIIAOFNwMADwsCQCABRQ0AIAAgAigCBCACKAIAc60gA3wiBEIhiEEALQCAjAFBEHQgAUEIdHIiCSABQQF2QYCMAWotAABBGHRyIgogAUH/iwFqLQAAIgFyIguthSAEhULP1tO+0ser2UJ+IgRCHYggBIVC+fPd8Zn2masWfiIEQiCIIASFNwMAIAAgAigCDCACKAIIc60gA30iA0IhiCABQRh0IAtBgP4DcUEIdHIgCUEIdkGA/gNxIApBGHZyckENd62FIAOFQs/W077Sx6vZQn4iA0IdiCADhUL5893xmfaZqxZ+IgNCIIggA4U3AwgPCyAAIAIpA1AgAikDWIUgA4UiBEIhiCAEhULP1tO+0ser2UJ+IgRCHYggBIVC+fPd8Zn2masWfiIEQiCIIASFNwMIIAAgAikDQCACKQNIhSADhSIDQiGIIAOFQs/W077Sx6vZQn4iA0IdiCADhUL5893xmfaZqxZ+IgNCIIggA4U3AwALwwoBCn4gAa0iBEKHla+vmLbem55/fiEFAkACQCABQSFPDQBCACEGDAELQgAhBwJAIAFBwQBJDQBCACEHAkAgAUHhAEkNACACQfgAaikDACADfSABQciLAWopAwAiCIUiB0L/////D4MiCSACKQNwIAN8IAFBwIsBaikDACIKhSILQiCIIgx+Ig1CIIggB0IgiCIHIAx+fCANQv////8PgyAHIAtC/////w+DIgt+fCAJIAt+IgdCIIh8IglCIIh8QQApA7iMASILQQApA7CMASIMfIUgCUIghiAHQv////8Pg4SFIQcgAkHoAGopAwAgA30gC4UiCUL/////D4MiCyACKQNgIAN8IAyFIgxCIIgiDX4iBkL/////D4MgCUIgiCIJIAxC/////w+DIgx+fCALIAx+IgtCIIh8IgxCIIYgC0L/////D4OEIAZCIIggCSANfnwgDEIgiHyFIAV8IAggCnyFIQULIAJB2ABqKQMAIAN9IAFB2IsBaikDACIIhSIJQv////8PgyIKIAIpA1AgA3wgAUHQiwFqKQMAIguFIgxCIIgiDX4iBkL/////D4MgCUIgiCIJIAxC/////w+DIgx+fCAKIAx+IgpCIIh8IgxCIIYgCkL/////D4OEIAZCIIggCSANfnwgDEIgiHyFIAd8QQApA6iMASIJQQApA6CMASIKfIUhByACQcgAaikDACADfSAJhSIJQv////8PgyIMIAIpA0AgA3wgCoUiCkIgiCINfiIGQv////8PgyAJQiCIIgkgCkL/////D4MiCn58IAwgCn4iCkIgiHwiDEIghiAKQv////8Pg4QgBkIgiCAJIA1+fCAMQiCIfIUgBXwgCCALfIUhBQsgAkE4aikDACADfSABQeiLAWopAwAiCIUiCUL/////D4MiCiACKQMwIAN8IAFB4IsBaikDACILhSIMQiCIIg1+IgZC/////w+DIAlCIIgiCSAMQv////8PgyIMfnwgCiAMfiIKQiCIfCIMQiCGIApC/////w+DhCAGQiCIIAkgDX58IAxCIIh8hSAHfEEAKQOYjAEiB0EAKQOQjAEiCXyFIQYgAkEoaikDACADfSAHhSIHQv////8PgyIKIAIpAyAgA3wgCYUiCUIgiCIMfiINQv////8PgyAHQiCIIgcgCUL/////D4MiCX58IAogCX4iCUIgiHwiCkIghiAJQv////8Pg4QgDUIgiCAHIAx+fCAKQiCIfIUgBXwgCCALfIUhBQsgACACQRhqKQMAIAN9IAFB+IsBaikDACIHhSIIQv////8PgyIJIAIpAxAgA3wgAUHwiwFqKQMAIgqFIgtCIIgiDH4iDUL/////D4MgCEIgiCIIIAtC/////w+DIgt+fCAJIAt+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggCCAMfnwgC0IgiHyFIAZ8QQApA4iMASIIQQApA4CMASIJfIUiCyACQQhqKQMAIAN9IAiFIghC/////w+DIgwgAikDACADfCAJhSIJQiCIIg1+IgZC/////w+DIAhCIIgiCCAJQv////8PgyIJfnwgDCAJfiIJQiCIfCIMQiCGIAlC/////w+DhCAGQiCIIAggDX58IAxCIIh8hSAFfCAHIAp8hSIFfCIHQiWIIAeFQvnz3fGZ8pmrFn4iB0IgiCAHhTcDACAAQgAgBUKHla+vmLbem55/fiAEIAN9Qs/W077Sx6vZQn58IAtC49zKlfzO8vWFf358IgNCJYggA4VC+fPd8ZnymasWfiIDQiCIIAOFfTcDCAuhDwMBfxR+An9BACEEIAJB+ABqKQMAIAN9QQApA/iMASIFhSIGQv////8PgyIHIAIpA3AgA3xBACkD8IwBIgiFIglCIIgiCn4iC0L/////D4MgBkIgiCIGIAlC/////w+DIgl+fCAHIAl+IgdCIIh8IglCIIYgB0L/////D4OEIAtCIIggBiAKfnwgCUIgiHyFIAJB2ABqKQMAIAN9QQApA9iMASIHhSIGQv////8PgyIJIAIpA1AgA3xBACkD0IwBIgqFIgtCIIgiDH4iDUL/////D4MgBkIgiCIGIAtC/////w+DIgt+fCAJIAt+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggBiAMfnwgC0IgiHyFIAJBOGopAwAgA31BACkDuIwBIgmFIgZC/////w+DIgsgAikDMCADfEEAKQOwjAEiDIUiDUIgiCIOfiIPQv////8PgyAGQiCIIgYgDUL/////D4MiDX58IAsgDX4iC0IgiHwiDUIghiALQv////8Pg4QgD0IgiCAGIA5+fCANQiCIfIUgAkEYaikDACADfUEAKQOYjAEiC4UiBkL/////D4MiDSACKQMQIAN8QQApA5CMASIOhSIPQiCIIhB+IhFC/////w+DIAZCIIgiBiAPQv////8PgyIPfnwgDSAPfiINQiCIfCIPQiCGIA1C/////w+DhCARQiCIIAYgEH58IA9CIIh8hUEAKQOIjAEiDUEAKQOAjAEiD3yFfEEAKQOojAEiEEEAKQOgjAEiEXyFfEEAKQPIjAEiEkEAKQPAjAEiE3yFfEEAKQPojAEiFEEAKQPgjAEiFXyFIgZCJYggBoVC+fPd8ZnymasWfiIGQiCIIAaFIQYgAkHoAGopAwAgA30gFIUiFEL/////D4MiFiACKQNgIAN8IBWFIhVCIIgiF34iGEL/////D4MgFEIgiCIUIBVC/////w+DIhV+fCAWIBV+IhVCIIh8IhZCIIYgFUL/////D4OEIBhCIIggFCAXfnwgFkIgiHyFIAJByABqKQMAIAN9IBKFIhJC/////w+DIhQgAikDQCADfCAThSITQiCIIhV+IhZC/////w+DIBJCIIgiEiATQv////8PgyITfnwgFCATfiITQiCIfCIUQiCGIBNC/////w+DhCAWQiCIIBIgFX58IBRCIIh8hSACQShqKQMAIAN9IBCFIhBC/////w+DIhIgAikDICADfCARhSIRQiCIIhN+IhRC/////w+DIBBCIIgiECARQv////8PgyIRfnwgEiARfiIRQiCIfCISQiCGIBFC/////w+DhCAUQiCIIBAgE358IBJCIIh8hSACQQhqKQMAIAN9IA2FIg1C/////w+DIhAgAikDACADfCAPhSIPQiCIIhF+IhJC/////w+DIA1CIIgiDSAPQv////8PgyIPfnwgECAPfiIPQiCIfCIQQiCGIA9C/////w+DhCASQiCIIA0gEX58IBBCIIh8hSABrSIPQoeVr6+Ytt6bnn9+fCALIA58hXwgCSAMfIV8IAcgCnyFfCAFIAh8hSIFQiWIIAWFQvnz3fGZ8pmrFn4iBUIgiCAFhSEFAkAgAUGgAUgNACABQQV2QXxqIRkDQCACIARqIhpBG2opAwAgA30gBEGYjQFqKQMAIgeFIghC/////w+DIgkgGkETaikDACADfCAEQZCNAWopAwAiCoUiC0IgiCIMfiINQv////8PgyAIQiCIIgggC0L/////D4MiC358IAkgC34iCUIgiHwiC0IghiAJQv////8Pg4QgDUIgiCAIIAx+fCALQiCIfIUgBnwgBEGIjQFqKQMAIgggBEGAjQFqKQMAIgl8hSEGIBpBC2opAwAgA30gCIUiCEL/////D4MiCyAaQQNqKQMAIAN8IAmFIglCIIgiDH4iDUL/////D4MgCEIgiCIIIAlC/////w+DIgl+fCALIAl+IglCIIh8IgtCIIYgCUL/////D4OEIA1CIIggCCAMfnwgC0IgiHyFIAV8IAcgCnyFIQUgBEEgaiEEIBlBf2oiGQ0ACwsgACACQf8AaikDACADfCABQeiLAWopAwAiB4UiCEL/////D4MiCSACKQN3IAN9IAFB4IsBaikDACIKhSILQiCIIgx+Ig1C/////w+DIAhCIIgiCCALQv////8PgyILfnwgCSALfiIJQiCIfCILQiCGIAlC/////w+DhCANQiCIIAggDH58IAtCIIh8hSAGfCABQfiLAWopAwAiBiABQfCLAWopAwAiCHyFIgkgAkHvAGopAwAgA3wgBoUiBkL/////D4MiCyACKQNnIAN9IAiFIghCIIgiDH4iDUL/////D4MgBkIgiCIGIAhC/////w+DIgh+fCALIAh+IghCIIh8IgtCIIYgCEL/////D4OEIA1CIIggBiAMfnwgC0IgiHyFIAV8IAcgCnyFIgZ8IgVCJYggBYVC+fPd8ZnymasWfiIFQiCIIAWFNwMAIABCACAGQoeVr6+Ytt6bnn9+IA8gA31Cz9bTvtLHq9lCfnwgCULj3MqV/M7y9YV/fnwiA0IliCADhUL5893xmfKZqxZ+IgNCIIggA4V9NwMIC98FAgF+AX8CQAJAQQApA4AKIgBQRQ0AQYAIIQFCACEADAELAkBBACkDoI4BIABSDQBBACEBDAELQQAhAUEAQq+v79e895Kg/gAgAH03A/iLAUEAIABCxZbr+djShYIofDcD8IsBQQBCj/Hjja2P9JhOIAB9NwPoiwFBACAAQqus+MXV79HQfHw3A+CLAUEAQtOt1LKShbW0nn8gAH03A9iLAUEAIABCl5r0jvWWvO3JAHw3A9CLAUEAQsWDgv2v/8SxayAAfTcDyIsBQQAgAELqi7OdyOb09UN8NwPAiwFBAELIv/rLnJveueQAIAB9NwO4iwFBACAAQoqjgd/Ume2sMXw3A7CLAUEAQvm57738+MKnHSAAfTcDqIsBQQAgAEKo9dv7s5ynmj98NwOgiwFBAEK4sry3lNW31lggAH03A5iLAUEAIABC8cihuqm0w/zOAHw3A5CLAUEAQoihl9u445SXo38gAH03A4iL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AkHAAGogDGohC0GAjAEhAAJAAkACQCAHQQhJDQACQCAHQThqQQN2QQFqQQdxIg0NAAwCCyANQQN0IQ5BgIwBIQADQCALIAApAwA3AwAgC0EIaiELIABBCGohACANQX9qIg0NAAsgByAOayEHCyAHRQ0BAkACQCAHQQdxIg4NACAHIQ0MAQsgB0F4cSENA0AgCyAALQAAOgAAIAtBAWohCyAAQQFqIQAgDkF/aiIODQALCyAHQQhJDQELA0AgCyAAKQAANwAAIAtBCGohCyAAQQhqIQAgDUF4aiINDQALCyACIAIpAwggAikDQCIIfCADQQAoApyOAWoiACkDASACKQNIIgmFIgpCIIggCkL/////D4N+fDcDCCACIAIpAxggAikDUCIKfCAAKQMRIAIpA1giEIUiEUIgiCARQv////8Pg358NwMYIAIgECAKIAApAwmFIgpCIIggCkL/////D4N+IAIpAxB8fDcDECACIAkgCCAAQXlqKQMAhSIIQiCIIAhC/////w+DfiACKQMAfHw3AwAgACkDGSEIIAIpAyAhCSACIAIpAyggAikDYCIKfCAAKQMhIAIpA2giEIUiEUIgiCARQv////8Pg358NwMoIAIgECAJIAggCoUiCEIgiCAIQv////8Pg358fDcDICACIAYgAikDcCIIfCAAKQMxIAIpA3giBoUiCUIgiCAJQv////8Pg358NwM4IAIgBiAIIAApAymFIghCIIggCEL/////D4N+IAV8fDcDMAsgAiACIANBC2ogBEKHla+vmLbem55/fhADNwNAIAIgAiADQQAoApyOAWpBdWogBELP1tO+0ser2UJ+Qn+FEAM3A0gMAQsgBKchAAJAQQApA6COASIEUA0AAkAgAEEQSw0AIAJBwABqIABBgAggBBAEDAILAkAgAEGAAUsNACACQcAAaiAAQYAIIAQQBQwCCyACQcAAaiAAQYAIIAQQBgwBCwJAIABBEEsNACACQcAAaiAAIANCABAEDAELAkAgAEGAAUsNACACQcAAaiAAIANCABAFDAELIAJBwABqIAAgA0IAEAYLQQAgAikDcDcDuApBACACKQNgNwOoCkEAIAIpA1A3A5gKQQAgAkH4AGopAwA3A8AKQQAgAkHoAGopAwA3A7AKQQAgAkHYAGopAwA3A6AKQQAgAikDSCIEQjiGIARCgP4Dg0IohoQgBEKAgPwHg0IYhiAEQoCAgPgPg0IIhoSEIARCCIhCgICA+A+DIARCGIhCgID8B4OEIARCKIhCgP4DgyAEQjiIhISEIgQ3A4AKQQAgBDcDkApBACACKQNAIgRCOIYgBEKA/gODQiiGhCAEQoCA/AeDQhiGIARCgICA+A+DQgiGhIQgBEIIiEKAgID4D4MgBEIYiEKAgPwHg4QgBEIoiEKA/gODIARCOIiEhIQ3A4gKIAEkAAsGAEGAigELAgALC8wBAQBBgAgLxAG4/mw5I6RLvnwBgSz3Ia0c3tRt6YOQl9tyQKSkt7NnH8t55k7MwOV4glrQfcz/ciG4CEZ090MkjuA1kOaBOiZMPChSu5HDAMuI0GWLG1Muo3FkSJeiDflOOBnvRqnerNio+nY/45w0P/ncu8fHC08dilHgS820WTHIn37J2XhzZOrFrIM00+vDxYGg//oTY+sXDd1Rt/DaSdMWVSYp1GieKxa+WH1HofyP+LjRetAxzkXLOo+VFgQor9f7yrtLQH5AAgAA\";\nvar hash$5 = \"b9ab74e2\";\nvar wasmJson$5 = {\n\tname: name$5,\n\tdata: data$5,\n\thash: hash$5\n};\n\nconst mutex$3 = new Mutex();\nlet wasmCache$3 = null;\nconst seedBuffer = new Uint8Array(8);\nfunction validateSeed(seed) {\n if (!Number.isInteger(seed) || seed < 0 || seed > 0xffffffff) {\n return new Error(\"Seed must be given as two valid 32-bit long unsigned integers (lo + high).\");\n }\n return null;\n}\nfunction writeSeed(arr, low, high) {\n // write in little-endian format\n const buffer = new DataView(arr);\n buffer.setUint32(0, low, true);\n buffer.setUint32(4, high, true);\n}\n/**\n * Calculates xxHash128 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @param seedLow Lower 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @param seedHigh Higher 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @returns Computed hash as a hexadecimal string\n */\nfunction xxhash128(data, seedLow = 0, seedHigh = 0) {\n if (validateSeed(seedLow)) {\n return Promise.reject(validateSeed(seedLow));\n }\n if (validateSeed(seedHigh)) {\n return Promise.reject(validateSeed(seedHigh));\n }\n if (wasmCache$3 === null) {\n return lockedCreate(mutex$3, wasmJson$5, 16).then((wasm) => {\n wasmCache$3 = wasm;\n writeSeed(seedBuffer.buffer, seedLow, seedHigh);\n wasmCache$3.writeMemory(seedBuffer);\n return wasmCache$3.calculate(data);\n });\n }\n try {\n writeSeed(seedBuffer.buffer, seedLow, seedHigh);\n wasmCache$3.writeMemory(seedBuffer);\n const hash = wasmCache$3.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new xxHash128 hash instance\n * @param seedLow Lower 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n * @param seedHigh Higher 32 bits of the number used to\n * initialize the internal state of the algorithm (defaults to 0)\n */\nfunction createXXHash128(seedLow = 0, seedHigh = 0) {\n if (validateSeed(seedLow)) {\n return Promise.reject(validateSeed(seedLow));\n }\n if (validateSeed(seedHigh)) {\n return Promise.reject(validateSeed(seedHigh));\n }\n return WASMInterface(wasmJson$5, 16).then((wasm) => {\n const instanceBuffer = new Uint8Array(8);\n writeSeed(instanceBuffer.buffer, seedLow, seedHigh);\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n const obj = {\n init: () => {\n wasm.writeMemory(instanceBuffer);\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 512,\n digestSize: 16,\n };\n return obj;\n });\n}\n\nvar name$4 = \"ripemd160\";\nvar data$4 = \"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\";\nvar hash$4 = \"6abbce74\";\nvar wasmJson$4 = {\n\tname: name$4,\n\tdata: data$4,\n\thash: hash$4\n};\n\nconst mutex$2 = new Mutex();\nlet wasmCache$2 = null;\n/**\n * Calculates RIPEMD-160 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction ripemd160(data) {\n if (wasmCache$2 === null) {\n return lockedCreate(mutex$2, wasmJson$4, 20).then((wasm) => {\n wasmCache$2 = wasm;\n return wasmCache$2.calculate(data);\n });\n }\n try {\n const hash = wasmCache$2.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new RIPEMD-160 hash instance\n */\nfunction createRIPEMD160() {\n return WASMInterface(wasmJson$4, 20).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 20,\n };\n return obj;\n });\n}\n\nfunction calculateKeyBuffer(hasher, key) {\n const { blockSize } = hasher;\n const buf = getUInt8Buffer(key);\n if (buf.length > blockSize) {\n hasher.update(buf);\n const uintArr = hasher.digest(\"binary\");\n hasher.init();\n return uintArr;\n }\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);\n}\nfunction calculateHmac(hasher, key) {\n hasher.init();\n const { blockSize } = hasher;\n const keyBuf = calculateKeyBuffer(hasher, key);\n const keyBuffer = new Uint8Array(blockSize);\n keyBuffer.set(keyBuf);\n const opad = new Uint8Array(blockSize);\n for (let i = 0; i < blockSize; i++) {\n const v = keyBuffer[i];\n opad[i] = v ^ 0x5c;\n keyBuffer[i] = v ^ 0x36;\n }\n hasher.update(keyBuffer);\n const obj = {\n init: () => {\n hasher.init();\n hasher.update(keyBuffer);\n return obj;\n },\n update: (data) => {\n hasher.update(data);\n return obj;\n },\n digest: ((outputType) => {\n const uintArr = hasher.digest(\"binary\");\n hasher.init();\n hasher.update(opad);\n hasher.update(uintArr);\n return hasher.digest(outputType);\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n }),\n save: () => {\n throw new Error(\"save() not supported\");\n },\n load: () => {\n throw new Error(\"load() not supported\");\n },\n blockSize: hasher.blockSize,\n digestSize: hasher.digestSize,\n };\n return obj;\n}\n/**\n * Calculates HMAC hash\n * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()\n * @param key Key (string, Buffer or TypedArray)\n */\nfunction createHMAC(hash, key) {\n if (!hash || !hash.then) {\n throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), \"key\").');\n }\n return hash.then((hasher) => calculateHmac(hasher, key));\n}\n\nfunction calculatePBKDF2(digest, salt, iterations, hashLength, outputType) {\n return __awaiter(this, void 0, void 0, function* () {\n const DK = new Uint8Array(hashLength);\n const block1 = new Uint8Array(salt.length + 4);\n const block1View = new DataView(block1.buffer);\n const saltBuffer = getUInt8Buffer(salt);\n const saltUIntBuffer = new Uint8Array(saltBuffer.buffer, saltBuffer.byteOffset, saltBuffer.length);\n block1.set(saltUIntBuffer);\n let destPos = 0;\n const hLen = digest.digestSize;\n const l = Math.ceil(hashLength / hLen);\n let T = null;\n let U = null;\n for (let i = 1; i <= l; i++) {\n block1View.setUint32(salt.length, i);\n digest.init();\n digest.update(block1);\n T = digest.digest(\"binary\");\n U = T.slice();\n for (let j = 1; j < iterations; j++) {\n digest.init();\n digest.update(U);\n U = digest.digest(\"binary\");\n for (let k = 0; k < hLen; k++) {\n T[k] ^= U[k];\n }\n }\n DK.set(T.subarray(0, hashLength - destPos), destPos);\n destPos += hLen;\n }\n if (outputType === \"binary\") {\n return DK;\n }\n const digestChars = new Uint8Array(hashLength * 2);\n return getDigestHex(digestChars, DK, hashLength);\n });\n}\nconst validateOptions$2 = (options) => {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"Invalid options parameter. It requires an object.\");\n }\n if (!options.hashFunction || !options.hashFunction.then) {\n throw new Error('Invalid hash function is provided! Usage: pbkdf2(\"password\", \"salt\", 1000, 32, createSHA1()).');\n }\n if (!Number.isInteger(options.iterations) || options.iterations < 1) {\n throw new Error(\"Iterations should be a positive number\");\n }\n if (!Number.isInteger(options.hashLength) || options.hashLength < 1) {\n throw new Error(\"Hash length should be a positive number\");\n }\n if (options.outputType === undefined) {\n options.outputType = \"hex\";\n }\n if (![\"hex\", \"binary\"].includes(options.outputType)) {\n throw new Error(`Insupported output type ${options.outputType}. Valid values: ['hex', 'binary']`);\n }\n};\n/**\n * Generates a new PBKDF2 hash for the supplied password\n */\nfunction pbkdf2(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateOptions$2(options);\n const hmac = yield createHMAC(options.hashFunction, options.password);\n return calculatePBKDF2(hmac, options.salt, options.iterations, options.hashLength, options.outputType);\n });\n}\n\nvar name$3 = \"scrypt\";\nvar data$3 = \"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cyICajYCOCAAIAAoAjwgAiAKakESdyAGc2o2AjwLvxIDFX8Bfg5/AkAgAkUNACAAQQd0IgNBQGoiBEEAKAKACCIFIAMgAmwiBmogAyABbGoiByADaiIIaiEJIAAgAkEHdCIKIAFBB3RqIgtsIQwgACALQYABamwhDSAAQQV0IgtBASALQQFLGyILQWBxIQ4gC0EBcSEPIAdBeGohECAHQXBqIREgB0FoaiESIAdBYGohEyAHQVhqIRQgB0FQaiEVIAdBSGohFiAHQUBqIRcgAa1Cf3whGCAEIAdqIRkgByAAQQh0IhpqIRsgACAKQYABamwhHCALQQRJIR1BACEeQQAhHwNAQQAoAoAIIiAgAyAfbGohIQJAIABFDQBBACEiAkAgHQ0AICAgHmohI0EAIQtBACEiA0AgByALaiIEICMgC2oiJCgCADYCACAEQQRqICRBBGooAgA2AgAgBEEIaiAkQQhqKAIANgIAIARBDGogJEEMaigCADYCACALQRBqIQsgDiAiQQRqIiJHDQALCyAPRQ0AIAcgIkECdCILaiAhIAtqKAIANgIACwJAIAFFDQBBACElIBwhIyAGISYDQCAFISQgACEiAkACQCAADQAgGyAXKQMANwMAIBsgFikDADcDCCAbIBUpAwA3AxAgGyAUKQMANwMYIBsgEykDADcDICAbIBIpAwA3AyggGyARKQMANwMwIBsgECkDADcDOAwBCwNAICQgJmoiCyAkIAxqIgQpAwA3AwAgC0EIaiAEQQhqKQMANwMAIAtBEGogBEEQaikDADcDACALQRhqIARBGGopAwA3AwAgC0EgaiAEQSBqKQMANwMAIAtBKGogBEEoaikDADcDACALQTBqIARBMGopAwA3AwAgC0E4aiAEQThqKQMANwMAIAtBwABqIARBwABqKQMANwMAIAtByABqIARByABqKQMANwMAIAtB0ABqIARB0ABqKQMANwMAIAtB2ABqIARB2ABqKQMANwMAIAtB4ABqIARB4ABqKQMANwMAIAtB6ABqIARB6ABqKQMANwMAIAtB8ABqIARB8ABqKQMANwMAIAtB+ABqIARB+ABqKQMANwMAICRBgAFqISQgIkF/aiIiDQALIAcgCCAbIAAQAiAFISQgACEiA0AgJCAjaiILICQgDWoiBCkDADcDACALQQhqIARBCGopAwA3AwAgC0EQaiAEQRBqKQMANwMAIAtBGGogBEEYaikDADcDACALQSBqIARBIGopAwA3AwAgC0EoaiAEQShqKQMANwMAIAtBMGogBEEwaikDADcDACALQThqIARBOGopAwA3AwAgC0HAAGogBEHAAGopAwA3AwAgC0HIAGogBEHIAGopAwA3AwAgC0HQAGogBEHQAGopAwA3AwAgC0HYAGogBEHYAGopAwA3AwAgC0HgAGogBEHgAGopAwA3AwAgC0HoAGogBEHoAGopAwA3AwAgC0HwAGogBEHwAGopAwA3AwAgC0H4AGogBEH4AGopAwA3AwAgJEGAAWohJCAiQX9qIiINAAsLIAggByAbIAAQAiAjIBpqISMgJiAaaiEmICVBAmoiJSABSQ0AC0EAISUDQAJAAkAgAA0AIBsgFykDADcDACAbIBYpAwA3AwggGyAVKQMANwMQIBsgFCkDADcDGCAbIBMpAwA3AyAgGyASKQMANwMoIBsgESkDADcDMCAbIBApAwA3AzgMAQsgACAKIBkpAgAgGIOnQQd0amwhJiAFISQgACEiA0AgJCAMaiILIAspAwAgJCAmaiIEKQMAhTcDACALQQhqIiMgIykDACAEQQhqKQMAhTcDACALQRBqIiMgIykDACAEQRBqKQMAhTcDACALQRhqIiMgIykDACAEQRhqKQMAhTcDACALQSBqIiMgIykDACAEQSBqKQMAhTcDACALQShqIiMgIykDACAEQShqKQMAhTcDACALQTBqIiMgIykDACAEQTBqKQMAhTcDACALQThqIiMgIykDACAEQThqKQMAhTcDACALQcAAaiIjICMpAwAgBEHAAGopAwCFNwMAIAtByABqIiMgIykDACAEQcgAaikDAIU3AwAgC0HQAGoiIyAjKQMAIARB0ABqKQMAhTcDACALQdgAaiIjICMpAwAgBEHYAGopAwCFNwMAIAtB4ABqIiMgIykDACAEQeAAaikDAIU3AwAgC0HoAGoiIyAjKQMAIARB6ABqKQMAhTcDACALQfAAaiIjICMpAwAgBEHwAGopAwCFNwMAIAtB+ABqIgsgCykDACAEQfgAaikDAIU3AwAgJEGAAWohJCAiQX9qIiINAAsgByAIIBsgABACIAAgCiAJKQIAIBiDp0EHdGpsISYgBSEkIAAhIgNAICQgDWoiCyALKQMAICQgJmoiBCkDAIU3AwAgC0EIaiIjICMpAwAgBEEIaikDAIU3AwAgC0EQaiIjICMpAwAgBEEQaikDAIU3AwAgC0EYaiIjICMpAwAgBEEYaikDAIU3AwAgC0EgaiIjICMpAwAgBEEgaikDAIU3AwAgC0EoaiIjICMpAwAgBEEoaikDAIU3AwAgC0EwaiIjICMpAwAgBEEwaikDAIU3AwAgC0E4aiIjICMpAwAgBEE4aikDAIU3AwAgC0HAAGoiIyAjKQMAIARBwABqKQMAhTcDACALQcgAaiIjICMpAwAgBEHIAGopAwCFNwMAIAtB0ABqIiMgIykDACAEQdAAaikDAIU3AwAgC0HYAGoiIyAjKQMAIARB2ABqKQMAhTcDACALQeAAaiIjICMpAwAgBEHgAGopAwCFNwMAIAtB6ABqIiMgIykDACAEQegAaikDAIU3AwAgC0HwAGoiIyAjKQMAIARB8ABqKQMAhTcDACALQfgAaiILIAspAwAgBEH4AGopAwCFNwMAICRBgAFqISQgIkF/aiIiDQALCyAIIAcgGyAAEAIgJUECaiIlIAFJDQALCwJAIABFDQBBACEiAkAgHQ0AICAgHmohI0EAIQtBACEiA0AgIyALaiIEIAcgC2oiJCgCADYCACAEQQRqICRBBGooAgA2AgAgBEEIaiAkQQhqKAIANgIAIARBDGogJEEMaigCADYCACALQRBqIQsgDiAiQQRqIiJHDQALCyAPRQ0AICEgIkECdCILaiAHIAtqKAIANgIACyAeIANqIR4gH0EBaiIfIAJHDQALCws=\";\nvar hash$3 = \"b32721f8\";\nvar wasmJson$3 = {\n\tname: name$3,\n\tdata: data$3,\n\thash: hash$3\n};\n\nfunction scryptInternal(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const { costFactor, blockSize, parallelism, hashLength } = options;\n const SHA256Hasher = createSHA256();\n const blockData = yield pbkdf2({\n password: options.password,\n salt: options.salt,\n iterations: 1,\n hashLength: 128 * blockSize * parallelism,\n hashFunction: SHA256Hasher,\n outputType: \"binary\",\n });\n const scryptInterface = yield WASMInterface(wasmJson$3, 0);\n // last block is for storing the temporary vectors\n const VSize = 128 * blockSize * costFactor;\n const XYSize = 256 * blockSize;\n scryptInterface.setMemorySize(blockData.length + VSize + XYSize);\n scryptInterface.writeMemory(blockData, 0);\n // mix blocks\n scryptInterface.getExports().scrypt(blockSize, costFactor, parallelism);\n const expensiveSalt = scryptInterface\n .getMemory()\n .subarray(0, 128 * blockSize * parallelism);\n const outputData = yield pbkdf2({\n password: options.password,\n salt: expensiveSalt,\n iterations: 1,\n hashLength,\n hashFunction: SHA256Hasher,\n outputType: \"binary\",\n });\n if (options.outputType === \"hex\") {\n const digestChars = new Uint8Array(hashLength * 2);\n return getDigestHex(digestChars, outputData, hashLength);\n }\n // return binary format\n return outputData;\n });\n}\nconst isPowerOfTwo = (v) => v && !(v & (v - 1));\nconst validateOptions$1 = (options) => {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"Invalid options parameter. It requires an object.\");\n }\n if (!Number.isInteger(options.blockSize) || options.blockSize < 1) {\n throw new Error(\"Block size should be a positive number\");\n }\n if (!Number.isInteger(options.costFactor) ||\n options.costFactor < 2 ||\n !isPowerOfTwo(options.costFactor)) {\n throw new Error(\"Cost factor should be a power of 2, greater than 1\");\n }\n if (!Number.isInteger(options.parallelism) || options.parallelism < 1) {\n throw new Error(\"Parallelism should be a positive number\");\n }\n if (!Number.isInteger(options.hashLength) || options.hashLength < 1) {\n throw new Error(\"Hash length should be a positive number.\");\n }\n if (options.outputType === undefined) {\n options.outputType = \"hex\";\n }\n if (![\"hex\", \"binary\"].includes(options.outputType)) {\n throw new Error(`Insupported output type ${options.outputType}. Valid values: ['hex', 'binary']`);\n }\n};\n/**\n * Calculates hash using the scrypt password-based key derivation function\n * @returns Computed hash as a hexadecimal string or as\n * Uint8Array depending on the outputType option\n */\nfunction scrypt(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateOptions$1(options);\n return scryptInternal(options);\n });\n}\n\nvar name$2 = \"bcrypt\";\nvar data$2 = \"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\";\nvar hash$2 = \"8bd8822d\";\nvar wasmJson$2 = {\n\tname: name$2,\n\tdata: data$2,\n\thash: hash$2\n};\n\nfunction bcryptInternal(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const { costFactor, password, salt } = options;\n const bcryptInterface = yield WASMInterface(wasmJson$2, 0);\n bcryptInterface.writeMemory(getUInt8Buffer(salt), 0);\n const passwordBuffer = getUInt8Buffer(password);\n bcryptInterface.writeMemory(passwordBuffer, 16);\n const shouldEncode = options.outputType === \"encoded\" ? 1 : 0;\n bcryptInterface\n .getExports()\n .bcrypt(passwordBuffer.length, costFactor, shouldEncode);\n const memory = bcryptInterface.getMemory();\n if (options.outputType === \"encoded\") {\n return intArrayToString(memory, 60);\n }\n if (options.outputType === \"hex\") {\n const digestChars = new Uint8Array(24 * 2);\n return getDigestHex(digestChars, memory, 24);\n }\n // return binary format\n // the data is copied to allow GC of the original memory buffer\n return memory.slice(0, 24);\n });\n}\nconst validateOptions = (options) => {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"Invalid options parameter. It requires an object.\");\n }\n if (!Number.isInteger(options.costFactor) ||\n options.costFactor < 4 ||\n options.costFactor > 31) {\n throw new Error(\"Cost factor should be a number between 4 and 31\");\n }\n options.password = getUInt8Buffer(options.password);\n if (options.password.length < 1) {\n throw new Error(\"Password should be at least 1 byte long\");\n }\n if (options.password.length > 72) {\n throw new Error(\"Password should be at most 72 bytes long\");\n }\n options.salt = getUInt8Buffer(options.salt);\n if (options.salt.length !== 16) {\n throw new Error(\"Salt should be 16 bytes long\");\n }\n if (options.outputType === undefined) {\n options.outputType = \"encoded\";\n }\n if (![\"hex\", \"binary\", \"encoded\"].includes(options.outputType)) {\n throw new Error(`Insupported output type ${options.outputType}. Valid values: ['hex', 'binary', 'encoded']`);\n }\n};\n/**\n * Calculates hash using the bcrypt password-hashing function\n * @returns Computed hash\n */\nfunction bcrypt(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateOptions(options);\n return bcryptInternal(options);\n });\n}\nconst validateHashCharacters = (hash) => {\n if (!/^\\$2[axyb]\\$[0-3][0-9]\\$[./A-Za-z0-9]{53}$/.test(hash)) {\n return false;\n }\n if (hash[4] === \"0\" && Number(hash[5]) < 4) {\n return false;\n }\n if (hash[4] === \"3\" && Number(hash[5]) > 1) {\n return false;\n }\n return true;\n};\nconst validateVerifyOptions = (options) => {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"Invalid options parameter. It requires an object.\");\n }\n if (options.hash === undefined || typeof options.hash !== \"string\") {\n throw new Error(\"Hash should be specified\");\n }\n if (options.hash.length !== 60) {\n throw new Error(\"Hash should be 60 bytes long\");\n }\n if (!validateHashCharacters(options.hash)) {\n throw new Error(\"Invalid hash\");\n }\n options.password = getUInt8Buffer(options.password);\n if (options.password.length < 1) {\n throw new Error(\"Password should be at least 1 byte long\");\n }\n if (options.password.length > 72) {\n throw new Error(\"Password should be at most 72 bytes long\");\n }\n};\n/**\n * Verifies password using bcrypt password-hashing function\n * @returns True if the encoded hash matches the password\n */\nfunction bcryptVerify(options) {\n return __awaiter(this, void 0, void 0, function* () {\n validateVerifyOptions(options);\n const { hash, password } = options;\n const bcryptInterface = yield WASMInterface(wasmJson$2, 0);\n bcryptInterface.writeMemory(getUInt8Buffer(hash), 0);\n const passwordBuffer = getUInt8Buffer(password);\n bcryptInterface.writeMemory(passwordBuffer, 60);\n return !!bcryptInterface.getExports().bcrypt_verify(passwordBuffer.length);\n });\n}\n\nvar name$1 = \"whirlpool\";\nvar data$1 = \"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\";\nvar hash$1 = \"8d8f6035\";\nvar wasmJson$1 = {\n\tname: name$1,\n\tdata: data$1,\n\thash: hash$1\n};\n\nconst mutex$1 = new Mutex();\nlet wasmCache$1 = null;\n/**\n * Calculates Whirlpool hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction whirlpool(data) {\n if (wasmCache$1 === null) {\n return lockedCreate(mutex$1, wasmJson$1, 64).then((wasm) => {\n wasmCache$1 = wasm;\n return wasmCache$1.calculate(data);\n });\n }\n try {\n const hash = wasmCache$1.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new Whirlpool hash instance\n */\nfunction createWhirlpool() {\n return WASMInterface(wasmJson$1, 64).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 64,\n };\n return obj;\n });\n}\n\nvar name = \"sm3\";\nvar data = \"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\";\nvar hash = \"b6fb4b8e\";\nvar wasmJson = {\n\tname: name,\n\tdata: data,\n\thash: hash\n};\n\nconst mutex = new Mutex();\nlet wasmCache = null;\n/**\n * Calculates SM3 hash\n * @param data Input data (string, Buffer or TypedArray)\n * @returns Computed hash as a hexadecimal string\n */\nfunction sm3(data) {\n if (wasmCache === null) {\n return lockedCreate(mutex, wasmJson, 32).then((wasm) => {\n wasmCache = wasm;\n return wasmCache.calculate(data);\n });\n }\n try {\n const hash = wasmCache.calculate(data);\n return Promise.resolve(hash);\n }\n catch (err) {\n return Promise.reject(err);\n }\n}\n/**\n * Creates a new SM3 hash instance\n */\nfunction createSM3() {\n return WASMInterface(wasmJson, 32).then((wasm) => {\n wasm.init();\n const obj = {\n init: () => {\n wasm.init();\n return obj;\n },\n update: (data) => {\n wasm.update(data);\n return obj;\n },\n // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type\n digest: (outputType) => wasm.digest(outputType),\n save: () => wasm.save(),\n load: (data) => {\n wasm.load(data);\n return obj;\n },\n blockSize: 64,\n digestSize: 32,\n };\n return obj;\n });\n}\n\nexport { adler32, argon2Verify, argon2d, argon2i, argon2id, bcrypt, bcryptVerify, blake2b, blake2s, blake3, crc32, crc64, createAdler32, createBLAKE2b, createBLAKE2s, createBLAKE3, createCRC32, createCRC64, createHMAC, createKeccak, createMD4, createMD5, createRIPEMD160, createSHA1, createSHA224, createSHA256, createSHA3, createSHA384, createSHA512, createSM3, createWhirlpool, createXXHash128, createXXHash3, createXXHash32, createXXHash64, keccak, md4, md5, pbkdf2, ripemd160, scrypt, sha1, sha224, sha256, sha3, sha384, sha512, sm3, whirlpool, xxhash128, xxhash3, xxhash32, xxhash64 };\n","/**\n * Argon2id Key Derivation Function using hash-wasm\n *\n * Security:\n * - Argon2id is the recommended variant (hybrid of Argon2i and Argon2d)\n * - Uses OWASP-recommended parameters by default\n * - Memory-hard to resist GPU/ASIC attacks\n *\n * H-01: Memory Limitation\n * JavaScript strings are immutable and cannot be securely wiped from memory.\n * The password parameter persists in memory until garbage collected.\n * For maximum security with sensitive passwords:\n * - Use argon2DeriveFromBytes() with Uint8Array input\n * - Wipe the Uint8Array after derivation using wipeBytes()\n * - Keep password lifetime as short as possible\n */\n\nimport { argon2id } from 'hash-wasm';\nimport type { EncryptionKey, Argon2Salt, KdfParams } from './types';\nimport { DEFAULT_KDF_PARAMS, toEncryptionKey } from './types';\nimport { wipeBytes } from './secureWipe';\n\n/** Output key length in bytes (256-bit for AES-256) */\nconst OUTPUT_LENGTH = 32;\n\n/**\n * Derive an encryption key from a password using Argon2id\n *\n * @security H-01: The password string cannot be wiped from memory after use.\n * For sensitive applications, prefer argon2DeriveFromBytes() which accepts\n * Uint8Array that CAN be securely wiped.\n *\n * @param password - User password or PIN\n * @param salt - Unique salt (16+ bytes)\n * @param params - KDF parameters (memory, time, parallelism)\n * @returns 32-byte encryption key\n */\nexport async function argon2Derive(\n password: string,\n salt: Argon2Salt,\n params: KdfParams = DEFAULT_KDF_PARAMS\n): Promise<EncryptionKey> {\n // Validate parameters (prevent DoS via excessive resource usage)\n validateKdfParams(params);\n\n try {\n const hash = await argon2id({\n password,\n salt,\n iterations: params.tCost,\n memorySize: params.mCost,\n parallelism: params.pCost,\n hashLength: OUTPUT_LENGTH,\n outputType: 'binary',\n });\n\n return toEncryptionKey(hash);\n } catch {\n // Don't leak internal error details\n throw new Error('Key derivation failed');\n }\n}\n\n/**\n * Derive key from password bytes (for non-string passwords like PINs)\n *\n * @param passwordBytes - Password as bytes\n * @param salt - Unique salt\n * @param params - KDF parameters\n * @returns 32-byte encryption key\n */\nexport async function argon2DeriveFromBytes(\n passwordBytes: Uint8Array,\n salt: Argon2Salt,\n params: KdfParams = DEFAULT_KDF_PARAMS\n): Promise<EncryptionKey> {\n validateKdfParams(params);\n\n try {\n const hash = await argon2id({\n password: passwordBytes,\n salt,\n iterations: params.tCost,\n memorySize: params.mCost,\n parallelism: params.pCost,\n hashLength: OUTPUT_LENGTH,\n outputType: 'binary',\n });\n\n return toEncryptionKey(hash);\n } catch {\n throw new Error('Key derivation failed');\n }\n}\n\n/**\n * Validate KDF parameters are within safe bounds\n *\n * Prevents DoS attacks via excessive resource consumption.\n *\n * @param params - Parameters to validate\n * @throws Error if parameters are out of bounds\n */\nexport function validateKdfParams(params: KdfParams): void {\n // Memory: 16 MiB minimum (OWASP), 1 GiB maximum (prevent DoS)\n if (params.mCost < 16384) {\n throw new Error('KDF memory cost too low (minimum 16 MiB)');\n }\n if (params.mCost > 1048576) {\n throw new Error('KDF memory cost too high (maximum 1 GiB)');\n }\n\n // Time: 1 minimum, 10 maximum\n if (params.tCost < 1) {\n throw new Error('KDF time cost must be at least 1');\n }\n if (params.tCost > 10) {\n throw new Error('KDF time cost too high (maximum 10)');\n }\n\n // Parallelism: 1 minimum, 4 maximum\n if (params.pCost < 1) {\n throw new Error('KDF parallelism must be at least 1');\n }\n if (params.pCost > 4) {\n throw new Error('KDF parallelism too high (maximum 4)');\n }\n}\n\n/**\n * Check if Argon2 WASM is available and working\n *\n * @returns true if Argon2 can be used\n */\nexport async function isArgon2Supported(): Promise<boolean> {\n try {\n // Try a minimal hash operation\n const testResult = await argon2id({\n password: 'test',\n salt: new Uint8Array(16),\n iterations: 1,\n memorySize: 1024, // 1 MiB for quick test\n parallelism: 1,\n hashLength: 32,\n outputType: 'binary',\n });\n\n // Verify output length\n if (testResult.length !== 32) {\n return false;\n }\n\n // Clean up test hash\n wipeBytes(testResult);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Verify a password against stored parameters\n *\n * This is primarily for testing/validation, not for authentication\n * (the server handles authentication).\n *\n * M-06: Timing Leak Note\n * The length check at the start of comparison returns early on mismatch,\n * creating a timing side-channel. This is acceptable because:\n * 1. Server handles real authentication (not this client-side code)\n * 2. Key lengths are fixed (32 bytes), so mismatch indicates corruption not attack\n * 3. Argon2 derivation dominates timing regardless of comparison path\n *\n * @param password - Password to verify\n * @param salt - Salt used during original derivation\n * @param params - KDF parameters used\n * @param expectedKey - Expected derived key\n * @returns true if password produces the same key\n */\nexport async function verifyPassword(\n password: string,\n salt: Argon2Salt,\n params: KdfParams,\n expectedKey: Uint8Array\n): Promise<boolean> {\n let derivedKey: Uint8Array | undefined;\n try {\n derivedKey = await argon2Derive(password, salt, params);\n\n // Constant-time comparison\n if (derivedKey.length !== expectedKey.length) {\n return false;\n }\n\n let result = 0;\n for (let i = 0; i < derivedKey.length; i++) {\n result |= derivedKey[i] ^ expectedKey[i];\n }\n\n return result === 0;\n } finally {\n if (derivedKey) {\n wipeBytes(derivedKey);\n }\n }\n}\n\n/**\n * Get recommended KDF parameters based on target duration\n *\n * @param targetMs - Target duration in milliseconds (default: 500ms)\n * @returns Recommended parameters\n */\nexport function getRecommendedParams(targetMs: number = 500): KdfParams {\n // For now, return OWASP defaults\n // TODO: Could implement calibration based on device performance\n if (targetMs < 250) {\n // Fast mode (less secure, for testing)\n return {\n mCost: 16384, // 16 MiB\n tCost: 1,\n pCost: 1,\n };\n } else if (targetMs < 1000) {\n // Standard mode\n return DEFAULT_KDF_PARAMS;\n } else {\n // High security mode\n return {\n mCost: 65536, // 64 MiB\n tCost: 3,\n pCost: 1,\n };\n }\n}\n","/**\n * WebAuthn PRF (Pseudo-Random Function) extension for device key derivation\n *\n * The PRF extension allows deriving unique cryptographic keys from passkeys.\n * This is used to encrypt Share B with a device-bound key that cannot be\n * extracted or exported.\n *\n * ## Architectural Note (SEC-02)\n *\n * This module creates **client-side-only** passkeys for wallet encryption.\n * These are SEPARATE from the server-managed WebAuthn credentials used for\n * authentication (see: /webauthn/register/*, /webauthn/auth/*).\n *\n * **Why two separate credential types?**\n *\n * 1. **Different purposes**: Server WebAuthn is for authentication (proving\n * identity), while PRF passkeys are for encryption (deriving device keys).\n *\n * 2. **Privacy**: The server never learns the PRF output or derived keys.\n * Share B encryption is entirely client-side. Server WebAuthn credentials\n * expose the public key to the server.\n *\n * 3. **Independence**: A user can authenticate with any method (password,\n * Google, etc.) while still using PRF passkeys for wallet encryption.\n * The two systems are intentionally decoupled.\n *\n * 4. **Credential per device**: PRF credentials are device-bound. Users may\n * register multiple PRF credentials (one per device) without affecting\n * their authentication methods.\n *\n * **Security implications**:\n * - Server WebAuthn credentials are validated by the server (counter tracking,\n * challenge verification, origin validation)\n * - PRF credentials are purely client-side; security relies on the\n * authenticator's tamper resistance and the HKDF-derived key strength\n *\n * Security:\n * - PRF output is bound to the specific credential and device\n * - Cannot be exported or extracted from the authenticator\n * - Requires user gesture (biometric/PIN) for each operation\n *\n * Browser Support (as of 2024):\n * - Chrome 116+ on Windows, macOS, Android (platform authenticators)\n * - Safari 17+ on macOS, iOS (platform authenticators)\n * - Firefox: Limited support\n */\n\nimport type { PrfSalt } from './types';\nimport { toBufferSource } from './types';\nimport { generatePrfSalt } from './entropy';\nimport { deriveKeyFromPrf } from './hkdf';\nimport { uint8ArrayToBase64, base64ToUint8Array } from './aesGcm';\n\n/**\n * SEC-004: Check if the current hostname is a development domain\n */\nfunction isDevelopmentDomain(hostname: string): boolean {\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname.endsWith('.localhost');\n}\n\n/**\n * SEC-004: Validate the current hostname against allowed RP domains.\n *\n * This prevents WebAuthn credential creation/usage on unexpected domains,\n * which could be used in phishing attacks.\n *\n * @param allowedDomains - List of allowed domain names. Empty means validation is skipped.\n * @throws Error if hostname is not in allowed list (production only)\n */\nfunction validateRpDomain(allowedDomains?: string[]): void {\n if (typeof window === 'undefined') {\n return; // SSR - skip validation\n }\n\n const hostname = window.location.hostname;\n\n // Always allow development domains\n if (isDevelopmentDomain(hostname)) {\n return;\n }\n\n // If no allowed domains configured, log warning but allow (backward compatibility)\n if (!allowedDomains || allowedDomains.length === 0) {\n console.warn(\n '[Cedros] SEC-004: WebAuthn RP domain validation not configured. ' +\n 'In production, set wallet.allowedRpDomains to prevent passkey phishing.'\n );\n return;\n }\n\n // Check if hostname matches any allowed domain\n const isAllowed = allowedDomains.some(\n (domain) => hostname === domain || hostname.endsWith('.' + domain)\n );\n\n if (!isAllowed) {\n throw new Error(\n `WebAuthn operation blocked: domain '${hostname}' is not in the allowed list. ` +\n 'This may indicate a phishing attempt.'\n );\n }\n}\n\n/** Result of registering a new passkey with PRF */\nexport interface PasskeyRegistrationResult {\n /** Base64-encoded credential ID */\n credentialId: string;\n /** Base64-encoded PRF salt */\n prfSalt: string;\n /** PRF output (32 bytes) for key derivation */\n prfOutput: Uint8Array;\n}\n\n/** Result of authenticating with an existing passkey */\nexport interface PasskeyAuthResult {\n /** PRF output (32 bytes) for key derivation */\n prfOutput: Uint8Array;\n}\n\n/**\n * Check if WebAuthn is available in this browser\n */\nexport function isWebAuthnAvailable(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.PublicKeyCredential !== 'undefined' &&\n typeof navigator.credentials !== 'undefined'\n );\n}\n\n/**\n * Check if the PRF extension is supported\n *\n * Note: This only checks for API support, not actual authenticator support.\n * The actual PRF availability depends on the user's authenticator.\n */\nexport async function isPrfSupported(): Promise<boolean> {\n if (!isWebAuthnAvailable()) {\n return false;\n }\n\n try {\n // Check if platform authenticator is available\n const available = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();\n\n if (!available) {\n return false;\n }\n\n // Check for PRF extension support by examining extension capabilities\n // This is a heuristic - actual support is only known at credential creation time\n if (\n 'getClientCapabilities' in PublicKeyCredential &&\n typeof (PublicKeyCredential as unknown as { getClientCapabilities: () => Promise<unknown> })\n .getClientCapabilities === 'function'\n ) {\n const caps = await (\n PublicKeyCredential as unknown as {\n getClientCapabilities: () => Promise<Record<string, boolean>>;\n }\n ).getClientCapabilities();\n if (caps && 'prf' in caps) {\n return caps.prf === true;\n }\n }\n\n // Fallback: assume PRF is supported on modern browsers with platform authenticators\n // Actual support will be confirmed during registration\n return true;\n } catch {\n return false;\n }\n}\n\n/** Options for passkey operations */\nexport interface PasskeyOptions {\n /** SEC-004: Allowed domains for RP ID validation */\n allowedDomains?: string[];\n}\n\n/**\n * Register a new passkey with PRF extension for wallet encryption\n *\n * @param userId - User ID bytes (from authenticated user)\n * @param userName - Display name for the passkey\n * @param displayName - User's display name\n * @param prfSalt - Optional PRF salt (generated if not provided)\n * @param options - Optional configuration including allowed domains\n * @returns Registration result with credential ID and PRF output\n * @throws Error if registration fails or PRF is not supported\n */\nexport async function registerPasskeyWithPrf(\n userId: Uint8Array,\n userName: string,\n displayName: string,\n prfSalt?: PrfSalt,\n options?: PasskeyOptions\n): Promise<PasskeyRegistrationResult> {\n if (!isWebAuthnAvailable()) {\n throw new Error('WebAuthn is not available in this browser');\n }\n\n // SEC-004: Validate RP domain before creating credential\n validateRpDomain(options?.allowedDomains);\n\n const salt = prfSalt ?? generatePrfSalt();\n\n // Create credential with PRF extension\n const credential = (await navigator.credentials.create({\n publicKey: {\n challenge: crypto.getRandomValues(new Uint8Array(32)),\n rp: {\n name: 'Cedros Wallet',\n id: window.location.hostname,\n },\n user: {\n id: toBufferSource(userId),\n name: userName,\n displayName: displayName,\n },\n pubKeyCredParams: [\n { type: 'public-key', alg: -7 }, // ES256\n { type: 'public-key', alg: -257 }, // RS256\n ],\n authenticatorSelection: {\n authenticatorAttachment: 'platform',\n userVerification: 'required',\n residentKey: 'required',\n },\n timeout: 60000,\n attestation: 'none',\n extensions: {\n prf: {\n eval: {\n first: salt,\n },\n },\n } as AuthenticationExtensionsClientInputs,\n },\n })) as PublicKeyCredential | null;\n\n if (!credential) {\n throw new Error('Passkey registration was cancelled');\n }\n\n // Check PRF extension output\n const extensionResults = credential.getClientExtensionResults() as {\n prf?: {\n enabled?: boolean;\n results?: {\n first?: ArrayBuffer;\n };\n };\n };\n\n // CRYPTO-3 FIX: Use || instead of && to correctly detect PRF failure.\n // Should throw if EITHER enabled is false/undefined OR results are missing.\n // The old && logic only threw if BOTH conditions were false.\n if (!extensionResults.prf?.enabled || !extensionResults.prf?.results?.first) {\n throw new Error(\n 'PRF extension is not supported by this authenticator. ' +\n 'Please use a device with a compatible platform authenticator.'\n );\n }\n\n const prfResult = extensionResults.prf?.results?.first;\n if (!prfResult) {\n throw new Error('PRF extension did not return a result');\n }\n\n // CRYPTO-04/CRYPTO-06: Validate PRF output length\n // The WebAuthn PRF extension returns HMAC-SHA256 output (32 bytes) per spec.\n // This strict validation ensures we have the expected entropy for key derivation.\n // Future authenticators using SHA-512 variants would produce 64 bytes; if that\n // becomes common, consider accepting 32 or 64 bytes and truncating to 32.\n const prfOutput = new Uint8Array(prfResult);\n if (prfOutput.length !== 32) {\n throw new Error(\n `Unexpected PRF output length: expected 32 bytes, got ${prfOutput.length}. ` +\n 'The authenticator may not be compatible.'\n );\n }\n\n return {\n credentialId: uint8ArrayToBase64(new Uint8Array(credential.rawId)),\n prfSalt: uint8ArrayToBase64(salt),\n prfOutput,\n };\n}\n\n/**\n * Authenticate with an existing passkey and get PRF output\n *\n * @param credentialId - Base64-encoded credential ID\n * @param prfSalt - Base64-encoded PRF salt\n * @param options - Optional configuration including allowed domains\n * @returns Authentication result with PRF output\n * @throws Error if authentication fails\n */\nexport async function authenticateWithPrf(\n credentialId: string,\n prfSalt: string,\n options?: PasskeyOptions\n): Promise<PasskeyAuthResult> {\n if (!isWebAuthnAvailable()) {\n throw new Error('WebAuthn is not available in this browser');\n }\n\n // SEC-004: Validate RP domain before authentication\n validateRpDomain(options?.allowedDomains);\n\n const credentialIdBytes = base64ToUint8Array(credentialId);\n const prfSaltBytes = base64ToUint8Array(prfSalt);\n\n const assertion = (await navigator.credentials.get({\n publicKey: {\n challenge: crypto.getRandomValues(new Uint8Array(32)),\n rpId: window.location.hostname,\n allowCredentials: [\n {\n type: 'public-key',\n id: toBufferSource(credentialIdBytes),\n },\n ],\n userVerification: 'required',\n timeout: 60000,\n extensions: {\n prf: {\n eval: {\n first: prfSaltBytes,\n },\n },\n } as AuthenticationExtensionsClientInputs,\n },\n })) as PublicKeyCredential | null;\n\n if (!assertion) {\n throw new Error('Passkey authentication was cancelled');\n }\n\n // Check PRF extension output\n const extensionResults = assertion.getClientExtensionResults() as {\n prf?: {\n results?: {\n first?: ArrayBuffer;\n };\n };\n };\n\n const prfResult = extensionResults.prf?.results?.first;\n if (!prfResult) {\n throw new Error('PRF extension did not return a result during authentication');\n }\n\n return {\n prfOutput: new Uint8Array(prfResult),\n };\n}\n\n/**\n * Get encryption key from passkey via PRF extension\n *\n * This combines authentication and key derivation in a single operation.\n *\n * ## SEC-03: Key Lifecycle Management\n *\n * **IMPORTANT**: The returned encryption key is sensitive cryptographic material.\n * Callers are responsible for:\n *\n * 1. Using the key only for its intended purpose (Share B decryption)\n * 2. Wiping the key from memory after use by calling `key.fill(0)`\n * 3. Not storing the key in persistent storage (localStorage, IndexedDB, etc.)\n * 4. Not logging or transmitting the key\n *\n * The PRF output used to derive this key is automatically wiped in the finally\n * block, but the derived key must be managed by the caller.\n *\n * @example\n * ```typescript\n * const key = await getEncryptionKeyFromPasskey(credentialId, prfSalt);\n * try {\n * const plaintext = await decryptShareB(ciphertext, key);\n * // ... use plaintext\n * } finally {\n * key.fill(0); // Wipe key after use\n * }\n * ```\n *\n * @param credentialId - Base64-encoded credential ID\n * @param prfSalt - Base64-encoded PRF salt\n * @param options - Optional configuration including allowed domains\n * @returns 32-byte encryption key derived from PRF output. **Caller must wipe after use.**\n */\nexport async function getEncryptionKeyFromPasskey(\n credentialId: string,\n prfSalt: string,\n options?: PasskeyOptions\n): Promise<Uint8Array> {\n const { prfOutput } = await authenticateWithPrf(credentialId, prfSalt, options);\n const prfSaltBytes = base64ToUint8Array(prfSalt);\n\n try {\n return await deriveKeyFromPrf(prfOutput, prfSaltBytes);\n } finally {\n // Wipe PRF output\n prfOutput.fill(0);\n }\n}\n\n/**\n * Check if a credential ID is valid for this user\n *\n * @param credentialId - Base64-encoded credential ID to check\n * @param options - Optional configuration including allowed domains\n * @returns true if credential exists and can be used\n */\nexport async function isCredentialAvailable(\n credentialId: string,\n options?: PasskeyOptions\n): Promise<boolean> {\n if (!isWebAuthnAvailable()) {\n return false;\n }\n\n try {\n // SEC-004: Validate RP domain before credential check\n validateRpDomain(options?.allowedDomains);\n\n const credentialIdBytes = base64ToUint8Array(credentialId);\n\n // Use conditional mediation to check if credential is available\n // without prompting the user\n const result = await navigator.credentials.get({\n publicKey: {\n challenge: crypto.getRandomValues(new Uint8Array(32)),\n rpId: window.location.hostname,\n allowCredentials: [\n {\n type: 'public-key',\n id: toBufferSource(credentialIdBytes),\n },\n ],\n userVerification: 'discouraged',\n // M-01: 30s timeout for conditional mediation on slower devices/authenticators.\n // Conditional mediation checks credential availability without user prompt,\n // but may be slow on older hardware or when authenticator is busy.\n timeout: 30000,\n },\n mediation: 'conditional' as CredentialMediationRequirement,\n });\n\n return result !== null;\n } catch {\n // Credential not available or other error\n return false;\n }\n}\n\n/**\n * Authenticate with any discoverable passkey and get PRF output\n *\n * This allows authentication without specifying a credential ID, letting\n * the browser present all available passkeys for this domain.\n *\n * @param prfSalt - Base64-encoded PRF salt\n * @param options - Optional configuration including allowed domains\n * @returns Authentication result with PRF output\n * @throws Error if authentication fails\n */\nexport async function authenticateWithDiscoverablePrf(\n prfSalt: string,\n options?: PasskeyOptions\n): Promise<PasskeyAuthResult> {\n if (!isWebAuthnAvailable()) {\n throw new Error('WebAuthn is not available in this browser');\n }\n\n // SEC-004: Validate RP domain before authentication\n validateRpDomain(options?.allowedDomains);\n\n const prfSaltBytes = base64ToUint8Array(prfSalt);\n\n const assertion = (await navigator.credentials.get({\n publicKey: {\n challenge: crypto.getRandomValues(new Uint8Array(32)),\n rpId: window.location.hostname,\n // Empty allowCredentials lets browser show all discoverable credentials\n allowCredentials: [],\n userVerification: 'required',\n timeout: 60000,\n extensions: {\n prf: {\n eval: {\n first: prfSaltBytes,\n },\n },\n } as AuthenticationExtensionsClientInputs,\n },\n })) as PublicKeyCredential | null;\n\n if (!assertion) {\n throw new Error('Passkey authentication was cancelled');\n }\n\n // Check PRF extension output\n const extensionResults = assertion.getClientExtensionResults() as {\n prf?: {\n results?: {\n first?: ArrayBuffer;\n };\n };\n };\n\n const prfResult = extensionResults.prf?.results?.first;\n if (!prfResult) {\n throw new Error('PRF extension did not return a result during authentication');\n }\n\n return {\n prfOutput: new Uint8Array(prfResult),\n };\n}\n","/**\n * Crypto capability detection\n *\n * Checks for availability of all required crypto features before\n * allowing wallet enrollment. If any feature is missing, the wallet\n * feature should be disabled with an appropriate message.\n */\n\nimport type { CryptoCapabilities } from './types';\nimport { isArgon2Supported } from './argon2';\nimport { isHkdfSupported } from './hkdf';\nimport { isWebAuthnAvailable, isPrfSupported } from './webauthnPrf';\n\n/**\n * Check all required crypto capabilities\n *\n * @returns Capability check results\n */\nexport async function checkCryptoCapabilities(): Promise<CryptoCapabilities> {\n const [webCrypto, aesGcm, hkdf, ed25519, webAuthn, webAuthnPrf, argon2] = await Promise.all([\n checkWebCrypto(),\n checkAesGcm(),\n isHkdfSupported(),\n checkEd25519(),\n Promise.resolve(isWebAuthnAvailable()),\n isPrfSupported(),\n isArgon2Supported(),\n ]);\n\n const allSupported = webCrypto && aesGcm && hkdf && webAuthn && webAuthnPrf && argon2;\n\n return {\n webCrypto,\n aesGcm,\n hkdf,\n ed25519,\n webAuthn,\n webAuthnPrf,\n argon2,\n allSupported,\n };\n}\n\n/**\n * Check if basic WebCrypto API is available\n */\nasync function checkWebCrypto(): Promise<boolean> {\n try {\n return (\n typeof crypto !== 'undefined' &&\n typeof crypto.subtle !== 'undefined' &&\n typeof crypto.getRandomValues === 'function'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Check if AES-GCM is supported\n */\nasync function checkAesGcm(): Promise<boolean> {\n try {\n // Generate a test key\n const key = await crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, false, [\n 'encrypt',\n 'decrypt',\n ]);\n\n // Try encryption\n const testData = new Uint8Array([1, 2, 3, 4]);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const encrypted = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, testData);\n\n // Try decryption\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, encrypted);\n\n // Verify roundtrip\n const decryptedArr = new Uint8Array(decrypted);\n return (\n decryptedArr.length === testData.length && decryptedArr.every((b, i) => b === testData[i])\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Check if Ed25519 is supported (for signing, not required for derivation)\n */\nasync function checkEd25519(): Promise<boolean> {\n try {\n // Try to generate an Ed25519 key pair\n await crypto.subtle.generateKey('Ed25519', false, ['sign', 'verify']);\n return true;\n } catch {\n // Ed25519 may not be supported in SubtleCrypto\n // We have a fallback implementation, so this is not critical\n return false;\n }\n}\n\n/**\n * Get a human-readable message about missing capabilities\n *\n * @param capabilities - Capability check results\n * @returns Error message describing what's missing, or null if all supported\n */\nexport function getMissingCapabilitiesMessage(capabilities: CryptoCapabilities): string | null {\n if (capabilities.allSupported) {\n return null;\n }\n\n const missing: string[] = [];\n\n if (!capabilities.webCrypto) {\n missing.push('Web Crypto API');\n }\n if (!capabilities.aesGcm) {\n missing.push('AES-GCM encryption');\n }\n if (!capabilities.hkdf) {\n missing.push('HKDF key derivation');\n }\n if (!capabilities.webAuthn) {\n missing.push('WebAuthn/Passkeys');\n }\n if (!capabilities.webAuthnPrf) {\n missing.push('WebAuthn PRF extension (requires platform authenticator)');\n }\n if (!capabilities.argon2) {\n missing.push('Argon2 password hashing');\n }\n\n if (missing.length === 0) {\n return null;\n }\n\n return `Your browser or device is missing required features: ${missing.join(', ')}. Please use a modern browser with a platform authenticator (e.g., Touch ID, Face ID, Windows Hello).`;\n}\n\n/**\n * Check if the browser is known to support all required features\n *\n * @returns Object with browser info and support status\n */\nexport function getBrowserSupportInfo(): {\n browser: string;\n version: string;\n likelySupported: boolean;\n} {\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n\n // Chrome\n const chromeMatch = ua.match(/Chrome\\/(\\d+)/);\n if (chromeMatch) {\n const version = parseInt(chromeMatch[1], 10);\n return {\n browser: 'Chrome',\n version: chromeMatch[1],\n likelySupported: version >= 116,\n };\n }\n\n // Safari\n const safariMatch = ua.match(/Version\\/(\\d+)/);\n if (safariMatch && ua.includes('Safari') && !ua.includes('Chrome')) {\n const version = parseInt(safariMatch[1], 10);\n return {\n browser: 'Safari',\n version: safariMatch[1],\n likelySupported: version >= 17,\n };\n }\n\n // Firefox\n const firefoxMatch = ua.match(/Firefox\\/(\\d+)/);\n if (firefoxMatch) {\n return {\n browser: 'Firefox',\n version: firefoxMatch[1],\n likelySupported: false, // Firefox PRF support is limited\n };\n }\n\n // Edge\n const edgeMatch = ua.match(/Edg\\/(\\d+)/);\n if (edgeMatch) {\n const version = parseInt(edgeMatch[1], 10);\n return {\n browser: 'Edge',\n version: edgeMatch[1],\n likelySupported: version >= 116,\n };\n }\n\n return {\n browser: 'Unknown',\n version: 'Unknown',\n likelySupported: false,\n };\n}\n\n/**\n * Cache for capability check results\n */\nlet cachedCapabilities: CryptoCapabilities | null = null;\n\n/**\n * Get cached capabilities or check if not cached\n *\n * @param forceRefresh - If true, bypass cache and recheck\n * @returns Capability check results\n */\nexport async function getCryptoCapabilities(forceRefresh = false): Promise<CryptoCapabilities> {\n if (!forceRefresh && cachedCapabilities !== null) {\n return cachedCapabilities;\n }\n\n cachedCapabilities = await checkCryptoCapabilities();\n return cachedCapabilities;\n}\n\n/**\n * Clear the capability cache (useful for testing)\n */\nexport function clearCapabilityCache(): void {\n cachedCapabilities = null;\n}\n","import type { AuthError, AuthErrorCode } from '../types';\nimport { getCsrfToken } from './csrf';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_RETRY_ATTEMPTS = 2;\n\nexport interface ApiClientConfig {\n baseUrl: string;\n timeoutMs?: number;\n retryAttempts?: number;\n getAccessToken?: () => string | null;\n}\n\n/**\n * M-02: Response validator function type.\n * Returns the validated data or throws on invalid shape.\n */\nexport type ResponseValidator<T> = (data: unknown) => T;\n\nexport interface RequestOptions<T = unknown> {\n method: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n body?: unknown;\n credentials?: RequestCredentials;\n skipRetry?: boolean;\n /** M-02: Optional validator to verify response shape at runtime */\n validator?: ResponseValidator<T>;\n}\n\n/**\n * Creates an authentication error from response data\n */\nexport function createAuthError(\n data: { code?: string; message?: string; details?: Record<string, unknown> },\n fallbackMessage: string\n): AuthError {\n return {\n code: (data.code as AuthErrorCode) || 'SERVER_ERROR',\n message: data.message || fallbackMessage,\n details: data.details,\n };\n}\n\n/**\n * Creates a network error\n */\nexport function createNetworkError(): AuthError {\n return {\n code: 'NETWORK_ERROR',\n message: 'Unable to connect to server',\n };\n}\n\n/**\n * Fetch with timeout support\n */\nasync function fetchWithTimeout(\n url: string,\n options: RequestInit,\n timeoutMs: number\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Determines if an error is retryable\n * UI-8 FIX: AbortError (timeout) should NOT be retried - server may have processed request\n */\nfunction isRetryableError(error: unknown): boolean {\n if (error instanceof Error) {\n if ((error as { retryable?: boolean }).retryable) return true;\n // UI-8: AbortError from timeout should NOT be retried\n // Server may have processed the request (just responded slowly)\n // Retrying could cause duplicate operations\n if (error.name === 'AbortError') return false;\n // Network errors (connection failed) are safe to retry\n if (error.message.includes('fetch')) return true;\n }\n return false;\n}\n\n/**\n * Delays execution for the specified duration\n */\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * API client for making authenticated requests with timeout and retry support\n */\nexport class ApiClient {\n private baseUrl: string;\n private timeoutMs: number;\n private retryAttempts: number;\n private getAccessToken?: () => string | null;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl;\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retryAttempts = config.retryAttempts ?? DEFAULT_RETRY_ATTEMPTS;\n this.getAccessToken = config.getAccessToken;\n }\n\n /**\n * Make an API request with timeout and optional retry\n */\n async request<T>(options: RequestOptions<T>): Promise<T> {\n const { method, path, body, credentials = 'include', skipRetry = false, validator } = options;\n const url = `${this.baseUrl}${path}`;\n const isIdempotent =\n method === 'GET' || method === 'HEAD' || method === 'PUT' || method === 'DELETE';\n const maxAttempts = skipRetry || !isIdempotent ? 1 : this.retryAttempts + 1;\n\n // Build headers with CSRF token if available\n const headers: Record<string, string> = {};\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n const accessToken = this.getAccessToken?.();\n if (accessToken) {\n headers.Authorization = `Bearer ${accessToken}`;\n }\n const csrfToken = getCsrfToken();\n if (csrfToken) {\n headers['X-CSRF-Token'] = csrfToken;\n }\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const response = await fetchWithTimeout(\n url,\n {\n method,\n headers,\n credentials,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n },\n this.timeoutMs\n );\n\n const contentType = response.headers.get('content-type') || '';\n let data: { code?: string; message?: string; details?: Record<string, unknown> } = {};\n\n if (contentType.includes('application/json')) {\n if (response.status !== 204) {\n try {\n data = (await response.json()) as {\n code?: string;\n message?: string;\n details?: Record<string, unknown>;\n };\n } catch (e) {\n // UI-JSON: Include actual parse error for easier debugging\n const parseError = e instanceof Error ? e.message : 'parse failed';\n throw new Error(`Invalid JSON response: ${parseError}`);\n }\n }\n } else {\n // U-01: Handle non-JSON responses with informative error messages\n // Proxies/load balancers may return HTML error pages (502, 503)\n const text = await response.text();\n if (text) {\n // Truncate very long responses (e.g., HTML pages) for readability\n const truncated = text.length > 200 ? text.slice(0, 200) + '...' : text;\n const isHtml = contentType.includes('text/html') || text.trimStart().startsWith('<');\n data = {\n message: isHtml\n ? `Unexpected HTML response (${response.status}). The server may be unavailable.`\n : truncated,\n };\n }\n }\n\n if (!response.ok) {\n // Don't retry 4xx errors (client errors)\n if (response.status >= 400 && response.status < 500) {\n throw { isApiError: true, data, status: response.status };\n }\n // Retry 5xx errors\n const err = new Error(`Server error: ${response.status}`);\n (err as { retryable?: boolean }).retryable = true;\n throw err;\n }\n\n // M-02: Apply response validation if provided\n if (validator) {\n try {\n return validator(data);\n } catch (validationError) {\n throw new Error(\n `Response validation failed: ${validationError instanceof Error ? validationError.message : 'Invalid response shape'}`\n );\n }\n }\n\n return data as T;\n } catch (error) {\n lastError = error;\n\n // Don't retry API errors (4xx responses)\n if (typeof error === 'object' && error !== null && 'isApiError' in error) {\n throw error;\n }\n\n // Check if we should retry\n if (attempt < maxAttempts && isRetryableError(error)) {\n // Exponential backoff: 100ms, 200ms, 400ms...\n await delay(100 * Math.pow(2, attempt - 1));\n continue;\n }\n\n throw error;\n }\n }\n\n throw lastError;\n }\n\n /**\n * POST request helper\n */\n async post<T>(path: string, body: unknown, options?: Partial<RequestOptions<T>>): Promise<T> {\n return this.request<T>({ method: 'POST', path, body, ...options });\n }\n\n /**\n * GET request helper\n */\n async get<T>(path: string, options?: Partial<RequestOptions<T>>): Promise<T> {\n return this.request<T>({ method: 'GET', path, ...options });\n }\n\n /**\n * PATCH request helper\n */\n async patch<T>(path: string, body: unknown, options?: Partial<RequestOptions<T>>): Promise<T> {\n return this.request<T>({ method: 'PATCH', path, body, ...options });\n }\n\n /**\n * DELETE request helper\n */\n async delete<T>(path: string, options?: Partial<RequestOptions<T>>): Promise<T> {\n return this.request<T>({ method: 'DELETE', path, ...options });\n }\n}\n\ninterface ApiErrorResponse {\n isApiError: true;\n data: { code?: string; message?: string; details?: Record<string, unknown> };\n status: number;\n}\n\nfunction isApiErrorResponse(err: unknown): err is ApiErrorResponse {\n return typeof err === 'object' && err !== null && 'isApiError' in err;\n}\n\nfunction isAuthError(err: unknown): err is AuthError {\n return typeof err === 'object' && err !== null && 'code' in err && 'message' in err;\n}\n\n/**\n * M-02: Helper to create a basic object shape validator.\n * Checks that required keys exist and are of expected types.\n * @example\n * const validateUser = createValidator<User>({\n * id: 'string',\n * email: 'string',\n * role: 'string',\n * });\n */\nexport function createValidator<T>(\n shape: Record<keyof T & string, 'string' | 'number' | 'boolean' | 'object'>\n): ResponseValidator<T> {\n return (data: unknown): T => {\n if (typeof data !== 'object' || data === null) {\n throw new Error('Expected object response');\n }\n const obj = data as Record<string, unknown>;\n for (const [key, expectedType] of Object.entries(shape)) {\n if (!(key in obj)) {\n throw new Error(`Missing required field: ${key}`);\n }\n const actualType = typeof obj[key];\n if (actualType !== expectedType) {\n throw new Error(`Invalid type for ${key}: expected ${expectedType}, got ${actualType}`);\n }\n }\n return data as T;\n };\n}\n\n/**\n * Converts API errors to AuthError format\n */\nexport function handleApiError(err: unknown, fallbackMessage: string): AuthError {\n // Already an AuthError\n if (isAuthError(err)) {\n return err;\n }\n\n // API error response (4xx/5xx)\n if (isApiErrorResponse(err)) {\n return createAuthError(err.data, fallbackMessage);\n }\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n return {\n code: 'NETWORK_ERROR',\n message: 'Request timed out',\n };\n }\n if (\n err.message.startsWith('Server error:') ||\n err.message.startsWith('Invalid JSON response')\n ) {\n return {\n code: 'SERVER_ERROR',\n message: fallbackMessage,\n };\n }\n }\n\n // Network or timeout error\n return createNetworkError();\n}\n","import type { UnlockCredential, UnlockCredentialRequest } from '../types/wallet';\n\n/**\n * Convert UnlockCredential to API request format.\n */\nexport function toCredentialRequest(credential: UnlockCredential): UnlockCredentialRequest {\n switch (credential.type) {\n case 'password':\n return { password: credential.password };\n case 'prfOutput':\n return { prfOutput: credential.prfOutput };\n }\n}\n","/**\n * Hook for wallet material API operations\n *\n * Handles communication with the server for wallet enrollment,\n * material retrieval, transaction signing, and credential rotation.\n *\n * Safe to call outside CedrosLoginProvider (returns no-op functions).\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { ApiClient, handleApiError } from '../utils/apiClient';\nimport type {\n UseWalletMaterialReturn,\n WalletMaterialResponse,\n WalletEnrollRequest,\n WalletRecoverRequest,\n RotateUserSecretRequest,\n SignTransactionRequest,\n SignTransactionResponse,\n MessageResponse,\n WalletStatusApiResponse,\n UnlockCredential,\n WalletUnlockResponse,\n ShareCRecoveryRequest,\n ShareCRecoveryResponse,\n} from '../types/wallet';\nimport { toCredentialRequest } from '../utils/unlockCredential';\n\n/**\n * Hook for wallet material API operations\n *\n * Signing happens server-side: server stores Share A (encrypted) and Share B\n * (plaintext), combines shares JIT for signing, and wipes immediately after.\n *\n * Safe to call outside CedrosLoginProvider - returns no-op functions that throw.\n */\nexport function useWalletMaterial(): UseWalletMaterialReturn {\n const context = useCedrosLoginOptional();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const apiClient = useMemo(() => {\n if (!context) return null;\n return new ApiClient({\n baseUrl: context.config.serverUrl,\n timeoutMs: context.config.requestTimeout,\n retryAttempts: context.config.retryAttempts,\n getAccessToken: context._internal?.getAccessToken,\n });\n }, [context]);\n\n const getStatus = useCallback(async (): Promise<WalletStatusApiResponse> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<WalletStatusApiResponse>('/wallet/status');\n return data;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to fetch wallet status');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getMaterial = useCallback(async (): Promise<WalletMaterialResponse | null> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await apiClient.get<WalletMaterialResponse>('/wallet/material');\n return data;\n } catch (err) {\n // 404 means no wallet enrolled - not an error\n const apiError = handleApiError(err, 'Failed to fetch wallet material');\n if (apiError.code === 'NOT_FOUND') {\n return null;\n }\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const enroll = useCallback(\n async (request: WalletEnrollRequest): Promise<void> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.post<MessageResponse>('/wallet/enroll', request);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to enroll wallet');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const recover = useCallback(\n async (request: WalletRecoverRequest): Promise<void> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.post<MessageResponse>('/wallet/recover', request);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to recover wallet');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const signTransaction = useCallback(\n async (request: SignTransactionRequest): Promise<SignTransactionResponse> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.post<SignTransactionResponse>('/wallet/sign', request);\n return response;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to sign transaction');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const rotateUserSecret = useCallback(\n async (request: RotateUserSecretRequest): Promise<void> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.post<MessageResponse>('/wallet/rotate-user-secret', request);\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to rotate user secret');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const unlock = useCallback(\n async (credential: UnlockCredential): Promise<WalletUnlockResponse> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.post<WalletUnlockResponse>(\n '/wallet/unlock',\n toCredentialRequest(credential)\n );\n return response;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to unlock wallet');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const lock = useCallback(async (): Promise<void> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n await apiClient.post<MessageResponse>('/wallet/lock', {});\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to lock wallet');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n }, [apiClient]);\n\n const getShareBForRecovery = useCallback(\n async (request: ShareCRecoveryRequest): Promise<ShareCRecoveryResponse> => {\n if (!apiClient) {\n throw new Error('useWalletMaterial must be used within a CedrosLoginProvider');\n }\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.post<ShareCRecoveryResponse>('/wallet/share-b', request);\n return response;\n } catch (err) {\n const apiError = handleApiError(err, 'Failed to get Share B for recovery');\n setError(apiError.message);\n throw apiError;\n } finally {\n setIsLoading(false);\n }\n },\n [apiClient]\n );\n\n const clearError = useCallback(() => setError(null), []);\n\n return {\n getStatus,\n getMaterial,\n enroll,\n recover,\n signTransaction,\n rotateUserSecret,\n unlock,\n lock,\n getShareBForRecovery,\n isLoading,\n error,\n clearError,\n };\n}\n","/**\n * Main wallet hook - orchestrates wallet status and capabilities\n *\n * This is the primary entry point for wallet functionality.\n * It checks capabilities, fetches wallet status, and provides\n * the current state to child components.\n *\n * Handles two wallet types:\n * - External Solana wallet (user signed in with wallet adapter)\n * - SSS embedded wallet (server-side signing with Shamir shares)\n *\n * Safe to call outside CedrosLoginProvider (returns defaults).\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { getCryptoCapabilities } from '../crypto';\nimport { useCedrosLoginOptional } from '../context/useCedrosLogin';\nimport { useWalletMaterial } from './useWalletMaterial';\nimport type {\n WalletContextValue,\n WalletStatus,\n CryptoCapabilities,\n ShareAAuthMethod,\n} from '../types/wallet';\n\n/** Default return value when outside CedrosLoginProvider */\nconst DEFAULT_WALLET_VALUE: WalletContextValue = {\n status: 'not_enrolled',\n solanaPubkey: null,\n authMethod: null,\n hasExternalWallet: false,\n isUnlocked: false,\n capabilities: null,\n isSupported: false,\n error: null,\n refresh: async () => {},\n clearError: () => {},\n};\n\n/**\n * Main wallet hook\n *\n * Provides wallet status, capabilities, and refresh functionality.\n * Distinguishes between external Solana wallet and SSS embedded wallet.\n *\n * Returns safe defaults when called outside CedrosLoginProvider.\n */\nexport function useWallet(): WalletContextValue {\n // Check if we're inside a CedrosLoginProvider\n const context = useCedrosLoginOptional();\n const hasProvider = context !== null;\n\n const [status, setStatus] = useState<WalletStatus>('loading');\n const [solanaPubkey, setSolanaPubkey] = useState<string | null>(null);\n const [authMethod, setAuthMethod] = useState<ShareAAuthMethod | null>(null);\n const [hasExternalWallet, setHasExternalWallet] = useState(false);\n const [isUnlocked, setIsUnlocked] = useState(false);\n const [capabilities, setCapabilities] = useState<CryptoCapabilities | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Always call hooks unconditionally (safe to call outside provider)\n const { getStatus, isLoading } = useWalletMaterial();\n\n // Track if initial fetch has been attempted to prevent infinite retry on error\n const hasAttemptedFetch = useRef(false);\n\n // Check crypto capabilities on mount\n useEffect(() => {\n if (!hasProvider) return;\n\n let cancelled = false;\n\n const checkCapabilities = async () => {\n try {\n const caps = await getCryptoCapabilities();\n if (cancelled) return;\n setCapabilities(caps);\n\n if (!caps.allSupported) {\n setStatus('error');\n setError(\n 'Your browser or device does not support all required features. ' +\n 'Please use a modern browser with a platform authenticator.'\n );\n }\n } catch {\n if (cancelled) return;\n setCapabilities(null);\n setStatus('error');\n setError('Failed to check crypto capabilities');\n }\n };\n\n checkCapabilities();\n\n return () => {\n cancelled = true;\n };\n }, [hasProvider]);\n\n // Fetch wallet status\n const refresh = useCallback(async () => {\n if (!hasProvider || !capabilities?.allSupported) {\n return;\n }\n\n setStatus('loading');\n setError(null);\n\n try {\n const walletStatus = await getStatus();\n\n setSolanaPubkey(walletStatus.solanaPubkey ?? null);\n setAuthMethod(walletStatus.authMethod ?? null);\n setHasExternalWallet(walletStatus.hasExternalWallet);\n setIsUnlocked(walletStatus.unlocked);\n\n if (walletStatus.hasExternalWallet) {\n // User has external wallet - always \"enrolled\" from their perspective\n setStatus('enrolled_unlocked');\n } else if (walletStatus.enrolled) {\n // SSS wallet enrolled\n setStatus(walletStatus.unlocked ? 'enrolled_unlocked' : 'enrolled_locked');\n } else {\n setStatus('not_enrolled');\n }\n } catch (err) {\n setStatus('error');\n setError(err instanceof Error ? err.message : 'Failed to fetch wallet status');\n }\n }, [hasProvider, capabilities?.allSupported, getStatus]);\n\n // Refresh on mount and when capabilities become available\n // Only attempt once to prevent infinite retry loop on API errors\n useEffect(() => {\n if (hasProvider && capabilities?.allSupported && !isLoading && !hasAttemptedFetch.current) {\n hasAttemptedFetch.current = true;\n void refresh();\n }\n }, [hasProvider, capabilities?.allSupported, isLoading, refresh]);\n\n const clearError = useCallback(() => setError(null), []);\n\n // Return defaults when outside provider\n if (!hasProvider) {\n return DEFAULT_WALLET_VALUE;\n }\n\n return {\n status,\n solanaPubkey,\n authMethod,\n hasExternalWallet,\n isUnlocked,\n capabilities,\n isSupported: capabilities?.allSupported ?? false,\n error,\n refresh,\n clearError,\n };\n}\n","/**\n * Embedded wallet detection utilities\n *\n * Allows other Cedros modules (like cedros-pay) to detect if an embedded\n * wallet is available in the current application.\n *\n * @security The window global only exposes availability info, NOT the signing\n * function. Signing must go through React context to prevent unauthorized access.\n */\n\n/** Window global name for embedded wallet detection */\nconst GLOBAL_KEY = '__CEDROS_EMBEDDED_WALLET__';\n\n/**\n * Embedded wallet info exposed via window global\n */\nexport interface EmbeddedWalletInfo {\n /** Whether user has enrolled SSS embedded wallet */\n available: boolean;\n /** Solana public key (base58) if available */\n publicKey: string | null;\n}\n\n// Extend Window type for TypeScript\ndeclare global {\n interface Window {\n [GLOBAL_KEY]?: EmbeddedWalletInfo;\n }\n}\n\n/**\n * Set embedded wallet availability on window global\n *\n * Called by CedrosLoginProvider when wallet.exposeAvailability is true.\n *\n * @internal\n */\nexport function setEmbeddedWalletGlobal(info: EmbeddedWalletInfo): void {\n if (typeof window !== 'undefined') {\n window[GLOBAL_KEY] = info;\n }\n}\n\n/**\n * Clear embedded wallet availability from window global\n *\n * Called when user logs out or config changes.\n *\n * @internal\n */\nexport function clearEmbeddedWalletGlobal(): void {\n if (typeof window !== 'undefined') {\n delete window[GLOBAL_KEY];\n }\n}\n\n/**\n * Check if embedded wallet is available\n *\n * Use this in other Cedros modules (like cedros-pay) to detect\n * if an embedded wallet is available for signing.\n *\n * @example\n * ```tsx\n * import { isEmbeddedWalletAvailable, getEmbeddedWalletInfo } from '@cedros/login-react';\n *\n * // Simple check\n * if (isEmbeddedWalletAvailable()) {\n * // Show \"Pay with Crypto\" button\n * }\n *\n * // Get full info\n * const walletInfo = getEmbeddedWalletInfo();\n * if (walletInfo?.available && walletInfo.publicKey) {\n * console.log('User wallet:', walletInfo.publicKey);\n * }\n * ```\n *\n * @returns true if embedded wallet is enrolled and available\n */\nexport function isEmbeddedWalletAvailable(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n return window[GLOBAL_KEY]?.available ?? false;\n}\n\n/**\n * Get embedded wallet info\n *\n * Returns the full wallet info object if available.\n *\n * @returns Wallet info or null if not exposed\n */\nexport function getEmbeddedWalletInfo(): EmbeddedWalletInfo | null {\n if (typeof window === 'undefined') {\n return null;\n }\n return window[GLOBAL_KEY] ?? null;\n}\n","/**\n * Internal component that exposes embedded wallet availability\n *\n * This component must be rendered inside CedrosLoginProvider since\n * it uses hooks that depend on the login context.\n *\n * @internal\n */\n\nimport { useEffect } from 'react';\nimport { useCedrosLogin } from './useCedrosLogin';\nimport { useWallet } from '../hooks/useWallet';\nimport { setEmbeddedWalletGlobal, clearEmbeddedWalletGlobal } from '../utils/embeddedWallet';\n\n/**\n * Exposes embedded wallet availability via window global when enabled\n *\n * Only exposes info when:\n * 1. config.wallet.exposeAvailability is true\n * 2. User is logged in\n * 3. Wallet status is known\n *\n * @internal\n */\nexport function EmbeddedWalletExposure(): null {\n const { config, user } = useCedrosLogin();\n const { status, solanaPubkey, hasExternalWallet } = useWallet();\n\n const exposeAvailability = config.wallet?.exposeAvailability ?? false;\n const exposePublicKey = config.wallet?.exposePublicKey ?? false;\n\n useEffect(() => {\n // Don't expose if disabled or user not logged in\n if (!exposeAvailability || !user) {\n clearEmbeddedWalletGlobal();\n return;\n }\n\n // Don't expose for external wallet users (they use their own wallet)\n if (hasExternalWallet) {\n clearEmbeddedWalletGlobal();\n return;\n }\n\n // Wait for wallet status to be determined\n if (status === 'loading') {\n return;\n }\n\n // Check if SSS wallet is enrolled\n const isEnrolled = status === 'enrolled_locked' || status === 'enrolled_unlocked';\n\n setEmbeddedWalletGlobal({\n available: isEnrolled,\n publicKey: exposePublicKey && isEnrolled ? solanaPubkey : null,\n });\n\n // Cleanup on unmount or when dependencies change\n return () => {\n clearEmbeddedWalletGlobal();\n };\n }, [exposeAvailability, exposePublicKey, user, status, solanaPubkey, hasExternalWallet]);\n\n return null;\n}\n","import { useState, useCallback, useMemo, type ReactNode } from 'react';\nimport type { CedrosLoginConfig, AuthError } from '../types';\nimport { CedrosLoginContext, type CedrosLoginContextValue } from './CedrosLoginContext';\nimport { useThemeManager } from '../hooks/useThemeManager';\nimport { useAuthSession } from '../hooks/useAuthSession';\nimport { EmbeddedWalletExposure } from './EmbeddedWalletExposure';\n\nexport interface CedrosLoginProviderProps {\n config: CedrosLoginConfig;\n children: ReactNode;\n}\n\n/**\n * Provider component that wraps your app and provides authentication context.\n *\n * @example\n * ```tsx\n * <CedrosLoginProvider config={{ serverUrl: 'https://api.example.com' }}>\n * <App />\n * </CedrosLoginProvider>\n * ```\n */\nexport function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps) {\n const [error, setError] = useState<AuthError | null>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n // P-05: Memoize config with JSON.stringify for nested objects to prevent\n // re-renders when parent recreates objects with identical content.\n // PERF-02: Memoize the stringification itself so local provider state changes\n // (e.g. error/modal state) don't repeatedly serialize large objects.\n const themeOverridesKey = useMemo(\n () => JSON.stringify(config.themeOverrides ?? null),\n [config.themeOverrides]\n );\n const sessionKey = useMemo(() => JSON.stringify(config.session ?? null), [config.session]);\n const featuresKey = useMemo(() => JSON.stringify(config.features ?? null), [config.features]);\n const formsKey = useMemo(() => JSON.stringify(config.forms ?? null), [config.forms]);\n // Note: callbacks can't be serialized, but they shouldn't change frequently\n const memoizedConfig = useMemo(\n () => config,\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Using serialized keys for deep comparison\n [\n config.serverUrl,\n config.googleClientId,\n config.requestTimeout,\n config.retryAttempts,\n config.theme,\n themeOverridesKey,\n sessionKey,\n featuresKey,\n formsKey,\n config.callbacks,\n ]\n );\n\n // Apply theme\n useThemeManager({\n theme: memoizedConfig.theme,\n themeOverrides: memoizedConfig.themeOverrides,\n });\n\n // Manage auth session\n const {\n user,\n authState,\n handleLoginSuccess,\n logout: sessionLogout,\n refreshUser,\n getAccessToken,\n } = useAuthSession({\n serverUrl: memoizedConfig.serverUrl,\n session: memoizedConfig.session,\n callbacks: memoizedConfig.callbacks,\n requestTimeoutMs: memoizedConfig.requestTimeout,\n });\n\n // Wrap logout to also clear error\n const logout = useCallback(async () => {\n setError(null);\n await sessionLogout();\n }, [sessionLogout]);\n\n // Wrap login success to also clear error\n const wrappedHandleLoginSuccess = useCallback(\n (...args: Parameters<typeof handleLoginSuccess>) => {\n setError(null);\n handleLoginSuccess(...args);\n },\n [handleLoginSuccess]\n );\n\n const openModal = useCallback(() => setIsModalOpen(true), []);\n const closeModal = useCallback(() => setIsModalOpen(false), []);\n\n const value: CedrosLoginContextValue = useMemo(\n () => ({\n config: memoizedConfig,\n user,\n authState,\n error,\n logout,\n refreshUser,\n isModalOpen,\n openModal,\n closeModal,\n _internal: {\n handleLoginSuccess: wrappedHandleLoginSuccess,\n getAccessToken,\n },\n }),\n [\n memoizedConfig,\n user,\n authState,\n error,\n logout,\n refreshUser,\n isModalOpen,\n openModal,\n closeModal,\n wrappedHandleLoginSuccess,\n getAccessToken,\n ]\n );\n\n return (\n <CedrosLoginContext.Provider value={value}>\n <EmbeddedWalletExposure />\n {children}\n </CedrosLoginContext.Provider>\n );\n}\n","import { useCedrosLogin } from '../context/useCedrosLogin';\nimport type { AuthUser, AuthState, AuthError } from '../types';\n\nexport interface UseAuthReturn {\n user: AuthUser | null;\n authState: AuthState;\n error: AuthError | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n logout: () => Promise<void>;\n refreshUser: () => Promise<void>;\n openLoginModal: () => void;\n closeLoginModal: () => void;\n}\n\n/**\n * Main authentication hook providing user state and actions.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { user, isAuthenticated, logout, openLoginModal } = useAuth();\n *\n * if (!isAuthenticated) {\n * return <button onClick={openLoginModal}>Login</button>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user?.name}</p>\n * <button onClick={logout}>Logout</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { user, authState, error, logout, refreshUser, openModal, closeModal } = useCedrosLogin();\n\n return {\n user,\n authState,\n error,\n isAuthenticated: authState === 'authenticated' && user !== null,\n isLoading: authState === 'loading',\n logout,\n refreshUser,\n openLoginModal: openModal,\n closeLoginModal: closeModal,\n };\n}\n","import { memo, type CSSProperties } from 'react';\n\nexport interface LoadingSpinnerProps {\n size?: 'sm' | 'md' | 'lg' | 'xl';\n className?: string;\n style?: CSSProperties;\n /** Custom label for screen readers (default: \"Loading\") */\n label?: string;\n /** If true, announce the loading state to screen readers */\n announce?: boolean;\n}\n\nconst sizeMap = {\n sm: 16,\n md: 24,\n lg: 32,\n xl: 48, // H-04: Added for WalletUnlock component\n};\n\n/**\n * Accessible loading spinner component.\n * Announces loading state to screen readers when announce prop is true.\n * Wrapped with React.memo to prevent unnecessary re-renders.\n */\nexport const LoadingSpinner = memo(function LoadingSpinner({\n size = 'md',\n className = '',\n style,\n label = 'Loading',\n announce = false,\n}: LoadingSpinnerProps) {\n const dimension = sizeMap[size];\n\n const spinner = (\n <svg\n className={`cedros-spinner ${className}`}\n width={dimension}\n height={dimension}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n aria-label={label}\n role=\"status\"\n aria-hidden={announce ? 'true' : undefined}\n >\n <circle\n className=\"cedros-spinner-track\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeOpacity=\"0.25\"\n />\n <circle\n className=\"cedros-spinner-head\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeDasharray=\"31.4 31.4\"\n transform=\"rotate(-90 12 12)\"\n >\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 12 12\"\n to=\"360 12 12\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n );\n\n // Wrap in aria-live region if announce is true\n if (announce) {\n return (\n <span aria-live=\"polite\" aria-busy=\"true\">\n {spinner}\n <span className=\"cedros-sr-only\">{label}</span>\n </span>\n );\n }\n\n return spinner;\n});\n","import { memo, useRef, useEffect } from 'react';\nimport type { DisplayError } from '../../types';\n\nexport interface ErrorMessageProps {\n error: DisplayError;\n className?: string;\n onDismiss?: () => void;\n /** If true, focus the error message when it appears (for accessibility) */\n autoFocus?: boolean;\n}\n\n/**\n * Error message display component with accessibility support.\n * Announces errors to screen readers and optionally focuses the message.\n * Wrapped with React.memo to prevent unnecessary re-renders.\n */\nexport const ErrorMessage = memo(function ErrorMessage({\n error,\n className = '',\n onDismiss,\n autoFocus = false,\n}: ErrorMessageProps) {\n const errorRef = useRef<HTMLDivElement>(null);\n\n // Focus the error message when it appears (for accessibility)\n useEffect(() => {\n if (error && autoFocus && errorRef.current) {\n errorRef.current.focus();\n }\n }, [error, autoFocus]);\n\n if (!error) return null;\n\n const message = typeof error === 'string' ? error : error.message;\n\n return (\n <div\n ref={errorRef}\n className={`cedros-error ${className}`}\n role=\"alert\"\n aria-live=\"assertive\"\n tabIndex={autoFocus ? -1 : undefined}\n >\n <svg\n className=\"cedros-error-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 4.5v4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span className=\"cedros-error-message\">{message}</span>\n {onDismiss && (\n <button\n type=\"button\"\n className=\"cedros-error-dismiss\"\n onClick={onDismiss}\n aria-label=\"Dismiss error\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10.5 3.5L3.5 10.5M3.5 3.5l7 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n});\n"],"names":["CedrosLoginContext","createContext","useThemeManager","theme","themeOverrides","useEffect","root","addedDarkClass","appliedOverrides","key","value","previousValue","DEFAULT_STORAGE_KEY","REFRESH_BUFFER_MS","TokenManager","storage","persistKey","options","suffix","callback","tokens","token","timeUntilExpiry","refreshIn","err","error","data","parsed","obj","CHANNEL_NAME","TabSync","event","user","MIN_CSRF_TOKEN_LENGTH","getCsrfToken","metaTag","content","cookies","cookie","name","rest","nameLower","decoded","isValidUserResponse","isValidTokenResponse","useAuthSession","serverUrl","session","callbacks","requestTimeoutMs","setUser","useState","authState","setAuthState","tokenManagerRef","useRef","tabSyncRef","callbacksRef","isMountedRef","refreshInFlightRef","setUserIfMounted","useCallback","nextUser","setAuthStateIfMounted","nextState","sessionConfig","useMemo","refreshTokens","refreshToken","hasRefreshToken","csrfToken","headers","refreshPromise","controller","timeoutMs","timeoutId","response","getAuthHeaders","accessToken","handleSessionExpired","refreshUser","retryResponse","handleLoginSuccess","authUser","logout","getAccessToken","useCedrosLogin","context","useContext","useCedrosLoginOptional","DEFAULT_KDF_PARAMS","isSeed","isShamirShare","firstByte","isEncryptionKey","isAesNonce","isArgon2Salt","isPrfSalt","toSeed","toShamirShare","toEncryptionKey","toAesNonce","toArgon2Salt","toPrfSalt","toBufferSource","getRandomBytes","length","bytes","generateSeed","generateNonce","generateArgon2Salt","generatePrfSalt","wipeBytes","i","wipeAll","arrays","arr","importAesKey","keyBytes","aesGcmEncrypt","plaintext","nonce","iv","cryptoKey","ciphertext","aesGcmEncryptToBase64","result","uint8ArrayToBase64","parts","chunk","base64ToUint8Array","base64","binary","hkdfDerive","inputKeyMaterial","salt","info","outputLength","baseKey","infoBytes","derivedBits","deriveKeyFromPrf","prfOutput","prfSalt","derived","isHkdfSupported","testKey","__awaiter","thisArg","_arguments","P","generator","adopt","resolve","reject","fulfilled","step","e","rejected","Mutex","begin","res","fn","unlock","_a","getGlobal","globalObject","nodeBuffer","textEncoder","hexCharCodesToInt","a","b","writeHexToUInt8","buf","str","size","index","hexStringEqualsUInt8","strIndex","alpha","digit","getDigestHex","tmpBuffer","input","hashLength","p","nibble","getUInt8Buffer","base64Chars","base64Lookup","encodeBase64","pad","len","extraBytes","len2","tmp","triplet","c","getDecodeBase64Length","bufferLength","decodeBase64","encoded1","encoded2","encoded3","encoded4","MAX_HEAP","WASM_FUNC_HASH_LENGTH","wasmMutex","wasmModuleCache","WASMInterface","wasmInstance","memoryView","initialized","writeMemory","offset","getMemory","getExports","setMemorySize","totalSize","arrayOffset","memoryBuffer","getStateSize","loadWASMPromise","asm","promise","module","setupInterface","init","bits","updateUInt8Array","read","update","Uint8Buffer","digestChars","digest","outputType","padding","save","stateOffset","stateLength","internalState","prefixedState","load","state","overallLength","isDataShort","canSimplify","initParam","calculate","digestParam","buffer","name$k","data$k","hash$k","wasmJson$k","name$j","data$j","hash$j","wasmJson$j","validateBits$4","getInitParam$1","outputBits","keyBits","createBLAKE2b","keyBuffer","outputSize","wasm","encodeResult","parameters","uint32View","int32LE","x","hashFunc","blake512","blake","ret","vp","partialBytesNeeded","blakeSmall","getHashType","type","argon2Internal","parallelism","iterations","password","version","hashType","memorySize","secret","argon2Interface","initVector","initVectorView","lanes","param","H0","lane","position","C","validateOptions$3","argon2id","OUTPUT_LENGTH","argon2Derive","params","validateKdfParams","hash","isArgon2Supported","testResult","isDevelopmentDomain","hostname","validateRpDomain","allowedDomains","isWebAuthnAvailable","isPrfSupported","caps","registerPasskeyWithPrf","userId","userName","displayName","credential","extensionResults","prfResult","authenticateWithDiscoverablePrf","prfSaltBytes","assertion","checkCryptoCapabilities","webCrypto","aesGcm","hkdf","ed25519","webAuthn","webAuthnPrf","argon2","checkWebCrypto","checkAesGcm","checkEd25519","testData","encrypted","decrypted","decryptedArr","getMissingCapabilitiesMessage","capabilities","missing","getBrowserSupportInfo","ua","chromeMatch","safariMatch","firefoxMatch","edgeMatch","cachedCapabilities","getCryptoCapabilities","forceRefresh","DEFAULT_TIMEOUT_MS","DEFAULT_RETRY_ATTEMPTS","createAuthError","fallbackMessage","createNetworkError","fetchWithTimeout","url","isRetryableError","delay","ms","ApiClient","config","method","path","body","credentials","skipRetry","validator","maxAttempts","lastError","attempt","contentType","parseError","text","truncated","validationError","isApiErrorResponse","isAuthError","handleApiError","toCredentialRequest","useWalletMaterial","isLoading","setIsLoading","setError","apiClient","getStatus","apiError","getMaterial","enroll","request","recover","signTransaction","rotateUserSecret","lock","getShareBForRecovery","clearError","DEFAULT_WALLET_VALUE","useWallet","hasProvider","status","setStatus","solanaPubkey","setSolanaPubkey","authMethod","setAuthMethod","hasExternalWallet","setHasExternalWallet","isUnlocked","setIsUnlocked","setCapabilities","hasAttemptedFetch","cancelled","refresh","walletStatus","GLOBAL_KEY","setEmbeddedWalletGlobal","clearEmbeddedWalletGlobal","isEmbeddedWalletAvailable","getEmbeddedWalletInfo","EmbeddedWalletExposure","exposeAvailability","exposePublicKey","isEnrolled","CedrosLoginProvider","children","isModalOpen","setIsModalOpen","themeOverridesKey","sessionKey","featuresKey","formsKey","memoizedConfig","sessionLogout","wrappedHandleLoginSuccess","args","openModal","closeModal","jsxs","jsx","useAuth","sizeMap","LoadingSpinner","memo","className","style","label","announce","dimension","spinner","ErrorMessage","onDismiss","autoFocus","errorRef","message"],"mappings":"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","x_google_ignoreList":[12]}
|