UNPKG

hapi-ton-sdk

Version:

SDK for managing HAPI attestations on TON network

1 lines 23 kB
{"version":3,"sources":["../src/utils/crc32.ts","../src/types/index.ts","../src/contracts/HapiAttestation.ts","../src/config.ts","../src/contracts/UserJetton.ts","../src/utils/index.ts","../src/core/HapiSDK.ts"],"sourcesContent":["export function crc32(str: string): number {\n const table = new Int32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let j = 0; j < 8; j++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[i] = c;\n }\n\n let crc = -1;\n for (let i = 0; i < str.length; i++) {\n crc = (crc >>> 8) ^ table[(crc ^ str.charCodeAt(i)) & 0xff];\n }\n return (crc ^ -1) >>> 0;\n}\n","import { crc32 } from \"../utils/crc32\";\n\nexport interface UserResponse {\n errorCode: number;\n scores: [\n {\n address: string;\n expirationDate: number | null;\n isMinted: boolean;\n network: string;\n score: number | null;\n }\n ];\n}\n\nexport interface TrustResponseData {\n errorCode: number;\n wallet: string;\n score: number;\n expiration: number;\n signature: string;\n validation?: string;\n attestationId?: string | null;\n recovery_id?: string;\n isRemint?: boolean;\n}\n\nexport interface AttestationParams {\n signature: string;\n trust: number;\n expiration: number;\n ref_id: number;\n}\n\nexport interface CreateAttestationOptions {\n queryId: number;\n trustScore: number;\n expirationDate: number;\n signature: Buffer;\n value: bigint;\n referralId?: bigint;\n}\n\nexport interface UpdateAttestationOptions {\n queryId: number;\n trustScore: number;\n expirationDate: number;\n signature: Buffer;\n value: bigint;\n}\n\nexport interface SDKConfig {\n hapiEndpoint: string;\n contractAddress: string;\n nodeUrl: string;\n referralId: number;\n network: number;\n tonApiKey?: string;\n}\n\nexport interface AttestationChangeEvent {\n userAddress: string;\n refId: number;\n}\n\nexport const OpCode = {\n createAttestation: crc32(\"create_attestation\"),\n updateAttestation: crc32(\"update_attestation\"),\n} as const;\n","import {\n Address,\n Cell,\n Contract,\n ContractProvider,\n SendMode,\n Sender,\n TupleItemSlice,\n beginCell,\n address as toAddress,\n} from \"@ton/core\";\n\nimport { config } from \"../config\";\n\nimport { OpCode } from \"../types\";\n\nimport { ContractAdapter } from \"@ton-api/ton-adapter\";\n\nexport class HapiTonAttestation implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n static createFromAddress(\n address = config.ton.score,\n contractAdapter: ContractAdapter\n ) {\n return contractAdapter.open(new HapiTonAttestation(toAddress(address)));\n }\n\n async getCreateAttestationFee(provider: ContractProvider): Promise<bigint> {\n const result = await provider.get(\"get_create_attestation_fee\", []);\n return result.stack.readBigNumber();\n }\n\n async getUpdateAttestationFee(provider: ContractProvider): Promise<bigint> {\n const result = await provider.get(\"get_update_attestation_fee\", []);\n return result.stack.readBigNumber();\n }\n\n async getAttestationData(provider: ContractProvider) {\n const res = await provider.get(\"get_hapi_attestation_data\", []);\n const userCount = res.stack.readBigNumber();\n const contractOwner = res.stack.readAddress();\n const commissionOwner = res.stack.readAddress();\n const createAttestatioFee = res.stack.readBigNumber();\n const updateAttestatioFee = res.stack.readBigNumber();\n const walletCode = res.stack.readCell();\n\n return {\n userCount,\n contractOwner,\n commissionOwner,\n createAttestatioFee,\n updateAttestatioFee,\n walletCode,\n };\n }\n\n static async getUserJettonAddress(\n provider: ContractProvider,\n address: string\n ): Promise<Address> {\n const result = await provider.get(\"get_user_jetton_address\", [\n {\n type: \"slice\",\n cell: beginCell().storeAddress(toAddress(address)).endCell(),\n } as TupleItemSlice,\n ]);\n return result.stack.readAddress();\n }\n\n static getStaticUserJettonAddress(address: string): Address {\n const JETTON_WALLET_CODE = Cell.fromBoc(\n Buffer.from(\n \"b5ee9c724102140100013b000114ff00f4a413f4bcf2c80b01020120021302014803070202cb040602dfd0ccc7434c0c05c6c2456f80871c02456f83e900c36cf1b088134c7c860842576e74e6ea497c1b81450b1c17cb87d208433e45309eea3ac40b4cfc0407481f4cffe803e900c208203d0901c3ec08076cf08d04d8572140173c584f2c1f2cfc073c5b3327b55007c057817c12103fcbc212050028c8801001cb0558cf1601fa027001cb6ac973fb000049a2e4400800e58280e78b387d013800e5b541086a993b6d80e58f8080e59fe4c080417d80400201480811020120090e0201480a0b0111ae56ed9e08122f8240120201200c0d0110a9d4db3c10345f0412010aa9bfdb3c30120201580f10000fad97fc13b7911840010dacd2ed9e2f824012010fb9996db3c145f04812001aed44d0fa40d207d33ffa40d430000cf230840ff2f0a35e372c\",\n \"hex\"\n )\n )[0];\n\n const JETTON_MASTER_ADDRESS = Address.parse(config.ton.score);\n const USER_ADDRESS = Address.parse(address);\n\n const USER_ADDRESS_CELL = beginCell().storeAddress(USER_ADDRESS).endCell();\n const JETTON_MASTER_ADDRESS_CELL = beginCell()\n .storeAddress(JETTON_MASTER_ADDRESS)\n .endCell();\n\n const userJettonWalletData = beginCell()\n .storeSlice(USER_ADDRESS_CELL.asSlice())\n .storeUint(0, 8)\n .storeUint(0, 64)\n .storeSlice(JETTON_MASTER_ADDRESS_CELL.asSlice())\n .storeRef(JETTON_WALLET_CODE)\n .endCell();\n\n const jettonWalletStateInit = beginCell()\n .storeUint(0, 2)\n .storeMaybeRef(JETTON_WALLET_CODE)\n .storeMaybeRef(userJettonWalletData)\n .storeUint(0, 1)\n .endCell();\n\n return new Address(0, jettonWalletStateInit.hash());\n }\n\n prepareCreateAttestation(opts: {\n queryId: number;\n trustScore: number;\n expirationDate: number;\n signature: Buffer;\n value: bigint;\n referralId?: bigint;\n }) {\n return {\n value: opts.value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell()\n .storeUint(OpCode.createAttestation, 32)\n .storeUint(opts.queryId, 64)\n .storeUint(opts.referralId ?? 0n, 64)\n .storeUint(opts.trustScore, 8)\n .storeUint(opts.expirationDate, 64)\n .storeBuffer(opts.signature)\n .endCell(),\n };\n }\n\n async sendCreateAttestation(\n provider: ContractProvider,\n via: Sender,\n opts: {\n queryId: number;\n trustScore: number;\n expirationDate: number;\n signature: Buffer;\n value: bigint;\n referralId?: bigint;\n }\n ) {\n await provider.internal(via, this.prepareCreateAttestation(opts));\n }\n\n prepareUpdateAttestation(opts: {\n queryId: number;\n trustScore: number;\n expirationDate: number;\n signature: Buffer;\n value: bigint;\n referralId?: bigint;\n }) {\n return {\n value: opts.value,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n body: beginCell()\n .storeUint(OpCode.updateAttestation, 32)\n .storeUint(opts.queryId, 64)\n .storeUint(opts.referralId ?? 0n, 64)\n .storeUint(opts.trustScore, 8)\n .storeUint(opts.expirationDate, 64)\n .storeBuffer(opts.signature)\n .endCell(),\n };\n }\n\n async sendUpdateAttestation(\n provider: ContractProvider,\n via: Sender,\n opts: {\n queryId: number;\n trustScore: number;\n expirationDate: number;\n signature: Buffer;\n value: bigint;\n }\n ) {\n await provider.internal(via, this.prepareUpdateAttestation(opts));\n }\n}\n","interface Config {\n apiStaging: string;\n apiProduction: string;\n ton: Readonly<{\n score: string;\n nodeUrl: string;\n }>;\n tonTestnet: Readonly<{\n score: string;\n nodeUrl: string;\n }>;\n tonApiPath: (hash: string) => string;\n}\n\nexport const config: Readonly<Config> = {\n apiStaging: \"https://hapi-one.stage.hapi.farm\",\n apiProduction: \"https://score-be.hapi.mobi\",\n ton: {\n score: \"kQC60vGFCtYeQi-S0p6Lhfghd0vYS1YcTiHDWhEmuQ39QpCh\",\n nodeUrl: \"https://tonapi.io\",\n },\n tonTestnet: {\n score: \"kQC60vGFCtYeQi-S0p6Lhfghd0vYS1YcTiHDWhEmuQ39QpCh\",\n nodeUrl: \"https://testnet.tonapi.io\",\n },\n tonApiPath: (hash: string) => `/v2/blockchain/messages/${hash}/transaction`,\n};\n","import { Address, Cell, Contract, ContractProvider } from \"@ton/core\";\n\nimport { ContractAdapter } from \"@ton-api/ton-adapter\";\n\nexport class UserTonJetton implements Contract {\n constructor(\n readonly address: Address,\n readonly init?: { code: Cell; data: Cell }\n ) {}\n\n static createFromAddress(address: Address, contractAdapter: ContractAdapter) {\n return contractAdapter.open(new UserTonJetton(address));\n }\n\n async getBalance(provider: ContractProvider): Promise<bigint> {\n const result = await provider.get(\"get_smc_balance\", []);\n return result.stack.readBigNumber();\n }\n\n async getOwner(provider: ContractProvider): Promise<Address> {\n const result = await provider.get(\"get_owner\", []);\n return result.stack.readAddress();\n }\n async getAttestationAddress(provider: ContractProvider): Promise<Address> {\n const result = await provider.get(\"get_attestation_address\", []);\n return result.stack.readAddress();\n }\n\n async getTrustScore(provider: ContractProvider): Promise<number> {\n const result = await provider.get(\"get_trust_score\", []);\n return result.stack.readNumber();\n }\n\n async getExpirationDate(provider: ContractProvider): Promise<number> {\n const result = await provider.get(\"get_expiration_date\", []);\n return result.stack.readNumber();\n }\n\n async getAttestationData(provider: ContractProvider) {\n const res = await provider.get(\"get_user_data\", []);\n const commissionOwner = res.stack.readAddress();\n const trustScore = res.stack.readBigNumber();\n const expirationDate = res.stack.readBigNumber();\n const attestationAddress = res.stack.readAddress();\n return {\n commissionOwner,\n trustScore,\n expirationDate,\n attestationAddress,\n };\n }\n}\n","import { toNano } from \"@ton/core\";\n\nexport const delay = async (time = 1000): Promise<void> => {\n return new Promise((res) => setTimeout(res, time));\n};\n\nexport const TON_DEFAULT_GAS = toNano(\"0.05\");\nexport const TON_MIN_COMMISSION = toNano(\"0.01\");\nexport const TON_MIN_JETTON_STORAGE = toNano(\"0.001\");\n","import { Address } from \"@ton/core\";\nimport { ContractAdapter } from \"@ton-api/ton-adapter\";\nimport { SDKConfig, TrustResponseData, UserResponse } from \"../types\";\nimport { HapiTonAttestation } from \"../contracts/HapiAttestation\";\nimport { UserTonJetton } from \"../contracts/UserJetton\";\nimport {\n delay,\n TON_DEFAULT_GAS,\n TON_MIN_COMMISSION,\n TON_MIN_JETTON_STORAGE,\n} from \"../utils\";\nimport { config } from \"../config\";\nimport axios from \"axios\";\n\nexport class HapiSDK {\n private config: SDKConfig;\n\n constructor(args: {\n referralId: number;\n staging?: boolean;\n testnet?: boolean;\n tonApiKey?: string;\n }) {\n this.config = {\n hapiEndpoint: args.staging ? config.apiStaging : config.apiProduction,\n contractAddress: config.ton.score,\n nodeUrl: args.testnet ? config.tonTestnet.nodeUrl : config.ton.nodeUrl,\n network: args.testnet ? -3 : -239,\n referralId: args.referralId,\n tonApiKey: args.tonApiKey,\n };\n }\n\n async getUser(jwt: string): Promise<UserResponse> {\n try {\n const response = await axios.get(\n `${this.config.hapiEndpoint}/ref/v2/get-user`,\n {\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n }\n );\n return response.data;\n } catch (error) {\n throw new Error(`Failed to get user: ${error}`);\n }\n }\n\n async getTrustScore(\n address: string,\n network: number,\n jwt: string\n ): Promise<TrustResponseData> {\n try {\n const response = await axios.post(\n `${this.config.hapiEndpoint}/ref/v2/score`,\n {\n address,\n network,\n },\n {\n headers: {\n Authorization: `Bearer ${jwt}`,\n },\n }\n );\n return response.data;\n } catch (error) {\n throw new Error(`Failed to get trust score: ${error}`);\n }\n }\n\n async getMessage() {\n try {\n const response = await axios.get(\n `${this.config.hapiEndpoint}/ref/v2/ton-payload`\n );\n return response.data;\n } catch (error) {\n throw new Error(`Failed to get ton payload: ${error}`);\n }\n }\n\n async checkProof({\n proof,\n address,\n network,\n }: {\n proof: {\n state_init: string;\n timestamp: number;\n domain: { lengthBytes: number; value: string };\n payload: string;\n signature: string;\n };\n address: string;\n network: number;\n }) {\n return axios.post(`${this.config.hapiEndpoint}/ref/v2/ton-login`, {\n proof,\n address,\n network,\n });\n }\n\n static async getUserAttestationOnchain(\n userAddress: string,\n contractAdapter: ContractAdapter\n ): Promise<{\n jettonAddress: Address;\n attestationData: {\n commissionOwner: Address;\n trustScore: bigint;\n expirationDate: bigint;\n attestationAddress: Address;\n };\n }> {\n try {\n const jettonAddress =\n HapiTonAttestation.getStaticUserJettonAddress(userAddress);\n const jettonContract = UserTonJetton.createFromAddress(\n jettonAddress,\n contractAdapter\n );\n const attestationData = await jettonContract.getAttestationData();\n\n return {\n jettonAddress,\n attestationData,\n };\n } catch (error) {\n throw new Error(`Failed to get user attestation data: ${error}`);\n }\n }\n\n async trackAttestationResult(\n transactionMessageHash: string,\n timeInterval = 7000,\n maxRetries = 9\n ) {\n let attempt = 0;\n let status: boolean | null = null;\n let data;\n\n while (attempt < maxRetries) {\n try {\n await delay(timeInterval);\n const transactionData = await axios.get(\n this.config.nodeUrl + config.tonApiPath(transactionMessageHash)\n );\n\n if (transactionData.status === 200 && transactionData.data.hash) {\n status = true;\n try {\n await axios.post(\n `${this.config.hapiEndpoint}/ref/v2/ref_transaction`,\n {\n hash: transactionData.data.hash,\n network: this.config.network,\n },\n {\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.tonApiKey}`,\n },\n }\n );\n } catch (error) {\n console.error(\"Error updating attestation count:\", error);\n }\n break;\n } else {\n status = false;\n }\n } catch (error) {\n console.error(`Error: while get locating transaction`, error);\n }\n\n attempt++;\n }\n\n return { status, data };\n }\n\n async calculateTransactionFee(\n isUpdate: boolean,\n contractAdapter: ContractAdapter\n ): Promise<bigint> {\n try {\n const hapiContract = HapiTonAttestation.createFromAddress(\n this.config.contractAddress,\n contractAdapter\n );\n\n const fee = isUpdate\n ? await hapiContract.getUpdateAttestationFee()\n : await hapiContract.getCreateAttestationFee();\n\n return isUpdate\n ? fee + TON_DEFAULT_GAS + TON_MIN_COMMISSION\n : fee + TON_DEFAULT_GAS + TON_MIN_COMMISSION + TON_MIN_JETTON_STORAGE;\n } catch (error) {\n throw new Error(`Failed to calculate transaction fee: ${error}`);\n }\n }\n}\n"],"mappings":";AAAO,SAAS,MAAM,KAAqB;AACzC,QAAM,QAAQ,IAAI,WAAW,GAAG;AAChC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAI,IAAI,IAAI,aAAc,MAAM,IAAK,MAAM;AAAA,IAC7C;AACA,UAAM,CAAC,IAAI;AAAA,EACb;AAEA,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAO,QAAQ,IAAK,OAAO,MAAM,IAAI,WAAW,CAAC,KAAK,GAAI;AAAA,EAC5D;AACA,UAAQ,MAAM,QAAQ;AACxB;;;ACkDO,IAAM,SAAS;AAAA,EACpB,mBAAmB,MAAM,oBAAoB;AAAA,EAC7C,mBAAmB,MAAM,oBAAoB;AAC/C;;;ACpEA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EAGA;AAAA,EACA,WAAW;AAAA,OACN;;;ACIA,IAAM,SAA2B;AAAA,EACtC,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EACA,YAAY,CAAC,SAAiB,2BAA2B,IAAI;AAC/D;;;ADRO,IAAM,qBAAN,MAAM,oBAAuC;AAAA,EAClD,YACW,SACA,MACT;AAFS;AACA;AAAA,EACR;AAAA,EAEH,OAAO,kBACL,UAAU,OAAO,IAAI,OACrB,iBACA;AACA,WAAO,gBAAgB,KAAK,IAAI,oBAAmB,UAAU,OAAO,CAAC,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,wBAAwB,UAA6C;AACzE,UAAM,SAAS,MAAM,SAAS,IAAI,8BAA8B,CAAC,CAAC;AAClE,WAAO,OAAO,MAAM,cAAc;AAAA,EACpC;AAAA,EAEA,MAAM,wBAAwB,UAA6C;AACzE,UAAM,SAAS,MAAM,SAAS,IAAI,8BAA8B,CAAC,CAAC;AAClE,WAAO,OAAO,MAAM,cAAc;AAAA,EACpC;AAAA,EAEA,MAAM,mBAAmB,UAA4B;AACnD,UAAM,MAAM,MAAM,SAAS,IAAI,6BAA6B,CAAC,CAAC;AAC9D,UAAM,YAAY,IAAI,MAAM,cAAc;AAC1C,UAAM,gBAAgB,IAAI,MAAM,YAAY;AAC5C,UAAM,kBAAkB,IAAI,MAAM,YAAY;AAC9C,UAAM,sBAAsB,IAAI,MAAM,cAAc;AACpD,UAAM,sBAAsB,IAAI,MAAM,cAAc;AACpD,UAAM,aAAa,IAAI,MAAM,SAAS;AAEtC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,qBACX,UACA,SACkB;AAClB,UAAM,SAAS,MAAM,SAAS,IAAI,2BAA2B;AAAA,MAC3D;AAAA,QACE,MAAM;AAAA,QACN,MAAM,UAAU,EAAE,aAAa,UAAU,OAAO,CAAC,EAAE,QAAQ;AAAA,MAC7D;AAAA,IACF,CAAC;AACD,WAAO,OAAO,MAAM,YAAY;AAAA,EAClC;AAAA,EAEA,OAAO,2BAA2B,SAA0B;AAC1D,UAAM,qBAAqB,KAAK;AAAA,MAC9B,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,EAAE,CAAC;AAEH,UAAM,wBAAwB,QAAQ,MAAM,OAAO,IAAI,KAAK;AAC5D,UAAM,eAAe,QAAQ,MAAM,OAAO;AAE1C,UAAM,oBAAoB,UAAU,EAAE,aAAa,YAAY,EAAE,QAAQ;AACzE,UAAM,6BAA6B,UAAU,EAC1C,aAAa,qBAAqB,EAClC,QAAQ;AAEX,UAAM,uBAAuB,UAAU,EACpC,WAAW,kBAAkB,QAAQ,CAAC,EACtC,UAAU,GAAG,CAAC,EACd,UAAU,GAAG,EAAE,EACf,WAAW,2BAA2B,QAAQ,CAAC,EAC/C,SAAS,kBAAkB,EAC3B,QAAQ;AAEX,UAAM,wBAAwB,UAAU,EACrC,UAAU,GAAG,CAAC,EACd,cAAc,kBAAkB,EAChC,cAAc,oBAAoB,EAClC,UAAU,GAAG,CAAC,EACd,QAAQ;AAEX,WAAO,IAAI,QAAQ,GAAG,sBAAsB,KAAK,CAAC;AAAA,EACpD;AAAA,EAEA,yBAAyB,MAOtB;AACD,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,UAAU,SAAS;AAAA,MACnB,MAAM,UAAU,EACb,UAAU,OAAO,mBAAmB,EAAE,EACtC,UAAU,KAAK,SAAS,EAAE,EAC1B,UAAU,KAAK,cAAc,IAAI,EAAE,EACnC,UAAU,KAAK,YAAY,CAAC,EAC5B,UAAU,KAAK,gBAAgB,EAAE,EACjC,YAAY,KAAK,SAAS,EAC1B,QAAQ;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,sBACJ,UACA,KACA,MAQA;AACA,UAAM,SAAS,SAAS,KAAK,KAAK,yBAAyB,IAAI,CAAC;AAAA,EAClE;AAAA,EAEA,yBAAyB,MAOtB;AACD,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ,UAAU,SAAS;AAAA,MACnB,MAAM,UAAU,EACb,UAAU,OAAO,mBAAmB,EAAE,EACtC,UAAU,KAAK,SAAS,EAAE,EAC1B,UAAU,KAAK,cAAc,IAAI,EAAE,EACnC,UAAU,KAAK,YAAY,CAAC,EAC5B,UAAU,KAAK,gBAAgB,EAAE,EACjC,YAAY,KAAK,SAAS,EAC1B,QAAQ;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,sBACJ,UACA,KACA,MAOA;AACA,UAAM,SAAS,SAAS,KAAK,KAAK,yBAAyB,IAAI,CAAC;AAAA,EAClE;AACF;;;AE/KO,IAAM,gBAAN,MAAM,eAAkC;AAAA,EAC7C,YACW,SACA,MACT;AAFS;AACA;AAAA,EACR;AAAA,EAEH,OAAO,kBAAkB,SAAkB,iBAAkC;AAC3E,WAAO,gBAAgB,KAAK,IAAI,eAAc,OAAO,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,WAAW,UAA6C;AAC5D,UAAM,SAAS,MAAM,SAAS,IAAI,mBAAmB,CAAC,CAAC;AACvD,WAAO,OAAO,MAAM,cAAc;AAAA,EACpC;AAAA,EAEA,MAAM,SAAS,UAA8C;AAC3D,UAAM,SAAS,MAAM,SAAS,IAAI,aAAa,CAAC,CAAC;AACjD,WAAO,OAAO,MAAM,YAAY;AAAA,EAClC;AAAA,EACA,MAAM,sBAAsB,UAA8C;AACxE,UAAM,SAAS,MAAM,SAAS,IAAI,2BAA2B,CAAC,CAAC;AAC/D,WAAO,OAAO,MAAM,YAAY;AAAA,EAClC;AAAA,EAEA,MAAM,cAAc,UAA6C;AAC/D,UAAM,SAAS,MAAM,SAAS,IAAI,mBAAmB,CAAC,CAAC;AACvD,WAAO,OAAO,MAAM,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,kBAAkB,UAA6C;AACnE,UAAM,SAAS,MAAM,SAAS,IAAI,uBAAuB,CAAC,CAAC;AAC3D,WAAO,OAAO,MAAM,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,mBAAmB,UAA4B;AACnD,UAAM,MAAM,MAAM,SAAS,IAAI,iBAAiB,CAAC,CAAC;AAClD,UAAM,kBAAkB,IAAI,MAAM,YAAY;AAC9C,UAAM,aAAa,IAAI,MAAM,cAAc;AAC3C,UAAM,iBAAiB,IAAI,MAAM,cAAc;AAC/C,UAAM,qBAAqB,IAAI,MAAM,YAAY;AACjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACnDA,SAAS,cAAc;AAEhB,IAAM,QAAQ,OAAO,OAAO,QAAwB;AACzD,SAAO,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,IAAI,CAAC;AACnD;AAEO,IAAM,kBAAkB,OAAO,MAAM;AACrC,IAAM,qBAAqB,OAAO,MAAM;AACxC,IAAM,yBAAyB,OAAO,OAAO;;;ACIpD,OAAO,WAAW;AAEX,IAAM,UAAN,MAAc;AAAA,EAGnB,YAAY,MAKT;AACD,SAAK,SAAS;AAAA,MACZ,cAAc,KAAK,UAAU,OAAO,aAAa,OAAO;AAAA,MACxD,iBAAiB,OAAO,IAAI;AAAA,MAC5B,SAAS,KAAK,UAAU,OAAO,WAAW,UAAU,OAAO,IAAI;AAAA,MAC/D,SAAS,KAAK,UAAU,KAAK;AAAA,MAC7B,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,KAAoC;AAChD,QAAI;AACF,YAAM,WAAW,MAAM,MAAM;AAAA,QAC3B,GAAG,KAAK,OAAO,YAAY;AAAA,QAC3B;AAAA,UACE,SAAS;AAAA,YACP,eAAe,UAAU,GAAG;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,uBAAuB,KAAK,EAAE;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,SACA,SACA,KAC4B;AAC5B,QAAI;AACF,YAAM,WAAW,MAAM,MAAM;AAAA,QAC3B,GAAG,KAAK,OAAO,YAAY;AAAA,QAC3B;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,UACE,SAAS;AAAA,YACP,eAAe,UAAU,GAAG;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,aAAa;AACjB,QAAI;AACF,YAAM,WAAW,MAAM,MAAM;AAAA,QAC3B,GAAG,KAAK,OAAO,YAAY;AAAA,MAC7B;AACA,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,8BAA8B,KAAK,EAAE;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAUG;AACD,WAAO,MAAM,KAAK,GAAG,KAAK,OAAO,YAAY,qBAAqB;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,0BACX,aACA,iBASC;AACD,QAAI;AACF,YAAM,gBACJ,mBAAmB,2BAA2B,WAAW;AAC3D,YAAM,iBAAiB,cAAc;AAAA,QACnC;AAAA,QACA;AAAA,MACF;AACA,YAAM,kBAAkB,MAAM,eAAe,mBAAmB;AAEhE,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,wCAAwC,KAAK,EAAE;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,uBACJ,wBACA,eAAe,KACf,aAAa,GACb;AACA,QAAI,UAAU;AACd,QAAI,SAAyB;AAC7B,QAAI;AAEJ,WAAO,UAAU,YAAY;AAC3B,UAAI;AACF,cAAM,MAAM,YAAY;AACxB,cAAM,kBAAkB,MAAM,MAAM;AAAA,UAClC,KAAK,OAAO,UAAU,OAAO,WAAW,sBAAsB;AAAA,QAChE;AAEA,YAAI,gBAAgB,WAAW,OAAO,gBAAgB,KAAK,MAAM;AAC/D,mBAAS;AACT,cAAI;AACF,kBAAM,MAAM;AAAA,cACV,GAAG,KAAK,OAAO,YAAY;AAAA,cAC3B;AAAA,gBACE,MAAM,gBAAgB,KAAK;AAAA,gBAC3B,SAAS,KAAK,OAAO;AAAA,cACvB;AAAA,cACA;AAAA,gBACE,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,eAAe,UAAU,KAAK,OAAO,SAAS;AAAA,gBAChD;AAAA,cACF;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,MAAM,qCAAqC,KAAK;AAAA,UAC1D;AACA;AAAA,QACF,OAAO;AACL,mBAAS;AAAA,QACX;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,yCAAyC,KAAK;AAAA,MAC9D;AAEA;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EAEA,MAAM,wBACJ,UACA,iBACiB;AACjB,QAAI;AACF,YAAM,eAAe,mBAAmB;AAAA,QACtC,KAAK,OAAO;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,MAAM,WACR,MAAM,aAAa,wBAAwB,IAC3C,MAAM,aAAa,wBAAwB;AAE/C,aAAO,WACH,MAAM,kBAAkB,qBACxB,MAAM,kBAAkB,qBAAqB;AAAA,IACnD,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,wCAAwC,KAAK,EAAE;AAAA,IACjE;AAAA,EACF;AACF;","names":[]}