{"version":3,"file":"lib.cjs","sources":["../../src/lib.js"],"sourcesContent":["/**\n * A client library for the https://web3.storage/ service. It provides a convenient\n * interface for working with the [Raw HTTP API](https://web3.storage/#api-docs)\n * from a web browser or [Node.js](https://nodejs.org/) and comes bundled with\n * TS for out-of-the box type inference and better IntelliSense.\n *\n * @example\n * ```js\n * import { Web3Storage, File } from 'web3.storage'\n * const client = new Web3Storage({ token: API_TOKEN })\n *\n * const cid = await client.put([new File(['hello world'], 'hello.txt', { type: 'text/plain' })])\n * ```\n * @module\n */\nimport { transform } from 'streaming-iterables'\nimport pRetry, { AbortError } from 'p-retry'\nimport { pack } from 'ipfs-car/pack'\nimport { parseLinkHeader } from '@web3-storage/parse-link-header'\nimport { unpackStream } from 'ipfs-car/unpack'\nimport { TreewalkCarSplitter } from 'carbites/treewalk'\nimport { CarReader } from '@ipld/car'\nimport { filesFromPath, getFilesFromPath } from 'files-from-path'\nimport throttledQueue from 'throttled-queue'\nimport {\n  fetch as _fetch,\n  File,\n  Blob,\n  Blockstore\n} from './platform.js'\n\nconst MAX_PUT_RETRIES = 5\nconst MAX_CONCURRENT_UPLOADS = 3\nconst DEFAULT_CHUNK_SIZE = 1024 * 1024 * 50 // chunk to ~50MB CARs\nconst MAX_BLOCK_SIZE = 1048576\nconst MAX_CHUNK_SIZE = 104857600\n// These match what is enforced server-side\nconst RATE_LIMIT_REQUESTS = 30\nconst RATE_LIMIT_PERIOD = 10 * 1000\n\n/** @typedef { import('./lib/interface.js').API } API */\n/** @typedef { import('./lib/interface.js').Status} Status */\n/** @typedef { import('./lib/interface.js').Upload} Upload */\n/** @typedef { import('./lib/interface.js').Deal} Deal */\n/** @typedef { import('./lib/interface.js').Pin} Pin */\n/** @typedef { import('./lib/interface.js').Service } Service */\n/** @typedef { import('./lib/interface.js').Web3File} Web3File */\n/** @typedef { import('./lib/interface.js').Filelike } Filelike */\n/** @typedef { import('./lib/interface.js').CIDString} CIDString */\n/** @typedef { import('./lib/interface.js').RequestOptions} RequestOptions */\n/** @typedef { import('./lib/interface.js').PutOptions} PutOptions */\n/** @typedef { import('./lib/interface.js').PutCarOptions} PutCarOptions */\n/** @typedef { import('./lib/interface.js').ListOptions} ListOptions */\n/** @typedef { import('./lib/interface.js').RateLimiter } RateLimiter */\n/** @typedef { import('./lib/interface.js').UnixFSEntry} UnixFSEntry */\n/** @typedef { import('./lib/interface.js').Web3Response} Web3Response */\n\n/**\n * Creates a rate limiter which limits at the same rate as is enforced\n * server-side, to allow the client to avoid exceeding the requests limit and\n * being blocked for 30 seconds.\n * @returns {RateLimiter}\n */\nexport function createRateLimiter () {\n  const throttle = throttledQueue(RATE_LIMIT_REQUESTS, RATE_LIMIT_PERIOD)\n  return () => throttle(() => {})\n}\n\n/**\n * Rate limiter used by static API if no rate limiter is passed. Note that each\n * instance of the Web3Storage class gets it's own limiter if none is passed.\n * This is because rate limits are enforced per API token.\n */\nconst globalRateLimiter = createRateLimiter()\n\n/**\n * @implements Service\n */\nclass Web3Storage {\n  /**\n   * Constructs a client bound to the given `options.token` and\n   * `options.endpoint`.\n   *\n   * @example\n   * ```js\n   * import { Web3Storage } from 'web3.storage'\n   * const client = new Web3Storage({ token: API_TOKEN })\n   * ```\n   *\n    @param {Service} options\n   */\n  constructor ({\n    token,\n    endpoint = new URL('https://api.web3.storage'),\n    rateLimiter,\n    fetch = _fetch\n  }) {\n    /**\n     * Authorization token.\n     *\n     * @readonly\n     */\n    this.token = token\n    /**\n     * Service API endpoint `URL`.\n     * @readonly\n     */\n    this.endpoint = endpoint\n    /**\n     * @readonly\n     */\n    this.rateLimiter = rateLimiter || createRateLimiter()\n    /**\n     * Optional custom fetch function. Defaults to global fetch in browsers or @web-std/fetch on node.\n     * @readonly\n     */\n    this.fetch = fetch\n  }\n\n  /**\n   * @hidden\n   * @param {string} token\n   * @returns {Record<string, string>}\n   */\n  static headers (token) {\n    if (!token) throw new Error('missing token')\n    return {\n      Authorization: `Bearer ${token}`,\n      'X-Client': 'web3.storage/js'\n    }\n  }\n\n  /**\n   * @param {Service} service\n   * @param {Iterable<Filelike>} files\n   * @param {PutOptions} [options]\n   * @returns {Promise<CIDString>}\n   */\n  static async put ({ endpoint, token, rateLimiter = globalRateLimiter, fetch = _fetch }, files, {\n    onRootCidReady,\n    onStoredChunk,\n    maxRetries = MAX_PUT_RETRIES,\n    maxChunkSize = DEFAULT_CHUNK_SIZE,\n    wrapWithDirectory = true,\n    name,\n    signal\n  } = {}) {\n    if (maxChunkSize >= MAX_CHUNK_SIZE || maxChunkSize < MAX_BLOCK_SIZE) {\n      throw new Error('maximum chunk size must be less than 100MiB and greater than or equal to 1MB')\n    }\n    const blockstore = new Blockstore()\n    try {\n      const { out, root } = await pack({\n        input: Array.from(files).map(toImportCandidate),\n        blockstore,\n        wrapWithDirectory,\n        maxChunkSize: MAX_BLOCK_SIZE,\n        maxChildrenPerNode: 1024\n      })\n      onRootCidReady && onRootCidReady(root.toString())\n      const car = await CarReader.fromIterable(out)\n      return await Web3Storage.putCar({ endpoint, token, rateLimiter, fetch }, car, { onStoredChunk, maxRetries, maxChunkSize, name, signal })\n    } finally {\n      await blockstore.close()\n    }\n  }\n\n  /**\n   * @param {Service} service\n   * @param {import('@ipld/car/api').CarReader} car\n   * @param {PutCarOptions} [options]\n   * @returns {Promise<CIDString>}\n   */\n  static async putCar ({ endpoint, token, rateLimiter = globalRateLimiter, fetch = _fetch }, car, {\n    name,\n    onStoredChunk,\n    maxRetries = MAX_PUT_RETRIES,\n    maxChunkSize = DEFAULT_CHUNK_SIZE,\n    decoders,\n    signal\n  } = {}) {\n    if (maxChunkSize >= MAX_CHUNK_SIZE || maxChunkSize < MAX_BLOCK_SIZE) {\n      throw new Error('maximum chunk size must be less than 100MiB and greater than or equal to 1MB')\n    }\n    const targetSize = maxChunkSize\n    const url = new URL('car', endpoint)\n    const headers = {\n      ...Web3Storage.headers(token),\n      'Content-Type': 'application/vnd.ipld.car',\n      ...(name ? { 'X-Name': encodeURIComponent(name) } : {})\n    }\n\n    const roots = await car.getRoots()\n    if (roots[0] == null) {\n      throw new Error('missing root CID')\n    }\n    if (roots.length > 1) {\n      throw new Error('too many roots')\n    }\n\n    const carRoot = roots[0].toString()\n    const splitter = new TreewalkCarSplitter(car, targetSize, { decoders })\n\n    /**\n     * @param {AsyncIterable<Uint8Array>} car\n     * @returns {Promise<CIDString>}\n     */\n    const onCarChunk = async car => {\n      const carParts = []\n      for await (const part of car) {\n        carParts.push(part)\n      }\n\n      const carFile = new Blob(carParts, { type: 'application/vnd.ipld.car' })\n\n      /** @type {Blob|ArrayBuffer} */\n      let body = carFile\n      // FIXME: should not be necessary to await arrayBuffer()!\n      // Node.js 20 hangs reading the stream (it never ends) but in\n      // older node versions and the browser it is fine to pass a blob.\n      /* c8 ignore next 3 */\n      if (parseInt(globalThis.process?.versions?.node) > 18) {\n        body = await body.arrayBuffer()\n      }\n\n      const res = await pRetry(\n        async () => {\n          await rateLimiter()\n          /** @type {Response} */\n          let response\n          try {\n            response = await fetch(url.toString(), {\n              method: 'POST',\n              headers,\n              body,\n              signal\n            })\n          } catch (/** @type {any} */err) {\n            throw signal && signal.aborted ? new AbortError(err) : err\n          }\n          /* c8 ignore next 3 */\n          if (response.status === 429) {\n            throw new Error('rate limited')\n          }\n          const res = await response.json()\n          if (!response.ok) {\n            throw new Error(res.message)\n          }\n\n          if (res.cid !== carRoot) {\n            throw new Error(`root CID mismatch, expected: ${carRoot}, received: ${res.cid}`)\n          }\n          return res.cid\n        },\n        { retries: maxRetries }\n      )\n\n      onStoredChunk && onStoredChunk(carFile.size)\n      return res\n    }\n\n    const upload = transform(MAX_CONCURRENT_UPLOADS, onCarChunk)\n    for await (const _ of upload(splitter.cars())) {} // eslint-disable-line\n    return carRoot\n  }\n\n  /**\n   * @param {Service} service\n   * @param {CIDString} cid\n   * @param {RequestOptions} [options]\n   * @returns {Promise<Web3Response | null>}\n   */\n  static async get ({ endpoint, token, rateLimiter = globalRateLimiter, fetch = _fetch }, cid, options = {}) {\n    const url = new URL(`car/${cid}`, endpoint)\n    await rateLimiter()\n    const res = await fetch(url.toString(), {\n      method: 'GET',\n      headers: Web3Storage.headers(token),\n      signal: options.signal\n    })\n    /* c8 ignore next 3 */\n    if (res.status === 429) {\n      throw new Error('rate limited')\n    }\n    return toWeb3Response(res)\n  }\n\n  /**\n   * @param {Service} service\n   * @param {CIDString} cid\n   * @param {RequestOptions} [options]\n   * @returns {Promise<CIDString>}\n   */\n  /* c8 ignore next 4 */\n  static async delete ({ endpoint, token, rateLimiter = globalRateLimiter }, cid, options = {}) {\n    console.log('Not deleting', cid, endpoint, token, rateLimiter, options)\n    throw Error('.delete not implemented yet')\n  }\n\n  /**\n   * @param {Service} service\n   * @param {CIDString} cid\n   * @param {RequestOptions} [options]\n   * @returns {Promise<Status | undefined>}\n   */\n  static async status ({ endpoint, token, rateLimiter = globalRateLimiter, fetch = _fetch }, cid, options = {}) {\n    const url = new URL(`status/${cid}`, endpoint)\n    await rateLimiter()\n    const res = await fetch(url.toString(), {\n      method: 'GET',\n      headers: Web3Storage.headers(token),\n      signal: options.signal\n    })\n    /* c8 ignore next 3 */\n    if (res.status === 429) {\n      throw new Error('rate limited')\n    }\n    if (res.status === 404) {\n      return undefined\n    }\n    if (!res.ok) {\n      throw new Error(res.statusText)\n    }\n    return res.json()\n  }\n\n  /**\n   * @param {Service} service\n   * @param {ListOptions} [opts]\n   * @returns {AsyncIterable<Upload>}\n   */\n  static async * list (service, { before = new Date().toISOString(), maxResults = Infinity, signal } = {}) {\n    /**\n     * @param {Service} service\n     * @param {{before: string, size: number}} opts\n     * @returns {Promise<Response>}\n     */\n    async function listPage ({ endpoint, token, rateLimiter = globalRateLimiter, fetch = _fetch }, { before, size }) {\n      const search = new URLSearchParams({ before, size: size.toString() })\n      const url = new URL(`user/uploads?${search}`, endpoint)\n      await rateLimiter()\n      return fetch(url.toString(), {\n        method: 'GET',\n        headers: {\n          ...Web3Storage.headers(token),\n          'Access-Control-Request-Headers': 'Link'\n        },\n        signal\n      })\n    }\n    let count = 0\n    const size = maxResults > 100 ? 100 : maxResults\n    for await (const res of paginator(listPage, service, { before, size })) {\n      if (!res.ok) {\n        /* c8 ignore next 3 */\n        if (res.status === 429) {\n          throw new Error('rate limited')\n        }\n\n        /* c8 ignore next 2 */\n        const errorMessage = await res.json()\n        throw new Error(`${res.status} ${res.statusText} ${errorMessage ? '- ' + errorMessage.message : ''}`)\n      }\n      const page = await res.json()\n      for (const upload of page) {\n        if (++count > maxResults) {\n          return\n        }\n        yield upload\n      }\n    }\n  }\n\n  // Just a sugar so you don't have to pass around endpoint and token around.\n\n  /**\n   * Uploads files to web3.storage. Files are hashed in the client and uploaded as a single\n   * [Content Addressed Archive(CAR)](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md).\n   * Takes a [Blob](https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob)\n   *\n   * Returns the corresponding Content Identifier (CID).\n   *\n   * @example\n   * ```js\n   * const file = new File(['hello world'], 'hello.txt', { type: 'text/plain' })\n   * const cid = await client.put([file])\n   * ```\n   * @param {Iterable<Filelike>} files\n   * @param {PutOptions} [options]\n   */\n  put (files, options) {\n    return Web3Storage.put(this, files, options)\n  }\n\n  /**\n   * Uploads a CAR ([Content Addressed Archive](https://github.com/ipld/specs/blob/master/block-layer/content-addressable-archives.md)) file to web3.storage.\n   * Takes a CarReader interface from @ipld/car\n   *\n   * Returns the corresponding Content Identifier (CID).\n   *\n   * @example\n   * ```js\n   * import fs from 'fs'\n   * import { Readable } from 'stream'\n   * import { CarReader, CarWriter } from '@ipld/car'\n   * import * as raw from 'multiformats/codecs/raw'\n   * import { CID } from 'multiformats/cid'\n   * import { sha256 } from 'multiformats/hashes/sha2'\n   *\n   * async function getCar() {\n   *    const bytes = new TextEncoder().encode('random meaningless bytes')\n   *    const hash = await sha256.digest(raw.encode(bytes))\n   *    const cid = CID.create(1, raw.code, hash)\n   *\n   *    // create the writer and set the header with a single root\n   *    const { writer, out } = await CarWriter.create([cid])\n   *    Readable.from(out).pipe(fs.createWriteStream('example.car'))\n\n   *    // store a new block, creates a new file entry in the CAR archive\n   *    await writer.put({ cid, bytes })\n   *    await writer.close()\n\n   *    const inStream = fs.createReadStream('example.car')\n   *    // read and parse the entire stream in one go, this will cache the contents of\n   *    // the car in memory so is not suitable for large files.\n   *    const reader = await CarReader.fromIterable(inStream)\n   *    return reader\n   * }\n   *\n   * const car = await getCar()\n   * const cid = await client.putCar(car)\n   * ```\n   * @param {import('@ipld/car/api').CarReader} car\n   * @param {PutCarOptions} [options]\n   */\n  putCar (car, options) {\n    return Web3Storage.putCar(this, car, options)\n  }\n\n  /**\n   * Fetch the Content Addressed Archive by its root CID.\n   * @param {CIDString} cid\n   * @param {RequestOptions} [options]\n   */\n  get (cid, options) {\n    return Web3Storage.get(this, cid, options)\n  }\n\n  /**\n   * @param {CIDString} cid\n   * @param {RequestOptions} [options]\n   */\n  /* c8 ignore next 3 */\n  delete (cid, options) {\n    return Web3Storage.delete(this, cid, options)\n  }\n\n  /**\n   * Fetch info on Filecoin deals and IPFS pins that a given CID is replicated in.\n   * @param {CIDString} cid\n   * @param {RequestOptions} [options]\n   */\n  status (cid, options) {\n    return Web3Storage.status(this, cid, options)\n  }\n\n  /**\n   * Find all uploads for this account. Use a `for await...of` loop to fetch them all.\n   * @example\n   * Fetch all the uploads\n   * ```js\n   * const uploads = []\n   * for await (const item of client.list()) {\n   *    uploads.push(item)\n   * }\n   * ```\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of\n   * @param {ListOptions} [opts]\n   * @returns {AsyncIterable<Upload>}\n   */\n  list (opts) {\n    return Web3Storage.list(this, opts)\n  }\n}\n\n/**\n * Map a UnixFSEntry to a File with a cid property.\n *\n * @param {UnixFSEntry} entry\n * @returns {Promise<Web3File>}\n */\nasync function toWeb3File ({ content, path, cid }) {\n  const chunks = []\n  for await (const chunk of content()) {\n    chunks.push(chunk)\n  }\n  const file = new File(chunks, toFilenameWithPath(path))\n  return Object.assign(file, { cid: cid.toString() })\n}\n\n/**\n * Trim the root cid from the path if there is anyting after it.\n * bafy...ic2q/path/to/pinpie.jpg => path/to/pinpie.jpg\n *         bafy...ic2q/pinpie.jpg => pinpie.jpg\n *                    bafk...52zy => bafk...52zy\n * @param {string} unixFsPath\n * @returns {string}\n */\nfunction toFilenameWithPath (unixFsPath) {\n  const slashIndex = unixFsPath.indexOf('/')\n  return slashIndex === -1 ? unixFsPath : unixFsPath.substring(slashIndex + 1)\n}\n\n/**\n * Add car unpacking smarts to the response object,\n * @param {Response} res\n * @returns {Web3Response}\n */\nfunction toWeb3Response (res) {\n  const response = Object.assign(res, {\n    unixFsIterator: async function * () {\n      if (!res.ok) {\n        throw new Error(`Response was not ok: ${res.status} ${res.statusText} - Check for { \"ok\": false } on the Response object before calling .unixFsIterator`)\n      }\n      /* c8 ignore next 3 */\n      if (!res.body) {\n        throw new Error('No body on response')\n      }\n      const blockstore = new Blockstore()\n      try {\n        for await (const entry of unpackStream(res.body, { blockstore })) {\n          yield entry\n        }\n      } finally {\n        await blockstore.close()\n      }\n    },\n    files: async () => {\n      if (!res.ok) {\n        throw new Error(`Response was not ok: ${res.status} ${res.statusText} - Check for { \"ok\": false } on the Response object before calling .files`)\n      }\n      const files = []\n      // @ts-ignore we're using the enriched response here\n      for await (const entry of response.unixFsIterator()) {\n        if (entry.type === 'directory') {\n          continue\n        }\n        const file = await toWeb3File(entry)\n        files.push(file)\n      }\n      return files\n    }\n  })\n  return response\n}\n\n/**\n * Convert the passed file to an \"import candidate\" - an object suitable for\n * passing to the ipfs-unixfs-importer. Note: content is an accessor so that\n * the stream is only created when needed.\n *\n * @param {Filelike} file\n */\nfunction toImportCandidate (file) {\n  /** @type {ReadableStream} */\n  let stream\n  return {\n    path: file.name,\n    get content () {\n      stream = stream || file.stream()\n      return stream\n    }\n  }\n}\n\n/**\n * Follow Link headers on a Response, to fetch all the things.\n *\n * @param {(service: Service, opts: any) => Promise<Response>} fn\n * @param {Service} service\n * @param {{}} opts\n */\nasync function * paginator (fn, service, opts) {\n  let res = await fn(service, opts)\n  yield res\n  let link = parseLinkHeader(res.headers.get('Link') || '')\n  // @ts-ignore\n  while (link && link.next) {\n    // @ts-ignore\n    res = await fn(service, link.next)\n    yield res\n    link = parseLinkHeader(res.headers.get('Link') || '')\n  }\n}\n\nexport { Web3Storage, File, Blob, filesFromPath, getFilesFromPath }\n\n/**\n * Just to verify API compatibility.\n * TODO: convert lib to a regular class that can be type checked.\n * @type {API}\n */\nconst api = Web3Storage\nvoid api // eslint-disable-line no-void\n"],"names":["throttledQueue","_fetch","Blockstore","pack","car","CarReader","TreewalkCarSplitter","Blob","pRetry","AbortError","transform","file","File","unpackStream","parseLinkHeader"],"mappings":"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AS;AACT,QAAQ,MAAM,OAAM;AACpB,OAAO;AACP,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE;AACvB,IAAI,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;AAChD,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE;AACxB,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;AACjD,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE;AACrB,IAAI,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;AAC9C,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE;AACxB,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;AACjD,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE;AACxB,IAAI,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;AACjD,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE;AACd,IAAI,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACvC,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;AACnD,EAAE,MAAM,MAAM,GAAG,GAAE;AACnB,EAAE,WAAW,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE;AACvC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAC;AACtB,GAAG;AACH,EAAE,MAAMU,MAAI,GAAG,IAAIC,SAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAC;AACzD,EAAE,OAAO,MAAM,CAAC,MAAM,CAACD,MAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;AACrD,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kBAAkB,EAAE,UAAU,EAAE;AACzC,EAAE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAC;AAC5C,EAAE,OAAO,UAAU,KAAK,CAAC,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;AAC9E,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,cAAc,EAAE,GAAG,EAAE;AAC9B,EAAE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;AACtC,IAAI,cAAc,EAAE,oBAAoB;AACxC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;AACnB,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,kFAAkF,CAAC,CAAC;AACjK,OAAO;AACP;AACA,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;AACrB,QAAQ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;AAC9C,OAAO;AACP,MAAM,MAAM,UAAU,GAAG,IAAIT,eAAU,GAAE;AACzC,MAAM,IAAI;AACV,QAAQ,WAAW,MAAM,KAAK,IAAIW,mBAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;AAC1E,UAAU,MAAM,MAAK;AACrB,SAAS;AACT,OAAO,SAAS;AAChB,QAAQ,MAAM,UAAU,CAAC,KAAK,GAAE;AAChC,OAAO;AACP,KAAK;AACL,IAAI,KAAK,EAAE,YAAY;AACvB,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;AACnB,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,yEAAyE,CAAC,CAAC;AACxJ,OAAO;AACP,MAAM,MAAM,KAAK,GAAG,GAAE;AACtB;AACA,MAAM,WAAW,MAAM,KAAK,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE;AAC3D,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;AACxC,UAAU,QAAQ;AAClB,SAAS;AACT,QAAQ,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAC;AAC5C,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI,EAAC;AACxB,OAAO;AACP,MAAM,OAAO,KAAK;AAClB,KAAK;AACL,GAAG,EAAC;AACJ,EAAE,OAAO,QAAQ;AACjB,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,iBAAiB,EAAE,IAAI,EAAE;AAClC;AACA,EAAE,IAAI,OAAM;AACZ,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI;AACnB,IAAI,IAAI,OAAO,CAAC,GAAG;AACnB,MAAM,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,GAAE;AACtC,MAAM,OAAO,MAAM;AACnB,KAAK;AACL,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC/C,EAAE,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAC;AACnC,EAAE,MAAM,IAAG;AACX,EAAE,IAAI,IAAI,GAAGC,+BAAe,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAC;AAC3D;AACA,EAAE,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE;AAC5B;AACA,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAC;AACtC,IAAI,MAAM,IAAG;AACb,IAAI,IAAI,GAAGA,+BAAe,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAC;AACzD,GAAG;AACH;;;;;;;;;;;;;;;;;;;;;"}