{"version":3,"sources":["../src/index.ts","../src/libs.ts","../src/tsUtils.ts","../src/constants.ts","../src/utils/address/index.ts","../src/utils/address/constants.ts","../src/utils/address/imports.ts","../src/utils/address/stringUtils.ts","../src/utils/address/ethereum.ts","../src/utils/address/substrate.ts","../src/utils/address/crossAccountId.ts","../src/utils/index.ts","../src/ethereum/extensionTools.ts","../src/ethereum/index.ts","../src/substrate/extrinsicTools.ts","../src/utils/errors.ts","../src/substrate/extensionTools.ts","../src/substrate/signerTools.ts","../src/substrate/extrinsics/AbstractExtrinsic.ts","../src/substrate/extrinsics/common/ExtrinsicTransferCoins.ts","../src/coin/index.ts","../src/coin/coin.ts","../src/substrate/SubstrateCommon.ts","../src/substrate/extrinsics/unique/ExtrinsicCreateCollection.ts","../src/substrate/extrinsics/unique/ExtrinsicAddCollectionAdmin.ts","../src/substrate/extrinsics/unique/ExtrinsicRemoveCollectionAdmin.ts","../src/substrate/extrinsics/unique/ExtrinsicSetCollectionSponsor.ts","../src/substrate/extrinsics/unique/ExtrinsicConfirmSponsorship.ts","../src/substrate/extrinsics/unique/ExtrinsicChangeCollectionOwner.ts","../src/substrate/extrinsics/unique/ExtrinsicRemoveCollectionSponsor.ts","../src/substrate/extrinsics/unique/ExtrinsicRemoveFromAllowList.ts","../src/substrate/extrinsics/unique/ExtrinsicAddToAllowList.ts","../src/substrate/extrinsics/unique/utils.ts","../src/substrate/extrinsics/unique/ExtrinsicCreateNftToken.ts","../src/substrate/extrinsics/unique/ExtrinsicCreateMultipleNftTokens.ts","../src/schema/types.ts","../src/schema/tools/validators/index.ts","../src/utils/semver.ts","../src/schema/tools/validators/constants.ts","../src/schema/tools/validators/common-validators.ts","../src/schema/tools/validators/collection-validators.ts","../src/schema/tools/validators/token-validators.ts","../src/schema/tools/collection.ts","../src/schema/schemaUtils.ts","../src/schema/tools/token.ts","../src/schema/tools/oldSchemaDecoder.ts","../src/schema/tools/universal.ts","../src/schema/index.ts","../src/substrate/SubstrateUnique.ts","../src/substrate/index.ts"],"sourcesContent":["import '@unique-nft/unique-mainnet-types/augment-api'\r\n\r\nimport * as libs from './libs'\r\nexport {libs}\r\nexport const init = libs.init\r\n\r\nexport * from './types'\r\n\r\nexport * as constants from './constants'\r\nexport {WS_RPC} from './constants'\r\n\r\nexport {UniqueUtils} from './utils'\r\n\r\nexport * from './ethereum'\r\nexport * from './substrate'\r\nexport {SchemaTools} from './schema'\r\nexport * from './schema/types'\r\n\r\nexport * as coins from './coin'\r\nexport type {Coin} from './coin'\r\nexport {SubstrateMethodsParams} from './substrate/extrinsics/types'\r\n","import type * as PolkadotApiObjType from '@polkadot/api'\r\nimport type * as PolkadotKeyringObjType from '@polkadot/keyring'\r\nimport type * as PolkadotUtilCryptoObjType from '@polkadot/util-crypto'\r\nimport type * as PolkadotExtensionDappType from '@polkadot/extension-dapp'\r\nimport type * as EthersType from 'ethers'\r\n\r\nimport {unique as opalRpcDefinitions} from '@unique-nft/opal-testnet-types/definitions'\r\nimport {unique as quartzRpcDefinitions} from '@unique-nft/quartz-mainnet-types/definitions'\r\nimport {unique as uniqueRpcDefinitions} from '@unique-nft/unique-mainnet-types/definitions'\r\nimport {getKeys} from './tsUtils'\r\n\r\ntype PolkadotApi = typeof PolkadotApiObjType\r\ntype PolkadotKeyring = typeof PolkadotKeyringObjType\r\ntype PolkadotUtilCrypto = typeof PolkadotUtilCryptoObjType\r\ntype PolkadotExtensionDapp = typeof PolkadotExtensionDappType\r\ntype Ethers = typeof EthersType\r\n\r\nexport const rpcDefinitions = {\r\n  opal: opalRpcDefinitions.rpc,\r\n  quartz: quartzRpcDefinitions.rpc,\r\n  unique: uniqueRpcDefinitions.rpc\r\n}\r\n\r\ninterface Libs {\r\n  ethers: Ethers | null\r\n  api: PolkadotApi | null\r\n  keyring: PolkadotKeyring | null\r\n  utilCrypto: PolkadotUtilCrypto | null\r\n  extensionDapp: PolkadotExtensionDapp | null\r\n}\r\n\r\nconst libs: Libs = {\r\n  ethers: null,\r\n  api: null,\r\n  keyring: null,\r\n  utilCrypto: null,\r\n  extensionDapp: null,\r\n}\r\n\r\nexport interface InitOptions {\r\n  initLibs?: { [k in keyof Omit<Libs, 'ethers'>]: boolean }\r\n  connectToPolkadotExtensionsAs?: string\r\n}\r\n\r\nconst defaultInitOptions: InitOptions = {}\r\n\r\nexport async function init(options: InitOptions = defaultInitOptions) {\r\n  const inBrowser = typeof window !== 'undefined'\r\n\r\n  const libRequest = options.initLibs\r\n\r\n  const tmpLibs: Libs = getKeys(libs)\r\n    .reduce((acc, key) => {\r\n      acc[key] = null;\r\n      return acc;\r\n    }, {} as Libs)\r\n\r\n  ;[\r\n    tmpLibs.ethers,\r\n    tmpLibs.api,\r\n    tmpLibs.keyring,\r\n    tmpLibs.utilCrypto,\r\n    tmpLibs.extensionDapp\r\n  ] = await Promise.all([\r\n    import('ethers'),\r\n    libRequest && !libRequest?.api ? null : import('@polkadot/api'),\r\n    libRequest && !libRequest?.keyring ? null : import('@polkadot/keyring'),\r\n    libRequest && !libRequest?.utilCrypto ? null : import('@polkadot/util-crypto'),\r\n    !inBrowser || (libRequest && !libRequest?.extensionDapp) ? null : import('@polkadot/extension-dapp'),\r\n  ])\r\n\r\n  // if (tmp) {\r\n  //   //@ts-ignore\r\n  //   globalThis.Web3 = Web3 = tmpWeb3.default ? tmpWeb3.default : tmpWeb3\r\n  // }\r\n\r\n  for (const key of getKeys(tmpLibs)) {\r\n    //@ts-ignore\r\n    if (tmpLibs[key]) libs[key] = tmpLibs[key]\r\n  }\r\n\r\n  if (libs.extensionDapp && options.connectToPolkadotExtensionsAs && libs.extensionDapp.isWeb3Injected) {\r\n    await libs.extensionDapp.web3Enable(options.connectToPolkadotExtensionsAs)\r\n  }\r\n}\r\n\r\n\r\nconst checkModuleExists = <T>(moduleVar: T | null, moduleName: string): T => {\r\n  if (!moduleVar) {\r\n    throw new Error(`No ${moduleName} found. Please call \\`init()\\` first.`);\r\n  }\r\n  return moduleVar\r\n}\r\n\r\nexport function getPolkadotApi() {\r\n  return checkModuleExists(libs.api, `@polkadot/api`)\r\n}\r\n\r\nexport function getEthers(): Ethers {\r\n  return checkModuleExists(libs.ethers, `ethers`)\r\n}\r\n\r\nexport function getPolkadotKeyring() {\r\n  return checkModuleExists(libs.keyring, `@polkadot/keyring`)\r\n}\r\n\r\nexport function getPolkadotUtilCrypto() {\r\n  return checkModuleExists(libs.utilCrypto, `@polkadot/util-crypto`)\r\n}\r\n\r\nexport function getPolkadotExtensionDapp() {\r\n  return checkModuleExists(libs.extensionDapp, `@polkadot/extension-dapp`)\r\n}\r\n","export const getKeys = <T extends Object>(o: T) => Object.keys(o) as Array<keyof T>\r\nexport const getValues = <T extends Object>(o: T) => Object.values(o) as Array<T[keyof T]>\r\nexport const getEntries = <T extends Object>(o: T) => Object.entries(o) as Array<[keyof T, T[keyof T]]>\r\n\r\nexport type Writeable<T> = { -readonly [P in keyof T]: T[P] };\r\n\r\ntype EnumBaseType = Record<string,  number | string>\r\n\r\nexport const getEnumKeys = <T extends EnumBaseType>(en: T): Array<keyof T> => {\r\n  const arr = getValues(en)\r\n  return arr.slice(0, arr.length / 2) as any as Array<keyof T>\r\n}\r\nexport const getEnumValues = <T extends EnumBaseType>(en: T): Array<T[keyof T]> => {\r\n  const arr = getValues(en)\r\n  return arr.slice(arr.length / 2)\r\n}\r\n\r\ntype EnumReverse<T extends EnumBaseType> = {[K in T[keyof T]]: keyof T}\r\nexport const getReversedEnum = <T extends EnumBaseType>(en: T): EnumReverse<T> => {\r\n  const arr = getValues(en)\r\n  const result = {} as any\r\n  for (let i = 0; i < arr.length/2; i++) {\r\n    result[arr[i + arr.length/2]] = arr[i]\r\n  }\r\n  return result\r\n}\r\n\r\nexport const safeJSONParse = <T>(str: string): T | string => {\r\n  try {\r\n    return JSON.parse(str) as T\r\n  } catch {\r\n    return str\r\n  }\r\n}\r\n","export const NESTING_PREFIX = '0xf8238ccfff8ed887463fd5e0'\r\nexport const COLLECTION_ADDRESS_PREFIX = '0x17c4e6453cc49aaaaeaca894e6d9683e'\r\n\r\nexport const WS_RPC = {\r\n  unique: 'wss://eu-ws.unique.network',\r\n  quartz: 'wss://quartz.unique.network',\r\n  uniqueRC: 'wss://ws-rc.unique.network',\r\n  opal: 'wss://opal.unique.network',\r\n  polkadot: 'wss://rpc.polkadot.io',\r\n  kusama: 'wss://quartz.api.onfinality.io/public-ws',\r\n}\r\n","import {COLLECTION_ADDRESS_PREFIX, NESTING_PREFIX} from './constants'\r\n\r\nimport {\r\n  addressToEvm, compareSubstrateAddresses,\r\n  decodeSubstrateAddress, encodeSubstrateAddress,\r\n  evmToAddress,\r\n  normalizeSubstrateAddress\r\n} from './substrate'\r\n\r\nimport {\r\n  collectionIdAndTokenIdToNestingAddress,\r\n  collectionIdToEthAddress, compareEthereumAddresses,\r\n  ethAddressToCollectionId,\r\n  nestingAddressToCollectionIdAndTokenId,\r\n  normalizeEthereumAddress\r\n} from './ethereum'\r\nimport {\r\n  CrossAccountId, CrossAccountIdUncapitalized,\r\n  EthAddressObj, EthAddressObjUncapitalized,\r\n  SubAddressObj, SubAddressObjUncapitalized,\r\n} from \"../../types\";\r\nimport {\r\n  substrateNormalizedWithMirrorIfEthereum,\r\n  addressToCrossAccountId, addressToCrossAccountIdNormalized,\r\n  guessAddressAndExtractItNormalized,\r\n  guessAddressAndExtractItNormalizedSafe\r\n} from \"./crossAccountId\";\r\n\r\nimport * as StringUtils from './stringUtils'\r\nimport * as algorithms from './imports'\r\nimport * as constants from './constants'\r\n\r\nexport {constants, algorithms, StringUtils}\r\n\r\nconst ETH_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\r\n\r\nexport type DecodeSubstrateAddressResult = {\r\n  u8a: Uint8Array,\r\n  hex: string,\r\n  bigint: bigint\r\n}\r\n\r\nexport const validate = {\r\n  substrateAddress: (address: string) => {\r\n    decodeSubstrateAddress(address)\r\n    return true\r\n  },\r\n  ethereumAddress: (address: string) => {\r\n    if (!is.ethereumAddress(address)) {\r\n      throw new Error(`address \"${address}\" is not valid ethereum address`)\r\n    }\r\n    return true\r\n  },\r\n  collectionAddress: (address: string) => {\r\n    if (!is.collectionAddress(address)) {\r\n      throw new Error(`address ${address} is not a collection address`)\r\n    }\r\n    return true\r\n  },\r\n  nestingAddress: (address: string) => {\r\n    if (!is.nestingAddress(address)) {\r\n      throw new Error(`address ${address} is not a nesting address`)\r\n    }\r\n    return true\r\n  },\r\n  collectionId: (collectionId: number) => {\r\n    if (!is.collectionId(collectionId)) {\r\n      throw new Error(`collectionId should be a number between 0 and 0xffffffff`)\r\n    }\r\n    return true\r\n  },\r\n  tokenId: (tokenId: number) => {\r\n    if (!is.tokenId(tokenId)) {\r\n      throw new Error(`collectionId should be a number between 0 and 0xffffffff`)\r\n    }\r\n    return true\r\n  },\r\n}\r\n\r\nexport const is = {\r\n  substrateAddress: (address: string): boolean => {\r\n    try {\r\n      decodeSubstrateAddress(address)\r\n      return true\r\n    } catch {\r\n      return false\r\n    }\r\n  },\r\n  ethereumAddress: (address: string): boolean => {\r\n    return typeof address === 'string' && address.length === 42 && !!address.match(ETH_ADDRESS_REGEX)\r\n  },\r\n\r\n  collectionAddress: (address: string): boolean => {\r\n    return is.ethereumAddress(address) && address.toLowerCase().startsWith(COLLECTION_ADDRESS_PREFIX)\r\n  },\r\n  nestingAddress: (address: string): boolean => {\r\n    return is.ethereumAddress(address) && address.toLowerCase().startsWith(NESTING_PREFIX)\r\n  },\r\n\r\n  collectionId: (collectionId: number): boolean => {\r\n    return !(typeof collectionId !== 'number' || isNaN(collectionId) || collectionId < 0 || collectionId > 0xffffffff)\r\n  },\r\n  tokenId: (tokenId: number): boolean => {\r\n    return !(typeof tokenId !== 'number' || isNaN(tokenId) || tokenId < 0 || tokenId > 0xffffffff)\r\n  },\r\n\r\n  crossAccountId(obj: any): obj is CrossAccountId {\r\n    return is.substrateAddressObject(obj) || is.ethereumAddressObject(obj)\r\n  },\r\n  crossAccountIdUncapitalized(obj: any): obj is CrossAccountIdUncapitalized {\r\n    return is.substrateAddressObjectUncapitalized(obj) || is.ethereumAddressObjectUncapitalized(obj)\r\n  },\r\n  substrateAddressObject(obj: any): obj is SubAddressObj {\r\n    return typeof obj === 'object' && typeof obj?.Substrate === 'string' && is.substrateAddress(obj.Substrate)\r\n  },\r\n  ethereumAddressObject(obj: any): obj is EthAddressObj {\r\n    return typeof obj === 'object' && typeof obj?.Ethereum === 'string' && is.ethereumAddress(obj.Ethereum)\r\n  },\r\n  substrateAddressObjectUncapitalized(obj: any): obj is SubAddressObjUncapitalized {\r\n    return typeof obj === 'object' && typeof obj?.substrate === 'string' && is.substrateAddress(obj.substrate)\r\n  },\r\n  ethereumAddressObjectUncapitalized(obj: any): obj is EthAddressObjUncapitalized {\r\n    return typeof obj === 'object' && typeof obj?.ethereum === 'string' && is.ethereumAddress(obj.ethereum)\r\n  },\r\n}\r\n\r\nexport const collection  = {\r\n  idToAddress: collectionIdToEthAddress,\r\n  addressToId: ethAddressToCollectionId,\r\n}\r\nexport const nesting = {\r\n  idsToAddress: collectionIdAndTokenIdToNestingAddress,\r\n  addressToIds: nestingAddressToCollectionIdAndTokenId,\r\n}\r\nexport const to = {\r\n  crossAccountId: addressToCrossAccountId,\r\n  crossAccountIdNormalized: addressToCrossAccountIdNormalized,\r\n  substrateNormalizedOrMirrorIfEthereum: substrateNormalizedWithMirrorIfEthereum,\r\n}\r\n\r\nexport const extract = {\r\n  normalizedAddressFromObject: guessAddressAndExtractItNormalized,\r\n  normalizedAddressFromObjectSafe: guessAddressAndExtractItNormalizedSafe,\r\n  crossAccountIdFromObject: (obj: any): CrossAccountId => {\r\n    return addressToCrossAccountId(guessAddressAndExtractItNormalized(obj))\r\n  },\r\n  crossAccountIdFromObjectNormalized: (obj: any): CrossAccountId => {\r\n    return addressToCrossAccountId(guessAddressAndExtractItNormalized(obj))\r\n  },\r\n}\r\n\r\nexport const mirror = {\r\n  substrateToEthereum: addressToEvm,\r\n  ethereumToSubstrate: evmToAddress,\r\n}\r\n\r\nexport const normalize = {\r\n  substrateAddress: normalizeSubstrateAddress,\r\n  ethereumAddress: normalizeEthereumAddress,\r\n}\r\n\r\nexport const compare = {\r\n  substrateAddresses: compareSubstrateAddresses,\r\n  ethereumAddresses: compareEthereumAddresses,\r\n}\r\n\r\nexport const substrate = {\r\n  encode: encodeSubstrateAddress,\r\n  decode: decodeSubstrateAddress,\r\n  compare: compareSubstrateAddresses,\r\n}\r\n\r\nexport const Address = {\r\n  constants,\r\n  is,\r\n  validate,\r\n  collection,\r\n  nesting,\r\n  to,\r\n  extract,\r\n  mirror,\r\n  normalize,\r\n  compare,\r\n  substrate,\r\n  algorithms,\r\n  StringUtils,\r\n}\r\n","export const STATIC_ADDRESSES = <const>{\r\n  contractHelpers: '0x842899ECF380553E8a4de75bF534cdf6fBF64049',\r\n  collectionHelpers: '0x6C4E9fE1AE37a41E93CEE429e8E1881aBdcbb54F',\r\n}\r\nexport const NESTING_PREFIX = <const>'0xf8238ccfff8ed887463fd5e0'\r\nexport const COLLECTION_ADDRESS_PREFIX = <const>'0x17c4e6453cc49aaaaeaca894e6d9683e'\r\n","import basex from 'base-x'\r\nimport {keccak_256} from '@noble/hashes/sha3'\r\nimport {blake2b} from '@noble/hashes/blake2b'\r\n\r\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\r\nconst BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\r\n\r\nconst base58 = basex(BASE58_ALPHABET)\r\nconst base64 = basex(BASE64_ALPHABET)\r\n\r\nexport {keccak_256, blake2b, base58, base64, basex}\r\n","import {safeJSONParse} from \"../../tsUtils\";\n\nexport const vec2str = (arr: Array<number | string>) => {\n  return arr\n    .map(x => String.fromCharCode(typeof x === 'number' ? x : parseInt(x, 10)))\n    .join('')\n}\n\nexport const str2vec = (str: string) => {\n  if (typeof str !== 'string') {\n    return str\n  }\n  return str.split('').map(x => x.charCodeAt(0))\n}\n\nexport const strToU8a = (str: string): Uint8Array => new Uint8Array(str2vec(str))\n\nexport const hexToU8a = (hexString: string): Uint8Array =>\n  Uint8Array.from(((hexString.startsWith('0x') ? hexString.slice(2) : hexString).match(/.{1,2}/g) || []).map((byte) => parseInt(byte, 16)))\n\nexport const u8aToHex = (bytes: number[] | Uint8Array): string => {\n  const arr = bytes instanceof Uint8Array ? Array.from(bytes) : bytes\n  return '0x' + arr.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n\nexport const hexStringToString = (hexString: string): string =>\n  ((hexString.startsWith('0x') ? hexString.slice(2) : hexString).match(/.{1,2}/g) || [])\n    .map(el => String.fromCharCode(parseInt(el, 16)))\n    .join('')\n\n\nexport const safeJsonParseStringOrHexString = <T = any>(stringOrHexString: string): T | string => {\n  try {\n    return JSON.parse(stringOrHexString) as T\n  } catch {\n    return safeJSONParse<T>(hexStringToString(stringOrHexString))\n  }\n}\n\nexport const parseAndCheckTheNumberIsDWORD = (n: number | string) => {\n  const num: number = (typeof n === 'string') ? parseInt(n, 10) : n\n\n  if (isNaN(num)) throw new Error(`Passed number is NaN: ${n}`)\n  if (num < 0) throw new Error(`Passed number is less than 0: ${n}`)\n  if (num > 0xFFFFFFFF) throw new Error(`Passed number is more than 2**32: ${n}`)\n\n  return num\n}\n\nexport const DWORDHexString = {\n  fromNumber: (n: number): string => {\n    return parseAndCheckTheNumberIsDWORD(n).toString(16).padStart(8, '0')\n  },\n  toNumber: (s: string): number => {\n    const num: number = parseInt(s, 16)\n\n    if (isNaN(num)) throw new Error(`Passed string is not hexadecimal: ${s}`)\n\n    return num\n  }\n}\n","import * as string from \"./stringUtils\"\r\nimport {keccak_256} from \"./imports\"\r\nimport {COLLECTION_ADDRESS_PREFIX, NESTING_PREFIX} from \"./constants\"\r\nimport {is, validate} from \"./index\"\r\n\r\nconst unsafeNormalizeEthereumAddress = (address: string) => {\r\n  const addr = address.toLowerCase().replace(/^0x/i, '')\r\n  const addressHash = string.u8aToHex(keccak_256(addr)).replace(/^0x/i, '')\r\n\r\n  let checksumAddress = '0x'\r\n\r\n  for (let i = 0; i < addr.length; i++) {\r\n    checksumAddress += (parseInt(addressHash[i], 16) > 7)\r\n      ? addr[i].toUpperCase()\r\n      : addr[i]\r\n  }\r\n\r\n  return checksumAddress\r\n}\r\nexport const normalizeEthereumAddress = (address: string) => {\r\n  validate.ethereumAddress(address)\r\n  return unsafeNormalizeEthereumAddress(address)\r\n}\r\n\r\ntype EthAddressObj = { Ethereum: string }\r\nexport const compareEthereumAddresses = (address1: string | EthAddressObj | object, address2: string | EthAddressObj | object): boolean => {\r\n  const addr1 = typeof address1 === 'string'\r\n    ? address1\r\n    : ((address1 as EthAddressObj).Ethereum || (address1 as any).ethereum) as string | undefined\r\n  const addr2 = typeof address2 === 'string'\r\n    ? address2\r\n    : ((address2 as EthAddressObj).Ethereum || (address2 as any).ethereum) as string | undefined\r\n\r\n  if (!addr1 || !addr2 || !is.ethereumAddress(addr1) || !is.ethereumAddress(addr2)) {\r\n    return false\r\n  }\r\n  return addr1.toLowerCase() === addr2.toLowerCase()\r\n\r\n}\r\n\r\nexport const collectionIdToEthAddress = (collectionId: number): string | null => {\r\n  validate.collectionId(collectionId)\r\n  return unsafeNormalizeEthereumAddress(\r\n    COLLECTION_ADDRESS_PREFIX +\r\n    string.DWORDHexString.fromNumber(collectionId)\r\n  )\r\n}\r\nexport const ethAddressToCollectionId = (address: string): number | null => {\r\n  validate.collectionAddress(address)\r\n  return string.DWORDHexString.toNumber(address.slice(-8))\r\n}\r\n\r\nexport const collectionIdAndTokenIdToNestingAddress = (collectionId: number, tokenId: number): string => {\r\n  validate.collectionId(collectionId)\r\n  validate.tokenId(tokenId)\r\n\r\n  return unsafeNormalizeEthereumAddress(\r\n    NESTING_PREFIX +\r\n    string.DWORDHexString.fromNumber(collectionId) +\r\n    string.DWORDHexString.fromNumber(tokenId)\r\n  )\r\n}\r\n\r\nexport const nestingAddressToCollectionIdAndTokenId = (address: string): { collectionId: number, tokenId: number } => {\r\n  validate.nestingAddress(address)\r\n  return {\r\n    collectionId: string.DWORDHexString.toNumber(address.slice(-16, -8)),\r\n    tokenId: string.DWORDHexString.toNumber(address.slice(-8)),\r\n  }\r\n}\r\n","import {base58, blake2b} from './imports'\r\nimport {DecodeSubstrateAddressResult, validate} from './index'\r\nimport {normalizeEthereumAddress} from './ethereum'\r\nimport {hexToU8a, u8aToHex} from './stringUtils'\r\nimport * as string from \"./stringUtils\";\r\n\r\nconst blake2AsU8a = (u8a: Uint8Array, dkLen: 8 | 16 | 32 | 48 | 64 = 32): Uint8Array => {\r\n  return blake2b(u8a, {dkLen})\r\n}\r\n\r\nconst u8aConcat = (u8as: readonly Uint8Array[]): Uint8Array => {\r\n  let offset = 0\r\n\r\n  let length = 0\r\n\r\n  for (let i = 0; i < u8as.length; i++) {\r\n    length += u8as[i].length\r\n  }\r\n\r\n  const result = new Uint8Array(length)\r\n\r\n  for (let i = 0; i < u8as.length; i++) {\r\n    result.set(u8as[i], offset)\r\n    offset += u8as[i].length\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n// strToU8a('SS58PRE')\r\nconst SS58_PREFIX = new Uint8Array([83, 83, 53, 56, 80, 82, 69])\r\n\r\nconst sshash = (data: Uint8Array): Uint8Array => {\r\n  return blake2AsU8a(u8aConcat([SS58_PREFIX, data]), 64);\r\n}\r\n\r\nconst checkAddressChecksum = (decoded: Uint8Array): [boolean, number, number, number] => {\r\n  const ss58Length = (decoded[0] & 0b0100_0000) ? 2 : 1;\r\n  const ss58Decoded = ss58Length === 1\r\n    ? decoded[0]\r\n    : ((decoded[0] & 0x3f) << 2) | (decoded[1] >> 6) | ((decoded[1] & 0x3f) << 8);\r\n\r\n  // 32/33 bytes public + 2 bytes checksum + prefix\r\n  const isPublicKey = [34 + ss58Length, 35 + ss58Length].includes(decoded.length);\r\n  const length = decoded.length - (isPublicKey ? 2 : 1);\r\n\r\n  // calculate the hash and do the checksum byte checks\r\n  const hash = sshash(decoded.subarray(0, length));\r\n  const isValid = (decoded[0] & 0x80) === 0 && ![46, 47].includes(decoded[0]) && (\r\n    isPublicKey\r\n      ? decoded[decoded.length - 2] === hash[0] && decoded[decoded.length - 1] === hash[1]\r\n      : decoded[decoded.length - 1] === hash[0]\r\n  );\r\n\r\n  return [isValid, length, ss58Length, ss58Decoded];\r\n}\r\n\r\nexport const normalizeSubstrateAddress = (address: string, prefix: number = 42): string => {\r\n  return encodeSubstrateAddress(decodeSubstrateAddress(address).u8a, prefix)\r\n}\r\n\r\n\r\nexport function encodeSubstrateAddress (key: Uint8Array | string | bigint, ss58Format: number = 42): string {\r\n  const u8a :Uint8Array = typeof key === 'string'\r\n    ? hexToU8a(key)\r\n    : typeof key === 'bigint'\r\n      ? hexToU8a(key.toString(16))\r\n      : key\r\n\r\n  if (ss58Format < 0 || ss58Format > 16383 || [46, 47].includes(ss58Format)) {\r\n    throw new Error(`ss58Format is not valid, received ${typeof ss58Format} \"${ss58Format}\"`)\r\n  }\r\n\r\n  const allowedDecodedLengths = [1, 2, 4, 8, 32, 33]\r\n  if (!allowedDecodedLengths.includes(u8a.length)) {\r\n    throw new Error(`key length is not valid, received ${u8a.length}, valid values are ${allowedDecodedLengths.join(', ')}`)\r\n  }\r\n\r\n  const u8aPrefix = ss58Format < 64\r\n    ? new Uint8Array([ss58Format])\r\n    : new Uint8Array([\r\n      ((ss58Format & 0xfc) >> 2) | 0x40,\r\n      (ss58Format >> 8) | ((ss58Format & 0x03) << 6)\r\n    ])\r\n\r\n  const input = u8aConcat([u8aPrefix, u8a])\r\n\r\n  return base58.encode(\r\n    u8aConcat([\r\n      input,\r\n      sshash(input).subarray(0, [32, 33].includes(u8a.length) ? 2 : 1)\r\n    ])\r\n  );\r\n}\r\n\r\nexport function decodeSubstrateAddress (address: string, ignoreChecksum?: boolean, ss58Format: number = -1): DecodeSubstrateAddressResult {\r\n  let realError: Error | null = null\r\n\r\n  try {\r\n    const decoded = base58.decode(address);\r\n\r\n    const allowedEncodedLengths = [3, 4, 6, 10, 35, 36, 37, 38]\r\n\r\n    if (!allowedEncodedLengths.includes(decoded.length)) {\r\n      realError = new Error(`key length is not valid, decoded key length is ${decoded.length}, valid values are ${allowedEncodedLengths.join(', ')}`)\r\n      throw realError\r\n    }\r\n\r\n    const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded)\r\n\r\n    if (!ignoreChecksum && !isValid) {\r\n      realError = new Error(`Invalid decoded address checksum`)\r\n      throw realError\r\n    }\r\n    if (![-1, ss58Decoded].includes(ss58Format)) {\r\n      realError = new Error(`Expected ss58Format ${ss58Format}, received ${ss58Decoded}`)\r\n      throw realError\r\n    }\r\n\r\n    const publicKey = decoded.slice(ss58Length, endPos)\r\n\r\n    const hex = u8aToHex(publicKey)\r\n    return {\r\n      u8a: publicKey,\r\n      hex,\r\n      bigint: BigInt(hex)\r\n    }\r\n  } catch (error) {\r\n    throw realError\r\n      ? realError\r\n      : new Error(`Decoding ${address}: ${(error as Error).message}`)\r\n  }\r\n}\r\n\r\ntype SubAddressObj = { Substrate: string }\r\nexport const compareSubstrateAddresses = (address1: string | SubAddressObj | object, address2: string | SubAddressObj | object): boolean => {\r\n  const addr1 = typeof address1 === 'string'\r\n    ? address1\r\n    : ((address1 as SubAddressObj).Substrate || (address1 as any).substrate) as string | undefined\r\n  const addr2 = typeof address2 === 'string'\r\n    ? address2\r\n    : ((address2 as SubAddressObj).Substrate || (address2 as any).substrate) as string | undefined\r\n\r\n  if (!addr1 || !addr2) {\r\n    return false\r\n  }\r\n\r\n  try {\r\n    const decoded1 = decodeSubstrateAddress(addr1)\r\n    const decoded2 = decodeSubstrateAddress(addr2)\r\n    return decoded1.bigint === decoded2.bigint\r\n  } catch(e) {\r\n    return false\r\n  }\r\n}\r\n\r\nexport const addressToEvm = (address: string, ignoreChecksum?: boolean): string => {\r\n  const truncated = decodeSubstrateAddress(address, ignoreChecksum).u8a.subarray(0, 20)\r\n  return normalizeEthereumAddress(u8aToHex(truncated))\r\n}\r\n\r\n// strToU8a('evm:')\r\nconst EVM_PREFIX_U8A = new Uint8Array([101, 118, 109, 58])\r\nexport const evmToAddress = (evmAddress: string, ss58Format: number = 42): string => {\r\n  validate.ethereumAddress(evmAddress)\r\n\r\n  const message = u8aConcat([EVM_PREFIX_U8A, hexToU8a(evmAddress)])\r\n\r\n  return encodeSubstrateAddress(blake2AsU8a(message), ss58Format)\r\n}\r\n","import {normalizeEthereumAddress} from \"./ethereum\";\r\nimport {normalizeSubstrateAddress} from \"./substrate\";\r\nimport {CrossAccountId} from \"../../types\";\r\nimport {is, mirror, normalize} from \"./index\";\r\n\r\nexport const guessAddressAndExtractItNormalizedSafe = (address: string | object): string | null => {\r\n  if (typeof address === 'object') {\r\n    if (is.substrateAddressObject(address)) return normalize.substrateAddress(address.Substrate)\r\n    else if (is.substrateAddressObjectUncapitalized(address)) return normalize.substrateAddress(address.substrate)\r\n    else if (is.ethereumAddressObject(address)) return normalizeEthereumAddress(address.Ethereum)\r\n    else if (is.ethereumAddressObjectUncapitalized(address)) return normalizeEthereumAddress(address.ethereum)\r\n    else return null\r\n  }\r\n  if (typeof address === 'string') {\r\n    if (is.substrateAddress(address)) return normalizeSubstrateAddress(address)\r\n    else if (is.ethereumAddress(address)) return normalizeEthereumAddress(address)\r\n    else return null\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nexport const guessAddressAndExtractItNormalized = (address: string | object): string => {\r\n  const result = guessAddressAndExtractItNormalizedSafe(address)\r\n  if (!result) {\r\n    throw new Error(`Passed address is not a valid address string or object: ${JSON.stringify(address).slice(0, 100)}`)\r\n  }\r\n  return result\r\n}\r\n\r\nexport const addressToCrossAccountId = (address: string): CrossAccountId => {\r\n  if (is.substrateAddress(address)) {\r\n    return {Substrate: address}\r\n  } else if (is.ethereumAddress(address)) {\r\n    return {Ethereum: address}\r\n  }\r\n\r\n  throw new Error(`Passed address ${address} is not substrate nor ethereum address`)\r\n}\r\n\r\nexport const addressToCrossAccountIdNormalized = (address: string): CrossAccountId => {\r\n  if (is.substrateAddress(address)) {\r\n    return {Substrate: normalize.substrateAddress(address)}\r\n  } else if (is.ethereumAddress(address)) {\r\n    return {Ethereum: normalize.ethereumAddress(address)}\r\n  }\r\n\r\n  throw new Error(`Passed address ${address} is not substrate nor ethereum address`)\r\n}\r\n\r\nexport const substrateNormalizedWithMirrorIfEthereum = (address: string): string => {\r\n  const addressObject = addressToCrossAccountId(address)\r\n  return addressObject.Substrate\r\n    ? normalizeSubstrateAddress(addressObject.Substrate)\r\n    : mirror.ethereumToSubstrate(addressObject.Ethereum as string)\r\n}\r\n","import * as Address from './address'\r\n\r\nconst StringUtils = Address.StringUtils\r\n\r\nconst Browser = {\r\n  checkEnvironmentIsBrowser: (safe?: boolean) => {\r\n    if (typeof window === 'undefined') {\r\n      if (safe) {\r\n        return false\r\n      } else {\r\n        throw new Error('cannot sign with extenion not in browser')\r\n      }\r\n    }\r\n    return true\r\n  }\r\n}\r\n\r\nexport {Address, StringUtils, Browser}\r\n\r\n\r\nexport const UniqueUtils = {\r\n  Browser,\r\n  StringUtils,\r\n  Address,\r\n}\r\n","export const requestAccounts = async (): Promise<Array<string>> => {\r\n  if (typeof window === 'undefined') {\r\n    throw new Error(`Cannot access window. It's necessary`)\r\n  }\r\n  if (!window.ethereum) {\r\n    throw new Error('No window.ethereum found')\r\n  }\r\n  let accounts: string[] = []\r\n  try {\r\n    accounts = await window.ethereum.request({method: 'eth_requestAccounts'})\r\n  } catch (err: any) {\r\n    if (err.code === 4001) {\r\n      // EIP-1193 userRejectedRequest error\r\n      // If this happens, the user rejected the connection request.\r\n      throw new Error('User rejected')\r\n    }\r\n    throw err\r\n  }\r\n  return accounts\r\n}\r\n\r\ninterface ISafeGetAccountsResult {\r\n  extensionFound: boolean\r\n  accounts: string[]\r\n}\r\n\r\nexport const safeGetAccounts = async (): Promise<ISafeGetAccountsResult> => {\r\n  if (typeof window === 'undefined' || !window.ethereum) {\r\n    return {extensionFound: false, accounts: []}\r\n  }\r\n\r\n  const accounts: string[] = await window.ethereum.request({method: 'eth_accounts'})\r\n  return {extensionFound: true, accounts}\r\n}\r\n","import * as extensionTools from './extensionTools'\r\n\r\nexport const Ethereum = {\r\n  extension: extensionTools,\r\n}\r\n","import {\r\n  GenericEventData,\r\n  InjectedAccountWithMeta,\r\n  ISigner,\r\n  ISubmittableResult,\r\n  KeyringPair,\r\n  SubmittableExtrinsic,\r\n  SubmittableResult\r\n} from '../types'\r\nimport {getPolkadotExtensionDapp} from '../libs'\r\nimport {UniqueUtils} from '../utils'\r\nimport {ExtrinsicError} from '../utils/errors'\r\n\r\nconst signerIs = {\r\n  keyring(signer: ISigner): signer is KeyringPair {\r\n    return typeof (signer as KeyringPair).sign === 'function'\r\n  },\r\n  extensionAccount(signer: ISigner): signer is InjectedAccountWithMeta {\r\n    const address = (signer as InjectedAccountWithMeta).address\r\n    return UniqueUtils.Address.is.substrateAddress(address) && typeof signer.meta.source === \"string\"\r\n  },\r\n}\r\n\r\nexport const findEventDataBySectionAndMethod = (txResult: ISubmittableResult, section: string, method: string): GenericEventData | undefined => {\r\n  return txResult.events.find(event =>\r\n    event.event.section === section && event.event.method === method\r\n  )?.event.data\r\n}\r\n\r\nexport const findManyEventsDataBySectionAndMethod = (txResult: ISubmittableResult, section: string, method: string): Array<GenericEventData> => {\r\n  return txResult.events.filter(event =>\r\n    event.event.section === section && event.event.method === method\r\n  ).map(event => event.event.data).filter(data => !!data)\r\n}\r\n\r\n\r\n\r\nenum TransactionStatus {\r\n  NOT_READY = 'NOT_READY',\r\n  FAIL = 'FAIL',\r\n  SUCCESS = 'SUCCESS'\r\n}\r\n\r\nconst getTransactionStatus = ({events, status}: SubmittableResult): TransactionStatus => {\r\n  if (status.isReady || status.isBroadcast) {\r\n    return TransactionStatus.NOT_READY\r\n  }\r\n\r\n  if (status.isInBlock || status.isFinalized) {\r\n    if (events.find(e => e.event.data.method === 'ExtrinsicFailed')) {\r\n      return TransactionStatus.FAIL\r\n    }\r\n    if (events.find(e => e.event.data.method === 'ExtrinsicSuccess')) {\r\n      return TransactionStatus.SUCCESS\r\n    }\r\n  }\r\n\r\n  return TransactionStatus.FAIL\r\n}\r\n\r\n\r\nexport const signTransaction = async <T extends SubmittableExtrinsic>(tx: T, signer: ISigner, label = ''): Promise<T> => {\r\n  if (signerIs.keyring(signer)) {\r\n    return tx.signAsync(signer)\r\n  }\r\n\r\n  if (signerIs.extensionAccount(signer)) {\r\n    if (typeof window === 'undefined') {\r\n      throw new Error('cannot sign with extenion not in browser')\r\n    }\r\n    const extension = getPolkadotExtensionDapp()\r\n    const injector = await extension.web3FromAddress(signer.address)\r\n    return tx.signAsync(signer.address, {signer: injector.signer})\r\n  }\r\n\r\n  throw new Error('Attempt to sign failed: no keyring or valid substrate address to sign by extension provided')\r\n}\r\n\r\nexport const sendTransaction = async <T extends SubmittableExtrinsic>(tx: T, label = '') => {\r\n  if (!label) {\r\n    const {section, method} = tx.unwrap().method.toHuman()\r\n    label = `transaction ${section}.${method}`\r\n  }\r\n\r\n  return new Promise<ISubmittableResult>(async (resolve, reject) => {\r\n    let unsub = await tx.send(txResult => {\r\n      const status = getTransactionStatus(txResult)\r\n\r\n      if (status === TransactionStatus.SUCCESS) {\r\n        unsub()\r\n        resolve(txResult)\r\n      } else if (status === TransactionStatus.FAIL) {\r\n        let errMessage = ''\r\n\r\n        if (txResult.dispatchError?.isModule) {\r\n          // for module errors, we have the section indexed, lookup\r\n          const decoded = tx.registry.findMetaError(txResult.dispatchError.asModule)\r\n          const {docs, name, section} = decoded\r\n          errMessage = `${section}.${name}: ${docs.join(' ')}`\r\n        } else {\r\n          // Other, CannotLookup, BadOrigin, no extra info\r\n          errMessage = txResult.dispatchError?.toString() || 'Unknown error'\r\n        }\r\n\r\n        unsub()\r\n        reject(new ExtrinsicError(txResult, errMessage, label))\r\n      }\r\n    })\r\n  })\r\n}\r\n\r\nexport const signAndSendTransaction = async <T extends SubmittableExtrinsic>(tx: T, signer: ISigner, label = '') => {\r\n  return await sendTransaction(await signTransaction(tx, signer))\r\n}\r\n\r\n","import {ISubmittableResult, SubmittableResult} from \"../types\";\r\n\r\nexport class ValidationError extends TypeError {\r\n  constructor(message: string) {\r\n    super(message)\r\n    this.name = 'ValidationError'\r\n  }\r\n}\r\n\r\nexport class ExtrinsicError extends Error {\r\n  txResult: ISubmittableResult\r\n\r\n  constructor(txResult: SubmittableResult, errMessage: string, label?: string) {\r\n    if (!label) {\r\n      const info = txResult.dispatchInfo?.toHuman()\r\n      label = `transaction ${info?.section}${info?.method}`\r\n    }\r\n    super(`Transaction failed: \"${errMessage}\"${label ? ' for' + label : ''}.`)\r\n    this.txResult = txResult\r\n  }\r\n}\r\n","import {getPolkadotExtensionDapp} from \"../libs\";\r\nimport {UniqueUtils} from \"../utils\";\r\n\r\nexport const connectAs = async (appName: string) => {\r\n  UniqueUtils.Browser.checkEnvironmentIsBrowser()\r\n  const extension = getPolkadotExtensionDapp()\r\n  await extension.web3Enable(appName)\r\n}\r\n\r\nexport const getAllAccounts = async() => {\r\n  UniqueUtils.Browser.checkEnvironmentIsBrowser()\r\n  const extension = getPolkadotExtensionDapp()\r\n  return await extension.web3Accounts()\r\n}\r\n","import {KeypairType, KeyringOptions, Prefix} from \"../types\";\r\nimport {getPolkadotKeyring} from \"../libs\";\r\n\r\nexport const keyringFromSeed = (seed: string, keypairType: KeypairType = 'sr25519', ss58Format: Prefix = 42) => {\r\n  const keyring = createKeyring({type: keypairType, ss58Format})\r\n  return keyring.addFromUri(seed);\r\n}\r\nexport const createKeyring = (options?: KeyringOptions) => {\r\n  const {Keyring} = getPolkadotKeyring()\r\n  return new Keyring(options);\r\n}\r\nexport {KeypairType}\r\n","import {ApiPromise, ISigner, ISubmittableResult, SubmittableExtrinsic} from '../../types'\r\nimport {sendTransaction, signTransaction} from '../extrinsicTools'\r\n\r\nexport interface ExtrinsicInfo {\r\n  blockHash: string\r\n  blockNumber?: number\r\n  txIndex?: number\r\n  txHash: string\r\n}\r\n\r\nexport interface ExtrinsicResult {\r\n  txResult: ISubmittableResult\r\n  extrinsicInfo: ExtrinsicInfo\r\n}\r\n\r\nexport interface ExtrinsicOptions {\r\n  //todo: era, header, etc...\r\n}\r\n\r\nexport interface ExtrinsicSendOptions {\r\n  getBlockNumber?: boolean\r\n}\r\n\r\nexport abstract class AbstractExtrinsic<P, R extends ExtrinsicResult = ExtrinsicResult> {\r\n  constructor(\r\n    protected readonly api: ApiPromise,\r\n    protected tx: SubmittableExtrinsic,\r\n    protected readonly params: P,\r\n  ) {\r\n  }\r\n\r\n  get isSigned() {\r\n    return this.tx.isSigned\r\n  }\r\n\r\n  /**\r\n   * @ignore Unimplemented\r\n   */\r\n  verifySignature() {\r\n    throw new Error('Unimplemented')\r\n    //todo: implement\r\n  }\r\n\r\n  getRawTx() {\r\n    return this.tx\r\n  }\r\n\r\n  async sign(signer: ISigner) {\r\n    this.tx = await signTransaction(this.tx, signer)\r\n    return this\r\n  }\r\n\r\n  async send(options?: ExtrinsicSendOptions): Promise<R> {\r\n    return await this.processResult(await sendTransaction(this.tx), options)\r\n  }\r\n\r\n  async signAndSend(signer: ISigner, options?: ExtrinsicSendOptions): Promise<R> {\r\n    await this.sign(signer)\r\n    return await this.send(options)\r\n  }\r\n\r\n  async getPaymentInfo(fromAddress: string): Promise<bigint> {\r\n    const result = await this.tx.paymentInfo(fromAddress)\r\n    return result.partialFee.toBigInt()\r\n  }\r\n\r\n  protected async getBaseResult(txResult: ISubmittableResult, options?: ExtrinsicSendOptions): Promise<ExtrinsicResult> {\r\n    const blockHash = txResult.status.asInBlock!.toString()\r\n\r\n    const blockNumber: number | undefined = (options?.getBlockNumber && !!blockHash)\r\n      ? (await this.api.rpc.chain.getBlock(blockHash)).block.header.number.toNumber()\r\n      : undefined\r\n\r\n    const extrinsicInfo: ExtrinsicInfo =  {\r\n      blockHash,\r\n      txHash: txResult.txHash.toString(),\r\n      txIndex: txResult.txIndex,\r\n      blockNumber\r\n    }\r\n\r\n    return {\r\n      txResult: txResult,\r\n      extrinsicInfo,\r\n    }\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options?: ExtrinsicSendOptions): Promise<R> {\r\n    return await this.getBaseResult(txResult, options) as R\r\n  }\r\n}\r\n\r\nexport class TransactionFromRawTx extends AbstractExtrinsic<SubmittableExtrinsic | string> {\r\n  constructor(api: ApiPromise, tx: SubmittableExtrinsic | string, options?: ExtrinsicOptions) {\r\n    const transaction = typeof tx === 'string' ? api.tx(tx) : tx\r\n    super(api, transaction, tx);\r\n  }\r\n}\r\n","import {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {Address, UniqueUtils} from '../../../utils'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from \"../AbstractExtrinsic\";\r\n\r\nexport interface ExtrinsicTransferCoinsParams {\r\n  toAddress: string\r\n  amountInWei: bigint\r\n}\r\n\r\nexport interface ExtrinsicTransferCoinsOptions extends ExtrinsicOptions {\r\n  dontKeepAccountAlive?: boolean\r\n}\r\n\r\nexport interface ExtrinsicTransferCoinsResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicTransferCoins extends AbstractExtrinsic<ExtrinsicTransferCoinsParams, ExtrinsicTransferCoinsResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicTransferCoinsParams, options?: ExtrinsicTransferCoinsOptions) {\r\n    const method = options?.dontKeepAccountAlive ? 'transfer' : 'transferKeepAlive'\r\n    const tx = api.tx.balances[method](params.toAddress, params.amountInWei)\r\n\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options?: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'balances', 'Transfer')\r\n\r\n    const isSuccess = !!data &&\r\n      UniqueUtils.Address.compare.substrateAddresses(this.tx.signer.toString(), data[0].toString()) &&\r\n      UniqueUtils.Address.compare.substrateAddresses(this.params.toAddress, data[1].toString()) &&\r\n      data[2].eq(this.params.amountInWei)\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {Coin} from './coin'\r\nexport {Coin}\r\n\r\nexport const quartz = new Coin({\r\n  symbol: 'QTZ',\r\n  weiSymbol: 'wei',\r\n  decimals: 18,\r\n})\r\n\r\nexport const unique = new Coin({\r\n  symbol: 'UNQ',\r\n  weiSymbol: 'wei',\r\n  decimals: 18,\r\n})\r\n\r\nexport const opal = new Coin({\r\n  symbol: 'OPL',\r\n  weiSymbol: 'wei',\r\n  decimals: 18,\r\n})\r\n","export interface CoinOptions {\r\n  decimals: number\r\n  symbol: string\r\n  weiSymbol: string\r\n}\r\n\r\nexport class Coin {\r\n  public readonly decimals: number\r\n  public readonly symbol: string\r\n  public readonly weiSymbol: string\r\n  public readonly oneCoinInWei: bigint\r\n\r\n  // half of decimals wei\r\n  // for 18 decimals will be gigawei or gwei\r\n  public readonly hwei: bigint\r\n\r\n  constructor(options: CoinOptions) {\r\n    this.symbol = options.symbol\r\n    this.weiSymbol = options.weiSymbol\r\n    this.decimals = options.decimals\r\n\r\n    const decimalsBigInt = BigInt(options.decimals)\r\n    this.oneCoinInWei = 10n ** decimalsBigInt\r\n    this.hwei = 10n ** (decimalsBigInt / 2n)\r\n  }\r\n\r\n  static createUnknown18DecimalsCoin() {\r\n    return new Coin({\r\n      symbol: 'Unit',\r\n      weiSymbol: 'wei',\r\n      decimals: 18\r\n    })\r\n  }\r\n\r\n  getOptions() {\r\n    return {\r\n      symbol: this.symbol,\r\n      decimals: this.decimals,\r\n      weiSymbol: this.weiSymbol,\r\n    }\r\n  }\r\n\r\n  getFractionalPart(wei: bigint | string): bigint {\r\n    const str = wei.toString()\r\n    if (str.length <= this.decimals) return this.bigintFromWei(wei)\r\n\r\n    return BigInt(str.slice(str.length - this.decimals))\r\n  }\r\n\r\n  getIntegerPart(wei: bigint | string): bigint {\r\n    const str = wei.toString()\r\n    if (str.length <= this.decimals) return 0n\r\n\r\n    return BigInt(str.slice(0, str.length - this.decimals))\r\n  }\r\n\r\n  bigintFromWei(wei: string | bigint): bigint {\r\n    if (typeof wei === \"bigint\") {\r\n      return wei\r\n    } else if (typeof wei === 'string') {\r\n      if (!wei.match(/^\\d+$/)) {\r\n        throw new Error('wei should be string of digits')\r\n      }\r\n      return BigInt(wei)\r\n    } else {\r\n      throw new Error('wei should be bigint or string')\r\n    }\r\n  }\r\n\r\n  format(wei: string | bigint, decimalPoints: number = 6): string {\r\n    return this.formatWithoutCurrency(wei, decimalPoints) + ` ${this.symbol}`\r\n  }\r\n  formatFullLength(wei: string | bigint): string {\r\n    return this.format(wei, this.decimals)\r\n  }\r\n\r\n  // always rounds down insignificant part\r\n  // because it's better to show '5 UNQ' on balance 5.09 UNQ instead of '5.1 UNQ'\r\n  formatWithoutCurrency(wei: string | bigint, decimalPoints: number = 6): string {\r\n    if (typeof decimalPoints !== 'number') {\r\n      throw new Error(`decimalPoints should be number`)\r\n    }\r\n    if (!(Math.round(decimalPoints) === decimalPoints)) {\r\n      throw new Error('decimalPoints should be integer number')\r\n    }\r\n    if (decimalPoints < 0) {\r\n      throw new Error(`decimal points should be in range GTE 0`)\r\n    }\r\n    if (decimalPoints > this.decimals) {\r\n      decimalPoints = this.decimals\r\n    }\r\n\r\n    const intPart = this.getIntegerPart(wei)\r\n    const fracPart = this.getFractionalPart(wei)\r\n\r\n    const nonSignificantPartLength = this.decimals - decimalPoints\r\n    const fracPartIsTooSmall = fracPart < (10n ** BigInt(nonSignificantPartLength))\r\n\r\n    if (!decimalPoints || fracPartIsTooSmall) {\r\n      return intPart.toString()\r\n    }\r\n\r\n    const fracPartStr = fracPart.toString()\r\n      .padStart(18, '0')\r\n      .slice(0, decimalPoints)\r\n      .replace(/\\.?0*$/, '')\r\n\r\n    return `${intPart}.${fracPartStr}`\r\n  }\r\n\r\n  /**\r\n   * @description Dangerously because for the lossless conversion, strings should be used, not numbers.\r\n   * Please use the `coinsToWei` method instead.\r\n   */\r\n  dangerouslyCoinsToWei(coins: number): bigint {\r\n    if (coins < 0) {\r\n      throw new Error(`coins to wei: coins should be >= 0, received ${coins}`)\r\n    }\r\n\r\n    const intPart = Math.floor(coins)\r\n    if (intPart !== 0) {\r\n      return this.coinsToWei(coins.toString())\r\n    } else {\r\n      return this.coinsToWei((coins + 1).toString()) - this.oneCoinInWei\r\n    }\r\n  }\r\n\r\n  coinsToWei(coins: string): bigint {\r\n    const parts = coins.trim().match(/^(\\d*(\\.\\d*)?)/)\r\n    if (!parts || !parts[1]) {\r\n      throw new Error(`coinsToWei: could not parse input: ${coins}`)\r\n    }\r\n\r\n    const [intPart, fracPart] = parts[1].split('.')\r\n\r\n    const finalFracPart = fracPart ? BigInt(fracPart.padEnd(18, '0')) : 0n\r\n    return BigInt(intPart) * this.oneCoinInWei + finalFracPart\r\n  }\r\n}\r\n","import {ApiPromise, SubmittableExtrinsic} from '../types'\r\nimport {getPolkadotApi, rpcDefinitions} from '../libs'\r\nimport {\r\n  ExtrinsicTransferCoins,\r\n  ExtrinsicTransferCoinsOptions,\r\n  ExtrinsicTransferCoinsParams\r\n} from './extrinsics/common/ExtrinsicTransferCoins'\r\nimport {ExtrinsicOptions, TransactionFromRawTx} from './extrinsics/AbstractExtrinsic'\r\nimport {Coin} from \"../coin\";\r\n\r\nexport interface ConnectToSubstrateOptions {\r\n  dontAwaitApiIsReady?: boolean\r\n  uniqueRpcDefinitionsName?: 'unique' | 'quartz' | 'opal'\r\n}\r\n\r\n//Record<string, DefinitionRpc | DefinitionRpcSub>\r\n\r\nexport class SubstrateCommon {\r\n  protected _api: ApiPromise | undefined\r\n  protected _ss58Prefix = 42\r\n  protected _coin = Coin.createUnknown18DecimalsCoin()\r\n\r\n  protected get api() {\r\n    if (!this._api || !this._api.isConnected) {\r\n      throw new Error(`Not connected to the WS RPC. Please call 'connect' method first.`)\r\n    }\r\n    return this._api\r\n  }\r\n\r\n  get ss58Prefix() {\r\n    return this._ss58Prefix\r\n  }\r\n\r\n  get coin() {\r\n    return this._coin\r\n  }\r\n\r\n  async connect(wsEndpoint: string, options?: ConnectToSubstrateOptions) {\r\n    try {\r\n      new URL(wsEndpoint) // just to test it in a quick way\r\n    } catch {\r\n      throw new Error(`Invalid WS RPC URL: ${wsEndpoint}`)\r\n    }\r\n\r\n    const polkadotApi = getPolkadotApi()\r\n\r\n    const definitions = options?.uniqueRpcDefinitionsName\r\n      ? rpcDefinitions[options?.uniqueRpcDefinitionsName]\r\n      : rpcDefinitions.unique\r\n\r\n    this._api = new polkadotApi.ApiPromise({\r\n      provider: new polkadotApi.WsProvider(wsEndpoint),\r\n      rpc: {\r\n        unique: definitions\r\n      },\r\n    })\r\n\r\n    if (!options?.dontAwaitApiIsReady) {\r\n      await this._api.isReady\r\n\r\n      this._coin = new Coin({\r\n        symbol: this._api.registry.chainTokens[0],\r\n        decimals: this._api.registry.chainDecimals[0],\r\n        weiSymbol: 'wei'\r\n      })\r\n\r\n      this._ss58Prefix = this._api.registry.chainSS58 || 42\r\n    }\r\n\r\n    return this\r\n  }\r\n\r\n  async disconnect() {\r\n    if (this._api?.isConnected) {\r\n      await this._api?.disconnect()\r\n    }\r\n    return this\r\n  }\r\n\r\n\r\n  getApi() {\r\n    return this._api\r\n  }\r\n\r\n  get isConnected(): boolean {\r\n    return this._api?.isConnected || false\r\n  }\r\n\r\n  transferCoins(params: ExtrinsicTransferCoinsParams, options?: ExtrinsicTransferCoinsOptions) {\r\n    return new ExtrinsicTransferCoins(this.api, params, options)\r\n  }\r\n\r\n  createTransactionFromRawTx(tx: SubmittableExtrinsic, options?: ExtrinsicOptions) {\r\n    return new TransactionFromRawTx(this.api, tx, options)\r\n  }\r\n\r\n  async getBalance(address: string): Promise<bigint> {\r\n    const result = await this.api.query.system.account(address)\r\n    try {\r\n      return BigInt((result as any).data.free.toString())\r\n    } catch (err) {\r\n      throw new Error(`Cannot cast account result to free balance`)\r\n    }\r\n  }\r\n\r\n  async getChainProperties() {\r\n    const result = (await this.api.rpc.system.properties()).toHuman()\r\n    return result\r\n  }\r\n}\r\n","import {ISubmittableResult, ApiPromise} from '../../../types'\r\nimport {StringUtils} from '../../../utils'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\nimport {ExtrinsicError} from '../../../utils/errors'\r\n\r\nimport {CollectionParams} from \"./types\";\r\n\r\nexport interface ExtrinsicCreateCollectionParams {\r\n  collection: CollectionParams\r\n}\r\n\r\nexport interface ExtrinsicCreateCollectionResult extends ExtrinsicResult {\r\n  collectionId: number\r\n}\r\n\r\nexport class ExtrinsicCreateCollection extends AbstractExtrinsic<ExtrinsicCreateCollectionParams, ExtrinsicCreateCollectionResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicCreateCollectionParams, options?: ExtrinsicOptions) {\r\n    const collection = JSON.parse(JSON.stringify(params.collection))\r\n\r\n    if (!collection.mode) {\r\n      collection.mode = {nft: null}\r\n    }\r\n\r\n    for (const fieldName of ['name', 'description', 'tokenPrefix']) {\r\n      ;(collection as any)[fieldName] = StringUtils.str2vec((collection as any)[fieldName])\r\n    }\r\n\r\n    const tx = api.tx.unique.createCollectionEx(collection)\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'common', 'CollectionCreated')\r\n\r\n    const collectionId = (!!data && parseInt(data[0].toString(), 10)) || null\r\n\r\n    if (!collectionId) {\r\n      throw new ExtrinsicError(txResult, 'No collection id found')\r\n    }\r\n\r\n    return {\r\n      ...result,\r\n      collectionId,\r\n    }\r\n  }\r\n}\r\n","import {Address} from '../../../utils'\r\n\r\nimport {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\nexport interface ExtrinsicAddCollectionAdminParams {\r\n  collectionId: number\r\n  newAdminAddress: string\r\n}\r\n\r\nexport interface ExtrinsicAddCollectionAdminResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicAddCollectionAdmin extends AbstractExtrinsic<ExtrinsicAddCollectionAdminParams, ExtrinsicAddCollectionAdminResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicAddCollectionAdminParams, options?: ExtrinsicOptions) {\r\n\r\n    const tx = api.tx.unique.addCollectionAdmin(params.collectionId, Address.to.crossAccountId(params.newAdminAddress))\r\n\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'CollectionAdminAdded')\r\n\r\n    const isSuccess = !!data && !isNaN((parseInt(data[0].toString(), 10)))\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import { Address } from '../../../utils'\r\n\r\nimport {ISubmittableResult, ApiPromise} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\nexport interface ExtrinsicRemoveCollectionAdminParams {\r\n  collectionId: number\r\n  adminAddress: string\r\n}\r\n\r\nexport interface ExtrinsicRemoveCollectionAdminResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicRemoveCollectionAdmin extends AbstractExtrinsic<ExtrinsicRemoveCollectionAdminParams, ExtrinsicRemoveCollectionAdminResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicRemoveCollectionAdminParams, options?: ExtrinsicOptions) {\r\n\r\n    const tx = api.tx.unique.removeCollectionAdmin(params.collectionId, Address.to.crossAccountId(params.adminAddress))\r\n\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'CollectionAdminRemoved')\r\n\r\n    const isSuccess = !!data && !isNaN((parseInt(data[0].toString(), 10)))\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\nexport interface ExtrinsicSetCollectionSponsorParams {\r\n  collectionId: number\r\n  newSponsorAddress: string\r\n}\r\n\r\nexport interface ExtrinsicSetCollectionSponsorResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicSetCollectionSponsor extends AbstractExtrinsic<ExtrinsicSetCollectionSponsorParams, ExtrinsicSetCollectionSponsorResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicSetCollectionSponsorParams, options?: ExtrinsicOptions) {\r\n    const tx = api.tx.unique.setCollectionSponsor(params.collectionId, params.newSponsorAddress)\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'CollectionSponsorSet')\r\n\r\n    const isSuccess = !!data && !isNaN((parseInt(data[0].toString(), 10)))\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess\r\n    }\r\n  }\r\n}\r\n","import {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\n\r\nexport interface ExtrinsicConfirmSponsorshipParams {\r\n  collectionId: number\r\n}\r\n\r\nexport interface ExtrinsicConfirmSponsorshipResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicConfirmSponsorship extends AbstractExtrinsic<ExtrinsicConfirmSponsorshipParams, ExtrinsicConfirmSponsorshipResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicConfirmSponsorshipParams, options?: ExtrinsicOptions) {\r\n    const tx = api.tx.unique.confirmSponsorship(params.collectionId)\r\n\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'SponsorshipConfirmed')\r\n\r\n    const isSuccess = !!data && !isNaN((parseInt(data[0].toString(), 10)))\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\n\r\nexport interface ExtrinsicChangeCollectionOwnerParams {\r\n  collectionId: number\r\n  newOwnerAddress: string\r\n}\r\n\r\nexport interface ExtrinsicChangeCollectionOwnerResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicChangeCollectionOwner extends AbstractExtrinsic<ExtrinsicChangeCollectionOwnerParams, ExtrinsicChangeCollectionOwnerResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicChangeCollectionOwnerParams, options?: ExtrinsicOptions) {\r\n    const tx = api.tx.unique.changeCollectionOwner(params.collectionId, params.newOwnerAddress)\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'CollectionOwnedChanged')\r\n\r\n    const isSuccess = !!data && !isNaN((parseInt(data[0].toString(), 10)))\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\n\r\nexport interface ExtrinsicRemoveCollectionSponsorParams {\r\n  collectionId: number\r\n}\r\n\r\nexport interface ExtrinsicRemoveCollectionSponsorResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicRemoveCollectionSponsor extends AbstractExtrinsic<ExtrinsicRemoveCollectionSponsorParams, ExtrinsicRemoveCollectionSponsorResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicRemoveCollectionSponsorParams, options?: ExtrinsicOptions) {\r\n    const tx = api.tx.unique.removeCollectionSponsor(params.collectionId)\r\n\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'CollectionSponsorRemoved')\r\n\r\n    const isSuccess = !!data && !isNaN((parseInt(data[0].toString(), 10)))\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {Address} from '../../../utils'\r\n\r\nimport {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\n\r\nexport interface ExtrinsicRemoveFromAllowListParams {\r\n  collectionId: number\r\n  address: string\r\n}\r\n\r\nexport interface ExtrinsicRemoveFromAllowListResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicRemoveFromAllowList extends AbstractExtrinsic<ExtrinsicRemoveFromAllowListParams, ExtrinsicRemoveFromAllowListResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicRemoveFromAllowListParams, options?: ExtrinsicOptions) {\r\n    const tx = api.tx.unique.removeFromAllowList(params.collectionId, Address.to.crossAccountId(params.address))\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'AllowListAddressRemoved')\r\n\r\n    const isSuccess = !!data &&\r\n      !isNaN((parseInt(data[0].toString(), 10))) &&\r\n      !!data[1].toString()\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {Address} from '../../../utils'\r\n\r\nimport {ApiPromise, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\n\r\n\r\nexport interface ExtrinsicAddToAllowListParams {\r\n  collectionId: number\r\n  address: string\r\n}\r\n\r\nexport interface ExtrinsicAddToAllowListResult extends ExtrinsicResult {\r\n  isSuccess: boolean\r\n}\r\n\r\nexport class ExtrinsicAddToAllowList extends AbstractExtrinsic<ExtrinsicAddToAllowListParams, ExtrinsicAddToAllowListResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicAddToAllowListParams, options?: ExtrinsicOptions) {\r\n    const tx = api.tx.unique.addToAllowList(params.collectionId, Address.to.crossAccountId(params.address))\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'unique', 'AllowListAddressAdded')\r\n\r\n    const isSuccess = !!data &&\r\n      !isNaN((parseInt(data[0].toString(), 10))) &&\r\n      !!data[1].toString()\r\n\r\n    return {\r\n      ...result,\r\n      isSuccess,\r\n    }\r\n  }\r\n}\r\n","import {Address, UniqueUtils} from \"../../../utils\";\r\nimport {CrossAccountId, PropertiesArray} from \"../../../types\";\r\n\r\nexport type TokenToMint = {\r\n  owner: CrossAccountId\r\n  properties: PropertiesArray\r\n}\r\n\r\nexport const validateAndFixTokenOwner = (token: TokenToMint): TokenToMint => {\r\n  let owner = Address.is.crossAccountId(token.owner) ? token.owner : null\r\n\r\n  if (owner === null) {\r\n    if (typeof token.owner !== 'string') {\r\n      throw new Error(`create token: owner should be valid object or string, got ${typeof token.owner}: ${token.owner}`)\r\n    }\r\n    if (UniqueUtils.Address.is.ethereumAddress(token.owner)) {\r\n      owner = {Ethereum: token.owner}\r\n    } else if (UniqueUtils.Address.is.substrateAddress(token.owner)) {\r\n      owner = {Substrate: token.owner}\r\n    } else {\r\n      throw new Error(`create token: owner should be valid ethereum or substrate address, got \"${token.owner}\"`)\r\n    }\r\n  }\r\n\r\n  return {\r\n    ...token,\r\n    owner\r\n  }\r\n}\r\n","import {ApiPromise, CrossAccountId, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\nimport {ExtrinsicError} from '../../../utils/errors'\r\nimport {TokenToMint, validateAndFixTokenOwner} from \"./utils\";\r\n\r\nexport interface ExtrinsicCreateNftTokenParams {\r\n  collectionId: number\r\n  token: TokenToMint\r\n}\r\n\r\nexport interface ExtrinsicCreateNftTokenResult extends ExtrinsicResult {\r\n  collectionId: number\r\n  tokenId: number\r\n  owner: CrossAccountId\r\n}\r\n\r\nexport class ExtrinsicCreateNftToken extends AbstractExtrinsic<ExtrinsicCreateNftTokenParams, ExtrinsicCreateNftTokenResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicCreateNftTokenParams, options?: ExtrinsicOptions) {\r\n    const token = validateAndFixTokenOwner(JSON.parse(JSON.stringify(params.token)))\r\n\r\n    const tx = api.tx.unique.createItem(params.collectionId, token.owner, {NFT: {properties: token.properties}})\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const data = findEventDataBySectionAndMethod(txResult, 'common', 'ItemCreated')\r\n\r\n    if (!data) {\r\n      throw new Error(`No event common.ItemCreated found`)\r\n    }\r\n\r\n    const collectionId = parseInt(data[0].toString(), 10)\r\n    const tokenId = parseInt(data[1].toString(), 10)\r\n    const owner = data[2].toJSON() as CrossAccountId\r\n\r\n    if (!tokenId) {\r\n      throw new ExtrinsicError(txResult, 'No token id found')\r\n    }\r\n\r\n    return {\r\n      ...result,\r\n      collectionId,\r\n      tokenId,\r\n      owner,\r\n    }\r\n  }\r\n}\r\n","import {ApiPromise, CrossAccountId, ISubmittableResult} from '../../../types'\r\nimport {findEventDataBySectionAndMethod, findManyEventsDataBySectionAndMethod} from '../../extrinsicTools'\r\nimport {AbstractExtrinsic, ExtrinsicOptions, ExtrinsicResult, ExtrinsicSendOptions} from '../AbstractExtrinsic'\r\nimport {TokenToMint, validateAndFixTokenOwner} from \"./utils\";\r\n\r\n\r\nexport interface ExtrinsicCreateMultipleNftTokensParams {\r\n  collectionId: number\r\n  tokens: Array<TokenToMint>\r\n}\r\n\r\nexport interface ExtrinsicCreateMultipleNftTokensResult extends ExtrinsicResult {\r\n  tokens: Array<{ tokenId: number, owner: CrossAccountId }>\r\n}\r\n\r\nexport class ExtrinsicCreateMultipleNftTokens extends AbstractExtrinsic<ExtrinsicCreateMultipleNftTokensParams, ExtrinsicCreateMultipleNftTokensResult> {\r\n  constructor(api: ApiPromise, params: ExtrinsicCreateMultipleNftTokensParams, options?: ExtrinsicOptions) {\r\n    if (!Array.isArray(params.tokens)) {\r\n      throw new Error(`params.tokens should be an array`)\r\n    }\r\n    if (params.tokens.length > 100) {\r\n      throw new Error(`Minting multiple tokens: not more than 100 tokens at a time (got ${params.tokens.length} tokens)`)\r\n    }\r\n\r\n    const tokens = (JSON.parse(JSON.stringify(params.tokens)) as TokenToMint[])\r\n      .map(validateAndFixTokenOwner)\r\n\r\n    const tx = api.tx.unique.createMultipleItemsEx(params.collectionId, {NFT: tokens})\r\n    super(api, tx, params)\r\n  }\r\n\r\n  protected async processResult(txResult: ISubmittableResult, options: ExtrinsicSendOptions) {\r\n    const result = await this.getBaseResult(txResult, options)\r\n\r\n    const successData = findEventDataBySectionAndMethod(txResult, 'system', 'ExtrinsicSuccess')\r\n    const tokenDataElements = findManyEventsDataBySectionAndMethod(txResult, 'common', 'ItemCreated')\r\n\r\n    const tokens = tokenDataElements.map(data => {\r\n      const tokenId = (!!data && parseInt(data[1].toString(), 10))\r\n      const owner = (!!data && data[2].toJSON()) as CrossAccountId\r\n      return {tokenId, owner}\r\n    })\r\n\r\n    return {\r\n      ...result,\r\n      tokens,\r\n    }\r\n  }\r\n}\r\n","import {CrossAccountId} from \"../types\";\r\nimport {getEnumValues} from \"../tsUtils\";\r\nimport {bool} from \"@polkadot/types\";\r\n\r\nexport type InfixOrUrlOrCid =\r\n  { url: string, urlInfix?: undefined, ipfsCid?: undefined }\r\n  |\r\n  { urlInfix: string, url?: undefined, ipfsCid?: undefined }\r\n  |\r\n  { ipfsCid: string, url?: undefined, urlInfix?: undefined }\r\nexport type InfixOrUrlOrCidAndHash = InfixOrUrlOrCid & { hash?: string }\r\nexport const URL_TEMPLATE_INFIX = <const>'{infix}'\r\nexport type UrlTemplateString = `${string}${typeof URL_TEMPLATE_INFIX}${string}`\r\n\r\n\r\nexport enum AttributeType {\r\n  integer = \"integer\",        // number\r\n  float = \"float\",            // number\r\n  boolean = \"boolean\",        // number\r\n  timestamp = \"timestamp\",    // number // js, milliseconds from epoch\r\n  string = \"string\",          // string\r\n  url = \"url\",                // string\r\n  isoDate = \"isoDate\",        // string // ISO Date: YYYY-MM-DD\r\n  time = \"time\",              // string // 24h time: HH:mm:ss\r\n  colorRgba = \"colorRgba\",    // string // 'rrggbbaa'\r\n}\r\n\r\nexport const NumberAttributeTypes = [\r\n  AttributeType.integer, AttributeType.float, AttributeType.boolean, AttributeType.timestamp,\r\n]\r\nexport const IntegerAttributeTypes = [\r\n  AttributeType.integer, AttributeType.boolean, AttributeType.timestamp,\r\n]\r\nexport const StringAttributeTypes = [\r\n  AttributeType.string, AttributeType.url, AttributeType.isoDate, AttributeType.time, AttributeType.colorRgba,\r\n]\r\nexport const AttributeTypeValues = getEnumValues(AttributeType)\r\n\r\n\r\nexport type BoxedNumberWithDefault = {\r\n  _: number\r\n}\r\nexport type LocalizedStringWithDefault = {\r\n  _: string\r\n  [K: string]: string\r\n}\r\nexport type LocalizedStringOrBoxedNumberWithDefault = BoxedNumberWithDefault | LocalizedStringWithDefault\r\n\r\nexport interface AttributeSchema {\r\n  name: LocalizedStringWithDefault\r\n  optional?: boolean\r\n  isArray?: boolean\r\n  type: AttributeType\r\n  enumValues?: { [K: number]: LocalizedStringOrBoxedNumberWithDefault }\r\n}\r\n\r\ntype EncodedEnumAttributeValue = number | Array<number>\r\nexport type EncodedTokenAttributeValue =\r\n  number |\r\n  Array<number> |\r\n  LocalizedStringOrBoxedNumberWithDefault\r\n  | LocalizedStringOrBoxedNumberWithDefault[]\r\n\r\nexport interface EncodedTokenAttributes {\r\n  [K: number]: EncodedTokenAttributeValue\r\n}\r\n\r\nexport type CollectionAttributesSchema = {\r\n  [K: number]: AttributeSchema\r\n}\r\n\r\nexport enum COLLECTION_SCHEMA_NAME {\r\n  unique = 'unique',\r\n  old = '_old_',\r\n  ERC721Metadata = 'ERC721Metadata'\r\n}\r\n\r\nexport interface UniqueCollectionSchemaToCreate {\r\n  schemaName: COLLECTION_SCHEMA_NAME.unique\r\n  schemaVersion: string // semver\r\n\r\n  coverPicture: InfixOrUrlOrCidAndHash\r\n  coverPicturePreview?: InfixOrUrlOrCidAndHash\r\n\r\n  attributesSchemaVersion?: string\r\n  attributesSchema?: CollectionAttributesSchema\r\n\r\n  image: {\r\n    urlTemplate: UrlTemplateString\r\n  }\r\n\r\n  imagePreview?: {\r\n    urlTemplate?: UrlTemplateString\r\n  }\r\n\r\n  video?: {\r\n    urlTemplate?: UrlTemplateString\r\n  }\r\n\r\n  audio?: {\r\n    urlTemplate?: UrlTemplateString\r\n    format: string\r\n    isLossless?: boolean\r\n  }\r\n\r\n  spatialObject?: {\r\n    urlTemplate?: UrlTemplateString\r\n    format: string\r\n  }\r\n}\r\n\r\nexport type UniqueCollectionSchemaDecoded =\r\n  Omit<UniqueCollectionSchemaToCreate, 'schemaName' | 'coverPicture' | 'coverPicturePreview'>\r\n  & {\r\n  schemaName: COLLECTION_SCHEMA_NAME\r\n  collectionId: number\r\n  coverPicture: DecodedInfixOrUrlOrCidAndHash\r\n  coverPicturePreview?: DecodedInfixOrUrlOrCidAndHash\r\n  oldProperties?: {\r\n    _old_schemaVersion?: string\r\n    _old_offchainSchema?: string\r\n    _old_constOnChainSchema?: string\r\n    _old_variableOnChainSchema?: string\r\n  }\r\n}\r\n\r\ninterface IToken<GenericInfixUrlOrCidWithHash> {\r\n  name?: LocalizedStringWithDefault\r\n  description?: LocalizedStringWithDefault\r\n  image: GenericInfixUrlOrCidWithHash\r\n  imagePreview?: GenericInfixUrlOrCidWithHash\r\n  video?: GenericInfixUrlOrCidWithHash\r\n  audio?: GenericInfixUrlOrCidWithHash\r\n  spatialObject?: GenericInfixUrlOrCidWithHash\r\n}\r\n\r\nexport interface UniqueTokenToCreate extends IToken<InfixOrUrlOrCidAndHash> {\r\n  encodedAttributes?: EncodedTokenAttributes\r\n}\r\n\r\nexport type DecodedAttributes = {\r\n  [K: number]: {\r\n    name: LocalizedStringWithDefault\r\n    value: LocalizedStringOrBoxedNumberWithDefault | Array<LocalizedStringOrBoxedNumberWithDefault>\r\n    type: AttributeType\r\n    isArray: boolean\r\n    rawValue: EncodedTokenAttributeValue | string | Array<string>\r\n    isEnum: boolean\r\n  }\r\n}\r\n\r\nexport type DecodedInfixOrUrlOrCidAndHash = InfixOrUrlOrCidAndHash & { fullUrl: string | null }\r\n\r\nexport interface UniqueTokenDecoded extends IToken<DecodedInfixOrUrlOrCidAndHash> {\r\n  tokenId: number\r\n  collectionId: number\r\n  owner: CrossAccountId\r\n  nestingParentToken?: {\r\n    collectionId: number\r\n    tokenId: number\r\n  }\r\n  attributes: DecodedAttributes\r\n}\r\n\r\nexport type DecodingImageLinkOptions = {\r\n  imageUrlTemplate?: UrlTemplateString\r\n  dummyImageFullUrl?: string\r\n}\r\n","export * from './common-validators'\r\nexport * from './collection-validators'\r\nexport * from './token-validators'\r\nexport * from './constants'\r\n","export class Semver {\r\n  protected _major: number\r\n  protected _minor: number\r\n  protected _patch: number\r\n\r\n  constructor(semver: [number, number, number]) {\r\n    this._major = semver[0]\r\n    this._minor = semver[1]\r\n    this._patch = semver[2]\r\n  }\r\n\r\n  get major() {\r\n    return this._major\r\n  }\r\n\r\n  get minor() {\r\n    return this._minor\r\n  }\r\n\r\n  get patch() {\r\n    return this._patch\r\n  }\r\n\r\n  toString() {\r\n    return `${this.major}.${this.minor}.${this.patch}`\r\n  }\r\n\r\n  private static parseToArray(version: string): null | [number, number, number] {\r\n    if (typeof version !== \"string\") return null\r\n\r\n    const [main] = version.split('+')[0].split('-').map(i => i.split('.'))\r\n\r\n    const major = parseInt(main[0])\r\n\r\n    if (isNaN(major)) return null\r\n\r\n    const minor = parseInt(main[1])\r\n    const patch = parseInt(main[2])\r\n    return [major, isNaN(minor) ? 0 : minor, isNaN(patch) ? 0 : patch]\r\n  }\r\n\r\n  static fromString(version: string): Semver {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) throw new Error(`Semver.fromString: wrong version string value: \"${version}\"`)\r\n    return new Semver(parsed)\r\n  }\r\n\r\n  static isValid(version: string): boolean {\r\n    return typeof version === 'string' && Semver.parseToArray(version) !== null\r\n  }\r\n\r\n  isGteThan(version: string) {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) return false\r\n\r\n    if (this._major > parsed[0]) return true\r\n    if (this._major < parsed[0]) return false\r\n\r\n    if (this._minor > parsed[1]) return true\r\n    if (this._minor < parsed[1]) return false\r\n\r\n    return this._patch >= parsed[2]\r\n  }\r\n\r\n  isLessThan(version: string) {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) return false\r\n\r\n    if (this._major < parsed[0]) return true\r\n    if (this._major > parsed[0]) return false\r\n\r\n    if (this._minor < parsed[1]) return true\r\n    if (this._minor > parsed[1]) return false\r\n\r\n    return this._patch < parsed[2]\r\n  }\r\n\r\n  isEqual(version: string) {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) return false\r\n\r\n    return this._major === parsed[0] && this._minor === parsed[1] && this._patch === parsed[2]\r\n  }\r\n}\r\n","export const RGB_REGEX = /^#[A-Fa-f0-9]{6}$/\r\n\r\nexport const RGBA_REGEX = /^#[A-Fa-f0-9]{8}$/\r\n\r\nexport const LANG_REGEX = /^[a-z]{2}(-[A-Z]{2})?$/\r\n","import {ValidationError} from \"../../../utils/errors\";\r\nimport {TokenPropertyPermissionObject} from \"../../../substrate/extrinsics/unique/types\";\r\nimport {\r\n    BoxedNumberWithDefault,\r\n    InfixOrUrlOrCidAndHash,\r\n    LocalizedStringWithDefault,\r\n    URL_TEMPLATE_INFIX,\r\n    UrlTemplateString\r\n} from \"../../types\";\r\nimport {getKeys} from \"../../../tsUtils\";\r\nimport {Semver} from \"../../../utils/semver\";\r\nimport {LANG_REGEX} from \"./constants\";\r\n\r\nexport const isPlainObject = (obj: any, varName: string): obj is Object => {\r\n    if (typeof obj !== 'object')\r\n        throw new ValidationError(`${varName} is not an object, got ${typeof obj}: ${obj}`)\r\n    if (obj === null)\r\n        throw new ValidationError(`${varName} is a null, should be valid object`)\r\n    if (obj instanceof Map)\r\n        throw new ValidationError(`${varName} is a Map, should be plain object`)\r\n    if (obj instanceof Set)\r\n        throw new ValidationError(`${varName} is a Set, should be plain object`)\r\n    if (Array.isArray(obj))\r\n        throw new ValidationError(`${varName} is an array, should be plain object`)\r\n\r\n    return true\r\n}\r\n\r\nexport const validateNumber = (num: any, shouldBeInteger: boolean, varName: string): num is number => {\r\n    if (typeof num !== 'number' || isNaN(num)) {\r\n        throw new ValidationError(`${varName} is not a valid number, got ${num}`)\r\n    }\r\n    if (shouldBeInteger && num !== Math.round(num)) {\r\n        throw new ValidationError(`${varName} is not an integer number, got ${num}`)\r\n    }\r\n    return true\r\n}\r\n\r\nexport const validateAttributeKey = (num: string | number | symbol, varName: string): boolean => {\r\n    let isOk = false\r\n\r\n    if (typeof num === 'number') {\r\n        isOk = num === Math.round(num);\r\n    } else if (typeof num === 'string') {\r\n        const parsed = parseFloat(num);\r\n\r\n        isOk = !isNaN(parsed) && parsed === Math.round(parsed);\r\n    }\r\n\r\n    if (!isOk) {\r\n        throw new ValidationError(`${varName}[\"${String(num)}\"] is not a valid number key, got ${String(num)}`)\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nconst validateLangCode = (key: string | number | symbol, varName: string): boolean => {\r\n    if (typeof key !== 'string') {\r\n        throw new ValidationError(`${varName}: key ${String(key)} should be a string`)\r\n    }\r\n    if (!key.match(LANG_REGEX)) {\r\n        throw new ValidationError(`${varName} should be a valid Language code string (like 'co' or 'ca-ES'), got ${key}`)\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateURL = (url: string, varName: string): boolean => {\r\n    if (typeof url !== 'string') {\r\n        throw new ValidationError(`${varName} should be a string`)\r\n    }\r\n\r\n    try {\r\n        new URL(url)\r\n        return true\r\n    } catch (err) {\r\n        throw new ValidationError(`${varName} should be a valid URL, got ${url}`)\r\n    }\r\n}\r\n\r\nexport const validateAndParseSemverString = (str: string, varName: string): Semver => {\r\n    if (!Semver.isValid(str))\r\n        throw new ValidationError(`${varName} is not a valid semver string (passed ${str})`)\r\n\r\n    return Semver.fromString(str)\r\n}\r\n\r\nexport const validateLocalizedStringWithDefault = (dict: any, canHaveLocalization: boolean, varName: string): dict is LocalizedStringWithDefault => {\r\n    isPlainObject(dict, varName)\r\n\r\n    const keys = getKeys(dict)\r\n\r\n    if (keys.length === 0) {\r\n        throw new ValidationError(`${varName} is an empty object, should have at least one key`)\r\n    }\r\n\r\n    if (!dict.hasOwnProperty('_')) {\r\n        throw new ValidationError(`${varName} is doesn't contain field \"_\"`)\r\n    }\r\n\r\n    if (typeof dict._ !== 'string') {\r\n        throw new ValidationError(`${varName}._ is not a string`)\r\n    }\r\n\r\n    if (!canHaveLocalization && keys.length !== 1) {\r\n        throw new ValidationError(`${varName} cannot have localization strings, got object with keys [\"${keys.join('\", \"')}\"]`)\r\n    }\r\n\r\n    for (const key in dict) {\r\n        if (key === '_') continue\r\n\r\n        validateLangCode(key, `${varName}[\"${key}\"]`)\r\n        if (typeof dict[key] !== 'string') {\r\n            throw new ValidationError(`${varName}[\"${key}\"] should be a string, got ${typeof key}: ${key}`)\r\n        }\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateBoxedNumberWithDefault = (dict: BoxedNumberWithDefault, shouldBeInteger: boolean, varName: string): dict is BoxedNumberWithDefault => {\r\n    isPlainObject(dict, varName)\r\n\r\n    if (getKeys(dict).length === 0) {\r\n        throw new ValidationError(`${varName} is an empty object, should have at least one key`)\r\n    }\r\n\r\n    if (!dict.hasOwnProperty('_')) {\r\n        throw new ValidationError(`${varName} is doesn't contain field \"_\"`)\r\n    }\r\n\r\n    validateNumber(dict._, shouldBeInteger, `${varName}._`)\r\n\r\n    for (const key in dict) {\r\n        if (key === '_') continue\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateUrlTemplateString = (str: any, varName: string): str is UrlTemplateString => {\r\n    const prefix = `TemplateUrlString is not valid, ${varName}`\r\n    if (typeof str !== 'string')\r\n        throw new ValidationError(`${prefix} is not a string, got ${str}`)\r\n    if (str.indexOf(URL_TEMPLATE_INFIX) < 0)\r\n        throw new ValidationError(`${prefix} doesn't contain \"${URL_TEMPLATE_INFIX}\", got ${str}`)\r\n    return true\r\n}\r\n\r\nexport const validateUrlWithHashObject = (obj: any, varName: string): obj is InfixOrUrlOrCidAndHash => {\r\n    isPlainObject(obj, varName)\r\n\r\n    const keysAmount = ['urlInfix', 'url', 'ipfsCid']\r\n        .map(field => Number(typeof obj[field] === 'string'))\r\n        .reduce((prev, curr) => {\r\n            return prev + curr\r\n        }, 0)\r\n\r\n    if (keysAmount !== 1) {\r\n        throw new ValidationError(`${varName} should have one and only one of \"urlInfix\" or \"url\" or \"ipfsCid\" string fields, got ${JSON.stringify(obj)}`)\r\n    }\r\n\r\n    if (typeof obj.url === 'string') {\r\n        validateURL(obj.url, `${varName}.url`)\r\n    }\r\n\r\n    if (obj.hasOwnProperty('hash'))\r\n        validateFieldByType(obj, 'hash', 'string', false, varName)\r\n\r\n    return true\r\n}\r\n\r\nexport const validateFieldByType = <T extends object>(obj: T, key: keyof T, type: string, optional: boolean, varName: string): boolean => {\r\n    isPlainObject(obj, varName)\r\n\r\n    if (optional) {\r\n        if (obj.hasOwnProperty(key) && typeof obj[key] !== type) {\r\n            throw new ValidationError(`${varName}.${String(key)} is passed and not a ${type}, got ${typeof obj[key]}: ${obj[key]}`)\r\n        }\r\n    } else {\r\n        if (!obj.hasOwnProperty(key)) {\r\n            throw new ValidationError(`${varName}.${String(key)} not found in ${varName}`)\r\n        }\r\n        if (typeof obj[key] !== type) {\r\n            throw new ValidationError(`${varName}.${String(key)} should be a ${type}, got ${typeof obj[key]}: ${obj[key]}`)\r\n        }\r\n    }\r\n    return true\r\n}\r\n\r\nexport const validateSingleTokenPropertyPermission = (tpp: any, varName: string): tpp is TokenPropertyPermissionObject => {\r\n    isPlainObject(tpp, varName)\r\n    validateFieldByType(tpp, 'key', 'string', false, varName)\r\n\r\n    const permissionVarName = `${varName}.permission`\r\n\r\n    isPlainObject(tpp.permission, permissionVarName)\r\n\r\n    validateFieldByType(tpp.permission, 'mutable', 'boolean', false, permissionVarName)\r\n    validateFieldByType(tpp.permission, 'collectionAdmin', 'boolean', false, permissionVarName)\r\n    validateFieldByType(tpp.permission, 'tokenOwner', 'boolean', false, permissionVarName)\r\n\r\n    return true\r\n}\r\n\r\nexport const checkSafeFactory = <T extends (...args: any) => any>(fn: T) => {\r\n    const returnFn = (...params: Parameters<T>) => {\r\n        try {\r\n            return fn(...params as any)\r\n        } catch {\r\n            return false as ReturnType<T>\r\n        }\r\n    }\r\n    return returnFn as T\r\n}\r\n\r\nexport const validateUrlTemplateStringSafe = checkSafeFactory(validateUrlTemplateString)\r\n\r\nexport const validateURLSafe = checkSafeFactory(validateURL)\r\n\r\nexport const validateLocalizedStringWithDefaultSafe = checkSafeFactory(validateLocalizedStringWithDefault)","import {\r\n    AttributeSchema,\r\n    AttributeType,\r\n    AttributeTypeValues,\r\n    COLLECTION_SCHEMA_NAME,\r\n    CollectionAttributesSchema,\r\n    IntegerAttributeTypes,\r\n    NumberAttributeTypes,\r\n    StringAttributeTypes,\r\n    UniqueCollectionSchemaToCreate\r\n} from \"../../types\";\r\nimport {ValidationError} from \"../../../utils/errors\";\r\nimport {CollectionTokenPropertyPermissions} from \"../../../substrate/extrinsics/unique/types\";\r\nimport {\r\n    validateAndParseSemverString,\r\n    validateBoxedNumberWithDefault,\r\n    validateFieldByType,\r\n    validateLocalizedStringWithDefault,\r\n    validateSingleTokenPropertyPermission,\r\n    validateUrlTemplateString,\r\n    validateUrlWithHashObject,\r\n    isPlainObject,\r\n    validateNumber,\r\n    validateAttributeKey,\r\n} from \"./common-validators\";\r\nimport {RGB_REGEX, RGBA_REGEX} from \"./constants\";\r\n\r\nexport const validateValueVsAttributeType = (value: any, type: AttributeType, varName: string): value is typeof type => {\r\n    isPlainObject(value, varName)\r\n\r\n    if (NumberAttributeTypes.includes(type)) {\r\n        const shouldBeInteger = IntegerAttributeTypes.includes(type)\r\n        validateBoxedNumberWithDefault(value, shouldBeInteger, varName)\r\n        if (type === AttributeType.boolean && ![0, 1].includes(value._)) {\r\n            throw new ValidationError(`${varName}: should be a boolean integer: 0 or 1, got ${value._}`)\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n    if (StringAttributeTypes.includes(type)) {\r\n        const canHaveLocalization = type === AttributeType.string\r\n        validateLocalizedStringWithDefault(value, canHaveLocalization, varName)\r\n\r\n        if (type === AttributeType.isoDate && isNaN(new Date(value._).valueOf())) {\r\n            throw new ValidationError(`${varName}: should be a valid ISO Date (YYYY-MM-DD), got ${value._}`)\r\n        }\r\n\r\n        if (type === AttributeType.time && isNaN(new Date('1970-01-01T' + value._).valueOf())) {\r\n            throw new ValidationError(`${varName}: should be a valid time in (hh:mm or hh:mm:ss), got ${value._}`)\r\n        }\r\n\r\n        if (type === AttributeType.colorRgba && (!value._.match(RGB_REGEX) && !value._.match(RGBA_REGEX))) {\r\n            throw new ValidationError(`${varName}: should be a valid rgb or rgba color (like \"#ff00ff00\"), got ${value._}`)\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n    throw new ValidationError(`${varName}: unknown attribute type: ${type}`)\r\n}\r\n\r\nexport const validateAttributesSchemaSingleAttribute = (attr: AttributeSchema, varName: string): attr is AttributeSchema => {\r\n    isPlainObject(attr, varName)\r\n\r\n    validateLocalizedStringWithDefault(attr.name, true, `${varName}.name`)\r\n\r\n    if (attr.hasOwnProperty('optional') && typeof attr.optional !== 'boolean')\r\n        throw new ValidationError(`${varName}.optional should be boolean when passed, got ${typeof attr.optional}: ${attr.optional}`)\r\n\r\n    if (attr.hasOwnProperty('isArray') && typeof attr.isArray !== 'boolean') {\r\n        throw new ValidationError(`${varName}.optional should be boolean when passed, got ${typeof attr.optional}: ${attr.optional}`)\r\n    }\r\n\r\n    if (!AttributeTypeValues.includes(attr.type))\r\n        throw new ValidationError(`${varName}.type should be a valid attribute type, got ${typeof attr.type}: ${attr.type}`)\r\n\r\n    if (attr.hasOwnProperty('enumValues')) {\r\n        isPlainObject(attr.enumValues, `${varName}.enumValues`)\r\n\r\n        for (const key in attr.enumValues) {\r\n            const localVarName = `${varName}.enumValues[${key}]`\r\n            const intKey = parseInt(key)\r\n            validateNumber(intKey, true, localVarName)\r\n\r\n            validateValueVsAttributeType(\r\n                attr.enumValues[intKey],\r\n                attr.type,\r\n                localVarName\r\n            )\r\n        }\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateCollectionAttributesSchema = (attributes: any, varName: string): attributes is CollectionAttributesSchema => {\r\n    isPlainObject(attributes, varName)\r\n    for (const key in attributes) {\r\n        validateAttributeKey(key, varName)\r\n        validateAttributesSchemaSingleAttribute(attributes[key], `${varName}[\"${key}\"]`)\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateUniqueCollectionSchema = <C extends UniqueCollectionSchemaToCreate>(schema: any): schema is C => {\r\n    isPlainObject(schema, 'Passed collection schema')\r\n\r\n    if (schema.schemaName !== COLLECTION_SCHEMA_NAME.unique)\r\n        throw new ValidationError(`schemaName is not valid (passed ${schema.schemaName})`)\r\n\r\n    const schemaVersion = validateAndParseSemverString(schema.schemaVersion, 'schemaVersion')\r\n    if (!schemaVersion.isEqual('1.0.0')) {\r\n        throw new ValidationError(`collection schema has unsupported type: ${schemaVersion.toString()}`)\r\n    }\r\n\r\n    validateUrlWithHashObject(schema.coverPicture, 'coverPicture')\r\n\r\n    if (schema.hasOwnProperty('coverPicturePreview')) {\r\n        validateUrlWithHashObject(schema.coverPicturePreview, 'coverPicturePreview')\r\n    }\r\n\r\n    if (!schema.attributesSchemaVersion !== !schema.attributesSchema) {\r\n        throw new ValidationError(`\"attributesSchemaVersion\" and \"attributesSchema\" should both be filled or both empty`)\r\n    }\r\n\r\n    if (schema.attributesSchemaVersion && schema.attributesSchema) {\r\n        const attributesSchemaVersion = validateAndParseSemverString(\r\n            schema.attributesSchemaVersion,\r\n            'attributesSchemaVersion',\r\n        )\r\n\r\n        if (!attributesSchemaVersion.isEqual('1.0.0')) {\r\n            throw new ValidationError(`collection attributes schema has unsupported type: ${attributesSchemaVersion.toString()}`)\r\n        }\r\n\r\n        validateCollectionAttributesSchema(schema.attributesSchema, 'attributesSchema')\r\n    }\r\n\r\n    isPlainObject(schema.image, 'image')\r\n    validateUrlTemplateString(schema.image.urlTemplate, 'image')\r\n\r\n    if (schema.hasOwnProperty('imagePreview')) {\r\n        isPlainObject(schema.video, 'video')\r\n        validateUrlTemplateString(schema.video.urlTemplate, 'video')\r\n    }\r\n\r\n    if (schema.hasOwnProperty('video')) {\r\n        isPlainObject(schema.video, 'video')\r\n        validateUrlTemplateString(schema.video.urlTemplate, 'video')\r\n    }\r\n\r\n    if (schema.hasOwnProperty('audio')) {\r\n        isPlainObject(schema.audio, 'audio')\r\n        validateUrlTemplateString(schema.audio.urlTemplate, 'audio')\r\n\r\n        validateFieldByType(schema.audio, 'format', 'string', false, 'audio')\r\n        validateFieldByType(schema.audio, 'isLossless', 'boolean', true, 'audio')\r\n    }\r\n\r\n    if (schema.hasOwnProperty('spatialObject')) {\r\n        isPlainObject(schema.spatialObject, 'spatialObject')\r\n        validateUrlTemplateString(schema.spatialObject.urlTemplate, 'spatialObject')\r\n\r\n        validateFieldByType(schema.spatialObject, 'format', 'string', false, 'spatialObject')\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateCollectionTokenPropertyPermissions = (tpps: any, varName: string = 'tokenPropertyPermissions'): tpps is CollectionTokenPropertyPermissions => {\r\n    if (!Array.isArray(tpps))\r\n        throw new ValidationError(`${varName} should be an array, got ${typeof tpps}: ${tpps}`)\r\n\r\n    tpps.forEach((tpp, index) => {\r\n        validateSingleTokenPropertyPermission(tpp, `${varName}[${index}]`)\r\n    })\r\n\r\n    return true\r\n}","import {\r\n    AttributeSchema,\r\n    COLLECTION_SCHEMA_NAME,\r\n    UniqueCollectionSchemaDecoded,\r\n    UniqueCollectionSchemaToCreate\r\n} from \"../../types\";\r\nimport {getKeys} from \"../../../tsUtils\";\r\nimport {ValidationError} from \"../../../utils/errors\";\r\nimport {validateValueVsAttributeType} from \"./collection-validators\";\r\nimport {\r\n    validateAndParseSemverString,\r\n    validateLocalizedStringWithDefault,\r\n    validateUrlWithHashObject,\r\n    validateNumber,\r\n    isPlainObject,\r\n    validateAttributeKey,\r\n} from \"./common-validators\";\r\n\r\nconst validateAttributeEnumKey = (schema: AttributeSchema, num: number, varName: string) => {\r\n    validateNumber(num, true, varName)\r\n    const enumKeys = getKeys(schema.enumValues || {}).map(n => parseInt(n as any as string))\r\n    if (!enumKeys.includes(num)) {\r\n        throw new ValidationError(`${varName} value (${num}) not found in the attribute schema enum keys: [${enumKeys.join()}]`)\r\n    }\r\n}\r\nexport const validateUniqueToken = <T, C extends UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded>(token: any, collectionSchema: C): token is T => {\r\n    if (collectionSchema.schemaName !== COLLECTION_SCHEMA_NAME.unique) {\r\n        throw new ValidationError(`schemaName is not \"unique\" (passed ${collectionSchema.schemaName})`)\r\n    }\r\n    if (token.hasOwnProperty('name')) {\r\n        validateLocalizedStringWithDefault(token.name, true, 'token.name')\r\n    }\r\n    if (token.hasOwnProperty('description')) {\r\n        validateLocalizedStringWithDefault(token.description, true, 'token.description')\r\n    }\r\n\r\n    validateUrlWithHashObject(token.image, 'token.image')\r\n\r\n    if (token.hasOwnProperty('imagePreview')) {\r\n        validateUrlWithHashObject(token.imagePreview, 'token.imagePreview')\r\n    }\r\n\r\n    const schemaVersion = validateAndParseSemverString(collectionSchema.schemaVersion, 'collectionSchema.schemaVersion')\r\n\r\n    if (token.encodedAttributes && collectionSchema.attributesSchema) {\r\n        isPlainObject(token.encodedAttributes, 'token.encodedAttributes')\r\n\r\n        for (let key in collectionSchema.attributesSchema) {\r\n            const schema = collectionSchema.attributesSchema[key]\r\n\r\n            validateAttributeKey(key, 'token.encodedAttributes')\r\n            const varName = `token.encodedAttributes.${key}`\r\n\r\n            const attr = token.encodedAttributes[key]\r\n\r\n            if (!token.encodedAttributes.hasOwnProperty(key)) {\r\n                if (schema.optional) {\r\n                    continue\r\n                } else {\r\n                    throw new ValidationError(`${varName} should be provided, it's not optional attribute`)\r\n                }\r\n            }\r\n\r\n            if (schema.isArray && !Array.isArray(attr)) {\r\n                throw new ValidationError(`${varName} is not array, while schema requires an array`)\r\n            }\r\n            if (!schema.isArray && Array.isArray(attr)) {\r\n                throw new ValidationError(`${varName} is an array, while schema requires to be not an array`)\r\n            }\r\n\r\n            const attrs = schema.isArray ? attr : [attr]\r\n\r\n            if (schema.enumValues) {\r\n                attrs.forEach((num: any, index: number) => {\r\n                    validateAttributeEnumKey(schema, num, `${varName}[${index}]`)\r\n                })\r\n            } else {\r\n                attrs.forEach((attrElem: any, index: number) => {\r\n                    validateValueVsAttributeType(attrElem, schema.type, `${varName}[${index}]`)\r\n                })\r\n            }\r\n        }\r\n    }\r\n\r\n    if (collectionSchema.hasOwnProperty('video') && token.hasOwnProperty('video')) {\r\n        validateUrlWithHashObject(token.video, 'token.video')\r\n    }\r\n\r\n    if (collectionSchema.hasOwnProperty('audio') && token.hasOwnProperty('audio')) {\r\n        validateUrlWithHashObject(token.audio, 'token.audio')\r\n    }\r\n\r\n    if (collectionSchema.hasOwnProperty('spatialObject') && token.hasOwnProperty('spatialObject')) {\r\n        validateUrlWithHashObject(token.spatialObject, 'token.spatialObject')\r\n    }\r\n\r\n    return true\r\n}","import {UniqueCollectionSchemaDecoded, UniqueCollectionSchemaToCreate} from '../types'\r\nimport {\r\n  CollectionProperties,\r\n  CollectionTokenPropertyPermissions,\r\n  TokenPropertyPermissionObject\r\n} from '../../substrate/extrinsics/unique/types'\r\nimport {converters2Layers, decodeTokenUrlOrInfixOrCidWithHashField, DecodingResult} from '../schemaUtils'\r\nimport {getKeys} from '../../tsUtils'\r\nimport {validateCollectionTokenPropertyPermissions, validateUniqueCollectionSchema} from './validators'\r\nimport {PropertiesArray} from '../../types'\r\n\r\nexport const encodeCollectionSchemaToProperties = (schema: UniqueCollectionSchemaToCreate): CollectionProperties => {\r\n  validateUniqueCollectionSchema(schema)\r\n  return converters2Layers.objectToProperties(schema)\r\n}\r\n\r\nexport const unpackCollectionSchemaFromProperties = (properties: PropertiesArray): any => {\r\n  return converters2Layers.propertiesToObject(properties) as any\r\n}\r\n\r\nexport const decodeUniqueCollectionFromProperties = async (collectionId: number, properties: CollectionProperties): Promise<DecodingResult<UniqueCollectionSchemaDecoded>> => {\r\n  try {\r\n    const unpackedSchema: UniqueCollectionSchemaDecoded = unpackCollectionSchemaFromProperties(properties)\r\n    validateUniqueCollectionSchema(unpackedSchema)\r\n    unpackedSchema.collectionId = collectionId as number\r\n\r\n    if (unpackedSchema.coverPicture) {\r\n      unpackedSchema.coverPicture = decodeTokenUrlOrInfixOrCidWithHashField(unpackedSchema.coverPicture, unpackedSchema.image)\r\n    }\r\n    if (unpackedSchema.coverPicturePreview) {\r\n      unpackedSchema.coverPicturePreview = decodeTokenUrlOrInfixOrCidWithHashField(unpackedSchema.coverPicturePreview, unpackedSchema.image)\r\n    }\r\n    return {\r\n      result: unpackedSchema,\r\n      error: null,\r\n    }\r\n  } catch (e) {\r\n    return {\r\n      result: null,\r\n      error: e as Error,\r\n    }\r\n  }\r\n}\r\n\r\nconst generateDefaultTPPObjectForKey = (key: string): TokenPropertyPermissionObject => ({\r\n  key,\r\n  permission: {mutable: false, collectionAdmin: true, tokenOwner: false}\r\n})\r\n\r\nconst generateDefaultTPPsForInfixOrUrlOrCidAndHashObject = (permissions: CollectionTokenPropertyPermissions, prefix: string) => {\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.i`)) // url infix\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.c`)) // ipfs cid\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.u`)) // url\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.h`)) // hash\r\n}\r\n\r\nexport interface ICollectionSchemaToTokenPropertyPermissionsOptions {\r\n  overwriteTPPs?: CollectionTokenPropertyPermissions\r\n}\r\n\r\nexport const generateTokenPropertyPermissionsFromCollectionSchema = (schema: UniqueCollectionSchemaToCreate, options?: ICollectionSchemaToTokenPropertyPermissionsOptions): CollectionTokenPropertyPermissions => {\r\n  const permissions: CollectionTokenPropertyPermissions = [\r\n    generateDefaultTPPObjectForKey('n'), // name\r\n    generateDefaultTPPObjectForKey('d'), // description\r\n  ]\r\n\r\n  generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'i')     // image url, urlInfix, ipfsCid and hash (i.u, i.i, i.c, i.h)\r\n\r\n  if (schema.hasOwnProperty('imagePreview')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'p')    // imagePreview url, urlInfix, ipfsCid and hash (p.u, p.i, p.c, p.h)\r\n  }\r\n\r\n  if (schema.hasOwnProperty('video')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'v')    // video url, urlInfix, ipfsCid and hash (v.u, v.i, v.c, v.h)\r\n  }\r\n\r\n  if (schema.hasOwnProperty('audio')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'au')   // audio url, urlInfix, ipfsCid and hash (au.u, au.i, au.c, au.h)\r\n  }\r\n\r\n  if (schema.hasOwnProperty('spatialObject')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'so')   // spatialObject url, urlInfix, ipfsCid and hash (so.u, so.i, so.c, so.h)\r\n  }\r\n\r\n  if (schema.attributesSchema) {\r\n    getKeys(schema.attributesSchema).forEach(key => {\r\n      permissions.push(generateDefaultTPPObjectForKey(`a.${key}`))\r\n    })\r\n  }\r\n\r\n  if (options?.overwriteTPPs) {\r\n    const {overwriteTPPs} = options\r\n\r\n    if (!validateCollectionTokenPropertyPermissions(overwriteTPPs)) {\r\n      throw new Error(`overwriteTPPs are not valid`)\r\n    }\r\n\r\n    for (const tpp of overwriteTPPs) {\r\n      const index = permissions.findIndex(permission => permission.key === tpp.key)\r\n      if (index < 0) {\r\n        permissions.push(tpp)\r\n      } else {\r\n        permissions[index] = tpp\r\n      }\r\n    }\r\n  }\r\n\r\n  return permissions\r\n}\r\n","import {PropertiesArray} from '../types'\n\nimport {\n  DecodedInfixOrUrlOrCidAndHash,\n  InfixOrUrlOrCidAndHash,\n  URL_TEMPLATE_INFIX,\n  UrlTemplateString\n} from \"./types\";\nimport {safeJsonParseStringOrHexString} from \"../utils/address/stringUtils\";\n\nconst convert2LayerObjectToProperties = <T extends object>(obj: T, separator: string): PropertiesArray => {\n  if (typeof obj !== \"object\" || obj === null) {\n    throw new Error(`Object is not valid: ${obj}`)\n  }\n\n  const collectionProperties: PropertiesArray = []\n\n  for (let key in obj) {\n    const value = obj[key]\n    if (\n      typeof value === 'object' &&\n      !(value === null || value instanceof Map || value instanceof Set || Array.isArray(value))\n    ) {\n      for (let secondLevelKey in value) {\n        const secondLevelValue = value[secondLevelKey]\n        collectionProperties.push({\n          key: `${key}${separator}${secondLevelKey}`,\n          value: JSON.stringify(secondLevelValue)\n        })\n      }\n    } else {\n      collectionProperties.push({\n        key,\n        value: JSON.stringify(value)\n      })\n    }\n  }\n\n  return collectionProperties\n}\n\nexport const convertPropertyArrayTo2layerObject = <T extends object>(properties: PropertiesArray, separator: string): T => {\n  const obj: any = {}\n\n  for (let {key, value} of properties) {\n    const keyParts = key.split(separator)\n    const length = keyParts.length\n    if (length === 1) {\n      obj[key] = safeJsonParseStringOrHexString(value)\n    } else {\n      const [key, innerKey] = keyParts\n      if (typeof obj[key] !== 'object') {\n        obj[key] = {}\n      }\n      obj[key][innerKey] = safeJsonParseStringOrHexString(value)\n    }\n  }\n  return obj as T\n}\n\nconst SEPARATOR = '.'\n\nexport const converters2Layers = {\n  objectToProperties: <T extends object>(obj: T): PropertiesArray => {\n    return convert2LayerObjectToProperties(obj, SEPARATOR)\n  },\n  propertiesToObject: <T extends object>(arr: PropertiesArray): T => {\n    return convertPropertyArrayTo2layerObject(arr, SEPARATOR)\n  }\n}\n\nexport const decodeTokenUrlOrInfixOrCidWithHashField =  <U extends {urlTemplate?: UrlTemplateString}>(obj: InfixOrUrlOrCidAndHash, urlTemplateObj: U | undefined): DecodedInfixOrUrlOrCidAndHash => {\n  const result: DecodedInfixOrUrlOrCidAndHash = {\n    ...obj,\n    fullUrl: null\n  }\n\n  if (typeof obj.url === 'string') {\n    result.fullUrl = obj.url\n    return result\n  }\n\n  const urlTemplate = urlTemplateObj?.urlTemplate\n\n  if (typeof urlTemplate !== 'string' || urlTemplate.indexOf(URL_TEMPLATE_INFIX) < 0) {\n    if (typeof obj.ipfsCid === 'string') {\n      result.fullUrl = `ipfs://${obj.ipfsCid}`\n    }\n  } else {\n    if (typeof obj.urlInfix === 'string') {\n      result.fullUrl = urlTemplate.replace(URL_TEMPLATE_INFIX, obj.urlInfix)\n    } else if (typeof obj.ipfsCid === 'string') {\n      result.fullUrl = urlTemplate.replace(URL_TEMPLATE_INFIX, obj.ipfsCid)\n    }\n  }\n\n  return result\n}\n\nexport type DecodingResult<T> = {\n  result: T\n  error: null\n} | {\n  result: null\n  error: Error\n}\n","import {HumanizedNftToken, PropertiesArray} from '../../types'\nimport {\n  DecodedAttributes,\n  EncodedTokenAttributes,\n  InfixOrUrlOrCidAndHash, LocalizedStringOrBoxedNumberWithDefault, LocalizedStringWithDefault,\n  UniqueCollectionSchemaDecoded,\n  UniqueCollectionSchemaToCreate,\n  UniqueTokenDecoded,\n  UniqueTokenToCreate\n} from '../types'\nimport {validateLocalizedStringWithDefaultSafe, validateUniqueToken} from './validators'\nimport {getEntries} from '../../tsUtils'\nimport {CollectionProperties} from '../../substrate/extrinsics/unique/types'\nimport {\n  decodeTokenUrlOrInfixOrCidWithHashField,\n  DecodingResult\n} from \"../schemaUtils\";\nimport {UniqueUtils} from \"../../utils\";\nimport {safeJsonParseStringOrHexString} from \"../../utils/address/stringUtils\";\n\nconst addUrlObjectToTokenProperties = (properties: PropertiesArray, prefix: string, source: InfixOrUrlOrCidAndHash) => {\n  if (typeof source.urlInfix === 'string') {\n    properties.push({key: `${prefix}.i`, value: source.urlInfix})\n  } else if (typeof source.ipfsCid === 'string') {\n    properties.push({key: `${prefix}.c`, value: source.ipfsCid})\n  } else if (typeof source.url === 'string') {\n    properties.push({key: `${prefix}.u`, value: source.url})\n  }\n\n  if (typeof source.hash === 'string') {\n    properties.push({key: `${prefix}.h`, value: source.hash})\n  }\n}\n\nconst addKeyToTokenProperties = (properties: PropertiesArray, key: string, value: string | number | object) => {\n  let strValue = JSON.stringify(value)\n\n  properties.push({\n    key,\n    value: strValue\n  })\n}\n\nexport const encodeTokenToProperties = (token: UniqueTokenToCreate, schema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): PropertiesArray => {\n  validateUniqueToken(token, schema as UniqueCollectionSchemaToCreate)\n\n  const properties: PropertiesArray = []\n  if (token.name) addKeyToTokenProperties(properties, 'n', token.name)\n  if (token.description) addKeyToTokenProperties(properties, 'd', token.description)\n\n  if (token.encodedAttributes) {\n    for (const n in token.encodedAttributes) {\n      const value = token.encodedAttributes[n]\n      addKeyToTokenProperties(properties, `a.${n}`, value)\n    }\n  }\n\n  if (token.image) addUrlObjectToTokenProperties(properties, 'i', token.image)\n  if (schema.imagePreview && token.imagePreview) addUrlObjectToTokenProperties(properties, 'p', token.imagePreview)\n  if (schema.video && token.video) addUrlObjectToTokenProperties(properties, 'v', token.video)\n  if (schema.audio && token.audio) addUrlObjectToTokenProperties(properties, 'au', token.audio)\n  if (schema.spatialObject && token.spatialObject) addUrlObjectToTokenProperties(properties, 'so', token.spatialObject)\n\n  return properties\n}\n\nconst fillTokenFieldByKeyPrefix = <T extends UniqueTokenToCreate>(token: T, properties: PropertiesArray, prefix: string, tokenField: keyof T) => {\n  const keysMatchingPrefix = [`${prefix}.i`, `${prefix}.u`, `${prefix}.c`, `${prefix}.h`]\n  if (properties.some(({key}) => keysMatchingPrefix.includes(key))) token[tokenField] = {} as any\n\n  const field = token[tokenField] as any as InfixOrUrlOrCidAndHash\n\n  const urlInfixProperty = properties.find(({key}) => key === keysMatchingPrefix[0])\n  if (urlInfixProperty) field.urlInfix = urlInfixProperty.value\n\n  const urlProperty = properties.find(({key}) => key === keysMatchingPrefix[1])\n  if (urlProperty) field.url = urlProperty.value\n\n  const ipfsCidProperty = properties.find(({key}) => key === keysMatchingPrefix[2])\n  if (ipfsCidProperty) field.ipfsCid = ipfsCidProperty.value\n\n  const hashProperty = properties.find(({key}) => key === keysMatchingPrefix[3])\n  if (hashProperty) field.hash = hashProperty.value\n}\n\n\nexport const unpackEncodedTokenFromProperties = <T extends UniqueTokenToCreate>(properties: CollectionProperties, schema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): T => {\n  const token: T = {} as T\n\n  const nameProperty = properties.find(({key}) => key === 'n')\n  if (nameProperty) {\n    const parsedName = safeJsonParseStringOrHexString<LocalizedStringWithDefault>(nameProperty.value)\n    if (typeof parsedName !== 'string') {\n      token.name = parsedName\n    }\n  }\n\n  const descriptionProperty = properties.find(({key}) => key === 'd')\n  if (descriptionProperty) {\n    const parsedDescription = safeJsonParseStringOrHexString<LocalizedStringWithDefault>(descriptionProperty.value)\n    if (typeof parsedDescription !== 'string') {\n      token.description = parsedDescription\n    }\n  }\n\n  fillTokenFieldByKeyPrefix(token, properties, 'i', 'image')\n  fillTokenFieldByKeyPrefix(token, properties, 'p', 'imagePreview')\n  fillTokenFieldByKeyPrefix(token, properties, 'v', 'video')\n  fillTokenFieldByKeyPrefix(token, properties, 'au', 'audio')\n  fillTokenFieldByKeyPrefix(token, properties, 'so', 'spatialObject')\n\n  const attributeProperties = properties.filter(({key}) => key.startsWith('a.'))\n  if (attributeProperties.length) {\n    const attrs = {} as EncodedTokenAttributes\n\n    for (const attrProp of attributeProperties) {\n      const {key, value} = attrProp\n      const parsed = safeJsonParseStringOrHexString<any>(value)\n      const attributeKey = parseInt(key.split('.')[1] || '')\n\n      if (!isNaN(attributeKey) && schema.attributesSchema?.hasOwnProperty(attributeKey)) {\n        attrs[attributeKey] = parsed\n      }\n    }\n\n    token.encodedAttributes = attrs\n  }\n\n  return token\n}\n\n\nexport const decodeTokenFromProperties = async (collectionId: number, tokenId: number, rawToken: HumanizedNftToken, schema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): Promise<DecodingResult<UniqueTokenDecoded>> => {\n  const unpackedToken = unpackEncodedTokenFromProperties(rawToken.properties, schema)\n\n  console.log('UNPACKED TOKEN')\n  console.log(unpackedToken)\n\n  try {\n    validateUniqueToken(unpackedToken, schema)\n  } catch (e) {\n    return {\n      result: null,\n      error: e as Error,\n    }\n  }\n\n  const token: UniqueTokenDecoded = {\n    owner: rawToken.owner,\n    tokenId,\n    collectionId,\n    attributes: fullDecodeTokenAttributes(unpackedToken, schema),\n    image: decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.image, schema.image)\n  }\n  if (token.owner.Ethereum && UniqueUtils.Address.is.nestingAddress(token.owner.Ethereum)) {\n    token.nestingParentToken = UniqueUtils.Address.nesting.addressToIds(token.owner.Ethereum)\n  }\n\n  if (unpackedToken.name) token.name = unpackedToken.name\n  if (unpackedToken.description) token.description = unpackedToken.description\n\n  if (unpackedToken.imagePreview) {\n    token.imagePreview = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.imagePreview, schema.imagePreview)\n  }\n  if (unpackedToken.video) {\n    token.video = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.video, schema.video)\n  }\n  if (unpackedToken.audio) {\n    token.audio = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.audio, schema.audio)\n  }\n  if (unpackedToken.spatialObject) {\n    token.spatialObject = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.spatialObject, schema.spatialObject)\n  }\n\n  return {\n    result: token,\n    error: null,\n  }\n}\n\nexport const fullDecodeTokenAttributes = (token: UniqueTokenToCreate, collectionSchema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): DecodedAttributes => {\n  const attributes: DecodedAttributes = {}\n  if (!token.encodedAttributes) return {}\n\n  const entries = getEntries(token.encodedAttributes)\n  for (const entry of entries) {\n    const [key, rawValue] = entry\n\n    const schema = collectionSchema.attributesSchema?.[key]\n    if (!schema) continue\n\n    let value: any = rawValue\n\n    if (schema.enumValues) {\n      if (schema.isArray && Array.isArray(rawValue)) {\n        value = rawValue\n          .map(v => typeof v === 'number' ? schema.enumValues?.[v] : null)\n          .filter(v => !!v)\n      } else {\n        if (typeof rawValue === 'number') {\n          value = schema.enumValues[rawValue]\n        }\n      }\n    }\n\n    attributes[key] = {\n      name: schema.name,\n      value: value as LocalizedStringOrBoxedNumberWithDefault | Array<LocalizedStringOrBoxedNumberWithDefault>,\n      isArray: schema.isArray || false,\n      type: schema.type,\n      rawValue,\n      isEnum: !!schema.enumValues,\n    }\n  }\n  return attributes\n}\n","import {\r\n  AttributeSchema,\r\n  AttributeType,\r\n  COLLECTION_SCHEMA_NAME,\r\n  CollectionAttributesSchema,\r\n  DecodedAttributes,\r\n  DecodedInfixOrUrlOrCidAndHash,\r\n  DecodingImageLinkOptions,\r\n  LocalizedStringWithDefault,\r\n  UniqueCollectionSchemaDecoded,\r\n  UniqueTokenDecoded,\r\n  UrlTemplateString\r\n} from \"../types\";\r\nimport {validateURLSafe} from \"./validators\";\r\nimport {CollectionProperties} from \"../../substrate/extrinsics/unique/types\";\r\nimport {DecodingResult} from \"../schemaUtils\";\r\nimport {CrossAccountId, HumanizedNftToken} from \"../../types\";\r\nimport type {Message, Type} from 'protobufjs'\r\nimport {Root} from 'protobufjs'\r\nimport {ValidationError} from \"../../utils/errors\";\r\nimport {getEntries, getKeys, getValues, safeJSONParse} from \"../../tsUtils\";\r\nimport {StringUtils, UniqueUtils} from \"../../utils\";\r\n\r\n\r\nconst isOffchainSchemaAValidUrl = (offchainSchema: string | undefined): offchainSchema is string => {\r\n  return typeof offchainSchema === \"string\" &&\r\n    validateURLSafe(offchainSchema, 'offchainSchema') &&\r\n    offchainSchema.indexOf('{id}') >= 0\r\n}\r\n\r\nexport const decodeOldSchemaCollection = async (collectionId: number, properties: CollectionProperties, options: Required<DecodingImageLinkOptions>): Promise<DecodingResult<UniqueCollectionSchemaDecoded>> => {\r\n  const {imageUrlTemplate, dummyImageFullUrl} = options\r\n\r\n  const propObj = properties.reduce((acc, {key, value}) => {\r\n    acc[key] = value;\r\n    return acc\r\n  }, {} as Record<string, string>)\r\n\r\n  const offchainSchema: string | undefined = propObj._old_offchainSchema\r\n  const constOnchainSchema: string | undefined = propObj._old_constOnChainSchema\r\n  const schemaVersion: string | undefined = propObj._old_schemaVersion\r\n  const variableOnchainSchema: string | undefined = propObj._old_variableOnChainSchema\r\n\r\n  const offchainSchemaIsValidUrl = isOffchainSchemaAValidUrl(offchainSchema)\r\n\r\n  const schema: UniqueCollectionSchemaDecoded = {\r\n    schemaName: COLLECTION_SCHEMA_NAME.old,\r\n\r\n    collectionId,\r\n    coverPicture: {\r\n      url: dummyImageFullUrl,\r\n      fullUrl: null\r\n    },\r\n    image: {\r\n      urlTemplate: offchainSchemaIsValidUrl\r\n        ? offchainSchema.replace('{id}', '{infix}') as UrlTemplateString\r\n        : imageUrlTemplate\r\n    },\r\n\r\n    schemaVersion: '0.0.1',\r\n    attributesSchema: {},\r\n    attributesSchemaVersion: '1.0.0'\r\n  }\r\n\r\n  let parsedVariableOnchainSchema = null\r\n  try {\r\n    parsedVariableOnchainSchema = JSON.parse(variableOnchainSchema)\r\n  } catch {\r\n  }\r\n\r\n  if (parsedVariableOnchainSchema && typeof parsedVariableOnchainSchema === 'object' && typeof parsedVariableOnchainSchema.collectionCover === 'string') {\r\n    schema.coverPicture.ipfsCid = parsedVariableOnchainSchema.collectionCover\r\n    delete schema.coverPicture.url\r\n    schema.coverPicture.fullUrl = imageUrlTemplate.replace('{infix}', parsedVariableOnchainSchema.collectionCover)\r\n  } else if (offchainSchemaIsValidUrl) {\r\n    const coverUrl = offchainSchema.replace('{id}', '1')\r\n    schema.coverPicture.url = coverUrl\r\n    schema.coverPicture.fullUrl = coverUrl\r\n  }\r\n\r\n\r\n  let root: Root = {} as any\r\n  let NFTMeta: Type = {} as any\r\n  try {\r\n    root = Root.fromJSON(JSON.parse(constOnchainSchema))\r\n    NFTMeta = root.lookupType('onChainMetaData.NFTMeta')\r\n  } catch (err: any) {\r\n    return {\r\n      result: null,\r\n      error: err as Error,\r\n    }\r\n  }\r\n\r\n  const attributesSchema: CollectionAttributesSchema = {}\r\n\r\n  let i = 0;\r\n  for (const field of NFTMeta.fieldsArray) {\r\n    if (field.name === 'ipfsJson') {\r\n      continue\r\n    }\r\n\r\n    const options = !['string', 'number'].includes(field.type) && root.lookupEnum(field.type).options;\r\n\r\n    const parsedOptions: LocalizedStringWithDefault[] = options\r\n      ? getValues(options)\r\n        .map(v => safeJSONParse<{en: string | undefined}>(v))\r\n        .filter(v => typeof v !== 'string' && typeof v.en === 'string')\r\n        .map(v => {\r\n          const result: any = {...(v as any)}\r\n          if (typeof result._ === 'string') return result\r\n\r\n          result._ = result.en || result[getKeys(result)[0]] || undefined\r\n\r\n          if (typeof result._ !== 'string') return null\r\n\r\n          return result;\r\n        })\r\n        .filter(v => !!v)\r\n      : []\r\n\r\n    const attr: AttributeSchema = {\r\n      type: AttributeType.string,\r\n      name: {_: field.name},\r\n      isArray: field.repeated,\r\n      optional: !field.required,\r\n    }\r\n    if (parsedOptions.length) {\r\n      attr.enumValues = parsedOptions.reduce(\r\n        (acc, el, index) => {\r\n          acc[index] = el\r\n          return acc\r\n        },\r\n        {} as {[K: number]: LocalizedStringWithDefault}\r\n      )\r\n    }\r\n\r\n    attributesSchema[i++] = attr\r\n  }\r\n\r\n  schema.attributesSchema = attributesSchema\r\n  schema.attributesSchemaVersion = '1.0.0'\r\n\r\n  schema.oldProperties = {\r\n    _old_schemaVersion: schemaVersion,\r\n    _old_offchainSchema: offchainSchema,\r\n    _old_constOnChainSchema: constOnchainSchema,\r\n    _old_variableOnChainSchema: variableOnchainSchema,\r\n  }\r\n\r\n  return {result: schema, error: null}\r\n}\r\n\r\n//todo: replace rawToken type with humanized token after core team's fix\r\nexport const decodeOldSchemaToken = async (collectionId: number, tokenId: number, rawToken: { owner: any, properties: any[] }, schema: UniqueCollectionSchemaDecoded, options: Required<DecodingImageLinkOptions>): Promise<DecodingResult<UniqueTokenDecoded>> => {\r\n  const constOnchainSchema = schema.oldProperties?._old_constOnChainSchema\r\n\r\n  if (!constOnchainSchema) {\r\n    return {\r\n      result: null,\r\n      error: new ValidationError(`collection doesn't contain _old_constOnChainSchema field`)\r\n    }\r\n  }\r\n\r\n  let root: Root = {} as any\r\n  let NFTMeta: Type = {} as any\r\n  try {\r\n    root = Root.fromJSON(JSON.parse(constOnchainSchema))\r\n    NFTMeta = root.lookupType('onChainMetaData.NFTMeta')\r\n  } catch (err: any) {\r\n    return {\r\n      result: null,\r\n      error: err as Error,\r\n    }\r\n  }\r\n\r\n  if (!rawToken) {\r\n    return {\r\n      result: null,\r\n      error: new ValidationError(`parsing token with old schema: no token passed`)\r\n    }\r\n  }\r\n\r\n  const parsedToken: HumanizedNftToken = {\r\n    owner: rawToken.owner.toHuman() as CrossAccountId,\r\n    properties: rawToken.properties.map(property => {\r\n      return {\r\n        key: property.key.toHuman() as string,\r\n        value: property.value.toJSON() as string,\r\n        // valueH: property.value.toHuman() as string,\r\n      }\r\n    })\r\n  }\r\n\r\n  const constDataProp = parsedToken.properties.find(({key}) => key === '_old_constData')\r\n  if (!constDataProp) {\r\n    return {\r\n      result: null,\r\n      error: new ValidationError('no _old_constData property found')\r\n    }\r\n  }\r\n\r\n  const u8aToken = StringUtils.hexToU8a(constDataProp.value)\r\n  let tokenDecoded: Message<{}> = {} as any\r\n  let tokenDecodedHuman: Record<string, any> = {}\r\n  try {\r\n    tokenDecoded = NFTMeta.decode(u8aToken)\r\n    tokenDecodedHuman = tokenDecoded.toJSON()\r\n  } catch (err: any) {\r\n    return {\r\n      result: null,\r\n      error: err\r\n    }\r\n  }\r\n\r\n  const tokenAttributesResult: DecodedAttributes = {}\r\n\r\n  const entries = getEntries(tokenDecodedHuman)\r\n  let i = 0\r\n  for (const entry of entries) {\r\n    let [name, rawValue] = entry as [string, any]\r\n    if (name === 'ipfsJson') {\r\n      continue\r\n    }\r\n\r\n    let value = rawValue\r\n    let isArray = false\r\n    let isEnum = false\r\n\r\n    const field = tokenDecoded.$type.fields[name]\r\n\r\n    if (!['string', 'number'].includes(field.type)) {\r\n      const enumOptions = root.lookupEnum(field.type).options\r\n      isEnum = !!enumOptions;\r\n\r\n      if (field.rule === 'repeated' && Array.isArray(rawValue)) {\r\n        const parsedValues = rawValue\r\n          .map((v: any) => {\r\n            const parsed = safeJSONParse<any>(enumOptions?.[v] || v)\r\n            if (typeof parsed !== 'string') {\r\n              parsed._ = parsed.en\r\n              return parsed\r\n            } else {\r\n              return null\r\n            }\r\n          })\r\n          .filter(v => typeof v?._ === 'string')\r\n\r\n\r\n        value = parsedValues\r\n        isArray = true\r\n      } else {\r\n        value = safeJSONParse(enumOptions?.[rawValue] || rawValue)\r\n        if (typeof value !== 'string') {\r\n          value._ = value.en || getValues(value)[0]\r\n        }\r\n      }\r\n    }\r\n\r\n    if (field.type === 'string') value = {_:value}\r\n\r\n    tokenAttributesResult[i++] = {\r\n      name: {_: name},\r\n      type: field.type === 'number' ? AttributeType.float : AttributeType.string,\r\n      value,\r\n      isArray,\r\n      isEnum,\r\n      rawValue,\r\n    }\r\n  }\r\n\r\n\r\n  const schemaVersion = schema.oldProperties?._old_schemaVersion\r\n  const offchainSchema = schema.oldProperties?._old_offchainSchema\r\n\r\n\r\n  const {imageUrlTemplate, dummyImageFullUrl} = options\r\n\r\n  let image: DecodedInfixOrUrlOrCidAndHash = {\r\n    url: dummyImageFullUrl,\r\n    fullUrl: null,\r\n  }\r\n\r\n  let ipfsImageIsSet = false\r\n  if (schemaVersion === 'Unique') {\r\n    try {\r\n      const ipfsCid = JSON.parse(tokenDecodedHuman.ipfsJson).ipfs\r\n      image = {\r\n        ipfsCid,\r\n        fullUrl: imageUrlTemplate.replace('{infix}', ipfsCid)\r\n      }\r\n      ipfsImageIsSet = true\r\n    } catch {\r\n    }\r\n  }\r\n\r\n  if (!ipfsImageIsSet && isOffchainSchemaAValidUrl(offchainSchema)) {\r\n    image = {\r\n      urlInfix: tokenId.toString(),\r\n      fullUrl: offchainSchema.replace('{id}', tokenId.toString())\r\n    }\r\n  }\r\n\r\n  const decodedToken: UniqueTokenDecoded = {\r\n    collectionId,\r\n    tokenId,\r\n    owner: parsedToken.owner,\r\n    image,\r\n    attributes: tokenAttributesResult,\r\n  }\r\n\r\n  if (parsedToken.owner.Ethereum && UniqueUtils.Address.is.nestingAddress(parsedToken.owner.Ethereum)) {\r\n    decodedToken.nestingParentToken = UniqueUtils.Address.nesting.addressToIds(parsedToken.owner.Ethereum)\r\n  }\r\n\r\n  return {\r\n    result: decodedToken,\r\n    error: null,\r\n  }\r\n}\r\n","import {HumanizedNftToken, PropertiesArray, UpDataStructsTokenData} from \"../../types\";\nimport {DecodingResult} from \"../schemaUtils\";\nimport {\n  COLLECTION_SCHEMA_NAME,\n  DecodingImageLinkOptions,\n  UniqueCollectionSchemaDecoded,\n  UniqueTokenDecoded,\n  UrlTemplateString\n} from \"../types\";\nimport * as oldSchema from \"./oldSchemaDecoder\";\nimport * as collection from \"./collection\";\nimport {ValidationError} from \"../../utils/errors\";\nimport * as token from \"./token\";\nimport {validateUrlTemplateStringSafe} from \"./validators\";\nimport {safeJSONParse} from \"../../tsUtils\";\nimport {safeJsonParseStringOrHexString} from \"../../utils/address/stringUtils\";\n\nconst DEFAULT_IMAGE_URL_TEMPLATE: UrlTemplateString = `https://ipfs.unique.network/ipfs/{infix}`\nconst DEFAULT_DUMMY_IMAGE_FULL_URL = `https://ipfs.unique.network/ipfs/QmPCqY7Lmxerm8cLKmB18kT1RxkwnpasPVksA8XLhViVT7`\n\n\n\nconst parseImageLinkOptions = (options?: DecodingImageLinkOptions): Required<DecodingImageLinkOptions> => {\n  let imageUrlTemplate: UrlTemplateString = DEFAULT_IMAGE_URL_TEMPLATE\n  if (validateUrlTemplateStringSafe(options?.imageUrlTemplate, 'options.imageUrlTemplate')) {\n    imageUrlTemplate = options!.imageUrlTemplate\n  }\n\n  const dummyImageFullUrl = typeof options?.dummyImageFullUrl === 'string'\n    ? options.dummyImageFullUrl\n    : DEFAULT_DUMMY_IMAGE_FULL_URL\n\n  return {\n    imageUrlTemplate,\n    dummyImageFullUrl,\n  }\n}\n\n\n\nexport const universallyDecodeCollectionSchema = async (collectionId: number, properties: PropertiesArray, options?: DecodingImageLinkOptions): Promise<DecodingResult<UniqueCollectionSchemaDecoded>> => {\n  const schemaNameProp = properties.find(({key}) => key === 'schemaName')?.value || null\n  const schemaName = typeof schemaNameProp === 'string' ? safeJsonParseStringOrHexString<string>(schemaNameProp) : null\n  const isOldSchema = !!properties.find(({key}) => key === '_old_schemaVersion')\n\n  if (isOldSchema) {\n    const imageLinkOptions = parseImageLinkOptions(options)\n    return await oldSchema.decodeOldSchemaCollection(collectionId, properties, imageLinkOptions)\n  } else if (schemaName === COLLECTION_SCHEMA_NAME.unique) {\n    return await collection.decodeUniqueCollectionFromProperties(collectionId, properties)\n  }\n\n  return {\n    result: null,\n    error: new ValidationError(`Unknown collection schema`)\n  }\n}\n\nexport const universallyDecodeToken = async (collectionId: number, tokenId: number, rawToken: UpDataStructsTokenData, schema: UniqueCollectionSchemaDecoded, options?: DecodingImageLinkOptions): Promise<DecodingResult<UniqueTokenDecoded>> => {\n  if (!schema) {\n    return {\n      result: null,\n      error: new ValidationError('unable to parse: collection schema was not provided')\n    }\n  }\n  const humanizedToken: HumanizedNftToken = rawToken.toHuman() as HumanizedNftToken\n\n  if (schema.schemaName === COLLECTION_SCHEMA_NAME.unique) {\n    return await token.decodeTokenFromProperties(collectionId, tokenId, humanizedToken, schema)\n  } else if (schema.schemaName === COLLECTION_SCHEMA_NAME.old) {\n    const imageLinkOptions = parseImageLinkOptions(options)\n    return await oldSchema.decodeOldSchemaToken(collectionId, tokenId, rawToken, schema, imageLinkOptions)\n  }\n\n  return {\n    result: null,\n    error: new ValidationError(`unable to parse: collection schemaName is unknown (passed ${schema.schemaName}`)\n  }\n}\n","export * from './types'\r\nimport * as types from './types'\r\nimport * as validators from './tools/validators'\r\nimport * as collection from './tools/collection'\r\nimport * as token from './tools/token'\r\nimport * as oldSchema from './tools/oldSchemaDecoder'\r\nimport * as universal from './tools/universal'\r\n\r\nexport const SchemaTools = {\r\n  decode: {\r\n    collectionSchema: universal.universallyDecodeCollectionSchema,\r\n    token: universal.universallyDecodeToken\r\n  },\r\n  encodeUnique: {\r\n    collectionSchema: collection.encodeCollectionSchemaToProperties,\r\n    collectionTokenPropertyPermissions: collection.generateTokenPropertyPermissionsFromCollectionSchema,\r\n    token: token.encodeTokenToProperties,\r\n  },\r\n  tools: {\r\n    unique: {\r\n      collection,\r\n      token,\r\n      validators,\r\n    },\r\n    oldSchema,\r\n    universal,\r\n  },\r\n  types,\r\n}\r\n","import {Address} from '../utils'\r\nimport {ExtrinsicTransferCoinsOptions, ExtrinsicTransferCoinsParams} from \"./extrinsics/common/ExtrinsicTransferCoins\";\r\n\r\nimport {ExtrinsicOptions} from \"./extrinsics/AbstractExtrinsic\";\r\n\r\nimport {\r\n  ExtrinsicCreateCollection,\r\n  ExtrinsicCreateCollectionParams\r\n} from \"./extrinsics/unique/ExtrinsicCreateCollection\";\r\nimport {SubstrateCommon} from \"./SubstrateCommon\";\r\n\r\nimport {\r\n  ExtrinsicAddCollectionAdmin,\r\n  ExtrinsicAddCollectionAdminParams\r\n} from \"./extrinsics/unique/ExtrinsicAddCollectionAdmin\";\r\n\r\nimport {\r\n  ExtrinsicRemoveCollectionAdmin,\r\n  ExtrinsicRemoveCollectionAdminParams\r\n} from \"./extrinsics/unique/ExtrinsicRemoveCollectionAdmin\"\r\n\r\nimport {\r\n  ExtrinsicSetCollectionSponsor,\r\n  ExtrinsicSetCollectionSponsorParams\r\n} from './extrinsics/unique/ExtrinsicSetCollectionSponsor';\r\n\r\nimport {\r\n  ExtrinsicConfirmSponsorship,\r\n  ExtrinsicConfirmSponsorshipParams\r\n} from './extrinsics/unique/ExtrinsicConfirmSponsorship'\r\n\r\nimport {\r\n  ExtrinsicChangeCollectionOwner,\r\n  ExtrinsicChangeCollectionOwnerParams\r\n} from './extrinsics/unique/ExtrinsicChangeCollectionOwner'\r\n\r\nimport {\r\n  ExtrinsicRemoveCollectionSponsor,\r\n  ExtrinsicRemoveCollectionSponsorParams\r\n} from './extrinsics/unique/ExtrinsicRemoveCollectionSponsor'\r\n\r\nimport {\r\n  ExtrinsicRemoveFromAllowList,\r\n  ExtrinsicRemoveFromAllowListParams\r\n} from './extrinsics/unique/ExtrinsicRemoveFromAllowList'\r\n\r\nimport {ExtrinsicAddToAllowList, ExtrinsicAddToAllowListParams} from './extrinsics/unique/ExtrinsicAddToAllowList';\r\nimport {ExtrinsicCreateNftToken, ExtrinsicCreateNftTokenParams} from \"./extrinsics/unique/ExtrinsicCreateNftToken\";\r\nimport {\r\n  ExtrinsicCreateMultipleNftTokens,\r\n  ExtrinsicCreateMultipleNftTokensParams\r\n} from \"./extrinsics/unique/ExtrinsicCreateMultipleNftTokens\";\r\nimport {StringUtils} from \"../utils\";\r\nimport {SchemaTools, UniqueCollectionSchemaDecoded, UniqueTokenDecoded} from \"../schema\";\r\nimport {\r\n  CollectionLimits,\r\n  CollectionPermissions,\r\n  CollectionSponsorship,\r\n  CollectionTokenPropertyPermissions\r\n} from \"./extrinsics/unique/types\";\r\nimport {CrossAccountId, PropertiesArray,} from \"../types\";\r\nimport {ValidationError} from \"../utils/errors\";\r\nimport {Bytes} from \"@polkadot/types\";\r\nimport {DecodingResult} from \"../schema/schemaUtils\";\r\nimport {substrateNormalizedWithMirrorIfEthereum} from \"../utils/address/crossAccountId\";\r\n\r\ntype TokenOwner = { substrate: string, ethereum?: undefined } | { ethereum: string, substrate?: undefined }\r\n\r\nexport interface IGetCollectionOptions {\r\n  fetchAll?: boolean\r\n  fetchEffectiveLimits?: boolean\r\n  fetchAdmins?: boolean\r\n  fetchNextTokenId?: boolean\r\n}\r\n\r\nexport interface IGetTokenOptions {\r\n  uniqueSchema?: UniqueCollectionSchemaDecoded | null\r\n}\r\n\r\nexport type ParsedCollection = NonNullable<Awaited<ReturnType<SubstrateUnique['getCollection']>>>\r\nexport type ParsedToken = NonNullable<Awaited<ReturnType<SubstrateUnique['getToken']>>>\r\n\r\nexport interface ConnectToSubstrateOptions {\r\n  dontAwaitApiIsReady?: boolean\r\n}\r\n\r\nconst parseBytesToString = (bytes: Bytes): string => {\r\n  return Array.from(bytes.toU8a()).map(el => String.fromCharCode(el)).join('')\r\n}\r\n\r\nconst parseProperties = (rawProperties: PropertiesArray): PropertiesArray => {\r\n  return rawProperties.map(property => {\r\n    return {\r\n      key: StringUtils.hexStringToString(property.key),\r\n      value: StringUtils.hexStringToString(property.value)\r\n    }\r\n  })\r\n}\r\n\r\nconst parseTokenPropertyPermissions = (tokenPropertyPermissions: any): CollectionTokenPropertyPermissions => {\r\n  if (!Array.isArray(tokenPropertyPermissions)) {\r\n    return []\r\n  }\r\n  return tokenPropertyPermissions.map(tpp => {\r\n    return {\r\n      key: StringUtils.hexStringToString(tpp.key),\r\n      permission: tpp.permission\r\n    }\r\n  })\r\n}\r\n\r\n\r\nexport class SubstrateUnique extends SubstrateCommon {\r\n\r\n  //////////////////////////////////////////\r\n  // common methods\r\n  //////////////////////////////////////////\r\n\r\n  async getBalance(address: string): Promise<bigint> {\r\n    const substrateAddress = Address.to.substrateNormalizedOrMirrorIfEthereum(address)\r\n\r\n    return await super.getBalance(substrateAddress)\r\n  }\r\n\r\n  async getCollection(collectionId: number, options?: IGetCollectionOptions) {\r\n    const superRawCollection = await this.api.rpc.unique.collectionById(collectionId)\r\n    if (!superRawCollection) {\r\n      return null\r\n    }\r\n\r\n    const rawCollection = superRawCollection.toJSON() as any\r\n\r\n    const collection = {\r\n      id: collectionId,\r\n      collectionId,\r\n      owner: rawCollection.owner as string,\r\n      ownerNormalized: Address.normalize.substrateAddress(rawCollection.owner) as string,\r\n      mode: rawCollection.mode as string,\r\n      name: StringUtils.vec2str(rawCollection.name),\r\n      description: StringUtils.vec2str(rawCollection.description),\r\n      tokenPrefix: StringUtils.hexStringToString(rawCollection.tokenPrefix),\r\n      sponsorship: rawCollection.sponsorship as CollectionSponsorship,\r\n      limits: rawCollection.limits as CollectionLimits,\r\n      permissions: rawCollection.permissions as CollectionPermissions,\r\n      tokenPropertyPermissions: parseTokenPropertyPermissions(rawCollection.tokenPropertyPermissions),\r\n      properties: parseProperties(rawCollection.properties || []),\r\n      readOnly: rawCollection.readOnly as boolean,\r\n\r\n      effectiveLimits: null as CollectionLimits | null,\r\n      adminList: [] as Array<CrossAccountId>,\r\n      lastTokenId: null as number | null,\r\n\r\n      uniqueSchema: null as UniqueCollectionSchemaDecoded | null,\r\n      uniqueSchemaDecodingError: null as ValidationError | null,\r\n\r\n      get raw() {\r\n        return superRawCollection\r\n      },\r\n      get human() {\r\n        return superRawCollection.toHuman()\r\n      },\r\n    }\r\n\r\n    const uniqueSchema = await SchemaTools.decode.collectionSchema(collectionId, collection.properties)\r\n    collection.uniqueSchema = uniqueSchema.result\r\n    collection.uniqueSchemaDecodingError = uniqueSchema.error\r\n\r\n    if (options?.fetchAll || options?.fetchEffectiveLimits) {\r\n      collection.effectiveLimits = (await this.api.rpc.unique.effectiveCollectionLimits(collectionId)).toHuman() as CollectionLimits\r\n    }\r\n\r\n    if (options?.fetchAll || options?.fetchAdmins) {\r\n      collection.adminList = (await this.api.rpc.unique.adminlist(collectionId)).toHuman() as Array<CrossAccountId>\r\n    }\r\n\r\n    if (options?.fetchAll || options?.fetchNextTokenId) {\r\n      collection.lastTokenId = (await this.api.rpc.unique.lastTokenId(collectionId)).toNumber()\r\n    }\r\n\r\n    return collection\r\n  }\r\n\r\n  async getToken(collectionId: number, tokenId: number, options?: IGetTokenOptions) {\r\n    const superRawToken = await this.api.rpc.unique.tokenData(collectionId, tokenId)\r\n\r\n    if (!superRawToken || !superRawToken.owner) return null\r\n\r\n    const rawToken = superRawToken.toJSON() as { owner: TokenOwner, properties: PropertiesArray }\r\n\r\n    const owner: CrossAccountId = Address.extract.crossAccountIdFromObject(rawToken.owner)\r\n    const ownerNormalized: CrossAccountId = Address.extract.crossAccountIdFromObjectNormalized(rawToken.owner)\r\n\r\n    const uniqueToken: DecodingResult<UniqueTokenDecoded> = options?.uniqueSchema\r\n      ? await SchemaTools.decode.token(collectionId, tokenId, superRawToken, options?.uniqueSchema)\r\n      : {result: null, error: new ValidationError('token parsing: no schema passed')}\r\n\r\n    const token = {\r\n      collectionId,\r\n      tokenId,\r\n      owner,\r\n      ownerNormalized,\r\n      properties: parseProperties(rawToken.properties),\r\n      uniqueToken: uniqueToken.result,\r\n      uniqueTokenDecodingError: uniqueToken.error,\r\n      get raw() {\r\n        return superRawToken\r\n      },\r\n      get human() {\r\n        return superRawToken.toHuman()\r\n      },\r\n    }\r\n\r\n    return token\r\n  }\r\n\r\n\r\n  //////////////////////////////////////////\r\n  // common extrinsics\r\n  //////////////////////////////////////////\r\n\r\n  //@overrides because it eats ethereum address too\r\n  transferCoins(params: ExtrinsicTransferCoinsParams, options?: ExtrinsicTransferCoinsOptions) {\r\n    const toAddress = Address.to.substrateNormalizedOrMirrorIfEthereum(params.toAddress)\r\n    return super.transferCoins({...params, toAddress}, options)\r\n  }\r\n\r\n  //////////////////////////////////////////\r\n  // collection extrinsics\r\n  //////////////////////////////////////////\r\n\r\n  createCollection(params: ExtrinsicCreateCollectionParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicCreateCollection(this.api, params, options)\r\n  }\r\n\r\n  addCollectionAdmin(params: ExtrinsicAddCollectionAdminParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicAddCollectionAdmin(this.api, params, options)\r\n  }\r\n\r\n  removeCollectionAdmin(params: ExtrinsicRemoveCollectionAdminParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicRemoveCollectionAdmin(this.api, params, options)\r\n  }\r\n\r\n  setCollectionSponsor(params: ExtrinsicSetCollectionSponsorParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicSetCollectionSponsor(this.api, params, options)\r\n  }\r\n\r\n  confirmSponsorship(params: ExtrinsicConfirmSponsorshipParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicConfirmSponsorship(this.api, params, options)\r\n  }\r\n\r\n  changeCollectionOwner(params: ExtrinsicChangeCollectionOwnerParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicChangeCollectionOwner(this.api, params, options)\r\n  }\r\n\r\n  removeCollectionSponsor(params: ExtrinsicRemoveCollectionSponsorParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicRemoveCollectionSponsor(this.api, params, options)\r\n  }\r\n\r\n  addToAllowList(params: ExtrinsicAddToAllowListParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicAddToAllowList(this.api, params, options)\r\n  }\r\n\r\n  removeFromAllowList(params: ExtrinsicRemoveFromAllowListParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicRemoveFromAllowList(this.api, params, options)\r\n  }\r\n\r\n  //////////////////////////////////////////\r\n  // token extrinsics\r\n  //////////////////////////////////////////\r\n\r\n  createNftToken(params: ExtrinsicCreateNftTokenParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicCreateNftToken(this.api, params, options)\r\n  }\r\n\r\n  createMultipleNftTokens(params: ExtrinsicCreateMultipleNftTokensParams, options?: ExtrinsicOptions) {\r\n    return new ExtrinsicCreateMultipleNftTokens(this.api, params, options)\r\n  }\r\n}\r\n","import * as extrinsicTools from './extrinsicTools'\r\nimport * as extensionTools from './extensionTools'\r\nimport * as signerTools from './signerTools'\r\n\r\nimport {SubstrateCommon} from './SubstrateCommon'\r\nimport {SubstrateUnique} from './SubstrateUnique'\r\n\r\nexport const Substrate = {\r\n  Common: SubstrateCommon,\r\n  Unique: SubstrateUnique,\r\n  signer: signerTools,\r\n  extension: extensionTools,\r\n  tools: {\r\n    extrinsic: extrinsicTools\r\n  }\r\n}\r\nexport type {SubstrateCommon, SubstrateUnique}\r\n"],"mappings":";;;;;;;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;AACA;;;ACRO,IAAM,UAAU,CAAmB,MAAS,OAAO,KAAK,CAAC;AACzD,IAAM,YAAY,CAAmB,MAAS,OAAO,OAAO,CAAC;AAC7D,IAAM,aAAa,CAAmB,MAAS,OAAO,QAAQ,CAAC;AAU/D,IAAM,gBAAgB,CAAyB,OAA6B;AACjF,QAAM,MAAM,UAAU,EAAE;AACxB,SAAO,IAAI,MAAM,IAAI,SAAS,CAAC;AACjC;AAYO,IAAM,gBAAgB,CAAI,QAA4B;AAC3D,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAE;AACA,WAAO;AAAA,EACT;AACF;;;ADhBO,IAAM,iBAAiB;AAAA,EAC5B,MAAM,mBAAmB;AAAA,EACzB,QAAQ,qBAAqB;AAAA,EAC7B,QAAQ,qBAAqB;AAC/B;AAUA,IAAM,OAAa;AAAA,EACjB,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,eAAe;AACjB;AAOA,IAAM,qBAAkC,CAAC;AAEzC,oBAA2B,UAAuB,oBAAoB;AACpE,QAAM,YAAY,OAAO,WAAW;AAEpC,QAAM,aAAa,QAAQ;AAE3B,QAAM,UAAgB,QAAQ,IAAI,EAC/B,OAAO,CAAC,KAAK,QAAQ;AACpB,QAAI,OAAO;AACX,WAAO;AAAA,EACT,GAAG,CAAC,CAAS;AAEd;AAAA,IACC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpB,OAAO;AAAA,IACP,cAAc,CAAC,YAAY,MAAM,OAAO,OAAO;AAAA,IAC/C,cAAc,CAAC,YAAY,UAAU,OAAO,OAAO;AAAA,IACnD,cAAc,CAAC,YAAY,aAAa,OAAO,OAAO;AAAA,IACtD,CAAC,aAAc,cAAc,CAAC,YAAY,gBAAiB,OAAO,OAAO;AAAA,EAC3E,CAAC;AAOD,aAAW,OAAO,QAAQ,OAAO,GAAG;AAElC,QAAI,QAAQ;AAAM,WAAK,OAAO,QAAQ;AAAA,EACxC;AAEA,MAAI,KAAK,iBAAiB,QAAQ,iCAAiC,KAAK,cAAc,gBAAgB;AACpG,UAAM,KAAK,cAAc,WAAW,QAAQ,6BAA6B;AAAA,EAC3E;AACF;AAGA,IAAM,oBAAoB,CAAI,WAAqB,eAA0B;AAC3E,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,MAAM,iDAAiD;AAAA,EACzE;AACA,SAAO;AACT;AAEO,0BAA0B;AAC/B,SAAO,kBAAkB,KAAK,KAAK,eAAe;AACpD;AAEO,qBAA6B;AAClC,SAAO,kBAAkB,KAAK,QAAQ,QAAQ;AAChD;AAEO,8BAA8B;AACnC,SAAO,kBAAkB,KAAK,SAAS,mBAAmB;AAC5D;AAEO,iCAAiC;AACtC,SAAO,kBAAkB,KAAK,YAAY,uBAAuB;AACnE;AAEO,oCAAoC;AACzC,SAAO,kBAAkB,KAAK,eAAe,0BAA0B;AACzE;;;AEhHA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,iBAAiB;AACvB,IAAM,4BAA4B;AAElC,IAAM,SAAS;AAAA,EACpB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AACV;;;ACVA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,mBAA0B;AAAA,EACrC,iBAAiB;AAAA,EACjB,mBAAmB;AACrB;AACO,IAAM,kBAAwB;AAC9B,IAAM,6BAAmC;;;ACLhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAEA,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAExB,IAAM,SAAS,MAAM,eAAe;AACpC,IAAM,SAAS,MAAM,eAAe;;;ACRpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,UAAU,CAAC,QAAgC;AACtD,SAAO,IACJ,IAAI,OAAK,OAAO,aAAa,OAAO,MAAM,WAAW,IAAI,SAAS,GAAG,EAAE,CAAC,CAAC,EACzE,KAAK,EAAE;AACZ;AAEO,IAAM,UAAU,CAAC,QAAgB;AACtC,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,IAAI,MAAM,EAAE,EAAE,IAAI,OAAK,EAAE,WAAW,CAAC,CAAC;AAC/C;AAEO,IAAM,WAAW,CAAC,QAA4B,IAAI,WAAW,QAAQ,GAAG,CAAC;AAEzE,IAAM,WAAW,CAAC,cACvB,WAAW,KAAO,YAAU,WAAW,IAAI,IAAI,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,SAAS,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,SAAS,MAAM,EAAE,CAAC,CAAC;AAEnI,IAAM,WAAW,CAAC,UAAyC;AAChE,QAAM,MAAM,iBAAiB,aAAa,MAAM,KAAK,KAAK,IAAI;AAC9D,SAAO,OAAO,IAAI,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,GAAG,EAAE;AACtF;AAEO,IAAM,oBAAoB,CAAC,cAC9B,YAAU,WAAW,IAAI,IAAI,UAAU,MAAM,CAAC,IAAI,WAAW,MAAM,SAAS,KAAK,CAAC,GACjF,IAAI,QAAM,OAAO,aAAa,SAAS,IAAI,EAAE,CAAC,CAAC,EAC/C,KAAK,EAAE;AAGL,IAAM,iCAAiC,CAAU,sBAA0C;AAChG,MAAI;AACF,WAAO,KAAK,MAAM,iBAAiB;AAAA,EACrC,QAAE;AACA,WAAO,cAAiB,kBAAkB,iBAAiB,CAAC;AAAA,EAC9D;AACF;AAEO,IAAM,gCAAgC,CAAC,MAAuB;AACnE,QAAM,MAAe,OAAO,MAAM,WAAY,SAAS,GAAG,EAAE,IAAI;AAEhE,MAAI,MAAM,GAAG;AAAG,UAAM,IAAI,MAAM,yBAAyB,GAAG;AAC5D,MAAI,MAAM;AAAG,UAAM,IAAI,MAAM,iCAAiC,GAAG;AACjE,MAAI,MAAM;AAAY,UAAM,IAAI,MAAM,qCAAqC,GAAG;AAE9E,SAAO;AACT;AAEO,IAAM,iBAAiB;AAAA,EAC5B,YAAY,CAAC,MAAsB;AACjC,WAAO,8BAA8B,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EACtE;AAAA,EACA,UAAU,CAAC,MAAsB;AAC/B,UAAM,MAAc,SAAS,GAAG,EAAE;AAElC,QAAI,MAAM,GAAG;AAAG,YAAM,IAAI,MAAM,qCAAqC,GAAG;AAExE,WAAO;AAAA,EACT;AACF;;;ACvDA,IAAM,iCAAiC,CAAC,YAAoB;AAC1D,QAAM,OAAO,QAAQ,YAAY,EAAE,QAAQ,QAAQ,EAAE;AACrD,QAAM,cAAc,AAAO,SAAS,WAAW,IAAI,CAAC,EAAE,QAAQ,QAAQ,EAAE;AAExE,MAAI,kBAAkB;AAEtB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,uBAAoB,SAAS,YAAY,IAAI,EAAE,IAAI,IAC/C,KAAK,GAAG,YAAY,IACpB,KAAK;AAAA,EACX;AAEA,SAAO;AACT;AACO,IAAM,2BAA2B,CAAC,YAAoB;AAC3D,WAAS,gBAAgB,OAAO;AAChC,SAAO,+BAA+B,OAAO;AAC/C;AAGO,IAAM,2BAA2B,CAAC,UAA2C,aAAuD;AACzI,QAAM,QAAQ,OAAO,aAAa,WAC9B,WACE,SAA2B,YAAa,SAAiB;AAC/D,QAAM,QAAQ,OAAO,aAAa,WAC9B,WACE,SAA2B,YAAa,SAAiB;AAE/D,MAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,gBAAgB,KAAK,KAAK,CAAC,GAAG,gBAAgB,KAAK,GAAG;AAChF,WAAO;AAAA,EACT;AACA,SAAO,MAAM,YAAY,MAAM,MAAM,YAAY;AAEnD;AAEO,IAAM,2BAA2B,CAAC,iBAAwC;AAC/E,WAAS,aAAa,YAAY;AAClC,SAAO,+BACL,6BACA,AAAO,eAAe,WAAW,YAAY,CAC/C;AACF;AACO,IAAM,2BAA2B,CAAC,YAAmC;AAC1E,WAAS,kBAAkB,OAAO;AAClC,SAAO,AAAO,eAAe,SAAS,QAAQ,MAAM,EAAE,CAAC;AACzD;AAEO,IAAM,yCAAyC,CAAC,cAAsB,YAA4B;AACvG,WAAS,aAAa,YAAY;AAClC,WAAS,QAAQ,OAAO;AAExB,SAAO,+BACL,kBACA,AAAO,eAAe,WAAW,YAAY,IAC7C,AAAO,eAAe,WAAW,OAAO,CAC1C;AACF;AAEO,IAAM,yCAAyC,CAAC,YAA+D;AACpH,WAAS,eAAe,OAAO;AAC/B,SAAO;AAAA,IACL,cAAc,AAAO,eAAe,SAAS,QAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,IACnE,SAAS,AAAO,eAAe,SAAS,QAAQ,MAAM,EAAE,CAAC;AAAA,EAC3D;AACF;;;AC/DA,IAAM,cAAc,CAAC,KAAiB,QAA+B,OAAmB;AACtF,SAAO,QAAQ,KAAK,EAAC,MAAK,CAAC;AAC7B;AAEA,IAAM,YAAY,CAAC,SAA4C;AAC7D,MAAI,SAAS;AAEb,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAU,KAAK,GAAG;AAAA,EACpB;AAEA,QAAM,SAAS,IAAI,WAAW,MAAM;AAEpC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,WAAO,IAAI,KAAK,IAAI,MAAM;AAC1B,cAAU,KAAK,GAAG;AAAA,EACpB;AAEA,SAAO;AACT;AAGA,IAAM,cAAc,IAAI,WAAW,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AAE/D,IAAM,SAAS,CAAC,SAAiC;AAC/C,SAAO,YAAY,UAAU,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE;AACvD;AAEA,IAAM,uBAAuB,CAAC,YAA2D;AACvF,QAAM,aAAc,QAAQ,KAAK,KAAe,IAAI;AACpD,QAAM,cAAc,eAAe,IAC/B,QAAQ,KACN,SAAQ,KAAK,OAAS,IAAM,QAAQ,MAAM,IAAO,SAAQ,KAAK,OAAS;AAG7E,QAAM,cAAc,CAAC,KAAK,YAAY,KAAK,UAAU,EAAE,SAAS,QAAQ,MAAM;AAC9E,QAAM,SAAS,QAAQ,SAAU,eAAc,IAAI;AAGnD,QAAM,OAAO,OAAO,QAAQ,SAAS,GAAG,MAAM,CAAC;AAC/C,QAAM,UAAW,SAAQ,KAAK,SAAU,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,QAAQ,EAAE,KACxE,eACI,QAAQ,QAAQ,SAAS,OAAO,KAAK,MAAM,QAAQ,QAAQ,SAAS,OAAO,KAAK,KAChF,QAAQ,QAAQ,SAAS,OAAO,KAAK;AAG3C,SAAO,CAAC,SAAS,QAAQ,YAAY,WAAW;AAClD;AAEO,IAAM,4BAA4B,CAAC,SAAiB,SAAiB,OAAe;AACzF,SAAO,uBAAuB,uBAAuB,OAAO,EAAE,KAAK,MAAM;AAC3E;AAGO,gCAAiC,KAAmC,aAAqB,IAAY;AAC1G,QAAM,MAAkB,OAAO,QAAQ,WACnC,SAAS,GAAG,IACZ,OAAO,QAAQ,WACb,SAAS,IAAI,SAAS,EAAE,CAAC,IACzB;AAEN,MAAI,aAAa,KAAK,aAAa,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,UAAU,GAAG;AACzE,UAAM,IAAI,MAAM,qCAAqC,OAAO,eAAe,aAAa;AAAA,EAC1F;AAEA,QAAM,wBAAwB,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AACjD,MAAI,CAAC,sBAAsB,SAAS,IAAI,MAAM,GAAG;AAC/C,UAAM,IAAI,MAAM,qCAAqC,IAAI,4BAA4B,sBAAsB,KAAK,IAAI,GAAG;AAAA,EACzH;AAEA,QAAM,YAAY,aAAa,KAC3B,IAAI,WAAW,CAAC,UAAU,CAAC,IAC3B,IAAI,WAAW;AAAA,IACb,cAAa,QAAS,IAAK;AAAA,IAC5B,cAAc,IAAO,cAAa,MAAS;AAAA,EAC9C,CAAC;AAEH,QAAM,QAAQ,UAAU,CAAC,WAAW,GAAG,CAAC;AAExC,SAAO,OAAO,OACZ,UAAU;AAAA,IACR;AAAA,IACA,OAAO,KAAK,EAAE,SAAS,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,IAAI,MAAM,IAAI,IAAI,CAAC;AAAA,EACjE,CAAC,CACH;AACF;AAEO,gCAAiC,SAAiB,gBAA0B,aAAqB,IAAkC;AACxI,MAAI,YAA0B;AAE9B,MAAI;AACF,UAAM,UAAU,OAAO,OAAO,OAAO;AAErC,UAAM,wBAAwB,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE;AAE1D,QAAI,CAAC,sBAAsB,SAAS,QAAQ,MAAM,GAAG;AACnD,kBAAY,IAAI,MAAM,kDAAkD,QAAQ,4BAA4B,sBAAsB,KAAK,IAAI,GAAG;AAC9I,YAAM;AAAA,IACR;AAEA,UAAM,CAAC,SAAS,QAAQ,YAAY,eAAe,qBAAqB,OAAO;AAE/E,QAAI,CAAC,kBAAkB,CAAC,SAAS;AAC/B,kBAAY,IAAI,MAAM,kCAAkC;AACxD,YAAM;AAAA,IACR;AACA,QAAI,CAAC,CAAC,IAAI,WAAW,EAAE,SAAS,UAAU,GAAG;AAC3C,kBAAY,IAAI,MAAM,uBAAuB,wBAAwB,aAAa;AAClF,YAAM;AAAA,IACR;AAEA,UAAM,YAAY,QAAQ,MAAM,YAAY,MAAM;AAElD,UAAM,MAAM,SAAS,SAAS;AAC9B,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,QAAQ,OAAO,GAAG;AAAA,IACpB;AAAA,EACF,SAAS,OAAP;AACA,UAAM,YACF,YACA,IAAI,MAAM,YAAY,YAAa,MAAgB,SAAS;AAAA,EAClE;AACF;AAGO,IAAM,4BAA4B,CAAC,UAA2C,aAAuD;AAC1I,QAAM,QAAQ,OAAO,aAAa,WAC9B,WACE,SAA2B,aAAc,SAAiB;AAChE,QAAM,QAAQ,OAAO,aAAa,WAC9B,WACE,SAA2B,aAAc,SAAiB;AAEhE,MAAI,CAAC,SAAS,CAAC,OAAO;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,WAAW,uBAAuB,KAAK;AAC7C,UAAM,WAAW,uBAAuB,KAAK;AAC7C,WAAO,SAAS,WAAW,SAAS;AAAA,EACtC,SAAQ,GAAN;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,eAAe,CAAC,SAAiB,mBAAqC;AACjF,QAAM,YAAY,uBAAuB,SAAS,cAAc,EAAE,IAAI,SAAS,GAAG,EAAE;AACpF,SAAO,yBAAyB,SAAS,SAAS,CAAC;AACrD;AAGA,IAAM,iBAAiB,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;AAClD,IAAM,eAAe,CAAC,YAAoB,aAAqB,OAAe;AACnF,WAAS,gBAAgB,UAAU;AAEnC,QAAM,UAAU,UAAU,CAAC,gBAAgB,SAAS,UAAU,CAAC,CAAC;AAEhE,SAAO,uBAAuB,YAAY,OAAO,GAAG,UAAU;AAChE;;;ACpKO,IAAM,yCAAyC,CAAC,YAA4C;AACjG,MAAI,OAAO,YAAY,UAAU;AAC/B,QAAI,GAAG,uBAAuB,OAAO;AAAG,aAAO,UAAU,iBAAiB,QAAQ,SAAS;AAAA,aAClF,GAAG,oCAAoC,OAAO;AAAG,aAAO,UAAU,iBAAiB,QAAQ,SAAS;AAAA,aACpG,GAAG,sBAAsB,OAAO;AAAG,aAAO,yBAAyB,QAAQ,QAAQ;AAAA,aACnF,GAAG,mCAAmC,OAAO;AAAG,aAAO,yBAAyB,QAAQ,QAAQ;AAAA;AACpG,aAAO;AAAA,EACd;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,QAAI,GAAG,iBAAiB,OAAO;AAAG,aAAO,0BAA0B,OAAO;AAAA,aACjE,GAAG,gBAAgB,OAAO;AAAG,aAAO,yBAAyB,OAAO;AAAA;AACxE,aAAO;AAAA,EACd;AAEA,SAAO;AACT;AAEO,IAAM,qCAAqC,CAAC,YAAqC;AACtF,QAAM,SAAS,uCAAuC,OAAO;AAC7D,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,2DAA2D,KAAK,UAAU,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG;AAAA,EACpH;AACA,SAAO;AACT;AAEO,IAAM,0BAA0B,CAAC,YAAoC;AAC1E,MAAI,GAAG,iBAAiB,OAAO,GAAG;AAChC,WAAO,EAAC,WAAW,QAAO;AAAA,EAC5B,WAAW,GAAG,gBAAgB,OAAO,GAAG;AACtC,WAAO,EAAC,UAAU,QAAO;AAAA,EAC3B;AAEA,QAAM,IAAI,MAAM,kBAAkB,+CAA+C;AACnF;AAEO,IAAM,oCAAoC,CAAC,YAAoC;AACpF,MAAI,GAAG,iBAAiB,OAAO,GAAG;AAChC,WAAO,EAAC,WAAW,UAAU,iBAAiB,OAAO,EAAC;AAAA,EACxD,WAAW,GAAG,gBAAgB,OAAO,GAAG;AACtC,WAAO,EAAC,UAAU,UAAU,gBAAgB,OAAO,EAAC;AAAA,EACtD;AAEA,QAAM,IAAI,MAAM,kBAAkB,+CAA+C;AACnF;AAEO,IAAM,0CAA0C,CAAC,YAA4B;AAClF,QAAM,gBAAgB,wBAAwB,OAAO;AACrD,SAAO,cAAc,YACjB,0BAA0B,cAAc,SAAS,IACjD,OAAO,oBAAoB,cAAc,QAAkB;AACjE;;;ANrBA,IAAM,oBAAoB;AAQnB,IAAM,WAAW;AAAA,EACtB,kBAAkB,CAAC,YAAoB;AACrC,2BAAuB,OAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,CAAC,YAAoB;AACpC,QAAI,CAAC,GAAG,gBAAgB,OAAO,GAAG;AAChC,YAAM,IAAI,MAAM,YAAY,wCAAwC;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB,CAAC,YAAoB;AACtC,QAAI,CAAC,GAAG,kBAAkB,OAAO,GAAG;AAClC,YAAM,IAAI,MAAM,WAAW,qCAAqC;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAAA,EACA,gBAAgB,CAAC,YAAoB;AACnC,QAAI,CAAC,GAAG,eAAe,OAAO,GAAG;AAC/B,YAAM,IAAI,MAAM,WAAW,kCAAkC;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAAA,EACA,cAAc,CAAC,iBAAyB;AACtC,QAAI,CAAC,GAAG,aAAa,YAAY,GAAG;AAClC,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,WAAO;AAAA,EACT;AAAA,EACA,SAAS,CAAC,YAAoB;AAC5B,QAAI,CAAC,GAAG,QAAQ,OAAO,GAAG;AACxB,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAM,KAAK;AAAA,EAChB,kBAAkB,CAAC,YAA6B;AAC9C,QAAI;AACF,6BAAuB,OAAO;AAC9B,aAAO;AAAA,IACT,QAAE;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,iBAAiB,CAAC,YAA6B;AAC7C,WAAO,OAAO,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC,CAAC,QAAQ,MAAM,iBAAiB;AAAA,EAClG;AAAA,EAEA,mBAAmB,CAAC,YAA6B;AAC/C,WAAO,GAAG,gBAAgB,OAAO,KAAK,QAAQ,YAAY,EAAE,WAAW,0BAAyB;AAAA,EAClG;AAAA,EACA,gBAAgB,CAAC,YAA6B;AAC5C,WAAO,GAAG,gBAAgB,OAAO,KAAK,QAAQ,YAAY,EAAE,WAAW,eAAc;AAAA,EACvF;AAAA,EAEA,cAAc,CAAC,iBAAkC;AAC/C,WAAO,CAAE,QAAO,iBAAiB,YAAY,MAAM,YAAY,KAAK,eAAe,KAAK,eAAe;AAAA,EACzG;AAAA,EACA,SAAS,CAAC,YAA6B;AACrC,WAAO,CAAE,QAAO,YAAY,YAAY,MAAM,OAAO,KAAK,UAAU,KAAK,UAAU;AAAA,EACrF;AAAA,EAEA,eAAe,KAAiC;AAC9C,WAAO,GAAG,uBAAuB,GAAG,KAAK,GAAG,sBAAsB,GAAG;AAAA,EACvE;AAAA,EACA,4BAA4B,KAA8C;AACxE,WAAO,GAAG,oCAAoC,GAAG,KAAK,GAAG,mCAAmC,GAAG;AAAA,EACjG;AAAA,EACA,uBAAuB,KAAgC;AACrD,WAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,cAAc,YAAY,GAAG,iBAAiB,IAAI,SAAS;AAAA,EAC3G;AAAA,EACA,sBAAsB,KAAgC;AACpD,WAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,aAAa,YAAY,GAAG,gBAAgB,IAAI,QAAQ;AAAA,EACxG;AAAA,EACA,oCAAoC,KAA6C;AAC/E,WAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,cAAc,YAAY,GAAG,iBAAiB,IAAI,SAAS;AAAA,EAC3G;AAAA,EACA,mCAAmC,KAA6C;AAC9E,WAAO,OAAO,QAAQ,YAAY,OAAO,KAAK,aAAa,YAAY,GAAG,gBAAgB,IAAI,QAAQ;AAAA,EACxG;AACF;AAEO,IAAM,aAAc;AAAA,EACzB,aAAa;AAAA,EACb,aAAa;AACf;AACO,IAAM,UAAU;AAAA,EACrB,cAAc;AAAA,EACd,cAAc;AAChB;AACO,IAAM,KAAK;AAAA,EAChB,gBAAgB;AAAA,EAChB,0BAA0B;AAAA,EAC1B,uCAAuC;AACzC;AAEO,IAAM,UAAU;AAAA,EACrB,6BAA6B;AAAA,EAC7B,iCAAiC;AAAA,EACjC,0BAA0B,CAAC,QAA6B;AACtD,WAAO,wBAAwB,mCAAmC,GAAG,CAAC;AAAA,EACxE;AAAA,EACA,oCAAoC,CAAC,QAA6B;AAChE,WAAO,wBAAwB,mCAAmC,GAAG,CAAC;AAAA,EACxE;AACF;AAEO,IAAM,SAAS;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AACvB;AAEO,IAAM,YAAY;AAAA,EACvB,kBAAkB;AAAA,EAClB,iBAAiB;AACnB;AAEO,IAAM,UAAU;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AACrB;AAEO,IAAM,YAAY;AAAA,EACvB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAEO,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AOxLA,IAAM,cAAsB;AAE5B,IAAM,UAAU;AAAA,EACd,2BAA2B,CAAC,SAAmB;AAC7C,QAAI,OAAO,WAAW,aAAa;AACjC,UAAI,MAAM;AACR,eAAO;AAAA,MACT,OAAO;AACL,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAKO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF;;;ACxBA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,kBAAkB,YAAoC;AACjE,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,MAAI,CAAC,OAAO,UAAU;AACpB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AACA,MAAI,WAAqB,CAAC;AAC1B,MAAI;AACF,eAAW,MAAM,OAAO,SAAS,QAAQ,EAAC,QAAQ,sBAAqB,CAAC;AAAA,EAC1E,SAAS,KAAP;AACA,QAAI,IAAI,SAAS,MAAM;AAGrB,YAAM,IAAI,MAAM,eAAe;AAAA,IACjC;AACA,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAOO,IAAM,kBAAkB,YAA6C;AAC1E,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,UAAU;AACrD,WAAO,EAAC,gBAAgB,OAAO,UAAU,CAAC,EAAC;AAAA,EAC7C;AAEA,QAAM,WAAqB,MAAM,OAAO,SAAS,QAAQ,EAAC,QAAQ,eAAc,CAAC;AACjF,SAAO,EAAC,gBAAgB,MAAM,SAAQ;AACxC;;;AC/BO,IAAM,WAAW;AAAA,EACtB,WAAW;AACb;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAGxC,YAAY,UAA6B,YAAoB,OAAgB;AAC3E,QAAI,CAAC,OAAO;AACV,YAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,cAAQ,eAAe,MAAM,UAAU,MAAM;AAAA,IAC/C;AACA,UAAM,wBAAwB,cAAc,QAAQ,SAAS,QAAQ,KAAK;AAC1E,SAAK,WAAW;AAAA,EAClB;AACF;;;ADPA,IAAM,WAAW;AAAA,EACf,QAAQ,QAAwC;AAC9C,WAAO,OAAQ,OAAuB,SAAS;AAAA,EACjD;AAAA,EACA,iBAAiB,QAAoD;AACnE,UAAM,UAAW,OAAmC;AACpD,WAAO,YAAY,QAAQ,GAAG,iBAAiB,OAAO,KAAK,OAAO,OAAO,KAAK,WAAW;AAAA,EAC3F;AACF;AAEO,IAAM,kCAAkC,CAAC,UAA8B,SAAiB,WAAiD;AAC9I,SAAO,SAAS,OAAO,KAAK,WAC1B,MAAM,MAAM,YAAY,WAAW,MAAM,MAAM,WAAW,MAC5D,GAAG,MAAM;AACX;AAEO,IAAM,uCAAuC,CAAC,UAA8B,SAAiB,WAA4C;AAC9I,SAAO,SAAS,OAAO,OAAO,WAC5B,MAAM,MAAM,YAAY,WAAW,MAAM,MAAM,WAAW,MAC5D,EAAE,IAAI,WAAS,MAAM,MAAM,IAAI,EAAE,OAAO,UAAQ,CAAC,CAAC,IAAI;AACxD;AAUA,IAAM,uBAAuB,CAAC,EAAC,QAAQ,aAAkD;AACvF,MAAI,OAAO,WAAW,OAAO,aAAa;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,aAAa,OAAO,aAAa;AAC1C,QAAI,OAAO,KAAK,OAAK,EAAE,MAAM,KAAK,WAAW,iBAAiB,GAAG;AAC/D,aAAO;AAAA,IACT;AACA,QAAI,OAAO,KAAK,OAAK,EAAE,MAAM,KAAK,WAAW,kBAAkB,GAAG;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAGO,IAAM,kBAAkB,OAAuC,IAAO,QAAiB,QAAQ,OAAmB;AACvH,MAAI,SAAS,QAAQ,MAAM,GAAG;AAC5B,WAAO,GAAG,UAAU,MAAM;AAAA,EAC5B;AAEA,MAAI,SAAS,iBAAiB,MAAM,GAAG;AACrC,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,UAAM,YAAY,yBAAyB;AAC3C,UAAM,WAAW,MAAM,UAAU,gBAAgB,OAAO,OAAO;AAC/D,WAAO,GAAG,UAAU,OAAO,SAAS,EAAC,QAAQ,SAAS,OAAM,CAAC;AAAA,EAC/D;AAEA,QAAM,IAAI,MAAM,6FAA6F;AAC/G;AAEO,IAAM,kBAAkB,OAAuC,IAAO,QAAQ,OAAO;AAC1F,MAAI,CAAC,OAAO;AACV,UAAM,EAAC,SAAS,WAAU,GAAG,OAAO,EAAE,OAAO,QAAQ;AACrD,YAAQ,eAAe,WAAW;AAAA,EACpC;AAEA,SAAO,IAAI,QAA4B,OAAO,SAAS,WAAW;AAChE,QAAI,QAAQ,MAAM,GAAG,KAAK,cAAY;AACpC,YAAM,SAAS,qBAAqB,QAAQ;AAE5C,UAAI,WAAW,yBAA2B;AACxC,cAAM;AACN,gBAAQ,QAAQ;AAAA,MAClB,WAAW,WAAW,mBAAwB;AAC5C,YAAI,aAAa;AAEjB,YAAI,SAAS,eAAe,UAAU;AAEpC,gBAAM,UAAU,GAAG,SAAS,cAAc,SAAS,cAAc,QAAQ;AACzE,gBAAM,EAAC,MAAM,MAAM,YAAW;AAC9B,uBAAa,GAAG,WAAW,SAAS,KAAK,KAAK,GAAG;AAAA,QACnD,OAAO;AAEL,uBAAa,SAAS,eAAe,SAAS,KAAK;AAAA,QACrD;AAEA,cAAM;AACN,eAAO,IAAI,eAAe,UAAU,YAAY,KAAK,CAAC;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,IAAM,yBAAyB,OAAuC,IAAO,QAAiB,QAAQ,OAAO;AAClH,SAAO,MAAM,gBAAgB,MAAM,gBAAgB,IAAI,MAAM,CAAC;AAChE;;;AEjHA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAM,YAAY,OAAO,YAAoB;AAClD,cAAY,QAAQ,0BAA0B;AAC9C,QAAM,YAAY,yBAAyB;AAC3C,QAAM,UAAU,WAAW,OAAO;AACpC;AAEO,IAAM,iBAAiB,YAAW;AACvC,cAAY,QAAQ,0BAA0B;AAC9C,QAAM,YAAY,yBAAyB;AAC3C,SAAO,MAAM,UAAU,aAAa;AACtC;;;ACbA;AAAA;AAAA;AAAA;AAAA;AAGO,IAAM,kBAAkB,CAAC,MAAc,cAA2B,WAAW,aAAqB,OAAO;AAC9G,QAAM,UAAU,cAAc,EAAC,MAAM,aAAa,WAAU,CAAC;AAC7D,SAAO,QAAQ,WAAW,IAAI;AAChC;AACO,IAAM,gBAAgB,CAAC,YAA6B;AACzD,QAAM,EAAC,YAAW,mBAAmB;AACrC,SAAO,IAAI,QAAQ,OAAO;AAC5B;;;ACaO,IAAe,oBAAf,MAAiF;AAAA,EACtF,YACqB,KACT,IACS,QACnB;AAHmB;AACT;AACS;AAAA,EAErB;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EAKA,kBAAkB;AAChB,UAAM,IAAI,MAAM,eAAe;AAAA,EAEjC;AAAA,EAEA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,QAAiB;AAC1B,SAAK,KAAK,MAAM,gBAAgB,KAAK,IAAI,MAAM;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,SAA4C;AACrD,WAAO,MAAM,KAAK,cAAc,MAAM,gBAAgB,KAAK,EAAE,GAAG,OAAO;AAAA,EACzE;AAAA,EAEA,MAAM,YAAY,QAAiB,SAA4C;AAC7E,UAAM,KAAK,KAAK,MAAM;AACtB,WAAO,MAAM,KAAK,KAAK,OAAO;AAAA,EAChC;AAAA,EAEA,MAAM,eAAe,aAAsC;AACzD,UAAM,SAAS,MAAM,KAAK,GAAG,YAAY,WAAW;AACpD,WAAO,OAAO,WAAW,SAAS;AAAA,EACpC;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA0D;AACpH,UAAM,YAAY,SAAS,OAAO,UAAW,SAAS;AAEtD,UAAM,cAAmC,SAAS,kBAAkB,CAAC,CAAC,YACjE,OAAM,KAAK,IAAI,IAAI,MAAM,SAAS,SAAS,GAAG,MAAM,OAAO,OAAO,SAAS,IAC5E;AAEJ,UAAM,gBAAgC;AAAA,MACpC;AAAA,MACA,QAAQ,SAAS,OAAO,SAAS;AAAA,MACjC,SAAS,SAAS;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA4C;AACtG,WAAO,MAAM,KAAK,cAAc,UAAU,OAAO;AAAA,EACnD;AACF;AAEO,IAAM,uBAAN,cAAmC,kBAAiD;AAAA,EACzF,YAAY,KAAiB,IAAmC,SAA4B;AAC1F,UAAM,cAAc,OAAO,OAAO,WAAW,IAAI,GAAG,EAAE,IAAI;AAC1D,UAAM,KAAK,aAAa,EAAE;AAAA,EAC5B;AACF;;;AC9EO,IAAM,yBAAN,cAAqC,kBAA8E;AAAA,EACxH,YAAY,KAAiB,QAAsC,SAAyC;AAC1G,UAAM,SAAS,SAAS,uBAAuB,aAAa;AAC5D,UAAM,KAAK,IAAI,GAAG,SAAS,QAAQ,OAAO,WAAW,OAAO,WAAW;AAEvE,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAAgC;AAC1F,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,YAAY,UAAU;AAE7E,UAAM,YAAY,CAAC,CAAC,QAClB,YAAY,QAAQ,QAAQ,mBAAmB,KAAK,GAAG,OAAO,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC,KAC5F,YAAY,QAAQ,QAAQ,mBAAmB,KAAK,OAAO,WAAW,KAAK,GAAG,SAAS,CAAC,KACxF,KAAK,GAAG,GAAG,KAAK,OAAO,WAAW;AAEpC,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACzCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMO,IAAM,OAAN,MAAW;AAAA,EAUhB,YAAY,SAAsB;AAChC,SAAK,SAAS,QAAQ;AACtB,SAAK,YAAY,QAAQ;AACzB,SAAK,WAAW,QAAQ;AAExB,UAAM,iBAAiB,OAAO,QAAQ,QAAQ;AAC9C,SAAK,eAAe,OAAO;AAC3B,SAAK,OAAO,OAAQ,kBAAiB;AAAA,EACvC;AAAA,EAEA,OAAO,8BAA8B;AACnC,WAAO,IAAI,KAAK;AAAA,MACd,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,aAAa;AACX,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,kBAAkB,KAA8B;AAC9C,UAAM,MAAM,IAAI,SAAS;AACzB,QAAI,IAAI,UAAU,KAAK;AAAU,aAAO,KAAK,cAAc,GAAG;AAE9D,WAAO,OAAO,IAAI,MAAM,IAAI,SAAS,KAAK,QAAQ,CAAC;AAAA,EACrD;AAAA,EAEA,eAAe,KAA8B;AAC3C,UAAM,MAAM,IAAI,SAAS;AACzB,QAAI,IAAI,UAAU,KAAK;AAAU,aAAO;AAExC,WAAO,OAAO,IAAI,MAAM,GAAG,IAAI,SAAS,KAAK,QAAQ,CAAC;AAAA,EACxD;AAAA,EAEA,cAAc,KAA8B;AAC1C,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO;AAAA,IACT,WAAW,OAAO,QAAQ,UAAU;AAClC,UAAI,CAAC,IAAI,MAAM,OAAO,GAAG;AACvB,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,aAAO,OAAO,GAAG;AAAA,IACnB,OAAO;AACL,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,OAAO,KAAsB,gBAAwB,GAAW;AAC9D,WAAO,KAAK,sBAAsB,KAAK,aAAa,IAAI,IAAI,KAAK;AAAA,EACnE;AAAA,EACA,iBAAiB,KAA8B;AAC7C,WAAO,KAAK,OAAO,KAAK,KAAK,QAAQ;AAAA,EACvC;AAAA,EAIA,sBAAsB,KAAsB,gBAAwB,GAAW;AAC7E,QAAI,OAAO,kBAAkB,UAAU;AACrC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,QAAI,CAAE,MAAK,MAAM,aAAa,MAAM,gBAAgB;AAClD,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,QAAI,gBAAgB,GAAG;AACrB,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,QAAI,gBAAgB,KAAK,UAAU;AACjC,sBAAgB,KAAK;AAAA,IACvB;AAEA,UAAM,UAAU,KAAK,eAAe,GAAG;AACvC,UAAM,WAAW,KAAK,kBAAkB,GAAG;AAE3C,UAAM,2BAA2B,KAAK,WAAW;AACjD,UAAM,qBAAqB,WAAY,OAAO,OAAO,wBAAwB;AAE7E,QAAI,CAAC,iBAAiB,oBAAoB;AACxC,aAAO,QAAQ,SAAS;AAAA,IAC1B;AAEA,UAAM,cAAc,SAAS,SAAS,EACnC,SAAS,IAAI,GAAG,EAChB,MAAM,GAAG,aAAa,EACtB,QAAQ,UAAU,EAAE;AAEvB,WAAO,GAAG,WAAW;AAAA,EACvB;AAAA,EAMA,sBAAsB,OAAuB;AAC3C,QAAI,QAAQ,GAAG;AACb,YAAM,IAAI,MAAM,gDAAgD,OAAO;AAAA,IACzE;AAEA,UAAM,UAAU,KAAK,MAAM,KAAK;AAChC,QAAI,YAAY,GAAG;AACjB,aAAO,KAAK,WAAW,MAAM,SAAS,CAAC;AAAA,IACzC,OAAO;AACL,aAAO,KAAK,WAAY,SAAQ,GAAG,SAAS,CAAC,IAAI,KAAK;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,WAAW,OAAuB;AAChC,UAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,gBAAgB;AACjD,QAAI,CAAC,SAAS,CAAC,MAAM,IAAI;AACvB,YAAM,IAAI,MAAM,sCAAsC,OAAO;AAAA,IAC/D;AAEA,UAAM,CAAC,SAAS,YAAY,MAAM,GAAG,MAAM,GAAG;AAE9C,UAAM,gBAAgB,WAAW,OAAO,SAAS,OAAO,IAAI,GAAG,CAAC,IAAI;AACpE,WAAO,OAAO,OAAO,IAAI,KAAK,eAAe;AAAA,EAC/C;AACF;;;ADvIO,IAAM,SAAS,IAAI,KAAK;AAAA,EAC7B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ,CAAC;AAEM,IAAM,SAAS,IAAI,KAAK;AAAA,EAC7B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ,CAAC;AAEM,IAAM,OAAO,IAAI,KAAK;AAAA,EAC3B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AACZ,CAAC;;;AEFM,IAAM,kBAAN,MAAsB;AAAA,EAAtB;AAEL,SAAU,cAAc;AACxB,SAAU,QAAQ,KAAK,4BAA4B;AAAA;AAAA,EAEnD,IAAc,MAAM;AAClB,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,KAAK,aAAa;AACxC,YAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,YAAoB,SAAqC;AACrE,QAAI;AACF,UAAI,IAAI,UAAU;AAAA,IACpB,QAAE;AACA,YAAM,IAAI,MAAM,uBAAuB,YAAY;AAAA,IACrD;AAEA,UAAM,cAAc,eAAe;AAEnC,UAAM,cAAc,SAAS,2BACzB,eAAe,SAAS,4BACxB,eAAe;AAEnB,SAAK,OAAO,IAAI,YAAY,WAAW;AAAA,MACrC,UAAU,IAAI,YAAY,WAAW,UAAU;AAAA,MAC/C,KAAK;AAAA,QACH,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,qBAAqB;AACjC,YAAM,KAAK,KAAK;AAEhB,WAAK,QAAQ,IAAI,KAAK;AAAA,QACpB,QAAQ,KAAK,KAAK,SAAS,YAAY;AAAA,QACvC,UAAU,KAAK,KAAK,SAAS,cAAc;AAAA,QAC3C,WAAW;AAAA,MACb,CAAC;AAED,WAAK,cAAc,KAAK,KAAK,SAAS,aAAa;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa;AACjB,QAAI,KAAK,MAAM,aAAa;AAC1B,YAAM,KAAK,MAAM,WAAW;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAAA,EAGA,SAAS;AACP,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,MAAM,eAAe;AAAA,EACnC;AAAA,EAEA,cAAc,QAAsC,SAAyC;AAC3F,WAAO,IAAI,uBAAuB,KAAK,KAAK,QAAQ,OAAO;AAAA,EAC7D;AAAA,EAEA,2BAA2B,IAA0B,SAA4B;AAC/E,WAAO,IAAI,qBAAqB,KAAK,KAAK,IAAI,OAAO;AAAA,EACvD;AAAA,EAEA,MAAM,WAAW,SAAkC;AACjD,UAAM,SAAS,MAAM,KAAK,IAAI,MAAM,OAAO,QAAQ,OAAO;AAC1D,QAAI;AACF,aAAO,OAAQ,OAAe,KAAK,KAAK,SAAS,CAAC;AAAA,IACpD,SAAS,KAAP;AACA,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB;AACzB,UAAM,SAAU,OAAM,KAAK,IAAI,IAAI,OAAO,WAAW,GAAG,QAAQ;AAChE,WAAO;AAAA,EACT;AACF;;;AC7FO,IAAM,4BAAN,cAAwC,kBAAoF;AAAA,EACjI,YAAY,KAAiB,QAAyC,SAA4B;AAChG,UAAM,cAAa,KAAK,MAAM,KAAK,UAAU,OAAO,UAAU,CAAC;AAE/D,QAAI,CAAC,YAAW,MAAM;AACpB,kBAAW,OAAO,EAAC,KAAK,KAAI;AAAA,IAC9B;AAEA,eAAW,aAAa,CAAC,QAAQ,eAAe,aAAa,GAAG;AAC9D;AAAC,MAAC,YAAmB,aAAa,YAAY,QAAS,YAAmB,UAAU;AAAA,IACtF;AAEA,UAAM,KAAK,IAAI,GAAG,OAAO,mBAAmB,WAAU;AACtD,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,mBAAmB;AAEpF,UAAM,eAAgB,CAAC,CAAC,QAAQ,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,KAAM;AAErE,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,eAAe,UAAU,wBAAwB;AAAA,IAC7D;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACjCO,IAAM,8BAAN,cAA0C,kBAAwF;AAAA,EACvI,YAAY,KAAiB,QAA2C,SAA4B;AAElG,UAAM,KAAK,IAAI,GAAG,OAAO,mBAAmB,OAAO,cAAc,gBAAQ,GAAG,eAAe,OAAO,eAAe,CAAC;AAElH,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,sBAAsB;AAEvF,UAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE;AAErE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACpBO,IAAM,iCAAN,cAA6C,kBAA8F;AAAA,EAChJ,YAAY,KAAiB,QAA8C,SAA4B;AAErG,UAAM,KAAK,IAAI,GAAG,OAAO,sBAAsB,OAAO,cAAc,gBAAQ,GAAG,eAAe,OAAO,YAAY,CAAC;AAElH,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,wBAAwB;AAEzF,UAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE;AAErE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACtBO,IAAM,gCAAN,cAA4C,kBAA4F;AAAA,EAC7I,YAAY,KAAiB,QAA6C,SAA4B;AACpG,UAAM,KAAK,IAAI,GAAG,OAAO,qBAAqB,OAAO,cAAc,OAAO,iBAAiB;AAC3F,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,sBAAsB;AAEvF,UAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE;AAErE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AClBO,IAAM,8BAAN,cAA0C,kBAAwF;AAAA,EACvI,YAAY,KAAiB,QAA2C,SAA4B;AAClG,UAAM,KAAK,IAAI,GAAG,OAAO,mBAAmB,OAAO,YAAY;AAE/D,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,sBAAsB;AAEvF,UAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE;AAErE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AClBO,IAAM,iCAAN,cAA6C,kBAA8F;AAAA,EAChJ,YAAY,KAAiB,QAA8C,SAA4B;AACrG,UAAM,KAAK,IAAI,GAAG,OAAO,sBAAsB,OAAO,cAAc,OAAO,eAAe;AAC1F,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,wBAAwB;AAEzF,UAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE;AAErE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACnBO,IAAM,mCAAN,cAA+C,kBAAkG;AAAA,EACtJ,YAAY,KAAiB,QAAgD,SAA4B;AACvG,UAAM,KAAK,IAAI,GAAG,OAAO,wBAAwB,OAAO,YAAY;AAEpE,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,0BAA0B;AAE3F,UAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE;AAErE,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AChBO,IAAM,+BAAN,cAA2C,kBAA0F;AAAA,EAC1I,YAAY,KAAiB,QAA4C,SAA4B;AACnG,UAAM,KAAK,IAAI,GAAG,OAAO,oBAAoB,OAAO,cAAc,gBAAQ,GAAG,eAAe,OAAO,OAAO,CAAC;AAC3G,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,yBAAyB;AAE1F,UAAM,YAAY,CAAC,CAAC,QAClB,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE,KACzC,CAAC,CAAC,KAAK,GAAG,SAAS;AAErB,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACpBO,IAAM,0BAAN,cAAsC,kBAAgF;AAAA,EAC3H,YAAY,KAAiB,QAAuC,SAA4B;AAC9F,UAAM,KAAK,IAAI,GAAG,OAAO,eAAe,OAAO,cAAc,gBAAQ,GAAG,eAAe,OAAO,OAAO,CAAC;AACtG,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,uBAAuB;AAExF,UAAM,YAAY,CAAC,CAAC,QAClB,CAAC,MAAO,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE,CAAE,KACzC,CAAC,CAAC,KAAK,GAAG,SAAS;AAErB,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AC5BO,IAAM,2BAA2B,CAAC,UAAoC;AAC3E,MAAI,QAAQ,gBAAQ,GAAG,eAAe,MAAM,KAAK,IAAI,MAAM,QAAQ;AAEnE,MAAI,UAAU,MAAM;AAClB,QAAI,OAAO,MAAM,UAAU,UAAU;AACnC,YAAM,IAAI,MAAM,6DAA6D,OAAO,MAAM,UAAU,MAAM,OAAO;AAAA,IACnH;AACA,QAAI,YAAY,QAAQ,GAAG,gBAAgB,MAAM,KAAK,GAAG;AACvD,cAAQ,EAAC,UAAU,MAAM,MAAK;AAAA,IAChC,WAAW,YAAY,QAAQ,GAAG,iBAAiB,MAAM,KAAK,GAAG;AAC/D,cAAQ,EAAC,WAAW,MAAM,MAAK;AAAA,IACjC,OAAO;AACL,YAAM,IAAI,MAAM,2EAA2E,MAAM,QAAQ;AAAA,IAC3G;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;;;ACXO,IAAM,0BAAN,cAAsC,kBAAgF;AAAA,EAC3H,YAAY,KAAiB,QAAuC,SAA4B;AAC9F,UAAM,QAAQ,yBAAyB,KAAK,MAAM,KAAK,UAAU,OAAO,KAAK,CAAC,CAAC;AAE/E,UAAM,KAAK,IAAI,GAAG,OAAO,WAAW,OAAO,cAAc,MAAM,OAAO,EAAC,KAAK,EAAC,YAAY,MAAM,WAAU,EAAC,CAAC;AAC3G,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,OAAO,gCAAgC,UAAU,UAAU,aAAa;AAE9E,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,eAAe,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE;AACpD,UAAM,UAAU,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE;AAC/C,UAAM,QAAQ,KAAK,GAAG,OAAO;AAE7B,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,eAAe,UAAU,mBAAmB;AAAA,IACxD;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AClCO,IAAM,mCAAN,cAA+C,kBAAkG;AAAA,EACtJ,YAAY,KAAiB,QAAgD,SAA4B;AACvG,QAAI,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjC,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AACA,QAAI,OAAO,OAAO,SAAS,KAAK;AAC9B,YAAM,IAAI,MAAM,oEAAoE,OAAO,OAAO,gBAAgB;AAAA,IACpH;AAEA,UAAM,SAAU,KAAK,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,EACrD,IAAI,wBAAwB;AAE/B,UAAM,KAAK,IAAI,GAAG,OAAO,sBAAsB,OAAO,cAAc,EAAC,KAAK,OAAM,CAAC;AACjF,UAAM,KAAK,IAAI,MAAM;AAAA,EACvB;AAAA,EAEA,MAAgB,cAAc,UAA8B,SAA+B;AACzF,UAAM,SAAS,MAAM,KAAK,cAAc,UAAU,OAAO;AAEzD,UAAM,cAAc,gCAAgC,UAAU,UAAU,kBAAkB;AAC1F,UAAM,oBAAoB,qCAAqC,UAAU,UAAU,aAAa;AAEhG,UAAM,SAAS,kBAAkB,IAAI,UAAQ;AAC3C,YAAM,UAAW,CAAC,CAAC,QAAQ,SAAS,KAAK,GAAG,SAAS,GAAG,EAAE;AAC1D,YAAM,QAAS,CAAC,CAAC,QAAQ,KAAK,GAAG,OAAO;AACxC,aAAO,EAAC,SAAS,MAAK;AAAA,IACxB,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AChDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,IAAM,qBAA4B;AAIlC,IAAK,gBAAL,kBAAK,mBAAL;AACL,8BAAU;AACV,4BAAQ;AACR,8BAAU;AACV,gCAAY;AACZ,6BAAS;AACT,0BAAM;AACN,8BAAU;AACV,2BAAO;AACP,gCAAY;AATF;AAAA;AAYL,IAAM,uBAAuB;AAAA,EAClC;AAAA,EAAuB;AAAA,EAAqB;AAAA,EAAuB;AACrE;AACO,IAAM,wBAAwB;AAAA,EACnC;AAAA,EAAuB;AAAA,EAAuB;AAChD;AACO,IAAM,uBAAuB;AAAA,EAClC;AAAA,EAAsB;AAAA,EAAmB;AAAA,EAAuB;AAAA,EAAoB;AACtF;AACO,IAAM,sBAAsB,cAAc,aAAa;AAmCvD,IAAK,yBAAL,kBAAK,4BAAL;AACL,sCAAS;AACT,mCAAM;AACN,8CAAiB;AAHP;AAAA;;;ACvEZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,SAAN,MAAa;AAAA,EAKlB,YAAY,QAAkC;AAC5C,SAAK,SAAS,OAAO;AACrB,SAAK,SAAS,OAAO;AACrB,SAAK,SAAS,OAAO;AAAA,EACvB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,WAAW;AACT,WAAO,GAAG,KAAK,SAAS,KAAK,SAAS,KAAK;AAAA,EAC7C;AAAA,EAEA,OAAe,aAAa,SAAkD;AAC5E,QAAI,OAAO,YAAY;AAAU,aAAO;AAExC,UAAM,CAAC,QAAQ,QAAQ,MAAM,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,MAAM,GAAG,CAAC;AAErE,UAAM,QAAQ,SAAS,KAAK,EAAE;AAE9B,QAAI,MAAM,KAAK;AAAG,aAAO;AAEzB,UAAM,QAAQ,SAAS,KAAK,EAAE;AAC9B,UAAM,QAAQ,SAAS,KAAK,EAAE;AAC9B,WAAO,CAAC,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,IAAI,IAAI,KAAK;AAAA,EACnE;AAAA,EAEA,OAAO,WAAW,SAAyB;AACzC,UAAM,SAAS,OAAO,aAAa,OAAO;AAC1C,QAAI,CAAC;AAAQ,YAAM,IAAI,MAAM,mDAAmD,UAAU;AAC1F,WAAO,IAAI,OAAO,MAAM;AAAA,EAC1B;AAAA,EAEA,OAAO,QAAQ,SAA0B;AACvC,WAAO,OAAO,YAAY,YAAY,OAAO,aAAa,OAAO,MAAM;AAAA,EACzE;AAAA,EAEA,UAAU,SAAiB;AACzB,UAAM,SAAS,OAAO,aAAa,OAAO;AAC1C,QAAI,CAAC;AAAQ,aAAO;AAEpB,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AACpC,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AAEpC,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AACpC,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AAEpC,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AAAA,EAEA,WAAW,SAAiB;AAC1B,UAAM,SAAS,OAAO,aAAa,OAAO;AAC1C,QAAI,CAAC;AAAQ,aAAO;AAEpB,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AACpC,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AAEpC,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AACpC,QAAI,KAAK,SAAS,OAAO;AAAI,aAAO;AAEpC,WAAO,KAAK,SAAS,OAAO;AAAA,EAC9B;AAAA,EAEA,QAAQ,SAAiB;AACvB,UAAM,SAAS,OAAO,aAAa,OAAO;AAC1C,QAAI,CAAC;AAAQ,aAAO;AAEpB,WAAO,KAAK,WAAW,OAAO,MAAM,KAAK,WAAW,OAAO,MAAM,KAAK,WAAW,OAAO;AAAA,EAC1F;AACF;;;ACnFO,IAAM,YAAY;AAElB,IAAM,aAAa;AAEnB,IAAM,aAAa;;;ACSnB,IAAM,gBAAgB,CAAC,KAAU,YAAmC;AACvE,MAAI,OAAO,QAAQ;AACf,UAAM,IAAI,gBAAgB,GAAG,iCAAiC,OAAO,QAAQ,KAAK;AACtF,MAAI,QAAQ;AACR,UAAM,IAAI,gBAAgB,GAAG,2CAA2C;AAC5E,MAAI,eAAe;AACf,UAAM,IAAI,gBAAgB,GAAG,0CAA0C;AAC3E,MAAI,eAAe;AACf,UAAM,IAAI,gBAAgB,GAAG,0CAA0C;AAC3E,MAAI,MAAM,QAAQ,GAAG;AACjB,UAAM,IAAI,gBAAgB,GAAG,6CAA6C;AAE9E,SAAO;AACX;AAEO,IAAM,iBAAiB,CAAC,KAAU,iBAA0B,YAAmC;AAClG,MAAI,OAAO,QAAQ,YAAY,MAAM,GAAG,GAAG;AACvC,UAAM,IAAI,gBAAgB,GAAG,sCAAsC,KAAK;AAAA,EAC5E;AACA,MAAI,mBAAmB,QAAQ,KAAK,MAAM,GAAG,GAAG;AAC5C,UAAM,IAAI,gBAAgB,GAAG,yCAAyC,KAAK;AAAA,EAC/E;AACA,SAAO;AACX;AAEO,IAAM,uBAAuB,CAAC,KAA+B,YAA6B;AAC7F,MAAI,OAAO;AAEX,MAAI,OAAO,QAAQ,UAAU;AACzB,WAAO,QAAQ,KAAK,MAAM,GAAG;AAAA,EACjC,WAAW,OAAO,QAAQ,UAAU;AAChC,UAAM,SAAS,WAAW,GAAG;AAE7B,WAAO,CAAC,MAAM,MAAM,KAAK,WAAW,KAAK,MAAM,MAAM;AAAA,EACzD;AAEA,MAAI,CAAC,MAAM;AACP,UAAM,IAAI,gBAAgB,GAAG,YAAY,OAAO,GAAG,sCAAsC,OAAO,GAAG,GAAG;AAAA,EAC1G;AAEA,SAAO;AACX;AAEA,IAAM,mBAAmB,CAAC,KAA+B,YAA6B;AAClF,MAAI,OAAO,QAAQ,UAAU;AACzB,UAAM,IAAI,gBAAgB,GAAG,gBAAgB,OAAO,GAAG,sBAAsB;AAAA,EACjF;AACA,MAAI,CAAC,IAAI,MAAM,UAAU,GAAG;AACxB,UAAM,IAAI,gBAAgB,GAAG,8EAA8E,KAAK;AAAA,EACpH;AAEA,SAAO;AACX;AAEO,IAAM,cAAc,CAAC,KAAa,YAA6B;AAClE,MAAI,OAAO,QAAQ,UAAU;AACzB,UAAM,IAAI,gBAAgB,GAAG,4BAA4B;AAAA,EAC7D;AAEA,MAAI;AACA,QAAI,IAAI,GAAG;AACX,WAAO;AAAA,EACX,SAAS,KAAP;AACE,UAAM,IAAI,gBAAgB,GAAG,sCAAsC,KAAK;AAAA,EAC5E;AACJ;AAEO,IAAM,+BAA+B,CAAC,KAAa,YAA4B;AAClF,MAAI,CAAC,OAAO,QAAQ,GAAG;AACnB,UAAM,IAAI,gBAAgB,GAAG,gDAAgD,MAAM;AAEvF,SAAO,OAAO,WAAW,GAAG;AAChC;AAEO,IAAM,qCAAqC,CAAC,MAAW,qBAA8B,YAAwD;AAChJ,gBAAc,MAAM,OAAO;AAE3B,QAAM,OAAO,QAAQ,IAAI;AAEzB,MAAI,KAAK,WAAW,GAAG;AACnB,UAAM,IAAI,gBAAgB,GAAG,0DAA0D;AAAA,EAC3F;AAEA,MAAI,CAAC,KAAK,eAAe,GAAG,GAAG;AAC3B,UAAM,IAAI,gBAAgB,GAAG,sCAAsC;AAAA,EACvE;AAEA,MAAI,OAAO,KAAK,MAAM,UAAU;AAC5B,UAAM,IAAI,gBAAgB,GAAG,2BAA2B;AAAA,EAC5D;AAEA,MAAI,CAAC,uBAAuB,KAAK,WAAW,GAAG;AAC3C,UAAM,IAAI,gBAAgB,GAAG,oEAAoE,KAAK,KAAK,MAAM,KAAK;AAAA,EAC1H;AAEA,aAAW,OAAO,MAAM;AACpB,QAAI,QAAQ;AAAK;AAEjB,qBAAiB,KAAK,GAAG,YAAY,OAAO;AAC5C,QAAI,OAAO,KAAK,SAAS,UAAU;AAC/B,YAAM,IAAI,gBAAgB,GAAG,YAAY,iCAAiC,OAAO,QAAQ,KAAK;AAAA,IAClG;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,IAAM,iCAAiC,CAAC,MAA8B,iBAA0B,YAAoD;AACvJ,gBAAc,MAAM,OAAO;AAE3B,MAAI,QAAQ,IAAI,EAAE,WAAW,GAAG;AAC5B,UAAM,IAAI,gBAAgB,GAAG,0DAA0D;AAAA,EAC3F;AAEA,MAAI,CAAC,KAAK,eAAe,GAAG,GAAG;AAC3B,UAAM,IAAI,gBAAgB,GAAG,sCAAsC;AAAA,EACvE;AAEA,iBAAe,KAAK,GAAG,iBAAiB,GAAG,WAAW;AAEtD,aAAW,OAAO,MAAM;AACpB,QAAI,QAAQ;AAAK;AAAA,EACrB;AAEA,SAAO;AACX;AAEO,IAAM,4BAA4B,CAAC,KAAU,YAA8C;AAC9F,QAAM,SAAS,mCAAmC;AAClD,MAAI,OAAO,QAAQ;AACf,UAAM,IAAI,gBAAgB,GAAG,+BAA+B,KAAK;AACrE,MAAI,IAAI,QAAQ,kBAAkB,IAAI;AAClC,UAAM,IAAI,gBAAgB,GAAG,2BAA2B,4BAA4B,KAAK;AAC7F,SAAO;AACX;AAEO,IAAM,4BAA4B,CAAC,KAAU,YAAmD;AACnG,gBAAc,KAAK,OAAO;AAE1B,QAAM,aAAa,CAAC,YAAY,OAAO,SAAS,EAC3C,IAAI,WAAS,OAAO,OAAO,IAAI,WAAW,QAAQ,CAAC,EACnD,OAAO,CAAC,MAAM,SAAS;AACpB,WAAO,OAAO;AAAA,EAClB,GAAG,CAAC;AAER,MAAI,eAAe,GAAG;AAClB,UAAM,IAAI,gBAAgB,GAAG,+FAA+F,KAAK,UAAU,GAAG,GAAG;AAAA,EACrJ;AAEA,MAAI,OAAO,IAAI,QAAQ,UAAU;AAC7B,gBAAY,IAAI,KAAK,GAAG,aAAa;AAAA,EACzC;AAEA,MAAI,IAAI,eAAe,MAAM;AACzB,wBAAoB,KAAK,QAAQ,UAAU,OAAO,OAAO;AAE7D,SAAO;AACX;AAEO,IAAM,sBAAsB,CAAmB,KAAQ,KAAc,MAAc,UAAmB,YAA6B;AACtI,gBAAc,KAAK,OAAO;AAE1B,MAAI,UAAU;AACV,QAAI,IAAI,eAAe,GAAG,KAAK,OAAO,IAAI,SAAS,MAAM;AACrD,YAAM,IAAI,gBAAgB,GAAG,WAAW,OAAO,GAAG,yBAAyB,aAAa,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,IAC1H;AAAA,EACJ,OAAO;AACH,QAAI,CAAC,IAAI,eAAe,GAAG,GAAG;AAC1B,YAAM,IAAI,gBAAgB,GAAG,WAAW,OAAO,GAAG,kBAAkB,SAAS;AAAA,IACjF;AACA,QAAI,OAAO,IAAI,SAAS,MAAM;AAC1B,YAAM,IAAI,gBAAgB,GAAG,WAAW,OAAO,GAAG,iBAAiB,aAAa,OAAO,IAAI,SAAS,IAAI,MAAM;AAAA,IAClH;AAAA,EACJ;AACA,SAAO;AACX;AAEO,IAAM,wCAAwC,CAAC,KAAU,YAA0D;AACtH,gBAAc,KAAK,OAAO;AAC1B,sBAAoB,KAAK,OAAO,UAAU,OAAO,OAAO;AAExD,QAAM,oBAAoB,GAAG;AAE7B,gBAAc,IAAI,YAAY,iBAAiB;AAE/C,sBAAoB,IAAI,YAAY,WAAW,WAAW,OAAO,iBAAiB;AAClF,sBAAoB,IAAI,YAAY,mBAAmB,WAAW,OAAO,iBAAiB;AAC1F,sBAAoB,IAAI,YAAY,cAAc,WAAW,OAAO,iBAAiB;AAErF,SAAO;AACX;AAEO,IAAM,mBAAmB,CAAkC,OAAU;AACxE,QAAM,WAAW,IAAI,WAA0B;AAC3C,QAAI;AACA,aAAO,GAAG,GAAG,MAAa;AAAA,IAC9B,QAAE;AACE,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEO,IAAM,gCAAgC,iBAAiB,yBAAyB;AAEhF,IAAM,kBAAkB,iBAAiB,WAAW;AAEpD,IAAM,yCAAyC,iBAAiB,kCAAkC;;;ACjMlG,IAAM,+BAA+B,CAAC,OAAY,MAAqB,YAA0C;AACpH,gBAAc,OAAO,OAAO;AAE5B,MAAI,qBAAqB,SAAS,IAAI,GAAG;AACrC,UAAM,kBAAkB,sBAAsB,SAAS,IAAI;AAC3D,mCAA+B,OAAO,iBAAiB,OAAO;AAC9D,QAAI,SAAS,2BAAyB,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,MAAM,CAAC,GAAG;AAC7D,YAAM,IAAI,gBAAgB,GAAG,qDAAqD,MAAM,GAAG;AAAA,IAC/F;AAEA,WAAO;AAAA,EACX;AAEA,MAAI,qBAAqB,SAAS,IAAI,GAAG;AACrC,UAAM,sBAAsB,SAAS;AACrC,uCAAmC,OAAO,qBAAqB,OAAO;AAEtE,QAAI,SAAS,2BAAyB,MAAM,IAAI,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG;AACtE,YAAM,IAAI,gBAAgB,GAAG,yDAAyD,MAAM,GAAG;AAAA,IACnG;AAEA,QAAI,SAAS,qBAAsB,MAAM,IAAI,KAAK,gBAAgB,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG;AACnF,YAAM,IAAI,gBAAgB,GAAG,+DAA+D,MAAM,GAAG;AAAA,IACzG;AAEA,QAAI,SAAS,+BAA4B,EAAC,MAAM,EAAE,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM,UAAU,IAAI;AAC/F,YAAM,IAAI,gBAAgB,GAAG,wEAAwE,MAAM,GAAG;AAAA,IAClH;AAEA,WAAO;AAAA,EACX;AAEA,QAAM,IAAI,gBAAgB,GAAG,oCAAoC,MAAM;AAC3E;AAEO,IAAM,0CAA0C,CAAC,MAAuB,YAA6C;AACxH,gBAAc,MAAM,OAAO;AAE3B,qCAAmC,KAAK,MAAM,MAAM,GAAG,cAAc;AAErE,MAAI,KAAK,eAAe,UAAU,KAAK,OAAO,KAAK,aAAa;AAC5D,UAAM,IAAI,gBAAgB,GAAG,uDAAuD,OAAO,KAAK,aAAa,KAAK,UAAU;AAEhI,MAAI,KAAK,eAAe,SAAS,KAAK,OAAO,KAAK,YAAY,WAAW;AACrE,UAAM,IAAI,gBAAgB,GAAG,uDAAuD,OAAO,KAAK,aAAa,KAAK,UAAU;AAAA,EAChI;AAEA,MAAI,CAAC,oBAAoB,SAAS,KAAK,IAAI;AACvC,UAAM,IAAI,gBAAgB,GAAG,sDAAsD,OAAO,KAAK,SAAS,KAAK,MAAM;AAEvH,MAAI,KAAK,eAAe,YAAY,GAAG;AACnC,kBAAc,KAAK,YAAY,GAAG,oBAAoB;AAEtD,eAAW,OAAO,KAAK,YAAY;AAC/B,YAAM,eAAe,GAAG,sBAAsB;AAC9C,YAAM,SAAS,SAAS,GAAG;AAC3B,qBAAe,QAAQ,MAAM,YAAY;AAEzC,mCACI,KAAK,WAAW,SAChB,KAAK,MACL,YACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEO,IAAM,qCAAqC,CAAC,YAAiB,YAA8D;AAC9H,gBAAc,YAAY,OAAO;AACjC,aAAW,OAAO,YAAY;AAC1B,yBAAqB,KAAK,OAAO;AACjC,4CAAwC,WAAW,MAAM,GAAG,YAAY,OAAO;AAAA,EACnF;AAEA,SAAO;AACX;AAEO,IAAM,iCAAiC,CAA2C,WAA6B;AAClH,gBAAc,QAAQ,0BAA0B;AAEhD,MAAI,OAAO,eAAe;AACtB,UAAM,IAAI,gBAAgB,mCAAmC,OAAO,aAAa;AAErF,QAAM,gBAAgB,6BAA6B,OAAO,eAAe,eAAe;AACxF,MAAI,CAAC,cAAc,QAAQ,OAAO,GAAG;AACjC,UAAM,IAAI,gBAAgB,2CAA2C,cAAc,SAAS,GAAG;AAAA,EACnG;AAEA,4BAA0B,OAAO,cAAc,cAAc;AAE7D,MAAI,OAAO,eAAe,qBAAqB,GAAG;AAC9C,8BAA0B,OAAO,qBAAqB,qBAAqB;AAAA,EAC/E;AAEA,MAAI,CAAC,OAAO,4BAA4B,CAAC,OAAO,kBAAkB;AAC9D,UAAM,IAAI,gBAAgB,sFAAsF;AAAA,EACpH;AAEA,MAAI,OAAO,2BAA2B,OAAO,kBAAkB;AAC3D,UAAM,0BAA0B,6BAC5B,OAAO,yBACP,yBACJ;AAEA,QAAI,CAAC,wBAAwB,QAAQ,OAAO,GAAG;AAC3C,YAAM,IAAI,gBAAgB,sDAAsD,wBAAwB,SAAS,GAAG;AAAA,IACxH;AAEA,uCAAmC,OAAO,kBAAkB,kBAAkB;AAAA,EAClF;AAEA,gBAAc,OAAO,OAAO,OAAO;AACnC,4BAA0B,OAAO,MAAM,aAAa,OAAO;AAE3D,MAAI,OAAO,eAAe,cAAc,GAAG;AACvC,kBAAc,OAAO,OAAO,OAAO;AACnC,8BAA0B,OAAO,MAAM,aAAa,OAAO;AAAA,EAC/D;AAEA,MAAI,OAAO,eAAe,OAAO,GAAG;AAChC,kBAAc,OAAO,OAAO,OAAO;AACnC,8BAA0B,OAAO,MAAM,aAAa,OAAO;AAAA,EAC/D;AAEA,MAAI,OAAO,eAAe,OAAO,GAAG;AAChC,kBAAc,OAAO,OAAO,OAAO;AACnC,8BAA0B,OAAO,MAAM,aAAa,OAAO;AAE3D,wBAAoB,OAAO,OAAO,UAAU,UAAU,OAAO,OAAO;AACpE,wBAAoB,OAAO,OAAO,cAAc,WAAW,MAAM,OAAO;AAAA,EAC5E;AAEA,MAAI,OAAO,eAAe,eAAe,GAAG;AACxC,kBAAc,OAAO,eAAe,eAAe;AACnD,8BAA0B,OAAO,cAAc,aAAa,eAAe;AAE3E,wBAAoB,OAAO,eAAe,UAAU,UAAU,OAAO,eAAe;AAAA,EACxF;AAEA,SAAO;AACX;AAEO,IAAM,6CAA6C,CAAC,MAAW,UAAkB,+BAA2E;AAC/J,MAAI,CAAC,MAAM,QAAQ,IAAI;AACnB,UAAM,IAAI,gBAAgB,GAAG,mCAAmC,OAAO,SAAS,MAAM;AAE1F,OAAK,QAAQ,CAAC,KAAK,UAAU;AACzB,0CAAsC,KAAK,GAAG,WAAW,QAAQ;AAAA,EACrE,CAAC;AAED,SAAO;AACX;;;AClKA,IAAM,2BAA2B,CAAC,QAAyB,KAAa,YAAoB;AACxF,iBAAe,KAAK,MAAM,OAAO;AACjC,QAAM,WAAW,QAAQ,OAAO,cAAc,CAAC,CAAC,EAAE,IAAI,OAAK,SAAS,CAAkB,CAAC;AACvF,MAAI,CAAC,SAAS,SAAS,GAAG,GAAG;AACzB,UAAM,IAAI,gBAAgB,GAAG,kBAAkB,sDAAsD,SAAS,KAAK,IAAI;AAAA,EAC3H;AACJ;AACO,IAAM,sBAAsB,CAA8E,OAAY,qBAAoC;AAC7J,MAAI,iBAAiB,eAAe,uBAA+B;AAC/D,UAAM,IAAI,gBAAgB,sCAAsC,iBAAiB,aAAa;AAAA,EAClG;AACA,MAAI,MAAM,eAAe,MAAM,GAAG;AAC9B,uCAAmC,MAAM,MAAM,MAAM,YAAY;AAAA,EACrE;AACA,MAAI,MAAM,eAAe,aAAa,GAAG;AACrC,uCAAmC,MAAM,aAAa,MAAM,mBAAmB;AAAA,EACnF;AAEA,4BAA0B,MAAM,OAAO,aAAa;AAEpD,MAAI,MAAM,eAAe,cAAc,GAAG;AACtC,8BAA0B,MAAM,cAAc,oBAAoB;AAAA,EACtE;AAEA,QAAM,gBAAgB,6BAA6B,iBAAiB,eAAe,gCAAgC;AAEnH,MAAI,MAAM,qBAAqB,iBAAiB,kBAAkB;AAC9D,kBAAc,MAAM,mBAAmB,yBAAyB;AAEhE,aAAS,OAAO,iBAAiB,kBAAkB;AAC/C,YAAM,SAAS,iBAAiB,iBAAiB;AAEjD,2BAAqB,KAAK,yBAAyB;AACnD,YAAM,UAAU,2BAA2B;AAE3C,YAAM,OAAO,MAAM,kBAAkB;AAErC,UAAI,CAAC,MAAM,kBAAkB,eAAe,GAAG,GAAG;AAC9C,YAAI,OAAO,UAAU;AACjB;AAAA,QACJ,OAAO;AACH,gBAAM,IAAI,gBAAgB,GAAG,yDAAyD;AAAA,QAC1F;AAAA,MACJ;AAEA,UAAI,OAAO,WAAW,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxC,cAAM,IAAI,gBAAgB,GAAG,sDAAsD;AAAA,MACvF;AACA,UAAI,CAAC,OAAO,WAAW,MAAM,QAAQ,IAAI,GAAG;AACxC,cAAM,IAAI,gBAAgB,GAAG,+DAA+D;AAAA,MAChG;AAEA,YAAM,QAAQ,OAAO,UAAU,OAAO,CAAC,IAAI;AAE3C,UAAI,OAAO,YAAY;AACnB,cAAM,QAAQ,CAAC,KAAU,UAAkB;AACvC,mCAAyB,QAAQ,KAAK,GAAG,WAAW,QAAQ;AAAA,QAChE,CAAC;AAAA,MACL,OAAO;AACH,cAAM,QAAQ,CAAC,UAAe,UAAkB;AAC5C,uCAA6B,UAAU,OAAO,MAAM,GAAG,WAAW,QAAQ;AAAA,QAC9E,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,iBAAiB,eAAe,OAAO,KAAK,MAAM,eAAe,OAAO,GAAG;AAC3E,8BAA0B,MAAM,OAAO,aAAa;AAAA,EACxD;AAEA,MAAI,iBAAiB,eAAe,OAAO,KAAK,MAAM,eAAe,OAAO,GAAG;AAC3E,8BAA0B,MAAM,OAAO,aAAa;AAAA,EACxD;AAEA,MAAI,iBAAiB,eAAe,eAAe,KAAK,MAAM,eAAe,eAAe,GAAG;AAC3F,8BAA0B,MAAM,eAAe,qBAAqB;AAAA,EACxE;AAEA,SAAO;AACX;;;ACjGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUA,IAAM,kCAAkC,CAAmB,KAAQ,cAAuC;AACxG,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,UAAM,IAAI,MAAM,wBAAwB,KAAK;AAAA,EAC/C;AAEA,QAAM,uBAAwC,CAAC;AAE/C,WAAS,OAAO,KAAK;AACnB,UAAM,QAAQ,IAAI;AAClB,QACE,OAAO,UAAU,YACjB,CAAE,WAAU,QAAQ,iBAAiB,OAAO,iBAAiB,OAAO,MAAM,QAAQ,KAAK,IACvF;AACA,eAAS,kBAAkB,OAAO;AAChC,cAAM,mBAAmB,MAAM;AAC/B,6BAAqB,KAAK;AAAA,UACxB,KAAK,GAAG,MAAM,YAAY;AAAA,UAC1B,OAAO,KAAK,UAAU,gBAAgB;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,2BAAqB,KAAK;AAAA,QACxB;AAAA,QACA,OAAO,KAAK,UAAU,KAAK;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,qCAAqC,CAAmB,YAA6B,cAAyB;AACzH,QAAM,MAAW,CAAC;AAElB,WAAS,EAAC,KAAK,WAAU,YAAY;AACnC,UAAM,WAAW,IAAI,MAAM,SAAS;AACpC,UAAM,SAAS,SAAS;AACxB,QAAI,WAAW,GAAG;AAChB,UAAI,OAAO,+BAA+B,KAAK;AAAA,IACjD,OAAO;AACL,YAAM,CAAC,MAAK,YAAY;AACxB,UAAI,OAAO,IAAI,UAAS,UAAU;AAChC,YAAI,QAAO,CAAC;AAAA,MACd;AACA,UAAI,MAAK,YAAY,+BAA+B,KAAK;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,YAAY;AAEX,IAAM,oBAAoB;AAAA,EAC/B,oBAAoB,CAAmB,QAA4B;AACjE,WAAO,gCAAgC,KAAK,SAAS;AAAA,EACvD;AAAA,EACA,oBAAoB,CAAmB,QAA4B;AACjE,WAAO,mCAAmC,KAAK,SAAS;AAAA,EAC1D;AACF;AAEO,IAAM,0CAA2C,CAA8C,KAA6B,mBAAiE;AAClM,QAAM,SAAwC;AAAA,IAC5C,GAAG;AAAA,IACH,SAAS;AAAA,EACX;AAEA,MAAI,OAAO,IAAI,QAAQ,UAAU;AAC/B,WAAO,UAAU,IAAI;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,gBAAgB;AAEpC,MAAI,OAAO,gBAAgB,YAAY,YAAY,QAAQ,kBAAkB,IAAI,GAAG;AAClF,QAAI,OAAO,IAAI,YAAY,UAAU;AACnC,aAAO,UAAU,UAAU,IAAI;AAAA,IACjC;AAAA,EACF,OAAO;AACL,QAAI,OAAO,IAAI,aAAa,UAAU;AACpC,aAAO,UAAU,YAAY,QAAQ,oBAAoB,IAAI,QAAQ;AAAA,IACvE,WAAW,OAAO,IAAI,YAAY,UAAU;AAC1C,aAAO,UAAU,YAAY,QAAQ,oBAAoB,IAAI,OAAO;AAAA,IACtE;AAAA,EACF;AAEA,SAAO;AACT;;;ADtFO,IAAM,qCAAqC,CAAC,WAAiE;AAClH,iCAA+B,MAAM;AACrC,SAAO,kBAAkB,mBAAmB,MAAM;AACpD;AAEO,IAAM,uCAAuC,CAAC,eAAqC;AACxF,SAAO,kBAAkB,mBAAmB,UAAU;AACxD;AAEO,IAAM,uCAAuC,OAAO,cAAsB,eAA6F;AAC5K,MAAI;AACF,UAAM,iBAAgD,qCAAqC,UAAU;AACrG,mCAA+B,cAAc;AAC7C,mBAAe,eAAe;AAE9B,QAAI,eAAe,cAAc;AAC/B,qBAAe,eAAe,wCAAwC,eAAe,cAAc,eAAe,KAAK;AAAA,IACzH;AACA,QAAI,eAAe,qBAAqB;AACtC,qBAAe,sBAAsB,wCAAwC,eAAe,qBAAqB,eAAe,KAAK;AAAA,IACvI;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF,SAAS,GAAP;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,iCAAiC,CAAC,QAAgD;AAAA,EACtF;AAAA,EACA,YAAY,EAAC,SAAS,OAAO,iBAAiB,MAAM,YAAY,MAAK;AACvE;AAEA,IAAM,qDAAqD,CAAC,aAAiD,WAAmB;AAC9H,cAAY,KAAK,+BAA+B,GAAG,UAAU,CAAC;AAC9D,cAAY,KAAK,+BAA+B,GAAG,UAAU,CAAC;AAC9D,cAAY,KAAK,+BAA+B,GAAG,UAAU,CAAC;AAC9D,cAAY,KAAK,+BAA+B,GAAG,UAAU,CAAC;AAChE;AAMO,IAAM,uDAAuD,CAAC,QAAwC,YAAqG;AAChN,QAAM,cAAkD;AAAA,IACtD,+BAA+B,GAAG;AAAA,IAClC,+BAA+B,GAAG;AAAA,EACpC;AAEA,qDAAmD,aAAa,GAAG;AAEnE,MAAI,OAAO,eAAe,cAAc,GAAG;AACzC,uDAAmD,aAAa,GAAG;AAAA,EACrE;AAEA,MAAI,OAAO,eAAe,OAAO,GAAG;AAClC,uDAAmD,aAAa,GAAG;AAAA,EACrE;AAEA,MAAI,OAAO,eAAe,OAAO,GAAG;AAClC,uDAAmD,aAAa,IAAI;AAAA,EACtE;AAEA,MAAI,OAAO,eAAe,eAAe,GAAG;AAC1C,uDAAmD,aAAa,IAAI;AAAA,EACtE;AAEA,MAAI,OAAO,kBAAkB;AAC3B,YAAQ,OAAO,gBAAgB,EAAE,QAAQ,SAAO;AAC9C,kBAAY,KAAK,+BAA+B,KAAK,KAAK,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,eAAe;AAC1B,UAAM,EAAC,kBAAiB;AAExB,QAAI,CAAC,2CAA2C,aAAa,GAAG;AAC9D,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,eAAW,OAAO,eAAe;AAC/B,YAAM,QAAQ,YAAY,UAAU,gBAAc,WAAW,QAAQ,IAAI,GAAG;AAC5E,UAAI,QAAQ,GAAG;AACb,oBAAY,KAAK,GAAG;AAAA,MACtB,OAAO;AACL,oBAAY,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AE5GA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,IAAM,gCAAgC,CAAC,YAA6B,QAAgB,WAAmC;AACrH,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,eAAW,KAAK,EAAC,KAAK,GAAG,YAAY,OAAO,OAAO,SAAQ,CAAC;AAAA,EAC9D,WAAW,OAAO,OAAO,YAAY,UAAU;AAC7C,eAAW,KAAK,EAAC,KAAK,GAAG,YAAY,OAAO,OAAO,QAAO,CAAC;AAAA,EAC7D,WAAW,OAAO,OAAO,QAAQ,UAAU;AACzC,eAAW,KAAK,EAAC,KAAK,GAAG,YAAY,OAAO,OAAO,IAAG,CAAC;AAAA,EACzD;AAEA,MAAI,OAAO,OAAO,SAAS,UAAU;AACnC,eAAW,KAAK,EAAC,KAAK,GAAG,YAAY,OAAO,OAAO,KAAI,CAAC;AAAA,EAC1D;AACF;AAEA,IAAM,0BAA0B,CAAC,YAA6B,KAAa,UAAoC;AAC7G,MAAI,WAAW,KAAK,UAAU,KAAK;AAEnC,aAAW,KAAK;AAAA,IACd;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,0BAA0B,CAAC,OAA4B,WAA4F;AAC9J,sBAAoB,OAAO,MAAwC;AAEnE,QAAM,aAA8B,CAAC;AACrC,MAAI,MAAM;AAAM,4BAAwB,YAAY,KAAK,MAAM,IAAI;AACnE,MAAI,MAAM;AAAa,4BAAwB,YAAY,KAAK,MAAM,WAAW;AAEjF,MAAI,MAAM,mBAAmB;AAC3B,eAAW,KAAK,MAAM,mBAAmB;AACvC,YAAM,QAAQ,MAAM,kBAAkB;AACtC,8BAAwB,YAAY,KAAK,KAAK,KAAK;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,MAAM;AAAO,kCAA8B,YAAY,KAAK,MAAM,KAAK;AAC3E,MAAI,OAAO,gBAAgB,MAAM;AAAc,kCAA8B,YAAY,KAAK,MAAM,YAAY;AAChH,MAAI,OAAO,SAAS,MAAM;AAAO,kCAA8B,YAAY,KAAK,MAAM,KAAK;AAC3F,MAAI,OAAO,SAAS,MAAM;AAAO,kCAA8B,YAAY,MAAM,MAAM,KAAK;AAC5F,MAAI,OAAO,iBAAiB,MAAM;AAAe,kCAA8B,YAAY,MAAM,MAAM,aAAa;AAEpH,SAAO;AACT;AAEA,IAAM,4BAA4B,CAAgC,OAAU,YAA6B,QAAgB,eAAwB;AAC/I,QAAM,qBAAqB,CAAC,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU;AACtF,MAAI,WAAW,KAAK,CAAC,EAAC,UAAS,mBAAmB,SAAS,GAAG,CAAC;AAAG,UAAM,cAAc,CAAC;AAEvF,QAAM,QAAQ,MAAM;AAEpB,QAAM,mBAAmB,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,mBAAmB,EAAE;AACjF,MAAI;AAAkB,UAAM,WAAW,iBAAiB;AAExD,QAAM,cAAc,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,mBAAmB,EAAE;AAC5E,MAAI;AAAa,UAAM,MAAM,YAAY;AAEzC,QAAM,kBAAkB,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,mBAAmB,EAAE;AAChF,MAAI;AAAiB,UAAM,UAAU,gBAAgB;AAErD,QAAM,eAAe,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,mBAAmB,EAAE;AAC7E,MAAI;AAAc,UAAM,OAAO,aAAa;AAC9C;AAGO,IAAM,mCAAmC,CAAgC,YAAkC,WAA8E;AAC9L,QAAM,QAAW,CAAC;AAElB,QAAM,eAAe,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,GAAG;AAC3D,MAAI,cAAc;AAChB,UAAM,aAAa,+BAA2D,aAAa,KAAK;AAChG,QAAI,OAAO,eAAe,UAAU;AAClC,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AAEA,QAAM,sBAAsB,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,GAAG;AAClE,MAAI,qBAAqB;AACvB,UAAM,oBAAoB,+BAA2D,oBAAoB,KAAK;AAC9G,QAAI,OAAO,sBAAsB,UAAU;AACzC,YAAM,cAAc;AAAA,IACtB;AAAA,EACF;AAEA,4BAA0B,OAAO,YAAY,KAAK,OAAO;AACzD,4BAA0B,OAAO,YAAY,KAAK,cAAc;AAChE,4BAA0B,OAAO,YAAY,KAAK,OAAO;AACzD,4BAA0B,OAAO,YAAY,MAAM,OAAO;AAC1D,4BAA0B,OAAO,YAAY,MAAM,eAAe;AAElE,QAAM,sBAAsB,WAAW,OAAO,CAAC,EAAC,UAAS,IAAI,WAAW,IAAI,CAAC;AAC7E,MAAI,oBAAoB,QAAQ;AAC9B,UAAM,QAAQ,CAAC;AAEf,eAAW,YAAY,qBAAqB;AAC1C,YAAM,EAAC,KAAK,UAAS;AACrB,YAAM,SAAS,+BAAoC,KAAK;AACxD,YAAM,eAAe,SAAS,IAAI,MAAM,GAAG,EAAE,MAAM,EAAE;AAErD,UAAI,CAAC,MAAM,YAAY,KAAK,OAAO,kBAAkB,eAAe,YAAY,GAAG;AACjF,cAAM,gBAAgB;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,oBAAoB;AAAA,EAC5B;AAEA,SAAO;AACT;AAGO,IAAM,4BAA4B,OAAO,cAAsB,SAAiB,UAA6B,WAAwH;AAC1O,QAAM,gBAAgB,iCAAiC,SAAS,YAAY,MAAM;AAElF,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,aAAa;AAEzB,MAAI;AACF,wBAAoB,eAAe,MAAM;AAAA,EAC3C,SAAS,GAAP;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,QAA4B;AAAA,IAChC,OAAO,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,IACA,YAAY,0BAA0B,eAAe,MAAM;AAAA,IAC3D,OAAO,wCAAwC,cAAc,OAAO,OAAO,KAAK;AAAA,EAClF;AACA,MAAI,MAAM,MAAM,YAAY,YAAY,QAAQ,GAAG,eAAe,MAAM,MAAM,QAAQ,GAAG;AACvF,UAAM,qBAAqB,YAAY,QAAQ,QAAQ,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC1F;AAEA,MAAI,cAAc;AAAM,UAAM,OAAO,cAAc;AACnD,MAAI,cAAc;AAAa,UAAM,cAAc,cAAc;AAEjE,MAAI,cAAc,cAAc;AAC9B,UAAM,eAAe,wCAAwC,cAAc,cAAc,OAAO,YAAY;AAAA,EAC9G;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,QAAQ,wCAAwC,cAAc,OAAO,OAAO,KAAK;AAAA,EACzF;AACA,MAAI,cAAc,OAAO;AACvB,UAAM,QAAQ,wCAAwC,cAAc,OAAO,OAAO,KAAK;AAAA,EACzF;AACA,MAAI,cAAc,eAAe;AAC/B,UAAM,gBAAgB,wCAAwC,cAAc,eAAe,OAAO,aAAa;AAAA,EACjH;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEO,IAAM,4BAA4B,CAAC,OAA4B,qBAAwG;AAC5K,QAAM,aAAgC,CAAC;AACvC,MAAI,CAAC,MAAM;AAAmB,WAAO,CAAC;AAEtC,QAAM,UAAU,WAAW,MAAM,iBAAiB;AAClD,aAAW,SAAS,SAAS;AAC3B,UAAM,CAAC,KAAK,YAAY;AAExB,UAAM,SAAS,iBAAiB,mBAAmB;AACnD,QAAI,CAAC;AAAQ;AAEb,QAAI,QAAa;AAEjB,QAAI,OAAO,YAAY;AACrB,UAAI,OAAO,WAAW,MAAM,QAAQ,QAAQ,GAAG;AAC7C,gBAAQ,SACL,IAAI,OAAK,OAAO,MAAM,WAAW,OAAO,aAAa,KAAK,IAAI,EAC9D,OAAO,OAAK,CAAC,CAAC,CAAC;AAAA,MACpB,OAAO;AACL,YAAI,OAAO,aAAa,UAAU;AAChC,kBAAQ,OAAO,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,eAAW,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb;AAAA,MACA,SAAS,OAAO,WAAW;AAAA,MAC3B,MAAM,OAAO;AAAA,MACb;AAAA,MACA,QAAQ,CAAC,CAAC,OAAO;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;;;ACvNA;AAAA;AAAA;AAAA;AAAA;AAkBA;AAMA,IAAM,4BAA4B,CAAC,mBAAiE;AAClG,SAAO,OAAO,mBAAmB,YAC/B,gBAAgB,gBAAgB,gBAAgB,KAChD,eAAe,QAAQ,MAAM,KAAK;AACtC;AAEO,IAAM,4BAA4B,OAAO,cAAsB,YAAkC,YAAwG;AAC9M,QAAM,EAAC,kBAAkB,sBAAqB;AAE9C,QAAM,UAAU,WAAW,OAAO,CAAC,KAAK,EAAC,KAAK,YAAW;AACvD,QAAI,OAAO;AACX,WAAO;AAAA,EACT,GAAG,CAAC,CAA2B;AAE/B,QAAM,iBAAqC,QAAQ;AACnD,QAAM,qBAAyC,QAAQ;AACvD,QAAM,gBAAoC,QAAQ;AAClD,QAAM,wBAA4C,QAAQ;AAE1D,QAAM,2BAA2B,0BAA0B,cAAc;AAEzE,QAAM,SAAwC;AAAA,IAC5C,YAAY;AAAA,IAEZ;AAAA,IACA,cAAc;AAAA,MACZ,KAAK;AAAA,MACL,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,aAAa,2BACT,eAAe,QAAQ,QAAQ,SAAS,IACxC;AAAA,IACN;AAAA,IAEA,eAAe;AAAA,IACf,kBAAkB,CAAC;AAAA,IACnB,yBAAyB;AAAA,EAC3B;AAEA,MAAI,8BAA8B;AAClC,MAAI;AACF,kCAA8B,KAAK,MAAM,qBAAqB;AAAA,EAChE,QAAE;AAAA,EACF;AAEA,MAAI,+BAA+B,OAAO,gCAAgC,YAAY,OAAO,4BAA4B,oBAAoB,UAAU;AACrJ,WAAO,aAAa,UAAU,4BAA4B;AAC1D,WAAO,OAAO,aAAa;AAC3B,WAAO,aAAa,UAAU,iBAAiB,QAAQ,WAAW,4BAA4B,eAAe;AAAA,EAC/G,WAAW,0BAA0B;AACnC,UAAM,WAAW,eAAe,QAAQ,QAAQ,GAAG;AACnD,WAAO,aAAa,MAAM;AAC1B,WAAO,aAAa,UAAU;AAAA,EAChC;AAGA,MAAI,OAAa,CAAC;AAClB,MAAI,UAAgB,CAAC;AACrB,MAAI;AACF,WAAO,KAAK,SAAS,KAAK,MAAM,kBAAkB,CAAC;AACnD,cAAU,KAAK,WAAW,yBAAyB;AAAA,EACrD,SAAS,KAAP;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,mBAA+C,CAAC;AAEtD,MAAI,IAAI;AACR,aAAW,SAAS,QAAQ,aAAa;AACvC,QAAI,MAAM,SAAS,YAAY;AAC7B;AAAA,IACF;AAEA,UAAM,WAAU,CAAC,CAAC,UAAU,QAAQ,EAAE,SAAS,MAAM,IAAI,KAAK,KAAK,WAAW,MAAM,IAAI,EAAE;AAE1F,UAAM,gBAA8C,WAChD,UAAU,QAAO,EAChB,IAAI,OAAK,cAAwC,CAAC,CAAC,EACnD,OAAO,OAAK,OAAO,MAAM,YAAY,OAAO,EAAE,OAAO,QAAQ,EAC7D,IAAI,OAAK;AACR,YAAM,SAAc,EAAC,GAAI,EAAS;AAClC,UAAI,OAAO,OAAO,MAAM;AAAU,eAAO;AAEzC,aAAO,IAAI,OAAO,MAAM,OAAO,QAAQ,MAAM,EAAE,OAAO;AAEtD,UAAI,OAAO,OAAO,MAAM;AAAU,eAAO;AAEzC,aAAO;AAAA,IACT,CAAC,EACA,OAAO,OAAK,CAAC,CAAC,CAAC,IAChB,CAAC;AAEL,UAAM,OAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM,EAAC,GAAG,MAAM,KAAI;AAAA,MACpB,SAAS,MAAM;AAAA,MACf,UAAU,CAAC,MAAM;AAAA,IACnB;AACA,QAAI,cAAc,QAAQ;AACxB,WAAK,aAAa,cAAc,OAC9B,CAAC,KAAK,IAAI,UAAU;AAClB,YAAI,SAAS;AACb,eAAO;AAAA,MACT,GACA,CAAC,CACH;AAAA,IACF;AAEA,qBAAiB,OAAO;AAAA,EAC1B;AAEA,SAAO,mBAAmB;AAC1B,SAAO,0BAA0B;AAEjC,SAAO,gBAAgB;AAAA,IACrB,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,4BAA4B;AAAA,EAC9B;AAEA,SAAO,EAAC,QAAQ,QAAQ,OAAO,KAAI;AACrC;AAGO,IAAM,uBAAuB,OAAO,cAAsB,SAAiB,UAA6C,QAAuC,YAA6F;AACjQ,QAAM,qBAAqB,OAAO,eAAe;AAEjD,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,gBAAgB,0DAA0D;AAAA,IACvF;AAAA,EACF;AAEA,MAAI,OAAa,CAAC;AAClB,MAAI,UAAgB,CAAC;AACrB,MAAI;AACF,WAAO,KAAK,SAAS,KAAK,MAAM,kBAAkB,CAAC;AACnD,cAAU,KAAK,WAAW,yBAAyB;AAAA,EACrD,SAAS,KAAP;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,gBAAgB,gDAAgD;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,cAAiC;AAAA,IACrC,OAAO,SAAS,MAAM,QAAQ;AAAA,IAC9B,YAAY,SAAS,WAAW,IAAI,cAAY;AAC9C,aAAO;AAAA,QACL,KAAK,SAAS,IAAI,QAAQ;AAAA,QAC1B,OAAO,SAAS,MAAM,OAAO;AAAA,MAE/B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,YAAY,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,gBAAgB;AACrF,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,gBAAgB,kCAAkC;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,WAAW,YAAY,SAAS,cAAc,KAAK;AACzD,MAAI,eAA4B,CAAC;AACjC,MAAI,oBAAyC,CAAC;AAC9C,MAAI;AACF,mBAAe,QAAQ,OAAO,QAAQ;AACtC,wBAAoB,aAAa,OAAO;AAAA,EAC1C,SAAS,KAAP;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,wBAA2C,CAAC;AAElD,QAAM,UAAU,WAAW,iBAAiB;AAC5C,MAAI,IAAI;AACR,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY;AACvB,QAAI,SAAS,YAAY;AACvB;AAAA,IACF;AAEA,QAAI,QAAQ;AACZ,QAAI,UAAU;AACd,QAAI,SAAS;AAEb,UAAM,QAAQ,aAAa,MAAM,OAAO;AAExC,QAAI,CAAC,CAAC,UAAU,QAAQ,EAAE,SAAS,MAAM,IAAI,GAAG;AAC9C,YAAM,cAAc,KAAK,WAAW,MAAM,IAAI,EAAE;AAChD,eAAS,CAAC,CAAC;AAEX,UAAI,MAAM,SAAS,cAAc,MAAM,QAAQ,QAAQ,GAAG;AACxD,cAAM,eAAe,SAClB,IAAI,CAAC,MAAW;AACf,gBAAM,SAAS,cAAmB,cAAc,MAAM,CAAC;AACvD,cAAI,OAAO,WAAW,UAAU;AAC9B,mBAAO,IAAI,OAAO;AAClB,mBAAO;AAAA,UACT,OAAO;AACL,mBAAO;AAAA,UACT;AAAA,QACF,CAAC,EACA,OAAO,OAAK,OAAO,GAAG,MAAM,QAAQ;AAGvC,gBAAQ;AACR,kBAAU;AAAA,MACZ,OAAO;AACL,gBAAQ,cAAc,cAAc,aAAa,QAAQ;AACzD,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,IAAI,MAAM,MAAM,UAAU,KAAK,EAAE;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,SAAS;AAAU,cAAQ,EAAC,GAAE,MAAK;AAE7C,0BAAsB,OAAO;AAAA,MAC3B,MAAM,EAAC,GAAG,KAAI;AAAA,MACd,MAAM,MAAM,SAAS,WAAW,sBAAsB;AAAA,MACtD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,OAAO,eAAe;AAC5C,QAAM,iBAAiB,OAAO,eAAe;AAG7C,QAAM,EAAC,kBAAkB,sBAAqB;AAE9C,MAAI,QAAuC;AAAA,IACzC,KAAK;AAAA,IACL,SAAS;AAAA,EACX;AAEA,MAAI,iBAAiB;AACrB,MAAI,kBAAkB,UAAU;AAC9B,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,kBAAkB,QAAQ,EAAE;AACvD,cAAQ;AAAA,QACN;AAAA,QACA,SAAS,iBAAiB,QAAQ,WAAW,OAAO;AAAA,MACtD;AACA,uBAAiB;AAAA,IACnB,QAAE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,kBAAkB,0BAA0B,cAAc,GAAG;AAChE,YAAQ;AAAA,MACN,UAAU,QAAQ,SAAS;AAAA,MAC3B,SAAS,eAAe,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,eAAmC;AAAA,IACvC;AAAA,IACA;AAAA,IACA,OAAO,YAAY;AAAA,IACnB;AAAA,IACA,YAAY;AAAA,EACd;AAEA,MAAI,YAAY,MAAM,YAAY,YAAY,QAAQ,GAAG,eAAe,YAAY,MAAM,QAAQ,GAAG;AACnG,iBAAa,qBAAqB,YAAY,QAAQ,QAAQ,aAAa,YAAY,MAAM,QAAQ;AAAA,EACvG;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;;;AC9TA;AAAA;AAAA;AAAA;AAAA;AAiBA,IAAM,6BAAgD;AACtD,IAAM,+BAA+B;AAIrC,IAAM,wBAAwB,CAAC,YAA2E;AACxG,MAAI,mBAAsC;AAC1C,MAAI,8BAA8B,SAAS,kBAAkB,0BAA0B,GAAG;AACxF,uBAAmB,QAAS;AAAA,EAC9B;AAEA,QAAM,oBAAoB,OAAO,SAAS,sBAAsB,WAC5D,QAAQ,oBACR;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAIO,IAAM,oCAAoC,OAAO,cAAsB,YAA6B,YAA+F;AACxM,QAAM,iBAAiB,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,YAAY,GAAG,SAAS;AAClF,QAAM,aAAa,OAAO,mBAAmB,WAAW,+BAAuC,cAAc,IAAI;AACjH,QAAM,cAAc,CAAC,CAAC,WAAW,KAAK,CAAC,EAAC,UAAS,QAAQ,oBAAoB;AAE7E,MAAI,aAAa;AACf,UAAM,mBAAmB,sBAAsB,OAAO;AACtD,WAAO,MAAM,AAAU,0BAA0B,cAAc,YAAY,gBAAgB;AAAA,EAC7F,WAAW,eAAe,uBAA+B;AACvD,WAAO,MAAM,AAAW,qCAAqC,cAAc,UAAU;AAAA,EACvF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,IAAI,gBAAgB,2BAA2B;AAAA,EACxD;AACF;AAEO,IAAM,yBAAyB,OAAO,cAAsB,SAAiB,UAAkC,QAAuC,YAAoF;AAC/O,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,gBAAgB,qDAAqD;AAAA,IAClF;AAAA,EACF;AACA,QAAM,iBAAoC,SAAS,QAAQ;AAE3D,MAAI,OAAO,eAAe,uBAA+B;AACvD,WAAO,MAAM,AAAM,0BAA0B,cAAc,SAAS,gBAAgB,MAAM;AAAA,EAC5F,WAAW,OAAO,eAAe,mBAA4B;AAC3D,UAAM,mBAAmB,sBAAsB,OAAO;AACtD,WAAO,MAAM,AAAU,qBAAqB,cAAc,SAAS,UAAU,QAAQ,gBAAgB;AAAA,EACvG;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,OAAO,IAAI,gBAAgB,6DAA6D,OAAO,YAAY;AAAA,EAC7G;AACF;;;ACtEO,IAAM,cAAc;AAAA,EACzB,QAAQ;AAAA,IACN,kBAA4B;AAAA,IAC5B,OAAiB;AAAA,EACnB;AAAA,EACA,cAAc;AAAA,IACZ,kBAA6B;AAAA,IAC7B,oCAA+C;AAAA,IAC/C,OAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AACF;;;AC8DA,IAAM,kBAAkB,CAAC,kBAAoD;AAC3E,SAAO,cAAc,IAAI,cAAY;AACnC,WAAO;AAAA,MACL,KAAK,YAAY,kBAAkB,SAAS,GAAG;AAAA,MAC/C,OAAO,YAAY,kBAAkB,SAAS,KAAK;AAAA,IACrD;AAAA,EACF,CAAC;AACH;AAEA,IAAM,gCAAgC,CAAC,6BAAsE;AAC3G,MAAI,CAAC,MAAM,QAAQ,wBAAwB,GAAG;AAC5C,WAAO,CAAC;AAAA,EACV;AACA,SAAO,yBAAyB,IAAI,SAAO;AACzC,WAAO;AAAA,MACL,KAAK,YAAY,kBAAkB,IAAI,GAAG;AAAA,MAC1C,YAAY,IAAI;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAGO,IAAM,kBAAN,cAA8B,gBAAgB;AAAA,EAMnD,MAAM,WAAW,SAAkC;AACjD,UAAM,mBAAmB,gBAAQ,GAAG,sCAAsC,OAAO;AAEjF,WAAO,MAAM,MAAM,WAAW,gBAAgB;AAAA,EAChD;AAAA,EAEA,MAAM,cAAc,cAAsB,SAAiC;AACzE,UAAM,qBAAqB,MAAM,KAAK,IAAI,IAAI,OAAO,eAAe,YAAY;AAChF,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,mBAAmB,OAAO;AAEhD,UAAM,cAAa;AAAA,MACjB,IAAI;AAAA,MACJ;AAAA,MACA,OAAO,cAAc;AAAA,MACrB,iBAAiB,gBAAQ,UAAU,iBAAiB,cAAc,KAAK;AAAA,MACvE,MAAM,cAAc;AAAA,MACpB,MAAM,YAAY,QAAQ,cAAc,IAAI;AAAA,MAC5C,aAAa,YAAY,QAAQ,cAAc,WAAW;AAAA,MAC1D,aAAa,YAAY,kBAAkB,cAAc,WAAW;AAAA,MACpE,aAAa,cAAc;AAAA,MAC3B,QAAQ,cAAc;AAAA,MACtB,aAAa,cAAc;AAAA,MAC3B,0BAA0B,8BAA8B,cAAc,wBAAwB;AAAA,MAC9F,YAAY,gBAAgB,cAAc,cAAc,CAAC,CAAC;AAAA,MAC1D,UAAU,cAAc;AAAA,MAExB,iBAAiB;AAAA,MACjB,WAAW,CAAC;AAAA,MACZ,aAAa;AAAA,MAEb,cAAc;AAAA,MACd,2BAA2B;AAAA,MAE3B,IAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,MACA,IAAI,QAAQ;AACV,eAAO,mBAAmB,QAAQ;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,YAAY,OAAO,iBAAiB,cAAc,YAAW,UAAU;AAClG,gBAAW,eAAe,aAAa;AACvC,gBAAW,4BAA4B,aAAa;AAEpD,QAAI,SAAS,YAAY,SAAS,sBAAsB;AACtD,kBAAW,kBAAmB,OAAM,KAAK,IAAI,IAAI,OAAO,0BAA0B,YAAY,GAAG,QAAQ;AAAA,IAC3G;AAEA,QAAI,SAAS,YAAY,SAAS,aAAa;AAC7C,kBAAW,YAAa,OAAM,KAAK,IAAI,IAAI,OAAO,UAAU,YAAY,GAAG,QAAQ;AAAA,IACrF;AAEA,QAAI,SAAS,YAAY,SAAS,kBAAkB;AAClD,kBAAW,cAAe,OAAM,KAAK,IAAI,IAAI,OAAO,YAAY,YAAY,GAAG,SAAS;AAAA,IAC1F;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,cAAsB,SAAiB,SAA4B;AAChF,UAAM,gBAAgB,MAAM,KAAK,IAAI,IAAI,OAAO,UAAU,cAAc,OAAO;AAE/E,QAAI,CAAC,iBAAiB,CAAC,cAAc;AAAO,aAAO;AAEnD,UAAM,WAAW,cAAc,OAAO;AAEtC,UAAM,QAAwB,gBAAQ,QAAQ,yBAAyB,SAAS,KAAK;AACrF,UAAM,kBAAkC,gBAAQ,QAAQ,mCAAmC,SAAS,KAAK;AAEzG,UAAM,cAAkD,SAAS,eAC7D,MAAM,YAAY,OAAO,MAAM,cAAc,SAAS,eAAe,SAAS,YAAY,IAC1F,EAAC,QAAQ,MAAM,OAAO,IAAI,gBAAgB,iCAAiC,EAAC;AAEhF,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,gBAAgB,SAAS,UAAU;AAAA,MAC/C,aAAa,YAAY;AAAA,MACzB,0BAA0B,YAAY;AAAA,MACtC,IAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,MACA,IAAI,QAAQ;AACV,eAAO,cAAc,QAAQ;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAQA,cAAc,QAAsC,SAAyC;AAC3F,UAAM,YAAY,gBAAQ,GAAG,sCAAsC,OAAO,SAAS;AACnF,WAAO,MAAM,cAAc,EAAC,GAAG,QAAQ,UAAS,GAAG,OAAO;AAAA,EAC5D;AAAA,EAMA,iBAAiB,QAAyC,SAA4B;AACpF,WAAO,IAAI,0BAA0B,KAAK,KAAK,QAAQ,OAAO;AAAA,EAChE;AAAA,EAEA,mBAAmB,QAA2C,SAA4B;AACxF,WAAO,IAAI,4BAA4B,KAAK,KAAK,QAAQ,OAAO;AAAA,EAClE;AAAA,EAEA,sBAAsB,QAA8C,SAA4B;AAC9F,WAAO,IAAI,+BAA+B,KAAK,KAAK,QAAQ,OAAO;AAAA,EACrE;AAAA,EAEA,qBAAqB,QAA6C,SAA4B;AAC5F,WAAO,IAAI,8BAA8B,KAAK,KAAK,QAAQ,OAAO;AAAA,EACpE;AAAA,EAEA,mBAAmB,QAA2C,SAA4B;AACxF,WAAO,IAAI,4BAA4B,KAAK,KAAK,QAAQ,OAAO;AAAA,EAClE;AAAA,EAEA,sBAAsB,QAA8C,SAA4B;AAC9F,WAAO,IAAI,+BAA+B,KAAK,KAAK,QAAQ,OAAO;AAAA,EACrE;AAAA,EAEA,wBAAwB,QAAgD,SAA4B;AAClG,WAAO,IAAI,iCAAiC,KAAK,KAAK,QAAQ,OAAO;AAAA,EACvE;AAAA,EAEA,eAAe,QAAuC,SAA4B;AAChF,WAAO,IAAI,wBAAwB,KAAK,KAAK,QAAQ,OAAO;AAAA,EAC9D;AAAA,EAEA,oBAAoB,QAA4C,SAA4B;AAC1F,WAAO,IAAI,6BAA6B,KAAK,KAAK,QAAQ,OAAO;AAAA,EACnE;AAAA,EAMA,eAAe,QAAuC,SAA4B;AAChF,WAAO,IAAI,wBAAwB,KAAK,KAAK,QAAQ,OAAO;AAAA,EAC9D;AAAA,EAEA,wBAAwB,QAAgD,SAA4B;AAClG,WAAO,IAAI,iCAAiC,KAAK,KAAK,QAAQ,OAAO;AAAA,EACvE;AACF;;;AC9QO,IAAM,YAAY;AAAA,EACvB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AAAA,IACL,WAAW;AAAA,EACb;AACF;;;AjDXO,IAAM,QAAY;","names":[]}