{"version":3,"file":"fill-from-locale.mjs","sources":["../../../server/src/services/fill-from-locale.ts"],"sourcesContent":["import { isArray } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { UID, Schema, Core } from '@strapi/types';\n\nconst READ_ACTION = 'plugin::content-manager.explorer.read';\nconst TEMP_KEY_DIGITS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/**\n * Returns the main display field for a model (e.g. title, name).\n * Uses content-manager configuration when available, falls back to first string attribute or 'id'.\n */\nconst getMainField = async (targetUid: UID.Schema): Promise<string> => {\n  const contentManagerContentTypeService = strapi\n    .plugin('content-manager')\n    .service('content-types');\n  const configuration = await contentManagerContentTypeService.findConfiguration({\n    uid: targetUid,\n  });\n  return configuration.settings.mainField;\n};\n\n/**\n * Returns the display label for a relation.\n * Matches the logic of the getRelationLabel function in the content-manager plugin.\n */\nconst getRelationLabel = (relation: Record<string, unknown>, mainField: string): string => {\n  const label = relation[mainField];\n  if (typeof label === 'string') return label;\n  return String(relation.documentId ?? '');\n};\n\nconst FIELDS_TO_IGNORE = new Set([\n  'createdAt',\n  'createdBy',\n  'updatedAt',\n  'updatedBy',\n  'id',\n  'documentId',\n  'publishedAt',\n  'strapi_stage',\n  'strapi_assignee',\n  'locale',\n  'status',\n  'localizations',\n]);\n\nconst STATUS_FIELDS = new Set(['id', 'documentId', 'locale', 'updatedAt', 'publishedAt']);\n\n/**\n * Mirrors fractional-indexing's initial key range, i.e. generateNKeysBetween(undefined, undefined, n).\n */\nconst generateInitialTempKeys = (length: number): string[] => {\n  let previousKey: string | undefined;\n\n  return Array.from({ length }, () => {\n    const nextKey = incrementInitialTempKey(previousKey);\n    previousKey = nextKey;\n    return nextKey;\n  });\n};\n\nconst incrementInitialTempKey = (key?: string): string => {\n  if (!key) {\n    return `a${TEMP_KEY_DIGITS[0]}`;\n  }\n\n  const [head, ...digits] = key;\n  let carry = true;\n\n  for (let index = digits.length - 1; carry && index >= 0; index -= 1) {\n    const nextDigitIndex = TEMP_KEY_DIGITS.indexOf(digits[index]) + 1;\n\n    if (nextDigitIndex === 0) {\n      throw new Error(`Invalid temporary key digit: ${digits[index]}`);\n    }\n\n    if (nextDigitIndex === TEMP_KEY_DIGITS.length) {\n      digits[index] = TEMP_KEY_DIGITS[0];\n    } else {\n      digits[index] = TEMP_KEY_DIGITS[nextDigitIndex];\n      carry = false;\n    }\n  }\n\n  if (!carry) {\n    return `${head}${digits.join('')}`;\n  }\n\n  if (head === 'z') {\n    throw new Error('Cannot increment temporary keys any further');\n  }\n\n  const nextHead = String.fromCharCode(head.charCodeAt(0) + 1);\n  if (nextHead > 'a') {\n    digits.push(TEMP_KEY_DIGITS[0]);\n  } else {\n    digits.pop();\n  }\n\n  return `${nextHead}${digits.join('')}`;\n};\n\n/**\n * Normalizes a value to an array: arrays pass through, single values become [value], null/undefined become [].\n */\nconst normalizeToArray = (value: unknown): unknown[] => {\n  if (isArray(value)) return value;\n  if (value) return [value];\n  return [];\n};\n\n/**\n * Type guard: returns true if the value is a valid relation object with documentId.\n */\nconst isValidRelation = (\n  rel: unknown\n): rel is { documentId: string; id?: number; locale?: string } =>\n  typeof rel === 'object' && rel !== null && 'documentId' in rel && !!(rel as any).documentId;\n\n/**\n * Maps relations from the source locale to target locale (batched for better performance).\n */\nconst resolveRelationsForLocaleBatch = async (\n  relations: Array<{ documentId: string; id?: number; locale?: string }>,\n  targetUid: UID.Schema,\n  targetLocale: string\n): Promise<Array<{ documentId: string; id: number | string; locale?: string } | null>> => {\n  const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n  const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n    strapi.getModel(targetUid)\n  );\n\n  if (!isTargetLocalized) {\n    return relations.map((rel) => {\n      if (rel.id === undefined) return null;\n      return { documentId: rel.documentId, id: rel.id };\n    });\n  }\n\n  const documentIds = [...new Set(relations.map((r) => r.documentId))];\n  const targetEntriesQuery = {\n    where: { documentId: { $in: documentIds }, locale: targetLocale },\n    select: [...STATUS_FIELDS],\n  };\n  const targetEntries = await strapi.db.query(targetUid).findMany(targetEntriesQuery);\n  const byDocumentId = new Map<string, (typeof targetEntries)[0]>();\n  for (const e of targetEntries) {\n    const existing = byDocumentId.get(e.documentId);\n    if (!existing || (e.publishedAt === null && existing.publishedAt !== null)) {\n      byDocumentId.set(e.documentId, e);\n    }\n  }\n\n  return relations.map((rel) => {\n    const entry = byDocumentId.get(rel.documentId);\n    if (!entry) return null;\n    return {\n      documentId: entry.documentId,\n      id: entry.id,\n      locale: entry.locale,\n    };\n  });\n};\n\n/**\n * Builds the where clause for relation queries: documentIds + locales (when target model is localized).\n */\nconst buildWhereForRelations = (\n  relations: Array<{ documentId: string; locale?: string }>,\n  documentIds: string[],\n  targetUid: UID.Schema\n): { documentId: { $in: string[] }; locale?: { $in: string[] } } => {\n  const where: { documentId: { $in: string[] }; locale?: { $in: string[] } } = {\n    documentId: { $in: documentIds },\n  };\n  const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n  const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n    strapi.getModel(targetUid)\n  );\n  if (isTargetLocalized) {\n    const locales = [...new Set(relations.map((r) => r.locale).filter(Boolean))] as string[];\n    if (locales.length > 0) {\n      where.locale = { $in: locales };\n    }\n  }\n  return where;\n};\n\n// ---------------------------------------------------------------------------\n// Batch pre-resolution\n// ---------------------------------------------------------------------------\n\ntype ValidRelation = { documentId: string; id?: number; locale?: string };\ntype ResolvedRelation = { documentId: string; id: number | string; locale?: string };\ntype RelationsByUid = Map<string, ValidRelation[]>;\n\ninterface UidResolutionData {\n  blocked: boolean;\n  mainField: string;\n  /** sourceDocumentId → resolved entry in targetLocale (null if not found) */\n  bySourceDocumentId: Map<string, ResolvedRelation | null>;\n  /** resolvedEntry.id → status string */\n  statusById: Map<number | string, string | undefined>;\n  /** resolvedEntry.id → mainField value */\n  labelById: Map<number | string, unknown>;\n}\n\n/**\n * Walk the full document tree and collect all valid relation objects grouped by targetUid.\n */\nconst collectRelationsByUid = (\n  data: Record<string, unknown>,\n  schema: Schema.ContentType | Schema.Component,\n  components: Record<string, Schema.Component>\n): RelationsByUid => {\n  const result: RelationsByUid = new Map();\n\n  const addRels = (uid: string, rels: ValidRelation[]) => {\n    const existing = result.get(uid) ?? [];\n    result.set(uid, existing.concat(rels));\n  };\n\n  const collect = (d: Record<string, unknown>, s: Schema.ContentType | Schema.Component) => {\n    if (!d || typeof d !== 'object') return;\n    for (const [key, value] of Object.entries(d)) {\n      const attribute = s?.attributes?.[key];\n      if (!attribute) continue;\n\n      if (attribute.type === 'relation') {\n        const attr = attribute as Schema.Attribute.Relation & {\n          relation?: string;\n          target?: string;\n        };\n        if (attr.relation?.toLowerCase().includes('morph') || !attr.target) continue;\n        const validRels = normalizeToArray(value).filter(isValidRelation);\n        if (validRels.length > 0) addRels(attr.target, validRels);\n      } else if (attribute.type === 'component') {\n        const compSchema = (components[attribute.component] ?? {\n          attributes: {},\n        }) as Schema.Component;\n        if (attribute.repeatable && isArray(value)) {\n          for (const item of value as Record<string, unknown>[]) {\n            collect(item, compSchema);\n          }\n        } else if (value) {\n          collect(value as Record<string, unknown>, compSchema);\n        }\n      } else if (attribute.type === 'dynamiczone' && isArray(value)) {\n        for (const item of value as Record<string, unknown>[]) {\n          const compUid = (item as any)?.__component as string;\n          const compSchema = (components[compUid] ?? { attributes: {} }) as Schema.Component;\n          collect(item as Record<string, unknown>, compSchema);\n        }\n      }\n    }\n  };\n\n  collect(data, schema);\n  return result;\n};\n\n/**\n * Resolves all relation targets for the requested locale in batches (per related content-type UID):\n * locale mapping, permissions, status, and labels.\n */\nconst resolveAllRelationsBatched = async (\n  relationsByUid: RelationsByUid,\n  targetLocale: string,\n  userAbility: any\n): Promise<Map<string, UidResolutionData>> => {\n  const result = new Map<string, UidResolutionData>();\n  await Promise.all(\n    [...relationsByUid.entries()].map(async ([targetUid, allRels]) => {\n      const empty: UidResolutionData = {\n        blocked: !userAbility.can(READ_ACTION, targetUid),\n        mainField: '',\n        bySourceDocumentId: new Map(),\n        statusById: new Map(),\n        labelById: new Map(),\n      };\n\n      if (empty.blocked) {\n        result.set(targetUid, empty);\n        return;\n      }\n\n      const mainField = await getMainField(targetUid as UID.Schema);\n      const validRels = allRels.filter(isValidRelation);\n\n      if (validRels.length === 0) {\n        result.set(targetUid, { ...empty, mainField });\n        return;\n      }\n\n      // Deduplicate by documentId before querying\n      const uniqueRels = [...new Map(validRels.map((r) => [r.documentId, r])).values()];\n      const resolvedList = await resolveRelationsForLocaleBatch(\n        uniqueRels,\n        targetUid as UID.Schema,\n        targetLocale\n      );\n\n      const bySourceDocumentId = new Map<string, ResolvedRelation | null>();\n      for (let i = 0; i < uniqueRels.length; i += 1) {\n        bySourceDocumentId.set(uniqueRels[i].documentId, resolvedList[i]);\n      }\n\n      const resolvedEntries = resolvedList.filter((r): r is ResolvedRelation => r !== null);\n\n      if (resolvedEntries.length === 0) {\n        result.set(targetUid, {\n          blocked: false,\n          mainField,\n          bySourceDocumentId,\n          statusById: new Map(),\n          labelById: new Map(),\n        });\n        return;\n      }\n\n      const documentIds = [...new Set(resolvedEntries.map((r) => r.documentId))];\n      const where = buildWhereForRelations(resolvedEntries, documentIds, targetUid as UID.Schema);\n\n      const [allStatusEntries, labelEntries] = await Promise.all([\n        contentTypes.hasDraftAndPublish(strapi.getModel(targetUid as UID.Schema))\n          ? strapi.db.query(targetUid).findMany({ where, select: [...STATUS_FIELDS] })\n          : Promise.resolve([]),\n        strapi.db.query(targetUid).findMany({\n          where,\n          select: ['documentId', 'id', 'locale', mainField],\n        }),\n      ]);\n\n      // Build status map\n      const statusById = new Map<number | string, string | undefined>();\n      if (allStatusEntries.length > 0) {\n        const documentMetadata = strapi.plugin('content-manager')?.service('document-metadata');\n        if (documentMetadata) {\n          const model = strapi.getModel(targetUid as UID.Schema);\n          const isLocalized = strapi\n            .plugin('i18n')\n            ?.service('content-types')\n            ?.isLocalizedContentType(model);\n          const groupKey = (e: { documentId: string; locale?: string }) =>\n            isLocalized && e.locale ? `${e.documentId}:${e.locale}` : e.documentId;\n\n          const byGroup = new Map<string, typeof allStatusEntries>();\n          for (const e of allStatusEntries) {\n            const key = groupKey(e);\n            const list = byGroup.get(key) ?? [];\n            list.push(e);\n            byGroup.set(key, list);\n          }\n\n          for (const entry of resolvedEntries) {\n            const key = groupKey(entry);\n            const entries = byGroup.get(key) ?? [];\n            if (!entries.length) continue;\n            const version = entries.find((e) => e.id === entry.id) ?? entries[0];\n            const otherVersions = entries.filter((e) => e.id !== version.id);\n            statusById.set(entry.id, documentMetadata.getStatus(version, otherVersions));\n          }\n        }\n      }\n\n      // Build label map\n      const labelById = new Map<number | string, unknown>();\n      for (const entry of labelEntries) {\n        labelById.set(entry.id, entry[mainField]);\n      }\n\n      result.set(targetUid, {\n        blocked: false,\n        mainField,\n        bySourceDocumentId,\n        statusById,\n        labelById,\n      });\n    })\n  );\n\n  return result;\n};\n\n/**\n * Build the { connect, disconnect } for a single relation attribute using pre-fetched data.\n */\nconst buildConnectFromPreResolved = (\n  value: unknown,\n  attribute: Schema.Attribute.Relation,\n  preResolved: Map<string, UidResolutionData>\n): { connect: unknown[]; disconnect: unknown[] } => {\n  const attr = attribute as Schema.Attribute.Relation & { relation?: string; target?: string };\n  if (attr.relation?.toLowerCase().includes('morph') || !attr.target) {\n    return { connect: [], disconnect: [] };\n  }\n\n  const uidData = preResolved.get(attr.target);\n  if (!uidData || uidData.blocked) {\n    return { connect: [], disconnect: [] };\n  }\n\n  const validRels = normalizeToArray(value).filter(isValidRelation);\n  if (validRels.length === 0) {\n    return { connect: [], disconnect: [] };\n  }\n\n  const connect = validRels\n    .map((rel, index) => {\n      const resolved = uidData.bySourceDocumentId.get(rel.documentId);\n      if (!resolved) return null;\n\n      const status = uidData.statusById.get(resolved.id);\n      const mainFieldValue = uidData.labelById.get(resolved.id);\n      const relationWithMainField: Record<string, unknown> = {\n        ...resolved,\n        [uidData.mainField]: mainFieldValue,\n      };\n      if (status !== undefined) {\n        relationWithMainField.status = status;\n      }\n\n      return {\n        ...relationWithMainField,\n        __temp_key__: `a${index}`,\n        label: getRelationLabel(relationWithMainField, uidData.mainField),\n      };\n    })\n    .filter((r): r is NonNullable<typeof r> => r !== null);\n\n  return { connect, disconnect: [] };\n};\n\n/**\n * Recursively process document data: remove internal fields and resolve relations using\n * pre-fetched resolution data (no additional DB calls).\n */\nconst processDocumentData = async (\n  data: Record<string, unknown>,\n  schema: Schema.ContentType | Schema.Component,\n  components: Record<string, Schema.Component>,\n  preResolved: Map<string, UidResolutionData>\n): Promise<Record<string, unknown>> => {\n  if (!data) {\n    return {};\n  }\n\n  const result: Record<string, unknown> = {};\n\n  for (const [key, value] of Object.entries(data)) {\n    if (FIELDS_TO_IGNORE.has(key)) {\n      continue;\n    }\n\n    const attribute = schema?.attributes?.[key];\n    if (!attribute) {\n      result[key] = value;\n      continue;\n    }\n\n    if (attribute.type === 'password') {\n      continue;\n    }\n\n    if (attribute.type === 'relation') {\n      result[key] = buildConnectFromPreResolved(\n        value,\n        attribute as Schema.Attribute.Relation,\n        preResolved\n      );\n      continue;\n    }\n\n    if (attribute.type === 'component') {\n      const compSchema = (components[attribute.component] || {\n        attributes: {},\n      }) as Schema.Component;\n      if (attribute.repeatable && isArray(value)) {\n        const tempKeys = generateInitialTempKeys(value.length);\n        result[key] = await Promise.all(\n          value.map(async (item: Record<string, unknown>, index: number) => {\n            const processed = await processDocumentData(item, compSchema, components, preResolved);\n            return { ...processed, __temp_key__: tempKeys[index] };\n          })\n        );\n      } else if (value) {\n        const processed = await processDocumentData(\n          value as Record<string, unknown>,\n          compSchema,\n          components,\n          preResolved\n        );\n        result[key] = processed;\n      } else {\n        result[key] = value;\n      }\n      continue;\n    }\n\n    if (attribute.type === 'dynamiczone' && isArray(value)) {\n      const tempKeys = generateInitialTempKeys(value.length);\n      result[key] = await Promise.all(\n        value.map(async (item: Record<string, unknown>, index: number) => {\n          const compSchema = (components[item?.__component as string] || {\n            attributes: {},\n          }) as Schema.Component;\n          const processed = await processDocumentData(item, compSchema, components, preResolved);\n          return { ...processed, __temp_key__: tempKeys[index] };\n        })\n      );\n      continue;\n    }\n\n    result[key] = value;\n  }\n\n  return result;\n};\n\nexport const createFillFromLocaleService = ({ strapi }: { strapi: Core.Strapi }) => {\n  return {\n    /**\n     * Fetch the raw populated document for the given locale without any transformation.\n     * The caller is responsible for sanitizing the output before passing it to transformDocument.\n     */\n    async fetchRawDocument(model: UID.ContentType, sourceLocale: string, documentId?: string) {\n      const populateBuilderService = strapi\n        .plugin('content-manager')\n        .service('populate-builder') as (uid: UID.ContentType) => {\n        populateDeep: (level: number) => { build: () => Promise<unknown> };\n      };\n      const modelDef = strapi.getModel(model);\n\n      if (!modelDef) {\n        throw new Error(`Model ${model} not found`);\n      }\n\n      // Build populate WITHOUT countRelations so we get full relation objects\n      const populate = await populateBuilderService(model).populateDeep(Infinity).build();\n\n      const docs = strapi.documents(model);\n      const baseParams = {\n        locale: sourceLocale,\n        populate: populate as never,\n      };\n\n      return documentId\n        ? docs.findOne({ ...baseParams, documentId })\n        : docs.findFirst({ ...baseParams });\n    },\n\n    /**\n     * Transform a (sanitized) document: strip internal fields, resolve relations to the target\n     * locale, and skip relations to content types the user cannot read.\n     */\n    async transformDocument(\n      document: Record<string, unknown>,\n      model: UID.ContentType,\n      targetLocale: string,\n      userAbility: any\n    ) {\n      const schema = strapi.getModel(model) as Schema.ContentType;\n      const getComponentSchema = (uid: string) =>\n        (strapi.getModel(uid as UID.Schema) ?? { attributes: {} }) as Schema.Component;\n      const components = new Proxy({} as Record<string, Schema.Component>, {\n        get(_, uid: string) {\n          return getComponentSchema(uid);\n        },\n      });\n\n      const relsByUid = collectRelationsByUid(document, schema, components);\n      const preResolved = await resolveAllRelationsBatched(relsByUid, targetLocale, userAbility);\n      return processDocumentData(document, schema, components, preResolved);\n    },\n  };\n};\n"],"names":["READ_ACTION","TEMP_KEY_DIGITS","getMainField","targetUid","contentManagerContentTypeService","strapi","plugin","service","configuration","findConfiguration","uid","settings","mainField","getRelationLabel","relation","label","String","documentId","FIELDS_TO_IGNORE","Set","STATUS_FIELDS","generateInitialTempKeys","length","previousKey","Array","from","nextKey","incrementInitialTempKey","key","head","digits","carry","index","nextDigitIndex","indexOf","Error","join","nextHead","fromCharCode","charCodeAt","push","pop","normalizeToArray","value","isArray","isValidRelation","rel","resolveRelationsForLocaleBatch","relations","targetLocale","i18nContentTypesService","isTargetLocalized","isLocalizedContentType","getModel","map","id","undefined","documentIds","r","targetEntriesQuery","where","$in","locale","select","targetEntries","db","query","findMany","byDocumentId","Map","e","existing","get","publishedAt","set","entry","buildWhereForRelations","locales","filter","Boolean","collectRelationsByUid","data","schema","components","result","addRels","rels","concat","collect","d","s","Object","entries","attribute","attributes","type","attr","toLowerCase","includes","target","validRels","compSchema","component","repeatable","item","compUid","__component","resolveAllRelationsBatched","relationsByUid","userAbility","Promise","all","allRels","empty","blocked","can","bySourceDocumentId","statusById","labelById","uniqueRels","values","resolvedList","i","resolvedEntries","allStatusEntries","labelEntries","contentTypes","hasDraftAndPublish","resolve","documentMetadata","model","isLocalized","groupKey","byGroup","list","version","find","otherVersions","getStatus","buildConnectFromPreResolved","preResolved","connect","disconnect","uidData","resolved","status","mainFieldValue","relationWithMainField","__temp_key__","processDocumentData","has","tempKeys","processed","createFillFromLocaleService","fetchRawDocument","sourceLocale","populateBuilderService","modelDef","populate","populateDeep","Infinity","build","docs","documents","baseParams","findOne","findFirst","transformDocument","document","getComponentSchema","Proxy","_","relsByUid"],"mappings":";;;AAIA,MAAMA,WAAAA,GAAc,uCAAA;AACpB,MAAMC,eAAAA,GAAkB,gEAAA;AAExB;;;IAIA,MAAMC,eAAe,OAAOC,SAAAA,GAAAA;AAC1B,IAAA,MAAMC,mCAAmCC,MAAAA,CACtCC,MAAM,CAAC,iBAAA,CAAA,CACPC,OAAO,CAAC,eAAA,CAAA;AACX,IAAA,MAAMC,aAAAA,GAAgB,MAAMJ,gCAAAA,CAAiCK,iBAAiB,CAAC;QAC7EC,GAAAA,EAAKP;AACP,KAAA,CAAA;IACA,OAAOK,aAAAA,CAAcG,QAAQ,CAACC,SAAS;AACzC,CAAA;AAEA;;;IAIA,MAAMC,gBAAAA,GAAmB,CAACC,QAAAA,EAAmCF,SAAAA,GAAAA;IAC3D,MAAMG,KAAAA,GAAQD,QAAQ,CAACF,SAAAA,CAAU;IACjC,IAAI,OAAOG,KAAAA,KAAU,QAAA,EAAU,OAAOA,KAAAA;IACtC,OAAOC,MAAAA,CAAOF,QAAAA,CAASG,UAAU,IAAI,EAAA,CAAA;AACvC,CAAA;AAEA,MAAMC,gBAAAA,GAAmB,IAAIC,GAAAA,CAAI;AAC/B,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,WAAA;AACA,IAAA,IAAA;AACA,IAAA,YAAA;AACA,IAAA,aAAA;AACA,IAAA,cAAA;AACA,IAAA,iBAAA;AACA,IAAA,QAAA;AACA,IAAA,QAAA;AACA,IAAA;AACD,CAAA,CAAA;AAED,MAAMC,aAAAA,GAAgB,IAAID,GAAAA,CAAI;AAAC,IAAA,IAAA;AAAM,IAAA,YAAA;AAAc,IAAA,QAAA;AAAU,IAAA,WAAA;AAAa,IAAA;AAAc,CAAA,CAAA;AAExF;;IAGA,MAAME,0BAA0B,CAACC,MAAAA,GAAAA;IAC/B,IAAIC,WAAAA;IAEJ,OAAOC,KAAAA,CAAMC,IAAI,CAAC;AAAEH,QAAAA;KAAO,EAAG,IAAA;AAC5B,QAAA,MAAMI,UAAUC,uBAAAA,CAAwBJ,WAAAA,CAAAA;QACxCA,WAAAA,GAAcG,OAAAA;QACd,OAAOA,OAAAA;AACT,IAAA,CAAA,CAAA;AACF,CAAA;AAEA,MAAMC,0BAA0B,CAACC,GAAAA,GAAAA;AAC/B,IAAA,IAAI,CAACA,GAAAA,EAAK;AACR,QAAA,OAAO,CAAC,CAAC,EAAE3B,eAAe,CAAC,EAAE,CAAA,CAAE;AACjC,IAAA;AAEA,IAAA,MAAM,CAAC4B,IAAAA,EAAM,GAAGC,MAAAA,CAAO,GAAGF,GAAAA;AAC1B,IAAA,IAAIG,KAAAA,GAAQ,IAAA;IAEZ,IAAK,IAAIC,KAAAA,GAAQF,MAAAA,CAAOR,MAAM,GAAG,GAAGS,KAAAA,IAASC,KAAAA,IAAS,CAAA,EAAGA,KAAAA,IAAS,CAAA,CAAG;AACnE,QAAA,MAAMC,iBAAiBhC,eAAAA,CAAgBiC,OAAO,CAACJ,MAAM,CAACE,MAAM,CAAA,GAAI,CAAA;AAEhE,QAAA,IAAIC,mBAAmB,CAAA,EAAG;YACxB,MAAM,IAAIE,MAAM,CAAC,6BAA6B,EAAEL,MAAM,CAACE,MAAM,CAAA,CAAE,CAAA;AACjE,QAAA;QAEA,IAAIC,cAAAA,KAAmBhC,eAAAA,CAAgBqB,MAAM,EAAE;AAC7CQ,YAAAA,MAAM,CAACE,KAAAA,CAAM,GAAG/B,eAAe,CAAC,CAAA,CAAE;QACpC,CAAA,MAAO;AACL6B,YAAAA,MAAM,CAACE,KAAAA,CAAM,GAAG/B,eAAe,CAACgC,cAAAA,CAAe;YAC/CF,KAAAA,GAAQ,KAAA;AACV,QAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACA,KAAAA,EAAO;AACV,QAAA,OAAO,CAAA,EAAGF,IAAAA,CAAAA,EAAOC,MAAAA,CAAOM,IAAI,CAAC,EAAA,CAAA,CAAA,CAAK;AACpC,IAAA;AAEA,IAAA,IAAIP,SAAS,GAAA,EAAK;AAChB,QAAA,MAAM,IAAIM,KAAAA,CAAM,6CAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAME,WAAWrB,MAAAA,CAAOsB,YAAY,CAACT,IAAAA,CAAKU,UAAU,CAAC,CAAA,CAAA,GAAK,CAAA,CAAA;AAC1D,IAAA,IAAIF,WAAW,GAAA,EAAK;AAClBP,QAAAA,MAAAA,CAAOU,IAAI,CAACvC,eAAe,CAAC,CAAA,CAAE,CAAA;IAChC,CAAA,MAAO;AACL6B,QAAAA,MAAAA,CAAOW,GAAG,EAAA;AACZ,IAAA;AAEA,IAAA,OAAO,CAAA,EAAGJ,QAAAA,CAAAA,EAAWP,MAAAA,CAAOM,IAAI,CAAC,EAAA,CAAA,CAAA,CAAK;AACxC,CAAA;AAEA;;IAGA,MAAMM,mBAAmB,CAACC,KAAAA,GAAAA;IACxB,IAAIC,OAAAA,CAAQD,QAAQ,OAAOA,KAAAA;AAC3B,IAAA,IAAIA,OAAO,OAAO;AAACA,QAAAA;AAAM,KAAA;AACzB,IAAA,OAAO,EAAE;AACX,CAAA;AAEA;;AAEC,IACD,MAAME,eAAAA,GAAkB,CACtBC,GAAAA,GAEA,OAAOA,GAAAA,KAAQ,QAAA,IAAYA,GAAAA,KAAQ,IAAA,IAAQ,gBAAgBA,GAAAA,IAAO,CAAC,CAAEA,IAAY7B,UAAU;AAE7F;;AAEC,IACD,MAAM8B,8BAAAA,GAAiC,OACrCC,SAAAA,EACA7C,SAAAA,EACA8C,YAAAA,GAAAA;AAEA,IAAA,MAAMC,uBAAAA,GAA0B7C,MAAAA,CAAOC,MAAM,CAAC,SAASC,OAAAA,CAAQ,eAAA,CAAA;AAC/D,IAAA,MAAM4C,iBAAAA,GAAoBD,uBAAAA,EAAyBE,sBAAAA,CACjD/C,MAAAA,CAAOgD,QAAQ,CAAClD,SAAAA,CAAAA,CAAAA;AAGlB,IAAA,IAAI,CAACgD,iBAAAA,EAAmB;QACtB,OAAOH,SAAAA,CAAUM,GAAG,CAAC,CAACR,GAAAA,GAAAA;AACpB,YAAA,IAAIA,GAAAA,CAAIS,EAAE,KAAKC,SAAAA,EAAW,OAAO,IAAA;YACjC,OAAO;AAAEvC,gBAAAA,UAAAA,EAAY6B,IAAI7B,UAAU;AAAEsC,gBAAAA,EAAAA,EAAIT,IAAIS;AAAG,aAAA;AAClD,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAME,WAAAA,GAAc;AAAI,QAAA,GAAA,IAAItC,IAAI6B,SAAAA,CAAUM,GAAG,CAAC,CAACI,CAAAA,GAAMA,EAAEzC,UAAU,CAAA;AAAG,KAAA;AACpE,IAAA,MAAM0C,kBAAAA,GAAqB;QACzBC,KAAAA,EAAO;YAAE3C,UAAAA,EAAY;gBAAE4C,GAAAA,EAAKJ;AAAY,aAAA;YAAGK,MAAAA,EAAQb;AAAa,SAAA;QAChEc,MAAAA,EAAQ;AAAI3C,YAAAA,GAAAA;AAAc;AAC5B,KAAA;IACA,MAAM4C,aAAAA,GAAgB,MAAM3D,MAAAA,CAAO4D,EAAE,CAACC,KAAK,CAAC/D,SAAAA,CAAAA,CAAWgE,QAAQ,CAACR,kBAAAA,CAAAA;AAChE,IAAA,MAAMS,eAAe,IAAIC,GAAAA,EAAAA;IACzB,KAAK,MAAMC,KAAKN,aAAAA,CAAe;AAC7B,QAAA,MAAMO,QAAAA,GAAWH,YAAAA,CAAaI,GAAG,CAACF,EAAErD,UAAU,CAAA;QAC9C,IAAI,CAACsD,YAAaD,CAAAA,CAAEG,WAAW,KAAK,IAAA,IAAQF,QAAAA,CAASE,WAAW,KAAK,IAAA,EAAO;AAC1EL,YAAAA,YAAAA,CAAaM,GAAG,CAACJ,CAAAA,CAAErD,UAAU,EAAEqD,CAAAA,CAAAA;AACjC,QAAA;AACF,IAAA;IAEA,OAAOtB,SAAAA,CAAUM,GAAG,CAAC,CAACR,GAAAA,GAAAA;AACpB,QAAA,MAAM6B,KAAAA,GAAQP,YAAAA,CAAaI,GAAG,CAAC1B,IAAI7B,UAAU,CAAA;QAC7C,IAAI,CAAC0D,OAAO,OAAO,IAAA;QACnB,OAAO;AACL1D,YAAAA,UAAAA,EAAY0D,MAAM1D,UAAU;AAC5BsC,YAAAA,EAAAA,EAAIoB,MAAMpB,EAAE;AACZO,YAAAA,MAAAA,EAAQa,MAAMb;AAChB,SAAA;AACF,IAAA,CAAA,CAAA;AACF,CAAA;AAEA;;AAEC,IACD,MAAMc,sBAAAA,GAAyB,CAC7B5B,SAAAA,EACAS,WAAAA,EACAtD,SAAAA,GAAAA;AAEA,IAAA,MAAMyD,KAAAA,GAAuE;QAC3E3C,UAAAA,EAAY;YAAE4C,GAAAA,EAAKJ;AAAY;AACjC,KAAA;AACA,IAAA,MAAMP,uBAAAA,GAA0B7C,MAAAA,CAAOC,MAAM,CAAC,SAASC,OAAAA,CAAQ,eAAA,CAAA;AAC/D,IAAA,MAAM4C,iBAAAA,GAAoBD,uBAAAA,EAAyBE,sBAAAA,CACjD/C,MAAAA,CAAOgD,QAAQ,CAAClD,SAAAA,CAAAA,CAAAA;AAElB,IAAA,IAAIgD,iBAAAA,EAAmB;AACrB,QAAA,MAAM0B,OAAAA,GAAU;eAAI,IAAI1D,GAAAA,CAAI6B,SAAAA,CAAUM,GAAG,CAAC,CAACI,IAAMA,CAAAA,CAAEI,MAAM,CAAA,CAAEgB,MAAM,CAACC,OAAAA,CAAAA;AAAU,SAAA;QAC5E,IAAIF,OAAAA,CAAQvD,MAAM,GAAG,CAAA,EAAG;AACtBsC,YAAAA,KAAAA,CAAME,MAAM,GAAG;gBAAED,GAAAA,EAAKgB;AAAQ,aAAA;AAChC,QAAA;AACF,IAAA;IACA,OAAOjB,KAAAA;AACT,CAAA;AAqBA;;AAEC,IACD,MAAMoB,qBAAAA,GAAwB,CAC5BC,IAAAA,EACAC,MAAAA,EACAC,UAAAA,GAAAA;AAEA,IAAA,MAAMC,SAAyB,IAAIf,GAAAA,EAAAA;IAEnC,MAAMgB,OAAAA,GAAU,CAAC3E,GAAAA,EAAa4E,IAAAA,GAAAA;AAC5B,QAAA,MAAMf,QAAAA,GAAWa,MAAAA,CAAOZ,GAAG,CAAC9D,QAAQ,EAAE;AACtC0E,QAAAA,MAAAA,CAAOV,GAAG,CAAChE,GAAAA,EAAK6D,QAAAA,CAASgB,MAAM,CAACD,IAAAA,CAAAA,CAAAA;AAClC,IAAA,CAAA;IAEA,MAAME,OAAAA,GAAU,CAACC,CAAAA,EAA4BC,CAAAA,GAAAA;AAC3C,QAAA,IAAI,CAACD,CAAAA,IAAK,OAAOA,CAAAA,KAAM,QAAA,EAAU;QACjC,KAAK,MAAM,CAAC7D,GAAAA,EAAKe,KAAAA,CAAM,IAAIgD,MAAAA,CAAOC,OAAO,CAACH,CAAAA,CAAAA,CAAI;AAC5C,YAAA,MAAMI,SAAAA,GAAYH,CAAAA,EAAGI,UAAAA,GAAalE,GAAAA,CAAI;AACtC,YAAA,IAAI,CAACiE,SAAAA,EAAW;YAEhB,IAAIA,SAAAA,CAAUE,IAAI,KAAK,UAAA,EAAY;AACjC,gBAAA,MAAMC,IAAAA,GAAOH,SAAAA;gBAIb,IAAIG,IAAAA,CAAKlF,QAAQ,EAAEmF,WAAAA,EAAAA,CAAcC,SAAS,OAAA,CAAA,IAAY,CAACF,IAAAA,CAAKG,MAAM,EAAE;AACpE,gBAAA,MAAMC,SAAAA,GAAY1D,gBAAAA,CAAiBC,KAAAA,CAAAA,CAAOmC,MAAM,CAACjC,eAAAA,CAAAA;AACjD,gBAAA,IAAIuD,UAAU9E,MAAM,GAAG,GAAG+D,OAAAA,CAAQW,IAAAA,CAAKG,MAAM,EAAEC,SAAAA,CAAAA;AACjD,YAAA,CAAA,MAAO,IAAIP,SAAAA,CAAUE,IAAI,KAAK,WAAA,EAAa;AACzC,gBAAA,MAAMM,aAAclB,UAAU,CAACU,SAAAA,CAAUS,SAAS,CAAC,IAAI;AACrDR,oBAAAA,UAAAA,EAAY;AACd,iBAAA;AACA,gBAAA,IAAID,SAAAA,CAAUU,UAAU,IAAI3D,OAAAA,CAAQD,KAAAA,CAAAA,EAAQ;oBAC1C,KAAK,MAAM6D,QAAQ7D,KAAAA,CAAoC;AACrD6C,wBAAAA,OAAAA,CAAQgB,IAAAA,EAAMH,UAAAA,CAAAA;AAChB,oBAAA;AACF,gBAAA,CAAA,MAAO,IAAI1D,KAAAA,EAAO;AAChB6C,oBAAAA,OAAAA,CAAQ7C,KAAAA,EAAkC0D,UAAAA,CAAAA;AAC5C,gBAAA;AACF,YAAA,CAAA,MAAO,IAAIR,SAAAA,CAAUE,IAAI,KAAK,aAAA,IAAiBnD,QAAQD,KAAAA,CAAAA,EAAQ;gBAC7D,KAAK,MAAM6D,QAAQ7D,KAAAA,CAAoC;AACrD,oBAAA,MAAM8D,UAAWD,IAAAA,EAAcE,WAAAA;AAC/B,oBAAA,MAAML,UAAAA,GAAclB,UAAU,CAACsB,OAAAA,CAAQ,IAAI;AAAEX,wBAAAA,UAAAA,EAAY;AAAG,qBAAA;AAC5DN,oBAAAA,OAAAA,CAAQgB,IAAAA,EAAiCH,UAAAA,CAAAA;AAC3C,gBAAA;AACF,YAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEAb,IAAAA,OAAAA,CAAQP,IAAAA,EAAMC,MAAAA,CAAAA;IACd,OAAOE,MAAAA;AACT,CAAA;AAEA;;;AAGC,IACD,MAAMuB,0BAAAA,GAA6B,OACjCC,cAAAA,EACA3D,YAAAA,EACA4D,WAAAA,GAAAA;AAEA,IAAA,MAAMzB,SAAS,IAAIf,GAAAA,EAAAA;IACnB,MAAMyC,OAAAA,CAAQC,GAAG,CACf;AAAIH,QAAAA,GAAAA,cAAAA,CAAehB,OAAO;AAAG,KAAA,CAACtC,GAAG,CAAC,OAAO,CAACnD,WAAW6G,OAAAA,CAAQ,GAAA;AAC3D,QAAA,MAAMC,KAAAA,GAA2B;AAC/BC,YAAAA,OAAAA,EAAS,CAACL,WAAAA,CAAYM,GAAG,CAACnH,WAAAA,EAAaG,SAAAA,CAAAA;YACvCS,SAAAA,EAAW,EAAA;AACXwG,YAAAA,kBAAAA,EAAoB,IAAI/C,GAAAA,EAAAA;AACxBgD,YAAAA,UAAAA,EAAY,IAAIhD,GAAAA,EAAAA;AAChBiD,YAAAA,SAAAA,EAAW,IAAIjD,GAAAA;AACjB,SAAA;QAEA,IAAI4C,KAAAA,CAAMC,OAAO,EAAE;YACjB9B,MAAAA,CAAOV,GAAG,CAACvE,SAAAA,EAAW8G,KAAAA,CAAAA;AACtB,YAAA;AACF,QAAA;QAEA,MAAMrG,SAAAA,GAAY,MAAMV,YAAAA,CAAaC,SAAAA,CAAAA;QACrC,MAAMiG,SAAAA,GAAYY,OAAAA,CAAQlC,MAAM,CAACjC,eAAAA,CAAAA;QAEjC,IAAIuD,SAAAA,CAAU9E,MAAM,KAAK,CAAA,EAAG;YAC1B8D,MAAAA,CAAOV,GAAG,CAACvE,SAAAA,EAAW;AAAE,gBAAA,GAAG8G,KAAK;AAAErG,gBAAAA;AAAU,aAAA,CAAA;AAC5C,YAAA;AACF,QAAA;;AAGA,QAAA,MAAM2G,UAAAA,GAAa;AAAI,YAAA,GAAA,IAAIlD,GAAAA,CAAI+B,SAAAA,CAAU9C,GAAG,CAAC,CAACI,CAAAA,GAAM;AAACA,oBAAAA,CAAAA,CAAEzC,UAAU;AAAEyC,oBAAAA;AAAE,iBAAA,CAAA,CAAA,CAAG8D,MAAM;AAAG,SAAA;AACjF,QAAA,MAAMC,YAAAA,GAAe,MAAM1E,8BAAAA,CACzBwE,UAAAA,EACApH,SAAAA,EACA8C,YAAAA,CAAAA;AAGF,QAAA,MAAMmE,qBAAqB,IAAI/C,GAAAA,EAAAA;QAC/B,IAAK,IAAIqD,IAAI,CAAA,EAAGA,CAAAA,GAAIH,WAAWjG,MAAM,EAAEoG,KAAK,CAAA,CAAG;YAC7CN,kBAAAA,CAAmB1C,GAAG,CAAC6C,UAAU,CAACG,CAAAA,CAAE,CAACzG,UAAU,EAAEwG,YAAY,CAACC,CAAAA,CAAE,CAAA;AAClE,QAAA;AAEA,QAAA,MAAMC,kBAAkBF,YAAAA,CAAa3C,MAAM,CAAC,CAACpB,IAA6BA,CAAAA,KAAM,IAAA,CAAA;QAEhF,IAAIiE,eAAAA,CAAgBrG,MAAM,KAAK,CAAA,EAAG;YAChC8D,MAAAA,CAAOV,GAAG,CAACvE,SAAAA,EAAW;gBACpB+G,OAAAA,EAAS,KAAA;AACTtG,gBAAAA,SAAAA;AACAwG,gBAAAA,kBAAAA;AACAC,gBAAAA,UAAAA,EAAY,IAAIhD,GAAAA,EAAAA;AAChBiD,gBAAAA,SAAAA,EAAW,IAAIjD,GAAAA;AACjB,aAAA,CAAA;AACA,YAAA;AACF,QAAA;AAEA,QAAA,MAAMZ,WAAAA,GAAc;AAAI,YAAA,GAAA,IAAItC,IAAIwG,eAAAA,CAAgBrE,GAAG,CAAC,CAACI,CAAAA,GAAMA,EAAEzC,UAAU,CAAA;AAAG,SAAA;QAC1E,MAAM2C,KAAAA,GAAQgB,sBAAAA,CAAuB+C,eAAAA,EAAiBlE,WAAAA,EAAatD,SAAAA,CAAAA;AAEnE,QAAA,MAAM,CAACyH,gBAAAA,EAAkBC,YAAAA,CAAa,GAAG,MAAMf,OAAAA,CAAQC,GAAG,CAAC;AACzDe,YAAAA,YAAAA,CAAaC,kBAAkB,CAAC1H,MAAAA,CAAOgD,QAAQ,CAAClD,SAAAA,CAAAA,CAAAA,GAC5CE,MAAAA,CAAO4D,EAAE,CAACC,KAAK,CAAC/D,SAAAA,CAAAA,CAAWgE,QAAQ,CAAC;AAAEP,gBAAAA,KAAAA;gBAAOG,MAAAA,EAAQ;AAAI3C,oBAAAA,GAAAA;AAAc;aAAC,CAAA,GACxE0F,OAAAA,CAAQkB,OAAO,CAAC,EAAE,CAAA;AACtB3H,YAAAA,MAAAA,CAAO4D,EAAE,CAACC,KAAK,CAAC/D,SAAAA,CAAAA,CAAWgE,QAAQ,CAAC;AAClCP,gBAAAA,KAAAA;gBACAG,MAAAA,EAAQ;AAAC,oBAAA,YAAA;AAAc,oBAAA,IAAA;AAAM,oBAAA,QAAA;AAAUnD,oBAAAA;AAAU;AACnD,aAAA;AACD,SAAA,CAAA;;AAGD,QAAA,MAAMyG,aAAa,IAAIhD,GAAAA,EAAAA;QACvB,IAAIuD,gBAAAA,CAAiBtG,MAAM,GAAG,CAAA,EAAG;AAC/B,YAAA,MAAM2G,gBAAAA,GAAmB5H,MAAAA,CAAOC,MAAM,CAAC,oBAAoBC,OAAAA,CAAQ,mBAAA,CAAA;AACnE,YAAA,IAAI0H,gBAAAA,EAAkB;gBACpB,MAAMC,KAAAA,GAAQ7H,MAAAA,CAAOgD,QAAQ,CAAClD,SAAAA,CAAAA;AAC9B,gBAAA,MAAMgI,cAAc9H,MAAAA,CACjBC,MAAM,CAAC,MAAA,CAAA,EACNC,OAAAA,CAAQ,kBACR6C,sBAAAA,CAAuB8E,KAAAA,CAAAA;AAC3B,gBAAA,MAAME,WAAW,CAAC9D,CAAAA,GAChB6D,eAAe7D,CAAAA,CAAER,MAAM,GAAG,CAAA,EAAGQ,CAAAA,CAAErD,UAAU,CAAC,CAAC,EAAEqD,CAAAA,CAAER,MAAM,CAAA,CAAE,GAAGQ,EAAErD,UAAU;AAExE,gBAAA,MAAMoH,UAAU,IAAIhE,GAAAA,EAAAA;gBACpB,KAAK,MAAMC,KAAKsD,gBAAAA,CAAkB;AAChC,oBAAA,MAAMhG,MAAMwG,QAAAA,CAAS9D,CAAAA,CAAAA;AACrB,oBAAA,MAAMgE,IAAAA,GAAOD,OAAAA,CAAQ7D,GAAG,CAAC5C,QAAQ,EAAE;AACnC0G,oBAAAA,IAAAA,CAAK9F,IAAI,CAAC8B,CAAAA,CAAAA;oBACV+D,OAAAA,CAAQ3D,GAAG,CAAC9C,GAAAA,EAAK0G,IAAAA,CAAAA;AACnB,gBAAA;gBAEA,KAAK,MAAM3D,SAASgD,eAAAA,CAAiB;AACnC,oBAAA,MAAM/F,MAAMwG,QAAAA,CAASzD,KAAAA,CAAAA;AACrB,oBAAA,MAAMiB,OAAAA,GAAUyC,OAAAA,CAAQ7D,GAAG,CAAC5C,QAAQ,EAAE;oBACtC,IAAI,CAACgE,OAAAA,CAAQtE,MAAM,EAAE;AACrB,oBAAA,MAAMiH,OAAAA,GAAU3C,OAAAA,CAAQ4C,IAAI,CAAC,CAAClE,CAAAA,GAAMA,CAAAA,CAAEf,EAAE,KAAKoB,KAAAA,CAAMpB,EAAE,CAAA,IAAKqC,OAAO,CAAC,CAAA,CAAE;oBACpE,MAAM6C,aAAAA,GAAgB7C,OAAAA,CAAQd,MAAM,CAAC,CAACR,IAAMA,CAAAA,CAAEf,EAAE,KAAKgF,OAAAA,CAAQhF,EAAE,CAAA;oBAC/D8D,UAAAA,CAAW3C,GAAG,CAACC,KAAAA,CAAMpB,EAAE,EAAE0E,gBAAAA,CAAiBS,SAAS,CAACH,OAAAA,EAASE,aAAAA,CAAAA,CAAAA;AAC/D,gBAAA;AACF,YAAA;AACF,QAAA;;AAGA,QAAA,MAAMnB,YAAY,IAAIjD,GAAAA,EAAAA;QACtB,KAAK,MAAMM,SAASkD,YAAAA,CAAc;AAChCP,YAAAA,SAAAA,CAAU5C,GAAG,CAACC,KAAAA,CAAMpB,EAAE,EAAEoB,KAAK,CAAC/D,SAAAA,CAAU,CAAA;AAC1C,QAAA;QAEAwE,MAAAA,CAAOV,GAAG,CAACvE,SAAAA,EAAW;YACpB+G,OAAAA,EAAS,KAAA;AACTtG,YAAAA,SAAAA;AACAwG,YAAAA,kBAAAA;AACAC,YAAAA,UAAAA;AACAC,YAAAA;AACF,SAAA,CAAA;AACF,IAAA,CAAA,CAAA,CAAA;IAGF,OAAOlC,MAAAA;AACT,CAAA;AAEA;;AAEC,IACD,MAAMuD,2BAAAA,GAA8B,CAClChG,KAAAA,EACAkD,SAAAA,EACA+C,WAAAA,GAAAA;AAEA,IAAA,MAAM5C,IAAAA,GAAOH,SAAAA;IACb,IAAIG,IAAAA,CAAKlF,QAAQ,EAAEmF,WAAAA,EAAAA,CAAcC,SAAS,OAAA,CAAA,IAAY,CAACF,IAAAA,CAAKG,MAAM,EAAE;QAClE,OAAO;AAAE0C,YAAAA,OAAAA,EAAS,EAAE;AAAEC,YAAAA,UAAAA,EAAY;AAAG,SAAA;AACvC,IAAA;AAEA,IAAA,MAAMC,OAAAA,GAAUH,WAAAA,CAAYpE,GAAG,CAACwB,KAAKG,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC4C,OAAAA,IAAWA,OAAAA,CAAQ7B,OAAO,EAAE;QAC/B,OAAO;AAAE2B,YAAAA,OAAAA,EAAS,EAAE;AAAEC,YAAAA,UAAAA,EAAY;AAAG,SAAA;AACvC,IAAA;AAEA,IAAA,MAAM1C,SAAAA,GAAY1D,gBAAAA,CAAiBC,KAAAA,CAAAA,CAAOmC,MAAM,CAACjC,eAAAA,CAAAA;IACjD,IAAIuD,SAAAA,CAAU9E,MAAM,KAAK,CAAA,EAAG;QAC1B,OAAO;AAAEuH,YAAAA,OAAAA,EAAS,EAAE;AAAEC,YAAAA,UAAAA,EAAY;AAAG,SAAA;AACvC,IAAA;AAEA,IAAA,MAAMD,OAAAA,GAAUzC,SAAAA,CACb9C,GAAG,CAAC,CAACR,GAAAA,EAAKd,KAAAA,GAAAA;AACT,QAAA,MAAMgH,WAAWD,OAAAA,CAAQ3B,kBAAkB,CAAC5C,GAAG,CAAC1B,IAAI7B,UAAU,CAAA;QAC9D,IAAI,CAAC+H,UAAU,OAAO,IAAA;AAEtB,QAAA,MAAMC,SAASF,OAAAA,CAAQ1B,UAAU,CAAC7C,GAAG,CAACwE,SAASzF,EAAE,CAAA;AACjD,QAAA,MAAM2F,iBAAiBH,OAAAA,CAAQzB,SAAS,CAAC9C,GAAG,CAACwE,SAASzF,EAAE,CAAA;AACxD,QAAA,MAAM4F,qBAAAA,GAAiD;AACrD,YAAA,GAAGH,QAAQ;YACX,CAACD,OAAAA,CAAQnI,SAAS,GAAGsI;AACvB,SAAA;AACA,QAAA,IAAID,WAAWzF,SAAAA,EAAW;AACxB2F,YAAAA,qBAAAA,CAAsBF,MAAM,GAAGA,MAAAA;AACjC,QAAA;QAEA,OAAO;AACL,YAAA,GAAGE,qBAAqB;YACxBC,YAAAA,EAAc,CAAC,CAAC,EAAEpH,KAAAA,CAAAA,CAAO;YACzBjB,KAAAA,EAAOF,gBAAAA,CAAiBsI,qBAAAA,EAAuBJ,OAAAA,CAAQnI,SAAS;AAClE,SAAA;AACF,IAAA,CAAA,CAAA,CACCkE,MAAM,CAAC,CAACpB,CAAAA,GAAkCA,CAAAA,KAAM,IAAA,CAAA;IAEnD,OAAO;AAAEmF,QAAAA,OAAAA;AAASC,QAAAA,UAAAA,EAAY;AAAG,KAAA;AACnC,CAAA;AAEA;;;AAGC,IACD,MAAMO,mBAAAA,GAAsB,OAC1BpE,IAAAA,EACAC,QACAC,UAAAA,EACAyD,WAAAA,GAAAA;AAEA,IAAA,IAAI,CAAC3D,IAAAA,EAAM;AACT,QAAA,OAAO,EAAC;AACV,IAAA;AAEA,IAAA,MAAMG,SAAkC,EAAC;IAEzC,KAAK,MAAM,CAACxD,GAAAA,EAAKe,KAAAA,CAAM,IAAIgD,MAAAA,CAAOC,OAAO,CAACX,IAAAA,CAAAA,CAAO;QAC/C,IAAI/D,gBAAAA,CAAiBoI,GAAG,CAAC1H,GAAAA,CAAAA,EAAM;AAC7B,YAAA;AACF,QAAA;AAEA,QAAA,MAAMiE,SAAAA,GAAYX,MAAAA,EAAQY,UAAAA,GAAalE,GAAAA,CAAI;AAC3C,QAAA,IAAI,CAACiE,SAAAA,EAAW;YACdT,MAAM,CAACxD,IAAI,GAAGe,KAAAA;AACd,YAAA;AACF,QAAA;QAEA,IAAIkD,SAAAA,CAAUE,IAAI,KAAK,UAAA,EAAY;AACjC,YAAA;AACF,QAAA;QAEA,IAAIF,SAAAA,CAAUE,IAAI,KAAK,UAAA,EAAY;AACjCX,YAAAA,MAAM,CAACxD,GAAAA,CAAI,GAAG+G,2BAAAA,CACZhG,OACAkD,SAAAA,EACA+C,WAAAA,CAAAA;AAEF,YAAA;AACF,QAAA;QAEA,IAAI/C,SAAAA,CAAUE,IAAI,KAAK,WAAA,EAAa;AAClC,YAAA,MAAMM,aAAclB,UAAU,CAACU,SAAAA,CAAUS,SAAS,CAAC,IAAI;AACrDR,gBAAAA,UAAAA,EAAY;AACd,aAAA;AACA,YAAA,IAAID,SAAAA,CAAUU,UAAU,IAAI3D,OAAAA,CAAQD,KAAAA,CAAAA,EAAQ;gBAC1C,MAAM4G,QAAAA,GAAWlI,uBAAAA,CAAwBsB,KAAAA,CAAMrB,MAAM,CAAA;gBACrD8D,MAAM,CAACxD,GAAAA,CAAI,GAAG,MAAMkF,OAAAA,CAAQC,GAAG,CAC7BpE,KAAAA,CAAMW,GAAG,CAAC,OAAOkD,IAAAA,EAA+BxE,KAAAA,GAAAA;AAC9C,oBAAA,MAAMwH,SAAAA,GAAY,MAAMH,mBAAAA,CAAoB7C,IAAAA,EAAMH,YAAYlB,UAAAA,EAAYyD,WAAAA,CAAAA;oBAC1E,OAAO;AAAE,wBAAA,GAAGY,SAAS;wBAAEJ,YAAAA,EAAcG,QAAQ,CAACvH,KAAAA;AAAO,qBAAA;AACvD,gBAAA,CAAA,CAAA,CAAA;AAEJ,YAAA,CAAA,MAAO,IAAIW,KAAAA,EAAO;AAChB,gBAAA,MAAM6G,SAAAA,GAAY,MAAMH,mBAAAA,CACtB1G,KAAAA,EACA0D,YACAlB,UAAAA,EACAyD,WAAAA,CAAAA;gBAEFxD,MAAM,CAACxD,IAAI,GAAG4H,SAAAA;YAChB,CAAA,MAAO;gBACLpE,MAAM,CAACxD,IAAI,GAAGe,KAAAA;AAChB,YAAA;AACA,YAAA;AACF,QAAA;AAEA,QAAA,IAAIkD,SAAAA,CAAUE,IAAI,KAAK,aAAA,IAAiBnD,QAAQD,KAAAA,CAAAA,EAAQ;YACtD,MAAM4G,QAAAA,GAAWlI,uBAAAA,CAAwBsB,KAAAA,CAAMrB,MAAM,CAAA;YACrD8D,MAAM,CAACxD,GAAAA,CAAI,GAAG,MAAMkF,OAAAA,CAAQC,GAAG,CAC7BpE,KAAAA,CAAMW,GAAG,CAAC,OAAOkD,IAAAA,EAA+BxE,KAAAA,GAAAA;AAC9C,gBAAA,MAAMqE,UAAAA,GAAclB,UAAU,CAACqB,IAAAA,EAAME,YAAsB,IAAI;AAC7DZ,oBAAAA,UAAAA,EAAY;AACd,iBAAA;AACA,gBAAA,MAAM0D,SAAAA,GAAY,MAAMH,mBAAAA,CAAoB7C,IAAAA,EAAMH,YAAYlB,UAAAA,EAAYyD,WAAAA,CAAAA;gBAC1E,OAAO;AAAE,oBAAA,GAAGY,SAAS;oBAAEJ,YAAAA,EAAcG,QAAQ,CAACvH,KAAAA;AAAO,iBAAA;AACvD,YAAA,CAAA,CAAA,CAAA;AAEF,YAAA;AACF,QAAA;QAEAoD,MAAM,CAACxD,IAAI,GAAGe,KAAAA;AAChB,IAAA;IAEA,OAAOyC,MAAAA;AACT,CAAA;MAEaqE,2BAAAA,GAA8B,CAAC,EAAEpJ,MAAAA,EAAAA,OAAM,EAA2B,GAAA;IAC7E,OAAO;AACL;;;AAGC,QACD,MAAMqJ,gBAAAA,CAAAA,CAAiBxB,KAAsB,EAAEyB,YAAoB,EAAE1I,UAAmB,EAAA;AACtF,YAAA,MAAM2I,yBAAyBvJ,OAAAA,CAC5BC,MAAM,CAAC,iBAAA,CAAA,CACPC,OAAO,CAAC,kBAAA,CAAA;YAGX,MAAMsJ,QAAAA,GAAWxJ,OAAAA,CAAOgD,QAAQ,CAAC6E,KAAAA,CAAAA;AAEjC,YAAA,IAAI,CAAC2B,QAAAA,EAAU;AACb,gBAAA,MAAM,IAAI1H,KAAAA,CAAM,CAAC,MAAM,EAAE+F,KAAAA,CAAM,UAAU,CAAC,CAAA;AAC5C,YAAA;;AAGA,YAAA,MAAM4B,WAAW,MAAMF,sBAAAA,CAAuB1B,OAAO6B,YAAY,CAACC,UAAUC,KAAK,EAAA;YAEjF,MAAMC,IAAAA,GAAO7J,OAAAA,CAAO8J,SAAS,CAACjC,KAAAA,CAAAA;AAC9B,YAAA,MAAMkC,UAAAA,GAAa;gBACjBtG,MAAAA,EAAQ6F,YAAAA;gBACRG,QAAAA,EAAUA;AACZ,aAAA;YAEA,OAAO7I,UAAAA,GACHiJ,IAAAA,CAAKG,OAAO,CAAC;AAAE,gBAAA,GAAGD,UAAU;AAAEnJ,gBAAAA;aAAW,CAAA,GACzCiJ,IAAAA,CAAKI,SAAS,CAAC;AAAE,gBAAA,GAAGF;AAAW,aAAA,CAAA;AACrC,QAAA,CAAA;AAEA;;;QAIA,MAAMG,mBACJC,QAAiC,EACjCtC,KAAsB,EACtBjF,YAAoB,EACpB4D,WAAgB,EAAA;YAEhB,MAAM3B,MAAAA,GAAS7E,OAAAA,CAAOgD,QAAQ,CAAC6E,KAAAA,CAAAA;AAC/B,YAAA,MAAMuC,qBAAqB,CAAC/J,GAAAA,GACzBL,OAAAA,CAAOgD,QAAQ,CAAC3C,GAAAA,CAAAA,IAAsB;AAAEoF,oBAAAA,UAAAA,EAAY;AAAG,iBAAA;AAC1D,YAAA,MAAMX,UAAAA,GAAa,IAAIuF,KAAAA,CAAM,EAAC,EAAuC;gBACnElG,GAAAA,CAAAA,CAAImG,CAAC,EAAEjK,GAAW,EAAA;AAChB,oBAAA,OAAO+J,kBAAAA,CAAmB/J,GAAAA,CAAAA;AAC5B,gBAAA;AACF,aAAA,CAAA;YAEA,MAAMkK,SAAAA,GAAY5F,qBAAAA,CAAsBwF,QAAAA,EAAUtF,MAAAA,EAAQC,UAAAA,CAAAA;AAC1D,YAAA,MAAMyD,WAAAA,GAAc,MAAMjC,0BAAAA,CAA2BiE,SAAAA,EAAW3H,YAAAA,EAAc4D,WAAAA,CAAAA;YAC9E,OAAOwC,mBAAAA,CAAoBmB,QAAAA,EAAUtF,MAAAA,EAAQC,UAAAA,EAAYyD,WAAAA,CAAAA;AAC3D,QAAA;AACF,KAAA;AACF;;;;"}