@wireio/stake 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/stake.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stake.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/clients/token.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/utils.ts","../src/networks/ethereum/clients/deposit.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/clients/pretoken.client.ts","../src/networks/ethereum/clients/liq.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from \"../../assets/solana/idl/liqsol_core.json\";\nimport liqSolTokenIDL from \"../../assets/solana/idl/liqsol_token.json\";\nimport validatorLeaderboardIDL from \"../../assets/solana/idl/validator_leaderboard.json\";\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\n// Extract program IDs from IDL files\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n} as const;\n\n// Export individual program IDs for convenience\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n *\n * These strings are baked into the on-chain programs and are already used in\n * your test utils. We centralize them here so all clients share them.\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout_state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n USER_RECORD: 'user_record',\n\n // pay-rate history\n PAY_RATE_HISTORY: 'pay_rate_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost\n WARRANT_DEPOSIT_GLOBAL: 'warrant_deposit_global',\n LIQSOL_POOL: 'liqsol_pool',\n WARRANT_DEPOSIT_RECORD: 'warrant_deposit_record',\n WIRE_SOL_BUCKET: 'wire_sol_bucket',\n TRANCHE_STATE: 'tranche_state',\n USER_WARRANT_RECORD: 'user_warrant_record',\n\n // BAR\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n\n // Other?\n PRICE_HISTORY: 'price_history',\n} as const;\n\n/**\n * Helpers for PDA derivation so clients don’t duplicate logic.\n */\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n PROGRAM_IDS.VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n PROGRAM_IDS.LIQSOL_CORE,\n )[0];\n\n/**\n * OUTPOST \n */\nexport const deriveOutpostGlobalStatePda = () => \n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WARRANT_DEPOSIT_GLOBAL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostPoolAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWireReceiptPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WARRANT_DEPOSIT_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePoolUserRecordPda = (poolAuthority: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), poolAuthority.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveSolBucketPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WIRE_SOL_BUCKET)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveTrancheStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserWarrantRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_WARRANT_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBarConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondLevelPda = (bondLevelId: number[]) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondedActorPda = (actor: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePriceHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: any,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return await PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys\n */\n\nexport const CHAINLINK_FEED = new PublicKey(\"99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR\");\nexport const CHAINLINK_PROGRAM = new PublicKey(\"HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny\");\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\n// Mirrors EPHEMERAL_RENT_EXEMPTION = 2_282_880 used in tests\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));\n","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayoutStatePda,\n deriveEphemeralStakeAddress,\n} from '../constants';\nimport { WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike { return this.provider.wallet; }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n async buildDepositTx(amount: bigint, user = this.wallet.publicKey): Promise<Transaction> {\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(user);\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID\n );\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .deposit(new BN(amount.toString()), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport {\n ParsedAccountData,\n PublicKey,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n Transaction,\n SystemProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n derivePayRateHistoryPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { CorrectRegisterBuildResult, DistributionState, MismatchCandidate, ParsedAccountInfo, UserRecord } from '../types';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program. Responsible for:\n * - Reading DistributionState + UserRecord\n * - Computing mismatch candidates (tracked > actual)\n * - Building a \"correct then register\" transaction for the caller\n *\n * Aligned with the on-chain `update_user` script:\n * - Single `updateUser()` entrypoint that:\n * * Can create userRecord if missing\n * * Reconciles tracked vs actual using user, userAta, bucket, pay-rate\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() { return this.provider.connection; }\n\n /**\n * Fetch the global distribution state account.\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n // IDL account name: \"distributionState\"\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n */\n async getUserRecord(user: PublicKey): Promise<UserRecord | null> {\n const pda = deriveUserRecordPda(user);\n try {\n return await this.program.account.userRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Helper: get actual liqSOL balances for all token holders.\n *\n * Returns a map: owner (base58) -> actual balance (BigInt)\n */\n private async getActualBalancesByOwner(): Promise<Map<string, bigint>> {\n const liqsolMint = deriveLiqsolMintPda();\n const mintStr = liqsolMint.toBase58();\n\n const accounts = await this.connection.getParsedProgramAccounts(\n TOKEN_2022_PROGRAM_ID,\n {\n filters: [\n // SPL token layout: mint at offset 0\n { memcmp: { offset: 0, bytes: mintStr } },\n ],\n commitment: 'confirmed',\n },\n );\n\n const byOwner = new Map<string, bigint>();\n\n for (const acct of accounts) {\n const data = acct.account.data as ParsedAccountData;\n const parsed = data.parsed;\n if (!parsed || parsed.type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const amountStr = info.tokenAmount.amount;\n const amount = BigInt(amountStr);\n\n const prev = byOwner.get(ownerStr) ?? BigInt(0);\n byOwner.set(ownerStr, prev + amount);\n }\n\n return byOwner;\n }\n\n /**\n * Helper: get tracked balances from all userRecord accounts,\n * keyed by *actual wallet owner*, not the userRecord PDA.\n *\n * userRecord struct:\n * - userAta: pubkey\n * - trackedBalance: u64\n * - claimBalance: u64\n * - lastClaimTimestamp: i64\n * - bump: u8\n */\n private async getTrackedBalances(): Promise<\n Map<string, { owner: PublicKey; tracked: bigint }>\n > {\n const records = await this.program.account.userRecord.all();\n const map = new Map<string, { owner: PublicKey; tracked: bigint }>();\n\n for (const r of records) {\n const ur = r.account as UserRecord;\n const userAta = ur.userAta as PublicKey;\n\n // Resolve the *wallet* that owns this ATA\n const ataInfo = await this.connection.getParsedAccountInfo(userAta);\n const parsedData = ataInfo.value?.data as ParsedAccountData | undefined;\n if (!parsedData) continue;\n\n const parsed = parsedData.parsed;\n if (!parsed || (parsed as any).type !== 'account') continue;\n\n const info: ParsedAccountInfo = parsed.info;\n const ownerStr = info.owner;\n const owner = new PublicKey(ownerStr);\n\n const tracked = BigInt(ur.trackedBalance.toString());\n map.set(ownerStr, { owner, tracked });\n }\n\n return map;\n }\n\n /**\n * Discover all mismatch candidates where tracked > actual.\n *\n * - actual balances are derived from token accounts for the liqSOL mint\n * - tracked balances come from Distribution.userRecord\n */\n private async deriveMismatchCandidates(): Promise<MismatchCandidate[]> {\n const [actualByOwner, trackedByOwner] = await Promise.all([\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n const out: MismatchCandidate[] = [];\n\n for (const [ownerStr, { owner, tracked }] of trackedByOwner.entries()) {\n const actual = actualByOwner.get(ownerStr) ?? BigInt(0);\n const delta = tracked - actual;\n if (delta > BigInt(0)) {\n out.push({ owner, actual, tracked, delta });\n }\n }\n\n // Largest discrepancy first\n out.sort((a, b) => (b.delta > a.delta ? 1 : b.delta < a.delta ? -1 : 0));\n return out;\n }\n\n /**\n * Canonical helper to build an `updateUser` instruction for a given user,\n * matching the standalone update-user.ts script.\n */\n private async buildUpdateUserIx(targetUser: PublicKey) {\n const walletPk = this.provider.wallet.publicKey;\n\n const distributionStatePDA = deriveDistributionStatePda();\n const userRecordPDA = deriveUserRecordPda(targetUser);\n const liqsolMintPDA = deriveLiqsolMintPda();\n const payRateHistoryPDA = derivePayRateHistoryPda();\n const bucketAuthorityPDA = deriveBucketAuthorityPda();\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMintPDA,\n targetUser,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMintPDA,\n bucketAuthorityPDA,\n true, // allowOwnerOffCurve\n TOKEN_2022_PROGRAM_ID,\n );\n\n return (this.program.methods as any)\n .updateUser()\n .accounts({\n user: targetUser,\n userAta,\n userRecord: userRecordPDA,\n authority: walletPk,\n payer: walletPk,\n distributionState: distributionStatePDA,\n liqsolMint: liqsolMintPDA,\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n bucketAuthority: bucketAuthorityPDA,\n bucketTokenAccount,\n payRateHistory: payRateHistoryPDA,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the \"correct & register\" transaction.\n *\n * - Fetches DistributionState + all userRecords + token holders\n * - Computes caller's untracked amount (actual - tracked)\n * - If DistributionState.availableBalance already covers that, we only\n * send updateUser(caller).\n * - Otherwise we select top mismatch candidates until their freed deltas\n * cover the shortfall, then build updateUser(target) for each,\n * followed by updateUser(caller).\n *\n * NOTE:\n * - This no longer uses a separate updateSpecificUser; the single\n * updateUser entrypoint accepts any `user` as long as authority/payer\n * are valid, per your script.\n */\n async buildCorrectRegisterTx(opts: {\n amount?: bigint;\n maxCandidates?: number;\n } = {}): Promise<CorrectRegisterBuildResult> {\n const walletPk = this.provider.wallet.publicKey;\n const callerStr = walletPk.toBase58();\n\n const [distState, actualByOwner, trackedByOwner] = await Promise.all([\n this.getDistributionState(),\n this.getActualBalancesByOwner(),\n this.getTrackedBalances(),\n ]);\n\n if (!distState) {\n return {\n needToRegister: false,\n canSucceed: false,\n reason: 'DistributionState not initialized',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n const availableBalance = BigInt(distState.availableBalance.toString());\n\n const trackedEntry =\n trackedByOwner.get(callerStr) ?? {\n owner: walletPk,\n tracked: BigInt(0),\n };\n\n const actual = actualByOwner.get(callerStr) ?? BigInt(0);\n const tracked = trackedEntry.tracked;\n const untracked = actual - tracked;\n\n // Nothing to register\n if (untracked <= BigInt(0)) {\n return {\n needToRegister: false,\n canSucceed: true,\n reason: 'No untracked liqSOL to register',\n transaction: undefined,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Optional user-specified cap on how much to register.\n const targetRegister =\n opts.amount && opts.amount > BigInt(0) ? opts.amount : untracked;\n\n // Simple case: availableBalance already covers what we want to register\n if (availableBalance >= targetRegister) {\n const tx = new Transaction();\n const ix = await this.buildUpdateUserIx(walletPk); // caller only\n tx.add(ix);\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit: BigInt(0), willFree: BigInt(0), selected: [] },\n };\n }\n\n // Need to free up more availableBalance by correcting others.\n const deficit = targetRegister - availableBalance;\n\n const allCandidates = await this.deriveMismatchCandidates();\n const maxCandidates = opts.maxCandidates ?? 10;\n\n const selected: MismatchCandidate[] = [];\n let willFree = BigInt(0);\n\n for (const c of allCandidates) {\n if (c.owner.equals(walletPk)) continue; // don't self-correct here\n selected.push(c);\n willFree += c.delta;\n if (willFree >= deficit || selected.length >= maxCandidates) break;\n }\n\n if (willFree < deficit) {\n return {\n needToRegister: true,\n canSucceed: false,\n reason: 'Not enough mismatched candidates to cover deficit',\n transaction: undefined,\n plan: { deficit, willFree, selected },\n };\n }\n\n const tx = new Transaction();\n\n // 1) Correct selected mismatched users.\n for (const c of selected) {\n const ix = await this.buildUpdateUserIx(c.owner);\n tx.add(ix);\n }\n\n // 2) Register caller (updateUser(caller)).\n {\n const ix = await this.buildUpdateUserIx(walletPk);\n tx.add(ix);\n }\n\n return {\n needToRegister: true,\n canSucceed: true,\n transaction: tx,\n plan: { deficit, willFree, selected },\n };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<any | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<any | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and sort top validators by score.\n * Assumes `validatorRecord` has a numeric `score` field in the IDL.\n */\n async getTopValidators(limit = 20): Promise<any[]> {\n const records = await (this.program.account as any).validatorRecord.all();\n const sorted = (records as Array<{ publicKey: PublicKey; account: any }>).sort(\n (a, b) => {\n const sa = BigInt(a.account.score?.toString?.() ?? '0');\n const sb = BigInt(b.account.score?.toString?.() ?? '0');\n return sb > sa ? 1 : sb < sa ? -1 : 0;\n },\n );\n return sorted.slice(0, limit);\n }\n}","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveSolBucketPda,\n deriveTrancheStatePda,\n deriveWireReceiptPda,\n derivePoolUserRecordPda,\n deriveUserUserRecordPda,\n deriveUserWarrantRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\n\n\n// -----------------------------------------------------------------------------\n// Tranche Support\n// -----------------------------------------------------------------------------\n\n\nconst INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\nconst USD_SCALE = BigInt(100_000_000); // 1e8\nconst BPS = BigInt(10_000);\n\n/** BN | bigint -> bigint helper (keeps code readable) */\nexport function toBigint(x: any): bigint {\n if (typeof x === 'bigint') return x;\n if (typeof x === 'number') return BigInt(x);\n // Anchor BN\n return BigInt(x.toString());\n}\n\n/**\n * Convert token amount -> shares using the same rule as on-chain tests:\n * shares = ceil(amount * INDEX_SCALE / currentIndex)\n */\nexport function tokensToShares(amount: bigint, currentIndex: bigint): bigint {\n if (amount === BigInt(0)) return BigInt(0);\n const num = amount * INDEX_SCALE;\n const q = num / currentIndex;\n const r = num % currentIndex;\n return r === BigInt(0) ? q : q + BigInt(1);\n}\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n * Rules (from liqsol_core tests):\n * - past tranches are fully sold\n * - current tranche has (initial - currentSupply) sold\n * - future tranches start with 0 sold\n * - supply/price grow by supplyGrowthBps/priceGrowthBps per tranche\n */\nexport function buildSolanaTrancheLadder(options: {\n currentTranche: number;\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n totalPretokensSold: bigint; // informational only\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, initialTrancheSupply);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport function buildSolanaTrancheSnapshot(options: {\n chainID: ChainID;\n globalState: GlobalState;\n trancheState: TrancheState;\n solPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): TrancheSnapshot {\n const {\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n } = options;\n\n const currentIndex = toBigint(globalState.currentIndex);\n const totalShares = toBigint(globalState.totalShares);\n\n const currentTranche = trancheState.currentTrancheNumber.toNumber();\n const currentTrancheSupply = toBigint(trancheState.currentTrancheSupply);\n const initialTrancheSupply = toBigint(trancheState.initialTrancheSupply);\n const totalPretokensSold = toBigint(trancheState.totalPretokensSold);\n const currentPriceUsd = toBigint(trancheState.currentTranchePriceUsd);\n\n const supplyGrowthBps = trancheState.supplyGrowthBps;\n const priceGrowthBps = trancheState.priceGrowthBps;\n\n const minPriceUsd = trancheState.minPriceUsd\n ? toBigint(trancheState.minPriceUsd)\n : undefined;\n const maxPriceUsd = trancheState.maxPriceUsd\n ? toBigint(trancheState.maxPriceUsd)\n : undefined;\n\n const ladder = buildSolanaTrancheLadder({\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n totalPretokensSold,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n currentTrancheSupply,\n initialTrancheSupply,\n totalPretokensSold,\n nativePriceUsd: solPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program<LiqsolCore> | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program<LiqsolCore> {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet: any = { publicKey: tmpKeypair.publicKey, signAllTransactions: async () => [], signTransaction: async () => tmpKeypair };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<LiqsolCore>;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const pda = deriveUserRecordPda(user);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program as any;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries: any[] = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Warrant / outpost\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n wireReceipt: PublicKey;\n poolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n distributionState: PublicKey;\n payRateHistory: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n solBucket: PublicKey;\n trancheState: PublicKey;\n userWarrantRecord: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: PublicKey;\n}\n\nexport async function buildOutpostAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<OutpostAccounts> {\n const globalState = deriveOutpostGlobalStatePda();\n const poolAuthority = deriveOutpostPoolAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const distributionState = deriveDistributionStatePda();\n const payRateHistory = derivePayRateHistoryPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const solBucket = deriveSolBucketPda();\n const trancheState = deriveTrancheStatePda();\n const wireReceipt = deriveWireReceiptPda(user);\n const poolUserRecord = derivePoolUserRecordPda(poolAuthority);\n const userUserRecord = deriveUserUserRecordPda(user);\n const userWarrantRecord = deriveUserWarrantRecordPda(user);\n\n const liqsolPoolAta = await getAssociatedTokenAddress(\n liqsolMint,\n poolAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM\n\n try {\n const program = getLiqsolCoreProgram(connection);\n const ts: TrancheState = await program.account.trancheState.fetch(trancheState);\n if (ts.chainlinkFeed && ts.chainlinkProgram) {\n chainLinkFeed = ts.chainlinkFeed as PublicKey;\n chainLinkProgram = ts.chainlinkProgram as PublicKey;\n }\n } catch {\n // If trancheState isn't initialized yet, we fall back to the constants.\n // In that case, pretoken instructions will still fail, which is the correct\n // behavior until admin initializes TrancheState on-chain.\n }\n\n void connection; // reserved for future extra validation\n\n return {\n user,\n globalState,\n poolAuthority,\n liqsolMint,\n liqsolPoolAta,\n userAta,\n wireReceipt,\n poolUserRecord,\n userUserRecord,\n distributionState,\n payRateHistory,\n bucketAuthority,\n bucketTokenAccount,\n solBucket,\n trancheState,\n userWarrantRecord,\n chainLinkFeed,\n chainLinkProgram,\n };\n}\n\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, Number(lamports));\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}\n\n","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n Connection,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n} from '@solana/spl-token';\nimport {\n buildOutpostAccounts,\n getLiqsolCoreProgram,\n getErrorMessage,\n} from '../utils';\nimport { SolanaProgramService } from '../program';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport { WalletLike, OutpostWireStateSnapshot, SharesPreview, UserWarrantRecord, TrancheState, WireReceipt } from '../types';\n\n/**\n * Minimal, user-flow focused OutpostClient.\n * - Read state\n * - Build + (optionally) send user instructions\n *\n * No admin/bootstrap/reset helpers by design.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCore>; \n\n // keep consistent with your tests\n static readonly INDEX_SCALE = new BN('1000000000000');\n\n get connection(): Connection { return this.provider.connection; }\n get wallet(): WalletLike { return this.provider.wallet; }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n /**\n * Read-only Program helper (dummy wallet), useful if you want to do pure reads\n * without requiring a wallet. Kept here as sugar for callers.\n */\n getReadOnlyProgram(): Program<LiqsolCore> {\n return getLiqsolCoreProgram(this.connection);\n }\n\n // ---------------------------------------------------------------------------\n // General-purpose formatting + math (SDK sugar)\n // ---------------------------------------------------------------------------\n\n /**\n * Same rounding logic from your tests: ceil(amount * INDEX_SCALE / currentIndex)\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(OutpostClient.INDEX_SCALE);\n const shares = numerator.div(currentIndex);\n const remainder = numerator.mod(currentIndex);\n return remainder.eqn(0) ? shares : shares.addn(1);\n }\n\n /**\n * UI helper: formats a BN assumed to be scale=1e8 into a decimal string.\n * (Matches your test helper; useful for tranche price, USD price, etc.)\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n\n /**\n * Previews expected shares for a purchase/stake flow that mints shares\n * relative to globalState.currentIndex.\n */\n async previewExpectedShares(params: {\n amountLamports: BN;\n user?: PublicKey; // optional; defaults to wallet.publicKey\n }): Promise<SharesPreview> {\n const user = params.user ?? this.wallet.publicKey;\n const accounts = await buildOutpostAccounts(this.connection, user);\n const globalState = await this.program.account.globalState.fetch(accounts.globalState);\n const currentIndex = new BN(globalState.currentIndex.toString());\n const expectedShares = OutpostClient.tokensToShares(\n params.amountLamports,\n currentIndex,\n );\n\n return {\n amountLamports: params.amountLamports,\n currentIndex,\n indexScale: OutpostClient.INDEX_SCALE,\n expectedShares,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers (user-facing, not admin bootstrap)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns whether the user's liqSOL ATA exists.\n * Useful for UX (show \"Create token account\" prompt).\n */\n async doesUserAtaExist(user: PublicKey = this.wallet.publicKey): Promise<boolean> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n const info = await this.connection.getAccountInfo(accounts.userAta);\n return !!info;\n }\n\n /**\n * Builds an instruction to create the user's liqSOL ATA (Token-2022).\n * This is general-purpose sugar for any flow that needs the ATA.\n */\n async buildCreateUserAtaIx(user: PublicKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n\n return createAssociatedTokenAccountInstruction(\n this.wallet.publicKey, // payer\n accounts.userAta, // ata\n user, // owner\n accounts.liqsolMint, // mint\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n }\n\n /**\n * Convenience: ensures ATA exists by returning either [] or [createATAIx].\n * (Does NOT send; caller composes tx)\n */\n async maybeBuildCreateUserAtaIx(user: PublicKey = this.wallet.publicKey): Promise<TransactionInstruction[]> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n const info = await this.connection.getAccountInfo(accounts.userAta);\n if (info) return [];\n return [await this.buildCreateUserAtaIx(user)];\n }\n\n // ---------------------------------------------------------------------------\n // Reads (UI-first)\n // ---------------------------------------------------------------------------\n\n async getWireStateSnapshot(user: PublicKey = this.wallet.publicKey): Promise<OutpostWireStateSnapshot> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n\n const [\n globalState,\n wireReceipt,\n distributionState,\n userWarrantRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(accounts.globalState),\n this.program.account.wireReceipt.fetchNullable(accounts.wireReceipt),\n this.program.account.distributionState.fetch(accounts.distributionState),\n this.program.account.userWarrantRecord.fetchNullable(accounts.userWarrantRecord),\n this.program.account.trancheState.fetchNullable(accounts.trancheState),\n ]);\n\n const [\n liqsolPoolBalance,\n solBucketLamports,\n userLiqsolBalance,\n ] = await Promise.all([\n this.getTokenBalanceSafe(accounts.liqsolPoolAta),\n this.connection.getBalance(accounts.solBucket),\n this.getTokenBalanceSafe(accounts.userAta),\n ]);\n\n return {\n globalState,\n distributionState,\n wireReceipt,\n trancheState,\n userWarrantRecord,\n liqsolPoolBalance,\n solBucketLamports,\n userLiqsolBalance,\n };\n }\n\n async getWireReceipt(user: PublicKey = this.wallet.publicKey): Promise<WireReceipt | null> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n return this.program.account.wireReceipt.fetchNullable(accounts.wireReceipt);\n }\n\n async getTrancheState(): Promise<TrancheState | null> {\n const accounts = await buildOutpostAccounts(this.connection, this.wallet.publicKey);\n return this.program.account.trancheState.fetchNullable(accounts.trancheState);\n }\n\n async getUserWarrantRecord(user: PublicKey = this.wallet.publicKey): Promise<UserWarrantRecord | null> {\n const accounts = await buildOutpostAccounts(this.connection, user);\n return this.program.account.userWarrantRecord.fetchNullable(accounts.userWarrantRecord);\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (source of truth: your test utils)\n // ---------------------------------------------------------------------------\n\n /**\n * stakeLiqsol(amount)\n * (Outpost staking: liqSOL -> warrant pool)\n */\n async buildStakeLiqsolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .stakeLiqsol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * withdrawStake(amount)\n * (Outpost unstake: warrant pool -> user liqSOL)\n */\n async buildWithdrawStakeIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .withdrawStake(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWithLiqsol(amount)\n */\n async buildPurchaseWithLiqsolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .purchaseWithLiqsol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n buyerAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n warrantDepositRecord: a.wireReceipt,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWithSol(amount)\n */\n async buildPurchaseWithSolIx(amountLamports: bigint, userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n const amount = new BN(amountLamports.toString());\n\n return this.program.methods\n .purchaseWithSol(amount)\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n warrantDepositRecord: a.wireReceipt,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * purchaseWarrantsFromYield()\n *\n * Source of truth: your test util executePurchaseFromYield (note: it passed\n * liqsolPoolUserRecord: pdas.userUserRecord, not poolUserRecord).\n */\n async buildPurchaseFromYieldIx(userPubKey = this.wallet.publicKey): Promise<TransactionInstruction> {\n const a = await buildOutpostAccounts(this.connection, userPubKey);\n\n return this.program.methods\n .purchaseWarrantsFromYield()\n .accounts({\n user: a.user,\n globalState: a.globalState,\n liqsolMint: a.liqsolMint,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n solBucket: a.solBucket,\n liqsolPoolUserRecord: a.userUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n })\n .instruction();\n }\n\n // ---------------------------------------------------------------------------\n // Optional send helpers (wallet-facing sugar)\n // ---------------------------------------------------------------------------\n\n /**\n * Builds and sends a single-instruction transaction.\n * (Hub can ignore this and use builder methods only.)\n */\n async sendIx(ix: TransactionInstruction, opts?: {\n additionalIxs?: TransactionInstruction[];\n }): Promise<string> {\n const tx = new Transaction();\n if (opts?.additionalIxs?.length) {\n tx.add(...opts.additionalIxs);\n }\n tx.add(ix);\n\n try {\n const sig = await this.provider.sendAndConfirm(tx, [], { commitment: 'confirmed' });\n return sig;\n } catch (e: any) {\n const msg = getErrorMessage(e);\n throw new Error(`OutpostClient sendIx failed: ${msg}`);\n }\n }\n\n /**\n * Convenience: stake liqSOL and (optionally) create ATA first.\n */\n async stakeLiqsol(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildStakeLiqsolIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async withdrawStake(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true (usually exists, but harmless)\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildWithdrawStakeIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async purchaseWithLiqsol(params: {\n amount: BN;\n user?: PublicKey;\n ensureAta?: boolean; // default true\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const pre: TransactionInstruction[] = [];\n if (params.ensureAta ?? true) {\n pre.push(...(await this.maybeBuildCreateUserAtaIx(user)));\n }\n const ix = await this.buildPurchaseWithLiqsolIx(params.amount, user);\n return this.sendIx(ix, { additionalIxs: pre });\n }\n\n async purchaseWithSol(params: {\n amount: BN;\n user?: PublicKey;\n }): Promise<string> {\n const user = params.user ?? this.wallet.publicKey;\n const ix = await this.buildPurchaseWithSolIx(params.amount, user);\n return this.sendIx(ix);\n }\n\n async purchaseFromYield(params?: {\n user?: PublicKey;\n }): Promise<string> {\n const user = params?.user ?? this.wallet.publicKey;\n const ix = await this.buildPurchaseFromYieldIx(user);\n return this.sendIx(ix);\n }\n\n // ---------------------------------------------------------------------------\n // Internals\n // ---------------------------------------------------------------------------\n\n /**\n * Token balance helper returning BN(0) if ATA missing.\n */\n private async getTokenBalanceSafe(ata: PublicKey): Promise<BN> {\n try {\n const bal = await this.connection.getTokenAccountBalance(ata);\n return new BN(bal.value.amount);\n } catch {\n return new BN(0);\n }\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport type { TransactionInstruction, Connection } from '@solana/web3.js';\nimport { PublicKey, SystemProgram } from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport { buildOutpostAccounts, type OutpostAccounts, buildSolanaTrancheSnapshot } from '../utils';\nimport { SolanaProgramService } from '../program';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n UserWarrantRecord,\n WalletLike,\n WireReceipt,\n} from '../types';\nimport { derivePriceHistoryPda } from '../constants';\nimport type { } from '../types';\nimport { ChainID, SolChainID } from '@wireio/core';\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(private readonly provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user);\n }\n\n async fetchGlobalState(): Promise<GlobalState> {\n const { globalState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.globalState.fetch(globalState);\n }\n\n async fetchTrancheState(): Promise<TrancheState> {\n const { trancheState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.trancheState.fetch(trancheState);\n }\n\n async fetchWireReceipt(user: PublicKey): Promise<WireReceipt> {\n const { wireReceipt } = await this.getAccounts(user);\n return this.program.account.wireReceipt.fetch(wireReceipt);\n }\n\n async fetchUserWarrantRecord(user: PublicKey): Promise<UserWarrantRecord> {\n const { userWarrantRecord } = await this.getAccounts(user);\n return this.program.account.userWarrantRecord.fetch(userWarrantRecord);\n }\n\n // ---------------------------------------------------------------------------\n // Tranche snapshot / quoting\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Instruction builders (no send / confirm)\n // ---------------------------------------------------------------------------\n\n async buildPurchaseWithSolIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n const a = await this.getAccounts(user);\n\n return this.program.methods\n .purchaseWithSol(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n\n // IDL name is warrantDepositRecord (wireReceipt PDA)\n warrantDepositRecord: a.wireReceipt,\n\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n async buildPurchaseWithLiqsolIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n const a = await this.getAccounts(user);\n\n return this.program.methods\n .purchaseWithLiqsol(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n\n buyerAta: a.userAta,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n\n warrantDepositRecord: a.wireReceipt,\n\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n solBucket: a.solBucket,\n\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n async buildPurchaseFromYieldIx(\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n const a = await this.getAccounts(user);\n\n return this.program.methods\n .purchaseWarrantsFromYield()\n .accounts({\n user: a.user,\n globalState: a.globalState,\n liqsolMint: a.liqsolMint,\n poolAuthority: a.poolAuthority,\n liqsolPoolAta: a.liqsolPoolAta,\n solBucket: a.solBucket,\n\n liqsolPoolUserRecord: a.poolUserRecord,\n distributionState: a.distributionState,\n payRateHistory: a.payRateHistory,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n\n trancheState: a.trancheState,\n userWarrantRecord: a.userWarrantRecord,\n chainlinkFeed: a.chainLinkFeed,\n chainlinkProgram: a.chainLinkProgram,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // ---------------------------------------------------------------------------\n // Price helpers (SOL/USD via priceHistory account)\n // ---------------------------------------------------------------------------\n\n async getSolPriceUsdSafe(): Promise<{ price?: bigint; timestamp?: number }> {\n try {\n const price = await this.getSolPriceUsd();\n // current priceHistory account has no timestamp; keep optional\n return { price, timestamp: undefined };\n } catch {\n return { price: undefined, timestamp: undefined };\n }\n }\n\n /**\n * Fetch latest SOL/USD price (1e8 scale) from liqsol_core.priceHistory.\n * Uses the ring-buffer semantics from earlier SDK code.\n */\n async getSolPriceUsd(): Promise<bigint> {\n const priceHistoryPda = derivePriceHistoryPda();\n const history = (await this.program.account.priceHistory.fetch(\n priceHistoryPda,\n )) as PriceHistory;\n\n const { prices, nextIndex, count, windowSize } = history;\n\n if (!prices || prices.length === 0 || !count) {\n throw new Error('Price history is empty – no SOL price available');\n }\n\n const capacity = prices.length || windowSize;\n if (!capacity) {\n throw new Error('Price history capacity is zero – check account layout');\n }\n\n const lastIndex = nextIndex === 0 ? capacity - 1 : nextIndex - 1;\n const latest = prices[lastIndex];\n\n if (!BN.isBN(latest)) {\n throw new Error('Latest price entry is not a BN – check IDL/decoder');\n }\n\n return BigInt(latest.toString());\n }\n}","import {\n Commitment,\n Connection,\n ConnectionConfig,\n LAMPORTS_PER_SOL,\n PublicKey as SolPubKey,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\n StakerConfig,\n TrancheSnapshot,\n} from '../../types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\nimport { TokenClient } from './clients/token.client';\n\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n} from './constants';\n\nimport { buildSolanaTrancheSnapshot } from './utils';\nimport { SolanaTransaction } from './types';\n\nconst commitment: Commitment = 'confirmed';\n\n/**\n * Solana implementation of IStakingClient.\n *\n * Responsibilities:\n * - Wire together liqSOL deposit/withdraw\n * - Outpost stake/unstake\n * - Prelaunch WIRE (pretokens) buy flows\n * - Unified portfolio + tranche snapshot + buy quotes\n *\n * This class composes lower-level clients; it does not know about UI.\n */\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey?: PublicKey;\n public connection: Connection;\n public anchor: AnchorProvider;\n\n private depositClient: DepositClient;\n private distributionClient: DistributionClient;\n private leaderboardClient: LeaderboardClient;\n private outpostClient: OutpostClient;\n private tokenClient: TokenClient;\n\n get solPubKey(): SolPubKey {\n if (!this.pubKey) throw new Error('pubKey is undefined');\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network(): ExternalNetwork {\n return this.config.network;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter;\n // if (!adapter?.publicKey) throw new Error('Solana wallet adapter not connected');\n if (!config.network.rpcUrls.length) throw new Error('No RPC URLs provided');\n \n const publicKey = adapter.publicKey || new SolPubKey(new Uint8Array(32))\n if (config.pubKey){\n // If pubKey provided, ensure it matches the adapter's pubkey\n const wirePub = new PublicKey(KeyType.ED, publicKey.toBytes());\n if (!wirePub.equals(config.pubKey)) \n throw new Error(\"Passed-in pubKey doesn't match adapter.publicKey\");\n // All good; assign it\n this.pubKey = wirePub;\n }\n\n const opts: ConnectionConfig = { commitment };\n if (\n config.network.rpcUrls.length > 1 &&\n config.network.rpcUrls[1].startsWith('ws')\n ) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = {\n publicKey,\n async signTransaction<T extends SolanaTransaction>(tx: T): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(\n txs: T[],\n ): Promise<T[]> {\n return Promise.all(txs.map((tx) => adapter.signTransaction(tx)));\n },\n };\n\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, { commitment });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n this.tokenClient = new TokenClient(this.anchor);\n }\n\n // ---------------------------------------------------------------------\n // IStakingClient core methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native SOL into liqSOL (liqsol_core::deposit).\n * Handles tx build, sign, send, and confirmation.\n */\n async deposit(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Deposit amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } = await this.prepareTx(\n tx,\n );\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Withdraw SOL from liqSOL protocol.\n * NOTE: placeholder until a withdraw flow is implemented in DepositClient.\n */\n async withdraw(_amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n throw new Error('Withdraw method not yet implemented.');\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL -> pool).\n * Ensures user ATA exists, then stakes via outpostClient.\n */\n async stake(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Stake amount must be greater than zero.');\n }\n\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(\n this.solPubKey,\n );\n const stakeIx = await this.outpostClient.buildStakeLiqsolIx(amountLamports);\n const tx = new Transaction().add(...preIxs, stakeIx);\n\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n return await this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Unstake liqSOL from Outpost (pool -> liqSOL).\n * Mirrors stake() but calls withdrawStake.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Unstake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(user);\n const withdrawIx =\n await this.outpostClient.buildWithdrawStakeIx(amountLamports);\n const tx = new Transaction().add(...preIxs, withdrawIx);\n\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n return await this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Buy prelaunch WIRE “pretokens” using a supported asset.\n *\n * - SOL: uses purchase_with_sol\n * - LIQSOL: uses purchase_with_liqsol\n * - YIELD: uses purchase_warrants_from_yield\n *\n * ETH / LIQETH are not valid on Solana.\n */\n async buy(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (!amountLamports || amountLamports <= BigInt(0)) \n throw new Error('liqSOL pretoken purchase requires a positive amount.');\n \n const user = this.solPubKey;\n const preIxs = await this.outpostClient.maybeBuildCreateUserAtaIx(user);\n const ix = await this.tokenClient.buildPurchaseWithLiqsolIx(\n amountLamports,\n user,\n );\n const tx = new Transaction().add(...preIxs, ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n return await this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Aggregate view of the user’s balances on Solana:\n * - native: SOL wallet balance\n * - liq: liqSOL token balance (Token-2022 ATA)\n * - staked: Outpost-staked liqSOL principal\n * - tracked: distribution program trackedBalance (liqSOL)\n * - wire: total prelaunch WIRE shares (warrants/pretokens, 1e8)\n * - extras: useful internal addresses and raw state for debugging/UX\n */\n async getPortfolio(): Promise<Portfolio> {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n\n const user = this.solPubKey;\n\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const [\n nativeLamports,\n actualBalResp,\n userRecord,\n snapshot,\n ] = await Promise.all([\n this.connection.getBalance(user, 'confirmed'),\n this.connection\n .getTokenAccountBalance(userLiqsolAta, 'confirmed')\n .catch(() => null),\n this.distributionClient.getUserRecord(user).catch(() => null),\n this.outpostClient.getWireStateSnapshot(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n const trackedAmountStr =\n userRecord?.trackedBalance?.toString() ?? '0';\n\n const wireReceipt = snapshot?.wireReceipt ?? null;\n const userWarrantRecord = snapshot?.userWarrantRecord ?? null;\n const trancheState = snapshot?.trancheState ?? null;\n const globalState = snapshot?.globalState ?? null;\n\n const stakedAmountStr =\n wireReceipt?.stakedLiqsol?.toString() ?? '0';\n\n const wireSharesStr =\n userWarrantRecord?.totalPretokensPurchased?.toString() ?? '0';\n\n return {\n native: {\n amount: BigInt(nativeLamports),\n symbol: \"SOL\",\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n ata: userLiqsolAta,\n },\n staked: {\n amount: BigInt(stakedAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n },\n wire: {\n // Prelaunch pretokens / WIRE shares (1e8)\n amount: BigInt(wireSharesStr),\n symbol: \"$WIRE\",\n decimals: 8,\n },\n tracked: {\n amount: BigInt(trackedAmountStr),\n symbol: \"LiqSOL\",\n decimals: LIQSOL_DECIMALS,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n wireReceipt,\n userWarrantRecord,\n globalIndex: globalState?.currentIndex?.toString(),\n totalShares: globalState?.totalShares?.toString(),\n currentTrancheNumber: trancheState?.currentTrancheNumber?.toString(),\n currentTranchePriceUsd: trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD\n },\n chainID: this.network.chainId,\n };\n }\n\n /**\n * Unified, chain-agnostic tranche snapshot for Solana.\n *\n * Uses:\n * - liqsol_core.globalState (currentIndex, totalShares, etc.)\n * - liqsol_core.trancheState (price, supply, total sold, etc.)\n * - Chainlink/PriceHistory for SOL/USD (via TokenClient.getSolPriceUsdSafe)\n *\n * windowBefore/windowAfter control how many ladder rows we precompute\n * around the current tranche for UI, but you can pass nothing if you\n * only need current tranche info.\n * \n * READ-ONLY allowed\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = SolChainID.WireTestnet,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n // Canonical program state\n const [globalState, trancheState] = await Promise.all([\n this.tokenClient.fetchGlobalState(),\n this.tokenClient.fetchTrancheState(),\n ]);\n\n // Latest SOL/USD price (1e8) + timestamp from PriceHistory\n const { price: solPriceUsd, timestamp } =\n await this.tokenClient.getSolPriceUsdSafe();\n\n return buildSolanaTrancheSnapshot({\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp: timestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n /**\n * Convenience helper to fetch the distribution userRecord for the current user.\n * Used by balance-correction flows and debugging.\n */\n async getUserRecord() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n /**\n * Run the \"correct & register\" flow on Solana:\n * - builds the minimal transaction (maybe multi-user) to reconcile liqSOL\n * - signs and sends the transaction if it can succeed\n */\n async correctBalance(amount?: bigint): Promise<string> {\n this.ensureWriteAccess();\n const build = await this.distributionClient.buildCorrectRegisterTx({ amount });\n if (!build.canSucceed || !build.transaction) {\n throw new Error(build.reason ?? 'Unable to build Correct&Register transaction');\n }\n\n const { tx, blockhash, lastValidBlockHeight } = await this.prepareTx(\n build.transaction,\n );\n const signed = await this.signTransaction(tx);\n const signature = await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n return signature;\n }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n /**\n * Send a signed transaction over HTTP RPC and wait for confirmation.\n * Throws if the transaction fails.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureWriteAccess();\n const signature = await this.connection.sendRawTransaction(\n signed.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n },\n );\n\n const conf = await this.connection.confirmTransaction(\n {\n signature,\n blockhash: ctx.blockhash,\n lastValidBlockHeight: ctx.lastValidBlockHeight,\n },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(`Transaction failed: ${JSON.stringify(conf.value.err)}`);\n }\n\n return signature;\n }\n\n /**\n * Sign a single Solana transaction using the connected wallet adapter.\n */\n async signTransaction(tx: SolanaTransaction): Promise<SolanaTransaction> {\n this.ensureWriteAccess();\n return this.anchor.wallet.signTransaction(tx);\n }\n\n /**\n * Generic \"fire and forget\" send helper if the caller already\n * prepared and signed the transaction.\n */\n async sendTransaction(signed: SolanaTransaction): Promise<TransactionSignature> {\n this.ensureWriteAccess();\n return this.anchor.sendAndConfirm(signed);\n }\n\n /**\n * Attach recent blockhash + fee payer to a transaction.\n * Required before signing and sending.\n */\n async prepareTx(\n tx: Transaction,\n ): Promise<{ tx: Transaction; blockhash: string; lastValidBlockHeight: number }> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n return { tx, blockhash, lastValidBlockHeight };\n }\n\n ensureWriteAccess() {\n if (!this.pubKey || !this.anchor.wallet.publicKey)\n throw new Error('User Authorization required: pubKey is undefined');\n if (this.solPubKey.toBase58() !== this.anchor.wallet.publicKey.toBase58())\n throw new Error('Write access requires connected wallet to match pubKey');\n }\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\nimport AccountingArtifact from '../../assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json';\n\n// Outpost Artifacts\nimport DepositorArtifact from '../../assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/ABI/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/ABI/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\n\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n Accounting: \"0xd333A03a44D5d602A98c1B7bcd7ED1f042DD0dEd\",\n DepositManager: \"0x601eaA31e8d33D8725786f1733f4cE6cCEf740D4\",\n LiqEth: \"0x08252e1Dcbaa86A2887927b02536CD3E67a802c8\", // AKA LiqEthToken\n StakingModule: \"0x7Aac2fCfc83d7F2f15eA53a10C1677CA377AFcF4\",\n WithdrawalQueue: \"0x951E413FC81a2CE133078ABE8B88677F5296abE7\",\n WithdrawalVault: \"0x0D2bf834DD560839e986d42D06DeE268A17c2d13\",\n\n // LiqEthAuthority: \"0x7A9cf59EC53F32577Cc8200466Cc7693713129D5\",\n // BeaconState: \"0xD3860E5977C94b343341635a2dEEBD20B651c48f\",\n // YieldOracle: \"0x307b35816674913cf122975B3CF912b5709653F3\",\n \n //Outpost contracts\n Depositor: \"0x69Aa53Ef02F124dB421AeDda509d6912341299Cc\",\n ReceiptNFT: \"0x13588fF41E2f47D047874162B1eD15AaF6818f5a\",\n OutpostManager: \"0x187f4fEDBCAD2f3150120B743b5d568F11dD3452\",\n BAR: \"0x27d4646abF638A13934c94f8bA9AC1Bda39F5dbb\",\n OPP: \"0x79CA2DE915C294593edc16b32CBA8B7866159205\",\n OPPCommon: \"0x8392ea945Cd8C03F5241d4964D20BB5A9c320c71\",\n OPPInbound: \"0xfDA9A2C7e395a9722d9fa506f5d67aba823298dd\",\n Pretoken: \"0xcf6A1209A7A391cc576174204386F4e5462323dC\",\n EthUsdPriceConsumer: \"0x1Ef180FF49313fCB8B5c0470268295d0d24CDE69\",\n Aggregator: \"0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF\",\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n Accounting: {\n address: ADDRESSES.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n LiqEth: {\n address: ADDRESSES.LiqEth,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n\n // Outpost Contracts\n Depositor: {\n address: ADDRESSES.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: ADDRESSES.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: ADDRESSES.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: ADDRESSES.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: ADDRESSES.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: ADDRESSES.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: ADDRESSES.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Pretoken: {\n address: ADDRESSES.Pretoken,\n abi: PretokenArtifact.abi as JsonFragment[],\n },\n Aggregator: {\n address: ADDRESSES.Aggregator,\n abi: AggregatorArtifact.abi as JsonFragment[],\n },\n EthUsdPriceConsumer: {\n address: ADDRESSES.EthUsdPriceConsumer,\n abi: EthUsdPriceConsumerArtifact.abi as JsonFragment[],\n }\n};\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // liqETH suite\n AccountingArtifact,\n DepositManagerArtifact,\n LiqEthArtifact,\n // LiqEthBurnArtifact,\n // LiqEthMintArtifact,\n // RewardsERC20Artifact,\n StakingModuleArtifact,\n // ValidatorBalanceArtifact,\n WithdrawalQueueArtifact,\n WithdrawalVaultArtifact,\n // YieldArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","\nimport { ethers } from \"ethers\";\nimport { TrancheLadderItem, TrancheSnapshot } from \"../../types\";\nimport { ChainID } from \"@wireio/core\";\n\n\nconst BPS = BigInt(10_000);\n\nexport interface CustomContractError {\n name?: string;\n signature?: string;\n args?: any[];\n data?: any;\n method?: string;\n code?: any;\n raw: string;\n}\n\n\n\nexport function formatContractErrors(err: any): CustomContractError {\n // Extract custom error details if present\n if (err.errorName && err.errorArgs) {\n const errorObj: CustomContractError = {\n name: err.errorName,\n signature: err.errorSignature,\n args: err.errorArgs.map((arg: any) =>\n arg && arg._isBigNumber ? ethers.BigNumber.from(arg).toString() : arg\n ),\n data: err.data,\n method: err.method,\n code: err.code,\n raw: err,\n };\n console.error(\"Custom contract error:\", errorObj);\n return errorObj;\n } else {\n console.error(\"Contract Error:\", err);\n return {\n raw: typeof err === 'string' ? err : (err?.message || String(err))\n };\n }\n}\n\n\n\n/**\n * Finalize an OPP epoch. Optionally accept a gasLimit override (ethers BigNumberish).\n * If gasLimit is not provided, the method will attempt estimateGas.finalizeEpoch()\n * and pad it (1.2x). If estimateGas fails, a conservative fallback is used.\n */\nexport async function sendOPPFinalize(opp: ethers.Contract, gasLimit?: ethers.BigNumberish) {\n const overrides: any = {};\n try {\n if (gasLimit === undefined) {\n try {\n const estimated = await opp.estimateGas.finalizeEpoch();\n const padded = ethers.BigNumber.from(estimated).mul(12).div(10); // 1.2x\n overrides.gasLimit = padded;\n console.log('sendFinalize: estimated gas', estimated.toString(), 'padded to', overrides.gasLimit.toString());\n } catch (estErr) {\n // estimateGas can throw UNPREDICTABLE_GAS_LIMIT; fall back to a safe default\n console.warn('sendFinalize: estimateGas.finalizeEpoch() failed, falling back to hardcoded gasLimit', estErr);\n overrides.gasLimit = ethers.BigNumber.from(8000000);\n }\n } else {\n overrides.gasLimit = ethers.BigNumber.from(gasLimit);\n console.log('sendFinalize: using provided gasLimit override', overrides.gasLimit.toString());\n }\n\n const tx = await opp.finalizeEpoch(overrides); // submit tx with overrides\n console.log('sendFinalize tx hash:', tx.hash, 'overrides:', overrides);\n\n const receipt = await tx.wait(); // wait for mined\n console.log('sendFinalize tx mined, block:', receipt.blockNumber);\n return receipt;\n } catch (err: any) {\n // Verbose error logging to help debugging reverts / provider issues\n console.error('sendFinalize() failed:', err?.message || err);\n\n // Try to extract common raw payload locations used by ethers errors\n const raw = err?.error?.data || err?.data || err?.body || err?.receipt || err?.transaction || err;\n console.error('sendFinalize raw payload:', raw);\n\n // Try parsing with contractService if available\n try {\n const parsed = formatContractErrors(raw);\n console.error('sendFinalize parsed error:', parsed.name, parsed.args);\n } catch (parseErr) {\n // Fallback: decode Error(string) ABI encoded revert (0x08c379a0)\n try {\n const hex = (typeof raw === 'string') ? raw : (raw && raw.data) ? raw.data : null;\n if (hex && typeof hex === 'string' && hex.startsWith('0x08c379a0')) {\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], '0x' + hex.slice(10))[0];\n console.error('sendFinalize revert reason:', reason);\n } else {\n console.error('sendFinalize: unable to decode revert payload (not standard Error(string))');\n }\n } catch (fallbackErr) {\n console.error('sendFinalize: fallback decode failed:', fallbackErr);\n }\n }\n\n // If there is a receipt, print it for extra context\n if (err?.receipt) console.error('sendFinalize receipt:', err.receipt);\n if (err?.transaction) console.error('sendFinalize transaction object:', err.transaction);\n\n // Re-throw so callers can handle it as well\n throw err;\n }\n}\n\n\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n\n/**\n * Calculate the full supply for a given tranche using BigInt math.\n * trancheNumber is 1-based (tranche 1 = startSupply)\n */\nfunction getTrancheSize(startSupply: bigint, supplyGrowthBps: number, trancheNumber: number): bigint {\n let supply = startSupply;\n for (let i = 0; i < trancheNumber; i++) {\n supply = (supply * (BPS + BigInt(supplyGrowthBps)) + BPS / BigInt(2)) / BPS;\n }\n return supply;\n}\n\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n */\nexport function buildEthereumTrancheLadder(options: {\n currentTranche: number;\n totalTrancheSupply: bigint,\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n \n //calculate total tranche size (e.g. 60,600 on tranche 2)\n const currentTrancheSize = getTrancheSize(initialTrancheSupply, supplyGrowthBps, currentTranche);\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, currentTrancheSize);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport async function buildEthereumTrancheSnapshot(options: {\n chainID: ChainID;\n totalSharesBn;\n indexBn;\n trancheNumberBn;\n currentTrancheSupply;\n tranchePriceWadBn;\n totalTrancheSupply;\n initialTrancheSupply;\n supplyGrowthBps;\n priceGrowthBps;\n minPriceUsd;\n maxPriceUsd;\n\n ethPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): Promise<TrancheSnapshot> {\n const {\n chainID,\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n\n totalSharesBn, \n indexBn, \n trancheNumberBn, \n currentTrancheSupply, \n tranchePriceWadBn, \n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthBps,\n minPriceUsd, \n maxPriceUsd,\n } = options;\n\n\n // convert default BigNumber to bigint for hub to handle, and partially convert from 1e18 to 1e8 for the hub\n const totalShares = BigInt(totalSharesBn.toString()) / BigInt(1e10);\n const currentIndex = BigInt(indexBn.toString()); // RAY (1e27)\n const currentTranche = Number(trancheNumberBn.toString());\n const currentPriceUsd = BigInt(tranchePriceWadBn.toString()) / BigInt(1e10); // 1e18 WAD\n\n\n const ladder = buildEthereumTrancheLadder({\n currentTranche,\n totalTrancheSupply,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n currentTrancheSupply,\n initialTrancheSupply,\n totalPretokensSold: totalTrancheSupply,\n nativePriceUsd: ethPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n","import { BigNumber, ethers, Signer } from \"ethers\";\nimport { DepositEvent, DepositResult, WithdrawRequestedEvent, WithdrawResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { ChainID } from \"@wireio/core\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class DepositClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n\n\n /**\n * \n * @param amountWei an amount of WEI to deposit in exchange for liqETH\n * @returns the hash of the transaction\n */\n async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n console.warn('less than min deposit');\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n let tx, receipt;\n try {\n tx = await this.contract.DepositManager.deposit({ value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n\n\n // OLD - this was replaced with LiqEth.safeBurn() on 1/13/26\n async requestWithdraw(amountWei: BigNumber, signer: Signer, chainId: ChainID): Promise<WithdrawResult> {\n // deadline is a period of time in the future that the signature is valid for\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const liqEth = this.contract.LiqEth;\n const owner = await signer.getAddress();\n \n const nonce: BigNumber = await liqEth.nonces(owner);\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: this.contract.LiqEth.address,\n } as any;\n\n const types = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n } as any;\n\n const values = {\n owner,\n spender: this.contractService.getAddress('DepositManager'),\n value: amountWei,\n nonce: nonce,\n deadline,\n } as any;\n\n const signature = await (signer as any)._signTypedData(domain, types, values);\n const split = ethers.utils.splitSignature(signature);\n\n const tx = await this.contract.DepositManager.requestWithdrawal(\n amountWei,\n deadline,\n split.v,\n split.r,\n split.s\n );\n\n // wait for 1 confirmation\n const receipt = await tx.wait(1);\n\n // if WithdrawRequested event exists, parse it and get arguments\n let withdrawRequested: WithdrawRequestedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawRequested');\n\n if (ev && ev.args) {\n const { user, ethAmount, nftId, readyAt } = ev.args;\n withdrawRequested = {\n user,\n ethAmount: BigNumber.from(ethAmount),\n nftId: BigNumber.from(nftId),\n readyAt: readyAt,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawRequested,\n } as WithdrawResult;\n }\n\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { preLaunchReceipt, StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class StakeClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Simulate a stake via callStatic\n */\n async simulateStake(amountWei: BigNumber): Promise<void> {\n try {\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n }\n\n\n /**\n * Read OPP / Outpost state used by the Depositor to decide whether staking is allowed.\n * Returns various data\n */\n async getOppStatus(): Promise<any> {\n const depositor = this.contract.Depositor;\n const opp = this.contract.OPP;\n\n \n const oppAddress: string = await depositor.oppAddress();\n const oppInboundAddress: string = await depositor.oppInboundAddress();\n const prevEpochSent = await opp.prevEpochSent();\n \n\n const inbound = this.contractService.getReadOnly('OPPInbound');\n\n // Query useful getters\n const nextEpochBN: any = await inbound.nextEpochNum();\n const pendingEpochRaw: any = await inbound.pendingEpoch();\n const pendingMessageCount: any = await inbound.pendingMessageCount();\n const previousEpochHash: string = await inbound.previousEpochHash();\n const nextEpochNum = (nextEpochBN && typeof nextEpochBN.toNumber === 'function') ? nextEpochBN.toNumber() : Number(nextEpochBN || 0);\n\n const pendingEpoch = (pendingEpochRaw && pendingEpochRaw.epochNumber !== undefined)\n ? {\n epochNumber: (pendingEpochRaw.epochNumber && typeof pendingEpochRaw.epochNumber.toNumber === 'function') ? pendingEpochRaw.epochNumber.toNumber() : Number(pendingEpochRaw.epochNumber || 0),\n timestamp: (pendingEpochRaw.timestamp && typeof pendingEpochRaw.timestamp.toNumber === 'function') ? pendingEpochRaw.timestamp.toNumber() : Number(pendingEpochRaw.timestamp || 0),\n prevEpochHash: pendingEpochRaw.prevEpochHash,\n merkleRoot: pendingEpochRaw.merkleRoot,\n firstMessageID: pendingEpochRaw.firstMessageID,\n lastMessageID: pendingEpochRaw.lastMessageID,\n }\n : null;\n\n const pendingMessagesBN = pendingMessageCount;\n const pendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.toString === 'function') ? pendingMessagesBN.toString() : String(pendingMessagesBN || '0');\n\n const hasPendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.gt === 'function') ? pendingMessagesBN.gt(0) : (Number(pendingMessages) > 0);\n\n return {\n oppAddress,\n prevEpochSent,\n oppInboundAddress,\n nextEpochNum,\n pendingEpoch,\n pendingMessageCount: pendingMessages,\n previousEpochHash,\n hasPendingMessages,\n raw: {\n nextEpochBN,\n pendingEpochRaw,\n pendingMessageCount: pendingMessagesBN,\n },\n };\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async performStake(amountWei: BigNumber, signerAddress: string): Promise<any> {\n const depositor = this.contract.Depositor.address;\n const liqRead = this.contract.LiqEth;\n const bal = await liqRead.balanceOf(signerAddress);\n const allowance = await liqRead.allowance(signerAddress, depositor);\n\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountWei)) {\n const liqWrite = this.contractService.getWrite('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositor}, ${approveAmount.toString()})`);\n const approveTx = await liqWrite.approve(depositor, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liqRead.allowance(signerAddress, depositor);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n \n await this.simulateStake(amountWei);\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.Depositor.stakeLiqETH(amountWei);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let staked: StakedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { user, amountLiq, shares, tokenId } = ev.args;\n staked = {\n user,\n amountLiq: BigNumber.from(amountLiq),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n\n async getOwnedTokenIdsFor(\n owner: string,\n fromBlock = 1850820,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async fetchPreLaunchReceipts(address: string): Promise<preLaunchReceipt[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedTokenIdsFor(address);\n\n const results: preLaunchReceipt[] = [];\n\n // next fetch on-chain receipt data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await receiptContract.getReceipt(idBN);\n const formattedReceipt = {\n account: receiptData.account,\n currency: receiptData.currency,\n kind: receiptData.kind,\n indexAtMint: receiptData.indexAtMint.toBigInt(),\n principal: {\n amount: receiptData.principal.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n shares: {\n amount: receiptData.shares.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n timestamp: new Date(Number(receiptData.timestamp.toString()) * 1000).toLocaleString(),\n }\n\n // Only fetch staking receipts (kind 1 is a wire pretoken receipt)\n if(receiptData.kind == 0) results.push({ tokenId: idBN.toBigInt(), receipt: formattedReceipt } as any);\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n console.log('results of prelaunch receipts', results)\n return results;\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async performWithdrawStake(tokenId: BigNumber, recipient: string): Promise<WithdrawnStakeResult> {\n // Send the payable tx\n const tx = await this.contract.Depositor.withdrawStake(tokenId, recipient);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let withdrawnstake: WithdrawnStakeEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawnStake');\n\n if (ev && ev.args) {\n const { user, tokenOut, tokenId } = ev.args;\n withdrawnstake = {\n user: user,\n tokenOut: BigNumber.from(tokenOut),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawnstake,\n };\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors, sendOPPFinalize } from \"../utils\";\n\nexport class PretokenClient {\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Purchase pretokens by sending ETH to the Depositor.purchasePretokensWithETH(buyer) payable function.\n * Returns txHash, receipt and parsed PurchasedWithETH event (if present).\n */\n // async purchasePretokensWithETH(amountWei: BigNumber, buyer: string): Promise<any> {\n // // attempt a simulation of the purchase call\n // try {\n // await this.contract.Depositor.callStatic.purchasePretokensWithETH(buyer, { value: amountWei });\n // } catch (err: any) {\n // let errorObj = formatContractErrors(err);\n // throw new Error(errorObj.name ?? errorObj.raw)\n // }\n\n // // attempt the real purchase call\n // let tx, receipt;\n // try {\n // tx = await this.contract.Depositor.purchasePretokensWithETH(buyer, { value: amountWei });\n // receipt = await tx.wait(1);\n // } catch (err: any) {\n // let errorObj = formatContractErrors(err);\n // throw new Error(errorObj.name ?? errorObj.raw)\n // }\n\n\n // // Attempt to parse PurchasedWithETH event\n // let purchased: any | undefined;\n // const ev = receipt.events?.find((e) => e.event === 'PurchasedWithETH' || e.event === 'PurchasedWithETH(address,uint256,uint256,uint256)');\n\n // if (ev && ev.args) {\n // // event signature: PurchasedWithETH(address indexed user, uint256 ethIn, uint256 shares, uint256 tokenId)\n // const { user, ethIn, shares, tokenId } = ev.args as any;\n\n // purchased = {\n // buyer: user,\n // amount: BigNumber.from(ethIn),\n // shares: BigNumber.from(shares),\n // tokenId: BigNumber.from(tokenId),\n // };\n // }\n\n // return {\n // txHash: tx.hash,\n // receipt,\n // purchased,\n // };\n // }\n\n /**\n * Purchase pretokens by transferring liqETH into the pool (ERC-20) and calling Depositor.purchasePretokensWithLiqETH(amountLiq, buyer).\n * Returns txHash, receipt and parsed PurchasedWithLiqETH event (if present).\n */\n async purchasePretokensWithLiqETH(amountLiq: BigNumber, buyer: string): Promise<any> {\n // attempt a simulation of the purchase call\n try {\n await this.contract.Depositor.callStatic.purchasePretokensWithLiqETH(amountLiq, buyer);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n\n // ! TEMP for testing\n if(errorObj.name == \"OPP_PreviousEpochUnsent\") {\n console.error(\"OPP Previous Epoch is unsent - trigger OPP finalizeEpoch()\")\n await sendOPPFinalize(this.contract.OPP);\n throw new Error(errorObj.name+` - triggering OPP finalizeEpoch() please try again`);\n }\n\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithLiqETH(amountLiq, buyer);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithLiqETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithLiqETH' || (e.event && e.event.toString().startsWith('PurchasedWithLiqETH')));\n\n if (ev && ev.args) {\n // Event shape: PurchasedWithLiqETH(buyer, amountLiq, ethEqWei, shares, tokenId)\n const args: any = ev.args;\n // try named fields first, fallback to positional\n const evtBuyer = args.buyer ?? args[0];\n const evtAmountLiq = (args.amountLiq ?? args[1]) ? BigNumber.from(args.amountLiq ?? args[1]) : undefined;\n const evtEthEqWei = (args.ethEqWei ?? args[2]) ? BigNumber.from(args.ethEqWei ?? args[2]) : undefined;\n const evtShares = (args.shares ?? args[3]) ? BigNumber.from(args.shares ?? args[3]) : undefined;\n const evtTokenId = (args.tokenId ?? args[4]) ? BigNumber.from(args.tokenId ?? args[4]) : undefined;\n\n purchased = {\n buyer: evtBuyer,\n amountLiq: evtAmountLiq,\n ethEqWei: evtEthEqWei,\n shares: evtShares,\n tokenId: evtTokenId,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { preLaunchReceipt, SharesBurnedEvent, StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class LiqClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n public async safeBurn(signerAddress: string, amountWei: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.LiqEth.safeBurn(signerAddress, amountWei);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse SharesBurned event if present\n let event: SharesBurnedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'SharesBurned');\n\n if (ev && ev.args) {\n const { from, shares, tokenValue } = ev.args;\n event = {\n from,\n shares: BigNumber.from(shares),\n tokenValue: BigNumber.from(tokenValue),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n\n}","import { BigNumber, ethers } from 'ethers';\nimport { IStakingClient, Portfolio, StakerConfig, TrancheSnapshot } from '../../types';\nimport { ChainID, EvmChainID, PublicKey as WirePubKey } from '@wireio/core';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt } from './types';\nimport { DepositClient } from './clients/deposit.client';\nimport { StakeClient } from './clients/stake.client';\nimport { PretokenClient } from './clients/pretoken.client';\nimport { buildEthereumTrancheSnapshot } from './utils';\nimport { LiqClient } from './clients/liq.client';\n\n\n\n\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey?: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private depositClient: DepositClient;\n private liqClient: LiqClient;\n private pretokenClient: PretokenClient;\n private stakeClient: StakeClient;\n\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey;\n \n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n \n this.depositClient = new DepositClient(this.contractService);\n this.liqClient = new LiqClient(this.contractService);\n this.pretokenClient = new PretokenClient(this.contractService);\n this.stakeClient = new StakeClient(this.contractService);\n } \n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n } \n }\n\n\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.depositClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async withdraw(amount: bigint): Promise<string> {\n const address = await this.signer.getAddress();\n const amountWei = BigNumber.from(amount);\n // const chainId = this.network?.chainId ?? (await this.provider.getNetwork()).chainId;\n // const result = await this.depositClient.requestWithdraw(amountWei, this.signer, chainId);\n\n const result = await this.liqClient.safeBurn(address, amountWei)\n return result.txHash;\n }\n\n\n /**\n * Stake liqETH via DepositManager.\n * @param amount Amount in wei \n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async stake(amount: bigint): Promise<string> {\n const walletAddress = await this.signer.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.stakeClient.performStake(amountWei, walletAddress);\n return result.txHash;\n }\n\n\n // TODO\n async unstake(): Promise<string> {\n throw new Error(\"Method not yet implemented.\");\n }\n\n\n /**\n * ETH Prelaunch function to unstake liqEth\n * @param tokenId ReceiptNFT tokenId for the owned NFT that will be burned\n * @param recipient Address to receive the liqEth funds linked to the burned NFT\n * @returns the transaction hash\n */\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n\n async buy(amount: bigint): Promise<string> {\n const buyer = await this.signer.getAddress();\n const amountBigNum = BigNumber.from(amount)\n\n // ! Hoodi only - check if the mock aggregator price is stale, and if so, update it before submitting the buy request\n await this.updateMockAggregatorPrice();\n \n\n const bal = await this.contract.LiqEth.balanceOf(buyer);\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n // if current liq balance is less than the requested buy amount, throw an error\n if (bal.lt(amount)) {\n throw new Error(`Balance insufficient for pre-token purchase`);\n }\n\n //check that the contract has allowance for the token\n const depositorAddr = this.contract.Depositor.address;\n const allowance = await this.contract.LiqEth.allowance(buyer, depositorAddr);\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amount)) {\n const liqWrite = this.contractService.getWrite('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amount.toString()}); sending approve(${depositorAddr}, ${approveAmount.toString()})`);\n\n const approveTx = await liqWrite.approve(depositorAddr, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await this.contract.LiqEth.allowance(buyer, depositorAddr);\n if (newAllowance.lt(amount)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n\n\n let result = await this.pretokenClient.purchasePretokensWithLiqETH(amountBigNum, buyer);\n\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\n }\n\n\n \n\n async getOPPStatus(): Promise<any> {\n return await this.stakeClient.getOppStatus();\n }\n\n\n \n /**\n * ETH Prelaunch function to list the ReceiptNFTs owned by a specific user\n * @param address address to query the receipts for\n * @returns array of receipts\n */\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n if(address === undefined) address = await this.signer.getAddress();\n \n let receipts = await this.stakeClient.fetchPreLaunchReceipts(address);\n return receipts\n }\n\n \n \n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.DepositManager.withdrawDelay();\n let minDeposit = await this.contract.DepositManager.minDeposit();\n let rewardCooldown = await this.contract.DepositManager.rewardCooldown();\n\n return {\n withdrawDelay,\n minDeposit,\n rewardCooldown,\n }\n }\n\n /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n const walletAddress = await this.signer.getAddress();\n // console.log('getPortfolio() wallet address', walletAddress)\n\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEth.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (actual)\n const stakedLiqBalance = await this.contract.Depositor.sharesOf(walletAddress);\n\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n tracked: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakedLiqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n wire: {\n amount: BigInt(0), // TODO\n decimals: 0,\n symbol: '$WIRE',\n },\n chainID: this.network.chainId\n }\n return portfolio;\n }\n\n\n /**\n * Program-level prelaunch WIRE / tranche snapshot for Ethereum\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = EvmChainID.Hoodi,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\n // Fetch all required contract data\n const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceWadBn, totalSupplyBn, supplyGrowthBps, priceGrowthBps, minPriceUsd, maxPriceUsd] = await Promise.all([\n this.contract.Depositor.totalShares(blockTag),\n this.contract.Depositor.index(blockTag),\n this.contract.Pretoken.trancheNumber(blockTag),\n this.contract.Pretoken.trancheSupply(blockTag),\n this.contract.Pretoken.tranchePriceUsd(blockTag),\n this.contract.Pretoken.totalSupply(blockTag),\n this.contract.Pretoken.supplyGrowthBps(blockTag),\n this.contract.Pretoken.priceGrowthBps(blockTag),\n this.contract.EthUsdPriceConsumer.MIN_PRICE(),\n this.contract.EthUsdPriceConsumer.MAX_PRICE(),\n ]);\n\n\n const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);\n const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);\n\n\n // fetch price and timestamp from aggregator\n const [ roundId, answer, startedAt, updatedAt, answeredInRound ] = await this.contract.Aggregator.latestRoundData();\n let ethPriceUsd: bigint = BigInt(answer.toString());\n let nativePriceTimestamp: number = Number(updatedAt);\n\n // ! Placeholder from hoodi deployment - don't think this can be fetched dynamically\n const initialTrancheSupply = BigInt(60000) * BigInt(1e8); \n\n return buildEthereumTrancheSnapshot({\n chainID,\n totalSharesBn, \n indexBn, \n trancheNumberBn,\n currentTrancheSupply, \n tranchePriceWadBn, \n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthBps,\n minPriceUsd, \n maxPriceUsd,\n\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n\n\n \n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n\n \n\n // ! This is a temporary measure for Hoodi testnet because there is no aggregator deployed\n private async updateMockAggregatorPrice() {\n const aggregator = this.contract.Aggregator;\n\n // read latest round & compute age\n const [roundId, answer, startedAt, updatedAt, answeredInRound] = await aggregator.latestRoundData();\n const now = (await this.provider.getBlock(\"latest\")).timestamp;\n const ageSec = Number(now) - Number(updatedAt);\n\n const ONE_HOUR = 1 * 3600;\n // const ONE_HOUR = 10;\n if (ageSec > ONE_HOUR) {\n // safety check - only run in non-production contexts\n const network = await this.provider.getNetwork();\n const chainId = network.chainId;\n const allowedTestChains = new Set([560048]); \n if (!allowedTestChains.has(chainId)) {\n console.warn(`MockAggregator is stale (${ageSec}s) but chainId ${chainId} is not a test/local network — skipping update.`);\n return;\n }\n\n\n //fetch the current ETH / USD price\n const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd');\n const data = await res.json();\n const ethUsd = data.ethereum.usd;\n\n const currentEthPrice = ethers.utils.parseUnits(ethUsd.toString(), 8);\n\n try {\n //update to be intentionally stale\n // const alttx = await aggregator.updateStale(currentEthPrice, now - 7200);\n // const altreceipt = await alttx.wait(1);\n // console.log('stale update receipt', altreceipt)\n\n //update answer with current timestamp\n const tx = await aggregator.updateAnswer(currentEthPrice);\n const txreceipt = await tx.wait(1);\n // console.log('MockAggregator answer updated - receipt:', txreceipt)\n } catch (err: any) {\n console.error('MockAggregator updateAnswer failed', err?.message || err);\n }\n } else {\n console.log(`MockAggregator updated ${ageSec}s ago — no update needed`);\n }\n }\n\n\n\n\n\n // TODO: implement claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from './networks/solana/solana';\nimport { EthereumStakingClient } from './networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n\n default:\n console.log(`No staking client available for chain ${cfg.network.chainId}`);\n throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n\n this.selectedChainID = selectedChainID;\n }\n \n /**\n * Select a chain. Returns true if a client exists for it, false otherwise.\n * (We still record the selectedChainID so the UI can reflect the chosen chain.)\n */\n setChain(chainID: ChainID): boolean {\n this.selectedChainID = chainID;\n return this.clients.has(chainID);\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { BalanceView } from '../../types';\n\nexport const CONTRACT_NAMES = [\n 'Accounting',\n 'DepositManager',\n 'LiqEth',\n 'StakingModule',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n\n //Outpost contracts\n 'Depositor',\n 'ReceiptNFT',\n 'OutpostManager',\n 'BAR',\n 'OPP',\n 'OPPCommon',\n 'OPPInbound',\n 'Pretoken',\n 'Aggregator',\n 'EthUsdPriceConsumer',\n\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\n\ninterface Result {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n}\n\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult extends Result {\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}\n\nexport interface WithdrawRequestedEvent {\n user: string;\n ethAmount: BigNumber;\n nftId: BigNumber;\n readyAt: string;\n}\n\nexport interface WithdrawResult extends Result {\n /** Parsed WithdrawRequested event, if present */\n withdrawRequested?: WithdrawRequestedEvent;\n}\n\n\nexport interface StakedEvent {\n user: string;\n amountLiq: BigNumber;\n shares: BigNumber;\n tokenId: BigNumber;\n}\n\nexport interface StakedResult extends Result {\n /** Parsed Staked event, if present */\n staked?: StakedEvent;\n}\n\n\nexport interface WithdrawnStakeEvent {\n user: string;\n tokenId: BigNumber;\n tokenOut: BigNumber;\n}\nexport interface WithdrawnStakeResult extends Result {\n /** Parsed WithdrawnStake event, if present */\n withdrawnstake?: WithdrawnStakeEvent;\n\n}\n\nexport interface SharesBurnedEvent {\n from: string;\n shares: BigNumber;\n tokenValue: BigNumber;\n}\n\nexport interface preLaunchReceipt {\n tokenId: bigint;\n receipt: {\n account: string,\n currency: number,\n kind: number,\n indexAtMint: BalanceView,\n principal: BalanceView,\n shares: BalanceView,\n timestamp: string,\n }\n}"],"names":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","getAssociatedTokenAddress","tx","BPS","growOnce","shrinkOnce","Keypair","AnchorProvider","createAssociatedTokenAccountInstruction","SolPubKey","KeyType","Connection","DepositClient","SolChainID","ethers","Contract","BigNumber","tokenId","EvmChainID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"stake.js","sources":["../src/networks/solana/constants.ts","../src/networks/solana/program.ts","../src/networks/solana/clients/deposit.client.ts","../src/networks/solana/clients/distribution.client.ts","../src/networks/solana/clients/leaderboard.client.ts","../src/networks/solana/utils.ts","../src/networks/solana/clients/outpost.client.ts","../src/networks/solana/clients/token.client.ts","../src/networks/solana/solana.ts","../src/networks/ethereum/contract.ts","../src/networks/ethereum/utils.ts","../src/networks/ethereum/clients/deposit.client.ts","../src/networks/ethereum/clients/stake.client.ts","../src/networks/ethereum/clients/pretoken.client.ts","../src/networks/ethereum/clients/liq.client.ts","../src/networks/ethereum/ethereum.ts","../src/staker.ts","../src/networks/ethereum/types.ts"],"sourcesContent":["// src/networks/solana/constants.ts\nimport { PublicKey, StakeProgram } from '@solana/web3.js';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport liqSolTokenIDL from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardIDL from '../../assets/solana/idl/validator_leaderboard.json';\nimport transferHookIDL from '../../assets/solana/idl/transfer_hook.json';\n\n/**\n * ---------------------------------------------------------------------------\n * PROGRAM IDS\n * ---------------------------------------------------------------------------\n *\n * These should match:\n * - `metadata.address` in your Anchor IDLs under src/assets/solana/idl/*.json\n * - The program IDs printed by your deploy scripts\n */\nexport const PROGRAM_IDS = {\n LIQSOL_CORE: new PublicKey(liqsolCoreIDL.address),\n LIQSOL_TOKEN: new PublicKey(liqSolTokenIDL.address),\n VALIDATOR_LEADERBOARD: new PublicKey(validatorLeaderboardIDL.address),\n TRANSFER_HOOK: new PublicKey(transferHookIDL.address),\n} as const;\n\nexport const {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n VALIDATOR_LEADERBOARD,\n TRANSFER_HOOK,\n} = PROGRAM_IDS;\n\n/**\n * ---------------------------------------------------------------------------\n * PDA SEEDS (must match on-chain programs)\n * ---------------------------------------------------------------------------\n */\n\nexport const PDA_SEEDS = {\n // liqsol_core: deposit / stake controller\n DEPOSIT_AUTHORITY: 'deposit_authority',\n VAULT: 'vault',\n RESERVE_POOL: 'reserve_pool',\n STAKE_CONTROLLER_STATE: 'stake_controller',\n PAYOUT_STATE: 'payout_state',\n\n // liqsol_token: mint + bucket\n LIQSOL_MINT: 'liqsol_mint',\n LIQSOL_MINT_AUTHORITY: 'mint_authority',\n BUCKET_AUTHORITY: 'liqsol_bucket',\n\n // distribution program (embedded in liqsol_core)\n DISTRIBUTION_STATE: 'distribution_state',\n // NOTE: in the current IDL, userRecord is keyed by the USER (wallet), not ATA\n USER_RECORD: 'user_record',\n\n // pay-rate / price history\n PAY_RATE_HISTORY: 'pay_rate_history',\n PRICE_HISTORY: 'price_history',\n\n // validator leaderboard (state + records)\n LEADERBOARD_STATE: 'leaderboard_state',\n VALIDATOR_RECORD: 'validator',\n GLOBAL_STAKE_INFO: 'global_stake_info',\n\n // Outpost / Wire pretokens\n OUTPOST_GLOBAL_STATE: 'outpost_global_state',\n LIQSOL_POOL: 'liqsol_pool',\n OUTPOST_ACCOUNT: 'outpost_account',\n USER_PRETOKEN_RECORD: 'user_pretoken_record',\n TRANCHE_STATE: 'tranche_state',\n\n // BAR module (bonded actor roles)\n BAR_STATE_SEED: 'bar_state',\n BONDED_ACTOR_SEED: 'bonded_actor',\n BOND_LEVEL_SEED: 'bond_level',\n\n // SPL transfer-hook extra account metas\n EXTRA_ACCOUNT_METAS: 'extra-account-metas',\n\n // Withdraw module / receipts\n WITHDRAW_GLOBAL: 'global',\n STAKE_ALLOCATION_STATE: 'stake_allocation_state',\n STAKE_METRICS: 'stake_metrics',\n MAINTENANCE_LEDGER: 'maintenance_ledger',\n WITHDRAW_MINT_AUTHORITY: 'mint_authority',\n MINT_METADATA: 'mint_metadata',\n LIQ_RECEIPT_DATA: 'liq_receipt_data',\n WITHDRAW_MINT: 'mint',\n} as const;\n\n/**\n * ---------------------------------------------------------------------------\n * CORE / DISTRIBUTION / DEPOSIT PDAS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLiqsolMintPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveLiqsolMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_MINT_AUTHORITY)],\n LIQSOL_TOKEN,\n )[0];\n\nexport const deriveDepositAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DEPOSIT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveReservePoolPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.RESERVE_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeControllerStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_CONTROLLER_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayoutStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAYOUT_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBucketAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BUCKET_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveDistributionStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.DISTRIBUTION_STATE)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * user_record PDA\n *\n * In the current liqsol_core IDL, this is keyed by USER (wallet),\n * not by token account.\n */\nexport const deriveUserRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePayRateHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PAY_RATE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * WITHDRAW MODULE / RECEIPTS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveWithdrawGlobalPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_GLOBAL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeAllocationStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_ALLOCATION_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveStakeMetricsPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.STAKE_METRICS)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveMaintenanceLedgerPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MAINTENANCE_LEDGER)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT_AUTHORITY)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveWithdrawMintMetadataPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.MINT_METADATA)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * NFT mint for withdrawal receipt, derived from nextReceiptId.\n */\nexport const deriveWithdrawNftMintPda = (receiptId: bigint | number) => {\n const receiptIdBytes = Buffer.alloc(8);\n // receiptId comes in as BN or bigint upstream → normalize\n const asBigInt =\n typeof receiptId === 'bigint'\n ? receiptId\n : BigInt(receiptId.toString());\n receiptIdBytes.writeBigUInt64LE(asBigInt);\n return PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.WITHDRAW_MINT), receiptIdBytes],\n LIQSOL_CORE,\n )[0];\n};\n\nexport const deriveLiqReceiptDataPda = (nftMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQ_RECEIPT_DATA), nftMint.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * VALIDATOR LEADERBOARD\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveLeaderboardStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LEADERBOARD_STATE)],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveValidatorRecordPda = (voteAccount: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VALIDATOR_RECORD), voteAccount.toBuffer()],\n VALIDATOR_LEADERBOARD,\n )[0];\n\nexport const deriveStakeControllerVaultPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.VAULT)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * ---------------------------------------------------------------------------\n * OUTPOST / PRETOKENS\n * ---------------------------------------------------------------------------\n */\n\nexport const deriveOutpostGlobalStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_GLOBAL_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostPoolAuthorityPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.LIQSOL_POOL)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveOutpostAccountPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.OUTPOST_ACCOUNT), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveUserPretokenRecordPda = (user: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.USER_PRETOKEN_RECORD), user.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveTrancheStatePda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.TRANCHE_STATE)],\n LIQSOL_CORE,\n )[0];\n\nexport const derivePriceHistoryPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.PRICE_HISTORY)],\n LIQSOL_CORE,\n )[0];\n\n/**\n * BAR (bonded actor roles)\n */\n\nexport const deriveBarConfigPda = () =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BAR_STATE_SEED)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondLevelPda = (bondLevelId: number[]) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BOND_LEVEL_SEED), Buffer.from(bondLevelId)],\n LIQSOL_CORE,\n )[0];\n\nexport const deriveBondedActorPda = (actor: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.BONDED_ACTOR_SEED), actor.toBuffer()],\n LIQSOL_CORE,\n )[0];\n\n/**\n * SPL Transfer-hook: extra-account-metas PDA for the liqSOL mint.\n */\nexport const deriveExtraAccountMetaListPda = (liqsolMint: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [Buffer.from(PDA_SEEDS.EXTRA_ACCOUNT_METAS), liqsolMint.toBuffer()],\n PROGRAM_IDS.TRANSFER_HOOK,\n )[0];\n\n/**\n * Ephemeral stake account address used per-deposit.\n * On-chain convention: seed = `ephemeral_<u32>` under StakeProgram.programId.\n */\nexport const deriveEphemeralStakeAddress = async (\n user: PublicKey,\n seed: number,\n): Promise<PublicKey> => {\n const seedStr = `ephemeral_${seed}`;\n return PublicKey.createWithSeed(user, seedStr, StakeProgram.programId);\n};\n\n/**\n * Constant keys (Chainlink)\n */\nexport const CHAINLINK_FEED = new PublicKey(\n '99B2bTijsU6f1GCT73HmdR7HCFFjGMBcPZY6jZ96ynrR',\n);\nexport const CHAINLINK_PROGRAM = new PublicKey(\n 'HEvSKofvBgfaexv23kMabbYqxasxU3mQ4ibBMEmJWHny',\n);\n\n/**\n * ---------------------------------------------------------------------------\n * ECONOMICS & MATH CONSTANTS\n * ---------------------------------------------------------------------------\n */\n\n// Same scale factor used on-chain for pay-rate math\nexport const PAY_RATE_SCALE_FACTOR = BigInt(1_000_000_000_000); // 10^12\n\n// Default pay rate fallback used in tests & utils\nexport const DEFAULT_AVERAGE_PAY_RATE = BigInt(191_780_821);\n\n// How many history entries to average when computing expected fee\nexport const DEFAULT_PAY_RATE_LOOKBACK = 5;\n\n// Rent exemption for ephemeral stake account (lamports)\nexport const EPHEMERAL_RENT_EXEMPTION = 2_282_880;\n\n// For convenience: lamports <-> SOL helpers (no RPC dependency)\nexport const LAMPORTS_PER_SOL = 1_000_000_000;\n\nexport const INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\n\nexport const lamportsToSol = (lamports: number | bigint): number =>\n Number(lamports) / LAMPORTS_PER_SOL;\n\nexport const solToLamports = (sol: number): bigint =>\n BigInt(Math.round(sol * LAMPORTS_PER_SOL));","import { AnchorProvider, Program } from '@coral-xyz/anchor';\n\nimport liqsolCoreJson from '../../assets/solana/idl/liqsol_core.json';\nimport liqsolTokenJson from '../../assets/solana/idl/liqsol_token.json';\nimport validatorLeaderboardJson from '../../assets/solana/idl/validator_leaderboard.json';\n\nimport type { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport type { LiqsolToken } from '../../assets/solana/types/liqsol_token';\nimport type { ValidatorLeaderboard } from '../../assets/solana/types/validator_leaderboard';\n\nimport { PROGRAM_IDS } from './constants';\n\ntype Entry<IDL> = {\n idl: IDL & { address: string };\n address: string;\n};\n\nconst PROGRAMS = {\n liqsolCore: {\n idl: liqsolCoreJson,\n address: PROGRAM_IDS.LIQSOL_CORE.toBase58(),\n } as Entry<LiqsolCore>,\n liqsolToken: {\n idl: liqsolTokenJson,\n address: PROGRAM_IDS.LIQSOL_TOKEN.toBase58(),\n } as Entry<LiqsolToken>,\n validatorLeaderboard: {\n idl: validatorLeaderboardJson,\n address: PROGRAM_IDS.VALIDATOR_LEADERBOARD.toBase58(),\n } as Entry<ValidatorLeaderboard>,\n} as const;\n\nexport type SolanaProgramName = keyof typeof PROGRAMS;\n\nexport class SolanaProgramService {\n constructor(private provider: AnchorProvider) { }\n\n getProgram<K extends SolanaProgramName>(name: K): Program<(typeof PROGRAMS)[K]['idl']> {\n const { idl, address } = PROGRAMS[name];\n const idlWithAddr = { ...idl, address };\n return new Program(idlWithAddr, this.provider) as Program<(typeof PROGRAMS)[K]['idl']>;\n }\n\n listProgramNames(): SolanaProgramName[] {\n return Object.keys(PROGRAMS) as SolanaProgramName[];\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n SystemProgram,\n Transaction,\n TransactionInstruction,\n StakeProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_CLOCK_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n SYSVAR_STAKE_HISTORY_PUBKEY,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n PROGRAM_IDS,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveReservePoolPda,\n deriveVaultPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n derivePayRateHistoryPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n deriveEphemeralStakeAddress,\n deriveWithdrawGlobalPda,\n deriveStakeAllocationStatePda,\n deriveStakeMetricsPda,\n deriveMaintenanceLedgerPda,\n deriveWithdrawMintAuthorityPda,\n deriveWithdrawMintMetadataPda,\n deriveWithdrawNftMintPda,\n deriveLiqReceiptDataPda,\n} from '../constants';\nimport { WalletLike } from '../types';\n\nexport class DepositClient {\n private program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n /**\n * Build a deposit transaction:\n * SOL -> liqSOL via liqsol_core::deposit.\n */\n async buildDepositTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<Transaction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildDepositTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildDepositTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // PDAs\n // -------------------------------------------------------------\n const depositAuthority = deriveDepositAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const liqsolMintAuthority = deriveLiqsolMintAuthorityPda();\n const reservePool = deriveReservePoolPda();\n const vault = deriveVaultPda();\n const controllerState = deriveStakeControllerStatePda();\n const payoutState = derivePayoutStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const payRateHistory = derivePayRateHistoryPda();\n\n // -------------------------------------------------------------\n // Token-2022 ATAs\n // -------------------------------------------------------------\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Distribution state + user_record (KEYED BY TOKEN ACCOUNT)\n // -------------------------------------------------------------\n const distributionState = deriveDistributionStatePda();\n const userRecord = deriveUserRecordPda(userAta);\n\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // Ephemeral stake\n // -------------------------------------------------------------\n const seed = Math.floor(Math.random() * 2 ** 32);\n const ephemeralStake = await deriveEphemeralStakeAddress(user, seed);\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .deposit(new BN(amount.toString()), seed)\n .accounts({\n user,\n depositAuthority,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n liqsolProgram: PROGRAM_IDS.LIQSOL_TOKEN,\n stakeProgram: StakeProgram.programId,\n\n liqsolMint,\n userAta,\n liqsolMintAuthority,\n reservePool,\n vault,\n ephemeralStake,\n\n controllerState,\n payoutState,\n bucketAuthority,\n bucketTokenAccount,\n\n userRecord,\n distributionState,\n payRateHistory,\n\n instructionsSysvar: SYSVAR_INSTRUCTIONS_PUBKEY,\n clock: SYSVAR_CLOCK_PUBKEY,\n stakeHistory: SYSVAR_STAKE_HISTORY_PUBKEY,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n\n /**\n * Build a withdraw-request transaction:\n * liqSOL -> SOL via liqsol_core::requestWithdraw.\n *\n * This:\n * - burns liqSOL from the user\n * - increments totalEncumberedFunds in global state\n * - mints an NFT receipt (liqReceiptData + NFT ATA for owner)\n */\n async buildWithdrawTx(\n amount: bigint,\n user = this.wallet.publicKey,\n ): Promise<Transaction> {\n if (!user) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: wallet not connected',\n );\n }\n if (!amount || amount <= BigInt(0)) {\n throw new Error(\n 'DepositClient.buildWithdrawTx: amount must be greater than zero.',\n );\n }\n\n // -------------------------------------------------------------\n // Core program + liqSOL mint / user ATA\n // -------------------------------------------------------------\n const liqsolMint = deriveLiqsolMintPda();\n\n const userAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Distribution / balance-tracking\n // user_record is keyed by the user’s liqSOL ATA (same convention as deposit/purchase)\n const userRecord = deriveUserRecordPda(userAta);\n const distributionState = deriveDistributionStatePda();\n\n // Reserve + stake controller PDAs\n const global = deriveWithdrawGlobalPda();\n const reservePool = deriveReservePoolPda();\n const stakeAllocationState = deriveStakeAllocationStatePda();\n const stakeMetrics = deriveStakeMetricsPda();\n const maintenanceLedger = deriveMaintenanceLedgerPda();\n\n // -------------------------------------------------------------\n // Need nextReceiptId from withdraw global state\n // -------------------------------------------------------------\n const globalState = await this.program.account.global.fetch(global);\n const receiptId = (globalState.nextReceiptId as BN).toBigInt();\n\n // -------------------------------------------------------------\n // NFT receipt PDAs (mint, metadata, data, ATA)\n // -------------------------------------------------------------\n const mintAuthority = deriveWithdrawMintAuthorityPda();\n const metadata = deriveWithdrawMintMetadataPda();\n\n const nftMint = deriveWithdrawNftMintPda(receiptId);\n const receiptData = deriveLiqReceiptDataPda(nftMint);\n\n const owner = user;\n const nftAta = getAssociatedTokenAddressSync(\n nftMint,\n owner,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // Bucket token account (same bucket used by deposit/distribution)\n const bucketAuthority = deriveBucketAuthorityPda();\n const bucketTokenAccount = getAssociatedTokenAddressSync(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // -------------------------------------------------------------\n // BUILD IX (MUST MATCH requestWithdraw IDL)\n // -------------------------------------------------------------\n const ix: TransactionInstruction = await this.program.methods\n .requestWithdraw(new BN(amount.toString()))\n .accounts({\n user,\n owner,\n global,\n liqsolMint,\n userAta,\n userRecord,\n reservePool,\n stakeAllocationState,\n stakeMetrics,\n maintenanceLedger,\n clock: SYSVAR_CLOCK_PUBKEY,\n mintAuthority,\n receiptData,\n metadata,\n nftMint,\n nftAta,\n distributionState,\n bucketTokenAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n tokenInterface: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n })\n .instruction();\n\n return new Transaction().add(ix);\n }\n}","import { AnchorProvider, Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\nimport {\n deriveDistributionStatePda,\n deriveLiqsolMintPda,\n deriveUserRecordPda,\n} from '../constants';\nimport type { DistributionState, DistributionUserRecord } from '../types';\nimport { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token';\n\n/**\n * Distribution client – wraps the distribution portion of the liqsol_core\n * program in the *new* shares-only model.\n *\n * Responsibilities:\n * - Read DistributionState (global index/share pool)\n * - Read per-user UserRecord (shares)\n * - Provide simple helpers for querying user share positions\n *\n * There is no longer any notion of:\n * - tracked vs actual balances\n * - mismatch candidates\n * - updateUser / correct-&-register flow\n *\n * On-chain truth:\n * - User balances live in their liqSOL ATA.\n * - DistributionState + UserRecord track *shares* for yield.\n */\nexport class DistributionClient {\n private program: Program<LiqsolCore>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n /**\n * Fetch the global distribution state account.\n *\n * IDL account name: \"distributionState\"\n */\n async getDistributionState(): Promise<DistributionState | null> {\n const pda = deriveDistributionStatePda();\n try {\n return await this.program.account.distributionState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch a user's distribution userRecord (or null if missing).\n *\n * IDL account name: \"userRecord\"\n */\n async getUserRecord(\n ownerOrAta: PublicKey,\n ): Promise<DistributionUserRecord | null> {\n const liqsolMint = deriveLiqsolMintPda();\n\n // 1) Try treating ownerOrAta as a WALLET: derive its liqSOL ATA, then userRecord.\n try {\n const ata = getAssociatedTokenAddressSync(\n liqsolMint,\n ownerOrAta,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pdaFromWallet = deriveUserRecordPda(ata);\n const recFromWallet =\n await this.program.account.userRecord.fetchNullable(pdaFromWallet);\n if (recFromWallet) {\n return recFromWallet;\n }\n } catch {\n // fall through\n }\n\n // 2) Fallback: treat ownerOrAta as already being the TOKEN ACCOUNT.\n try {\n const pdaFromAta = deriveUserRecordPda(ownerOrAta);\n return await this.program.account.userRecord.fetchNullable(pdaFromAta);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience: get the user's current distribution shares.\n *\n * Returns BN(0) if the user has no userRecord yet.\n */\n async getUserShares(user: PublicKey): Promise<BN> {\n const record = await this.getUserRecord(user);\n return record ? record.shares : new BN(0);\n }\n\n /**\n * Convenience: get both the user's shares and totalShares, plus a\n * floating-point ratio (userShares / totalShares).\n *\n * NOTE: ratio is a JS number and may lose precision for very large values,\n * but is fine for display / percentage UIs.\n */\n async getUserSharePosition(user: PublicKey): Promise<{\n shares: BN;\n totalShares: BN;\n ratio: number;\n }> {\n const [dist, userShares] = await Promise.all([\n this.getDistributionState(),\n this.getUserShares(user),\n ]);\n\n const totalShares = dist ? dist.totalShares : new BN(0);\n\n let ratio = 0;\n if (!totalShares.isZero()) {\n // use toNumber() for UI-friendly ratio; if you need exact math,\n // do it with BN or bigint at the call site instead.\n ratio = userShares.toNumber() / totalShares.toNumber();\n }\n\n return { shares: userShares, totalShares, ratio };\n }\n}","import { AnchorProvider, Program } from '@coral-xyz/anchor';\nimport { PublicKey } from '@solana/web3.js';\n\nimport { SolanaProgramService } from '../program';\nimport type { ValidatorLeaderboard } from '../../../assets/solana/types/validator_leaderboard';\nimport {\n deriveLeaderboardStatePda,\n deriveValidatorRecordPda,\n} from '../constants';\nimport { LeaderboardState, ValidatorRecord } from '../types';\n\n/**\n * Simple read client for the validator_leaderboard program.\n *\n * Adjust account names/fields to match your IDL (state, validatorRecord, etc).\n */\nexport class LeaderboardClient {\n private program: Program<ValidatorLeaderboard>;\n\n constructor(private provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('validatorLeaderboard');\n }\n\n async getState(): Promise<LeaderboardState | null> {\n const pda = deriveLeaderboardStatePda();\n try {\n // Assumes account name \"leaderboardState\"\n return await this.program.account.leaderboardState.fetch(pda);\n } catch {\n return null;\n }\n }\n\n async getValidatorRecord(voteAccount: PublicKey): Promise<ValidatorRecord | null> {\n const pda = deriveValidatorRecordPda(voteAccount);\n try {\n // Assumes account name \"validatorRecord\"\n return await this.program.account.validatorRecord.fetchNullable(pda);\n } catch {\n return null;\n }\n }\n\n /**\n * Convenience helper to fetch and return top validators ordered\n * by the on-chain leaderboard scores.\n *\n * Uses:\n * - `leaderboardState.scores`\n * - `leaderboardState.sortedIndices`\n * - `validatorRecord.registryIndex`\n *\n * Fallback: if leaderboardState can't be fetched, we sort by\n * `creditsObserved` descending.\n */\n async getTopValidators(limit = 20): Promise<ValidatorRecord[]> {\n // Try to use the leaderboard state first\n try {\n const leaderboardPda = deriveLeaderboardStatePda();\n const leaderboard: LeaderboardState \n = await this.program.account.leaderboardState.fetch(leaderboardPda);\n\n const all = await this.program.account.validatorRecord.all();\n const byIndex = new Map<number, ValidatorRecord>();\n\n for (const r of all) {\n const vr = r.account;\n byIndex.set(vr.registryIndex, vr);\n }\n\n const max = Math.min(\n limit,\n leaderboard.numValidators,\n leaderboard.sortedIndices.length,\n );\n\n const top: ValidatorRecord[] = [];\n for (let i = 0; i < max; i++) {\n const idx = leaderboard.sortedIndices[i];\n const rec = byIndex.get(idx);\n if (rec) {\n top.push(rec);\n }\n }\n\n return top;\n } catch (e) {\n // Fallback: no leaderboardState available, sort by creditsObserved.\n const all = await this.program.account.validatorRecord.all();\n\n all.sort((a, b) => {\n const va = a.account;\n const vb = b.account;\n const ca = va.creditsObserved;\n const cb = vb.creditsObserved;\n // BN.cmp: -1 if a < b, 0 if equal, 1 if a > b\n return cb.cmp(ca);\n });\n\n return all.slice(0, limit).map(r => r.account);\n }\n }\n}","import { Program, BN, AnchorProvider } from '@coral-xyz/anchor';\n\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n StakeProgram,\n} from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n} from '@solana/spl-token';\n\nimport {\n LIQSOL_CORE,\n LIQSOL_TOKEN,\n PAY_RATE_SCALE_FACTOR,\n DEFAULT_AVERAGE_PAY_RATE,\n EPHEMERAL_RENT_EXEMPTION,\n LAMPORTS_PER_SOL,\n lamportsToSol,\n solToLamports,\n deriveDepositAuthorityPda,\n deriveLiqsolMintPda,\n deriveLiqsolMintAuthorityPda,\n deriveVaultPda,\n deriveReservePoolPda,\n deriveStakeControllerStatePda,\n derivePayoutStatePda,\n deriveBucketAuthorityPda,\n deriveDistributionStatePda,\n deriveUserRecordPda,\n derivePayRateHistoryPda,\n deriveStakeControllerVaultPda,\n deriveEphemeralStakeAddress,\n DEFAULT_PAY_RATE_LOOKBACK,\n deriveOutpostGlobalStatePda,\n deriveOutpostPoolAuthorityPda,\n deriveOutpostAccountPda,\n deriveTrancheStatePda,\n deriveUserPretokenRecordPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n deriveExtraAccountMetaListPda,\n} from './constants';\n\nimport liqsolCoreIDL from '../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../assets/solana/types/liqsol_core';\nimport { GlobalState, TrancheState } from './types';\nimport { TrancheLadderItem, TrancheSnapshot } from '../../types';\nimport { ChainID } from '@wireio/core';\n\n// -----------------------------------------------------------------------------\n// Tranche Support\n// -----------------------------------------------------------------------------\n\nconst INDEX_SCALE = BigInt(1_000_000_000_000); // 1e12\nconst USD_SCALE = BigInt(100_000_000); // 1e8\nconst BPS = BigInt(10_000);\n\n/** BN | bigint -> bigint helper (keeps code readable) */\nexport function toBigint(x: any): bigint {\n if (typeof x === 'bigint') return x;\n if (typeof x === 'number') return BigInt(x);\n // Anchor BN\n return BigInt(x.toString());\n}\n\n/**\n * Convert token amount -> shares using the same rule as on-chain tests:\n * shares = ceil(amount * INDEX_SCALE / currentIndex)\n */\nexport function tokensToShares(amount: bigint, currentIndex: bigint): bigint {\n if (amount === BigInt(0)) return BigInt(0);\n const num = amount * INDEX_SCALE;\n const q = num / currentIndex;\n const r = num % currentIndex;\n return r === BigInt(0) ? q : q + BigInt(1);\n}\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n * Rules (from liqsol_core tests):\n * - past tranches are fully sold\n * - current tranche has (initial - currentSupply) sold\n * - future tranches start with 0 sold\n * - supply/price grow by supplyGrowthBps/priceGrowthBps per tranche\n */\nexport function buildSolanaTrancheLadder(options: {\n currentTranche: number;\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, initialTrancheSupply);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport function buildSolanaTrancheSnapshot(options: {\n chainID: ChainID;\n globalState: GlobalState;\n trancheState: TrancheState;\n solPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): TrancheSnapshot {\n const {\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n } = options;\n\n const currentIndex = toBigint(globalState.currentIndex);\n const totalShares = toBigint(globalState.totalShares);\n const currentTranche = trancheState.currentTrancheNumber.toNumber();\n const currentTrancheSupply = toBigint(trancheState.currentTrancheSupply);\n const initialTrancheSupply = toBigint(trancheState.initialTrancheSupply);\n const totalPretokensSold = toBigint(trancheState.totalPretokensSold);\n const currentPriceUsd = toBigint(trancheState.currentTranchePriceUsd);\n const supplyGrowthBps = trancheState.supplyGrowthBps;\n const priceGrowthBps = trancheState.priceGrowthBps;\n\n const ladder = buildSolanaTrancheLadder({\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n totalPretokensSold,\n currentTrancheSupply,\n initialTrancheSupply,\n nativePriceUsd: solPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n\n\n// -----------------------------------------------------------------------------\n// Read-only liqsol_core Program helper\n// -----------------------------------------------------------------------------\n\nlet _liqsolCoreProgram: Program<LiqsolCore> | null = null;\n\nexport function getLiqsolCoreProgram(\n connection: Connection,\n): Program<LiqsolCore> {\n if (_liqsolCoreProgram && _liqsolCoreProgram.provider.connection === connection) {\n return _liqsolCoreProgram;\n }\n\n // Dummy wallet – we're only doing read-only account fetches here.\n const tmpKeypair = Keypair.generate();\n const wallet: any = {\n publicKey: tmpKeypair.publicKey,\n signAllTransactions: async () => [],\n signTransaction: async () => tmpKeypair,\n };\n\n const provider = new AnchorProvider(connection, wallet, {\n commitment: 'confirmed',\n });\n\n const program = new Program(\n liqsolCoreIDL,\n provider,\n ) as Program<LiqsolCore>;\n\n _liqsolCoreProgram = program;\n return program;\n}\n\n\n// -----------------------------------------------------------------------------\n// Balance + state getters (UI-friendly)\n// -----------------------------------------------------------------------------\n\nexport async function getUserLiqSolBalance(\n connection: Connection,\n user: PublicKey,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount); // raw lamports, not decimals-adjusted\n } catch {\n return 0;\n }\n}\n\nexport async function getBucketLiqSolBalance(\n connection: Connection,\n): Promise<number> {\n const liqsolMint = deriveLiqsolMintPda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const ata = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n try {\n const bal = await connection.getTokenAccountBalance(ata);\n return Number(bal.value.amount);\n } catch {\n return 0;\n }\n}\n\nexport async function getReservePoolBalance(\n connection: Connection,\n): Promise<number> {\n const reservePool = deriveReservePoolPda();\n try {\n const lamports = await connection.getBalance(reservePool);\n return lamports;\n } catch {\n return 0;\n }\n}\n\n/**\n * Raw account info for the stake_controller state (Anchor decode is left\n * to the caller so the SDK can stay IDL-agnostic at this layer).\n */\nexport async function getStakeControllerStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = deriveStakeControllerStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for the payout-state account.\n */\nexport async function getPayoutStateRaw(\n connection: Connection,\n): Promise<Uint8Array | null> {\n const pda = derivePayoutStatePda();\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n/**\n * Raw account info for a user's distribution user_record.\n *\n * NOTE: user_record is keyed by the TOKEN ACCOUNT (ATA), not the wallet.\n * Here we derive the user's liqSOL ATA and then its user_record PDA.\n */\nexport async function getUserRecordRaw(\n connection: Connection,\n user: PublicKey,\n): Promise<Uint8Array | null> {\n const liqsolMint = deriveLiqsolMintPda();\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n const pda = deriveUserRecordPda(userAta);\n const info = await connection.getAccountInfo(pda);\n return info?.data ?? null;\n}\n\n\n// -----------------------------------------------------------------------------\n// Pay-rate & fee utilities (on-chain compatible)\n// -----------------------------------------------------------------------------\n\nexport async function getAveragePayRate(\n connection: Connection,\n lookback: number = DEFAULT_PAY_RATE_LOOKBACK,\n): Promise<bigint> {\n const program = getLiqsolCoreProgram(connection);\n const payRateHistoryPda = derivePayRateHistoryPda();\n\n try {\n const anyProgram = program;\n const payRateHistoryAccount = await anyProgram.account.payRateHistory.fetch(\n payRateHistoryPda,\n );\n\n const entries = payRateHistoryAccount.entries ?? [];\n const totalEntriesAdded = Number(\n payRateHistoryAccount.totalEntriesAdded ?? 0,\n );\n const currentIndex: number = payRateHistoryAccount.currentIndex ?? 0;\n const maxEntries: number =\n payRateHistoryAccount.maxEntries ?? entries.length;\n\n if (!entries.length) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n const entriesToFetch = Math.min(lookback, maxEntries, entries.length);\n\n let idx: number;\n if (totalEntriesAdded === 0) {\n idx = 0;\n } else if (currentIndex === 0) {\n idx = maxEntries - 1;\n } else {\n idx = currentIndex - 1;\n }\n\n let sum = BigInt(0);\n let validCount = BigInt(0);\n\n for (let i = 0; i < entriesToFetch; i++) {\n const entry = entries[idx];\n if (entry && typeof entry.scaledRate !== 'undefined') {\n const rate = BigInt(entry.scaledRate.toString());\n if (rate > BigInt(0)) {\n sum += rate;\n validCount += BigInt(1);\n }\n }\n\n if (totalEntriesAdded === 0) {\n idx = (idx + 1) % maxEntries;\n } else {\n idx = idx === 0 ? maxEntries - 1 : idx - 1;\n }\n }\n\n if (validCount === BigInt(0)) {\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n\n return sum / validCount;\n } catch (err) {\n // Fallback to default when history missing/unavailable\n return DEFAULT_AVERAGE_PAY_RATE;\n }\n}\n\n/**\n * On-chain fee formula:\n * fee = (average_pay_rate * 4 * deposit_amount_lamports) / 10^12\n */\nexport function calculateExpectedFee(\n depositAmountLamports: BN,\n averagePayRate: BN,\n): BN {\n return averagePayRate\n .mul(new BN(4))\n .mul(depositAmountLamports)\n .div(new BN(1_000_000_000_000)); // 10^12\n}\n\n/**\n * Convenience helper to preview how a deposit splits between user + bucket\n * and how much goes into the reserve, assuming the simple model:\n *\n * - userLiqSol = amount - fee + EPHEMERAL_RENT_EXEMPTION\n * - bucketLiqSol = fee\n * - reserveLamports = amount + EPHEMERAL_RENT_EXEMPTION\n */\nexport function previewDepositEffects(params: {\n depositAmountLamports: BN;\n averagePayRate: BN;\n rentExemptionLamports?: number;\n}): {\n feeLamports: BN;\n userLiqSolLamports: BN;\n bucketLiqSolLamports: BN;\n reserveIncreaseLamports: BN;\n} {\n const { depositAmountLamports, averagePayRate } = params;\n const rent = new BN(\n params.rentExemptionLamports ?? EPHEMERAL_RENT_EXEMPTION,\n );\n\n const fee = calculateExpectedFee(depositAmountLamports, averagePayRate);\n const userLiqSol = depositAmountLamports.sub(fee).add(rent);\n const bucketLiqSol = fee;\n const reserveIncrease = depositAmountLamports.add(rent);\n\n return {\n feeLamports: fee,\n userLiqSolLamports: userLiqSol,\n bucketLiqSolLamports: bucketLiqSol,\n reserveIncreaseLamports: reserveIncrease,\n };\n}\n\n/**\n * ---------------------------------------------------------------------------\n * Outpost-specific helpers\n * ---------------------------------------------------------------------------\n *\n * This is the SDK equivalent of `deriveWirePdas` in capital-staking tests.\n * It aggregates all PDAs / ATAs needed for Outpost pretokens + synd/desynd.\n */\nexport interface OutpostAccounts {\n user: PublicKey;\n\n // Outpost / pretoken wiring\n globalState: PublicKey;\n poolAuthority: PublicKey;\n liqsolMint: PublicKey;\n liqsolPoolAta: PublicKey;\n userAta: PublicKey;\n outpostAccount: PublicKey;\n userPretokenRecord: PublicKey;\n\n // Distribution / yield context (user_record keyed by token accounts)\n distributionState: PublicKey;\n bucketAuthority: PublicKey;\n bucketTokenAccount: PublicKey;\n bucketUserRecord: PublicKey;\n liqsolPoolUserRecord: PublicKey;\n userUserRecord: PublicKey;\n\n // Tranche / pricing\n trancheState: PublicKey;\n\n // Chainlink\n chainLinkFeed: PublicKey;\n chainLinkProgram: PublicKey;\n\n // Transfer hook extra accounts\n extraAccountMetaList: PublicKey;\n}\n\nexport async function buildOutpostAccounts(\n connection: Connection,\n user: PublicKey,\n): Promise<OutpostAccounts> {\n const globalState = deriveOutpostGlobalStatePda();\n const poolAuthority = deriveOutpostPoolAuthorityPda();\n const liqsolMint = deriveLiqsolMintPda();\n const distributionState = deriveDistributionStatePda();\n const bucketAuthority = deriveBucketAuthorityPda();\n const trancheState = deriveTrancheStatePda();\n\n // Outpost / pretoken PDAs\n const outpostAccount = deriveOutpostAccountPda(user);\n const userPretokenRecord = deriveUserPretokenRecordPda(user);\n\n // ATAs\n const liqsolPoolAta = await getAssociatedTokenAddress(\n liqsolMint,\n poolAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const bucketTokenAccount = await getAssociatedTokenAddress(\n liqsolMint,\n bucketAuthority,\n true,\n TOKEN_2022_PROGRAM_ID,\n );\n\n const userAta = await getAssociatedTokenAddress(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n );\n\n // user_record PDAs keyed by TOKEN ACCOUNTS (matches capital-staking)\n const bucketUserRecord = deriveUserRecordPda(bucketTokenAccount);\n const liqsolPoolUserRecord = deriveUserRecordPda(liqsolPoolAta);\n const userUserRecord = deriveUserRecordPda(userAta);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(liqsolMint);\n\n // Chainlink program feeds\n let chainLinkFeed = CHAINLINK_FEED;\n let chainLinkProgram = CHAINLINK_PROGRAM;\n\n try {\n const program = getLiqsolCoreProgram(connection);\n const ts: TrancheState =\n await program.account.trancheState.fetch(trancheState);\n\n // If on-chain config overrides are present, prefer those.\n if (ts.chainlinkFeed && ts.chainlinkProgram) {\n chainLinkFeed = ts.chainlinkFeed as PublicKey;\n chainLinkProgram = ts.chainlinkProgram as PublicKey;\n }\n } catch {\n // If trancheState isn't initialized yet, we fall back to the constants.\n // In that case, purchase instructions will still fail, which is the\n // correct behavior until admin initializes TrancheState on-chain.\n }\n\n void connection; // reserved for future extra validation\n\n return {\n user,\n globalState,\n poolAuthority,\n liqsolMint,\n liqsolPoolAta,\n userAta,\n outpostAccount,\n userPretokenRecord,\n distributionState,\n bucketAuthority,\n bucketTokenAccount,\n bucketUserRecord,\n liqsolPoolUserRecord,\n userUserRecord,\n trancheState,\n chainLinkFeed,\n chainLinkProgram,\n extraAccountMetaList\n };\n}\n// -----------------------------------------------------------------------------\n// Epoch / scheduling helpers\n// -----------------------------------------------------------------------------\n\nexport type EpochSnapshot = {\n epoch: number;\n slot: number;\n firstSlot: number;\n slotsInEpoch: number;\n slotMs: number;\n};\n\nexport async function getEpochSnapshot(\n connection: Connection,\n): Promise<EpochSnapshot> {\n const info = await connection.getEpochInfo();\n\n // Fallback slot time\n let slotTimeMs = Number(process.env.SLOT_TIME_MS_FALLBACK ?? 400);\n\n try {\n const samples = await connection.getRecentPerformanceSamples(16);\n if (samples.length) {\n const avgMs =\n samples.reduce(\n (acc, s) => acc + (s.samplePeriodSecs * 1000) / s.numSlots,\n 0,\n ) / samples.length;\n if (isFinite(avgMs) && avgMs > 0) {\n slotTimeMs = avgMs;\n }\n }\n } catch {\n // ignore; keep fallback\n }\n\n return {\n epoch: info.epoch,\n slot: info.slotIndex,\n firstSlot: info.absoluteSlot - info.slotIndex,\n slotsInEpoch: info.slotsInEpoch,\n slotMs: slotTimeMs,\n };\n}\n\nexport function msToEpochEnd(snapshot: EpochSnapshot): number {\n const remainingSlots = snapshot.slotsInEpoch - snapshot.slot;\n return remainingSlots * snapshot.slotMs;\n}\n\n/**\n * Generic \"execute around epoch boundaries\" helper:\n *\n * - If current progress is within [early, late], run immediately.\n * - If too early, sleep until `early` percentage into the epoch.\n * - If too late, sleep until `early` percentage into the *next* epoch.\n *\n * This is generic; you can wrap any instruction builder in here (including\n * deposit flows) without baking in program-specific logic.\n */\nexport async function scheduledInstruction<T>(\n connection: Connection,\n config: ScheduleConfig,\n instruction: () => Promise<T>,\n): Promise<T> {\n const early = config.early ?? 0.10;\n const late = config.late ?? 0.90;\n\n const snapshot = await getEpochSnapshot(connection);\n const progress = snapshot.slot / snapshot.slotsInEpoch;\n\n // Case 1: Already in safe zone\n if (progress >= early && progress <= late) {\n return instruction();\n }\n\n // Case 2: Early in epoch → wait until `early`\n if (progress < early) {\n const targetSlot = snapshot.slotsInEpoch * early;\n const slotsRemaining = targetSlot - snapshot.slot;\n const msToWait = slotsRemaining * snapshot.slotMs;\n\n console.log(\n `Epoch early (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(msToWait / 1000).toFixed(1)}s until ${early * 100\n }%...`,\n );\n\n await sleep(Math.max(1000, msToWait));\n return instruction();\n }\n\n // Case 3: Late in epoch → wait for next epoch + early window\n const msToNextEpoch = msToEpochEnd(snapshot);\n const earlyWaitTime = snapshot.slotsInEpoch * early * snapshot.slotMs;\n const totalWaitTime = msToNextEpoch + earlyWaitTime + 1000;\n\n console.log(\n `Epoch late (${(progress * 100).toFixed(\n 2,\n )}%). Sleeping ${(totalWaitTime / 1000).toFixed(\n 1,\n )}s until next epoch + ${early * 100}%...`,\n );\n\n await sleep(totalWaitTime);\n return instruction();\n}\n\n\n// -----------------------------------------------------------------------------\n// Generic helpers (used in tests + can be useful in apps)\n// -----------------------------------------------------------------------------\n\nexport function getErrorMessage(error: any): string {\n return (\n error?.error?.errorCode?.code ||\n error?.error?.errorMessage ||\n error?.message ||\n ''\n );\n}\n\nexport function generateRandomDepositAmount(\n minSol = 2,\n maxSol = 100,\n): BN {\n const randomSol = Math.random() * (maxSol - minSol) + minSol;\n return new BN(solToLamports(randomSol));\n}\n\nexport function generateTestKeypair(): Keypair {\n return Keypair.generate();\n}\n\nexport async function airdropSol(\n connection: Connection,\n publicKey: PublicKey,\n amountSol: number,\n): Promise<void> {\n const lamports = solToLamports(amountSol);\n const sig = await connection.requestAirdrop(publicKey, Number(lamports));\n await connection.confirmTransaction(sig, 'confirmed');\n}\n\nexport async function waitForConfirmation(\n connection: Connection,\n signature: string,\n): Promise<void> {\n await connection.confirmTransaction(signature, 'confirmed');\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Simple helper used in tests: wait until safe zone, no-op.\n */\nexport async function waitUntilSafeToExecuteFunction(\n connection: Connection,\n config: ScheduleConfig = {},\n): Promise<void> {\n await scheduledInstruction(connection, config, async () => {\n // no-op\n return;\n });\n}\n\nexport interface ScheduleConfig {\n early?: number; // fraction of epoch, default 0.10\n late?: number; // fraction of epoch, default 0.90\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport {\n PublicKey,\n SystemProgram,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport liqsolCoreIDL from '../../../assets/solana/idl/liqsol_core.json';\nimport { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n OutpostAccounts,\n buildOutpostAccounts,\n} from '../utils';\n\nimport {\n OutpostWireStateSnapshot,\n SharesPreview,\n TrancheState,\n WalletLike,\n} from '../types';\nimport { INDEX_SCALE, PROGRAM_IDS } from '../constants';\n\n/**\n * OutpostClient\n *\n * Read-only + preview helper for:\n * - Outpost config + per-user pretokens\n * - Tranche ladder snapshot\n * - Pretoken preview math\n *\n * Write helpers:\n * - buildStakeIx → liqsol_core::synd\n * - buildUnstakeIx → liqsol_core::desynd\n *\n * All PDAs / ATAs are sourced via buildOutpostAccounts, which is kept\n * in sync with the on-chain PDAs and capital-staking Wire utils.\n */\nexport class OutpostClient {\n private readonly program: Program<LiqsolCore>;\n\n constructor(\n private readonly provider: AnchorProvider,\n ) {\n this.program = new Program(liqsolCoreIDL as any, provider);\n }\n\n get connection() {\n return this.provider.connection;\n }\n\n get wallet(): WalletLike {\n return this.provider.wallet as unknown as WalletLike;\n }\n\n /**\n * Expose the raw Program in case callers need to build custom\n * instructions outside this client.\n */\n get liqsolCoreProgram(): Program<LiqsolCore> {\n return this.program;\n }\n\n /**\n * Build all outpost-related PDAs / ATAs for a given user.\n * Defaults to the connected wallet.\n */\n async buildAccounts(user?: PublicKey): Promise<OutpostAccounts> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildAccounts: wallet not connected');\n }\n return buildOutpostAccounts(this.connection, userPk);\n }\n\n /**\n * Internal helper: get raw token balance (BN) for a given ATA.\n */\n private async getTokenBalance(ata: PublicKey): Promise<BN> {\n try {\n const bal = await this.connection.getTokenAccountBalance(ata);\n return new BN(bal.value.amount);\n } catch {\n return new BN(0);\n }\n }\n\n /**\n * Fetch the core \"Wire state\" for Outpost / pretokens for a given user.\n */\n async fetchWireState(user?: PublicKey): Promise<OutpostWireStateSnapshot> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.fetchWireState: wallet not connected');\n }\n\n const pdas = await this.buildAccounts(userPk);\n\n const [\n globalState,\n outpostAccount,\n distributionState,\n userPretokenRecord,\n trancheState,\n ] = await Promise.all([\n this.program.account.globalState.fetch(pdas.globalState),\n this.program.account.outpostAccount.fetchNullable(pdas.outpostAccount),\n this.program.account.distributionState.fetchNullable(pdas.distributionState),\n this.program.account.userPretokenRecord.fetchNullable(pdas.userPretokenRecord),\n this.program.account.trancheState.fetchNullable(pdas.trancheState),\n ]);\n\n const [liqsolPoolBalance, userLiqsolBalance] = await Promise.all([\n this.getTokenBalance(pdas.liqsolPoolAta),\n this.getTokenBalance(pdas.userAta),\n ]);\n\n return {\n globalState,\n outpostAccount,\n distributionState,\n trancheState,\n userPretokenRecord,\n liqsolPoolBalance,\n userLiqsolBalance,\n };\n }\n\n // -------------------------------------------------------------------------\n // Outpost stake / unstake builders (synd / desynd)\n // -------------------------------------------------------------------------\n\n /**\n * Build the `synd` (stake) instruction:\n * user liqSOL ATA → liqSOL pool ATA\n */\n async buildStakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildStakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .synd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n /**\n * Build the `desynd` (unstake) instruction:\n * liqSOL pool ATA → user liqSOL ATA\n */\n async buildUnstakeIx(\n amountLamports: bigint,\n user?: PublicKey,\n ): Promise<TransactionInstruction> {\n const userPk = user ?? this.wallet.publicKey;\n if (!userPk) {\n throw new Error('OutpostClient.buildUnstakeIx: wallet not connected');\n }\n\n const a = await this.buildAccounts(userPk);\n\n return this.program.methods\n .desynd(new BN(amountLamports.toString()))\n .accounts({\n user: userPk,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n userAta: a.userAta,\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n senderUserRecord: a.liqsolPoolUserRecord,\n receiverUserRecord: a.userUserRecord,\n extraAccountMetaList: a.extraAccountMetaList,\n liqsolCoreProgram: PROGRAM_IDS.LIQSOL_CORE,\n transferHookProgram: PROGRAM_IDS.TRANSFER_HOOK,\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // -------------------------------------------------------------------------\n // Pretoken preview helper (unchanged)\n // -------------------------------------------------------------------------\n\n /**\n * Local preview for \"how many pretokens would I get for this liqSOL\n * amount at the current tranche price and SOL/USD price?\"\n *\n * SCALE = 1e8\n * usdValue = solAmountLamports * solPriceUsd / 1e9\n * pretokens = usdValue * SCALE / pretokenPriceUsd\n *\n * All values are BN integers; solPriceUsd and pretokenPriceUsd are 1e8 scaled.\n */\n previewPretokens(params: {\n liqsolAmountLamports: BN;\n solPriceUsd: BN; // 1e8 scale\n trancheState: TrancheState;\n }): SharesPreview {\n const { liqsolAmountLamports, solPriceUsd, trancheState } = params;\n\n // Current tranche price in USD (1e8 scale)\n const pretokenPriceUsd = new BN(\n trancheState.currentTranchePriceUsd.toString(),\n );\n\n const SCALE = new BN('100000000'); // 1e8\n\n // usdValue = (lamports * solPriceUsd) / 1e9\n const usdValue = liqsolAmountLamports\n .mul(solPriceUsd)\n .div(new BN(1_000_000_000));\n\n const estimatedPretokens = usdValue.mul(SCALE).div(pretokenPriceUsd);\n\n return {\n liqsolAmountLamports,\n solPriceUsd,\n pretokenPriceUsd,\n estimatedPretokens,\n };\n }\n\n /**\n * Convert liqSOL tokens (lamports) → Outpost “shares”, rounding UP\n * when there is any remainder.\n *\n * This matches the on-chain logic and the capital-staking helper:\n *\n * INDEX_SCALE = 1e12\n * numerator = amount * INDEX_SCALE\n * shares = numerator / currentIndex\n * remainder = numerator % currentIndex\n * if remainder > 0 → shares + 1\n */\n static tokensToShares(amount: BN, currentIndex: BN): BN {\n const numerator = amount.mul(INDEX_SCALE);\n const shares = numerator.div(currentIndex);\n const remainder = numerator.mod(currentIndex);\n return remainder.eqn(0) ? shares : shares.addn(1);\n }\n\n /**\n * Format a 1e8-scaled integer (e.g. USD price, pretokens, etc.)\n * into a fixed 8-decimal string.\n *\n * Examples:\n * 0 -> \"0.00000000\"\n * 1 -> \"0.00000001\"\n * 100000000 -> \"1.00000000\"\n * 123456789 -> \"1.23456789\"\n */\n static formatScale8(value: BN): string {\n const decimals = 8;\n const valueStr = value.toString();\n\n if (valueStr.length <= decimals) {\n const padding = '0'.repeat(decimals - valueStr.length);\n return `0.${padding}${valueStr}`;\n }\n\n const intPart = valueStr.slice(0, valueStr.length - decimals);\n const decPart = valueStr.slice(valueStr.length - decimals);\n return `${intPart}.${decPart}`;\n }\n}","import { AnchorProvider, BN, Program } from '@coral-xyz/anchor';\nimport type { TransactionInstruction, Connection } from '@solana/web3.js';\nimport { PublicKey, SystemProgram } from '@solana/web3.js';\nimport {\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n buildOutpostAccounts,\n type OutpostAccounts,\n} from '../utils';\n\nimport { SolanaProgramService } from '../program';\nimport type { LiqsolCore } from '../../../assets/solana/types/liqsol_core';\n\nimport {\n GlobalState,\n PriceHistory,\n TrancheState,\n WalletLike,\n OutpostAccount,\n UserPretokenRecord,\n} from '../types';\n\nimport {\n derivePriceHistoryPda,\n CHAINLINK_FEED,\n CHAINLINK_PROGRAM,\n PROGRAM_IDS,\n deriveExtraAccountMetaListPda,\n} from '../constants';\n\n\nexport class TokenClient {\n private readonly program: Program<LiqsolCore>;\n\n get wallet(): WalletLike {\n return this.provider.wallet;\n }\n\n get connection(): Connection {\n return this.provider.connection;\n }\n\n constructor(private readonly provider: AnchorProvider) {\n const svc = new SolanaProgramService(provider);\n this.program = svc.getProgram('liqsolCore');\n }\n\n // ---------------------------------------------------------------------------\n // Account helpers\n // ---------------------------------------------------------------------------\n\n async getAccounts(user: PublicKey): Promise<OutpostAccounts> {\n return buildOutpostAccounts(this.provider.connection, user);\n }\n\n async fetchGlobalState(): Promise<GlobalState> {\n const { globalState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.globalState.fetch(globalState);\n }\n\n async fetchTrancheState(): Promise<TrancheState> {\n const { trancheState } = await this.getAccounts(this.wallet.publicKey);\n return this.program.account.trancheState.fetch(trancheState);\n }\n\n /**\n * Fetch the per-user Outpost account (old \"wire receipt\").\n * Returns null if the user has never interacted with Outpost.\n */\n async fetchOutpostAccount(user: PublicKey): Promise<OutpostAccount | null> {\n const { outpostAccount } = await this.getAccounts(user);\n return this.program.account.outpostAccount.fetchNullable(outpostAccount);\n }\n\n /**\n * Fetch the per-user pretoken purchase record.\n * Returns null if the user has never purchased pretokens.\n */\n async fetchUserPretokenRecord(\n user: PublicKey,\n ): Promise<UserPretokenRecord | null> {\n const { userPretokenRecord } = await this.getAccounts(user);\n return this.program.account.userPretokenRecord.fetchNullable(\n userPretokenRecord,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Instruction builders (no send / confirm)\n // ---------------------------------------------------------------------------\n\n /**\n * Build a pretoken `purchase` instruction using liqSOL from the user’s ATA.\n *\n * This mirrors capital-staking `executePurchase` wiring:\n * - amountLamports: liqSOL amount (raw token-2022 units, not SOL)\n */\n async buildPurchaseIx(\n amountLamports: bigint,\n user = this.wallet.publicKey,\n ): Promise<TransactionInstruction> {\n const a = await this.getAccounts(user);\n\n const extraAccountMetaList = deriveExtraAccountMetaListPda(a.liqsolMint);\n const liqsolCoreProgram = PROGRAM_IDS.LIQSOL_CORE;\n const transferHookProgram = PROGRAM_IDS.TRANSFER_HOOK;\n\n return this.program.methods\n .purchase(new BN(amountLamports.toString()))\n .accounts({\n user: a.user,\n liqsolMint: a.liqsolMint,\n globalState: a.globalState,\n distributionState: a.distributionState,\n\n // buyer’s liqSOL\n buyerAta: a.userAta,\n\n // pool / bucket context\n poolAuthority: a.poolAuthority,\n bucketAuthority: a.bucketAuthority,\n bucketTokenAccount: a.bucketTokenAccount,\n bucketUserRecord: a.bucketUserRecord,\n\n // distribution userRecords (token-account keyed)\n senderUserRecord: a.userUserRecord,\n receiverUserRecord: a.liqsolPoolUserRecord,\n\n // transfer-hook wiring\n extraAccountMetaList,\n liqsolCoreProgram,\n transferHookProgram,\n\n // pool + outpost + tranche\n liqsolPoolAta: a.liqsolPoolAta,\n outpostAccount: a.outpostAccount,\n trancheState: a.trancheState,\n userPretokenRecord: a.userPretokenRecord,\n\n // Chainlink pricing\n chainlinkFeed: a.chainLinkFeed ?? CHAINLINK_FEED,\n chainlinkProgram: a.chainLinkProgram ?? CHAINLINK_PROGRAM,\n\n tokenProgram: TOKEN_2022_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n })\n .instruction();\n }\n\n // NOTE:\n // - There is no longer `purchaseWithSol` in the IDL - SOL → liqSOL happens\n // through the deposit / liqSOL minting path, not directly in pretokens.\n // - `purchaseFromYield` is an operator-facing / protocol flow and you\n // indicated you’ll trigger it from Wire infra, so we don’t expose a\n // client helper here for now.\n\n // ---------------------------------------------------------------------------\n // Price helpers (SOL/USD via priceHistory account)\n // ---------------------------------------------------------------------------\n\n async getSolPriceUsdSafe(): Promise<{ price?: bigint; timestamp?: number }> {\n try {\n const price = await this.getSolPriceUsd();\n // current priceHistory account has no timestamp; keep optional\n return { price, timestamp: undefined };\n } catch {\n return { price: undefined, timestamp: undefined };\n }\n }\n\n /**\n * Fetch latest SOL/USD price (1e8 scale) from liqsol_core.priceHistory.\n * Uses the ring-buffer semantics from capital-staking.\n */\n async getSolPriceUsd(): Promise<bigint> {\n const priceHistoryPda = derivePriceHistoryPda();\n const history = (await this.program.account.priceHistory.fetch(\n priceHistoryPda,\n )) as PriceHistory;\n\n const { prices, nextIndex, count, windowSize } = history;\n\n if (!prices || prices.length === 0 || !count) {\n throw new Error('Price history is empty - no SOL price available');\n }\n\n const capacity = prices.length || windowSize;\n if (!capacity) {\n throw new Error(\n 'Price history capacity is zero - check account layout',\n );\n }\n\n const lastIndex = nextIndex === 0 ? capacity - 1 : nextIndex - 1;\n const latest = prices[lastIndex];\n\n if (!BN.isBN(latest)) {\n throw new Error(\n 'Latest price entry is not a BN - check IDL/decoder',\n );\n }\n\n return BigInt(latest.toString());\n }\n}","import {\n Commitment,\n ComputeBudgetProgram,\n Connection,\n ConnectionConfig,\n PublicKey as SolPubKey,\n Transaction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport { AnchorProvider } from '@coral-xyz/anchor';\nimport { BaseSignerWalletAdapter } from '@solana/wallet-adapter-base';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n} from '@solana/spl-token';\n\nimport {\n ChainID,\n ExternalNetwork,\n KeyType,\n PublicKey,\n SolChainID,\n} from '@wireio/core';\n\nimport {\n IStakingClient,\n Portfolio,\n StakerConfig,\n TrancheSnapshot,\n} from '../../types';\n\nimport { DepositClient } from './clients/deposit.client';\nimport { DistributionClient } from './clients/distribution.client';\nimport { LeaderboardClient } from './clients/leaderboard.client';\nimport { OutpostClient } from './clients/outpost.client';\nimport { TokenClient } from './clients/token.client';\n\nimport {\n deriveLiqsolMintPda,\n deriveReservePoolPda,\n deriveVaultPda,\n INDEX_SCALE,\n} from './constants';\n\nimport { buildSolanaTrancheSnapshot } from './utils';\nimport { SolanaTransaction } from './types';\n\nconst commitment: Commitment = 'confirmed';\n\n/**\n * Solana implementation of IStakingClient.\n *\n * Responsibilities:\n * - liqSOL deposit (SOL -> liqSOL)\n * - withdraw requests (liqSOL -> NFT receipt / encumbered SOL)\n * - Pretoken (WIRE) buys via liqSOL\n * - Unified portfolio + tranche snapshot + balance correction (later)\n *\n * This composes lower-level clients; it does not know about UI.\n */\nexport class SolanaStakingClient implements IStakingClient {\n public pubKey?: PublicKey; // Wire ED key (optional → read-only)\n public connection: Connection;\n public anchor: AnchorProvider;\n\n public depositClient: DepositClient;\n public distributionClient: DistributionClient;\n public leaderboardClient: LeaderboardClient;\n public outpostClient: OutpostClient;\n public tokenClient: TokenClient;\n\n get solPubKey(): SolPubKey {\n if (!this.pubKey) throw new Error('pubKey is undefined');\n return new SolPubKey(this.pubKey.data.array);\n }\n\n get network(): ExternalNetwork {\n return this.config.network;\n }\n\n constructor(private config: StakerConfig) {\n const adapter = config.provider as BaseSignerWalletAdapter | undefined;\n\n if (!config.network.rpcUrls.length) {\n throw new Error('No RPC URLs provided');\n }\n\n // -------------------------------------------------------------\n // Resolve Solana wallet pubkey (or dummy in read-only mode)\n // -------------------------------------------------------------\n let solWalletPubkey: SolPubKey;\n if (adapter?.publicKey) {\n solWalletPubkey = adapter.publicKey;\n } else {\n // Zeroed pubkey when no wallet (read-only usage)\n solWalletPubkey = new SolPubKey(new Uint8Array(32));\n }\n\n // -------------------------------------------------------------\n // Resolve Wire pubKey\n // -------------------------------------------------------------\n if (config.pubKey) {\n const wirePub = config.pubKey;\n\n if (adapter?.publicKey) {\n const derived = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n if (!derived.equals(wirePub)) {\n throw new Error(\n \"Passed-in pubKey doesn't match adapter.publicKey\",\n );\n }\n }\n\n this.pubKey = wirePub;\n } else if (adapter?.publicKey) {\n // Derive Wire pubKey from adapter when not explicitly passed\n this.pubKey = new PublicKey(\n KeyType.ED,\n adapter.publicKey.toBytes(),\n );\n }\n\n // -------------------------------------------------------------\n // Connection + AnchorProvider\n // -------------------------------------------------------------\n const opts: ConnectionConfig = { commitment };\n if (\n config.network.rpcUrls.length > 1 &&\n config.network.rpcUrls[1].startsWith('ws')\n ) {\n opts.wsEndpoint = config.network.rpcUrls[1];\n }\n\n const anchorWallet = adapter\n ? {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n tx: T,\n ): Promise<T> {\n return adapter.signTransaction(tx);\n },\n async signAllTransactions<T extends SolanaTransaction>(\n txs: T[],\n ): Promise<T[]> {\n if (adapter.signAllTransactions) {\n return adapter.signAllTransactions(txs);\n }\n return Promise.all(\n txs.map((tx) => adapter.signTransaction(tx)),\n );\n },\n }\n : {\n publicKey: solWalletPubkey,\n async signTransaction<T extends SolanaTransaction>(\n _tx: T,\n ): Promise<T> {\n throw new Error(\n 'Wallet not connected: signTransaction not available',\n );\n },\n async signAllTransactions<T extends SolanaTransaction>(\n _txs: T[],\n ): Promise<T[]> {\n throw new Error(\n 'Wallet not connected: signAllTransactions not available',\n );\n },\n };\n\n this.connection = new Connection(config.network.rpcUrls[0], opts);\n this.anchor = new AnchorProvider(this.connection, anchorWallet, {\n commitment,\n });\n\n this.depositClient = new DepositClient(this.anchor);\n this.distributionClient = new DistributionClient(this.anchor);\n this.leaderboardClient = new LeaderboardClient(this.anchor);\n this.outpostClient = new OutpostClient(this.anchor);\n this.tokenClient = new TokenClient(this.anchor);\n }\n\n // ---------------------------------------------------------------------\n // IStakingClient core methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native SOL into liqSOL (liqsol_core::deposit).\n * Handles tx build, sign, send, and confirmation.\n */\n async deposit(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Deposit amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildDepositTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Request a withdraw from liqSOL to SOL (liqsol_core::requestWithdraw).\n *\n * This:\n * - burns liqSOL from the user ATA\n * - mints an NFT withdrawal receipt\n * - increases totalEncumberedFunds in global state\n *\n * Actual SOL payout happens later via the operator-side flow.\n */\n async withdraw(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (amountLamports <= BigInt(0)) {\n throw new Error('Withdraw amount must be greater than zero.');\n }\n\n const tx = await this.depositClient.buildWithdrawTx(amountLamports);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Stake liqSOL into Outpost (liqSOL → pool) via liqsol_core::synd.\n */\n async stake(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Stake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build the Outpost synd instruction\n const ix = await this.outpostClient.buildStakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Unstake liqSOL from Outpost (pool → liqSOL) via liqsol_core::desynd.\n */\n async unstake(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('Unstake amount must be greater than zero.');\n }\n\n const user = this.solPubKey;\n\n // Build the Outpost desynd instruction\n const ix = await this.outpostClient.buildUnstakeIx(amountLamports, user);\n\n // Wrap in a transaction and send\n const tx = new Transaction().add(ix);\n const prepared = await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared.tx);\n\n return this.sendAndConfirmHttp(signed, prepared);\n }\n\n /**\n * Buy prelaunch WIRE “pretokens” using liqSOL.\n *\n * This delegates to TokenClient, which uses the `purchase`-style\n * instruction under the new IDL (no more native-SOL purchase).\n */\n async buy(amountLamports: bigint): Promise<string> {\n this.ensureWriteAccess();\n if (!amountLamports || amountLamports <= BigInt(0)) {\n throw new Error('liqSOL pretoken purchase requires a positive amount.');\n }\n\n const user = this.solPubKey;\n const cuIx = ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 });\n const ix = await this.tokenClient.buildPurchaseIx(amountLamports, user);\n const tx = new Transaction().add(cuIx, ix);\n const { tx: prepared, blockhash, lastValidBlockHeight } =\n await this.prepareTx(tx);\n const signed = await this.signTransaction(prepared);\n return await this.sendAndConfirmHttp(signed, {\n blockhash,\n lastValidBlockHeight,\n });\n }\n\n /**\n * Aggregate view of the user’s balances on Solana:\n * - native: SOL wallet balance\n * - liq: liqSOL token balance (Token-2022 ATA)\n * - staked: liqSOL staked in Outpost (synd/desynd) → outpostAccount.stakedLiqsol\n * - wire: total WIRE pretokens purchased (1e8 scale)\n * - yield: on-chain index/shares plus an estimated accrued liqSOL yield\n * - extras: useful internal addresses and raw state for debugging/UX\n */\n async getPortfolio(): Promise<Portfolio> {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n\n const user = this.solPubKey;\n\n const reservePoolPDA = deriveReservePoolPda();\n const vaultPDA = deriveVaultPda();\n const liqsolMint = deriveLiqsolMintPda();\n\n const userLiqsolAta = getAssociatedTokenAddressSync(\n liqsolMint,\n user,\n false,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // NOTE:\n // - nativeLamports: wallet SOL\n // - actualBalResp: liqSOL balance in user ATA\n // - snapshot: Outpost + pretokens + global index/shares\n const [nativeLamports, actualBalResp, snapshot] = await Promise.all([\n this.connection.getBalance(user, 'confirmed'),\n this.connection\n .getTokenAccountBalance(userLiqsolAta, 'confirmed')\n .catch(() => null),\n this.outpostClient.fetchWireState(user).catch(() => null),\n ]);\n\n const LIQSOL_DECIMALS = 9;\n\n const actualAmountStr = actualBalResp?.value?.amount ?? '0';\n\n const globalState = snapshot?.globalState ?? null;\n const outpostAccount = snapshot?.outpostAccount ?? null;\n const trancheState = snapshot?.trancheState ?? null;\n const userPretokenRecord = snapshot?.userPretokenRecord ?? null;\n\n // -----------------------------\n // Staked liqSOL (Outpost)\n // -----------------------------\n // This is the liqSOL that has been syndicated into Outpost via `synd`.\n // It lives on the outpost account as `stakedLiqsol`.\n const stakedLiqsolStr =\n outpostAccount?.stakedLiqsol?.toString?.() ?? '0';\n\n // -----------------------------\n // WIRE pretokens (1e8 scale)\n // -----------------------------\n // This is NOT stake — it’s the prelaunch WIRE position.\n const wirePretokensStr =\n userPretokenRecord?.totalPretokensPurchased?.toString?.() ??\n '0';\n\n // -----------------------------\n // Yield view (index + shares)\n // -----------------------------\n // We expose:\n // - currentIndex: globalState.currentIndex (1e12 scale)\n // - totalShares: globalState.totalShares\n // - userShares: outpostAccount.stakedShares\n // - estimatedClaimLiqsol: floor(userShares * index / INDEX_SCALE)\n // - estimatedYieldLiqsol: max(0, estimatedClaim - stakedLiqsol)\n //\n // This matches the capital-staking math:\n // sharesToTokens(shares, index) = shares * index / INDEX_SCALE\n const currentIndexStr =\n globalState?.currentIndex?.toString?.() ?? '0';\n const totalSharesStr =\n globalState?.totalShares?.toString?.() ?? '0';\n const userSharesStr =\n outpostAccount?.stakedShares?.toString?.() ?? '0';\n\n const stakedLiqsol = BigInt(stakedLiqsolStr);\n const currentIndex = BigInt(currentIndexStr);\n const totalShares = BigInt(totalSharesStr);\n const userShares = BigInt(userSharesStr);\n\n let estimatedClaimLiqsol = BigInt(0);\n let estimatedYieldLiqsol = BigInt(0);\n\n if (userShares > BigInt(0) && currentIndex > BigInt(0)) {\n // sharesToTokens(userShares, currentIndex)\n estimatedClaimLiqsol = (userShares * currentIndex) / INDEX_SCALE;\n\n if (estimatedClaimLiqsol > stakedLiqsol) {\n estimatedYieldLiqsol = estimatedClaimLiqsol - stakedLiqsol;\n }\n }\n\n return {\n native: {\n amount: BigInt(nativeLamports),\n symbol: 'SOL',\n decimals: 9,\n },\n liq: {\n amount: BigInt(actualAmountStr),\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n ata: userLiqsolAta,\n },\n staked: {\n // liqSOL staked in Outpost via `synd`\n amount: stakedLiqsol,\n symbol: 'LiqSOL',\n decimals: LIQSOL_DECIMALS,\n },\n wire: {\n // Prelaunch WIRE pretokens (1e8 scale)\n amount: BigInt(wirePretokensStr),\n symbol: '$WIRE',\n decimals: 8,\n },\n yield: {\n // Raw primitives so the frontend can display curves, charts, etc.\n currentIndex,\n indexScale: INDEX_SCALE,\n totalShares,\n userShares,\n // liqSOL amounts (lamports) implied by index/shares\n estimatedClaimLiqsol,\n estimatedYieldLiqsol,\n },\n extras: {\n userLiqsolAta: userLiqsolAta.toBase58(),\n reservePoolPDA: reservePoolPDA.toBase58(),\n vaultPDA: vaultPDA.toBase58(),\n globalIndex: globalState?.currentIndex?.toString(),\n totalShares: globalState?.totalShares?.toString(),\n currentTrancheNumber:\n trancheState?.currentTrancheNumber?.toString(),\n currentTranchePriceUsd:\n trancheState?.currentTranchePriceUsd?.toString(), // 1e8 USD\n },\n chainID: this.network.chainId,\n };\n }\n\n /**\n * Unified, chain-agnostic tranche snapshot for Solana.\n *\n * Uses:\n * - liqsol_core.globalState (currentIndex, totalShares, etc.)\n * - liqsol_core.trancheState (price, supply, total sold, etc.)\n * - PriceHistory/Chainlink SOL/USD via TokenClient.getSolPriceUsdSafe()\n *\n * This is READ-ONLY and works even with no connected wallet.\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = SolChainID.WireTestnet,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n const [globalState, trancheState] = await Promise.all([\n this.tokenClient.fetchGlobalState(),\n this.tokenClient.fetchTrancheState(),\n ]);\n\n const { price: solPriceUsd, timestamp } =\n await this.tokenClient.getSolPriceUsdSafe();\n\n return buildSolanaTrancheSnapshot({\n chainID,\n globalState,\n trancheState,\n solPriceUsd,\n nativePriceTimestamp: timestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n /**\n * Convenience helper to fetch the distribution userRecord for the current user.\n * Used by balance-correction flows and debugging.\n */\n async getUserRecord() {\n if (!this.pubKey) throw new Error('User pubKey is undefined');\n return this.distributionClient.getUserRecord(this.solPubKey);\n }\n\n // ---------------------------------------------------------------------\n // Tx helpers\n // ---------------------------------------------------------------------\n\n /**\n * Send a signed transaction over HTTP RPC and wait for confirmation.\n * Throws if the transaction fails.\n */\n private async sendAndConfirmHttp(\n signed: SolanaTransaction,\n ctx: { blockhash: string; lastValidBlockHeight: number },\n ): Promise<string> {\n this.ensureWriteAccess();\n\n const signature = await this.connection.sendRawTransaction(\n signed.serialize(),\n {\n skipPreflight: false,\n preflightCommitment: commitment,\n maxRetries: 3,\n },\n );\n\n const conf = await this.connection.confirmTransaction(\n {\n signature,\n blockhash: ctx.blockhash,\n lastValidBlockHeight: ctx.lastValidBlockHeight,\n },\n commitment,\n );\n\n if (conf.value.err) {\n throw new Error(\n `Transaction failed: ${JSON.stringify(conf.value.err)}`,\n );\n }\n\n return signature;\n }\n\n /**\n * Sign a single Solana transaction using the connected wallet adapter.\n */\n async signTransaction(\n tx: SolanaTransaction,\n ): Promise<SolanaTransaction> {\n this.ensureWriteAccess();\n return this.anchor.wallet.signTransaction(tx);\n }\n\n /**\n * Generic \"fire and forget\" send helper if the caller already\n * prepared and signed the transaction.\n */\n async sendTransaction(\n signed: SolanaTransaction,\n ): Promise<TransactionSignature> {\n this.ensureWriteAccess();\n return this.anchor.sendAndConfirm(signed);\n }\n\n /**\n * Attach recent blockhash + fee payer to a transaction.\n * Required before signing and sending.\n */\n async prepareTx(\n tx: Transaction,\n ): Promise<{\n tx: Transaction;\n blockhash: string;\n lastValidBlockHeight: number;\n }> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash('confirmed');\n tx.recentBlockhash = blockhash;\n tx.feePayer = this.solPubKey;\n return { tx, blockhash, lastValidBlockHeight };\n }\n\n /**\n * Guard for all write operations (deposit/withdraw/stake/unstake/buy).\n * Ensures we have a Wire pubKey and an Anchor wallet pubKey, and that they match.\n */\n ensureWriteAccess() {\n if (!this.pubKey || !this.anchor.wallet.publicKey) {\n throw new Error('User Authorization required: pubKey is undefined');\n }\n if (\n this.solPubKey.toBase58() !==\n this.anchor.wallet.publicKey.toBase58()\n ) {\n throw new Error(\n 'Write access requires connected wallet to match pubKey',\n );\n }\n }\n}","/**\n * @module EthereumContractService\n *\n * Provides a unified service for interacting with Ethereum smart contracts using ethers.js.\n */\nimport AccountingArtifact from '../../assets/ethereum/ABI/liqEth/accounting.sol/Accounting.json';\nimport DepositManagerArtifact from '../../assets/ethereum/ABI/liqEth/DepositManager.sol/DepositManager.json';\nimport LiqEthArtifact from '../../assets/ethereum/ABI/liqEth/liqEth.sol/LiqEthToken.json';\nimport StakingModuleArtifact from '../../assets/ethereum/ABI/liqEth/stakingModule.sol/StakingModule.json';\nimport WithdrawalQueueArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalQueue.sol/WithdrawalQueue.json';\nimport WithdrawalVaultArtifact from '../../assets/ethereum/ABI/liqEth/withdrawalVault.sol/WithdrawalVault.json';\n\n// Outpost Artifacts\nimport DepositorArtifact from '../../assets/ethereum/ABI/outpost/Depositor.sol/Depositor.json';\nimport ReceiptNFTArtifact from '../../assets/ethereum/ABI/outpost/ReceiptNFT.sol/ReceiptNFT.json';\nimport OutpostManagerArtifact from '../../assets/ethereum/ABI/outpost/OutpostManager.sol/OutpostManager.json';\nimport BARArtifact from '../../assets/ethereum/ABI/outpost/BAR.sol/BAR.json';\nimport OPPArtifact from '../../assets/ethereum/ABI/outpost/OPP.sol/OPP.json';\nimport OPPCommonArtifact from '../../assets/ethereum/ABI/outpost/OPPCommon.sol/OPPCommon.json';\nimport OPPInboundArtifact from '../../assets/ethereum/ABI/outpost/OPPInbound.sol/OPPInbound.json';\nimport PretokenArtifact from '../../assets/ethereum/ABI/outpost/Pretoken.sol/Pretoken.json';\nimport AggregatorArtifact from '../../assets/ethereum/ABI/outpost/Aggregator.sol/Aggregator.json';\nimport EthUsdPriceConsumerArtifact from '../../assets/ethereum/ABI/outpost/EthUsdPriceConsumer.sol/EthUsdPriceConsumer.json';\n\nimport ERC20Artifact from '../../assets/ethereum/ABI/token/ERC20Token.sol/ERC20Token.json';\nimport ERC721Artifact from '../../assets/ethereum/ABI/token/ERC721Token.sol/ERC721Token.json';\nimport ERC1155Artifact from '../../assets/ethereum/ABI/token/ERC1155Token.sol/ERC1155Token.json';\n\nimport { AddressBook, ContractName } from './types';\nimport { Contract, ethers, providers, Signer } from 'ethers';\nimport { JsonFragment } from '@ethersproject/abi';\nimport { ErrorDescription } from '@ethersproject/abi/lib/interface';\n\nexport const ERC20Abi = ERC20Artifact.abi;\nexport const ERC721Abi = ERC721Artifact.abi;\nexport const ERC1155Abi = ERC1155Artifact.abi;\n\n// -----------------------------------------------------------------------------\n// Address book\n// -----------------------------------------------------------------------------\n\n// Make sure ContractName in ./types includes all of these keys.\nexport const ADDRESSES: AddressBook = {\n Accounting: \"0xd333A03a44D5d602A98c1B7bcd7ED1f042DD0dEd\",\n DepositManager: \"0x601eaA31e8d33D8725786f1733f4cE6cCEf740D4\",\n LiqEth: \"0x08252e1Dcbaa86A2887927b02536CD3E67a802c8\", // AKA LiqEthToken\n StakingModule: \"0x7Aac2fCfc83d7F2f15eA53a10C1677CA377AFcF4\",\n WithdrawalQueue: \"0x951E413FC81a2CE133078ABE8B88677F5296abE7\",\n WithdrawalVault: \"0x0D2bf834DD560839e986d42D06DeE268A17c2d13\",\n\n // LiqEthAuthority: \"0x7A9cf59EC53F32577Cc8200466Cc7693713129D5\",\n // BeaconState: \"0xD3860E5977C94b343341635a2dEEBD20B651c48f\",\n // YieldOracle: \"0x307b35816674913cf122975B3CF912b5709653F3\",\n \n //Outpost contracts\n Depositor: \"0x69Aa53Ef02F124dB421AeDda509d6912341299Cc\",\n ReceiptNFT: \"0x13588fF41E2f47D047874162B1eD15AaF6818f5a\",\n OutpostManager: \"0x187f4fEDBCAD2f3150120B743b5d568F11dD3452\",\n BAR: \"0x27d4646abF638A13934c94f8bA9AC1Bda39F5dbb\",\n OPP: \"0x79CA2DE915C294593edc16b32CBA8B7866159205\",\n OPPCommon: \"0x8392ea945Cd8C03F5241d4964D20BB5A9c320c71\",\n OPPInbound: \"0xfDA9A2C7e395a9722d9fa506f5d67aba823298dd\",\n Pretoken: \"0xcf6A1209A7A391cc576174204386F4e5462323dC\",\n EthUsdPriceConsumer: \"0x1Ef180FF49313fCB8B5c0470268295d0d24CDE69\",\n Aggregator: \"0xFCfc3ddd4CBd9Ad3b3af3A374B8bdA1b66eE6FFF\",\n};\n\nexport type Contracts<T extends string = ContractName> = Record<T, ContractConfig>;\n\nexport type ContractConfig = {\n address: string;\n abi: JsonFragment[];\n};\n\n// -----------------------------------------------------------------------------\n// Contract config\n// -----------------------------------------------------------------------------\n\nexport const CONTRACTS: Contracts<ContractName> = {\n Accounting: {\n address: ADDRESSES.Accounting,\n abi: AccountingArtifact.abi as JsonFragment[],\n },\n LiqEth: {\n address: ADDRESSES.LiqEth,\n abi: LiqEthArtifact.abi as JsonFragment[],\n },\n DepositManager: {\n address: ADDRESSES.DepositManager,\n abi: DepositManagerArtifact.abi as JsonFragment[],\n },\n StakingModule: {\n address: ADDRESSES.StakingModule,\n abi: StakingModuleArtifact.abi as JsonFragment[],\n },\n WithdrawalQueue: {\n address: ADDRESSES.WithdrawalQueue,\n abi: WithdrawalQueueArtifact.abi as JsonFragment[],\n },\n WithdrawalVault: {\n address: ADDRESSES.WithdrawalVault,\n abi: WithdrawalVaultArtifact.abi as JsonFragment[],\n },\n\n // Outpost Contracts\n Depositor: {\n address: ADDRESSES.Depositor,\n abi: DepositorArtifact.abi as JsonFragment[],\n },\n ReceiptNFT: {\n address: ADDRESSES.ReceiptNFT,\n abi: ReceiptNFTArtifact.abi as JsonFragment[],\n },\n OutpostManager: {\n address: ADDRESSES.OutpostManager,\n abi: OutpostManagerArtifact.abi as JsonFragment[],\n },\n BAR: {\n address: ADDRESSES.BAR,\n abi: BARArtifact.abi as JsonFragment[],\n },\n OPP: {\n address: ADDRESSES.OPP,\n abi: OPPArtifact.abi as JsonFragment[],\n },\n OPPCommon: {\n address: ADDRESSES.OPPCommon,\n abi: OPPCommonArtifact.abi as JsonFragment[],\n },\n OPPInbound: {\n address: ADDRESSES.OPPInbound,\n abi: OPPInboundArtifact.abi as JsonFragment[],\n },\n Pretoken: {\n address: ADDRESSES.Pretoken,\n abi: PretokenArtifact.abi as JsonFragment[],\n },\n Aggregator: {\n address: ADDRESSES.Aggregator,\n abi: AggregatorArtifact.abi as JsonFragment[],\n },\n EthUsdPriceConsumer: {\n address: ADDRESSES.EthUsdPriceConsumer,\n abi: EthUsdPriceConsumerArtifact.abi as JsonFragment[],\n }\n};\n\nexport interface ContractOptions {\n /** RPC endpoint or injected EIP-1193 provider */\n provider?: ethers.providers.Provider;\n /** Only required if you need to send txns */\n signer?: Signer;\n}\n\nexport class EthereumContractService {\n private provider?: providers.Provider;\n private signer?: Signer;\n\n public readonly contract: { [N in ContractName]: ethers.Contract } = {} as any;\n public readonly iface: { [N in ContractName]: ethers.utils.Interface } = {} as any;\n\n constructor(opts: ContractOptions) {\n this.provider = opts.provider;\n this.signer = opts.signer;\n\n (Object.keys(CONTRACTS) as ContractName[]).forEach((name) => {\n const { address, abi } = CONTRACTS[name];\n this.iface[name] = new ethers.utils.Interface(abi);\n this.contract[name] = new ethers.Contract(\n address,\n abi,\n this.signer ?? this.provider\n );\n });\n }\n\n /** Get raw address for a contract */\n public getAddress(name: ContractName): string {\n return CONTRACTS[name].address;\n }\n\n /** Utility: get a read-only handle even if signer is present */\n public getReadOnly(name: ContractName): Contract {\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.provider);\n }\n\n /** Utility: get a write-enabled handle (throws if no signer) */\n public getWrite(name: ContractName): Contract {\n if (!this.signer) throw new Error('No signer available for write calls');\n const { address, abi } = CONTRACTS[name];\n return new Contract(address, abi, this.signer);\n }\n\n /** Expose network info */\n async getNetwork() {\n return this.provider?.getNetwork();\n }\n\n /** List all known contract names */\n public listContractNames(): ContractName[] {\n return Object.keys(CONTRACTS) as ContractName[];\n }\n\n /** Get Interface instance for a contract */\n public getInterface(name: ContractName): ethers.utils.Interface {\n const iface = this.iface[name];\n if (!iface) throw new Error(`Interface not initialized for ${name}`);\n return iface;\n }\n\n /** Get live Contract instance */\n public getContract(name: ContractName): ethers.Contract {\n const ctr = this.contract[name];\n if (!ctr) throw new Error(`Contract not initialized for ${name}`);\n return ctr;\n }\n\n /** A unified Interface containing all ABIs to parse custom errors or events. */\n public get omniInterface(): ethers.utils.Interface {\n const all: any[] = [];\n\n const allArtifacts = [\n ERC20Artifact,\n ERC721Artifact,\n ERC1155Artifact,\n\n // liqETH suite\n AccountingArtifact,\n DepositManagerArtifact,\n LiqEthArtifact,\n // LiqEthBurnArtifact,\n // LiqEthMintArtifact,\n // RewardsERC20Artifact,\n StakingModuleArtifact,\n // ValidatorBalanceArtifact,\n WithdrawalQueueArtifact,\n WithdrawalVaultArtifact,\n // YieldArtifact,\n ];\n\n allArtifacts.forEach(artifact => {\n if (artifact && artifact.abi) {\n all.push(...artifact.abi);\n }\n });\n\n const seen = new Set<string>();\n const dedup: any[] = [];\n for (const item of all) {\n try {\n const frag = ethers.utils.Fragment.from(item);\n const key = `${frag.type}:${frag.format(ethers.utils.FormatTypes.full)}`.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n dedup.push(item);\n }\n } catch {\n // ignore bad fragments\n }\n }\n\n return new ethers.utils.Interface(dedup);\n }\n\n /** Decode a revert or custom error payload */\n public parseError(revertData: string): ErrorDescription {\n try {\n return this.omniInterface.parseError(revertData);\n } catch {\n throw new Error(`Unable to parse error data: ${revertData}`);\n }\n }\n}","\nimport { ethers } from \"ethers\";\nimport { TrancheLadderItem, TrancheSnapshot } from \"../../types\";\nimport { ChainID } from \"@wireio/core\";\n\n\nconst BPS = BigInt(10_000);\n\nexport interface CustomContractError {\n name?: string;\n signature?: string;\n args?: any[];\n data?: any;\n method?: string;\n code?: any;\n raw: string;\n}\n\n\n\nexport function formatContractErrors(err: any): CustomContractError {\n // Extract custom error details if present\n if (err.errorName && err.errorArgs) {\n const errorObj: CustomContractError = {\n name: err.errorName,\n signature: err.errorSignature,\n args: err.errorArgs.map((arg: any) =>\n arg && arg._isBigNumber ? ethers.BigNumber.from(arg).toString() : arg\n ),\n data: err.data,\n method: err.method,\n code: err.code,\n raw: err,\n };\n console.error(\"Custom contract error:\", errorObj);\n return errorObj;\n } else {\n console.error(\"Contract Error:\", err);\n return {\n raw: typeof err === 'string' ? err : (err?.message || String(err))\n };\n }\n}\n\n\n\n/**\n * Finalize an OPP epoch. Optionally accept a gasLimit override (ethers BigNumberish).\n * If gasLimit is not provided, the method will attempt estimateGas.finalizeEpoch()\n * and pad it (1.2x). If estimateGas fails, a conservative fallback is used.\n */\nexport async function sendOPPFinalize(opp: ethers.Contract, gasLimit?: ethers.BigNumberish) {\n const overrides: any = {};\n try {\n if (gasLimit === undefined) {\n try {\n const estimated = await opp.estimateGas.finalizeEpoch();\n const padded = ethers.BigNumber.from(estimated).mul(12).div(10); // 1.2x\n overrides.gasLimit = padded;\n console.log('sendFinalize: estimated gas', estimated.toString(), 'padded to', overrides.gasLimit.toString());\n } catch (estErr) {\n // estimateGas can throw UNPREDICTABLE_GAS_LIMIT; fall back to a safe default\n console.warn('sendFinalize: estimateGas.finalizeEpoch() failed, falling back to hardcoded gasLimit', estErr);\n overrides.gasLimit = ethers.BigNumber.from(8000000);\n }\n } else {\n overrides.gasLimit = ethers.BigNumber.from(gasLimit);\n console.log('sendFinalize: using provided gasLimit override', overrides.gasLimit.toString());\n }\n\n const tx = await opp.finalizeEpoch(overrides); // submit tx with overrides\n console.log('sendFinalize tx hash:', tx.hash, 'overrides:', overrides);\n\n const receipt = await tx.wait(); // wait for mined\n console.log('sendFinalize tx mined, block:', receipt.blockNumber);\n return receipt;\n } catch (err: any) {\n // Verbose error logging to help debugging reverts / provider issues\n console.error('sendFinalize() failed:', err?.message || err);\n\n // Try to extract common raw payload locations used by ethers errors\n const raw = err?.error?.data || err?.data || err?.body || err?.receipt || err?.transaction || err;\n console.error('sendFinalize raw payload:', raw);\n\n // Try parsing with contractService if available\n try {\n const parsed = formatContractErrors(raw);\n console.error('sendFinalize parsed error:', parsed.name, parsed.args);\n } catch (parseErr) {\n // Fallback: decode Error(string) ABI encoded revert (0x08c379a0)\n try {\n const hex = (typeof raw === 'string') ? raw : (raw && raw.data) ? raw.data : null;\n if (hex && typeof hex === 'string' && hex.startsWith('0x08c379a0')) {\n const reason = ethers.utils.defaultAbiCoder.decode(['string'], '0x' + hex.slice(10))[0];\n console.error('sendFinalize revert reason:', reason);\n } else {\n console.error('sendFinalize: unable to decode revert payload (not standard Error(string))');\n }\n } catch (fallbackErr) {\n console.error('sendFinalize: fallback decode failed:', fallbackErr);\n }\n }\n\n // If there is a receipt, print it for extra context\n if (err?.receipt) console.error('sendFinalize receipt:', err.receipt);\n if (err?.transaction) console.error('sendFinalize transaction object:', err.transaction);\n\n // Re-throw so callers can handle it as well\n throw err;\n }\n}\n\n\n\n/**\n * Apply one forward growth step: value * (BPS + growthBps) / BPS.\n * Simple integer round-half-up.\n */\nfunction growOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * (BPS + g) + BPS / BigInt(2)) / BPS;\n}\n\n\n/**\n * Apply one backward step: value * BPS / (BPS + growthBps).\n * Also integer round-half-up.\n */\nfunction shrinkOnce(value: bigint, growthBps: number): bigint {\n const g = BigInt(growthBps);\n return (value * BPS + (BPS + g) / BigInt(2)) / (BPS + g);\n}\n\n\n/**\n * Calculate the full supply for a given tranche using BigInt math.\n * trancheNumber is 1-based (tranche 1 = startSupply)\n */\nfunction getTrancheSize(startSupply: bigint, supplyGrowthBps: number, trancheNumber: number): bigint {\n let supply = startSupply;\n for (let i = 0; i < trancheNumber; i++) {\n supply = (supply * (BPS + BigInt(supplyGrowthBps)) + BPS / BigInt(2)) / BPS;\n }\n return supply;\n}\n\n\n/**\n * Build a local tranche ladder around the current tranche\n * using only on-chain config + current state.\n *\n */\nexport function buildEthereumTrancheLadder(options: {\n currentTranche: number;\n totalTrancheSupply: bigint,\n initialTrancheSupply: bigint;\n currentTrancheSupply: bigint;\n currentPriceUsd: bigint;\n supplyGrowthBps: number;\n priceGrowthBps: number;\n windowBefore?: number;\n windowAfter?: number;\n}): TrancheLadderItem[] {\n const {\n currentTranche,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore = 5,\n windowAfter = 5,\n } = options;\n\n const startId = Math.max(0, currentTranche - windowBefore);\n const endId = currentTranche + windowAfter;\n \n //calculate total tranche size (e.g. 60,600 on tranche 2)\n const currentTrancheSize = getTrancheSize(initialTrancheSupply, supplyGrowthBps, currentTranche);\n\n const capacity = new Map<number, bigint>();\n const price = new Map<number, bigint>();\n\n // Seed current\n capacity.set(currentTranche, currentTrancheSize);\n price.set(currentTranche, currentPriceUsd);\n\n // Forward (future tranches)\n for (let id = currentTranche + 1; id <= endId; id++) {\n const prevCap = capacity.get(id - 1)!;\n const prevPrice = price.get(id - 1)!;\n capacity.set(id, growOnce(prevCap, supplyGrowthBps));\n price.set(id, growOnce(prevPrice, priceGrowthBps));\n }\n\n // Backward (past tranches)\n for (let id = currentTranche - 1; id >= startId; id--) {\n const nextCap = capacity.get(id + 1)!;\n const nextPrice = price.get(id + 1)!;\n capacity.set(id, shrinkOnce(nextCap, supplyGrowthBps));\n price.set(id, shrinkOnce(nextPrice, priceGrowthBps));\n }\n\n const ladder: TrancheLadderItem[] = [];\n for (let id = startId; id <= endId; id++) {\n const cap = capacity.get(id)!;\n let sold: bigint;\n if (id < currentTranche) {\n sold = cap;\n } else if (id === currentTranche) {\n sold = cap - currentTrancheSupply;\n } else {\n sold = BigInt(0);\n }\n\n ladder.push({\n id,\n capacity: cap,\n sold,\n remaining: cap - sold,\n priceUsd: price.get(id)!,\n });\n }\n\n return ladder;\n}\n\n\n/**\n * Turn raw liqsol_core accounts into a chain-agnostic TrancheSnapshot for SOL.\n * All math stays here; TokenClient just wires accounts + connection.\n */\nexport async function buildEthereumTrancheSnapshot(options: {\n chainID: ChainID;\n totalSharesBn;\n indexBn;\n trancheNumberBn;\n currentTrancheSupply;\n tranchePriceWadBn;\n totalTrancheSupply;\n initialTrancheSupply;\n supplyGrowthBps;\n priceGrowthBps;\n minPriceUsd;\n maxPriceUsd;\n\n ethPriceUsd?: bigint;\n nativePriceTimestamp?: number;\n ladderWindowBefore?: number;\n ladderWindowAfter?: number;\n}): Promise<TrancheSnapshot> {\n const {\n chainID,\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore,\n ladderWindowAfter,\n\n totalSharesBn, \n indexBn, \n trancheNumberBn, \n currentTrancheSupply, \n tranchePriceWadBn, \n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthBps,\n minPriceUsd, \n maxPriceUsd,\n } = options;\n\n\n // convert default BigNumber to bigint for hub to handle, and partially convert from 1e18 to 1e8 for the hub\n const totalShares = BigInt(totalSharesBn.toString()) / BigInt(1e10);\n const currentIndex = BigInt(indexBn.toString()); // RAY (1e27)\n const currentTranche = Number(trancheNumberBn.toString());\n const currentPriceUsd = BigInt(tranchePriceWadBn.toString()) / BigInt(1e10); // 1e18 WAD\n\n\n const ladder = buildEthereumTrancheLadder({\n currentTranche,\n totalTrancheSupply,\n initialTrancheSupply,\n currentTrancheSupply,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n windowBefore: ladderWindowBefore,\n windowAfter: ladderWindowAfter,\n });\n\n\n return {\n chainID,\n currentIndex,\n totalShares,\n currentTranche,\n currentPriceUsd,\n supplyGrowthBps,\n priceGrowthBps,\n currentTrancheSupply,\n initialTrancheSupply,\n totalPretokensSold: totalTrancheSupply,\n nativePriceUsd: ethPriceUsd,\n nativePriceTimestamp,\n ladder,\n };\n}\n","import { BigNumber, ethers, Signer } from \"ethers\";\nimport { DepositEvent, DepositResult, WithdrawRequestedEvent, WithdrawResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { ChainID } from \"@wireio/core\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class DepositClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n /**\n * Simulate a deposit via callStatic.\n *\n * Useful for pre-flight checks; will throw with the same revert\n * reason as a real tx if it would fail.\n */\n async simulateDeposit(amount: number | string | bigint | BigNumber): Promise<void> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n // callStatic executes the function locally without sending a tx.\n // deposit() doesn't return anything, so we only care if it reverts.\n await this.contract.DepositManager.callStatic.deposit({\n value: amountWei,\n });\n }\n\n\n\n /**\n * \n * @param amountWei an amount of WEI to deposit in exchange for liqETH\n * @returns the hash of the transaction\n */\n async performDeposit(amountWei: BigNumber): Promise<DepositResult> {\n // Pre-check minDeposit\n const minDeposit: BigNumber = await this.contract.DepositManager.minDeposit();\n if (amountWei.lt(minDeposit)) {\n console.warn('less than min deposit');\n throw new Error(\n `Deposit amount below minDeposit: ` +\n `amount=${ethers.utils.formatEther(amountWei)} ETH, ` +\n `min=${ethers.utils.formatEther(minDeposit)} ETH`\n );\n }\n\n let tx, receipt;\n try {\n tx = await this.contract.DepositManager.deposit({ value: amountWei });\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Parse Deposited event if present\n let deposited: DepositEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Deposited');\n\n if (ev && ev.args) {\n const { user, netEth, fee, shares } = ev.args;\n deposited = {\n user,\n netEth: BigNumber.from(netEth),\n fee: BigNumber.from(fee),\n shares: BigNumber.from(shares),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n deposited,\n };\n }\n\n\n\n // OLD - this was replaced with LiqEth.safeBurn() on 1/13/26\n async requestWithdraw(amountWei: BigNumber, signer: Signer, chainId: ChainID): Promise<WithdrawResult> {\n // deadline is a period of time in the future that the signature is valid for\n const deadline = Math.floor(Date.now() / 1000) + 3600;\n\n const liqEth = this.contract.LiqEth;\n const owner = await signer.getAddress();\n \n const nonce: BigNumber = await liqEth.nonces(owner);\n const domain = {\n name: await liqEth.name(),\n version: '1',\n chainId,\n verifyingContract: this.contract.LiqEth.address,\n } as any;\n\n const types = {\n Permit: [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n } as any;\n\n const values = {\n owner,\n spender: this.contractService.getAddress('DepositManager'),\n value: amountWei,\n nonce: nonce,\n deadline,\n } as any;\n\n const signature = await (signer as any)._signTypedData(domain, types, values);\n const split = ethers.utils.splitSignature(signature);\n\n const tx = await this.contract.DepositManager.requestWithdrawal(\n amountWei,\n deadline,\n split.v,\n split.r,\n split.s\n );\n\n // wait for 1 confirmation\n const receipt = await tx.wait(1);\n\n // if WithdrawRequested event exists, parse it and get arguments\n let withdrawRequested: WithdrawRequestedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawRequested');\n\n if (ev && ev.args) {\n const { user, ethAmount, nftId, readyAt } = ev.args;\n withdrawRequested = {\n user,\n ethAmount: BigNumber.from(ethAmount),\n nftId: BigNumber.from(nftId),\n readyAt: readyAt,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawRequested,\n } as WithdrawResult;\n }\n\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { preLaunchReceipt, StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class StakeClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Simulate a stake via callStatic\n */\n async simulateStake(amountWei: BigNumber): Promise<void> {\n try {\n await this.contract.Depositor.callStatic.stakeLiqETH(amountWei);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n }\n\n\n /**\n * Read OPP / Outpost state used by the Depositor to decide whether staking is allowed.\n * Returns various data\n */\n async getOppStatus(): Promise<any> {\n const depositor = this.contract.Depositor;\n const opp = this.contract.OPP;\n\n \n const oppAddress: string = await depositor.oppAddress();\n const oppInboundAddress: string = await depositor.oppInboundAddress();\n const prevEpochSent = await opp.prevEpochSent();\n \n\n const inbound = this.contractService.getReadOnly('OPPInbound');\n\n // Query useful getters\n const nextEpochBN: any = await inbound.nextEpochNum();\n const pendingEpochRaw: any = await inbound.pendingEpoch();\n const pendingMessageCount: any = await inbound.pendingMessageCount();\n const previousEpochHash: string = await inbound.previousEpochHash();\n const nextEpochNum = (nextEpochBN && typeof nextEpochBN.toNumber === 'function') ? nextEpochBN.toNumber() : Number(nextEpochBN || 0);\n\n const pendingEpoch = (pendingEpochRaw && pendingEpochRaw.epochNumber !== undefined)\n ? {\n epochNumber: (pendingEpochRaw.epochNumber && typeof pendingEpochRaw.epochNumber.toNumber === 'function') ? pendingEpochRaw.epochNumber.toNumber() : Number(pendingEpochRaw.epochNumber || 0),\n timestamp: (pendingEpochRaw.timestamp && typeof pendingEpochRaw.timestamp.toNumber === 'function') ? pendingEpochRaw.timestamp.toNumber() : Number(pendingEpochRaw.timestamp || 0),\n prevEpochHash: pendingEpochRaw.prevEpochHash,\n merkleRoot: pendingEpochRaw.merkleRoot,\n firstMessageID: pendingEpochRaw.firstMessageID,\n lastMessageID: pendingEpochRaw.lastMessageID,\n }\n : null;\n\n const pendingMessagesBN = pendingMessageCount;\n const pendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.toString === 'function') ? pendingMessagesBN.toString() : String(pendingMessagesBN || '0');\n\n const hasPendingMessages = (pendingMessagesBN && typeof pendingMessagesBN.gt === 'function') ? pendingMessagesBN.gt(0) : (Number(pendingMessages) > 0);\n\n return {\n oppAddress,\n prevEpochSent,\n oppInboundAddress,\n nextEpochNum,\n pendingEpoch,\n pendingMessageCount: pendingMessages,\n previousEpochHash,\n hasPendingMessages,\n raw: {\n nextEpochBN,\n pendingEpochRaw,\n pendingMessageCount: pendingMessagesBN,\n },\n };\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, Staked event\n */\n async performStake(amountWei: BigNumber, signerAddress: string): Promise<any> {\n const depositor = this.contract.Depositor.address;\n const liqRead = this.contract.LiqEth;\n const bal = await liqRead.balanceOf(signerAddress);\n const allowance = await liqRead.allowance(signerAddress, depositor);\n\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amountWei)) {\n const liqWrite = this.contractService.getWrite('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amountWei.toString()}); sending approve(${depositor}, ${approveAmount.toString()})`);\n const approveTx = await liqWrite.approve(depositor, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await liqRead.allowance(signerAddress, depositor);\n if (newAllowance.lt(amountWei)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n \n \n await this.simulateStake(amountWei);\n\n\n // send the tx to stake liqeth\n const tx = await this.contract.Depositor.stakeLiqETH(amountWei);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let staked: StakedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'Staked');\n\n if (ev && ev.args) {\n const { user, amountLiq, shares, tokenId } = ev.args;\n staked = {\n user,\n amountLiq: BigNumber.from(amountLiq),\n shares: BigNumber.from(shares),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n staked,\n };\n }\n\n\n\n async getOwnedTokenIdsFor(\n owner: string,\n fromBlock = 1850820,\n toBlock: number | string = \"latest\"\n ): Promise<BigNumber[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // Logs where address received tokens\n const toLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(null, owner),\n fromBlock,\n toBlock\n );\n\n // Logs where address sent tokens (including burns from owner → 0)\n const fromLogs = await receiptContract.queryFilter(\n receiptContract.filters.Transfer(owner, null),\n fromBlock,\n toBlock\n );\n\n const owned = new Set<string>();\n\n // Add all received tokenIds\n for (const e of toLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.add(tokenId.toString());\n }\n\n // Remove all sent tokenIds\n for (const e of fromLogs) {\n const tokenId = e.args?.tokenId;\n if (!tokenId) continue;\n owned.delete(tokenId.toString());\n }\n\n // Convert to BigNumbers\n return Array.from(owned).map((id) => BigNumber.from(id));\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async fetchPreLaunchReceipts(address: string): Promise<preLaunchReceipt[]> {\n const receiptContract = this.contract.ReceiptNFT;\n\n // first figure out which tokenIds this address owns, from events\n const tokenIds = await this.getOwnedTokenIdsFor(address);\n\n const results: preLaunchReceipt[] = [];\n\n // next fetch on-chain receipt data just for those ids\n for (const idBN of tokenIds) {\n try {\n const receiptData = await receiptContract.getReceipt(idBN);\n const formattedReceipt = {\n account: receiptData.account,\n currency: receiptData.currency,\n kind: receiptData.kind,\n indexAtMint: receiptData.indexAtMint.toBigInt(),\n principal: {\n amount: receiptData.principal.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n shares: {\n amount: receiptData.shares.toBigInt(),\n decimals: 18,\n symbol: \"LiqETH\"\n },\n timestamp: new Date(Number(receiptData.timestamp.toString()) * 1000).toLocaleString(),\n }\n\n // Only fetch staking receipts (kind 1 is a wire pretoken receipt)\n if(receiptData.kind == 0) results.push({ tokenId: idBN.toBigInt(), receipt: formattedReceipt } as any);\n } catch (err) {\n // in case of any mismatch or race, just skip this id\n console.warn(`Failed to load receipt for tokenId=${idBN.toString()}`, err);\n continue;\n }\n }\n\n console.log('results of prelaunch receipts', results)\n return results;\n }\n\n\n /**\n * \n * @param amountWei an amount of liqETH (in WEI) to stake to the Outpost\n * @returns txHash (hash of the transaction), receipt, WithdrawnStake event\n */\n async performWithdrawStake(tokenId: BigNumber, recipient: string): Promise<WithdrawnStakeResult> {\n // Send the payable tx\n const tx = await this.contract.Depositor.withdrawStake(tokenId, recipient);\n\n // Wait for 1 confirmation \n const receipt = await tx.wait(1);\n\n // Parse Staked event if present\n let withdrawnstake: WithdrawnStakeEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'WithdrawnStake');\n\n if (ev && ev.args) {\n const { user, tokenOut, tokenId } = ev.args;\n withdrawnstake = {\n user: user,\n tokenOut: BigNumber.from(tokenOut),\n tokenId: BigNumber.from(tokenId)\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n withdrawnstake,\n };\n }\n}","import { BigNumber, ethers } from \"ethers\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors, sendOPPFinalize } from \"../utils\";\n\nexport class PretokenClient {\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n\n /**\n * Purchase pretokens by sending ETH to the Depositor.purchasePretokensWithETH(buyer) payable function.\n * Returns txHash, receipt and parsed PurchasedWithETH event (if present).\n */\n // async purchasePretokensWithETH(amountWei: BigNumber, buyer: string): Promise<any> {\n // // attempt a simulation of the purchase call\n // try {\n // await this.contract.Depositor.callStatic.purchasePretokensWithETH(buyer, { value: amountWei });\n // } catch (err: any) {\n // let errorObj = formatContractErrors(err);\n // throw new Error(errorObj.name ?? errorObj.raw)\n // }\n\n // // attempt the real purchase call\n // let tx, receipt;\n // try {\n // tx = await this.contract.Depositor.purchasePretokensWithETH(buyer, { value: amountWei });\n // receipt = await tx.wait(1);\n // } catch (err: any) {\n // let errorObj = formatContractErrors(err);\n // throw new Error(errorObj.name ?? errorObj.raw)\n // }\n\n\n // // Attempt to parse PurchasedWithETH event\n // let purchased: any | undefined;\n // const ev = receipt.events?.find((e) => e.event === 'PurchasedWithETH' || e.event === 'PurchasedWithETH(address,uint256,uint256,uint256)');\n\n // if (ev && ev.args) {\n // // event signature: PurchasedWithETH(address indexed user, uint256 ethIn, uint256 shares, uint256 tokenId)\n // const { user, ethIn, shares, tokenId } = ev.args as any;\n\n // purchased = {\n // buyer: user,\n // amount: BigNumber.from(ethIn),\n // shares: BigNumber.from(shares),\n // tokenId: BigNumber.from(tokenId),\n // };\n // }\n\n // return {\n // txHash: tx.hash,\n // receipt,\n // purchased,\n // };\n // }\n\n /**\n * Purchase pretokens by transferring liqETH into the pool (ERC-20) and calling Depositor.purchasePretokensWithLiqETH(amountLiq, buyer).\n * Returns txHash, receipt and parsed PurchasedWithLiqETH event (if present).\n */\n async purchasePretokensWithLiqETH(amountLiq: BigNumber, buyer: string): Promise<any> {\n // attempt a simulation of the purchase call\n try {\n await this.contract.Depositor.callStatic.purchasePretokensWithLiqETH(amountLiq, buyer);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n\n // ! TEMP for testing\n if(errorObj.name == \"OPP_PreviousEpochUnsent\") {\n console.error(\"OPP Previous Epoch is unsent - trigger OPP finalizeEpoch()\")\n await sendOPPFinalize(this.contract.OPP);\n throw new Error(errorObj.name+` - triggering OPP finalizeEpoch() please try again`);\n }\n\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // attempt the real purchase call\n let tx, receipt;\n try {\n tx = await this.contract.Depositor.purchasePretokensWithLiqETH(amountLiq, buyer);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n\n // Attempt to parse PurchasedWithLiqETH event\n let purchased: any | undefined;\n const ev = receipt.events?.find((e) => e.event === 'PurchasedWithLiqETH' || (e.event && e.event.toString().startsWith('PurchasedWithLiqETH')));\n\n if (ev && ev.args) {\n // Event shape: PurchasedWithLiqETH(buyer, amountLiq, ethEqWei, shares, tokenId)\n const args: any = ev.args;\n // try named fields first, fallback to positional\n const evtBuyer = args.buyer ?? args[0];\n const evtAmountLiq = (args.amountLiq ?? args[1]) ? BigNumber.from(args.amountLiq ?? args[1]) : undefined;\n const evtEthEqWei = (args.ethEqWei ?? args[2]) ? BigNumber.from(args.ethEqWei ?? args[2]) : undefined;\n const evtShares = (args.shares ?? args[3]) ? BigNumber.from(args.shares ?? args[3]) : undefined;\n const evtTokenId = (args.tokenId ?? args[4]) ? BigNumber.from(args.tokenId ?? args[4]) : undefined;\n\n purchased = {\n buyer: evtBuyer,\n amountLiq: evtAmountLiq,\n ethEqWei: evtEthEqWei,\n shares: evtShares,\n tokenId: evtTokenId,\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n purchased,\n };\n }\n\n\n\n}","import { BigNumber, ethers } from \"ethers\";\nimport { preLaunchReceipt, SharesBurnedEvent, StakedEvent, WithdrawnStakeEvent, WithdrawnStakeResult } from \"../types\";\nimport { EthereumContractService } from \"../contract\";\nimport { formatContractErrors } from \"../utils\";\n\nexport class LiqClient {\n\n private readonly contractService: EthereumContractService;\n \n get contract() { return this.contractService.contract; }\n\n constructor(contract: EthereumContractService) {\n this.contractService = contract;\n }\n \n\n public async safeBurn(signerAddress: string, amountWei: BigNumber): Promise<any> {\n let tx, receipt;\n try {\n tx = await this.contract.LiqEth.safeBurn(signerAddress, amountWei);\n receipt = await tx.wait(1);\n } catch (err: any) {\n let errorObj = formatContractErrors(err);\n throw new Error(errorObj.name ?? errorObj.raw)\n }\n\n // Parse SharesBurned event if present\n let event: SharesBurnedEvent | undefined;\n const ev = receipt.events?.find((e) => e.event === 'SharesBurned');\n\n if (ev && ev.args) {\n const { from, shares, tokenValue } = ev.args;\n event = {\n from,\n shares: BigNumber.from(shares),\n tokenValue: BigNumber.from(tokenValue),\n };\n }\n\n return {\n txHash: tx.hash,\n receipt,\n event,\n };\n }\n\n}","import { BigNumber, ethers } from 'ethers';\nimport { IStakingClient, Portfolio, StakerConfig, TrancheSnapshot } from '../../types';\nimport { ChainID, EvmChainID, PublicKey as WirePubKey } from '@wireio/core';\nimport { EthereumContractService } from './contract';\nimport { preLaunchReceipt } from './types';\nimport { DepositClient } from './clients/deposit.client';\nimport { StakeClient } from './clients/stake.client';\nimport { PretokenClient } from './clients/pretoken.client';\nimport { buildEthereumTrancheSnapshot } from './utils';\nimport { LiqClient } from './clients/liq.client';\n\n\n\n\nexport class EthereumStakingClient implements IStakingClient {\n public readonly pubKey?: WirePubKey;\n private readonly provider: ethers.providers.Web3Provider;\n private readonly signer: ethers.Signer;\n private readonly contractService: EthereumContractService;\n\n private depositClient: DepositClient;\n private liqClient: LiqClient;\n private pretokenClient: PretokenClient;\n private stakeClient: StakeClient;\n\n\n get contract() { return this.contractService.contract; }\n get network() { return this.config.network; }\n\n constructor(private config: StakerConfig) {\n try {\n this.provider = config.provider as ethers.providers.Web3Provider;\n this.signer = this.provider.getSigner();\n this.pubKey = config.pubKey;\n \n this.contractService = new EthereumContractService({\n provider: this.provider,\n signer: this.signer,\n });\n \n this.depositClient = new DepositClient(this.contractService);\n this.liqClient = new LiqClient(this.contractService);\n this.pretokenClient = new PretokenClient(this.contractService);\n this.stakeClient = new StakeClient(this.contractService);\n } \n catch (error) {\n // console.error('Error initializing EthereumStakingClient:', error);\n throw error;\n } \n }\n\n\n\n // ---------------------------------------------------------------------\n // Public IStakingClient Interface Methods\n // ---------------------------------------------------------------------\n\n /**\n * Deposit native ETH into the liqETH protocol via DepositManager.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async deposit(amount: number | string | bigint | BigNumber): Promise<string> {\n const amountWei = BigNumber.isBigNumber(amount)\n ? amount\n : BigNumber.from(amount);\n\n const result = await this.depositClient.performDeposit(amountWei);\n return result.txHash;\n }\n\n\n\n /**\n * Withdraw native ETH from the liqETH protocol via the liqeth safeBurn function, which burns the LiqETH and adds the user to the withdrawal queue.\n * @param amount Amount in wei (or something convertible to BigNumber).\n * @returns transaction hash\n */\n async withdraw(amount: bigint): Promise<string> {\n const address = await this.signer.getAddress();\n const amountWei = BigNumber.from(amount);\n // const chainId = this.network?.chainId ?? (await this.provider.getNetwork()).chainId;\n // const result = await this.depositClient.requestWithdraw(amountWei, this.signer, chainId);\n\n const result = await this.liqClient.safeBurn(address, amountWei)\n return result.txHash;\n }\n\n\n /**\n * Stake liqETH via DepositManager.\n * @param amount Amount in wei \n * Keep this as a bigint / string in the caller; avoid JS floats.\n * @returns transaction hash\n */\n async stake(amount: bigint): Promise<string> {\n const walletAddress = await this.signer.getAddress();\n const amountWei = BigNumber.from(amount);\n\n const result = await this.stakeClient.performStake(amountWei, walletAddress);\n return result.txHash;\n }\n\n\n // TODO\n async unstake(): Promise<string> {\n throw new Error(\"Method not yet implemented.\");\n }\n\n\n /**\n * ETH Prelaunch function to unstake liqEth\n * @param tokenId ReceiptNFT tokenId for the owned NFT that will be burned\n * @param recipient Address to receive the liqEth funds linked to the burned NFT\n * @returns the transaction hash\n */\n async unstakePrelaunch(tokenId: bigint, recipient: string): Promise<string> {\n const tokenIdBigNum = BigNumber.from(tokenId)\n const result = await this.stakeClient.performWithdrawStake(tokenIdBigNum, recipient);\n return result.txHash;\n }\n\n\n\n async buy(amount: bigint): Promise<string> {\n const buyer = await this.signer.getAddress();\n const amountBigNum = BigNumber.from(amount)\n\n // ! Hoodi only - check if the mock aggregator price is stale, and if so, update it before submitting the buy request\n await this.updateMockAggregatorPrice();\n \n\n const bal = await this.contract.LiqEth.balanceOf(buyer);\n const paused = await this.contract.Depositor.paused();\n if(paused) {\n throw new Error(\"Error - Depositor is in a paused state\");\n }\n\n // if current liq balance is less than the requested buy amount, throw an error\n if (bal.lt(amount)) {\n throw new Error(`Balance insufficient for pre-token purchase`);\n }\n\n //check that the contract has allowance for the token\n const depositorAddr = this.contract.Depositor.address;\n const allowance = await this.contract.LiqEth.allowance(buyer, depositorAddr);\n\n // if allowance is less than the requested stake amount, request permission to spend LiqEth\n if (allowance.lt(amount)) {\n const liqWrite = this.contractService.getWrite('LiqEth');\n\n // currently requested unlimited amount - potentially change to only request up to the current amount?\n const approveAmount = ethers.constants.MaxUint256;\n\n console.warn(`allowance insufficient (${allowance.toString()} < ${amount.toString()}); sending approve(${depositorAddr}, ${approveAmount.toString()})`);\n\n const approveTx = await liqWrite.approve(depositorAddr, approveAmount);\n await approveTx.wait(1);\n\n // re-read allowance to ensure approval succeeded\n const newAllowance = await this.contract.LiqEth.allowance(buyer, depositorAddr);\n if (newAllowance.lt(amount)) {\n throw new Error('Approval failed or allowance still insufficient after approve');\n }\n }\n\n\n let result = await this.pretokenClient.purchasePretokensWithLiqETH(amountBigNum, buyer);\n\n return result && result.txHash ? result.txHash : \"Error - no resulting txHash\";\n }\n\n\n \n\n async getOPPStatus(): Promise<any> {\n return await this.stakeClient.getOppStatus();\n }\n\n\n \n /**\n * ETH Prelaunch function to list the ReceiptNFTs owned by a specific user\n * @param address address to query the receipts for\n * @returns array of receipts\n */\n async fetchPrelaunchReceipts(address?: string): Promise<preLaunchReceipt[]> {\n if(address === undefined) address = await this.signer.getAddress();\n \n let receipts = await this.stakeClient.fetchPreLaunchReceipts(address);\n return receipts\n }\n\n \n \n async getEthStats(): Promise<any> {\n let withdrawDelay = await this.contract.DepositManager.withdrawDelay();\n let minDeposit = await this.contract.DepositManager.minDeposit();\n let rewardCooldown = await this.contract.DepositManager.rewardCooldown();\n\n return {\n withdrawDelay,\n minDeposit,\n rewardCooldown,\n }\n }\n\n /**\n * Resolve the user's ETH + liqETH balances.\n *\n * native = ETH in wallet\n * actual = liqETH token balance (ERC-20)\n * tracked = liqETH tracked balance (protocol/accounting view)\n */\n async getPortfolio(): Promise<Portfolio> {\n const walletAddress = await this.signer.getAddress();\n // console.log('getPortfolio() wallet address', walletAddress)\n\n\n // 1) Native ETH balance\n const nativeBalance = await this.provider.getBalance(walletAddress);\n const nativeDecimals = this.network?.nativeCurrency?.decimals ?? 18;\n const nativeSymbol = this.network?.nativeCurrency?.symbol ?? 'ETH';\n\n // 2) liqETH ERC-20 balance (actual)\n const liqBalance: ethers.BigNumber = await this.contract.LiqEth.balanceOf(walletAddress);\n const liqSymbol = 'Liq' + (this.network?.nativeCurrency?.symbol ?? 'ETH');\n\n // 3) staked liqEth ERC-20 balance (actual)\n const stakedLiqBalance = await this.contract.Depositor.sharesOf(walletAddress);\n\n\n const portfolio: Portfolio = {\n native: {\n amount: nativeBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: nativeSymbol,\n },\n liq: {\n amount: liqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n staked: {\n amount: stakedLiqBalance.toBigInt(),\n decimals: nativeDecimals,\n symbol: liqSymbol,\n },\n wire: {\n amount: BigInt(0), // TODO\n decimals: 0,\n symbol: '$WIRE',\n },\n chainID: this.network.chainId\n }\n return portfolio;\n }\n\n\n /**\n * Program-level prelaunch WIRE / tranche snapshot for Ethereum\n */\n async getTrancheSnapshot(options?: {\n chainID?: ChainID;\n windowBefore?: number;\n windowAfter?: number;\n }): Promise<TrancheSnapshot> {\n const {\n chainID = EvmChainID.Hoodi,\n windowBefore,\n windowAfter,\n } = options ?? {};\n\n\n const blockNumber = await this.provider.getBlockNumber();\n const blockTag = { blockTag: blockNumber };\n\n // Fetch all required contract data\n const [totalSharesBn, indexBn, trancheNumberBn, trancheSupplyBn, tranchePriceWadBn, totalSupplyBn, supplyGrowthBps, priceGrowthBps, minPriceUsd, maxPriceUsd] = await Promise.all([\n this.contract.Depositor.totalShares(blockTag),\n this.contract.Depositor.index(blockTag),\n this.contract.Pretoken.trancheNumber(blockTag),\n this.contract.Pretoken.trancheSupply(blockTag),\n this.contract.Pretoken.tranchePriceUsd(blockTag),\n this.contract.Pretoken.totalSupply(blockTag),\n this.contract.Pretoken.supplyGrowthBps(blockTag),\n this.contract.Pretoken.priceGrowthBps(blockTag),\n this.contract.EthUsdPriceConsumer.MIN_PRICE(),\n this.contract.EthUsdPriceConsumer.MAX_PRICE(),\n ]);\n\n\n const totalTrancheSupply = BigInt(totalSupplyBn.toString()) / BigInt(1e10);\n const currentTrancheSupply = BigInt(trancheSupplyBn.toString()) / BigInt(1e10);\n\n\n // fetch price and timestamp from aggregator\n const [ roundId, answer, startedAt, updatedAt, answeredInRound ] = await this.contract.Aggregator.latestRoundData();\n let ethPriceUsd: bigint = BigInt(answer.toString());\n let nativePriceTimestamp: number = Number(updatedAt);\n\n // ! Placeholder from hoodi deployment - don't think this can be fetched dynamically\n const initialTrancheSupply = BigInt(60000) * BigInt(1e8); \n\n return buildEthereumTrancheSnapshot({\n chainID,\n totalSharesBn, \n indexBn, \n trancheNumberBn,\n currentTrancheSupply, \n tranchePriceWadBn, \n totalTrancheSupply,\n initialTrancheSupply,\n supplyGrowthBps,\n priceGrowthBps,\n minPriceUsd, \n maxPriceUsd,\n\n ethPriceUsd,\n nativePriceTimestamp,\n ladderWindowBefore: windowBefore,\n ladderWindowAfter: windowAfter,\n });\n }\n\n\n\n \n // ---------------------------------------------------------------------\n // Internal ETH Staking client helper functions\n // ---------------------------------------------------------------------\n\n\n \n\n // ! This is a temporary measure for Hoodi testnet because there is no aggregator deployed\n private async updateMockAggregatorPrice() {\n const aggregator = this.contract.Aggregator;\n\n // read latest round & compute age\n const [roundId, answer, startedAt, updatedAt, answeredInRound] = await aggregator.latestRoundData();\n const now = (await this.provider.getBlock(\"latest\")).timestamp;\n const ageSec = Number(now) - Number(updatedAt);\n\n const ONE_HOUR = 1 * 3600;\n // const ONE_HOUR = 10;\n if (ageSec > ONE_HOUR) {\n // safety check - only run in non-production contexts\n const network = await this.provider.getNetwork();\n const chainId = network.chainId;\n const allowedTestChains = new Set([560048]); \n if (!allowedTestChains.has(chainId)) {\n console.warn(`MockAggregator is stale (${ageSec}s) but chainId ${chainId} is not a test/local network — skipping update.`);\n return;\n }\n\n\n //fetch the current ETH / USD price\n const res = await fetch('https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd');\n const data = await res.json();\n const ethUsd = data.ethereum.usd;\n\n const currentEthPrice = ethers.utils.parseUnits(ethUsd.toString(), 8);\n\n try {\n //update to be intentionally stale\n // const alttx = await aggregator.updateStale(currentEthPrice, now - 7200);\n // const altreceipt = await alttx.wait(1);\n // console.log('stale update receipt', altreceipt)\n\n //update answer with current timestamp\n const tx = await aggregator.updateAnswer(currentEthPrice);\n const txreceipt = await tx.wait(1);\n // console.log('MockAggregator answer updated - receipt:', txreceipt)\n } catch (err: any) {\n console.error('MockAggregator updateAnswer failed', err?.message || err);\n }\n } else {\n console.log(`MockAggregator updated ${ageSec}s ago — no update needed`);\n }\n }\n\n\n\n\n\n // TODO: implement claimRewards, etc.\n}","// src/staker/staker.ts\n\nimport { ChainID, EvmChainID, SolChainID } from '@wireio/core';\nimport { IStakingClient, StakerConfig } from './types';\nimport { SolanaStakingClient } from './networks/solana/solana';\nimport { EthereumStakingClient } from './networks/ethereum/ethereum';\n\nexport class Staker {\n public selectedChainID?: ChainID;\n private clients: Map<ChainID, IStakingClient> = new Map();\n\n /**\n * Get the staking client for the currently selected chain.\n * @returns The staking client instance.\n */\n get client(): IStakingClient | undefined {\n return this.selectedChainID && this.isConfigured(this.selectedChainID)\n ? this.clients.get(this.selectedChainID) : undefined;\n }\n\n /** Is there a client configured for this chain? */\n isConfigured(chainId: ChainID): boolean {\n return this.clients.has(chainId);\n }\n\n /** List of configured chains */\n listConfigured(): ChainID[] {\n return [...this.clients.keys()];\n }\n\n constructor(config: StakerConfig | StakerConfig[], selectedChainID?: ChainID) {\n if (!config) throw new Error('StakerConfig is required');\n if (!Array.isArray(config)) config = [config];\n\n // console.log('STAKER INIT', config);\n\n config.forEach((cfg) => {\n switch (cfg.network.chainId) {\n case SolChainID.WireTestnet:\n this.clients.set(cfg.network.chainId, new SolanaStakingClient(cfg));\n break;\n\n case EvmChainID.Hoodi:\n this.clients.set(EvmChainID.Hoodi, new EthereumStakingClient(cfg));\n break;\n\n default:\n console.log(`No staking client available for chain ${cfg.network.chainId}`);\n throw new Error(`Unsupported network curve: ${cfg.network.name}`);\n }\n });\n\n this.selectedChainID = selectedChainID;\n }\n \n /**\n * Select a chain. Returns true if a client exists for it, false otherwise.\n * (We still record the selectedChainID so the UI can reflect the chosen chain.)\n */\n setChain(chainID: ChainID): boolean {\n this.selectedChainID = chainID;\n return this.clients.has(chainID);\n }\n}","import { BigNumber, ethers } from 'ethers';\nimport { BalanceView } from '../../types';\n\nexport const CONTRACT_NAMES = [\n 'Accounting',\n 'DepositManager',\n 'LiqEth',\n 'StakingModule',\n 'WithdrawalQueue',\n 'WithdrawalVault',\n\n //Outpost contracts\n 'Depositor',\n 'ReceiptNFT',\n 'OutpostManager',\n 'BAR',\n 'OPP',\n 'OPPCommon',\n 'OPPInbound',\n 'Pretoken',\n 'Aggregator',\n 'EthUsdPriceConsumer',\n\n] as const;\n\nexport type ContractName = typeof CONTRACT_NAMES[number];\nexport type AddressBook = Record<ContractName, string>;\n\n\ninterface Result {\n /** EVM transaction hash */\n txHash: string;\n /** Full receipt, if you want it */\n receipt: ethers.providers.TransactionReceipt;\n}\n\n\nexport interface DepositEvent {\n user: string;\n netEth: BigNumber;\n fee: BigNumber;\n shares: BigNumber;\n}\n\nexport interface DepositResult extends Result {\n /** Parsed Deposited event, if present */\n deposited?: DepositEvent;\n}\n\nexport interface WithdrawRequestedEvent {\n user: string;\n ethAmount: BigNumber;\n nftId: BigNumber;\n readyAt: string;\n}\n\nexport interface WithdrawResult extends Result {\n /** Parsed WithdrawRequested event, if present */\n withdrawRequested?: WithdrawRequestedEvent;\n}\n\n\nexport interface StakedEvent {\n user: string;\n amountLiq: BigNumber;\n shares: BigNumber;\n tokenId: BigNumber;\n}\n\nexport interface StakedResult extends Result {\n /** Parsed Staked event, if present */\n staked?: StakedEvent;\n}\n\n\nexport interface WithdrawnStakeEvent {\n user: string;\n tokenId: BigNumber;\n tokenOut: BigNumber;\n}\nexport interface WithdrawnStakeResult extends Result {\n /** Parsed WithdrawnStake event, if present */\n withdrawnstake?: WithdrawnStakeEvent;\n\n}\n\nexport interface SharesBurnedEvent {\n from: string;\n shares: BigNumber;\n tokenValue: BigNumber;\n}\n\nexport interface preLaunchReceipt {\n tokenId: bigint;\n receipt: {\n account: string,\n currency: number,\n kind: number,\n indexAtMint: BalanceView,\n principal: BalanceView,\n shares: BalanceView,\n timestamp: string,\n }\n}"],"names":["PublicKey","liqSolTokenIDL","validatorLeaderboardIDL","__async","StakeProgram","INDEX_SCALE","liqsolCoreJson","Program","getAssociatedTokenAddressSync","TOKEN_2022_PROGRAM_ID","BN","SystemProgram","ASSOCIATED_TOKEN_PROGRAM_ID","SYSVAR_INSTRUCTIONS_PUBKEY","SYSVAR_CLOCK_PUBKEY","SYSVAR_STAKE_HISTORY_PUBKEY","SYSVAR_RENT_PUBKEY","Transaction","BPS","growOnce","shrinkOnce","Keypair","AnchorProvider","getAssociatedTokenAddress","SolPubKey","KeyType","Connection","DepositClient","ComputeBudgetProgram","SolChainID","ethers","Contract","BigNumber","tokenId","EvmChainID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,MAAM,WAAc,GAAA;AAAA,EACvB,WAAa,EAAA,IAAIA,iBAAU,CAAA,aAAA,CAAc,OAAO,CAAA;AAAA,EAChD,YAAc,EAAA,IAAIA,iBAAU,CAAAC,eAAA,CAAe,OAAO,CAAA;AAAA,EAClD,qBAAuB,EAAA,IAAID,iBAAU,CAAAE,wBAAA,CAAwB,OAAO,CAAA;AAAA,EACpE,aAAe,EAAA,IAAIF,iBAAU,CAAA,eAAA,CAAgB,OAAO,CAAA;AACxD,EAAA;AAEa,MAAA;AAAA,EACT,WAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AACJ,CAAI,GAAA,YAAA;AAQG,MAAM,SAAY,GAAA;AAAA,EAErB,iBAAmB,EAAA,mBAAA;AAAA,EACnB,KAAO,EAAA,OAAA;AAAA,EACP,YAAc,EAAA,cAAA;AAAA,EACd,sBAAwB,EAAA,kBAAA;AAAA,EACxB,YAAc,EAAA,cAAA;AAAA,EAGd,WAAa,EAAA,aAAA;AAAA,EACb,qBAAuB,EAAA,gBAAA;AAAA,EACvB,gBAAkB,EAAA,eAAA;AAAA,EAGlB,kBAAoB,EAAA,oBAAA;AAAA,EAEpB,WAAa,EAAA,aAAA;AAAA,EAGb,gBAAkB,EAAA,kBAAA;AAAA,EAClB,aAAe,EAAA,eAAA;AAAA,EAGf,iBAAmB,EAAA,mBAAA;AAAA,EACnB,gBAAkB,EAAA,WAAA;AAAA,EAClB,iBAAmB,EAAA,mBAAA;AAAA,EAGnB,oBAAsB,EAAA,sBAAA;AAAA,EACtB,WAAa,EAAA,aAAA;AAAA,EACb,eAAiB,EAAA,iBAAA;AAAA,EACjB,oBAAsB,EAAA,sBAAA;AAAA,EACtB,aAAe,EAAA,eAAA;AAAA,EAGf,cAAgB,EAAA,WAAA;AAAA,EAChB,iBAAmB,EAAA,cAAA;AAAA,EACnB,eAAiB,EAAA,YAAA;AAAA,EAGjB,mBAAqB,EAAA,qBAAA;AAAA,EAGrB,eAAiB,EAAA,QAAA;AAAA,EACjB,sBAAwB,EAAA,wBAAA;AAAA,EACxB,aAAe,EAAA,eAAA;AAAA,EACf,kBAAoB,EAAA,oBAAA;AAAA,EACpB,uBAAyB,EAAA,gBAAA;AAAA,EACzB,aAAe,EAAA,eAAA;AAAA,EACf,gBAAkB,EAAA,kBAAA;AAAA,EAClB,aAAe,EAAA,MAAA;AACnB,EAAA;AAQa,MAAA,mBAAA,GAAsB,MAC/BA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EACnC,YAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,4BAAA,GAA+B,MACxCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,qBAAqB,CAAC,CAAA;AAAA,EAC7C,YAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,yBAAA,GAA4B,MACrCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,iBAAiB,CAAC,CAAA;AAAA,EACzC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,cAAA,GAAiB,MAC1BA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC7B,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,oBAAA,GAAuB,MAChCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,EACpC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,sBAAsB,CAAC,CAAA;AAAA,EAC9C,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,oBAAA,GAAuB,MAChCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,EACpC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,wBAAA,GAA2B,MACpCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAAA,EACxC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,0BAAA,GAA6B,MACtCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,kBAAkB,CAAC,CAAA;AAAA,EAC1C,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAQM,MAAA,mBAAA,GAAsB,CAAC,IAAA,KAChCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,WAAW,CAAG,EAAA,IAAA,CAAK,UAAU,CAAA;AAAA,EACpD,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,uBAAA,GAA0B,MACnCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAAA,EACxC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAQM,MAAA,uBAAA,GAA0B,MACnCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA,EACvC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,sBAAsB,CAAC,CAAA;AAAA,EAC9C,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,qBAAA,GAAwB,MACjCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACrC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,0BAAA,GAA6B,MACtCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,kBAAkB,CAAC,CAAA;AAAA,EAC1C,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,8BAAA,GAAiC,MAC1CA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,uBAAuB,CAAC,CAAA;AAAA,EAC/C,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACrC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAKM,MAAA,wBAAA,GAA2B,CAAC,SAA+B,KAAA;AACpE,EAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAErC,EAAM,MAAA,QAAA,GACF,OAAO,SAAc,KAAA,QAAA,GACf,YACA,MAAO,CAAA,SAAA,CAAU,UAAU,CAAA,CAAA;AACrC,EAAA,cAAA,CAAe,iBAAiB,QAAQ,CAAA,CAAA;AACxC,EAAA,OAAOA,iBAAU,CAAA,sBAAA;AAAA,IACb,CAAC,MAAO,CAAA,IAAA,CAAK,SAAU,CAAA,aAAa,GAAG,cAAc,CAAA;AAAA,IACrD,WAAA;AAAA,IACF,CAAC,CAAA,CAAA;AACP,EAAA;AAEa,MAAA,uBAAA,GAA0B,CAAC,OAAA,KACpCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAG,EAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC5D,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAQM,MAAA,yBAAA,GAA4B,MACrCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,iBAAiB,CAAC,CAAA;AAAA,EACzC,qBAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,wBAAA,GAA2B,CAAC,WAAA,KACrCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,gBAAgB,CAAG,EAAA,WAAA,CAAY,UAAU,CAAA;AAAA,EAChE,qBAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC7B,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAQM,MAAA,2BAAA,GAA8B,MACvCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,oBAAoB,CAAC,CAAA;AAAA,EAC5C,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,6BAAA,GAAgC,MACzCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EACnC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,uBAAA,GAA0B,CAAC,IAAA,KACpCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,eAAe,CAAG,EAAA,IAAA,CAAK,UAAU,CAAA;AAAA,EACxD,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,2BAAA,GAA8B,CAAC,IAAA,KACxCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,oBAAoB,CAAG,EAAA,IAAA,CAAK,UAAU,CAAA;AAAA,EAC7D,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,qBAAA,GAAwB,MACjCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACrC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,qBAAA,GAAwB,MACjCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACrC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAMM,MAAA,kBAAA,GAAqB,MAC9BA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,MAAA,CAAO,IAAK,CAAA,SAAA,CAAU,cAAc,CAAC,CAAA;AAAA,EACtC,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,kBAAA,GAAqB,CAAC,WAAA,KAC/BA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,eAAe,CAAG,EAAA,MAAA,CAAO,IAAK,CAAA,WAAW,CAAC,CAAA;AAAA,EACjE,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAEM,MAAA,oBAAA,GAAuB,CAAC,KAAA,KACjCA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,iBAAiB,CAAG,EAAA,KAAA,CAAM,UAAU,CAAA;AAAA,EAC3D,WAAA;AACJ,CAAA,CAAE,CAAC,EAAA;AAKM,MAAA,6BAAA,GAAgC,CAAC,UAAA,KAC1CA,iBAAU,CAAA,sBAAA;AAAA,EACN,CAAC,OAAO,IAAK,CAAA,SAAA,CAAU,mBAAmB,CAAG,EAAA,UAAA,CAAW,UAAU,CAAA;AAAA,EAClE,WAAY,CAAA,aAAA;AAChB,CAAA,CAAE,CAAC,EAAA;AAMM,MAAA,2BAAA,GAA8B,CACvC,IAAA,EACA,IACqB,KAAAG,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACrB,EAAM,MAAA,OAAA,GAAU,aAAa,IAAI,CAAA,CAAA,CAAA;AACjC,EAAA,OAAOH,iBAAU,CAAA,cAAA,CAAe,IAAM,EAAA,OAAA,EAASI,qBAAa,SAAS,CAAA,CAAA;AACzE,CAAA,EAAA;AAKO,MAAM,iBAAiB,IAAIJ,iBAAA;AAAA,EAC9B,8CAAA;AACJ,EAAA;AACO,MAAM,oBAAoB,IAAIA,iBAAA;AAAA,EACjC,8CAAA;AACJ,EAAA;AASa,MAAA,qBAAA,GAAwB,OAAO,IAAiB,EAAA;AAGhD,MAAA,wBAAA,GAA2B,OAAO,SAAW,EAAA;AAGnD,MAAM,yBAA4B,GAAA,EAAA;AAGlC,MAAM,wBAA2B,GAAA,QAAA;AAGjC,MAAM,gBAAmB,GAAA,IAAA;AAEnB,MAAAK,aAAA,GAAc,OAAO,IAAiB,EAAA;AAE5C,MAAM,aAAgB,GAAA,CAAC,QAC1B,KAAA,MAAA,CAAO,QAAQ,CAAI,GAAA,iBAAA;AAEV,MAAA,aAAA,GAAgB,CAAC,GAC1B,KAAA,MAAA,CAAO,KAAK,KAAM,CAAA,GAAA,GAAM,gBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;AC1W7C,MAAM,QAAW,GAAA;AAAA,EACb,UAAY,EAAA;AAAA,IACR,GAAK,EAAAC,aAAA;AAAA,IACL,OAAA,EAAS,WAAY,CAAA,WAAA,CAAY,QAAS,EAAA;AAAA,GAC9C;AAAA,EACA,WAAa,EAAA;AAAA,IACT,GAAK,EAAA,eAAA;AAAA,IACL,OAAA,EAAS,WAAY,CAAA,YAAA,CAAa,QAAS,EAAA;AAAA,GAC/C;AAAA,EACA,oBAAsB,EAAA;AAAA,IAClB,GAAK,EAAA,wBAAA;AAAA,IACL,OAAA,EAAS,WAAY,CAAA,qBAAA,CAAsB,QAAS,EAAA;AAAA,GACxD;AACJ,CAAA,CAAA;AAIO,MAAM,oBAAqB,CAAA;AAAA,EAC9B,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAAA,GAA4B;AAAA,EAEhD,WAAwC,IAA+C,EAAA;AACnF,IAAA,MAAM,EAAE,GAAA,EAAK,OAAQ,EAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AACtC,IAAA,MAAM,WAAc,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAAK,GAAL,CAAA,EAAA,EAAU,OAAQ,EAAA,CAAA,CAAA;AACtC,IAAA,OAAO,IAAIC,cAAA,CAAQ,WAAa,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,GACjD;AAAA,EAEA,gBAAwC,GAAA;AACpC,IAAO,OAAA,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAA;AAAA,GAC/B;AACJ;;;;;;;;;;;;;;;;;;;;;;;sBCDO,MAAM,aAAc,CAAA;AAAA,EAOvB,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAChB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,GAC9C;AAAA,EAPA,IAAI,MAAqB,GAAA;AACrB,IAAA,OAAO,KAAK,QAAS,CAAA,MAAA,CAAA;AAAA,GACzB;AAAA,EAWM,eACF,EAEoB,EAAA;AAAA,IAAA,OAAAJ,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,WAFpB,MACA,EAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,SACC,EAAA;AACpB,MAAA,IAAI,CAAC,IAAM,EAAA;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,oDAAA;AAAA,SACJ,CAAA;AAAA,OACJ;AACA,MAAA,IAAI,CAAC,MAAA,IAAU,MAAU,IAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,iEAAA;AAAA,SACJ,CAAA;AAAA,OACJ;AAKA,MAAA,MAAM,mBAAmB,yBAA0B,EAAA,CAAA;AACnD,MAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,MAAA,MAAM,sBAAsB,4BAA6B,EAAA,CAAA;AACzD,MAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,MAAA,MAAM,QAAQ,cAAe,EAAA,CAAA;AAC7B,MAAA,MAAM,kBAAkB,6BAA8B,EAAA,CAAA;AACtD,MAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,MAAA,MAAM,kBAAkB,wBAAyB,EAAA,CAAA;AACjD,MAAA,MAAM,iBAAiB,uBAAwB,EAAA,CAAA;AAK/C,MAAA,MAAM,OAAU,GAAAK,sCAAA;AAAA,QACZ,UAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAKA,MAAA,MAAM,oBAAoB,0BAA2B,EAAA,CAAA;AACrD,MAAM,MAAA,UAAA,GAAa,oBAAoB,OAAO,CAAA,CAAA;AAE9C,MAAA,MAAM,kBAAqB,GAAAD,sCAAA;AAAA,QACvB,UAAA;AAAA,QACA,eAAA;AAAA,QACA,IAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAKA,MAAA,MAAM,OAAO,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,SAAK,EAAE,CAAA,CAAA,CAAA;AAC/C,MAAA,MAAM,cAAiB,GAAA,MAAM,2BAA4B,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAKnE,MAAA,MAAM,EAA6B,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,QACjD,OAAQ,CAAA,IAAIC,SAAG,CAAA,MAAA,CAAO,QAAS,EAAC,CAAG,EAAA,IAAI,EACvC,QAAS,CAAA;AAAA,QACN,IAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAeC,qBAAc,CAAA,SAAA;AAAA,QAC7B,YAAc,EAAAF,8BAAA;AAAA,QACd,sBAAwB,EAAAG,oCAAA;AAAA,QACxB,eAAe,WAAY,CAAA,YAAA;AAAA,QAC3B,cAAcR,oBAAa,CAAA,SAAA;AAAA,QAE3B,UAAA;AAAA,QACA,OAAA;AAAA,QACA,mBAAA;AAAA,QACA,WAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA;AAAA,QAEA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QAEA,UAAA;AAAA,QACA,iBAAA;AAAA,QACA,cAAA;AAAA,QAEA,kBAAoB,EAAAS,kCAAA;AAAA,QACpB,KAAO,EAAAC,2BAAA;AAAA,QACP,YAAc,EAAAC,mCAAA;AAAA,QACd,IAAM,EAAAC,0BAAA;AAAA,OACT,EACA,WAAY,EAAA,CAAA;AAEjB,MAAA,OAAO,IAAIC,mBAAA,EAAc,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAAA,GAAA;AAAA,EAWM,gBACF,EAEoB,EAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,WAFpB,MACA,EAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,SACC,EAAA;AACpB,MAAA,IAAI,CAAC,IAAM,EAAA;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,qDAAA;AAAA,SACJ,CAAA;AAAA,OACJ;AACA,MAAA,IAAI,CAAC,MAAA,IAAU,MAAU,IAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,kEAAA;AAAA,SACJ,CAAA;AAAA,OACJ;AAKA,MAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AAEvC,MAAA,MAAM,OAAU,GAAAK,sCAAA;AAAA,QACZ,UAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAIA,MAAM,MAAA,UAAA,GAAa,oBAAoB,OAAO,CAAA,CAAA;AAC9C,MAAA,MAAM,oBAAoB,0BAA2B,EAAA,CAAA;AAGrD,MAAA,MAAM,SAAS,uBAAwB,EAAA,CAAA;AACvC,MAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,MAAA,MAAM,uBAAuB,6BAA8B,EAAA,CAAA;AAC3D,MAAA,MAAM,eAAe,qBAAsB,EAAA,CAAA;AAC3C,MAAA,MAAM,oBAAoB,0BAA2B,EAAA,CAAA;AAKrD,MAAA,MAAM,cAAc,MAAM,IAAA,CAAK,QAAQ,OAAQ,CAAA,MAAA,CAAO,MAAM,MAAM,CAAA,CAAA;AAClE,MAAM,MAAA,SAAA,GAAa,WAAY,CAAA,aAAA,CAAqB,QAAS,EAAA,CAAA;AAK7D,MAAA,MAAM,gBAAgB,8BAA+B,EAAA,CAAA;AACrD,MAAA,MAAM,WAAW,6BAA8B,EAAA,CAAA;AAE/C,MAAM,MAAA,OAAA,GAAU,yBAAyB,SAAS,CAAA,CAAA;AAClD,MAAM,MAAA,WAAA,GAAc,wBAAwB,OAAO,CAAA,CAAA;AAEnD,MAAA,MAAM,KAAQ,GAAA,IAAA,CAAA;AACd,MAAA,MAAM,MAAS,GAAAD,sCAAA;AAAA,QACX,OAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAGA,MAAA,MAAM,kBAAkB,wBAAyB,EAAA,CAAA;AACjD,MAAA,MAAM,kBAAqB,GAAAD,sCAAA;AAAA,QACvB,UAAA;AAAA,QACA,eAAA;AAAA,QACA,IAAA;AAAA,QACAC,8BAAA;AAAA,OACJ,CAAA;AAKA,MAAA,MAAM,EAA6B,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,OACjD,CAAA,eAAA,CAAgB,IAAIC,SAAA,CAAG,MAAO,CAAA,QAAA,EAAU,CAAC,EACzC,QAAS,CAAA;AAAA,QACN,IAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA,oBAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAA;AAAA,QACA,KAAO,EAAAI,2BAAA;AAAA,QACP,aAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAA;AAAA,QACA,YAAc,EAAAL,8BAAA;AAAA,QACd,cAAgB,EAAAA,8BAAA;AAAA,QAChB,sBAAwB,EAAAG,oCAAA;AAAA,QACxB,eAAeD,qBAAc,CAAA,SAAA;AAAA,QAC7B,IAAM,EAAAK,0BAAA;AAAA,OACT,EACA,WAAY,EAAA,CAAA;AAEjB,MAAA,OAAO,IAAIC,mBAAA,EAAc,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;ACjPO,MAAM,kBAAmB,CAAA;AAAA,EAG5B,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAChB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,IAAI,UAAa,GAAA;AACb,IAAA,OAAO,KAAK,QAAS,CAAA,UAAA,CAAA;AAAA,GACzB;AAAA,EAOM,oBAA0D,GAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC5D,MAAA,MAAM,MAAM,0BAA2B,EAAA,CAAA;AACvC,MAAI,IAAA;AACA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,iBAAA,CAAkB,MAAM,GAAG,CAAA,CAAA;AAAA,OACzD,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAOM,cACF,UACsC,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACtC,MAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AAGvC,MAAI,IAAA;AACA,QAAA,MAAM,GAAM,GAAAK,sCAAA;AAAA,UACR,UAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA;AAAA,UACAC,8BAAA;AAAA,SACJ,CAAA;AACA,QAAM,MAAA,aAAA,GAAgB,oBAAoB,GAAG,CAAA,CAAA;AAC7C,QAAA,MAAM,gBACF,MAAM,IAAA,CAAK,QAAQ,OAAQ,CAAA,UAAA,CAAW,cAAc,aAAa,CAAA,CAAA;AACrE,QAAA,IAAI,aAAe,EAAA;AACf,UAAO,OAAA,aAAA,CAAA;AAAA,SACX;AAAA,OACI,CAAA,OAAA,CAAA,EAAA;AAAA,OAER;AAGA,MAAI,IAAA;AACA,QAAM,MAAA,UAAA,GAAa,oBAAoB,UAAU,CAAA,CAAA;AACjD,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,UAAA,CAAW,cAAc,UAAU,CAAA,CAAA;AAAA,OACjE,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAOM,cAAc,IAA8B,EAAA;AAAA,IAAA,OAAAN,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC9C,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAC5C,MAAA,OAAO,MAAS,GAAA,MAAA,CAAO,MAAS,GAAA,IAAIO,UAAG,CAAC,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AAAA,GAAA;AAAA,EASM,qBAAqB,IAIxB,EAAA;AAAA,IAAA,OAAAP,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACC,MAAA,MAAM,CAAC,IAAM,EAAA,UAAU,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QACzC,KAAK,oBAAqB,EAAA;AAAA,QAC1B,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,OAC1B,CAAA,CAAA;AAED,MAAA,MAAM,cAAc,IAAO,GAAA,IAAA,CAAK,WAAc,GAAA,IAAIO,UAAG,CAAC,CAAA,CAAA;AAEtD,MAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AACZ,MAAI,IAAA,CAAC,WAAY,CAAA,MAAA,EAAU,EAAA;AAGvB,QAAA,KAAA,GAAQ,UAAW,CAAA,QAAA,EAAa,GAAA,WAAA,CAAY,QAAS,EAAA,CAAA;AAAA,OACzD;AAEA,MAAA,OAAO,EAAE,MAAA,EAAQ,UAAY,EAAA,WAAA,EAAa,KAAM,EAAA,CAAA;AAAA,KACpD,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;ACpHO,MAAM,iBAAkB,CAAA;AAAA,EAG3B,YAAoB,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAChB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,sBAAsB,CAAA,CAAA;AAAA,GACxD;AAAA,EAEM,QAA6C,GAAA;AAAA,IAAA,OAAAP,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC/C,MAAA,MAAM,MAAM,yBAA0B,EAAA,CAAA;AACtC,MAAI,IAAA;AAEA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,gBAAA,CAAiB,MAAM,GAAG,CAAA,CAAA;AAAA,OACxD,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,mBAAmB,WAAyD,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC9E,MAAM,MAAA,GAAA,GAAM,yBAAyB,WAAW,CAAA,CAAA;AAChD,MAAI,IAAA;AAEA,QAAA,OAAO,MAAM,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,eAAA,CAAgB,cAAc,GAAG,CAAA,CAAA;AAAA,OAC/D,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAcM,gBAAA,CAAiB,QAAQ,EAAgC,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAE3D,MAAI,IAAA;AACA,QAAA,MAAM,iBAAiB,yBAA0B,EAAA,CAAA;AACjD,QAAA,MAAM,cACA,MAAM,IAAA,CAAK,QAAQ,OAAQ,CAAA,gBAAA,CAAiB,MAAM,cAAc,CAAA,CAAA;AAEtE,QAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,gBAAgB,GAAI,EAAA,CAAA;AAC3D,QAAM,MAAA,OAAA,QAAc,GAA6B,EAAA,CAAA;AAEjD,QAAA,KAAA,MAAW,KAAK,GAAK,EAAA;AACjB,UAAA,MAAM,KAAK,CAAE,CAAA,OAAA,CAAA;AACb,UAAQ,OAAA,CAAA,GAAA,CAAI,EAAG,CAAA,aAAA,EAAe,EAAE,CAAA,CAAA;AAAA,SACpC;AAEA,QAAA,MAAM,MAAM,IAAK,CAAA,GAAA;AAAA,UACb,KAAA;AAAA,UACA,WAAY,CAAA,aAAA;AAAA,UACZ,YAAY,aAAc,CAAA,MAAA;AAAA,SAC9B,CAAA;AAEA,QAAA,MAAM,MAAyB,EAAC,CAAA;AAChC,QAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC1B,UAAM,MAAA,GAAA,GAAM,WAAY,CAAA,aAAA,CAAc,CAAC,CAAA,CAAA;AACvC,UAAM,MAAA,GAAA,GAAM,OAAQ,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAC3B,UAAA,IAAI,GAAK,EAAA;AACL,YAAA,GAAA,CAAI,KAAK,GAAG,CAAA,CAAA;AAAA,WAChB;AAAA,SACJ;AAEA,QAAO,OAAA,GAAA,CAAA;AAAA,eACF,CAAG,EAAA;AAER,QAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,gBAAgB,GAAI,EAAA,CAAA;AAE3D,QAAI,GAAA,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA;AACf,UAAA,MAAM,KAAK,CAAE,CAAA,OAAA,CAAA;AACb,UAAA,MAAM,KAAK,CAAE,CAAA,OAAA,CAAA;AACb,UAAA,MAAM,KAAK,EAAG,CAAA,eAAA,CAAA;AACd,UAAA,MAAM,KAAK,EAAG,CAAA,eAAA,CAAA;AAEd,UAAO,OAAA,EAAA,CAAG,IAAI,EAAE,CAAA,CAAA;AAAA,SACnB,CAAA,CAAA;AAED,QAAO,OAAA,GAAA,CAAI,MAAM,CAAG,EAAA,KAAK,EAAE,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAA;AAAA,OACjD;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;AC7CA,MAAM,WAAA,GAAc,OAAO,IAAiB,CAAA,CAAA;AAC1B,OAAO,GAAW,EAAA;AACpC,MAAMe,KAAA,GAAM,OAAO,GAAM,CAAA,CAAA;AAGlB,SAAS,SAAS,CAAgB,EAAA;AACrC,EAAI,IAAA,OAAO,CAAM,KAAA,QAAA,EAAiB,OAAA,CAAA,CAAA;AAClC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAU,EAAA,OAAO,OAAO,CAAC,CAAA,CAAA;AAE1C,EAAO,OAAA,MAAA,CAAO,CAAE,CAAA,QAAA,EAAU,CAAA,CAAA;AAC9B,CAAA;AAMgB,SAAA,cAAA,CAAe,QAAgB,YAA8B,EAAA;AACzE,EAAA,IAAI,WAAW,MAAO,CAAA,CAAC,CAAG,EAAA,OAAO,OAAO,CAAC,CAAA,CAAA;AACzC,EAAA,MAAM,MAAM,MAAS,GAAA,WAAA,CAAA;AACrB,EAAA,MAAM,IAAI,GAAM,GAAA,YAAA,CAAA;AAChB,EAAA,MAAM,IAAI,GAAM,GAAA,YAAA,CAAA;AAChB,EAAA,OAAO,MAAM,MAAO,CAAA,CAAC,IAAI,CAAI,GAAA,CAAA,GAAI,OAAO,CAAC,CAAA,CAAA;AAC7C,CAAA;AAMA,SAASC,UAAA,CAAS,OAAe,SAA2B,EAAA;AACxD,EAAM,MAAA,CAAA,GAAI,OAAO,SAAS,CAAA,CAAA;AAC1B,EAAA,OAAA,CAAQ,SAASD,KAAM,GAAA,CAAA,CAAA,GAAKA,KAAM,GAAA,MAAA,CAAO,CAAC,CAAK,IAAAA,KAAA,CAAA;AACnD,CAAA;AAMA,SAASE,YAAA,CAAW,OAAe,SAA2B,EAAA;AAC1D,EAAM,MAAA,CAAA,GAAI,OAAO,SAAS,CAAA,CAAA;AAC1B,EAAA,OAAA,CAAQ,QAAQF,KAAO,GAAA,CAAAA,KAAA,GAAM,KAAK,MAAO,CAAA,CAAC,MAAMA,KAAM,GAAA,CAAA,CAAA,CAAA;AAC1D,CAAA;AAYO,SAAS,yBAAyB,OASjB,EAAA;AACpB,EAAM,MAAA;AAAA,IACF,cAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAe,GAAA,CAAA;AAAA,IACf,WAAc,GAAA,CAAA;AAAA,GACd,GAAA,OAAA,CAAA;AAEJ,EAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,iBAAiB,YAAY,CAAA,CAAA;AACzD,EAAA,MAAM,QAAQ,cAAiB,GAAA,WAAA,CAAA;AAE/B,EAAM,MAAA,QAAA,QAAe,GAAoB,EAAA,CAAA;AACzC,EAAM,MAAA,KAAA,QAAY,GAAoB,EAAA,CAAA;AAGtC,EAAS,QAAA,CAAA,GAAA,CAAI,gBAAgB,oBAAoB,CAAA,CAAA;AACjD,EAAM,KAAA,CAAA,GAAA,CAAI,gBAAgB,eAAe,CAAA,CAAA;AAGzC,EAAA,KAAA,IAAS,EAAK,GAAA,cAAA,GAAiB,CAAG,EAAA,EAAA,IAAM,OAAO,EAAM,EAAA,EAAA;AACjD,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACnC,IAAA,MAAM,SAAY,GAAA,KAAA,CAAM,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAIC,UAAS,CAAA,OAAA,EAAS,eAAe,CAAC,CAAA,CAAA;AACnD,IAAA,KAAA,CAAM,GAAI,CAAA,EAAA,EAAIA,UAAS,CAAA,SAAA,EAAW,cAAc,CAAC,CAAA,CAAA;AAAA,GACrD;AAGA,EAAA,KAAA,IAAS,EAAK,GAAA,cAAA,GAAiB,CAAG,EAAA,EAAA,IAAM,SAAS,EAAM,EAAA,EAAA;AACnD,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AACnC,IAAA,MAAM,SAAY,GAAA,KAAA,CAAM,GAAI,CAAA,EAAA,GAAK,CAAC,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,GAAI,CAAA,EAAA,EAAIC,YAAW,CAAA,OAAA,EAAS,eAAe,CAAC,CAAA,CAAA;AACrD,IAAA,KAAA,CAAM,GAAI,CAAA,EAAA,EAAIA,YAAW,CAAA,SAAA,EAAW,cAAc,CAAC,CAAA,CAAA;AAAA,GACvD;AAEA,EAAA,MAAM,SAA8B,EAAC,CAAA;AACrC,EAAA,KAAA,IAAS,EAAK,GAAA,OAAA,EAAS,EAAM,IAAA,KAAA,EAAO,EAAM,EAAA,EAAA;AACtC,IAAM,MAAA,GAAA,GAAM,QAAS,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAC3B,IAAI,IAAA,IAAA,CAAA;AACJ,IAAA,IAAI,KAAK,cAAgB,EAAA;AACrB,MAAO,IAAA,GAAA,GAAA,CAAA;AAAA,KACX,MAAA,IAAW,OAAO,cAAgB,EAAA;AAC9B,MAAA,IAAA,GAAO,GAAM,GAAA,oBAAA,CAAA;AAAA,KACV,MAAA;AACH,MAAA,IAAA,GAAO,OAAO,CAAC,CAAA,CAAA;AAAA,KACnB;AAEA,IAAA,MAAA,CAAO,IAAK,CAAA;AAAA,MACR,EAAA;AAAA,MACA,QAAU,EAAA,GAAA;AAAA,MACV,IAAA;AAAA,MACA,WAAW,GAAM,GAAA,IAAA;AAAA,MACjB,QAAA,EAAU,KAAM,CAAA,GAAA,CAAI,EAAE,CAAA;AAAA,KACzB,CAAA,CAAA;AAAA,GACL;AAEA,EAAO,OAAA,MAAA,CAAA;AACX,CAAA;AAMO,SAAS,2BAA2B,OAQvB,EAAA;AAChB,EAAM,MAAA;AAAA,IACF,OAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,GACA,GAAA,OAAA,CAAA;AAEJ,EAAM,MAAA,YAAA,GAAe,QAAS,CAAA,WAAA,CAAY,YAAY,CAAA,CAAA;AACtD,EAAM,MAAA,WAAA,GAAc,QAAS,CAAA,WAAA,CAAY,WAAW,CAAA,CAAA;AACpD,EAAM,MAAA,cAAA,GAAiB,YAAa,CAAA,oBAAA,CAAqB,QAAS,EAAA,CAAA;AAClE,EAAM,MAAA,oBAAA,GAAuB,QAAS,CAAA,YAAA,CAAa,oBAAoB,CAAA,CAAA;AACvE,EAAM,MAAA,oBAAA,GAAuB,QAAS,CAAA,YAAA,CAAa,oBAAoB,CAAA,CAAA;AACvE,EAAM,MAAA,kBAAA,GAAqB,QAAS,CAAA,YAAA,CAAa,kBAAkB,CAAA,CAAA;AACnE,EAAM,MAAA,eAAA,GAAkB,QAAS,CAAA,YAAA,CAAa,sBAAsB,CAAA,CAAA;AACpE,EAAA,MAAM,kBAAkB,YAAa,CAAA,eAAA,CAAA;AACrC,EAAA,MAAM,iBAAiB,YAAa,CAAA,cAAA,CAAA;AAEpC,EAAA,MAAM,SAAS,wBAAyB,CAAA;AAAA,IACpC,cAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAc,EAAA,kBAAA;AAAA,IACd,WAAa,EAAA,iBAAA;AAAA,GAChB,CAAA,CAAA;AAED,EAAO,OAAA;AAAA,IACH,OAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAgB,EAAA,WAAA;AAAA,IAChB,oBAAA;AAAA,IACA,MAAA;AAAA,GACJ,CAAA;AACJ,CAAA;AAOA,IAAI,kBAAiD,GAAA,IAAA,CAAA;AAE9C,SAAS,qBACZ,UACmB,EAAA;AACnB,EAAA,IAAI,kBAAsB,IAAA,kBAAA,CAAmB,QAAS,CAAA,UAAA,KAAe,UAAY,EAAA;AAC7E,IAAO,OAAA,kBAAA,CAAA;AAAA,GACX;AAGA,EAAM,MAAA,UAAA,GAAaC,gBAAQ,QAAS,EAAA,CAAA;AACpC,EAAA,MAAM,MAAc,GAAA;AAAA,IAChB,WAAW,UAAW,CAAA,SAAA;AAAA,IACtB,qBAAqB,MAASlB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAAG,MAAC,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAAA,IAClC,iBAAiB,MAASA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAAG,MAAA,OAAA,UAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GACjC,CAAA;AAEA,EAAA,MAAM,QAAW,GAAA,IAAImB,qBAAe,CAAA,UAAA,EAAY,MAAQ,EAAA;AAAA,IACpD,UAAY,EAAA,WAAA;AAAA,GACf,CAAA,CAAA;AAED,EAAA,MAAM,UAAU,IAAIf,cAAA;AAAA,IAChB,aAAA;AAAA,IACA,QAAA;AAAA,GACJ,CAAA;AAEA,EAAqB,kBAAA,GAAA,OAAA,CAAA;AACrB,EAAO,OAAA,OAAA,CAAA;AACX,CAAA;AAOsB,SAAA,oBAAA,CAClB,YACA,IACe,EAAA;AAAA,EAAA,OAAAJ,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACf,IAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,IAAA,MAAM,MAAM,MAAMoB,kCAAA;AAAA,MACd,UAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACAd,8BAAA;AAAA,KACJ,CAAA;AAEA,IAAI,IAAA;AACA,MAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,sBAAA,CAAuB,GAAG,CAAA,CAAA;AACvD,MAAO,OAAA,MAAA,CAAO,GAAI,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,OAAA,CAAA,EAAA;AACJ,MAAO,OAAA,CAAA,CAAA;AAAA,KACX;AAAA,GACJ,CAAA,CAAA;AAAA,CAAA;AAEA,SAAsB,uBAClB,UACe,EAAA;AAAA,EAAA,OAAAN,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACf,IAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,IAAA,MAAM,kBAAkB,wBAAyB,EAAA,CAAA;AACjD,IAAA,MAAM,MAAM,MAAMoB,kCAAA;AAAA,MACd,UAAA;AAAA,MACA,eAAA;AAAA,MACA,IAAA;AAAA,MACAd,8BAAA;AAAA,KACJ,CAAA;AAEA,IAAI,IAAA;AACA,MAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,sBAAA,CAAuB,GAAG,CAAA,CAAA;AACvD,MAAO,OAAA,MAAA,CAAO,GAAI,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,OAAA,CAAA,EAAA;AACJ,MAAO,OAAA,CAAA,CAAA;AAAA,KACX;AAAA,GACJ,CAAA,CAAA;AAAA,CAAA;AAEA,SAAsB,sBAClB,UACe,EAAA;AAAA,EAAA,OAAAN,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACf,IAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,IAAI,IAAA;AACA,MAAA,MAAM,QAAW,GAAA,MAAM,UAAW,CAAA,UAAA,CAAW,WAAW,CAAA,CAAA;AACxD,MAAO,OAAA,QAAA,CAAA;AAAA,KACH,CAAA,OAAA,CAAA,EAAA;AACJ,MAAO,OAAA,CAAA,CAAA;AAAA,KACX;AAAA,GACJ,CAAA,CAAA;AAAA,CAAA;AAMA,SAAsB,2BAClB,UAC0B,EAAA;AAAA,EAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AApV9B,IAAA,IAAA,EAAA,CAAA;AAqVI,IAAA,MAAM,MAAM,6BAA8B,EAAA,CAAA;AAC1C,IAAA,MAAM,IAAO,GAAA,MAAM,UAAW,CAAA,cAAA,CAAe,GAAG,CAAA,CAAA;AAChD,IAAO,OAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAM,SAAN,IAAc,GAAA,EAAA,GAAA,IAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAAA,CAAA;AAKA,SAAsB,kBAClB,UAC0B,EAAA;AAAA,EAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA/V9B,IAAA,IAAA,EAAA,CAAA;AAgWI,IAAA,MAAM,MAAM,oBAAqB,EAAA,CAAA;AACjC,IAAA,MAAM,IAAO,GAAA,MAAM,UAAW,CAAA,cAAA,CAAe,GAAG,CAAA,CAAA;AAChD,IAAO,OAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAM,SAAN,IAAc,GAAA,EAAA,GAAA,IAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAAA,CAAA;AAQsB,SAAA,gBAAA,CAClB,YACA,IAC0B,EAAA;AAAA,EAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA9W9B,IAAA,IAAA,EAAA,CAAA;AA+WI,IAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,IAAA,MAAM,UAAU,MAAMoB,kCAAA;AAAA,MAClB,UAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACAd,8BAAA;AAAA,KACJ,CAAA;AACA,IAAM,MAAA,GAAA,GAAM,oBAAoB,OAAO,CAAA,CAAA;AACvC,IAAA,MAAM,IAAO,GAAA,MAAM,UAAW,CAAA,cAAA,CAAe,GAAG,CAAA,CAAA;AAChD,IAAO,OAAA,CAAA,EAAA,GAAA,IAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,IAAA,CAAM,SAAN,IAAc,GAAA,EAAA,GAAA,IAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAAA,CAAA;AAOA,SAAsB,kBAClB,EAEe,EAAA;AAAA,EAFf,OAAAN,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,WAAA,UAAA,EACA,WAAmB,yBACJ,EAAA;AAnYnB,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAoYI,IAAM,MAAA,OAAA,GAAU,qBAAqB,UAAU,CAAA,CAAA;AAC/C,IAAA,MAAM,oBAAoB,uBAAwB,EAAA,CAAA;AAElD,IAAI,IAAA;AACA,MAAA,MAAM,UAAa,GAAA,OAAA,CAAA;AACnB,MAAA,MAAM,qBAAwB,GAAA,MAAM,UAAW,CAAA,OAAA,CAAQ,cAAe,CAAA,KAAA;AAAA,QAClE,iBAAA;AAAA,OACJ,CAAA;AAEA,MAAA,MAAM,OAAU,GAAA,CAAA,EAAA,GAAA,qBAAA,CAAsB,OAAtB,KAAA,IAAA,GAAA,EAAA,GAAiC,EAAC,CAAA;AAClD,MAAA,MAAM,iBAAoB,GAAA,MAAA;AAAA,QACtB,CAAA,EAAA,GAAA,qBAAA,CAAsB,sBAAtB,IAA2C,GAAA,EAAA,GAAA,CAAA;AAAA,OAC/C,CAAA;AACA,MAAM,MAAA,YAAA,GAAA,CAAuB,EAAsB,GAAA,qBAAA,CAAA,YAAA,KAAtB,IAAsC,GAAA,EAAA,GAAA,CAAA,CAAA;AACnE,MAAA,MAAM,UACF,GAAA,CAAA,EAAA,GAAA,qBAAA,CAAsB,UAAtB,KAAA,IAAA,GAAA,EAAA,GAAoC,OAAQ,CAAA,MAAA,CAAA;AAEhD,MAAI,IAAA,CAAC,QAAQ,MAAQ,EAAA;AACjB,QAAO,OAAA,wBAAA,CAAA;AAAA,OACX;AAEA,MAAA,MAAM,iBAAiB,IAAK,CAAA,GAAA,CAAI,QAAU,EAAA,UAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAEpE,MAAI,IAAA,GAAA,CAAA;AACJ,MAAA,IAAI,sBAAsB,CAAG,EAAA;AACzB,QAAM,GAAA,GAAA,CAAA,CAAA;AAAA,OACV,MAAA,IAAW,iBAAiB,CAAG,EAAA;AAC3B,QAAA,GAAA,GAAM,UAAa,GAAA,CAAA,CAAA;AAAA,OAChB,MAAA;AACH,QAAA,GAAA,GAAM,YAAe,GAAA,CAAA,CAAA;AAAA,OACzB;AAEA,MAAI,IAAA,GAAA,GAAM,OAAO,CAAC,CAAA,CAAA;AAClB,MAAI,IAAA,UAAA,GAAa,OAAO,CAAC,CAAA,CAAA;AAEzB,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,cAAA,EAAgB,CAAK,EAAA,EAAA;AACrC,QAAM,MAAA,KAAA,GAAQ,QAAQ,GAAG,CAAA,CAAA;AACzB,QAAA,IAAI,KAAS,IAAA,OAAO,KAAM,CAAA,UAAA,KAAe,WAAa,EAAA;AAClD,UAAA,MAAM,IAAO,GAAA,MAAA,CAAO,KAAM,CAAA,UAAA,CAAW,UAAU,CAAA,CAAA;AAC/C,UAAI,IAAA,IAAA,GAAO,MAAO,CAAA,CAAC,CAAG,EAAA;AAClB,YAAO,GAAA,IAAA,IAAA,CAAA;AACP,YAAA,UAAA,IAAc,OAAO,CAAC,CAAA,CAAA;AAAA,WAC1B;AAAA,SACJ;AAEA,QAAA,IAAI,sBAAsB,CAAG,EAAA;AACzB,UAAA,GAAA,GAAA,CAAO,MAAM,CAAK,IAAA,UAAA,CAAA;AAAA,SACf,MAAA;AACH,UAAA,GAAA,GAAM,GAAQ,KAAA,CAAA,GAAI,UAAa,GAAA,CAAA,GAAI,GAAM,GAAA,CAAA,CAAA;AAAA,SAC7C;AAAA,OACJ;AAEA,MAAI,IAAA,UAAA,KAAe,MAAO,CAAA,CAAC,CAAG,EAAA;AAC1B,QAAO,OAAA,wBAAA,CAAA;AAAA,OACX;AAEA,MAAA,OAAO,GAAM,GAAA,UAAA,CAAA;AAAA,aACR,GAAK,EAAA;AAEV,MAAO,OAAA,wBAAA,CAAA;AAAA,KACX;AAAA,GACJ,CAAA,CAAA;AAAA,CAAA;AAMgB,SAAA,oBAAA,CACZ,uBACA,cACE,EAAA;AACF,EAAA,OAAO,cACF,CAAA,GAAA,CAAI,IAAIO,SAAA,CAAG,CAAC,CAAC,CAAA,CACb,GAAI,CAAA,qBAAqB,CACzB,CAAA,GAAA,CAAI,IAAIA,SAAA,CAAG,IAAiB,CAAC,CAAA,CAAA;AACtC,CAAA;AAUO,SAAS,sBAAsB,MASpC,EAAA;AAleF,EAAA,IAAA,EAAA,CAAA;AAmeI,EAAM,MAAA,EAAE,qBAAuB,EAAA,cAAA,EAAmB,GAAA,MAAA,CAAA;AAClD,EAAA,MAAM,OAAO,IAAIA,SAAA;AAAA,IACb,CAAA,EAAA,GAAA,MAAA,CAAO,0BAAP,IAAgC,GAAA,EAAA,GAAA,wBAAA;AAAA,GACpC,CAAA;AAEA,EAAM,MAAA,GAAA,GAAM,oBAAqB,CAAA,qBAAA,EAAuB,cAAc,CAAA,CAAA;AACtE,EAAA,MAAM,aAAa,qBAAsB,CAAA,GAAA,CAAI,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAA;AAC1D,EAAA,MAAM,YAAe,GAAA,GAAA,CAAA;AACrB,EAAM,MAAA,eAAA,GAAkB,qBAAsB,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAEtD,EAAO,OAAA;AAAA,IACH,WAAa,EAAA,GAAA;AAAA,IACb,kBAAoB,EAAA,UAAA;AAAA,IACpB,oBAAsB,EAAA,YAAA;AAAA,IACtB,uBAAyB,EAAA,eAAA;AAAA,GAC7B,CAAA;AACJ,CAAA;AAyCsB,SAAA,oBAAA,CAClB,YACA,IACwB,EAAA;AAAA,EAAA,OAAAP,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACxB,IAAA,MAAM,cAAc,2BAA4B,EAAA,CAAA;AAChD,IAAA,MAAM,gBAAgB,6BAA8B,EAAA,CAAA;AACpD,IAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AACvC,IAAA,MAAM,oBAAoB,0BAA2B,EAAA,CAAA;AACrD,IAAA,MAAM,kBAAkB,wBAAyB,EAAA,CAAA;AACjD,IAAA,MAAM,eAAe,qBAAsB,EAAA,CAAA;AAG3C,IAAM,MAAA,cAAA,GAAiB,wBAAwB,IAAI,CAAA,CAAA;AACnD,IAAM,MAAA,kBAAA,GAAqB,4BAA4B,IAAI,CAAA,CAAA;AAG3D,IAAA,MAAM,gBAAgB,MAAMoB,kCAAA;AAAA,MACxB,UAAA;AAAA,MACA,aAAA;AAAA,MACA,IAAA;AAAA,MACAd,8BAAA;AAAA,KACJ,CAAA;AAEA,IAAA,MAAM,qBAAqB,MAAMc,kCAAA;AAAA,MAC7B,UAAA;AAAA,MACA,eAAA;AAAA,MACA,IAAA;AAAA,MACAd,8BAAA;AAAA,KACJ,CAAA;AAEA,IAAA,MAAM,UAAU,MAAMc,kCAAA;AAAA,MAClB,UAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACAd,8BAAA;AAAA,KACJ,CAAA;AAGA,IAAM,MAAA,gBAAA,GAAmB,oBAAoB,kBAAkB,CAAA,CAAA;AAC/D,IAAM,MAAA,oBAAA,GAAuB,oBAAoB,aAAa,CAAA,CAAA;AAC9D,IAAM,MAAA,cAAA,GAAiB,oBAAoB,OAAO,CAAA,CAAA;AAElD,IAAM,MAAA,oBAAA,GAAuB,8BAA8B,UAAU,CAAA,CAAA;AAGrE,IAAA,IAAI,aAAgB,GAAA,cAAA,CAAA;AACpB,IAAA,IAAI,gBAAmB,GAAA,iBAAA,CAAA;AAEvB,IAAI,IAAA;AACA,MAAM,MAAA,OAAA,GAAU,qBAAqB,UAAU,CAAA,CAAA;AAC/C,MAAA,MAAM,KACF,MAAM,OAAA,CAAQ,OAAQ,CAAA,YAAA,CAAa,MAAM,YAAY,CAAA,CAAA;AAGzD,MAAI,IAAA,EAAA,CAAG,aAAiB,IAAA,EAAA,CAAG,gBAAkB,EAAA;AACzC,QAAA,aAAA,GAAgB,EAAG,CAAA,aAAA,CAAA;AACnB,QAAA,gBAAA,GAAmB,EAAG,CAAA,gBAAA,CAAA;AAAA,OAC1B;AAAA,KACI,CAAA,OAAA,CAAA,EAAA;AAAA,KAIR;AAIA,IAAO,OAAA;AAAA,MACH,IAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA,oBAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,oBAAA;AAAA,KACJ,CAAA;AAAA,GACJ,CAAA,CAAA;AAAA,CAAA;AAaA,SAAsB,iBAClB,UACsB,EAAA;AAAA,EAAA,OAAAN,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAjoB1B,IAAA,IAAA,EAAA,CAAA;AAkoBI,IAAM,MAAA,IAAA,GAAO,MAAM,UAAA,CAAW,YAAa,EAAA,CAAA;AAG3C,IAAA,IAAI,aAAa,MAAO,CAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,GAAI,CAAA,qBAAA,KAAZ,YAAqC,GAAG,CAAA,CAAA;AAEhE,IAAI,IAAA;AACA,MAAA,MAAM,OAAU,GAAA,MAAM,UAAW,CAAA,2BAAA,CAA4B,EAAE,CAAA,CAAA;AAC/D,MAAA,IAAI,QAAQ,MAAQ,EAAA;AAChB,QAAA,MAAM,QACF,OAAQ,CAAA,MAAA;AAAA,UACJ,CAAC,GAAK,EAAA,CAAA,KAAM,MAAO,CAAE,CAAA,gBAAA,GAAmB,MAAQ,CAAE,CAAA,QAAA;AAAA,UAClD,CAAA;AAAA,YACA,OAAQ,CAAA,MAAA,CAAA;AAChB,QAAA,IAAI,QAAS,CAAA,KAAK,CAAK,IAAA,KAAA,GAAQ,CAAG,EAAA;AAC9B,UAAa,UAAA,GAAA,KAAA,CAAA;AAAA,SACjB;AAAA,OACJ;AAAA,KACI,CAAA,OAAA,CAAA,EAAA;AAAA,KAER;AAEA,IAAO,OAAA;AAAA,MACH,OAAO,IAAK,CAAA,KAAA;AAAA,MACZ,MAAM,IAAK,CAAA,SAAA;AAAA,MACX,SAAA,EAAW,IAAK,CAAA,YAAA,GAAe,IAAK,CAAA,SAAA;AAAA,MACpC,cAAc,IAAK,CAAA,YAAA;AAAA,MACnB,MAAQ,EAAA,UAAA;AAAA,KACZ,CAAA;AAAA,GACJ,CAAA,CAAA;AAAA,CAAA;AAEO,SAAS,aAAa,QAAiC,EAAA;AAC1D,EAAM,MAAA,cAAA,GAAiB,QAAS,CAAA,YAAA,GAAe,QAAS,CAAA,IAAA,CAAA;AACxD,EAAA,OAAO,iBAAiB,QAAS,CAAA,MAAA,CAAA;AACrC,CAAA;AAYsB,SAAA,oBAAA,CAClB,UACA,EAAA,MAAA,EACA,WACU,EAAA;AAAA,EAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAnrBd,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAorBI,IAAM,MAAA,KAAA,GAAA,CAAQ,EAAO,GAAA,MAAA,CAAA,KAAA,KAAP,IAAgB,GAAA,EAAA,GAAA,GAAA,CAAA;AAC9B,IAAM,MAAA,IAAA,GAAA,CAAO,EAAO,GAAA,MAAA,CAAA,IAAA,KAAP,IAAe,GAAA,EAAA,GAAA,GAAA,CAAA;AAE5B,IAAM,MAAA,QAAA,GAAW,MAAM,gBAAA,CAAiB,UAAU,CAAA,CAAA;AAClD,IAAM,MAAA,QAAA,GAAW,QAAS,CAAA,IAAA,GAAO,QAAS,CAAA,YAAA,CAAA;AAG1C,IAAI,IAAA,QAAA,IAAY,KAAS,IAAA,QAAA,IAAY,IAAM,EAAA;AACvC,MAAA,OAAO,WAAY,EAAA,CAAA;AAAA,KACvB;AAGA,IAAA,IAAI,WAAW,KAAO,EAAA;AAClB,MAAM,MAAA,UAAA,GAAa,SAAS,YAAe,GAAA,KAAA,CAAA;AAC3C,MAAM,MAAA,cAAA,GAAiB,aAAa,QAAS,CAAA,IAAA,CAAA;AAC7C,MAAM,MAAA,QAAA,GAAW,iBAAiB,QAAS,CAAA,MAAA,CAAA;AAE3C,MAAQ,OAAA,CAAA,GAAA;AAAA,QACJ,CAAA,aAAA,EAAA,CAAiB,WAAW,GAAK,EAAA,OAAA;AAAA,UAC7B,CAAA;AAAA,SACH,iBAAiB,QAAW,GAAA,GAAA,EAAM,QAAQ,CAAC,CAAC,CAAW,QAAA,EAAA,KAAA,GAAQ,GAChE,CAAA,IAAA,CAAA;AAAA,OACJ,CAAA;AAEA,MAAA,MAAM,KAAM,CAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAM,QAAQ,CAAC,CAAA,CAAA;AACpC,MAAA,OAAO,WAAY,EAAA,CAAA;AAAA,KACvB;AAGA,IAAM,MAAA,aAAA,GAAgB,aAAa,QAAQ,CAAA,CAAA;AAC3C,IAAA,MAAM,aAAgB,GAAA,QAAA,CAAS,YAAe,GAAA,KAAA,GAAQ,QAAS,CAAA,MAAA,CAAA;AAC/D,IAAM,MAAA,aAAA,GAAgB,gBAAgB,aAAgB,GAAA,GAAA,CAAA;AAEtD,IAAQ,OAAA,CAAA,GAAA;AAAA,MACJ,CAAA,YAAA,EAAA,CAAgB,WAAW,GAAK,EAAA,OAAA;AAAA,QAC5B,CAAA;AAAA,OACH,CAAiB,aAAA,EAAA,CAAA,aAAA,GAAgB,GAAM,EAAA,OAAA;AAAA,QACpC,CAAA;AAAA,OACH,CAAwB,qBAAA,EAAA,KAAA,GAAQ,GAAG,CAAA,IAAA,CAAA;AAAA,KACxC,CAAA;AAEA,IAAA,MAAM,MAAM,aAAa,CAAA,CAAA;AACzB,IAAA,OAAO,WAAY,EAAA,CAAA;AAAA,GACvB,CAAA,CAAA;AAAA,CAAA;AAOO,SAAS,gBAAgB,KAAoB,EAAA;AAtuBpD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAuuBI,EACI,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAO,KAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,SAAd,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAyB,IACzB,MAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAO,KAAP,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAc,YACd,CAAA,KAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAO,OACP,CAAA,IAAA,EAAA,CAAA;AAER,CAAA;AAEO,SAAS,2BACZ,CAAA,MAAA,GAAS,CACT,EAAA,MAAA,GAAS,GACP,EAAA;AACF,EAAA,MAAM,SAAY,GAAA,IAAA,CAAK,MAAO,EAAA,IAAK,SAAS,MAAU,CAAA,GAAA,MAAA,CAAA;AACtD,EAAA,OAAO,IAAIO,SAAA,CAAG,aAAc,CAAA,SAAS,CAAC,CAAA,CAAA;AAC1C,CAAA;AAEO,SAAS,mBAA+B,GAAA;AAC3C,EAAA,OAAOW,gBAAQ,QAAS,EAAA,CAAA;AAC5B,CAAA;AAEsB,SAAA,UAAA,CAClB,UACA,EAAA,SAAA,EACA,SACa,EAAA;AAAA,EAAA,OAAAlB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACb,IAAM,MAAA,QAAA,GAAW,cAAc,SAAS,CAAA,CAAA;AACxC,IAAA,MAAM,MAAM,MAAM,UAAA,CAAW,eAAe,SAAW,EAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA;AACvE,IAAM,MAAA,UAAA,CAAW,kBAAmB,CAAA,GAAA,EAAK,WAAW,CAAA,CAAA;AAAA,GACxD,CAAA,CAAA;AAAA,CAAA;AAEsB,SAAA,mBAAA,CAClB,YACA,SACa,EAAA;AAAA,EAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACb,IAAM,MAAA,UAAA,CAAW,kBAAmB,CAAA,SAAA,EAAW,WAAW,CAAA,CAAA;AAAA,GAC9D,CAAA,CAAA;AAAA,CAAA;AAEO,SAAS,MAAM,EAA2B,EAAA;AAC7C,EAAA,OAAO,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,EAAE,CAAC,CAAA,CAAA;AAC3D,CAAA;AAKA,SAAsB,+BAClB,EAEa,EAAA;AAAA,EAFb,OAAAA,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,WAAA,UAAA,EACA,MAAyB,GAAA,EACZ,EAAA;AACb,IAAM,MAAA,oBAAA,CAAqB,UAAY,EAAA,MAAA,EAAQ,MAAYA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAEvD,MAAA,OAAA;AAAA,KACH,CAAA,CAAA,CAAA;AAAA,GACL,CAAA,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;ACjvBO,MAAM,aAAc,CAAA;AAAA,EAGvB,YACqB,QACnB,EAAA;AADmB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AAEjB,IAAA,IAAA,CAAK,OAAU,GAAA,IAAII,cAAQ,CAAA,aAAA,EAAsB,QAAQ,CAAA,CAAA;AAAA,GAC7D;AAAA,EAEA,IAAI,UAAa,GAAA;AACb,IAAA,OAAO,KAAK,QAAS,CAAA,UAAA,CAAA;AAAA,GACzB;AAAA,EAEA,IAAI,MAAqB,GAAA;AACrB,IAAA,OAAO,KAAK,QAAS,CAAA,MAAA,CAAA;AAAA,GACzB;AAAA,EAMA,IAAI,iBAAyC,GAAA;AACzC,IAAA,OAAO,IAAK,CAAA,OAAA,CAAA;AAAA,GAChB;AAAA,EAMM,cAAc,IAA4C,EAAA;AAAA,IAAA,OAAAJ,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC5D,MAAM,MAAA,MAAA,GAAS,IAAQ,IAAA,IAAA,GAAA,IAAA,GAAA,IAAA,CAAK,MAAO,CAAA,SAAA,CAAA;AACnC,MAAA,IAAI,CAAC,MAAQ,EAAA;AACT,QAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA,CAAA;AAAA,OACvE;AACA,MAAO,OAAA,oBAAA,CAAqB,IAAK,CAAA,UAAA,EAAY,MAAM,CAAA,CAAA;AAAA,KACvD,CAAA,CAAA;AAAA,GAAA;AAAA,EAKc,gBAAgB,GAA6B,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACvD,MAAI,IAAA;AACA,QAAA,MAAM,GAAM,GAAA,MAAM,IAAK,CAAA,UAAA,CAAW,uBAAuB,GAAG,CAAA,CAAA;AAC5D,QAAA,OAAO,IAAIO,SAAA,CAAG,GAAI,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,OAC1B,CAAA,OAAA,CAAA,EAAA;AACJ,QAAO,OAAA,IAAIA,UAAG,CAAC,CAAA,CAAA;AAAA,OACnB;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAKM,eAAe,IAAqD,EAAA;AAAA,IAAA,OAAAP,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACtE,MAAM,MAAA,MAAA,GAAS,IAAQ,IAAA,IAAA,GAAA,IAAA,GAAA,IAAA,CAAK,MAAO,CAAA,SAAA,CAAA;AACnC,MAAA,IAAI,CAAC,MAAQ,EAAA;AACT,QAAM,MAAA,IAAI,MAAM,oDAAoD,CAAA,CAAA;AAAA,OACxE;AAEA,MAAA,MAAM,IAAO,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAE5C,MAAM,MAAA;AAAA,QACF,WAAA;AAAA,QACA,cAAA;AAAA,QACA,iBAAA;AAAA,QACA,kBAAA;AAAA,QACA,YAAA;AAAA,OACJ,GAAI,MAAM,OAAA,CAAQ,GAAI,CAAA;AAAA,QAClB,KAAK,OAAQ,CAAA,OAAA,CAAQ,WAAY,CAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,QACvD,KAAK,OAAQ,CAAA,OAAA,CAAQ,cAAe,CAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA,QACrE,KAAK,OAAQ,CAAA,OAAA,CAAQ,iBAAkB,CAAA,aAAA,CAAc,KAAK,iBAAiB,CAAA;AAAA,QAC3E,KAAK,OAAQ,CAAA,OAAA,CAAQ,kBAAmB,CAAA,aAAA,CAAc,KAAK,kBAAkB,CAAA;AAAA,QAC7E,KAAK,OAAQ,CAAA,OAAA,CAAQ,YAAa,CAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,OACpE,CAAA,CAAA;AAED,MAAA,MAAM,CAAC,iBAAmB,EAAA,iBAAiB,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QAC7D,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,aAAa,CAAA;AAAA,QACvC,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,OAAO,CAAA;AAAA,OACpC,CAAA,CAAA;AAED,MAAO,OAAA;AAAA,QACH,WAAA;AAAA,QACA,cAAA;AAAA,QACA,iBAAA;AAAA,QACA,YAAA;AAAA,QACA,kBAAA;AAAA,QACA,iBAAA;AAAA,QACA,iBAAA;AAAA,OACJ,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAUM,YAAA,CACF,gBACA,IAC+B,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC/B,MAAM,MAAA,MAAA,GAAS,IAAQ,IAAA,IAAA,GAAA,IAAA,GAAA,IAAA,CAAK,MAAO,CAAA,SAAA,CAAA;AACnC,MAAA,IAAI,CAAC,MAAQ,EAAA;AACT,QAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAAA;AAAA,OACtE;AAEA,MAAA,MAAM,CAAI,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAEzC,MAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CACf,IAAK,CAAA,IAAIO,SAAG,CAAA,cAAA,CAAe,QAAS,EAAC,CAAC,CAAA,CACtC,QAAS,CAAA;AAAA,QACN,IAAM,EAAA,MAAA;AAAA,QACN,YAAY,CAAE,CAAA,UAAA;AAAA,QACd,aAAa,CAAE,CAAA,WAAA;AAAA,QACf,mBAAmB,CAAE,CAAA,iBAAA;AAAA,QACrB,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,eAAe,CAAE,CAAA,aAAA;AAAA,QACjB,iBAAiB,CAAE,CAAA,eAAA;AAAA,QACnB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,kBAAkB,CAAE,CAAA,gBAAA;AAAA,QACpB,kBAAkB,CAAE,CAAA,cAAA;AAAA,QACpB,oBAAoB,CAAE,CAAA,oBAAA;AAAA,QACtB,sBAAsB,CAAE,CAAA,oBAAA;AAAA,QACxB,mBAAmB,WAAY,CAAA,WAAA;AAAA,QAC/B,qBAAqB,WAAY,CAAA,aAAA;AAAA,QACjC,eAAe,CAAE,CAAA,aAAA;AAAA,QACjB,gBAAgB,CAAE,CAAA,cAAA;AAAA,QAClB,YAAc,EAAAD,8BAAA;AAAA,QACd,sBAAwB,EAAAG,oCAAA;AAAA,QACxB,eAAeD,qBAAc,CAAA,SAAA;AAAA,OAChC,EACA,WAAY,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,cAAA,CACF,gBACA,IAC+B,EAAA;AAAA,IAAA,OAAAR,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC/B,MAAM,MAAA,MAAA,GAAS,IAAQ,IAAA,IAAA,GAAA,IAAA,GAAA,IAAA,CAAK,MAAO,CAAA,SAAA,CAAA;AACnC,MAAA,IAAI,CAAC,MAAQ,EAAA;AACT,QAAM,MAAA,IAAI,MAAM,oDAAoD,CAAA,CAAA;AAAA,OACxE;AAEA,MAAA,MAAM,CAAI,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAEzC,MAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CACf,MAAO,CAAA,IAAIO,SAAG,CAAA,cAAA,CAAe,QAAS,EAAC,CAAC,CAAA,CACxC,QAAS,CAAA;AAAA,QACN,IAAM,EAAA,MAAA;AAAA,QACN,YAAY,CAAE,CAAA,UAAA;AAAA,QACd,aAAa,CAAE,CAAA,WAAA;AAAA,QACf,mBAAmB,CAAE,CAAA,iBAAA;AAAA,QACrB,SAAS,CAAE,CAAA,OAAA;AAAA,QACX,eAAe,CAAE,CAAA,aAAA;AAAA,QACjB,iBAAiB,CAAE,CAAA,eAAA;AAAA,QACnB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,kBAAkB,CAAE,CAAA,gBAAA;AAAA,QACpB,kBAAkB,CAAE,CAAA,oBAAA;AAAA,QACpB,oBAAoB,CAAE,CAAA,cAAA;AAAA,QACtB,sBAAsB,CAAE,CAAA,oBAAA;AAAA,QACxB,mBAAmB,WAAY,CAAA,WAAA;AAAA,QAC/B,qBAAqB,WAAY,CAAA,aAAA;AAAA,QACjC,eAAe,CAAE,CAAA,aAAA;AAAA,QACjB,gBAAgB,CAAE,CAAA,cAAA;AAAA,QAClB,YAAc,EAAAD,8BAAA;AAAA,QACd,eAAeE,qBAAc,CAAA,SAAA;AAAA,OAChC,EACA,WAAY,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAAA,GAAA;AAAA,EAgBA,iBAAiB,MAIC,EAAA;AACd,IAAA,MAAM,EAAE,oBAAA,EAAsB,WAAa,EAAA,YAAA,EAAiB,GAAA,MAAA,CAAA;AAG5D,IAAA,MAAM,mBAAmB,IAAID,SAAA;AAAA,MACzB,YAAA,CAAa,uBAAuB,QAAS,EAAA;AAAA,KACjD,CAAA;AAEA,IAAM,MAAA,KAAA,GAAQ,IAAIA,SAAA,CAAG,WAAW,CAAA,CAAA;AAGhC,IAAM,MAAA,QAAA,GAAW,qBACZ,GAAI,CAAA,WAAW,EACf,GAAI,CAAA,IAAIA,SAAG,CAAA,GAAa,CAAC,CAAA,CAAA;AAE9B,IAAA,MAAM,qBAAqB,QAAS,CAAA,GAAA,CAAI,KAAK,CAAA,CAAE,IAAI,gBAAgB,CAAA,CAAA;AAEnE,IAAO,OAAA;AAAA,MACH,oBAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAAA,EAcA,OAAO,cAAe,CAAA,MAAA,EAAY,YAAsB,EAAA;AACpD,IAAM,MAAA,SAAA,GAAY,MAAO,CAAA,GAAA,CAAIL,aAAW,CAAA,CAAA;AACxC,IAAM,MAAA,MAAA,GAAS,SAAU,CAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AACzC,IAAM,MAAA,SAAA,GAAY,SAAU,CAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AAC5C,IAAA,OAAO,UAAU,GAAI,CAAA,CAAC,IAAI,MAAS,GAAA,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,GACpD;AAAA,EAYA,OAAO,aAAa,KAAmB,EAAA;AACnC,IAAA,MAAM,QAAW,GAAA,CAAA,CAAA;AACjB,IAAM,MAAA,QAAA,GAAW,MAAM,QAAS,EAAA,CAAA;AAEhC,IAAI,IAAA,QAAA,CAAS,UAAU,QAAU,EAAA;AAC7B,MAAA,MAAM,OAAU,GAAA,GAAA,CAAI,MAAO,CAAA,QAAA,GAAW,SAAS,MAAM,CAAA,CAAA;AACrD,MAAO,OAAA,CAAA,EAAA,EAAK,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAA,KAClC;AAEA,IAAA,MAAM,UAAU,QAAS,CAAA,KAAA,CAAM,CAAG,EAAA,QAAA,CAAS,SAAS,QAAQ,CAAA,CAAA;AAC5D,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,KAAM,CAAA,QAAA,CAAS,SAAS,QAAQ,CAAA,CAAA;AACzD,IAAO,OAAA,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA;AAAA,GAChC;AACJ;;;;;;;;;;;;;;;;;;;;;;AC5QO,MAAM,WAAY,CAAA;AAAA,EAWrB,YAA6B,QAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA,CAAA;AACzB,IAAM,MAAA,GAAA,GAAM,IAAI,oBAAA,CAAqB,QAAQ,CAAA,CAAA;AAC7C,IAAK,IAAA,CAAA,OAAA,GAAU,GAAI,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAAA,GAC9C;AAAA,EAXA,IAAI,MAAqB,GAAA;AACrB,IAAA,OAAO,KAAK,QAAS,CAAA,MAAA,CAAA;AAAA,GACzB;AAAA,EAEA,IAAI,UAAyB,GAAA;AACzB,IAAA,OAAO,KAAK,QAAS,CAAA,UAAA,CAAA;AAAA,GACzB;AAAA,EAWM,YAAY,IAA2C,EAAA;AAAA,IAAA,OAAAF,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACzD,MAAA,OAAO,oBAAqB,CAAA,IAAA,CAAK,QAAS,CAAA,UAAA,EAAY,IAAI,CAAA,CAAA;AAAA,KAC9D,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,gBAAyC,GAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC3C,MAAM,MAAA,EAAE,aAAgB,GAAA,MAAM,KAAK,WAAY,CAAA,IAAA,CAAK,OAAO,SAAS,CAAA,CAAA;AACpE,MAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,WAAA,CAAY,MAAM,WAAW,CAAA,CAAA;AAAA,KAC7D,CAAA,CAAA;AAAA,GAAA;AAAA,EAEM,iBAA2C,GAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC7C,MAAM,MAAA,EAAE,cAAiB,GAAA,MAAM,KAAK,WAAY,CAAA,IAAA,CAAK,OAAO,SAAS,CAAA,CAAA;AACrE,MAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA,CAAa,MAAM,YAAY,CAAA,CAAA;AAAA,KAC/D,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,oBAAoB,IAAiD,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACvE,MAAA,MAAM,EAAE,cAAe,EAAA,GAAI,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA,CAAA;AACtD,MAAA,OAAO,IAAK,CAAA,OAAA,CAAQ,OAAQ,CAAA,cAAA,CAAe,cAAc,cAAc,CAAA,CAAA;AAAA,KAC3E,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,wBACF,IACkC,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClC,MAAA,MAAM,EAAE,kBAAmB,EAAA,GAAI,MAAM,IAAA,CAAK,YAAY,IAAI,CAAA,CAAA;AAC1D,MAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,kBAAmB,CAAA,aAAA;AAAA,QAC3C,kBAAA;AAAA,OACJ,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAYM,gBACF,EAE+B,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,SAAA,EAAA,WAF/B,cACA,EAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,SACY,EAAA;AAvGvC,MAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAwGQ,MAAA,MAAM,CAAI,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,IAAI,CAAA,CAAA;AAErC,MAAM,MAAA,oBAAA,GAAuB,6BAA8B,CAAA,CAAA,CAAE,UAAU,CAAA,CAAA;AACvE,MAAA,MAAM,oBAAoB,WAAY,CAAA,WAAA,CAAA;AACtC,MAAA,MAAM,sBAAsB,WAAY,CAAA,aAAA,CAAA;AAExC,MAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CACf,QAAS,CAAA,IAAIO,SAAG,CAAA,cAAA,CAAe,QAAS,EAAC,CAAC,CAAA,CAC1C,QAAS,CAAA;AAAA,QACN,MAAM,CAAE,CAAA,IAAA;AAAA,QACR,YAAY,CAAE,CAAA,UAAA;AAAA,QACd,aAAa,CAAE,CAAA,WAAA;AAAA,QACf,mBAAmB,CAAE,CAAA,iBAAA;AAAA,QAGrB,UAAU,CAAE,CAAA,OAAA;AAAA,QAGZ,eAAe,CAAE,CAAA,aAAA;AAAA,QACjB,iBAAiB,CAAE,CAAA,eAAA;AAAA,QACnB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,kBAAkB,CAAE,CAAA,gBAAA;AAAA,QAGpB,kBAAkB,CAAE,CAAA,cAAA;AAAA,QACpB,oBAAoB,CAAE,CAAA,oBAAA;AAAA,QAGtB,oBAAA;AAAA,QACA,iBAAA;AAAA,QACA,mBAAA;AAAA,QAGA,eAAe,CAAE,CAAA,aAAA;AAAA,QACjB,gBAAgB,CAAE,CAAA,cAAA;AAAA,QAClB,cAAc,CAAE,CAAA,YAAA;AAAA,QAChB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QAGtB,aAAA,EAAA,CAAe,EAAE,GAAA,CAAA,CAAA,aAAA,KAAF,IAAmB,GAAA,EAAA,GAAA,cAAA;AAAA,QAClC,gBAAA,EAAA,CAAkB,EAAE,GAAA,CAAA,CAAA,gBAAA,KAAF,IAAsB,GAAA,EAAA,GAAA,iBAAA;AAAA,QAExC,YAAc,EAAAD,8BAAA;AAAA,QACd,sBAAwB,EAAAG,oCAAA;AAAA,QACxB,eAAeD,qBAAc,CAAA,SAAA;AAAA,OAChC,EACA,WAAY,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AAAA,GAAA;AAAA,EAaM,kBAAsE,GAAA;AAAA,IAAA,OAAAR,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACxE,MAAI,IAAA;AACA,QAAM,MAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,cAAe,EAAA,CAAA;AAExC,QAAO,OAAA,EAAE,KAAO,EAAA,SAAA,EAAW,KAAU,CAAA,EAAA,CAAA;AAAA,OACjC,CAAA,OAAA,CAAA,EAAA;AACJ,QAAA,OAAO,EAAE,KAAA,EAAO,KAAW,CAAA,EAAA,SAAA,EAAW,KAAU,CAAA,EAAA,CAAA;AAAA,OACpD;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,cAAkC,GAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACpC,MAAA,MAAM,kBAAkB,qBAAsB,EAAA,CAAA;AAC9C,MAAA,MAAM,OAAW,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,QAAQ,YAAa,CAAA,KAAA;AAAA,QACrD,eAAA;AAAA,OACJ,CAAA;AAEA,MAAA,MAAM,EAAE,MAAA,EAAQ,SAAW,EAAA,KAAA,EAAO,YAAe,GAAA,OAAA,CAAA;AAEjD,MAAA,IAAI,CAAC,MAAU,IAAA,MAAA,CAAO,MAAW,KAAA,CAAA,IAAK,CAAC,KAAO,EAAA;AAC1C,QAAM,MAAA,IAAI,MAAM,iDAAiD,CAAA,CAAA;AAAA,OACrE;AAEA,MAAM,MAAA,QAAA,GAAW,OAAO,MAAU,IAAA,UAAA,CAAA;AAClC,MAAA,IAAI,CAAC,QAAU,EAAA;AACX,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,uDAAA;AAAA,SACJ,CAAA;AAAA,OACJ;AAEA,MAAA,MAAM,SAAY,GAAA,SAAA,KAAc,CAAI,GAAA,QAAA,GAAW,IAAI,SAAY,GAAA,CAAA,CAAA;AAC/D,MAAM,MAAA,MAAA,GAAS,OAAO,SAAS,CAAA,CAAA;AAE/B,MAAA,IAAI,CAACO,SAAA,CAAG,IAAK,CAAA,MAAM,CAAG,EAAA;AAClB,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,oDAAA;AAAA,SACJ,CAAA;AAAA,OACJ;AAEA,MAAO,OAAA,MAAA,CAAO,MAAO,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAAA,GAAA;AACJ;;;;;;;;;;;;;;;;;;;;;;AChKA,MAAM,UAAyB,GAAA,WAAA,CAAA;AAaxB,MAAM,mBAA8C,CAAA;AAAA,EAoBvD,YAAoB,MAAsB,EAAA;AAAtB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA,CAAA;AAChB,IAAA,MAAM,UAAU,MAAO,CAAA,QAAA,CAAA;AAEvB,IAAA,IAAI,CAAC,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAChC,MAAM,MAAA,IAAI,MAAM,sBAAsB,CAAA,CAAA;AAAA,KAC1C;AAKA,IAAI,IAAA,eAAA,CAAA;AACJ,IAAA,IAAI,mCAAS,SAAW,EAAA;AACpB,MAAA,eAAA,GAAkB,OAAQ,CAAA,SAAA,CAAA;AAAA,KACvB,MAAA;AAEH,MAAA,eAAA,GAAkB,IAAIc,iBAAA,CAAU,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA;AAAA,KACtD;AAKA,IAAA,IAAI,OAAO,MAAQ,EAAA;AACf,MAAA,MAAM,UAAU,MAAO,CAAA,MAAA,CAAA;AAEvB,MAAA,IAAI,mCAAS,SAAW,EAAA;AACpB,QAAA,MAAM,UAAU,IAAIxB,cAAA;AAAA,UAChByB,YAAQ,CAAA,EAAA;AAAA,UACR,OAAA,CAAQ,UAAU,OAAQ,EAAA;AAAA,SAC9B,CAAA;AACA,QAAA,IAAI,CAAC,OAAA,CAAQ,MAAO,CAAA,OAAO,CAAG,EAAA;AAC1B,UAAA,MAAM,IAAI,KAAA;AAAA,YACN,kDAAA;AAAA,WACJ,CAAA;AAAA,SACJ;AAAA,OACJ;AAEA,MAAA,IAAA,CAAK,MAAS,GAAA,OAAA,CAAA;AAAA,KAClB,MAAA,IAAW,mCAAS,SAAW,EAAA;AAE3B,MAAA,IAAA,CAAK,SAAS,IAAIzB,cAAA;AAAA,QACdyB,YAAQ,CAAA,EAAA;AAAA,QACR,OAAA,CAAQ,UAAU,OAAQ,EAAA;AAAA,OAC9B,CAAA;AAAA,KACJ;AAKA,IAAM,MAAA,IAAA,GAAyB,EAAE,UAAW,EAAA,CAAA;AAC5C,IAAA,IACI,MAAO,CAAA,OAAA,CAAQ,OAAQ,CAAA,MAAA,GAAS,CAChC,IAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAW,CAAA,IAAI,CAC3C,EAAA;AACE,MAAA,IAAA,CAAK,UAAa,GAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAAA,KAC9C;AAEA,IAAA,MAAM,eAAe,OACf,GAAA;AAAA,MACE,SAAW,EAAA,eAAA;AAAA,MACL,gBACF,EACU,EAAA;AAAA,QAAA,OAAAtB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACV,UAAO,OAAA,OAAA,CAAQ,gBAAgB,EAAE,CAAA,CAAA;AAAA,SACrC,CAAA,CAAA;AAAA,OAAA;AAAA,MACM,oBACF,GACY,EAAA;AAAA,QAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACZ,UAAA,IAAI,QAAQ,mBAAqB,EAAA;AAC7B,YAAO,OAAA,OAAA,CAAQ,oBAAoB,GAAG,CAAA,CAAA;AAAA,WAC1C;AACA,UAAA,OAAO,OAAQ,CAAA,GAAA;AAAA,YACX,IAAI,GAAI,CAAA,CAAC,OAAO,OAAQ,CAAA,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,WAC/C,CAAA;AAAA,SACJ,CAAA,CAAA;AAAA,OAAA;AAAA,KAEF,GAAA;AAAA,MACE,SAAW,EAAA,eAAA;AAAA,MACL,gBACF,GACU,EAAA;AAAA,QAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACV,UAAA,MAAM,IAAI,KAAA;AAAA,YACN,qDAAA;AAAA,WACJ,CAAA;AAAA,SACJ,CAAA,CAAA;AAAA,OAAA;AAAA,MACM,oBACF,IACY,EAAA;AAAA,QAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACZ,UAAA,MAAM,IAAI,KAAA;AAAA,YACN,yDAAA;AAAA,WACJ,CAAA;AAAA,SACJ,CAAA,CAAA;AAAA,OAAA;AAAA,KACJ,CAAA;AAEJ,IAAK,IAAA,CAAA,UAAA,GAAa,IAAIuB,kBAAW,CAAA,MAAA,CAAO,QAAQ,OAAQ,CAAA,CAAC,GAAG,IAAI,CAAA,CAAA;AAChE,IAAA,IAAA,CAAK,MAAS,GAAA,IAAIJ,qBAAe,CAAA,IAAA,CAAK,YAAY,YAAc,EAAA;AAAA,MAC5D,UAAA;AAAA,KACH,CAAA,CAAA;AAED,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAIK,eAAc,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAClD,IAAA,IAAA,CAAK,kBAAqB,GAAA,IAAI,kBAAmB,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAC5D,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAI,iBAAkB,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAC1D,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAClD,IAAA,IAAA,CAAK,WAAc,GAAA,IAAI,WAAY,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,GAClD;AAAA,EAhHA,IAAI,SAAuB,GAAA;AACvB,IAAA,IAAI,CAAC,IAAK,CAAA,MAAA,EAAc,MAAA,IAAI,MAAM,qBAAqB,CAAA,CAAA;AACvD,IAAA,OAAO,IAAIH,iBAAA,CAAU,IAAK,CAAA,MAAA,CAAO,KAAK,KAAK,CAAA,CAAA;AAAA,GAC/C;AAAA,EAEA,IAAI,OAA2B,GAAA;AAC3B,IAAA,OAAO,KAAK,MAAO,CAAA,OAAA,CAAA;AAAA,GACvB;AAAA,EAmHM,QAAQ,cAAyC,EAAA;AAAA,IAAA,OAAArB,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACnD,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AACvB,MAAI,IAAA,cAAA,IAAkB,MAAO,CAAA,CAAC,CAAG,EAAA;AAC7B,QAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA,CAAA;AAAA,OAC/D;AAEA,MAAA,MAAM,EAAK,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,eAAe,cAAc,CAAA,CAAA;AACjE,MAAM,MAAA,EAAE,IAAI,QAAU,EAAA,SAAA,EAAW,sBAC7B,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,CAAA,CAAA;AAC3B,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,QAAQ,CAAA,CAAA;AAClD,MAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAmB,MAAQ,EAAA;AAAA,QACzC,SAAA;AAAA,QACA,oBAAA;AAAA,OACH,CAAA,CAAA;AAAA,KACL,CAAA,CAAA;AAAA,GAAA;AAAA,EAYM,SAAS,cAAyC,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACpD,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AACvB,MAAI,IAAA,cAAA,IAAkB,MAAO,CAAA,CAAC,CAAG,EAAA;AAC7B,QAAM,MAAA,IAAI,MAAM,4CAA4C,CAAA,CAAA;AAAA,OAChE;AAEA,MAAA,MAAM,EAAK,GAAA,MAAM,IAAK,CAAA,aAAA,CAAc,gBAAgB,cAAc,CAAA,CAAA;AAClE,MAAM,MAAA,EAAE,IAAI,QAAU,EAAA,SAAA,EAAW,sBAC7B,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,CAAA,CAAA;AAC3B,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,QAAQ,CAAA,CAAA;AAClD,MAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAmB,MAAQ,EAAA;AAAA,QACzC,SAAA;AAAA,QACA,oBAAA;AAAA,OACH,CAAA,CAAA;AAAA,KACL,CAAA,CAAA;AAAA,GAAA;AAAA,EAKM,MAAM,cAAyC,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACjD,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AAEvB,MAAA,IAAI,CAAC,cAAA,IAAkB,cAAkB,IAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAChD,QAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA,CAAA;AAAA,OAC7D;AAEA,MAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAA;AAGlB,MAAA,MAAM,KAAK,MAAM,IAAA,CAAK,aAAc,CAAA,YAAA,CAAa,gBAAgB,IAAI,CAAA,CAAA;AAGrE,MAAA,MAAM,EAAK,GAAA,IAAIc,mBAAY,EAAA,CAAE,IAAI,EAAE,CAAA,CAAA;AACnC,MAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,CAAA,CAAA;AACxC,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,SAAS,EAAE,CAAA,CAAA;AAErD,MAAO,OAAA,IAAA,CAAK,kBAAmB,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAAA,KACnD,CAAA,CAAA;AAAA,GAAA;AAAA,EAKM,QAAQ,cAAyC,EAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACnD,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AAEvB,MAAA,IAAI,CAAC,cAAA,IAAkB,cAAkB,IAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAChD,QAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA,CAAA;AAAA,OAC/D;AAEA,MAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAA;AAGlB,MAAA,MAAM,KAAK,MAAM,IAAA,CAAK,aAAc,CAAA,cAAA,CAAe,gBAAgB,IAAI,CAAA,CAAA;AAGvE,MAAA,MAAM,EAAK,GAAA,IAAIc,mBAAY,EAAA,CAAE,IAAI,EAAE,CAAA,CAAA;AACnC,MAAA,MAAM,QAAW,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,CAAA,CAAA;AACxC,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,SAAS,EAAE,CAAA,CAAA;AAErD,MAAO,OAAA,IAAA,CAAK,kBAAmB,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAAA,KACnD,CAAA,CAAA;AAAA,GAAA;AAAA,EAQM,IAAI,cAAyC,EAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC/C,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AACvB,MAAA,IAAI,CAAC,cAAA,IAAkB,cAAkB,IAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAChD,QAAM,MAAA,IAAI,MAAM,sDAAsD,CAAA,CAAA;AAAA,OAC1E;AAEA,MAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAA;AAClB,MAAA,MAAM,OAAOyB,4BAAqB,CAAA,mBAAA,CAAoB,EAAE,KAAA,EAAO,KAAS,CAAA,CAAA;AACxE,MAAA,MAAM,KAAK,MAAM,IAAA,CAAK,WAAY,CAAA,eAAA,CAAgB,gBAAgB,IAAI,CAAA,CAAA;AACtE,MAAA,MAAM,KAAK,IAAIX,mBAAA,EAAc,CAAA,GAAA,CAAI,MAAM,EAAE,CAAA,CAAA;AACzC,MAAM,MAAA,EAAE,IAAI,QAAU,EAAA,SAAA,EAAW,sBAC7B,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,CAAA,CAAA;AAC3B,MAAA,MAAM,MAAS,GAAA,MAAM,IAAK,CAAA,eAAA,CAAgB,QAAQ,CAAA,CAAA;AAClD,MAAO,OAAA,MAAM,IAAK,CAAA,kBAAA,CAAmB,MAAQ,EAAA;AAAA,QACzC,SAAA;AAAA,QACA,oBAAA;AAAA,OACH,CAAA,CAAA;AAAA,KACL,CAAA,CAAA;AAAA,GAAA;AAAA,EAWM,YAAmC,GAAA;AAAA,IAAA,OAAAd,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AA5T7C,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA6TQ,MAAA,IAAI,CAAC,IAAK,CAAA,MAAA,EAAc,MAAA,IAAI,MAAM,0BAA0B,CAAA,CAAA;AAE5D,MAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAA;AAElB,MAAA,MAAM,iBAAiB,oBAAqB,EAAA,CAAA;AAC5C,MAAA,MAAM,WAAW,cAAe,EAAA,CAAA;AAChC,MAAA,MAAM,aAAa,mBAAoB,EAAA,CAAA;AAEvC,MAAA,MAAM,aAAgB,GAAAK,sCAAA;AAAA,QAClB,UAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACAC,8BAAA;AAAA,QACAG,oCAAA;AAAA,OACJ,CAAA;AAMA,MAAA,MAAM,CAAC,cAAgB,EAAA,aAAA,EAAe,QAAQ,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QAChE,IAAK,CAAA,UAAA,CAAW,UAAW,CAAA,IAAA,EAAM,WAAW,CAAA;AAAA,QAC5C,IAAA,CAAK,WACA,sBAAuB,CAAA,aAAA,EAAe,WAAW,CACjD,CAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,QACrB,KAAK,aAAc,CAAA,cAAA,CAAe,IAAI,CAAE,CAAA,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,OAC3D,CAAA,CAAA;AAED,MAAA,MAAM,eAAkB,GAAA,CAAA,CAAA;AAExB,MAAA,MAAM,eAAkB,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,aAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,aAAA,CAAe,KAAf,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,WAAtB,IAAgC,GAAA,EAAA,GAAA,GAAA,CAAA;AAExD,MAAM,MAAA,WAAA,GAAA,CAAc,EAAU,GAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,WAAA,KAAV,IAAyB,GAAA,EAAA,GAAA,IAAA,CAAA;AAC7C,MAAM,MAAA,cAAA,GAAA,CAAiB,EAAU,GAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,cAAA,KAAV,IAA4B,GAAA,EAAA,GAAA,IAAA,CAAA;AACnD,MAAM,MAAA,YAAA,GAAA,CAAe,EAAU,GAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,YAAA,KAAV,IAA0B,GAAA,EAAA,GAAA,IAAA,CAAA;AAC/C,MAAM,MAAA,kBAAA,GAAA,CAAqB,EAAU,GAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,kBAAA,KAAV,IAAgC,GAAA,EAAA,GAAA,IAAA,CAAA;AAO3D,MAAA,MAAM,eACF,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAgB,YAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,aAA9B,IAA8C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,KAAA,IAAA,GAAA,EAAA,GAAA,GAAA,CAAA;AAMlD,MAAA,MAAM,gBACF,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,kBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,kBAAA,CAAoB,uBAApB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA6C,aAA7C,IACA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,KAAA,IAAA,GAAA,EAAA,GAAA,GAAA,CAAA;AAcJ,MAAA,MAAM,eACF,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAa,YAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA2B,aAA3B,IAA2C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,KAAA,IAAA,GAAA,EAAA,GAAA,GAAA,CAAA;AAC/C,MAAA,MAAM,cACF,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAa,WAAb,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA0B,aAA1B,IAA0C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,KAAA,IAAA,GAAA,EAAA,GAAA,GAAA,CAAA;AAC9C,MAAA,MAAM,aACF,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,cAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAgB,YAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,aAA9B,IAA8C,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,CAAA,KAAA,IAAA,GAAA,EAAA,GAAA,GAAA,CAAA;AAElD,MAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA,CAAA;AAC3C,MAAM,MAAA,YAAA,GAAe,OAAO,eAAe,CAAA,CAAA;AAC3C,MAAM,MAAA,WAAA,GAAc,OAAO,cAAc,CAAA,CAAA;AACzC,MAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA,CAAA;AAEvC,MAAI,IAAA,oBAAA,GAAuB,OAAO,CAAC,CAAA,CAAA;AACnC,MAAI,IAAA,oBAAA,GAAuB,OAAO,CAAC,CAAA,CAAA;AAEnC,MAAA,IAAI,aAAa,MAAO,CAAA,CAAC,KAAK,YAAe,GAAA,MAAA,CAAO,CAAC,CAAG,EAAA;AAEpD,QAAA,oBAAA,GAAwB,aAAa,YAAgB,GAAAP,aAAA,CAAA;AAErD,QAAA,IAAI,uBAAuB,YAAc,EAAA;AACrC,UAAA,oBAAA,GAAuB,oBAAuB,GAAA,YAAA,CAAA;AAAA,SAClD;AAAA,OACJ;AAEA,MAAO,OAAA;AAAA,QACH,MAAQ,EAAA;AAAA,UACJ,MAAA,EAAQ,OAAO,cAAc,CAAA;AAAA,UAC7B,MAAQ,EAAA,KAAA;AAAA,UACR,QAAU,EAAA,CAAA;AAAA,SACd;AAAA,QACA,GAAK,EAAA;AAAA,UACD,MAAA,EAAQ,OAAO,eAAe,CAAA;AAAA,UAC9B,MAAQ,EAAA,QAAA;AAAA,UACR,QAAU,EAAA,eAAA;AAAA,UACV,GAAK,EAAA,aAAA;AAAA,SACT;AAAA,QACA,MAAQ,EAAA;AAAA,UAEJ,MAAQ,EAAA,YAAA;AAAA,UACR,MAAQ,EAAA,QAAA;AAAA,UACR,QAAU,EAAA,eAAA;AAAA,SACd;AAAA,QACA,IAAM,EAAA;AAAA,UAEF,MAAA,EAAQ,OAAO,gBAAgB,CAAA;AAAA,UAC/B,MAAQ,EAAA,OAAA;AAAA,UACR,QAAU,EAAA,CAAA;AAAA,SACd;AAAA,QACA,KAAO,EAAA;AAAA,UAEH,YAAA;AAAA,UACA,UAAY,EAAAA,aAAA;AAAA,UACZ,WAAA;AAAA,UACA,UAAA;AAAA,UAEA,oBAAA;AAAA,UACA,oBAAA;AAAA,SACJ;AAAA,QACA,MAAQ,EAAA;AAAA,UACJ,aAAA,EAAe,cAAc,QAAS,EAAA;AAAA,UACtC,cAAA,EAAgB,eAAe,QAAS,EAAA;AAAA,UACxC,QAAA,EAAU,SAAS,QAAS,EAAA;AAAA,UAC5B,WAAA,EAAA,CAAa,EAAa,GAAA,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAA,YAAA,KAAb,IAA2B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,UACxC,WAAA,EAAA,CAAa,EAAa,GAAA,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAA,WAAA,KAAb,IAA0B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,UACvC,oBAAA,EAAA,CACI,EAAc,GAAA,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,oBAAA,KAAd,IAAoC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,UACxC,sBAAA,EAAA,CACI,EAAc,GAAA,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAA,sBAAA,KAAd,IAAsC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,QAAA,EAAA;AAAA,SAC9C;AAAA,QACA,OAAA,EAAS,KAAK,OAAQ,CAAA,OAAA;AAAA,OAC1B,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GAAA;AAAA,EAYM,mBAAmB,OAII,EAAA;AAAA,IAAA,OAAAF,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACzB,MAAM,MAAA;AAAA,QACF,UAAU0B,eAAW,CAAA,WAAA;AAAA,QACrB,YAAA;AAAA,QACA,WAAA;AAAA,OACJ,GAAI,4BAAW,EAAC,CAAA;AAEhB,MAAA,MAAM,CAAC,WAAa,EAAA,YAAY,CAAI,GAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,QAClD,IAAA,CAAK,YAAY,gBAAiB,EAAA;AAAA,QAClC,IAAA,CAAK,YAAY,iBAAkB,EAAA;AAAA,OACtC,CAAA,CAAA;AAED,MAAM,MAAA,EAAE,OAAO,WAAa,EAAA,SAAA,KACxB,MAAM,IAAA,CAAK,YAAY,kBAAmB,EAAA,CAAA;AAE9C,MAAA,OAAO,0BAA2B,CAAA;AAAA,QAC9B,OAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,oBAAsB,EAAA,SAAA;AAAA,QACtB,kBAAoB,EAAA,YAAA;AAAA,QACpB,iBAAmB,EAAA,WAAA;AAAA,OACtB,CAAA,CAAA;AAAA,KACL,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,aAAgB,GAAA;AAAA,IAAA,OAAA1B,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClB,MAAA,IAAI,CAAC,IAAK,CAAA,MAAA,EAAc,MAAA,IAAI,MAAM,0BAA0B,CAAA,CAAA;AAC5D,MAAA,OAAO,IAAK,CAAA,kBAAA,CAAmB,aAAc,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,KAC/D,CAAA,CAAA;AAAA,GAAA;AAAA,EAUc,kBAAA,CACV,QACA,GACe,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACf,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AAEvB,MAAM,MAAA,SAAA,GAAY,MAAM,IAAA,CAAK,UAAW,CAAA,kBAAA;AAAA,QACpC,OAAO,SAAU,EAAA;AAAA,QACjB;AAAA,UACI,aAAe,EAAA,KAAA;AAAA,UACf,mBAAqB,EAAA,UAAA;AAAA,UACrB,UAAY,EAAA,CAAA;AAAA,SAChB;AAAA,OACJ,CAAA;AAEA,MAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,UAAW,CAAA,kBAAA;AAAA,QAC/B;AAAA,UACI,SAAA;AAAA,UACA,WAAW,GAAI,CAAA,SAAA;AAAA,UACf,sBAAsB,GAAI,CAAA,oBAAA;AAAA,SAC9B;AAAA,QACA,UAAA;AAAA,OACJ,CAAA;AAEA,MAAI,IAAA,IAAA,CAAK,MAAM,GAAK,EAAA;AAChB,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,uBAAuB,IAAK,CAAA,SAAA,CAAU,IAAK,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AAAA,SACzD,CAAA;AAAA,OACJ;AAEA,MAAO,OAAA,SAAA,CAAA;AAAA,KACX,CAAA,CAAA;AAAA,GAAA;AAAA,EAKM,gBACF,EAC0B,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC1B,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AACvB,MAAA,OAAO,IAAK,CAAA,MAAA,CAAO,MAAO,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAAA,KAChD,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,gBACF,MAC6B,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC7B,MAAA,IAAA,CAAK,iBAAkB,EAAA,CAAA;AACvB,MAAO,OAAA,IAAA,CAAK,MAAO,CAAA,cAAA,CAAe,MAAM,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AAAA,GAAA;AAAA,EAMM,UACF,EAKD,EAAA;AAAA,IAAA,OAAAA,SAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACC,MAAM,MAAA,EAAE,WAAW,oBAAqB,EAAA,GACpC,MAAM,IAAK,CAAA,UAAA,CAAW,mBAAmB,WAAW,CAAA,CAAA;AACxD,MAAA,EAAA,CAAG,eAAkB,GAAA,SAAA,CAAA;AACrB,MAAA,EAAA,CAAG,WAAW,IAAK,CAAA,SAAA,CAAA;AACnB,MAAO,OAAA,EAAE,EAAI,EAAA,SAAA,EAAW,oBAAqB,EAAA,CAAA;AAAA,KACjD,CAAA,CAAA;AAAA,GAAA;AAAA,EAMA,iBAAoB,GAAA;AAChB,IAAA,IAAI,CAAC,IAAK,CAAA,MAAA,IAAU,CAAC,IAAK,CAAA,MAAA,CAAO,OAAO,SAAW,EAAA;AAC/C,MAAM,MAAA,IAAI,MAAM,kDAAkD,CAAA,CAAA;AAAA,KACtE;AACA,IACI,IAAA,IAAA,CAAK,UAAU,QAAS,EAAA,KACxB,KAAK,MAAO,CAAA,MAAA,CAAO,SAAU,CAAA,QAAA,EAC/B,EAAA;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,wDAAA;AAAA,OACJ,CAAA;AAAA,KACJ;AAAA,GACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}