{"version":3,"sources":["../index.ts","../src/SelfBackendVerifier.ts","../src/typechain-types/factories/AadhaarVerifier__factory.ts","../src/typechain-types/factories/IdentityVerificationHubImpl__factory.ts","../src/typechain-types/factories/KycVerifier__factory.ts","../src/typechain-types/factories/Registry__factory.ts","../src/typechain-types/factories/Verifier__factory.ts","../src/utils/constants.ts","../src/errors/RegistryContractError.ts","../src/errors/VerifierContractError.ts","../src/errors/ProofError.ts","../src/errors/index.ts","../src/utils/proof.ts","../src/utils/id.ts","../src/utils/hash.ts","../src/utils/utils.ts","../src/store/DefaultConfigStore.ts","../src/store/InMemoryConfigStore.ts"],"sourcesContent":["import { SelfBackendVerifier } from './src/SelfBackendVerifier.js';\nimport { countryCodes } from '@selfxyz/common/constants/constants';\nimport { getUniversalLink } from '@selfxyz/common/utils/appType';\nimport { countries } from '@selfxyz/common/constants/countries';\nimport type { AttestationId, VerificationResult, VerificationConfig } from 'src/types/types.js';\nimport { ATTESTATION_ID } from 'src/utils/constants.js';\nimport type { IConfigStorage } from 'src/store/interface.js';\nimport { DefaultConfigStore } from 'src/store/DefaultConfigStore.js';\nimport { AllIds } from 'src/utils/constants.js';\nimport { InMemoryConfigStore } from 'src/store/InMemoryConfigStore.js';\nimport {\n  ConfigMismatchError,\n  ConfigMismatch,\n  RegistryContractError,\n  VerifierContractError,\n  ProofError,\n} from 'src/errors/index.js';\n\nexport {\n  SelfBackendVerifier,\n  ATTESTATION_ID,\n  countryCodes,\n  getUniversalLink,\n  countries,\n  AttestationId,\n  IConfigStorage,\n  DefaultConfigStore,\n  InMemoryConfigStore,\n  AllIds,\n  VerificationResult,\n  VerificationConfig,\n  ConfigMismatchError,\n  ConfigMismatch,\n  RegistryContractError,\n  VerifierContractError,\n  ProofError,\n};\n","import { ethers } from 'ethers';\nimport { hashEndpointWithScope } from '@selfxyz/common/utils/scope';\nimport {\n  AadhaarVerifier,\n  AadhaarVerifier__factory,\n  IdentityVerificationHubImpl,\n  IdentityVerificationHubImpl__factory,\n  KycVerifier,\n  KycVerifier__factory,\n  Registry__factory,\n  Verifier,\n  Verifier__factory,\n} from './typechain-types/index.js';\nimport { discloseIndices } from './utils/constants.js';\nimport { formatRevealedDataPacked } from './utils/id.js';\nimport { AttestationId, VcAndDiscloseProof, VerificationConfig } from './types/types.js';\nimport { Country3LetterCode } from '@selfxyz/common/constants/countries';\nimport { calculateUserIdentifierHash } from './utils/hash.js';\nimport { castToUserIdentifier, UserIdType } from '@selfxyz/common/utils/circuits/uuid';\nimport {\n  ConfigMismatch,\n  ConfigMismatchError,\n  RegistryContractError,\n  VerifierContractError,\n} from './errors/index.js';\nimport { IConfigStorage } from './store/interface.js';\nimport { unpackForbiddenCountriesList } from './utils/utils.js';\nimport { BigNumberish } from 'ethers';\n\nconst CELO_MAINNET_RPC_URL = 'https://forno.celo.org';\nconst CELO_TESTNET_RPC_URL = 'https://forno.celo-sepolia.celo-testnet.org';\n\nconst IDENTITY_VERIFICATION_HUB_ADDRESS = '0xe57F4773bd9c9d8b6Cd70431117d353298B9f5BF';\nconst IDENTITY_VERIFICATION_HUB_ADDRESS_STAGING = '0x16ECBA51e18a4a7e61fdC417f0d47AFEeDfbed74';\n\nexport class SelfBackendVerifier {\n  protected scope: string;\n  protected identityVerificationHubContract: IdentityVerificationHubImpl;\n  protected configStorage: IConfigStorage;\n  protected provider: ethers.JsonRpcProvider;\n  protected allowedIds: Map<AttestationId, boolean>;\n  protected userIdentifierType: UserIdType;\n\n  constructor(\n    scope: string,\n    endpoint: string,\n    mockPassport: boolean = false,\n    allowedIds: Map<AttestationId, boolean>,\n    configStorage: IConfigStorage,\n    userIdentifierType: UserIdType\n  ) {\n    const rpcUrl = mockPassport ? CELO_TESTNET_RPC_URL : CELO_MAINNET_RPC_URL;\n    const provider = new ethers.JsonRpcProvider(rpcUrl);\n    const identityVerificationHubAddress = mockPassport\n      ? IDENTITY_VERIFICATION_HUB_ADDRESS_STAGING\n      : IDENTITY_VERIFICATION_HUB_ADDRESS;\n    this.identityVerificationHubContract = IdentityVerificationHubImpl__factory.connect(\n      identityVerificationHubAddress,\n      provider\n    );\n    this.provider = provider;\n    this.scope = hashEndpointWithScope(endpoint, scope);\n    this.allowedIds = allowedIds;\n    this.configStorage = configStorage;\n    this.userIdentifierType = userIdentifierType;\n  }\n\n  public async verify(\n    attestationId: AttestationId,\n    proof: VcAndDiscloseProof,\n    pubSignals: BigNumberish[],\n    userContextData: string\n  ) {\n    //check if attestation id is allowed\n    const allowedId = this.allowedIds.get(attestationId);\n    let issues: Array<{ type: ConfigMismatch; message: string }> = [];\n    if (!allowedId) {\n      issues.push({\n        type: ConfigMismatch.InvalidId,\n        message: 'Attestation ID is not allowed, received: ' + attestationId,\n      });\n    }\n\n    const publicSignals = pubSignals\n      .map(String)\n      .map((x) => (/[a-f]/g.test(x) && x.length > 0 ? '0x' + x : x));\n    //check if user context hash matches\n    const userContextHashInCircuit = BigInt(\n      publicSignals[discloseIndices[attestationId].userIdentifierIndex]\n    );\n    const userContextHash = BigInt(\n      calculateUserIdentifierHash(Buffer.from(userContextData, 'hex'))\n    );\n\n    if (userContextHashInCircuit !== userContextHash) {\n      issues.push({\n        type: ConfigMismatch.InvalidUserContextHash,\n        message:\n          'User context hash does not match with the one in the circuit\\nCircuit: ' +\n          userContextHashInCircuit +\n          '\\nUser context hash: ' +\n          userContextHash,\n      });\n    }\n\n    //check if scope matches\n    const isValidScope = this.scope === publicSignals[discloseIndices[attestationId].scopeIndex];\n    if (!isValidScope) {\n      issues.push({\n        type: ConfigMismatch.InvalidScope,\n        message:\n          'Scope does not match with the one in the circuit\\nCircuit: ' +\n          publicSignals[discloseIndices[attestationId].scopeIndex] +\n          '\\nScope: ' +\n          this.scope,\n      });\n    }\n\n    //check the root\n    try {\n      const registryAddress = await this.identityVerificationHubContract.registry(\n        '0x' + attestationId.toString(16).padStart(64, '0')\n      );\n      if (registryAddress === '0x0000000000000000000000000000000000000000') {\n        throw new RegistryContractError('Registry contract not found');\n      }\n      const registryContract = Registry__factory.connect(registryAddress, this.provider);\n      const currentRoot = await registryContract.checkIdentityCommitmentRoot(\n        publicSignals[discloseIndices[attestationId].merkleRootIndex]\n      );\n      if (!currentRoot) {\n        issues.push({\n          type: ConfigMismatch.InvalidRoot,\n          message:\n            'Onchain root does not exist, received: ' +\n            publicSignals[discloseIndices[attestationId].merkleRootIndex],\n        });\n      }\n    } catch (error) {\n      throw new RegistryContractError('Registry contract not found');\n    }\n\n    //check if attestation id matches\n    const isValidAttestationId =\n      attestationId.toString() === publicSignals[discloseIndices[attestationId].attestationIdIndex];\n    if (!isValidAttestationId) {\n      issues.push({\n        type: ConfigMismatch.InvalidAttestationId,\n        message: 'Attestation ID does not match with the one in the circuit',\n      });\n    }\n\n    const userIdentifier = castToUserIdentifier(\n      BigInt('0x' + userContextData.slice(64, 128)),\n      this.userIdentifierType\n    );\n    const userDefinedData = userContextData.slice(128);\n    const configId = await this.configStorage.getActionId(userIdentifier, userDefinedData);\n    if (!configId) {\n      issues.push({\n        type: ConfigMismatch.ConfigNotFound,\n        message: 'Config Id not found',\n      });\n    }\n\n    let verificationConfig: VerificationConfig | null;\n    try {\n      verificationConfig = await this.configStorage.getConfig(configId);\n    } catch (error) {\n      issues.push({\n        type: ConfigMismatch.ConfigNotFound,\n        message: `Config not found for ${configId}`,\n      });\n    } finally {\n      if (!verificationConfig) {\n        issues.push({\n          type: ConfigMismatch.ConfigNotFound,\n          message: `Config not found for ${configId}`,\n        });\n        throw new ConfigMismatchError(issues);\n      }\n    }\n\n    //check if forbidden countries list matches\n    const forbiddenCountriesList: string[] = unpackForbiddenCountriesList(\n      [0, 1, 2, 3].map(\n        (x) => publicSignals[discloseIndices[attestationId].forbiddenCountriesListPackedIndex + x]\n      )\n    );\n    const forbiddenCountriesListVerificationConfig = verificationConfig.excludedCountries || [];\n\n    const isForbiddenCountryListValid = forbiddenCountriesListVerificationConfig.every((country) =>\n      forbiddenCountriesList.includes(country as Country3LetterCode)\n    );\n    if (!isForbiddenCountryListValid) {\n      issues.push({\n        type: ConfigMismatch.InvalidForbiddenCountriesList,\n        message:\n          'Forbidden countries list in config does not match with the one in the circuit\\nCircuit: ' +\n          forbiddenCountriesList.join(', ') +\n          '\\nConfig: ' +\n          forbiddenCountriesListVerificationConfig.join(', '),\n      });\n    }\n\n    const genericDiscloseOutput = formatRevealedDataPacked(attestationId, publicSignals);\n    //check if minimum age matches\n    const isMinimumAgeValid =\n      verificationConfig.minimumAge !== undefined\n        ? verificationConfig.minimumAge === Number.parseInt(genericDiscloseOutput.minimumAge, 10) ||\n          genericDiscloseOutput.minimumAge === '00'\n        : true;\n    if (!isMinimumAgeValid) {\n      issues.push({\n        type: ConfigMismatch.InvalidMinimumAge,\n        message:\n          'Minimum age in config does not match with the one in the circuit\\nCircuit: ' +\n          genericDiscloseOutput.minimumAge +\n          '\\nConfig: ' +\n          verificationConfig.minimumAge,\n      });\n    }\n\n    let circuitTimestampYy: number[];\n    let circuitTimestampMm: number[];\n    let circuitTimestampDd: number[];\n    if (attestationId === 4) {\n      circuitTimestampYy = publicSignals\n        .slice(\n          discloseIndices[attestationId].currentDateIndex,\n          discloseIndices[attestationId].currentDateIndex + 4\n        )\n        .map(Number);\n      circuitTimestampMm = publicSignals\n        .slice(\n          discloseIndices[attestationId].currentDateIndex + 4,\n          discloseIndices[attestationId].currentDateIndex + 6\n        )\n        .map(Number);\n      circuitTimestampDd = publicSignals\n        .slice(\n          discloseIndices[attestationId].currentDateIndex + 6,\n          discloseIndices[attestationId].currentDateIndex + 8\n        )\n        .map(Number);\n    } else if (attestationId === 3) {\n      circuitTimestampYy = String(publicSignals[discloseIndices[attestationId].currentDateIndex])\n        .split('')\n        .map(Number);\n      circuitTimestampMm = String(\n        publicSignals[discloseIndices[attestationId].currentDateIndex + 1]\n      )\n        .split('')\n        .map(Number);\n      circuitTimestampDd = String(\n        publicSignals[discloseIndices[attestationId].currentDateIndex + 2]\n      )\n        .split('')\n        .map(Number);\n    } else {\n      circuitTimestampYy = [\n        2,\n        0,\n        +publicSignals[discloseIndices[attestationId].currentDateIndex],\n        +publicSignals[discloseIndices[attestationId].currentDateIndex + 1],\n      ];\n      circuitTimestampMm = [\n        +publicSignals[discloseIndices[attestationId].currentDateIndex + 2],\n        +publicSignals[discloseIndices[attestationId].currentDateIndex + 3],\n      ];\n      circuitTimestampDd = [\n        +publicSignals[discloseIndices[attestationId].currentDateIndex + 4],\n        +publicSignals[discloseIndices[attestationId].currentDateIndex + 5],\n      ];\n    }\n\n    const circuitTimestamp = new Date(\n      Number(circuitTimestampYy.join('')),\n      Number(circuitTimestampMm.join('')) - 1,\n      Number(circuitTimestampDd.join(''))\n    );\n    const currentTimestamp = new Date();\n\n    //check if timestamp is in the future\n    const oneDayAhead = new Date(currentTimestamp.getTime() + 24 * 60 * 60 * 1000);\n    if (circuitTimestamp > oneDayAhead) {\n      issues.push({\n        type: ConfigMismatch.InvalidTimestamp,\n        message: 'Circuit timestamp is in the future',\n      });\n    }\n\n    //check if timestamp is 1 day in the past\n    const circuitTimestampEOD = new Date(\n      circuitTimestamp.getTime() + 23 * 60 * 60 * 1e3 + 59 * 60 * 1e3 + 59 * 1e3\n    );\n    const oneDayAgo = new Date(currentTimestamp.getTime() - 24 * 60 * 60 * 1000);\n    if (circuitTimestampEOD < oneDayAgo) {\n      issues.push({\n        type: ConfigMismatch.InvalidTimestamp,\n        message: 'Circuit timestamp is too old',\n      });\n    }\n\n    if (issues.length > 0) {\n      throw new ConfigMismatchError(issues);\n    }\n\n    let verifierContract: Verifier | AadhaarVerifier | KycVerifier;\n    try {\n      const verifierAddress = await this.identityVerificationHubContract.discloseVerifier(\n        '0x' + attestationId.toString(16).padStart(64, '0')\n      );\n      if (verifierAddress === '0x0000000000000000000000000000000000000000') {\n        throw new VerifierContractError('Verifier contract not found');\n      }\n      if (attestationId === 4) {\n        verifierContract = KycVerifier__factory.connect(verifierAddress, this.provider);\n      } else if (attestationId === 3) {\n        verifierContract = AadhaarVerifier__factory.connect(verifierAddress, this.provider);\n      } else {\n        verifierContract = Verifier__factory.connect(verifierAddress, this.provider);\n      }\n    } catch (error) {\n      throw new VerifierContractError('Verifier contract not found');\n    }\n\n    let isValid = false;\n    try {\n      isValid = await verifierContract.verifyProof(\n        proof.a,\n        [\n          [proof.b[0][1], proof.b[0][0]],\n          [proof.b[1][1], proof.b[1][0]],\n        ],\n        proof.c,\n        publicSignals\n      );\n    } catch (error) {\n      isValid = false;\n    }\n\n    const cumulativeOfac = genericDiscloseOutput.ofac.reduce((acc, curr) => acc || curr, false);\n\n    return {\n      attestationId,\n      isValidDetails: {\n        isValid,\n        isMinimumAgeValid:\n          verificationConfig.minimumAge !== undefined\n            ? verificationConfig.minimumAge <= Number.parseInt(genericDiscloseOutput.minimumAge, 10)\n            : true,\n        isOfacValid:\n          //isOfacValid is true when a person is in OFAC list\n          verificationConfig.ofac !== undefined && verificationConfig.ofac ? cumulativeOfac : false,\n      },\n      forbiddenCountriesList,\n      discloseOutput: genericDiscloseOutput,\n      userData: {\n        userIdentifier,\n        userDefinedData,\n      },\n    };\n  }\n}\n","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n/* eslint-disable */\n\nimport { Contract, Interface, type ContractRunner } from \"ethers\";\nimport type {\n  AadhaarVerifier,\n  AadhaarVerifierInterface,\n} from \"../AadhaarVerifier.js\";\n\nconst _abi = [\n  {\n    inputs: [\n      {\n        internalType: \"uint256[2]\",\n        name: \"a\",\n        type: \"uint256[2]\",\n      },\n      {\n        internalType: \"uint256[2][2]\",\n        name: \"b\",\n        type: \"uint256[2][2]\",\n      },\n      {\n        internalType: \"uint256[2]\",\n        name: \"c\",\n        type: \"uint256[2]\",\n      },\n      {\n        internalType: \"uint256[19]\",\n        name: \"pubSignals\",\n        type: \"uint256[19]\",\n      },\n    ],\n    name: \"verifyProof\",\n    outputs: [\n      {\n        internalType: \"bool\",\n        name: \"\",\n        type: \"bool\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n] as const;\n\nexport class AadhaarVerifier__factory {\n  static readonly abi = _abi;\n  static createInterface(): AadhaarVerifierInterface {\n    return new Interface(_abi) as AadhaarVerifierInterface;\n  }\n  static connect(\n    address: string,\n    runner?: ContractRunner | null\n  ): AadhaarVerifier {\n    return new Contract(address, _abi, runner) as unknown as AadhaarVerifier;\n  }\n}\n","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n/* eslint-disable */\n\nimport { Contract, Interface, type ContractRunner } from \"ethers\";\nimport type {\n  IdentityVerificationHubImpl,\n  IdentityVerificationHubImplInterface,\n} from \"../IdentityVerificationHubImpl.js\";\n\nconst _abi = [\n  {\n    inputs: [\n      {\n        internalType: \"bytes32\",\n        name: \"attestationId\",\n        type: \"bytes32\",\n      },\n    ],\n    name: \"discloseVerifier\",\n    outputs: [\n      {\n        internalType: \"address\",\n        name: \"\",\n        type: \"address\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n  {\n    inputs: [\n      {\n        internalType: \"bytes32\",\n        name: \"attestationId\",\n        type: \"bytes32\",\n      },\n    ],\n    name: \"registry\",\n    outputs: [\n      {\n        internalType: \"address\",\n        name: \"\",\n        type: \"address\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n] as const;\n\nexport class IdentityVerificationHubImpl__factory {\n  static readonly abi = _abi;\n  static createInterface(): IdentityVerificationHubImplInterface {\n    return new Interface(_abi) as IdentityVerificationHubImplInterface;\n  }\n  static connect(\n    address: string,\n    runner?: ContractRunner | null\n  ): IdentityVerificationHubImpl {\n    return new Contract(\n      address,\n      _abi,\n      runner\n    ) as unknown as IdentityVerificationHubImpl;\n  }\n}\n","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n/* eslint-disable */\n\nimport { Contract, Interface, type ContractRunner } from \"ethers\";\nimport type { KycVerifier, KycVerifierInterface } from \"../KycVerifier.js\";\n\nconst _abi = [\n  {\n    inputs: [\n      {\n        internalType: \"uint256[2]\",\n        name: \"a\",\n        type: \"uint256[2]\",\n      },\n      {\n        internalType: \"uint256[2][2]\",\n        name: \"b\",\n        type: \"uint256[2][2]\",\n      },\n      {\n        internalType: \"uint256[2]\",\n        name: \"c\",\n        type: \"uint256[2]\",\n      },\n      {\n        internalType: \"uint256[29]\",\n        name: \"pubSignals\",\n        type: \"uint256[29]\",\n      },\n    ],\n    name: \"verifyProof\",\n    outputs: [\n      {\n        internalType: \"bool\",\n        name: \"\",\n        type: \"bool\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n] as const;\n\nexport class KycVerifier__factory {\n  static readonly abi = _abi;\n  static createInterface(): KycVerifierInterface {\n    return new Interface(_abi) as KycVerifierInterface;\n  }\n  static connect(address: string, runner?: ContractRunner | null): KycVerifier {\n    return new Contract(address, _abi, runner) as unknown as KycVerifier;\n  }\n}\n","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n/* eslint-disable */\n\nimport { Contract, Interface, type ContractRunner } from \"ethers\";\nimport type { Registry, RegistryInterface } from \"../Registry.js\";\n\nconst _abi = [\n  {\n    inputs: [\n      {\n        internalType: \"uint256\",\n        name: \"root\",\n        type: \"uint256\",\n      },\n    ],\n    name: \"checkIdentityCommitmentRoot\",\n    outputs: [\n      {\n        internalType: \"bool\",\n        name: \"\",\n        type: \"bool\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n] as const;\n\nexport class Registry__factory {\n  static readonly abi = _abi;\n  static createInterface(): RegistryInterface {\n    return new Interface(_abi) as RegistryInterface;\n  }\n  static connect(address: string, runner?: ContractRunner | null): Registry {\n    return new Contract(address, _abi, runner) as unknown as Registry;\n  }\n}\n","/* Autogenerated file. Do not edit manually. */\n/* tslint:disable */\n/* eslint-disable */\n\nimport { Contract, Interface, type ContractRunner } from \"ethers\";\nimport type { Verifier, VerifierInterface } from \"../Verifier.js\";\n\nconst _abi = [\n  {\n    inputs: [\n      {\n        internalType: \"uint256[2]\",\n        name: \"a\",\n        type: \"uint256[2]\",\n      },\n      {\n        internalType: \"uint256[2][2]\",\n        name: \"b\",\n        type: \"uint256[2][2]\",\n      },\n      {\n        internalType: \"uint256[2]\",\n        name: \"c\",\n        type: \"uint256[2]\",\n      },\n      {\n        internalType: \"uint256[21]\",\n        name: \"pubSignals\",\n        type: \"uint256[21]\",\n      },\n    ],\n    name: \"verifyProof\",\n    outputs: [\n      {\n        internalType: \"bool\",\n        name: \"\",\n        type: \"bool\",\n      },\n    ],\n    stateMutability: \"view\",\n    type: \"function\",\n  },\n] as const;\n\nexport class Verifier__factory {\n  static readonly abi = _abi;\n  static createInterface(): VerifierInterface {\n    return new Interface(_abi) as VerifierInterface;\n  }\n  static connect(address: string, runner?: ContractRunner | null): Verifier {\n    return new Contract(address, _abi, runner) as unknown as Verifier;\n  }\n}\n","import { AttestationId } from 'src/types/types.js';\n\nexport const ATTESTATION_ID = {\n  PASSPORT: 1,\n  BIOMETRIC_ID_CARD: 2,\n  AADHAAR: 3,\n  SELFRICA_ID_CARD: 4,\n} as const;\n\nexport const discloseIndices = {\n  1: {\n    revealedDataPackedIndex: 0,\n    forbiddenCountriesListPackedIndex: 3,\n    nullifierIndex: 7,\n    attestationIdIndex: 8,\n    merkleRootIndex: 9,\n    currentDateIndex: 10,\n    namedobSmtRootIndex: 17,\n    nameyobSmtRootIndex: 18,\n    scopeIndex: 19,\n    userIdentifierIndex: 20,\n    passportNoSmtRootIndex: 16,\n  },\n  2: {\n    revealedDataPackedIndex: 0,\n    forbiddenCountriesListPackedIndex: 4,\n    nullifierIndex: 8,\n    attestationIdIndex: 9,\n    merkleRootIndex: 10,\n    currentDateIndex: 11,\n    namedobSmtRootIndex: 17,\n    nameyobSmtRootIndex: 18,\n    scopeIndex: 19,\n    userIdentifierIndex: 20,\n    passportNoSmtRootIndex: 99,\n  },\n  3: {\n    revealedDataPackedIndex: 2,\n    forbiddenCountriesListPackedIndex: 6,\n    nullifierIndex: 0,\n    attestationIdIndex: 10,\n    merkleRootIndex: 16,\n    currentDateIndex: 11,\n    namedobSmtRootIndex: 14,\n    nameyobSmtRootIndex: 15,\n    scopeIndex: 17,\n    userIdentifierIndex: 18,\n    passportNoSmtRootIndex: 99,\n  },\n  // Selfrica ID Card - see CircuitConstantsV2.sol for layout documentation\n  4: {\n    revealedDataPackedIndex: 0,\n    forbiddenCountriesListPackedIndex: 10,\n    nullifierIndex: 14,\n    attestationIdIndex: 15,\n    merkleRootIndex: 17,\n    currentDateIndex: 21,\n    namedobSmtRootIndex: 18,\n    nameyobSmtRootIndex: 19,\n    scopeIndex: 16,\n    userIdentifierIndex: 20,\n    passportNoSmtRootIndex: 99,\n  },\n} as const;\n\ntype RevealedDataFields =\n  | 'issuingState'\n  | 'name'\n  | 'idNumber'\n  | 'nationality'\n  | 'dateOfBirth'\n  | 'gender'\n  | 'expiryDate'\n  | 'olderThan'\n  | 'ofac';\n\nexport const revealedDataIndices: Record<\n  AttestationId,\n  Record<`${RevealedDataFields}Start` | `${RevealedDataFields}End`, number>\n> = {\n  1: {\n    issuingStateStart: 2,\n    issuingStateEnd: 4,\n    nameStart: 5,\n    nameEnd: 43,\n    idNumberStart: 44,\n    idNumberEnd: 52,\n    nationalityStart: 54,\n    nationalityEnd: 56,\n    dateOfBirthStart: 57,\n    dateOfBirthEnd: 62,\n    genderStart: 64,\n    genderEnd: 64,\n    expiryDateStart: 65,\n    expiryDateEnd: 70,\n    olderThanStart: 88,\n    olderThanEnd: 89,\n    ofacStart: 90,\n    ofacEnd: 92,\n  },\n  2: {\n    issuingStateStart: 2,\n    issuingStateEnd: 4,\n    nameStart: 60,\n    nameEnd: 89,\n    idNumberStart: 5,\n    idNumberEnd: 13,\n    nationalityStart: 45,\n    nationalityEnd: 47,\n    dateOfBirthStart: 30,\n    dateOfBirthEnd: 35,\n    genderStart: 37,\n    genderEnd: 37,\n    expiryDateStart: 38,\n    expiryDateEnd: 43,\n    olderThanStart: 90,\n    olderThanEnd: 91,\n    ofacStart: 92,\n    ofacEnd: 93,\n  },\n  3: {\n    issuingStateStart: 81,\n    issuingStateEnd: 111,\n    nameStart: 9,\n    nameEnd: 70,\n    idNumberStart: 71,\n    idNumberEnd: 74,\n    nationalityStart: 999,\n    nationalityEnd: 999,\n    dateOfBirthStart: 1,\n    dateOfBirthEnd: 8,\n    genderStart: 0,\n    genderEnd: 0,\n    expiryDateStart: 999,\n    expiryDateEnd: 999,\n    olderThanStart: 118,\n    olderThanEnd: 118,\n    ofacStart: 116,\n    ofacEnd: 117,\n  },\n  4: {\n    issuingStateStart: 99,\n    issuingStateEnd: 99,\n    nameStart: 78,\n    nameEnd: 141,\n    idNumberStart: 30,\n    idNumberEnd: 61,\n    nationalityStart: 0,\n    nationalityEnd: 2,\n    dateOfBirthStart: 142,\n    dateOfBirthEnd: 149,\n    genderStart: 194,\n    genderEnd: 194,\n    expiryDateStart: 70,\n    expiryDateEnd: 77,\n    olderThanStart: 297,\n    olderThanEnd: 297,\n    ofacStart: 295,\n    ofacEnd: 296,\n  },\n} as const;\n\nconst allIdEntries = Object.keys(discloseIndices).map(\n  (id) => [Number(id) as AttestationId, true] as [AttestationId, boolean]\n);\nexport const AllIds = new Map<AttestationId, boolean>(allIdEntries);\n","/**\n * Error thrown when interacting with the registry contract fails.\n *\n * @param message - description of the registry contract failure.\n */\nexport class RegistryContractError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'RegistryContractError';\n  }\n}\n","/**\n * Error thrown when calls to the verifier contract fail.\n *\n * @param message - description of the verifier contract failure.\n */\nexport class VerifierContractError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'VerifierContractError';\n  }\n}\n","/**\n * Error thrown when proof generation or verification fails.\n *\n * @param message - description of the proof failure.\n */\nexport class ProofError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'ProofError';\n  }\n}\n","export enum ConfigMismatch {\n  InvalidId = 'InvalidId',\n  InvalidUserContextHash = 'InvalidUserContextHash',\n  InvalidScope = 'InvalidScope',\n  InvalidRoot = 'InvalidRoot',\n  InvalidAttestationId = 'InvalidAttestationId',\n  InvalidForbiddenCountriesList = 'InvalidForbiddenCountriesList',\n  InvalidMinimumAge = 'InvalidMinimumAge',\n  InvalidTimestamp = 'InvalidTimestamp',\n  InvalidOfac = 'InvalidOfac',\n  ConfigNotFound = 'ConfigNotFound',\n}\n\nexport class ConfigMismatchError extends Error {\n  public readonly issues: Array<{ type: ConfigMismatch; message: string }>;\n\n  constructor(issues: Array<{ type: ConfigMismatch; message: string }>) {\n    const message = issues.map((issue) => `[${issue.type}]: ${issue.message}`).join('\\n');\n    super(message);\n    this.name = 'ConfigMismatchError';\n    this.issues = issues;\n\n    Object.setPrototypeOf(this, ConfigMismatchError.prototype);\n  }\n\n  static single(type: ConfigMismatch, message: string): ConfigMismatchError {\n    return new ConfigMismatchError([{ type, message }]);\n  }\n}\n\nexport { RegistryContractError } from './RegistryContractError.js';\nexport { VerifierContractError } from './VerifierContractError.js';\nexport { ProofError } from './ProofError.js';\n","import { PublicSignals } from 'snarkjs';\nimport { discloseIndices } from './constants.js';\nimport { AttestationId } from 'src/types/types.js';\nimport { ProofError } from '../errors/index.js';\n\n/**\n * Returns the number of public signals containing revealed data for the specified attestation ID.\n *\n * Throws an error if the attestation ID is not supported.\n *\n * @param attestationId - The attestation ID for which to determine the number of revealed data public signals\n * @returns The number of public signals corresponding to revealed data\n */\nexport function getRevealedDataPublicSignalsLength(attestationId: AttestationId): number {\n  switch (attestationId) {\n    case 1:\n      return 93 / 31;\n    case 2:\n      return Math.ceil(94 / 31);\n    case 3:\n      return Math.ceil(119 / 31);\n    case 4:\n      return Math.ceil(298 / 31);\n    default:\n      throw new ProofError(`Invalid attestation ID: ${attestationId}`);\n  }\n}\n\nexport const bytesCount: Record<AttestationId, number[]> = {\n  1: [31, 31, 31],\n  2: [31, 31, 31, 1],\n  3: [31, 31, 31, 26],\n  4: [31, 31, 31, 31, 31, 31, 31, 31, 31, 19],\n};\n\n/**\n * Extracts and returns the revealed data bytes from the public signals for a given attestation ID.\n *\n * Iterates over the relevant public signals, unpacks each into its constituent bytes according to the attestation's byte structure, and accumulates all revealed bytes into a single array.\n *\n * @param attestationId - The attestation ID specifying the format of revealed data\n * @param publicSignals - The array of public signals containing packed revealed data\n * @returns An array of bytes representing the revealed data for the specified attestation\n */\nexport function getRevealedDataBytes(\n  attestationId: AttestationId,\n  publicSignals: PublicSignals\n): number[] {\n  let bytes: number[] = [];\n  for (let i = 0; i < getRevealedDataPublicSignalsLength(attestationId); i++) {\n    let publicSignal = BigInt(\n      publicSignals[discloseIndices[attestationId].revealedDataPackedIndex + i]\n    );\n    for (let j = 0; j < bytesCount[attestationId][i]; j++) {\n      bytes.push(Number(publicSignal & 0xffn));\n      publicSignal = publicSignal >> 8n;\n    }\n  }\n\n  return bytes;\n}\n","import { discloseIndices, revealedDataIndices } from './constants.js';\nimport { AttestationId, GenericDiscloseOutput } from 'src/types/types.js';\nimport { getRevealedDataBytes } from './proof.js';\n\n/**\n * Removes null bytes (\\x00) from a string\n * @param str - The string to clean\n * @returns The string with null bytes removed\n */\nexport const removeNullBytes = (str: string): string => {\n  return str.replace(/\\x00/g, '');\n};\n\nexport const formatRevealedDataPacked = (\n  attestationId: AttestationId,\n  publicSignals: string[]\n): GenericDiscloseOutput => {\n  const revealedDataPacked = getRevealedDataBytes(attestationId, publicSignals);\n  const revealedDataPackedString = Buffer.from(revealedDataPacked);\n\n  const nullifier = publicSignals[discloseIndices[attestationId].nullifierIndex];\n  const forbiddenCountriesListPacked = publicSignals.slice(\n    discloseIndices[attestationId].forbiddenCountriesListPackedIndex,\n    discloseIndices[attestationId].forbiddenCountriesListPackedIndex + 4\n  );\n  let issuingState = '';\n\n  if (attestationId === 4) {\n    issuingState = 'UNAVAILABLE';\n  } else {\n    issuingState = revealedDataPackedString\n      .subarray(\n        revealedDataIndices[attestationId].issuingStateStart,\n        revealedDataIndices[attestationId].issuingStateEnd + 1\n      )\n      .toString('utf-8');\n  }\n\n  const name = revealedDataPackedString\n    .subarray(\n      revealedDataIndices[attestationId].nameStart,\n      revealedDataIndices[attestationId].nameEnd + 1\n    )\n    .toString('utf-8')\n    .replace(/([A-Z])<+([A-Z])/g, '$1 $2')\n    .replace(/</g, '')\n    .trim();\n  const idNumber = revealedDataPackedString\n    .subarray(\n      revealedDataIndices[attestationId].idNumberStart,\n      revealedDataIndices[attestationId].idNumberEnd + 1\n    )\n    .toString('utf-8');\n\n  let nationality: string;\n  if (attestationId === 3) {\n    nationality = 'IND';\n  } else {\n    nationality = revealedDataPackedString\n      .subarray(\n        revealedDataIndices[attestationId].nationalityStart,\n        revealedDataIndices[attestationId].nationalityEnd + 1\n      )\n      .toString('utf-8');\n  }\n  let dateOfBirth: string;\n  if (attestationId === 3) {\n    dateOfBirth = new Array(\n      revealedDataPackedString.subarray(\n        revealedDataIndices[attestationId].dateOfBirthStart,\n        revealedDataIndices[attestationId].dateOfBirthEnd + 1\n      )\n    )\n      .map(Number)\n      .map(String)\n      .join('');\n  } else {\n    dateOfBirth = revealedDataPackedString\n      .subarray(\n        revealedDataIndices[attestationId].dateOfBirthStart,\n        revealedDataIndices[attestationId].dateOfBirthEnd + 1\n      )\n      .toString('utf-8');\n  }\n  const gender = revealedDataPackedString\n    .subarray(\n      revealedDataIndices[attestationId].genderStart,\n      revealedDataIndices[attestationId].genderEnd + 1\n    )\n    .toString('utf-8');\n  let expiryDate: string;\n  if (attestationId === 3) {\n    expiryDate = 'UNAVAILABLE';\n  } else {\n    expiryDate = revealedDataPackedString\n      .subarray(\n        revealedDataIndices[attestationId].expiryDateStart,\n        revealedDataIndices[attestationId].expiryDateEnd + 1\n      )\n      .toString('utf-8');\n  }\n  let olderThan: string;\n  if (attestationId === 3 || attestationId === 4) {\n    olderThan = revealedDataPackedString\n      .subarray(\n        revealedDataIndices[attestationId].olderThanStart,\n        revealedDataIndices[attestationId].olderThanEnd + 1\n      )[0]\n      .toString()\n      .padStart(2, '0');\n  } else {\n    olderThan = revealedDataPackedString\n      .subarray(\n        revealedDataIndices[attestationId].olderThanStart,\n        revealedDataIndices[attestationId].olderThanEnd + 1\n      )\n      .toString('utf-8');\n  }\n  const ofac = Array.from(\n    revealedDataPackedString.subarray(\n      revealedDataIndices[attestationId].ofacStart,\n      revealedDataIndices[attestationId].ofacEnd + 1\n    )\n  )\n    .map(Boolean)\n    .map((x) => !x);\n\n  if (ofac.length < 3) {\n    ofac.unshift(false);\n  }\n\n  return {\n    nullifier: nullifier.toString(),\n    forbiddenCountriesListPacked: forbiddenCountriesListPacked,\n    issuingState: removeNullBytes(issuingState),\n    name: removeNullBytes(name),\n    idNumber: idNumber,\n    nationality: nationality,\n    dateOfBirth: dateOfBirth,\n    gender: gender,\n    expiryDate: expiryDate,\n    minimumAge: olderThan,\n    ofac: ofac,\n  };\n};\n","import { ethers } from 'ethers';\n\n/**\n * Generates a deterministic user identifier hash from the provided context data.\n *\n * The function computes a SHA-256 hash of the input buffer, then applies a RIPEMD-160 hash to the result. The final output is a hexadecimal string, left-padded with zeros to 40 characters and prefixed with \"0x\".\n *\n * @param userContextData - The buffer containing user context data to hash\n * @returns A 40-character hexadecimal user identifier string prefixed with \"0x\"\n */\nexport function calculateUserIdentifierHash(userContextData: Buffer): string {\n  const sha256Hash = ethers.sha256(userContextData);\n  const ripemdHash = ethers.ripemd160(sha256Hash);\n  return ripemdHash.toString().padStart(40, '0');\n}\n","import { unpackReveal } from '@selfxyz/common/utils/circuits/formatOutputs';\n\nfunction trimu0000(unpackedReveal: string[]): string[] {\n  return unpackedReveal.filter((value) => value !== '\\u0000');\n}\n\n/**\n * Unpacks a list of packed forbidden country codes into an array of 3-character country codes.\n *\n * @param forbiddenCountriesList_packed - An array of packed strings representing forbidden countries.\n * @returns An array of 3-character country codes extracted from the packed input.\n */\nexport function unpackForbiddenCountriesList(forbiddenCountriesList_packed: string[]) {\n  const trimmed = trimu0000(unpackReveal(forbiddenCountriesList_packed, 'id'));\n  const countries = [];\n  for (let i = 0; i < trimmed.length; i += 3) {\n    const countryCode = trimmed.slice(i, i + 3).join('');\n    if (countryCode.length === 3) {\n      countries.push(countryCode);\n    }\n  }\n  return countries;\n}\n","import { VerificationConfig } from 'src/types/types.js';\nimport { IConfigStorage } from './interface.js';\n\nexport class DefaultConfigStore implements IConfigStorage {\n  constructor(private config: VerificationConfig) {}\n\n  async getConfig(_id: string): Promise<VerificationConfig> {\n    return this.config;\n  }\n\n  async setConfig(_id: string, config: VerificationConfig): Promise<boolean> {\n    this.config = config;\n    return true;\n  }\n\n  async getActionId(_userIdentifier: string, _data: string): Promise<string> {\n    return 'random-id';\n  }\n}\n","import { VerificationConfig } from 'src/types/types.js';\nimport { IConfigStorage } from './interface.js';\n\nexport class InMemoryConfigStore implements IConfigStorage {\n  private configs: Map<string, VerificationConfig> = new Map();\n  private getActionIdFunc: IConfigStorage['getActionId'];\n\n  constructor(getActionIdFunc: IConfigStorage['getActionId']) {\n    this.getActionIdFunc = getActionIdFunc;\n  }\n\n  async getActionId(userIdentifier: string, userDefinedData: string): Promise<string> {\n    return this.getActionIdFunc(userIdentifier, userDefinedData);\n  }\n\n  async setConfig(configId: string, config: VerificationConfig): Promise<boolean> {\n    const existed = this.configs.has(configId);\n    this.configs.set(configId, config);\n    return !existed;\n  }\n\n  async getConfig(configId: string): Promise<VerificationConfig> {\n    return this.configs.get(configId);\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,iBAAuB;AACvB,mBAAsC;;;ACGtC,oBAAyD;AAMzD,IAAM,OAAO;AAAA,EACX;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;AAEO,IAAM,2BAAN,MAA+B;AAAA,EAEpC,OAAO,kBAA4C;AACjD,WAAO,IAAI,wBAAU,IAAI;AAAA,EAC3B;AAAA,EACA,OAAO,QACL,SACA,QACiB;AACjB,WAAO,IAAI,uBAAS,SAAS,MAAM,MAAM;AAAA,EAC3C;AACF;AAXa,yBACK,MAAM;;;AC5CxB,IAAAC,iBAAyD;AAMzD,IAAMC,QAAO;AAAA,EACX;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;AAEO,IAAM,uCAAN,MAA2C;AAAA,EAEhD,OAAO,kBAAwD;AAC7D,WAAO,IAAI,yBAAUA,KAAI;AAAA,EAC3B;AAAA,EACA,OAAO,QACL,SACA,QAC6B;AAC7B,WAAO,IAAI;AAAA,MACT;AAAA,MACAA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAfa,qCACK,MAAMA;;;AChDxB,IAAAC,iBAAyD;AAGzD,IAAMC,QAAO;AAAA,EACX;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAEhC,OAAO,kBAAwC;AAC7C,WAAO,IAAI,yBAAUA,KAAI;AAAA,EAC3B;AAAA,EACA,OAAO,QAAQ,SAAiB,QAA6C;AAC3E,WAAO,IAAI,wBAAS,SAASA,OAAM,MAAM;AAAA,EAC3C;AACF;AARa,qBACK,MAAMA;;;ACzCxB,IAAAC,iBAAyD;AAGzD,IAAMC,QAAO;AAAA,EACX;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAE7B,OAAO,kBAAqC;AAC1C,WAAO,IAAI,yBAAUA,KAAI;AAAA,EAC3B;AAAA,EACA,OAAO,QAAQ,SAAiB,QAA0C;AACxE,WAAO,IAAI,wBAAS,SAASA,OAAM,MAAM;AAAA,EAC3C;AACF;AARa,kBACK,MAAMA;;;AC1BxB,IAAAC,iBAAyD;AAGzD,IAAMC,QAAO;AAAA,EACX;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EAE7B,OAAO,kBAAqC;AAC1C,WAAO,IAAI,yBAAUA,KAAI;AAAA,EAC3B;AAAA,EACA,OAAO,QAAQ,SAAiB,QAA0C;AACxE,WAAO,IAAI,wBAAS,SAASA,OAAM,MAAM;AAAA,EAC3C;AACF;AARa,kBACK,MAAMA;;;AC3CjB,IAAM,iBAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,kBAAkB;AACpB;AAEO,IAAM,kBAAkB;AAAA,EAC7B,GAAG;AAAA,IACD,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,EAC1B;AAAA,EACA,GAAG;AAAA,IACD,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,EAC1B;AAAA,EACA,GAAG;AAAA,IACD,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,EAC1B;AAAA;AAAA,EAEA,GAAG;AAAA,IACD,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,wBAAwB;AAAA,EAC1B;AACF;AAaO,IAAM,sBAGT;AAAA,EACF,GAAG;AAAA,IACD,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,GAAG;AAAA,IACD,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,GAAG;AAAA,IACD,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAAA,EACA,GAAG;AAAA,IACD,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AACF;AAEA,IAAM,eAAe,OAAO,KAAK,eAAe,EAAE;AAAA,EAChD,CAAC,OAAO,CAAC,OAAO,EAAE,GAAoB,IAAI;AAC5C;AACO,IAAM,SAAS,IAAI,IAA4B,YAAY;;;AChK3D,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACLO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACVO,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gBAAA,eAAY;AACZ,EAAAA,gBAAA,4BAAyB;AACzB,EAAAA,gBAAA,kBAAe;AACf,EAAAA,gBAAA,iBAAc;AACd,EAAAA,gBAAA,0BAAuB;AACvB,EAAAA,gBAAA,mCAAgC;AAChC,EAAAA,gBAAA,uBAAoB;AACpB,EAAAA,gBAAA,sBAAmB;AACnB,EAAAA,gBAAA,iBAAc;AACd,EAAAA,gBAAA,oBAAiB;AAVP,SAAAA;AAAA,GAAA;AAaL,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAG7C,YAAY,QAA0D;AACpE,UAAM,UAAU,OAAO,IAAI,CAAC,UAAU,IAAI,MAAM,IAAI,MAAM,MAAM,OAAO,EAAE,EAAE,KAAK,IAAI;AACpF,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AAEd,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AAAA,EAEA,OAAO,OAAO,MAAsB,SAAsC;AACxE,WAAO,IAAI,qBAAoB,CAAC,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA,EACpD;AACF;;;ACfO,SAAS,mCAAmC,eAAsC;AACvF,UAAQ,eAAe;AAAA,IACrB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK,KAAK,KAAK,EAAE;AAAA,IAC1B,KAAK;AACH,aAAO,KAAK,KAAK,MAAM,EAAE;AAAA,IAC3B,KAAK;AACH,aAAO,KAAK,KAAK,MAAM,EAAE;AAAA,IAC3B;AACE,YAAM,IAAI,WAAW,2BAA2B,aAAa,EAAE;AAAA,EACnE;AACF;AAEO,IAAM,aAA8C;AAAA,EACzD,GAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EACd,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,EACjB,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,EAClB,GAAG,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAC5C;AAWO,SAAS,qBACd,eACA,eACU;AACV,MAAI,QAAkB,CAAC;AACvB,WAAS,IAAI,GAAG,IAAI,mCAAmC,aAAa,GAAG,KAAK;AAC1E,QAAI,eAAe;AAAA,MACjB,cAAc,gBAAgB,aAAa,EAAE,0BAA0B,CAAC;AAAA,IAC1E;AACA,aAAS,IAAI,GAAG,IAAI,WAAW,aAAa,EAAE,CAAC,GAAG,KAAK;AACrD,YAAM,KAAK,OAAO,eAAe,KAAK,CAAC;AACvC,qBAAe,gBAAgB;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;;;ACnDO,IAAM,kBAAkB,CAAC,QAAwB;AACtD,SAAO,IAAI,QAAQ,SAAS,EAAE;AAChC;AAEO,IAAM,2BAA2B,CACtC,eACA,kBAC0B;AAC1B,QAAM,qBAAqB,qBAAqB,eAAe,aAAa;AAC5E,QAAM,2BAA2B,OAAO,KAAK,kBAAkB;AAE/D,QAAM,YAAY,cAAc,gBAAgB,aAAa,EAAE,cAAc;AAC7E,QAAM,+BAA+B,cAAc;AAAA,IACjD,gBAAgB,aAAa,EAAE;AAAA,IAC/B,gBAAgB,aAAa,EAAE,oCAAoC;AAAA,EACrE;AACA,MAAI,eAAe;AAEnB,MAAI,kBAAkB,GAAG;AACvB,mBAAe;AAAA,EACjB,OAAO;AACL,mBAAe,yBACZ;AAAA,MACC,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,kBAAkB;AAAA,IACvD,EACC,SAAS,OAAO;AAAA,EACrB;AAEA,QAAM,OAAO,yBACV;AAAA,IACC,oBAAoB,aAAa,EAAE;AAAA,IACnC,oBAAoB,aAAa,EAAE,UAAU;AAAA,EAC/C,EACC,SAAS,OAAO,EAChB,QAAQ,qBAAqB,OAAO,EACpC,QAAQ,MAAM,EAAE,EAChB,KAAK;AACR,QAAM,WAAW,yBACd;AAAA,IACC,oBAAoB,aAAa,EAAE;AAAA,IACnC,oBAAoB,aAAa,EAAE,cAAc;AAAA,EACnD,EACC,SAAS,OAAO;AAEnB,MAAI;AACJ,MAAI,kBAAkB,GAAG;AACvB,kBAAc;AAAA,EAChB,OAAO;AACL,kBAAc,yBACX;AAAA,MACC,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,iBAAiB;AAAA,IACtD,EACC,SAAS,OAAO;AAAA,EACrB;AACA,MAAI;AACJ,MAAI,kBAAkB,GAAG;AACvB,kBAAc,IAAI;AAAA,MAChB,yBAAyB;AAAA,QACvB,oBAAoB,aAAa,EAAE;AAAA,QACnC,oBAAoB,aAAa,EAAE,iBAAiB;AAAA,MACtD;AAAA,IACF,EACG,IAAI,MAAM,EACV,IAAI,MAAM,EACV,KAAK,EAAE;AAAA,EACZ,OAAO;AACL,kBAAc,yBACX;AAAA,MACC,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,iBAAiB;AAAA,IACtD,EACC,SAAS,OAAO;AAAA,EACrB;AACA,QAAM,SAAS,yBACZ;AAAA,IACC,oBAAoB,aAAa,EAAE;AAAA,IACnC,oBAAoB,aAAa,EAAE,YAAY;AAAA,EACjD,EACC,SAAS,OAAO;AACnB,MAAI;AACJ,MAAI,kBAAkB,GAAG;AACvB,iBAAa;AAAA,EACf,OAAO;AACL,iBAAa,yBACV;AAAA,MACC,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,gBAAgB;AAAA,IACrD,EACC,SAAS,OAAO;AAAA,EACrB;AACA,MAAI;AACJ,MAAI,kBAAkB,KAAK,kBAAkB,GAAG;AAC9C,gBAAY,yBACT;AAAA,MACC,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,eAAe;AAAA,IACpD,EAAE,CAAC,EACF,SAAS,EACT,SAAS,GAAG,GAAG;AAAA,EACpB,OAAO;AACL,gBAAY,yBACT;AAAA,MACC,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,eAAe;AAAA,IACpD,EACC,SAAS,OAAO;AAAA,EACrB;AACA,QAAM,OAAO,MAAM;AAAA,IACjB,yBAAyB;AAAA,MACvB,oBAAoB,aAAa,EAAE;AAAA,MACnC,oBAAoB,aAAa,EAAE,UAAU;AAAA,IAC/C;AAAA,EACF,EACG,IAAI,OAAO,EACX,IAAI,CAAC,MAAM,CAAC,CAAC;AAEhB,MAAI,KAAK,SAAS,GAAG;AACnB,SAAK,QAAQ,KAAK;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,WAAW,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA,cAAc,gBAAgB,YAAY;AAAA,IAC1C,MAAM,gBAAgB,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EACF;AACF;;;AChJA,IAAAC,iBAAuB;AAUhB,SAAS,4BAA4B,iBAAiC;AAC3E,QAAM,aAAa,sBAAO,OAAO,eAAe;AAChD,QAAM,aAAa,sBAAO,UAAU,UAAU;AAC9C,SAAO,WAAW,SAAS,EAAE,SAAS,IAAI,GAAG;AAC/C;;;AbIA,kBAAiD;;;AclBjD,2BAA6B;AAE7B,SAAS,UAAU,gBAAoC;AACrD,SAAO,eAAe,OAAO,CAAC,UAAU,UAAU,IAAQ;AAC5D;AAQO,SAAS,6BAA6B,+BAAyC;AACpF,QAAM,UAAU,cAAU,mCAAa,+BAA+B,IAAI,CAAC;AAC3E,QAAMC,aAAY,CAAC;AACnB,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,UAAM,cAAc,QAAQ,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE;AACnD,QAAI,YAAY,WAAW,GAAG;AAC5B,MAAAA,WAAU,KAAK,WAAW;AAAA,IAC5B;AAAA,EACF;AACA,SAAOA;AACT;;;AdOA,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAE7B,IAAM,oCAAoC;AAC1C,IAAM,4CAA4C;AAE3C,IAAM,sBAAN,MAA0B;AAAA,EAQ/B,YACE,OACA,UACA,eAAwB,OACxB,YACA,eACA,oBACA;AACA,UAAM,SAAS,eAAe,uBAAuB;AACrD,UAAM,WAAW,IAAI,sBAAO,gBAAgB,MAAM;AAClD,UAAM,iCAAiC,eACnC,4CACA;AACJ,SAAK,kCAAkC,qCAAqC;AAAA,MAC1E;AAAA,MACA;AAAA,IACF;AACA,SAAK,WAAW;AAChB,SAAK,YAAQ,oCAAsB,UAAU,KAAK;AAClD,SAAK,aAAa;AAClB,SAAK,gBAAgB;AACrB,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,MAAa,OACX,eACA,OACA,YACA,iBACA;AAEA,UAAM,YAAY,KAAK,WAAW,IAAI,aAAa;AACnD,QAAI,SAA2D,CAAC;AAChE,QAAI,CAAC,WAAW;AACd,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS,8CAA8C;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,UAAM,gBAAgB,WACnB,IAAI,MAAM,EACV,IAAI,CAAC,MAAO,SAAS,KAAK,CAAC,KAAK,EAAE,SAAS,IAAI,OAAO,IAAI,CAAE;AAE/D,UAAM,2BAA2B;AAAA,MAC/B,cAAc,gBAAgB,aAAa,EAAE,mBAAmB;AAAA,IAClE;AACA,UAAM,kBAAkB;AAAA,MACtB,4BAA4B,OAAO,KAAK,iBAAiB,KAAK,CAAC;AAAA,IACjE;AAEA,QAAI,6BAA6B,iBAAiB;AAChD,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SACE,4EACA,2BACA,0BACA;AAAA,MACJ,CAAC;AAAA,IACH;AAGA,UAAM,eAAe,KAAK,UAAU,cAAc,gBAAgB,aAAa,EAAE,UAAU;AAC3F,QAAI,CAAC,cAAc;AACjB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SACE,gEACA,cAAc,gBAAgB,aAAa,EAAE,UAAU,IACvD,cACA,KAAK;AAAA,MACT,CAAC;AAAA,IACH;AAGA,QAAI;AACF,YAAM,kBAAkB,MAAM,KAAK,gCAAgC;AAAA,QACjE,OAAO,cAAc,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,MACpD;AACA,UAAI,oBAAoB,8CAA8C;AACpE,cAAM,IAAI,sBAAsB,6BAA6B;AAAA,MAC/D;AACA,YAAM,mBAAmB,kBAAkB,QAAQ,iBAAiB,KAAK,QAAQ;AACjF,YAAM,cAAc,MAAM,iBAAiB;AAAA,QACzC,cAAc,gBAAgB,aAAa,EAAE,eAAe;AAAA,MAC9D;AACA,UAAI,CAAC,aAAa;AAChB,eAAO,KAAK;AAAA,UACV;AAAA,UACA,SACE,4CACA,cAAc,gBAAgB,aAAa,EAAE,eAAe;AAAA,QAChE,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,sBAAsB,6BAA6B;AAAA,IAC/D;AAGA,UAAM,uBACJ,cAAc,SAAS,MAAM,cAAc,gBAAgB,aAAa,EAAE,kBAAkB;AAC9F,QAAI,CAAC,sBAAsB;AACzB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,qBAAiB;AAAA,MACrB,OAAO,OAAO,gBAAgB,MAAM,IAAI,GAAG,CAAC;AAAA,MAC5C,KAAK;AAAA,IACP;AACA,UAAM,kBAAkB,gBAAgB,MAAM,GAAG;AACjD,UAAM,WAAW,MAAM,KAAK,cAAc,YAAY,gBAAgB,eAAe;AACrF,QAAI,CAAC,UAAU;AACb,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI;AACJ,QAAI;AACF,2BAAqB,MAAM,KAAK,cAAc,UAAU,QAAQ;AAAA,IAClE,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS,wBAAwB,QAAQ;AAAA,MAC3C,CAAC;AAAA,IACH,UAAE;AACA,UAAI,CAAC,oBAAoB;AACvB,eAAO,KAAK;AAAA,UACV;AAAA,UACA,SAAS,wBAAwB,QAAQ;AAAA,QAC3C,CAAC;AACD,cAAM,IAAI,oBAAoB,MAAM;AAAA,MACtC;AAAA,IACF;AAGA,UAAM,yBAAmC;AAAA,MACvC,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,QACX,CAAC,MAAM,cAAc,gBAAgB,aAAa,EAAE,oCAAoC,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,UAAM,2CAA2C,mBAAmB,qBAAqB,CAAC;AAE1F,UAAM,8BAA8B,yCAAyC;AAAA,MAAM,CAAC,YAClF,uBAAuB,SAAS,OAA6B;AAAA,IAC/D;AACA,QAAI,CAAC,6BAA6B;AAChC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SACE,6FACA,uBAAuB,KAAK,IAAI,IAChC,eACA,yCAAyC,KAAK,IAAI;AAAA,MACtD,CAAC;AAAA,IACH;AAEA,UAAM,wBAAwB,yBAAyB,eAAe,aAAa;AAEnF,UAAM,oBACJ,mBAAmB,eAAe,SAC9B,mBAAmB,eAAe,OAAO,SAAS,sBAAsB,YAAY,EAAE,KACtF,sBAAsB,eAAe,OACrC;AACN,QAAI,CAAC,mBAAmB;AACtB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SACE,gFACA,sBAAsB,aACtB,eACA,mBAAmB;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,kBAAkB,GAAG;AACvB,2BAAqB,cAClB;AAAA,QACC,gBAAgB,aAAa,EAAE;AAAA,QAC/B,gBAAgB,aAAa,EAAE,mBAAmB;AAAA,MACpD,EACC,IAAI,MAAM;AACb,2BAAqB,cAClB;AAAA,QACC,gBAAgB,aAAa,EAAE,mBAAmB;AAAA,QAClD,gBAAgB,aAAa,EAAE,mBAAmB;AAAA,MACpD,EACC,IAAI,MAAM;AACb,2BAAqB,cAClB;AAAA,QACC,gBAAgB,aAAa,EAAE,mBAAmB;AAAA,QAClD,gBAAgB,aAAa,EAAE,mBAAmB;AAAA,MACpD,EACC,IAAI,MAAM;AAAA,IACf,WAAW,kBAAkB,GAAG;AAC9B,2BAAqB,OAAO,cAAc,gBAAgB,aAAa,EAAE,gBAAgB,CAAC,EACvF,MAAM,EAAE,EACR,IAAI,MAAM;AACb,2BAAqB;AAAA,QACnB,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,MACnE,EACG,MAAM,EAAE,EACR,IAAI,MAAM;AACb,2BAAqB;AAAA,QACnB,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,MACnE,EACG,MAAM,EAAE,EACR,IAAI,MAAM;AAAA,IACf,OAAO;AACL,2BAAqB;AAAA,QACnB;AAAA,QACA;AAAA,QACA,CAAC,cAAc,gBAAgB,aAAa,EAAE,gBAAgB;AAAA,QAC9D,CAAC,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,MACpE;AACA,2BAAqB;AAAA,QACnB,CAAC,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,QAClE,CAAC,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,MACpE;AACA,2BAAqB;AAAA,QACnB,CAAC,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,QAClE,CAAC,cAAc,gBAAgB,aAAa,EAAE,mBAAmB,CAAC;AAAA,MACpE;AAAA,IACF;AAEA,UAAM,mBAAmB,IAAI;AAAA,MAC3B,OAAO,mBAAmB,KAAK,EAAE,CAAC;AAAA,MAClC,OAAO,mBAAmB,KAAK,EAAE,CAAC,IAAI;AAAA,MACtC,OAAO,mBAAmB,KAAK,EAAE,CAAC;AAAA,IACpC;AACA,UAAM,mBAAmB,oBAAI,KAAK;AAGlC,UAAM,cAAc,IAAI,KAAK,iBAAiB,QAAQ,IAAI,KAAK,KAAK,KAAK,GAAI;AAC7E,QAAI,mBAAmB,aAAa;AAClC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,UAAM,sBAAsB,IAAI;AAAA,MAC9B,iBAAiB,QAAQ,IAAI,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK;AAAA,IACzE;AACA,UAAM,YAAY,IAAI,KAAK,iBAAiB,QAAQ,IAAI,KAAK,KAAK,KAAK,GAAI;AAC3E,QAAI,sBAAsB,WAAW;AACnC,aAAO,KAAK;AAAA,QACV;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,IAAI,oBAAoB,MAAM;AAAA,IACtC;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,kBAAkB,MAAM,KAAK,gCAAgC;AAAA,QACjE,OAAO,cAAc,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAAA,MACpD;AACA,UAAI,oBAAoB,8CAA8C;AACpE,cAAM,IAAI,sBAAsB,6BAA6B;AAAA,MAC/D;AACA,UAAI,kBAAkB,GAAG;AACvB,2BAAmB,qBAAqB,QAAQ,iBAAiB,KAAK,QAAQ;AAAA,MAChF,WAAW,kBAAkB,GAAG;AAC9B,2BAAmB,yBAAyB,QAAQ,iBAAiB,KAAK,QAAQ;AAAA,MACpF,OAAO;AACL,2BAAmB,kBAAkB,QAAQ,iBAAiB,KAAK,QAAQ;AAAA,MAC7E;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,sBAAsB,6BAA6B;AAAA,IAC/D;AAEA,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,MAAM,iBAAiB;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,UACE,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAAA,UAC7B,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAAA,QAC/B;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,gBAAU;AAAA,IACZ;AAEA,UAAM,iBAAiB,sBAAsB,KAAK,OAAO,CAAC,KAAK,SAAS,OAAO,MAAM,KAAK;AAE1F,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB;AAAA,QACd;AAAA,QACA,mBACE,mBAAmB,eAAe,SAC9B,mBAAmB,cAAc,OAAO,SAAS,sBAAsB,YAAY,EAAE,IACrF;AAAA,QACN;AAAA;AAAA,UAEE,mBAAmB,SAAS,UAAa,mBAAmB,OAAO,iBAAiB;AAAA;AAAA,MACxF;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,UAAU;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AD3WA,IAAAC,oBAA6B;AAC7B,qBAAiC;AACjC,uBAA0B;;;AgBAnB,IAAM,qBAAN,MAAmD;AAAA,EACxD,YAAoB,QAA4B;AAA5B;AAAA,EAA6B;AAAA,EAEjD,MAAM,UAAU,KAA0C;AACxD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,UAAU,KAAa,QAA8C;AACzE,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,iBAAyB,OAAgC;AACzE,WAAO;AAAA,EACT;AACF;;;ACfO,IAAM,sBAAN,MAAoD;AAAA,EAIzD,YAAY,iBAAgD;AAH5D,SAAQ,UAA2C,oBAAI,IAAI;AAIzD,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAM,YAAY,gBAAwB,iBAA0C;AAClF,WAAO,KAAK,gBAAgB,gBAAgB,eAAe;AAAA,EAC7D;AAAA,EAEA,MAAM,UAAU,UAAkB,QAA8C;AAC9E,UAAM,UAAU,KAAK,QAAQ,IAAI,QAAQ;AACzC,SAAK,QAAQ,IAAI,UAAU,MAAM;AACjC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,UAAU,UAA+C;AAC7D,WAAO,KAAK,QAAQ,IAAI,QAAQ;AAAA,EAClC;AACF;","names":["import_ethers","import_ethers","_abi","import_ethers","_abi","import_ethers","_abi","import_ethers","_abi","ConfigMismatch","import_ethers","countries","import_constants"]}