@open-mercato/core 0.4.6-develop-a96241c478 → 0.4.6-develop-7722ab3d39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/modules/api_docs/frontend/docs/api/page.js +1 -1
  2. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  3. package/dist/modules/attachments/api/library/[id]/route.js +0 -1
  4. package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
  5. package/dist/modules/attachments/components/AttachmentLibrary.js +1 -1
  6. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  7. package/dist/modules/attachments/lib/partitionEnv.js +1 -1
  8. package/dist/modules/attachments/lib/partitionEnv.js.map +2 -2
  9. package/dist/modules/auth/backend/users/page.js +1 -1
  10. package/dist/modules/auth/backend/users/page.js.map +2 -2
  11. package/dist/modules/auth/cli.js +1 -1
  12. package/dist/modules/auth/cli.js.map +2 -2
  13. package/dist/modules/auth/commands/users.js +1 -1
  14. package/dist/modules/auth/commands/users.js.map +2 -2
  15. package/dist/modules/business_rules/components/utils/formHelpers.js +1 -1
  16. package/dist/modules/business_rules/components/utils/formHelpers.js.map +2 -2
  17. package/dist/modules/catalog/backend/catalog/products/create/page.js +1 -1
  18. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  19. package/dist/modules/catalog/commands/products.js +1 -1
  20. package/dist/modules/catalog/commands/products.js.map +2 -2
  21. package/dist/modules/catalog/commands/shared.js +1 -1
  22. package/dist/modules/catalog/commands/shared.js.map +2 -2
  23. package/dist/modules/catalog/components/PriceKindSettings.js +1 -1
  24. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  25. package/dist/modules/catalog/components/products/productForm.js +1 -1
  26. package/dist/modules/catalog/components/products/productForm.js.map +2 -2
  27. package/dist/modules/configs/lib/upgrade-actions.js.map +1 -1
  28. package/dist/modules/currencies/services/providers/raiffeisen.js +1 -1
  29. package/dist/modules/currencies/services/providers/raiffeisen.js.map +2 -2
  30. package/dist/modules/customers/cli.js +2 -2
  31. package/dist/modules/customers/cli.js.map +2 -2
  32. package/dist/modules/customers/lib/detailHelpers.js +1 -1
  33. package/dist/modules/customers/lib/detailHelpers.js.map +2 -2
  34. package/dist/modules/entities/cli.js +1 -1
  35. package/dist/modules/entities/cli.js.map +2 -2
  36. package/dist/modules/entities/lib/field-definitions.js +1 -1
  37. package/dist/modules/entities/lib/field-definitions.js.map +2 -2
  38. package/dist/modules/entities/lib/install-from-ce.js +1 -1
  39. package/dist/modules/entities/lib/install-from-ce.js.map +2 -2
  40. package/dist/modules/inbox_ops/lib/emailParser.js +1 -1
  41. package/dist/modules/inbox_ops/lib/emailParser.js.map +2 -2
  42. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +8 -0
  43. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
  44. package/dist/modules/perspectives/services/perspectiveService.js +1 -1
  45. package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
  46. package/dist/modules/query_index/components/QueryIndexesTable.js +7 -7
  47. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  48. package/dist/modules/query_index/lib/engine.js +1 -1
  49. package/dist/modules/query_index/lib/engine.js.map +2 -2
  50. package/dist/modules/resources/commands/resources.js +1 -1
  51. package/dist/modules/resources/commands/resources.js.map +2 -2
  52. package/dist/modules/resources/lib/seeds.js +1 -1
  53. package/dist/modules/resources/lib/seeds.js.map +2 -2
  54. package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js +1 -1
  55. package/dist/modules/sales/api/dashboard/widgets/new-orders/route.js.map +2 -2
  56. package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js +1 -1
  57. package/dist/modules/sales/api/dashboard/widgets/new-quotes/route.js.map +2 -2
  58. package/dist/modules/sales/commands/documents.js +2 -2
  59. package/dist/modules/sales/commands/documents.js.map +2 -2
  60. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +1 -1
  61. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  62. package/dist/modules/sales/components/documents/ShipmentDialog.js +1 -1
  63. package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
  64. package/dist/modules/sales/lib/shipments/snapshots.js.map +1 -1
  65. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +8 -0
  66. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +2 -2
  67. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +8 -0
  68. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +2 -2
  69. package/dist/modules/workflows/backend/instances/page.js +2 -2
  70. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  71. package/dist/modules/workflows/backend/tasks/page.js +1 -1
  72. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  73. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +1 -1
  74. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  75. package/dist/modules/workflows/lib/graph-utils.js +1 -1
  76. package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
  77. package/package.json +2 -2
  78. package/src/modules/api_docs/frontend/docs/api/page.tsx +1 -1
  79. package/src/modules/attachments/api/library/[id]/route.ts +0 -1
  80. package/src/modules/attachments/components/AttachmentLibrary.tsx +1 -1
  81. package/src/modules/attachments/lib/partitionEnv.ts +1 -1
  82. package/src/modules/auth/backend/users/page.tsx +1 -1
  83. package/src/modules/auth/cli.ts +1 -1
  84. package/src/modules/auth/commands/users.ts +1 -1
  85. package/src/modules/business_rules/components/utils/formHelpers.ts +1 -1
  86. package/src/modules/catalog/backend/catalog/products/create/page.tsx +1 -1
  87. package/src/modules/catalog/commands/products.ts +1 -1
  88. package/src/modules/catalog/commands/shared.ts +1 -1
  89. package/src/modules/catalog/components/PriceKindSettings.tsx +1 -1
  90. package/src/modules/catalog/components/products/productForm.ts +1 -1
  91. package/src/modules/configs/lib/upgrade-actions.ts +1 -1
  92. package/src/modules/currencies/services/providers/raiffeisen.ts +1 -1
  93. package/src/modules/customers/cli.ts +2 -2
  94. package/src/modules/customers/lib/detailHelpers.ts +1 -1
  95. package/src/modules/entities/cli.ts +1 -1
  96. package/src/modules/entities/lib/field-definitions.ts +1 -1
  97. package/src/modules/entities/lib/install-from-ce.ts +1 -1
  98. package/src/modules/inbox_ops/lib/emailParser.ts +1 -1
  99. package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +8 -0
  100. package/src/modules/perspectives/services/perspectiveService.ts +1 -1
  101. package/src/modules/query_index/components/QueryIndexesTable.tsx +7 -7
  102. package/src/modules/query_index/lib/engine.ts +1 -1
  103. package/src/modules/resources/commands/resources.ts +1 -1
  104. package/src/modules/resources/lib/seeds.ts +1 -1
  105. package/src/modules/sales/api/dashboard/widgets/new-orders/route.ts +1 -1
  106. package/src/modules/sales/api/dashboard/widgets/new-quotes/route.ts +1 -1
  107. package/src/modules/sales/commands/documents.ts +2 -2
  108. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +1 -1
  109. package/src/modules/sales/components/documents/ShipmentDialog.tsx +1 -1
  110. package/src/modules/sales/lib/shipments/snapshots.ts +1 -1
  111. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +8 -0
  112. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +8 -0
  113. package/src/modules/workflows/backend/instances/page.tsx +2 -2
  114. package/src/modules/workflows/backend/tasks/page.tsx +1 -1
  115. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +1 -1
  116. package/src/modules/workflows/lib/graph-utils.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/catalog/backend/catalog/products/create/page.tsx"],
4
- "sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport dynamic from \"next/dynamic\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport type { ZodType } from \"zod\";\nimport { Page, PageBody } from \"@open-mercato/ui/backend/Page\";\nimport {\n CrudForm,\n type CrudFormGroup,\n type CrudFormGroupComponentProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { createCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { flash } from \"@open-mercato/ui/backend/FlashMessages\";\nimport { TagsInput } from \"@open-mercato/ui/backend/inputs/TagsInput\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport { Label } from \"@open-mercato/ui/primitives/label\";\nimport { cn } from \"@open-mercato/shared/lib/utils\";\nimport {\n Plus,\n Trash2,\n FileText,\n AlignLeft,\n ChevronLeft,\n ChevronRight,\n AlertCircle,\n Settings,\n} from \"lucide-react\";\nimport {\n apiCall,\n readApiResultOrThrow,\n} from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport {\n ProductMediaManager,\n type ProductMediaItem,\n} from \"@open-mercato/core/modules/catalog/components/products/ProductMediaManager\";\nimport { ProductCategorizeSection } from \"@open-mercato/core/modules/catalog/components/products/ProductCategorizeSection\";\nimport {\n PRODUCT_FORM_STEPS,\n type PriceKindSummary,\n type PriceKindApiPayload,\n type TaxRateSummary,\n type ProductOptionInput,\n type VariantPriceValue,\n type VariantDraft,\n type ProductFormValues,\n type ProductUnitConversionDraft,\n type ProductUnitPriceReferenceUnit,\n type ProductUnitRoundingMode,\n productFormSchema,\n createInitialProductFormValues,\n createVariantDraft,\n buildOptionValuesKey,\n haveSameOptionValues,\n normalizePriceKindSummary,\n formatTaxRateLabel,\n slugify,\n createLocalId,\n buildOptionSchemaDefinition,\n buildVariantCombinations,\n normalizeProductDimensions,\n normalizeProductWeight,\n sanitizeProductDimensions,\n sanitizeProductWeight,\n updateDimensionValue,\n updateWeightValue,\n} from \"@open-mercato/core/modules/catalog/components/products/productForm\";\nimport {\n buildAttachmentImageUrl,\n slugifyAttachmentFileName,\n} from \"@open-mercato/core/modules/attachments/lib/imageUrls\";\nimport { ProductUomSection } from \"@open-mercato/core/modules/catalog/components/products/ProductUomSection\";\nimport { canonicalizeUnitCode } from \"@open-mercato/core/modules/catalog/lib/unitCodes\";\nimport {\n UNIT_PRICE_REFERENCE_UNITS,\n toTrimmedOrNull,\n parseNumericInput,\n toPositiveNumberOrNull,\n toIntegerInRangeOrDefault,\n normalizeProductConversionInputs,\n type ProductUnitConversionInput,\n} from \"@open-mercato/core/modules/catalog/components/products/productFormUtils\";\n\nconst productFormTypedSchema =\n productFormSchema as unknown as ZodType<ProductFormValues>;\n\ntype VariantPriceRequest = {\n variantDraftId: string;\n priceKindId: string;\n currencyCode: string;\n amount: number;\n displayMode: PriceKindSummary[\"displayMode\"];\n taxRateId: string | null;\n taxRateValue: number | null;\n};\n\ntype UiMarkdownEditorProps = {\n value?: string;\n height?: number;\n onChange?: (value?: string) => void;\n previewOptions?: { remarkPlugins?: unknown[] };\n};\n\nconst MarkdownEditor = dynamic(() => import(\"@uiw/react-md-editor\"), {\n ssr: false,\n loading: () => (\n <div className=\"flex h-48 items-center justify-center text-sm text-muted-foreground\">\n Loading editor\u2026\n </div>\n ),\n}) as unknown as React.ComponentType<UiMarkdownEditorProps>;\n\ntype ProductFormStep = (typeof PRODUCT_FORM_STEPS)[number];\n\nconst TRUE_BOOLEAN_VALUES = new Set([\"true\", \"1\", \"yes\", \"y\", \"t\"]);\n\nconst matchField = (fieldId: string) => (value: string) =>\n value === fieldId ||\n value.startsWith(`${fieldId}.`) ||\n value.startsWith(`${fieldId}[`);\nconst matchPrefix = (prefix: string) => (value: string) =>\n value.startsWith(prefix);\n\nconst STEP_FIELD_MATCHERS: Record<\n ProductFormStep,\n ((value: string) => boolean)[]\n> = {\n general: [\n matchField(\"title\"),\n matchField(\"description\"),\n matchField(\"mediaItems\"),\n matchField(\"mediaDraftId\"),\n matchPrefix(\"defaultMedia\"),\n matchPrefix(\"dimensions\"),\n matchPrefix(\"weight\"),\n ],\n organize: [\n matchField(\"categoryIds\"),\n matchField(\"channelIds\"),\n matchField(\"tags\"),\n ],\n uom: [\n matchField(\"defaultUnit\"),\n matchField(\"defaultSalesUnit\"),\n matchField(\"defaultSalesUnitQuantity\"),\n matchField(\"uomRoundingScale\"),\n matchField(\"uomRoundingMode\"),\n matchField(\"unitPriceEnabled\"),\n matchField(\"unitPriceReferenceUnit\"),\n matchField(\"unitPriceBaseQuantity\"),\n matchPrefix(\"unitConversions\"),\n ],\n variants: [\n matchField(\"hasVariants\"),\n matchPrefix(\"options\"),\n matchPrefix(\"variants\"),\n ],\n};\n\nfunction resolveStepForField(fieldId: string): ProductFormStep | null {\n const normalized = fieldId?.trim();\n if (!normalized) return null;\n for (const step of PRODUCT_FORM_STEPS) {\n const matchers = STEP_FIELD_MATCHERS[step];\n if (matchers.some((matcher) => matcher(normalized))) return step;\n }\n return null;\n}\n\nfunction resolveBooleanFlag(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return false;\n if (TRUE_BOOLEAN_VALUES.has(normalized)) return true;\n if ([\"false\", \"0\", \"no\", \"n\", \"f\"].includes(normalized)) return false;\n }\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n\n\ninterface InboxProductDraft {\n actionId: string;\n proposalId: string;\n payload: Record<string, unknown>;\n}\n\nfunction readInboxProductDraft(): InboxProductDraft | null {\n try {\n const raw = sessionStorage.getItem(\"inbox_ops.productDraft\");\n if (!raw) return null;\n const parsed = JSON.parse(raw) as InboxProductDraft;\n if (!parsed.actionId || !parsed.proposalId || !parsed.payload) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport default function CreateCatalogProductPage() {\n const t = useT();\n const router = useRouter();\n const searchParams = useSearchParams();\n const fromInboxAction = searchParams.get(\"fromInboxAction\");\n\n const inboxDraft = React.useMemo<InboxProductDraft | null>(() => {\n if (!fromInboxAction) return null;\n return readInboxProductDraft();\n }, [fromInboxAction]);\n\n const initialValuesRef = React.useRef<ProductFormValues | null>(null);\n if (!initialValuesRef.current) {\n const initial = createInitialProductFormValues();\n if (inboxDraft?.payload) {\n const p = inboxDraft.payload;\n if (typeof p.title === \"string\" && p.title.trim()) initial.title = p.title.trim();\n if (typeof p.description === \"string\" && p.description.trim()) initial.description = p.description.trim();\n }\n initialValuesRef.current = initial;\n }\n const [priceKinds, setPriceKinds] = React.useState<PriceKindSummary[]>([]);\n const [taxRates, setTaxRates] = React.useState<TaxRateSummary[]>([]);\n React.useEffect(() => {\n const loadPriceKinds = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: PriceKindApiPayload[];\n }>(\"/api/catalog/price-kinds?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.priceKinds.errors.load\",\n \"Failed to load price kinds.\",\n ),\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setPriceKinds(\n items\n .map((item) => normalizePriceKindSummary(item))\n .filter((item): item is PriceKindSummary => item !== null),\n );\n } catch (err) {\n console.error(\"catalog.price-kinds.fetch failed\", err);\n setPriceKinds([]);\n }\n };\n loadPriceKinds().catch(() => {});\n }, [t]);\n\n React.useEffect(() => {\n const loadTaxRates = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.products.create.taxRates.error\",\n \"Failed to load tax rates.\",\n ),\n fallback: { items: [] },\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setTaxRates(\n items.map((item) => {\n const rawRate =\n typeof item.rate === \"number\"\n ? item.rate\n : Number(item.rate ?? Number.NaN);\n return {\n id: String(item.id),\n name:\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name\n : t(\n \"catalog.products.create.taxRates.unnamed\",\n \"Untitled tax rate\",\n ),\n code:\n typeof item.code === \"string\" && item.code.trim().length\n ? item.code\n : null,\n rate: Number.isFinite(rawRate) ? rawRate : null,\n isDefault: resolveBooleanFlag(\n typeof item.isDefault !== \"undefined\"\n ? item.isDefault\n : item.is_default,\n ),\n };\n }),\n );\n } catch (err) {\n console.error(\"sales.tax-rates.fetch failed\", err);\n setTaxRates([]);\n }\n };\n loadTaxRates().catch(() => {});\n }, [t]);\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => [\n {\n id: \"builder\",\n column: 1,\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductBuilder\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n priceKinds={priceKinds}\n taxRates={taxRates}\n />\n ),\n },\n {\n id: \"product-meta\",\n column: 2,\n title: t(\"catalog.products.create.meta.title\", \"Product meta\"),\n description: t(\n \"catalog.products.create.meta.description\",\n \"Manage subtitle and handle for storefronts.\",\n ),\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductMetaSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n taxRates={taxRates}\n />\n ),\n },\n ],\n [priceKinds, taxRates, t],\n );\n\n return (\n <Page>\n <PageBody>\n <CrudForm<ProductFormValues>\n title={t(\"catalog.products.create.title\", \"Create product\")}\n backHref=\"/backend/catalog/products\"\n fields={[]}\n groups={groups}\n injectionSpotId=\"crud-form:catalog.product\"\n initialValues={\n initialValuesRef.current ?? createInitialProductFormValues()\n }\n schema={productFormTypedSchema}\n submitLabel={t(\"catalog.products.create.submit\", \"Create\")}\n cancelHref=\"/backend/catalog/products\"\n onSubmit={async (formValues) => {\n const title = formValues.title?.trim();\n if (!title) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n {\n title: t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n },\n );\n }\n const handle = formValues.handle?.trim() || undefined;\n const description = formValues.description?.trim() || undefined;\n const defaultMediaId =\n typeof formValues.defaultMediaId === \"string\" &&\n formValues.defaultMediaId.trim().length\n ? formValues.defaultMediaId\n : null;\n const mediaItems = Array.isArray(formValues.mediaItems)\n ? formValues.mediaItems\n : [];\n const attachmentIds = mediaItems\n .map((item) => (typeof item.id === \"string\" ? item.id : null))\n .filter((value): value is string => !!value);\n const mediaDraftId =\n typeof formValues.mediaDraftId === \"string\"\n ? formValues.mediaDraftId\n : \"\";\n const defaultMediaEntry = defaultMediaId\n ? mediaItems.find((item) => item.id === defaultMediaId)\n : null;\n const defaultMediaUrl = defaultMediaEntry\n ? buildAttachmentImageUrl(defaultMediaEntry.id, {\n slug: slugifyAttachmentFileName(defaultMediaEntry.fileName),\n })\n : null;\n const optionSchemaDefinition = buildOptionSchemaDefinition(\n formValues.options,\n title,\n );\n const dimensions = sanitizeProductDimensions(\n formValues.dimensions ?? null,\n );\n const weight = sanitizeProductWeight(formValues.weight ?? null);\n const resolveTaxRateValue = (taxRateId?: string | null) => {\n if (!taxRateId) return null;\n const match = taxRates.find((rate) => rate.id === taxRateId);\n return typeof match?.rate === \"number\" ? match.rate : null;\n };\n const productLevelTaxRateId = formValues.taxRateId ?? null;\n const productTaxRate = resolveTaxRateValue(productLevelTaxRateId);\n const resolveVariantTax = (variant: VariantDraft) => {\n const resolvedVariantTaxRateId =\n variant.taxRateId ?? productLevelTaxRateId;\n const resolvedVariantTaxRate =\n resolveTaxRateValue(resolvedVariantTaxRateId) ??\n (resolvedVariantTaxRateId ? null : (productTaxRate ?? null));\n return { resolvedVariantTaxRateId, resolvedVariantTaxRate };\n };\n const defaultUnit = canonicalizeUnitCode(formValues.defaultUnit);\n const defaultSalesUnit = canonicalizeUnitCode(\n formValues.defaultSalesUnit,\n );\n const defaultSalesUnitQuantity =\n toPositiveNumberOrNull(formValues.defaultSalesUnitQuantity) ?? 1;\n const uomRoundingScale = toIntegerInRangeOrDefault(\n formValues.uomRoundingScale,\n 0,\n 6,\n 4,\n );\n const uomRoundingMode: ProductUnitRoundingMode =\n formValues.uomRoundingMode === \"down\" ||\n formValues.uomRoundingMode === \"up\"\n ? formValues.uomRoundingMode\n : \"half_up\";\n const unitPriceEnabled = Boolean(formValues.unitPriceEnabled);\n const unitPriceReferenceUnit = canonicalizeUnitCode(\n formValues.unitPriceReferenceUnit,\n );\n const unitPriceBaseQuantity = toPositiveNumberOrNull(\n formValues.unitPriceBaseQuantity,\n );\n if (defaultSalesUnit && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequired\",\n \"Base unit is required when default sales unit is set.\",\n );\n throw createCrudFormError(message, { defaultSalesUnit: message });\n }\n const conversionInputs = normalizeProductConversionInputs(\n formValues.unitConversions,\n t(\n \"catalog.products.uom.errors.duplicateConversion\",\n \"Duplicate conversion unit is not allowed.\",\n ),\n );\n if (conversionInputs.length && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequiredForConversions\",\n \"Base unit is required when conversions are configured.\",\n );\n throw createCrudFormError(message, { defaultUnit: message });\n }\n const defaultUnitKey = defaultUnit?.toLowerCase() ?? null;\n const defaultSalesUnitKey = defaultSalesUnit?.toLowerCase() ?? null;\n if (\n defaultUnitKey &&\n defaultSalesUnitKey &&\n defaultSalesUnitKey !== defaultUnitKey\n ) {\n const hasDefaultSalesConversion = conversionInputs.some(\n (entry) =>\n entry.isActive &&\n entry.unitCode.toLowerCase() === defaultSalesUnitKey,\n );\n if (!hasDefaultSalesConversion) {\n const message = t(\n \"catalog.products.uom.errors.defaultSalesConversionRequired\",\n \"Active conversion for default sales unit is required when it differs from base unit.\",\n );\n throw createCrudFormError(message, {\n defaultSalesUnit: message,\n unitConversions: message,\n });\n }\n }\n if (unitPriceEnabled) {\n if (\n !unitPriceReferenceUnit ||\n !UNIT_PRICE_REFERENCE_UNITS.has(\n unitPriceReferenceUnit as ProductUnitPriceReferenceUnit,\n )\n ) {\n const message = t(\n \"catalog.products.unitPrice.errors.referenceUnit\",\n \"Reference unit is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceReferenceUnit: message,\n });\n }\n if (unitPriceBaseQuantity === null) {\n const message = t(\n \"catalog.products.unitPrice.errors.baseQuantity\",\n \"Base quantity is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceBaseQuantity: message,\n });\n }\n }\n const productPayload: Record<string, unknown> = {\n title,\n subtitle: formValues.subtitle?.trim() || undefined,\n description,\n handle,\n taxRateId: formValues.taxRateId ?? null,\n taxRate: productTaxRate ?? null,\n isConfigurable: Boolean(formValues.hasVariants),\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n dimensions,\n weightValue: weight?.value ?? null,\n weightUnit: weight?.unit ?? null,\n defaultUnit: defaultUnit ?? null,\n defaultSalesUnit: defaultSalesUnit ?? defaultUnit ?? null,\n defaultSalesUnitQuantity,\n uomRoundingScale,\n uomRoundingMode,\n unitPriceEnabled,\n unitPriceReferenceUnit: unitPriceEnabled\n ? unitPriceReferenceUnit\n : undefined,\n unitPriceBaseQuantity: unitPriceEnabled\n ? unitPriceBaseQuantity\n : undefined,\n };\n if (optionSchemaDefinition) {\n productPayload.optionSchema = optionSchemaDefinition;\n }\n const categoryIds = Array.isArray(formValues.categoryIds)\n ? formValues.categoryIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (categoryIds.length) {\n productPayload.categoryIds = Array.from(new Set(categoryIds));\n }\n const tags = Array.isArray(formValues.tags)\n ? Array.from(\n new Set(\n formValues.tags\n .map((tag) => (typeof tag === \"string\" ? tag.trim() : \"\"))\n .filter((tag) => tag.length),\n ),\n )\n : [];\n if (tags.length) {\n productPayload.tags = tags;\n }\n const channelIds = Array.isArray(formValues.channelIds)\n ? formValues.channelIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (channelIds.length) {\n productPayload.offers = channelIds.map((channelId) => ({\n channelId,\n title,\n description,\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n }));\n }\n\n const variantDrafts =\n (Array.isArray(formValues.variants) && formValues.variants.length\n ? formValues.variants\n : [\n createVariantDraft(formValues.taxRateId ?? null, {\n isDefault: true,\n }),\n ]) ?? [];\n const priceRequests: VariantPriceRequest[] = [];\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n for (const priceKind of priceKinds) {\n const value = variant.prices?.[priceKind.id]?.amount?.trim();\n if (!value) continue;\n const numeric = Number(value);\n if (\n Number.isNaN(numeric) ||\n !Number.isFinite(numeric) ||\n numeric < 0\n ) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.priceNonNegative\",\n \"Prices must be zero or greater.\",\n ),\n );\n }\n const currencyCode =\n typeof priceKind.currencyCode === \"string\" &&\n priceKind.currencyCode.trim().length\n ? priceKind.currencyCode.trim().toUpperCase()\n : \"\";\n if (!currencyCode) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.currency\",\n \"Provide a currency for all price kinds.\",\n ),\n {},\n );\n }\n priceRequests.push({\n variantDraftId: variant.id,\n priceKindId: priceKind.id,\n currencyCode,\n amount: numeric,\n displayMode: priceKind.displayMode,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRateValue: resolvedVariantTaxRate ?? null,\n });\n }\n }\n\n const cleanupState: {\n productId: string | null;\n variantIds: string[];\n } = { productId: null, variantIds: [] };\n try {\n const { result: created } = await createCrud<{ id?: string }>(\n \"catalog/products\",\n productPayload,\n );\n const productId = created?.id;\n if (!productId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.id\",\n \"Product id missing after create.\",\n ),\n );\n }\n cleanupState.productId = productId;\n\n for (const conversion of conversionInputs) {\n await createCrud(\"catalog/product-unit-conversions\", {\n productId,\n unitCode: conversion.unitCode,\n toBaseFactor: conversion.toBaseFactor,\n sortOrder: conversion.sortOrder,\n isActive: conversion.isActive,\n });\n }\n\n const variantIdMap: Record<string, string> = {};\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n const variantPayload: Record<string, unknown> = {\n productId,\n name:\n variant.title?.trim() ||\n Object.values(variant.optionValues).join(\" / \") ||\n \"Variant\",\n sku: variant.sku?.trim() || undefined,\n isDefault: Boolean(variant.isDefault),\n isActive: true,\n optionValues: Object.keys(variant.optionValues).length\n ? variant.optionValues\n : undefined,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRate: resolvedVariantTaxRate ?? null,\n };\n const { result: variantResult } = await createCrud<{\n id?: string;\n variantId?: string;\n }>(\"catalog/variants\", variantPayload);\n const variantId = variantResult?.variantId ?? variantResult?.id;\n if (!variantId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.variant\",\n \"Failed to create variant.\",\n ),\n );\n }\n variantIdMap[variant.id] = variantId;\n cleanupState.variantIds.push(variantId);\n }\n\n for (const draft of priceRequests) {\n const variantId = variantIdMap[draft.variantDraftId];\n if (!variantId) continue;\n const pricePayload: Record<string, unknown> = {\n productId,\n variantId,\n currencyCode: draft.currencyCode,\n priceKindId: draft.priceKindId,\n };\n if (draft.taxRateId) {\n pricePayload.taxRateId = draft.taxRateId;\n } else if (\n typeof draft.taxRateValue === \"number\" &&\n Number.isFinite(draft.taxRateValue)\n ) {\n pricePayload.taxRate = draft.taxRateValue;\n }\n if (draft.displayMode === \"including-tax\") {\n pricePayload.unitPriceGross = draft.amount;\n } else {\n pricePayload.unitPriceNet = draft.amount;\n }\n await createCrud(\"catalog/prices\", pricePayload);\n }\n\n if (mediaDraftId && attachmentIds.length) {\n const transfer = await apiCall<{\n ok?: boolean;\n error?: string;\n }>(\n \"/api/attachments/transfer\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n entityId: E.catalog.catalog_product,\n attachmentIds,\n fromRecordId: mediaDraftId,\n toRecordId: productId,\n }),\n },\n { fallback: null },\n );\n if (!transfer.ok) {\n console.error(\n \"attachments.transfer.failed\",\n transfer.result?.error,\n );\n }\n }\n\n if (inboxDraft) {\n try {\n sessionStorage.removeItem(\"inbox_ops.productDraft\");\n } catch { /* ignore */ }\n try {\n await apiCall(\n `/api/inbox_ops/proposals/${inboxDraft.proposalId}/actions/${inboxDraft.actionId}/complete`,\n {\n method: \"PATCH\",\n body: JSON.stringify({\n createdEntityId: productId,\n createdEntityType: \"catalog_product\",\n }),\n },\n );\n } catch {\n flash(\n t(\n \"inbox_ops.flash.complete_failed\",\n \"Product created but failed to update inbox action status.\",\n ),\n \"warning\",\n );\n }\n }\n\n flash(\n t(\"catalog.products.create.success\", \"Product created.\"),\n \"success\",\n );\n if (inboxDraft) {\n router.push(\n `/backend/inbox-ops/proposals/${encodeURIComponent(inboxDraft.proposalId)}`,\n );\n } else {\n router.push(\"/backend/catalog/products\");\n }\n } catch (err) {\n await cleanupFailedProduct(\n cleanupState.productId,\n cleanupState.variantIds,\n );\n throw err;\n }\n }}\n />\n </PageBody>\n </Page>\n );\n}\n\nasync function cleanupFailedProduct(\n productId: string | null,\n variantIds: string[],\n): Promise<void> {\n if (!productId && variantIds.length === 0) return;\n if (variantIds.length) {\n const variantDeletes = variantIds.map((variantId) =>\n apiCall(`/api/catalog/variants?id=${encodeURIComponent(variantId)}`, {\n method: \"DELETE\",\n }).catch(() => null),\n );\n await Promise.allSettled(variantDeletes);\n }\n if (productId) {\n await apiCall(`/api/catalog/products?id=${encodeURIComponent(productId)}`, {\n method: \"DELETE\",\n }).catch(() => null);\n }\n}\n\ntype ProductBuilderProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n priceKinds: PriceKindSummary[];\n taxRates: TaxRateSummary[];\n};\n\ntype ProductMetaSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n taxRates: TaxRateSummary[];\n};\n\ntype ProductDimensionsSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n};\n\nfunction ProductDimensionsFields({\n values,\n setValue,\n}: ProductDimensionsSectionProps) {\n const t = useT();\n const dimensionValues = normalizeProductDimensions(values.dimensions);\n const weightValues = normalizeProductWeight(values.weight);\n\n return (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <h3 className=\"text-sm font-semibold\">\n {t(\"catalog.products.edit.dimensions\", \"Dimensions & weight\")}\n </h3>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.width\", \"Width\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.width ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"width\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.height\", \"Height\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.height ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"height\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.depth\", \"Depth\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.depth ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"depth\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.unit\", \"Size unit\")}\n </Label>\n <Input\n value={dimensionValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"cm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.value\", \"Weight\")}\n </Label>\n <Input\n type=\"number\"\n value={weightValues?.value ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"value\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.unit\", \"Weight unit\")}\n </Label>\n <Input\n value={weightValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"kg\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProductBuilder({\n values,\n setValue,\n errors,\n priceKinds,\n taxRates,\n}: ProductBuilderProps) {\n const t = useT();\n const steps = PRODUCT_FORM_STEPS;\n const [currentStep, setCurrentStep] = React.useState(0);\n const defaultTaxRate = React.useMemo(\n () =>\n values.taxRateId\n ? (taxRates.find((rate) => rate.id === values.taxRateId) ?? null)\n : null,\n [taxRates, values.taxRateId],\n );\n React.useEffect(() => {\n if (values.taxRateId) return;\n if (!taxRates.length) return;\n const fallback = taxRates.find((rate) => rate.isDefault);\n if (!fallback) return;\n setValue(\"taxRateId\", fallback.id);\n }, [taxRates, setValue, values.taxRateId]);\n const stepErrors = React.useMemo(() => {\n const map = steps.reduce<Record<ProductFormStep, string[]>>(\n (acc, step) => {\n acc[step] = [];\n return acc;\n },\n {} as Record<ProductFormStep, string[]>,\n );\n Object.entries(errors).forEach(([fieldId, message]) => {\n const step = resolveStepForField(fieldId);\n if (!step) return;\n const text =\n typeof message === \"string\" && message.trim().length\n ? message.trim()\n : null;\n if (text) map[step] = [...map[step], text];\n });\n return map;\n }, [errors, steps]);\n const errorSignature = React.useMemo(\n () => Object.keys(errors).sort().join(\"|\"),\n [errors],\n );\n const lastErrorSignatureRef = React.useRef<string | null>(null);\n React.useEffect(() => {\n if (!errorSignature || errorSignature === lastErrorSignatureRef.current)\n return;\n lastErrorSignatureRef.current = errorSignature;\n const currentStepKey = steps[currentStep];\n if (currentStepKey && stepErrors[currentStepKey]?.length) return;\n const fallbackIndex = steps.findIndex(\n (step) => (stepErrors[step] ?? []).length > 0,\n );\n if (fallbackIndex >= 0 && fallbackIndex !== currentStep) {\n setCurrentStep(fallbackIndex);\n }\n }, [currentStep, errorSignature, setCurrentStep, stepErrors, steps]);\n const defaultTaxRateLabel = defaultTaxRate\n ? formatTaxRateLabel(defaultTaxRate)\n : null;\n const inventoryDisabledHint = t(\n \"catalog.products.create.variantsBuilder.inventoryDisabled\",\n \"Inventory tracking controls are not available yet.\",\n );\n\n React.useEffect(() => {\n if (currentStep >= steps.length) setCurrentStep(0);\n }, [currentStep, steps.length]);\n\n const currentStepKey = steps[currentStep] ?? steps[0];\n\n const mediaItems = React.useMemo(\n () => (Array.isArray(values.mediaItems) ? values.mediaItems : []),\n [values.mediaItems],\n );\n\n const handleMediaItemsChange = React.useCallback(\n (nextItems: ProductMediaItem[]) => {\n setValue(\"mediaItems\", nextItems);\n const hasCurrent = nextItems.some(\n (item) => item.id === values.defaultMediaId,\n );\n if (!hasCurrent) {\n const fallbackId = nextItems[0]?.id ?? null;\n setValue(\"defaultMediaId\", fallbackId);\n if (fallbackId && nextItems[0]) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(fallbackId, {\n slug: slugifyAttachmentFileName(nextItems[0].fileName),\n }),\n );\n } else {\n setValue(\"defaultMediaUrl\", \"\");\n }\n }\n },\n [setValue, values.defaultMediaId],\n );\n\n const handleDefaultMediaChange = React.useCallback(\n (attachmentId: string | null) => {\n setValue(\"defaultMediaId\", attachmentId);\n if (!attachmentId) {\n setValue(\"defaultMediaUrl\", \"\");\n return;\n }\n const target = mediaItems.find((item) => item.id === attachmentId);\n if (target) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(target.id, {\n slug: slugifyAttachmentFileName(target.fileName),\n }),\n );\n }\n },\n [mediaItems, setValue],\n );\n\n const ensureVariants = React.useCallback(() => {\n const optionDefinitions = Array.isArray(values.options)\n ? values.options\n : [];\n if (!values.hasVariants || !optionDefinitions.length) {\n if (!values.variants || !values.variants.length) {\n setValue(\"variants\", [\n createVariantDraft(values.taxRateId ?? null, { isDefault: true }),\n ]);\n }\n return;\n }\n const combos = buildVariantCombinations(optionDefinitions);\n const existing = Array.isArray(values.variants) ? values.variants : [];\n const existingByKey = new Map(\n existing.map((variant) => [\n buildOptionValuesKey(variant.optionValues),\n variant,\n ]),\n );\n let hasDefault = existing.some((variant) => variant.isDefault);\n let changed = existing.length !== combos.length;\n const nextVariants: VariantDraft[] = combos.map((combo, index) => {\n const key = buildOptionValuesKey(combo);\n const existingMatch = existingByKey.get(key);\n if (existingMatch) {\n if (existingMatch.isDefault) hasDefault = true;\n if (!haveSameOptionValues(existingMatch.optionValues, combo)) {\n changed = true;\n return { ...existingMatch, optionValues: combo };\n }\n if (existing[index] !== existingMatch) {\n changed = true;\n }\n return existingMatch;\n }\n changed = true;\n return createVariantDraft(values.taxRateId ?? null, {\n title: Object.values(combo).join(\" / \"),\n optionValues: combo,\n });\n });\n if (!nextVariants.length) return;\n if (!hasDefault) {\n changed = true;\n nextVariants[0] = { ...nextVariants[0], isDefault: true };\n }\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [\n values.options,\n values.variants,\n values.hasVariants,\n values.taxRateId,\n setValue,\n ]);\n\n React.useEffect(() => {\n ensureVariants();\n }, [ensureVariants]);\n\n React.useEffect(() => {\n if (!values.taxRateId) return;\n const variants = Array.isArray(values.variants) ? values.variants : [];\n if (!variants.length) return;\n let changed = false;\n const nextVariants = variants.map((variant) => {\n if (variant.taxRateId) return variant;\n changed = true;\n return { ...variant, taxRateId: values.taxRateId };\n });\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [values.taxRateId, values.variants, setValue]);\n const setVariantField = React.useCallback(\n (variantId: string, field: keyof VariantDraft, value: unknown) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n return { ...variant, [field]: value };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const setVariantPrice = React.useCallback(\n (variantId: string, priceKindId: string, amount: string) => {\n if (amount.trim().startsWith(\"-\")) return;\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n const nextPrices = { ...(variant.prices ?? {}) };\n if (amount === \"\") {\n delete nextPrices[priceKindId];\n } else {\n nextPrices[priceKindId] = { amount };\n }\n return {\n ...variant,\n prices: nextPrices,\n };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const markDefaultVariant = React.useCallback(\n (variantId: string) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => ({\n ...variant,\n isDefault: variant.id === variantId,\n }),\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const handleOptionTitleChange = React.useCallback(\n (optionId: string, title: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n return { ...option, title };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const setOptionValues = React.useCallback(\n (optionId: string, labels: string[]) => {\n const normalized = labels\n .map((label) => label.trim())\n .filter((label) => label.length);\n const unique = Array.from(new Set(normalized));\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n const existingByLabel = new Map(\n option.values.map((value) => [value.label, value]),\n );\n const nextValues = unique.map(\n (label) =>\n existingByLabel.get(label) ?? { id: createLocalId(), label },\n );\n return {\n ...option,\n values: nextValues,\n };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const addOption = React.useCallback(() => {\n const next = [\n ...(Array.isArray(values.options) ? values.options : []),\n { id: createLocalId(), title: \"\", values: [] },\n ];\n setValue(\"options\", next);\n }, [values.options, setValue]);\n\n const removeOption = React.useCallback(\n (optionId: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).filter(\n (option) => option.id !== optionId,\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n return (\n <div className=\"space-y-6\">\n <nav className=\"flex gap-6 border-b pb-2 text-sm font-medium\">\n {steps.map((step, index) => (\n <Button\n key={step}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"relative h-auto rounded-none px-0 py-1 pb-2 font-medium\",\n currentStep === index\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n onClick={() => setCurrentStep(index)}\n >\n {step === \"general\" &&\n t(\"catalog.products.create.steps.general\", \"General data\")}\n {step === \"organize\" &&\n t(\"catalog.products.create.steps.organize\", \"Organize\")}\n {step === \"uom\" &&\n t(\"catalog.products.uom.title\", \"Units of measure\")}\n {step === \"variants\" &&\n t(\"catalog.products.create.steps.variants\", \"Variants\")}\n {(stepErrors[step]?.length ?? 0) > 0 ? (\n <span\n className=\"absolute -right-2 top-0 h-2 w-2 rounded-full bg-destructive\"\n aria-hidden=\"true\"\n />\n ) : null}\n {currentStep === index ? (\n <span className=\"absolute inset-x-0 -bottom-px h-0.5 bg-foreground rounded-full\" />\n ) : null}\n </Button>\n ))}\n </nav>\n\n {currentStepKey === \"general\" ? (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1\">\n {t(\"catalog.products.form.title\", \"Title\")}\n <span className=\"text-red-600\">*</span>\n </Label>\n <Input\n value={values.title}\n onChange={(event) => setValue(\"title\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.title\",\n \"e.g., Summer sneaker\",\n )}\n />\n {errors.title ? (\n <p className=\"text-xs text-red-600\">{errors.title}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label>\n {t(\"catalog.products.form.description\", \"Description\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setValue(\"useMarkdown\", !values.useMarkdown)}\n className=\"gap-2 text-xs\"\n >\n {values.useMarkdown ? (\n <AlignLeft className=\"h-4 w-4\" />\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n {values.useMarkdown\n ? t(\n \"catalog.products.create.actions.usePlain\",\n \"Use plain text\",\n )\n : t(\n \"catalog.products.create.actions.useMarkdown\",\n \"Use markdown\",\n )}\n </Button>\n </div>\n {values.useMarkdown ? (\n <div\n data-color-mode=\"light\"\n className=\"overflow-hidden rounded-md border\"\n >\n <MarkdownEditor\n value={values.description}\n height={260}\n onChange={(val) => setValue(\"description\", val ?? \"\")}\n previewOptions={{ remarkPlugins: [] }}\n />\n </div>\n ) : (\n <textarea\n className=\"min-h-[180px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.description}\n onChange={(event) =>\n setValue(\"description\", event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.placeholders.description\",\n \"Describe the product...\",\n )}\n />\n )}\n </div>\n\n <ProductMediaManager\n entityId={E.catalog.catalog_product}\n draftRecordId={values.mediaDraftId}\n items={mediaItems}\n defaultMediaId={values.defaultMediaId ?? null}\n onItemsChange={handleMediaItemsChange}\n onDefaultChange={handleDefaultMediaChange}\n />\n\n <ProductDimensionsFields\n values={values as ProductFormValues}\n setValue={setValue}\n />\n </div>\n ) : null}\n\n {currentStepKey === \"organize\" ? (\n <ProductCategorizeSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n />\n ) : null}\n\n {currentStepKey === \"uom\" ? (\n <ProductUomSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n embedded\n />\n ) : null}\n\n {currentStepKey === \"variants\" ? (\n <div className=\"space-y-6\">\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border\"\n checked={values.hasVariants}\n onChange={(event) =>\n setValue(\"hasVariants\", event.target.checked)\n }\n />\n {t(\n \"catalog.products.create.variantsBuilder.toggle\",\n \"Yes, this is a product with variants\",\n )}\n </label>\n\n {values.hasVariants ? (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">\n {t(\n \"catalog.products.create.optionsBuilder.title\",\n \"Product options\",\n )}\n </h3>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addOption}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {t(\n \"catalog.products.create.optionsBuilder.add\",\n \"Add option\",\n )}\n </Button>\n </div>\n {(Array.isArray(values.options) ? values.options : []).map(\n (option) => (\n <div key={option.id} className=\"rounded-md bg-muted/40 p-4\">\n <div className=\"flex items-center gap-2\">\n <Input\n value={option.title}\n onChange={(event) =>\n handleOptionTitleChange(option.id, event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.placeholder\",\n \"e.g., Color\",\n )}\n className=\"flex-1\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n type=\"button\"\n onClick={() => removeOption(option.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"mt-3 space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.values\",\n \"Values\",\n )}\n </Label>\n <TagsInput\n value={option.values.map((value) => value.label)}\n onChange={(labels) =>\n setOptionValues(option.id, labels)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.valuePlaceholder\",\n \"Type a value and press Enter\",\n )}\n />\n </div>\n </div>\n ),\n )}\n {!values.options?.length ? (\n <p className=\"text-sm text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.empty\",\n \"No options yet. Add your first option to generate variants.\",\n )}\n </p>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"rounded-lg border\">\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full min-w-[900px] table-fixed border-collapse text-sm\">\n <thead className=\"bg-muted/40\">\n <tr>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.defaultOption\",\n \"Default option\",\n )}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.form.variants\", \"Variant title\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.create.variantsBuilder.sku\", \"SKU\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.vatColumn\",\n \"Tax class\",\n )}\n </th>\n {priceKinds.map((kind) => (\n <th key={kind.id} className=\"px-3 py-2 text-left\">\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1\">\n <span>\n {t(\n \"catalog.products.create.variantsBuilder.priceColumn\",\n \"Price {{title}}\",\n ).replace(\"{{title}}\", kind.title)}\n </span>\n <small\n title={\n kind.displayMode === \"including-tax\"\n ? t(\n \"catalog.priceKinds.form.displayMode.include\",\n \"Including tax\",\n )\n : t(\n \"catalog.priceKinds.form.displayMode.exclude\",\n \"Excluding tax\",\n )\n }\n className=\"text-xs text-muted-foreground\"\n >\n {kind.displayMode === \"including-tax\" ? \"\u24C9\" : \"\u24C3\"}\n </small>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode?.toUpperCase() ??\n t(\n \"catalog.products.create.variantsBuilder.currencyMissing\",\n \"Currency missing\",\n )}\n </span>\n </div>\n </th>\n ))}\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.manageInventory\",\n \"Managed inventory\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.allowBackorder\",\n \"Allow backorder\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.inventoryKit\",\n \"Has inventory kit\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {(Array.isArray(values.variants) && values.variants.length\n ? values.variants\n : [\n createVariantDraft(values.taxRateId ?? null, {\n isDefault: true,\n }),\n ]\n ).map((variant) => (\n <tr key={variant.id} className=\"border-t\">\n <td className=\"px-3 py-2\">\n <label className=\"inline-flex items-center gap-1 text-xs\">\n <input\n type=\"radio\"\n name=\"defaultVariant\"\n checked={variant.isDefault}\n onChange={() => markDefaultVariant(variant.id)}\n />\n {variant.isDefault\n ? t(\n \"catalog.products.create.variantsBuilder.defaultLabel\",\n \"Default option value\",\n )\n : t(\n \"catalog.products.create.variantsBuilder.makeDefault\",\n \"Set as default\",\n )}\n </label>\n {values.hasVariants && variant.optionValues ? (\n <p className=\"text-xs text-muted-foreground\">\n {Object.values(variant.optionValues).join(\" / \")}\n </p>\n ) : null}\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.title}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"title\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.titlePlaceholder\",\n \"Variant title\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.sku}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"sku\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.skuPlaceholder\",\n \"e.g., SKU-001\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n value={variant.taxRateId ?? \"\"}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"taxRateId\",\n event.target.value || null,\n )\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {defaultTaxRateLabel\n ? t(\n \"catalog.products.create.variantsBuilder.vatOptionDefault\",\n \"Use product tax class ({{label}})\",\n ).replace(\"{{label}}\", defaultTaxRateLabel)\n : t(\n \"catalog.products.create.variantsBuilder.vatOptionNone\",\n \"No tax class\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n </td>\n {priceKinds.map((kind) => (\n <td key={kind.id} className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode ?? \"\u2014\"}\n </span>\n <input\n type=\"number\"\n className=\"w-full rounded-md border px-2 py-1\"\n value={variant.prices?.[kind.id]?.amount ?? \"\"}\n onChange={(event) =>\n setVariantPrice(\n variant.id,\n kind.id,\n event.target.value,\n )\n }\n placeholder=\"0.00\"\n min={0}\n />\n </div>\n </td>\n ))}\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.manageInventory}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"manageInventory\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.allowBackorder}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"allowBackorder\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.hasInventoryKit}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"hasInventoryKit\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!priceKinds.length ? (\n <div className=\"flex items-center gap-2 border-t px-4 py-3 text-sm text-muted-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n {t(\n \"catalog.products.create.variantsBuilder.noPriceKinds\",\n \"Configure price kinds in Catalog settings to add price columns.\",\n )}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div className=\"flex justify-between border-t pt-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentStep(Math.max(0, currentStep - 1))}\n disabled={currentStep === 0}\n className=\"gap-2\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t(\"catalog.products.create.steps.previous\", \"Previous\")}\n </Button>\n {currentStepKey !== \"variants\" ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n setCurrentStep(Math.min(steps.length - 1, currentStep + 1))\n }\n className=\"gap-2\"\n >\n {t(\"catalog.products.create.steps.continue\", \"Continue\")}\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n\nfunction ProductMetaSection({\n values,\n setValue,\n errors,\n taxRates,\n}: ProductMetaSectionProps) {\n const t = useT();\n const handleValue = typeof values.handle === \"string\" ? values.handle : \"\";\n const titleSource = typeof values.title === \"string\" ? values.title : \"\";\n const autoHandleEnabledRef = React.useRef(handleValue.trim().length === 0);\n\n React.useEffect(() => {\n if (!autoHandleEnabledRef.current) return;\n const normalizedTitle = titleSource.trim();\n if (!normalizedTitle) {\n if (handleValue) {\n setValue(\"handle\", \"\");\n }\n return;\n }\n const nextHandle = slugify(normalizedTitle);\n if (nextHandle !== handleValue) {\n setValue(\"handle\", nextHandle);\n }\n }, [titleSource, handleValue, setValue]);\n\n const handleHandleInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n autoHandleEnabledRef.current = nextValue.trim().length === 0;\n setValue(\"handle\", nextValue);\n },\n [setValue],\n );\n\n const handleGenerateHandle = React.useCallback(() => {\n const slug = slugify(titleSource);\n autoHandleEnabledRef.current = true;\n setValue(\"handle\", slug);\n }, [titleSource, setValue]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.subtitle\", \"Subtitle\")}</Label>\n <Input\n value={typeof values.subtitle === \"string\" ? values.subtitle : \"\"}\n onChange={(event) => setValue(\"subtitle\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.subtitle\",\n \"Optional subtitle\",\n )}\n />\n {errors.subtitle ? (\n <p className=\"text-xs text-red-600\">{errors.subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.handle\", \"Handle\")}</Label>\n <div className=\"flex gap-2\">\n <Input\n value={handleValue}\n onChange={handleHandleInputChange}\n placeholder={t(\n \"catalog.products.create.placeholders.handle\",\n \"e.g., summer-sneaker\",\n )}\n className=\"font-mono lowercase\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleGenerateHandle}\n >\n {t(\"catalog.products.create.actions.generateHandle\", \"Generate\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"catalog.products.create.handleHelp\",\n \"Handle is used for URLs and must be unique.\",\n )}\n </p>\n {errors.handle ? (\n <p className=\"text-xs text-red-600\">{errors.handle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label>\n {t(\"catalog.products.create.taxRates.label\", \"Tax class\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n </span>\n </Button>\n </div>\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.taxRateId ?? \"\"}\n onChange={(event) =>\n setValue(\"taxRateId\", event.target.value || null)\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.noneSelected\",\n \"No tax class selected\",\n )\n : t(\n \"catalog.products.create.taxRates.emptyOption\",\n \"No tax classes available\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-muted-foreground\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.help\",\n \"Applied to new prices unless overridden per variant.\",\n )\n : t(\n \"catalog.products.create.taxRates.empty\",\n \"Define tax classes under Sales \u2192 Configuration.\",\n )}\n </p>\n {errors.taxRateId ? (\n <p className=\"text-xs text-red-600\">{errors.taxRateId}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],
5
- "mappings": ";AA8GI,cA2uBI,YA3uBJ;AA5GJ,YAAY,WAAW;AACvB,OAAO,aAAa;AACpB,SAAS,WAAW,uBAAuB;AAE3C,SAAS,MAAM,gBAAgB;AAC/B;AAAA,EACE;AAAA,OAGK;AACP,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,YAAY;AACrB,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,OAEK;AACP,SAAS,gCAAgC;AACzC;AAAA,EACE;AAAA,EAWA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,MAAM,yBACJ;AAmBF,MAAM,iBAAiB,QAAQ,MAAM,OAAO,sBAAsB,GAAG;AAAA,EACnE,KAAK;AAAA,EACL,SAAS,MACP,oBAAC,SAAI,WAAU,uEAAsE,kCAErF;AAEJ,CAAC;AAID,MAAM,sBAAsB,oBAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,GAAG,CAAC;AAElE,MAAM,aAAa,CAAC,YAAoB,CAAC,UACvC,UAAU,WACV,MAAM,WAAW,GAAG,OAAO,GAAG,KAC9B,MAAM,WAAW,GAAG,OAAO,GAAG;AAChC,MAAM,cAAc,CAAC,WAAmB,CAAC,UACvC,MAAM,WAAW,MAAM;AAEzB,MAAM,sBAGF;AAAA,EACF,SAAS;AAAA,IACP,WAAW,OAAO;AAAA,IAClB,WAAW,aAAa;AAAA,IACxB,WAAW,YAAY;AAAA,IACvB,WAAW,cAAc;AAAA,IACzB,YAAY,cAAc;AAAA,IAC1B,YAAY,YAAY;AAAA,IACxB,YAAY,QAAQ;AAAA,EACtB;AAAA,EACA,UAAU;AAAA,IACR,WAAW,aAAa;AAAA,IACxB,WAAW,YAAY;AAAA,IACvB,WAAW,MAAM;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH,WAAW,aAAa;AAAA,IACxB,WAAW,kBAAkB;AAAA,IAC7B,WAAW,0BAA0B;AAAA,IACrC,WAAW,kBAAkB;AAAA,IAC7B,WAAW,iBAAiB;AAAA,IAC5B,WAAW,kBAAkB;AAAA,IAC7B,WAAW,wBAAwB;AAAA,IACnC,WAAW,uBAAuB;AAAA,IAClC,YAAY,iBAAiB;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,IACR,WAAW,aAAa;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,YAAY,UAAU;AAAA,EACxB;AACF;AAEA,SAAS,oBAAoB,SAAyC;AACpE,QAAM,aAAa,SAAS,KAAK;AACjC,MAAI,CAAC,WAAY,QAAO;AACxB,aAAW,QAAQ,oBAAoB;AACrC,UAAM,WAAW,oBAAoB,IAAI;AACzC,QAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,UAAU,CAAC,EAAG,QAAO;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAI,CAAC,WAAY,QAAO;AACxB,QAAI,oBAAoB,IAAI,UAAU,EAAG,QAAO;AAChD,QAAI,CAAC,SAAS,KAAK,MAAM,KAAK,GAAG,EAAE,SAAS,UAAU,EAAG,QAAO;AAAA,EAClE;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,UAAU;AAChD,SAAO;AACT;AASA,SAAS,wBAAkD;AACzD,MAAI;AACF,UAAM,MAAM,eAAe,QAAQ,wBAAwB;AAC3D,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,OAAO,YAAY,CAAC,OAAO,cAAc,CAAC,OAAO,QAAS,QAAO;AACtE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEe,SAAR,2BAA4C;AACjD,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,gBAAgB;AACrC,QAAM,kBAAkB,aAAa,IAAI,iBAAiB;AAE1D,QAAM,aAAa,MAAM,QAAkC,MAAM;AAC/D,QAAI,CAAC,gBAAiB,QAAO;AAC7B,WAAO,sBAAsB;AAAA,EAC/B,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,mBAAmB,MAAM,OAAiC,IAAI;AACpE,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,UAAU,+BAA+B;AAC/C,QAAI,YAAY,SAAS;AACvB,YAAM,IAAI,WAAW;AACrB,UAAI,OAAO,EAAE,UAAU,YAAY,EAAE,MAAM,KAAK,EAAG,SAAQ,QAAQ,EAAE,MAAM,KAAK;AAChF,UAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,YAAY,KAAK,EAAG,SAAQ,cAAc,EAAE,YAAY,KAAK;AAAA,IAC1G;AACA,qBAAiB,UAAU;AAAA,EAC7B;AACA,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAA6B,CAAC,CAAC;AACzE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA2B,CAAC,CAAC;AACnE,QAAM,UAAU,MAAM;AACpB,UAAM,iBAAiB,YAAY;AACjC,UAAI;AACF,cAAM,UAAU,MAAM,qBAEnB,yCAAyC,QAAW;AAAA,UACrD,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AACD,cAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D;AAAA,UACE,MACG,IAAI,CAAC,SAAS,0BAA0B,IAAI,CAAC,EAC7C,OAAO,CAAC,SAAmC,SAAS,IAAI;AAAA,QAC7D;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,oCAAoC,GAAG;AACrD,sBAAc,CAAC,CAAC;AAAA,MAClB;AAAA,IACF;AACA,mBAAe,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACjC,GAAG,CAAC,CAAC,CAAC;AAEN,QAAM,UAAU,MAAM;AACpB,UAAM,eAAe,YAAY;AAC/B,UAAI;AACF,cAAM,UAAU,MAAM,qBAEnB,qCAAqC,QAAW;AAAA,UACjD,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,QACxB,CAAC;AACD,cAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D;AAAA,UACE,MAAM,IAAI,CAAC,SAAS;AAClB,kBAAM,UACJ,OAAO,KAAK,SAAS,WACjB,KAAK,OACL,OAAO,KAAK,QAAQ,OAAO,GAAG;AACpC,mBAAO;AAAA,cACL,IAAI,OAAO,KAAK,EAAE;AAAA,cAClB,MACE,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC9C,KAAK,OACL;AAAA,gBACE;AAAA,gBACA;AAAA,cACF;AAAA,cACN,MACE,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC9C,KAAK,OACL;AAAA,cACN,MAAM,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,cAC3C,WAAW;AAAA,gBACT,OAAO,KAAK,cAAc,cACtB,KAAK,YACL,KAAK;AAAA,cACX;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,gCAAgC,GAAG;AACjD,oBAAY,CAAC,CAAC;AAAA,MAChB;AAAA,IACF;AACA,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/B,GAAG,CAAC,CAAC,CAAC;AAEN,QAAM,SAAS,MAAM;AAAA,IACnB,MAAM;AAAA,MACJ;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,WAAW,CAAC;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,MACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,sCAAsC,cAAc;AAAA,QAC7D,aAAa;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,MACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,CAAC,YAAY,UAAU,CAAC;AAAA,EAC1B;AAEA,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,iCAAiC,gBAAgB;AAAA,MAC1D,UAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT;AAAA,MACA,iBAAgB;AAAA,MAChB,eACE,iBAAiB,WAAW,+BAA+B;AAAA,MAE7D,QAAQ;AAAA,MACR,aAAa,EAAE,kCAAkC,QAAQ;AAAA,MACzD,YAAW;AAAA,MACX,UAAU,OAAO,eAAe;AAC9B,cAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,YAAI,CAAC,OAAO;AACV,gBAAM;AAAA,YACJ;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,cAAM,SAAS,WAAW,QAAQ,KAAK,KAAK;AAC5C,cAAM,cAAc,WAAW,aAAa,KAAK,KAAK;AACtD,cAAM,iBACJ,OAAO,WAAW,mBAAmB,YACrC,WAAW,eAAe,KAAK,EAAE,SAC7B,WAAW,iBACX;AACN,cAAM,aAAa,MAAM,QAAQ,WAAW,UAAU,IAClD,WAAW,aACX,CAAC;AACL,cAAM,gBAAgB,WACnB,IAAI,CAAC,SAAU,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,IAAK,EAC5D,OAAO,CAAC,UAA2B,CAAC,CAAC,KAAK;AAC7C,cAAM,eACJ,OAAO,WAAW,iBAAiB,WAC/B,WAAW,eACX;AACN,cAAM,oBAAoB,iBACtB,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,cAAc,IACpD;AACJ,cAAM,kBAAkB,oBACpB,wBAAwB,kBAAkB,IAAI;AAAA,UAC5C,MAAM,0BAA0B,kBAAkB,QAAQ;AAAA,QAC5D,CAAC,IACD;AACJ,cAAM,yBAAyB;AAAA,UAC7B,WAAW;AAAA,UACX;AAAA,QACF;AACA,cAAM,aAAa;AAAA,UACjB,WAAW,cAAc;AAAA,QAC3B;AACA,cAAM,SAAS,sBAAsB,WAAW,UAAU,IAAI;AAC9D,cAAM,sBAAsB,CAAC,cAA8B;AACzD,cAAI,CAAC,UAAW,QAAO;AACvB,gBAAM,QAAQ,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS;AAC3D,iBAAO,OAAO,OAAO,SAAS,WAAW,MAAM,OAAO;AAAA,QACxD;AACA,cAAM,wBAAwB,WAAW,aAAa;AACtD,cAAM,iBAAiB,oBAAoB,qBAAqB;AAChE,cAAM,oBAAoB,CAAC,YAA0B;AACnD,gBAAM,2BACJ,QAAQ,aAAa;AACvB,gBAAM,yBACJ,oBAAoB,wBAAwB,MAC3C,2BAA2B,OAAQ,kBAAkB;AACxD,iBAAO,EAAE,0BAA0B,uBAAuB;AAAA,QAC5D;AACA,cAAM,cAAc,qBAAqB,WAAW,WAAW;AAC/D,cAAM,mBAAmB;AAAA,UACvB,WAAW;AAAA,QACb;AACA,cAAM,2BACJ,uBAAuB,WAAW,wBAAwB,KAAK;AACjE,cAAM,mBAAmB;AAAA,UACvB,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,kBACJ,WAAW,oBAAoB,UAC/B,WAAW,oBAAoB,OAC3B,WAAW,kBACX;AACN,cAAM,mBAAmB,QAAQ,WAAW,gBAAgB;AAC5D,cAAM,yBAAyB;AAAA,UAC7B,WAAW;AAAA,QACb;AACA,cAAM,wBAAwB;AAAA,UAC5B,WAAW;AAAA,QACb;AACA,YAAI,oBAAoB,CAAC,aAAa;AACpC,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,UACF;AACA,gBAAM,oBAAoB,SAAS,EAAE,kBAAkB,QAAQ,CAAC;AAAA,QAClE;AACA,cAAM,mBAAmB;AAAA,UACvB,WAAW;AAAA,UACX;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,iBAAiB,UAAU,CAAC,aAAa;AAC3C,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,UACF;AACA,gBAAM,oBAAoB,SAAS,EAAE,aAAa,QAAQ,CAAC;AAAA,QAC7D;AACA,cAAM,iBAAiB,aAAa,YAAY,KAAK;AACrD,cAAM,sBAAsB,kBAAkB,YAAY,KAAK;AAC/D,YACE,kBACA,uBACA,wBAAwB,gBACxB;AACA,gBAAM,4BAA4B,iBAAiB;AAAA,YACjD,CAAC,UACC,MAAM,YACN,MAAM,SAAS,YAAY,MAAM;AAAA,UACrC;AACA,cAAI,CAAC,2BAA2B;AAC9B,kBAAM,UAAU;AAAA,cACd;AAAA,cACA;AAAA,YACF;AACA,kBAAM,oBAAoB,SAAS;AAAA,cACjC,kBAAkB;AAAA,cAClB,iBAAiB;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,kBAAkB;AACpB,cACE,CAAC,0BACD,CAAC,2BAA2B;AAAA,YAC1B;AAAA,UACF,GACA;AACA,kBAAM,UAAU;AAAA,cACd;AAAA,cACA;AAAA,YACF;AACA,kBAAM,oBAAoB,SAAS;AAAA,cACjC,wBAAwB;AAAA,YAC1B,CAAC;AAAA,UACH;AACA,cAAI,0BAA0B,MAAM;AAClC,kBAAM,UAAU;AAAA,cACd;AAAA,cACA;AAAA,YACF;AACA,kBAAM,oBAAoB,SAAS;AAAA,cACjC,uBAAuB;AAAA,YACzB,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,iBAA0C;AAAA,UAC9C;AAAA,UACA,UAAU,WAAW,UAAU,KAAK,KAAK;AAAA,UACzC;AAAA,UACA;AAAA,UACA,WAAW,WAAW,aAAa;AAAA,UACnC,SAAS,kBAAkB;AAAA,UAC3B,gBAAgB,QAAQ,WAAW,WAAW;AAAA,UAC9C,gBAAgB,kBAAkB;AAAA,UAClC,iBAAiB,mBAAmB;AAAA,UACpC;AAAA,UACA,aAAa,QAAQ,SAAS;AAAA,UAC9B,YAAY,QAAQ,QAAQ;AAAA,UAC5B,aAAa,eAAe;AAAA,UAC5B,kBAAkB,oBAAoB,eAAe;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAwB,mBACpB,yBACA;AAAA,UACJ,uBAAuB,mBACnB,wBACA;AAAA,QACN;AACA,YAAI,wBAAwB;AAC1B,yBAAe,eAAe;AAAA,QAChC;AACA,cAAM,cAAc,MAAM,QAAQ,WAAW,WAAW,IACpD,WAAW,YACR,IAAI,CAAC,OAAQ,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI,EAAG,EACrD,OAAO,CAAC,OAAO,GAAG,MAAM,IAC3B,CAAC;AACL,YAAI,YAAY,QAAQ;AACtB,yBAAe,cAAc,MAAM,KAAK,IAAI,IAAI,WAAW,CAAC;AAAA,QAC9D;AACA,cAAM,OAAO,MAAM,QAAQ,WAAW,IAAI,IACtC,MAAM;AAAA,UACJ,IAAI;AAAA,YACF,WAAW,KACR,IAAI,CAAC,QAAS,OAAO,QAAQ,WAAW,IAAI,KAAK,IAAI,EAAG,EACxD,OAAO,CAAC,QAAQ,IAAI,MAAM;AAAA,UAC/B;AAAA,QACF,IACA,CAAC;AACL,YAAI,KAAK,QAAQ;AACf,yBAAe,OAAO;AAAA,QACxB;AACA,cAAM,aAAa,MAAM,QAAQ,WAAW,UAAU,IAClD,WAAW,WACR,IAAI,CAAC,OAAQ,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI,EAAG,EACrD,OAAO,CAAC,OAAO,GAAG,MAAM,IAC3B,CAAC;AACL,YAAI,WAAW,QAAQ;AACrB,yBAAe,SAAS,WAAW,IAAI,CAAC,eAAe;AAAA,YACrD;AAAA,YACA;AAAA,YACA;AAAA,YACA,gBAAgB,kBAAkB;AAAA,YAClC,iBAAiB,mBAAmB;AAAA,UACtC,EAAE;AAAA,QACJ;AAEA,cAAM,iBACH,MAAM,QAAQ,WAAW,QAAQ,KAAK,WAAW,SAAS,SACvD,WAAW,WACX;AAAA,UACE,mBAAmB,WAAW,aAAa,MAAM;AAAA,YAC/C,WAAW;AAAA,UACb,CAAC;AAAA,QACH,MAAM,CAAC;AACb,cAAM,gBAAuC,CAAC;AAC9C,mBAAW,WAAW,eAAe;AACnC,gBAAM,EAAE,0BAA0B,uBAAuB,IACvD,kBAAkB,OAAO;AAC3B,qBAAW,aAAa,YAAY;AAClC,kBAAM,QAAQ,QAAQ,SAAS,UAAU,EAAE,GAAG,QAAQ,KAAK;AAC3D,gBAAI,CAAC,MAAO;AACZ,kBAAM,UAAU,OAAO,KAAK;AAC5B,gBACE,OAAO,MAAM,OAAO,KACpB,CAAC,OAAO,SAAS,OAAO,KACxB,UAAU,GACV;AACA,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,kBAAM,eACJ,OAAO,UAAU,iBAAiB,YAClC,UAAU,aAAa,KAAK,EAAE,SAC1B,UAAU,aAAa,KAAK,EAAE,YAAY,IAC1C;AACN,gBAAI,CAAC,cAAc;AACjB,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA,CAAC;AAAA,cACH;AAAA,YACF;AACA,0BAAc,KAAK;AAAA,cACjB,gBAAgB,QAAQ;AAAA,cACxB,aAAa,UAAU;AAAA,cACvB;AAAA,cACA,QAAQ;AAAA,cACR,aAAa,UAAU;AAAA,cACvB,WAAW,4BAA4B;AAAA,cACvC,cAAc,0BAA0B;AAAA,YAC1C,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,eAGF,EAAE,WAAW,MAAM,YAAY,CAAC,EAAE;AACtC,YAAI;AACF,gBAAM,EAAE,QAAQ,QAAQ,IAAI,MAAM;AAAA,YAChC;AAAA,YACA;AAAA,UACF;AACA,gBAAM,YAAY,SAAS;AAC3B,cAAI,CAAC,WAAW;AACd,kBAAM;AAAA,cACJ;AAAA,gBACE;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,uBAAa,YAAY;AAEzB,qBAAW,cAAc,kBAAkB;AACzC,kBAAM,WAAW,oCAAoC;AAAA,cACnD;AAAA,cACA,UAAU,WAAW;AAAA,cACrB,cAAc,WAAW;AAAA,cACzB,WAAW,WAAW;AAAA,cACtB,UAAU,WAAW;AAAA,YACvB,CAAC;AAAA,UACH;AAEA,gBAAM,eAAuC,CAAC;AAC9C,qBAAW,WAAW,eAAe;AACnC,kBAAM,EAAE,0BAA0B,uBAAuB,IACvD,kBAAkB,OAAO;AAC3B,kBAAM,iBAA0C;AAAA,cAC9C;AAAA,cACA,MACE,QAAQ,OAAO,KAAK,KACpB,OAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,KAAK,KAC9C;AAAA,cACF,KAAK,QAAQ,KAAK,KAAK,KAAK;AAAA,cAC5B,WAAW,QAAQ,QAAQ,SAAS;AAAA,cACpC,UAAU;AAAA,cACV,cAAc,OAAO,KAAK,QAAQ,YAAY,EAAE,SAC5C,QAAQ,eACR;AAAA,cACJ,WAAW,4BAA4B;AAAA,cACvC,SAAS,0BAA0B;AAAA,YACrC;AACA,kBAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,WAGrC,oBAAoB,cAAc;AACrC,kBAAM,YAAY,eAAe,aAAa,eAAe;AAC7D,gBAAI,CAAC,WAAW;AACd,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,yBAAa,QAAQ,EAAE,IAAI;AAC3B,yBAAa,WAAW,KAAK,SAAS;AAAA,UACxC;AAEA,qBAAW,SAAS,eAAe;AACjC,kBAAM,YAAY,aAAa,MAAM,cAAc;AACnD,gBAAI,CAAC,UAAW;AAChB,kBAAM,eAAwC;AAAA,cAC5C;AAAA,cACA;AAAA,cACA,cAAc,MAAM;AAAA,cACpB,aAAa,MAAM;AAAA,YACrB;AACA,gBAAI,MAAM,WAAW;AACnB,2BAAa,YAAY,MAAM;AAAA,YACjC,WACE,OAAO,MAAM,iBAAiB,YAC9B,OAAO,SAAS,MAAM,YAAY,GAClC;AACA,2BAAa,UAAU,MAAM;AAAA,YAC/B;AACA,gBAAI,MAAM,gBAAgB,iBAAiB;AACzC,2BAAa,iBAAiB,MAAM;AAAA,YACtC,OAAO;AACL,2BAAa,eAAe,MAAM;AAAA,YACpC;AACA,kBAAM,WAAW,kBAAkB,YAAY;AAAA,UACjD;AAEA,cAAI,gBAAgB,cAAc,QAAQ;AACxC,kBAAM,WAAW,MAAM;AAAA,cAIrB;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,gBAC9C,MAAM,KAAK,UAAU;AAAA,kBACnB,UAAU,EAAE,QAAQ;AAAA,kBACpB;AAAA,kBACA,cAAc;AAAA,kBACd,YAAY;AAAA,gBACd,CAAC;AAAA,cACH;AAAA,cACA,EAAE,UAAU,KAAK;AAAA,YACnB;AACA,gBAAI,CAAC,SAAS,IAAI;AAChB,sBAAQ;AAAA,gBACN;AAAA,gBACA,SAAS,QAAQ;AAAA,cACnB;AAAA,YACF;AAAA,UACF;AAEA,cAAI,YAAY;AACd,gBAAI;AACF,6BAAe,WAAW,wBAAwB;AAAA,YACpD,QAAQ;AAAA,YAAe;AACvB,gBAAI;AACF,oBAAM;AAAA,gBACJ,4BAA4B,WAAW,UAAU,YAAY,WAAW,QAAQ;AAAA,gBAChF;AAAA,kBACE,QAAQ;AAAA,kBACR,MAAM,KAAK,UAAU;AAAA,oBACnB,iBAAiB;AAAA,oBACjB,mBAAmB;AAAA,kBACrB,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF,QAAQ;AACN;AAAA,gBACE;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA;AAAA,YACE,EAAE,mCAAmC,kBAAkB;AAAA,YACvD;AAAA,UACF;AACA,cAAI,YAAY;AACd,mBAAO;AAAA,cACL,gCAAgC,mBAAmB,WAAW,UAAU,CAAC;AAAA,YAC3E;AAAA,UACF,OAAO;AACL,mBAAO,KAAK,2BAA2B;AAAA,UACzC;AAAA,QACF,SAAS,KAAK;AACZ,gBAAM;AAAA,YACJ,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA,EACF,GACF,GACF;AAEJ;AAEA,eAAe,qBACb,WACA,YACe;AACf,MAAI,CAAC,aAAa,WAAW,WAAW,EAAG;AAC3C,MAAI,WAAW,QAAQ;AACrB,UAAM,iBAAiB,WAAW;AAAA,MAAI,CAAC,cACrC,QAAQ,4BAA4B,mBAAmB,SAAS,CAAC,IAAI;AAAA,QACnE,QAAQ;AAAA,MACV,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,IACrB;AACA,UAAM,QAAQ,WAAW,cAAc;AAAA,EACzC;AACA,MAAI,WAAW;AACb,UAAM,QAAQ,4BAA4B,mBAAmB,SAAS,CAAC,IAAI;AAAA,MACzE,QAAQ;AAAA,IACV,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,EACrB;AACF;AAsBA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,IAAI,KAAK;AACf,QAAM,kBAAkB,2BAA2B,OAAO,UAAU;AACpE,QAAM,eAAe,uBAAuB,OAAO,MAAM;AAEzD,SACE,qBAAC,SAAI,WAAU,mCACb;AAAA,wBAAC,QAAG,WAAU,yBACX,YAAE,oCAAoC,qBAAqB,GAC9D;AAAA,IACA,qBAAC,SAAI,WAAU,6BACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,0CAA0C,OAAO,GACtD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,iBAAiB,SAAS;AAAA,YACjC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,2CAA2C,QAAQ,GACxD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,iBAAiB,UAAU;AAAA,YAClC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,0CAA0C,OAAO,GACtD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,iBAAiB,SAAS;AAAA,YACjC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,yCAAyC,WAAW,GACzD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,iBAAiB,QAAQ;AAAA,YAChC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,sCAAsC,QAAQ,GACnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,cAAc,SAAS;AAAA,YAC9B,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,UAAU;AAAA,gBACjB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,qCAAqC,aAAa,GACvD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,cAAc,QAAQ;AAAA,YAC7B,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,UAAU;AAAA,gBACjB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,IAAI,KAAK;AACf,QAAM,QAAQ;AACd,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,CAAC;AACtD,QAAM,iBAAiB,MAAM;AAAA,IAC3B,MACE,OAAO,YACF,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,SAAS,KAAK,OAC1D;AAAA,IACN,CAAC,UAAU,OAAO,SAAS;AAAA,EAC7B;AACA,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO,UAAW;AACtB,QAAI,CAAC,SAAS,OAAQ;AACtB,UAAM,WAAW,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS;AACvD,QAAI,CAAC,SAAU;AACf,aAAS,aAAa,SAAS,EAAE;AAAA,EACnC,GAAG,CAAC,UAAU,UAAU,OAAO,SAAS,CAAC;AACzC,QAAM,aAAa,MAAM,QAAQ,MAAM;AACrC,UAAM,MAAM,MAAM;AAAA,MAChB,CAAC,KAAK,SAAS;AACb,YAAI,IAAI,IAAI,CAAC;AACb,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AACA,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,OAAO,MAAM;AACrD,YAAM,OAAO,oBAAoB,OAAO;AACxC,UAAI,CAAC,KAAM;AACX,YAAM,OACJ,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,SAC1C,QAAQ,KAAK,IACb;AACN,UAAI,KAAM,KAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI;AAAA,IAC3C,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,KAAK,CAAC;AAClB,QAAM,iBAAiB,MAAM;AAAA,IAC3B,MAAM,OAAO,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG;AAAA,IACzC,CAAC,MAAM;AAAA,EACT;AACA,QAAM,wBAAwB,MAAM,OAAsB,IAAI;AAC9D,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,kBAAkB,mBAAmB,sBAAsB;AAC9D;AACF,0BAAsB,UAAU;AAChC,UAAMA,kBAAiB,MAAM,WAAW;AACxC,QAAIA,mBAAkB,WAAWA,eAAc,GAAG,OAAQ;AAC1D,UAAM,gBAAgB,MAAM;AAAA,MAC1B,CAAC,UAAU,WAAW,IAAI,KAAK,CAAC,GAAG,SAAS;AAAA,IAC9C;AACA,QAAI,iBAAiB,KAAK,kBAAkB,aAAa;AACvD,qBAAe,aAAa;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,aAAa,gBAAgB,gBAAgB,YAAY,KAAK,CAAC;AACnE,QAAM,sBAAsB,iBACxB,mBAAmB,cAAc,IACjC;AACJ,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,eAAe,MAAM,OAAQ,gBAAe,CAAC;AAAA,EACnD,GAAG,CAAC,aAAa,MAAM,MAAM,CAAC;AAE9B,QAAM,iBAAiB,MAAM,WAAW,KAAK,MAAM,CAAC;AAEpD,QAAM,aAAa,MAAM;AAAA,IACvB,MAAO,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AAAA,IAC/D,CAAC,OAAO,UAAU;AAAA,EACpB;AAEA,QAAM,yBAAyB,MAAM;AAAA,IACnC,CAAC,cAAkC;AACjC,eAAS,cAAc,SAAS;AAChC,YAAM,aAAa,UAAU;AAAA,QAC3B,CAAC,SAAS,KAAK,OAAO,OAAO;AAAA,MAC/B;AACA,UAAI,CAAC,YAAY;AACf,cAAM,aAAa,UAAU,CAAC,GAAG,MAAM;AACvC,iBAAS,kBAAkB,UAAU;AACrC,YAAI,cAAc,UAAU,CAAC,GAAG;AAC9B;AAAA,YACE;AAAA,YACA,wBAAwB,YAAY;AAAA,cAClC,MAAM,0BAA0B,UAAU,CAAC,EAAE,QAAQ;AAAA,YACvD,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,mBAAS,mBAAmB,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,UAAU,OAAO,cAAc;AAAA,EAClC;AAEA,QAAM,2BAA2B,MAAM;AAAA,IACrC,CAAC,iBAAgC;AAC/B,eAAS,kBAAkB,YAAY;AACvC,UAAI,CAAC,cAAc;AACjB,iBAAS,mBAAmB,EAAE;AAC9B;AAAA,MACF;AACA,YAAM,SAAS,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,YAAY;AACjE,UAAI,QAAQ;AACV;AAAA,UACE;AAAA,UACA,wBAAwB,OAAO,IAAI;AAAA,YACjC,MAAM,0BAA0B,OAAO,QAAQ;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,EACvB;AAEA,QAAM,iBAAiB,MAAM,YAAY,MAAM;AAC7C,UAAM,oBAAoB,MAAM,QAAQ,OAAO,OAAO,IAClD,OAAO,UACP,CAAC;AACL,QAAI,CAAC,OAAO,eAAe,CAAC,kBAAkB,QAAQ;AACpD,UAAI,CAAC,OAAO,YAAY,CAAC,OAAO,SAAS,QAAQ;AAC/C,iBAAS,YAAY;AAAA,UACnB,mBAAmB,OAAO,aAAa,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,QAClE,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,UAAM,SAAS,yBAAyB,iBAAiB;AACzD,UAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AACrE,UAAM,gBAAgB,IAAI;AAAA,MACxB,SAAS,IAAI,CAAC,YAAY;AAAA,QACxB,qBAAqB,QAAQ,YAAY;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,aAAa,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS;AAC7D,QAAI,UAAU,SAAS,WAAW,OAAO;AACzC,UAAM,eAA+B,OAAO,IAAI,CAAC,OAAO,UAAU;AAChE,YAAM,MAAM,qBAAqB,KAAK;AACtC,YAAM,gBAAgB,cAAc,IAAI,GAAG;AAC3C,UAAI,eAAe;AACjB,YAAI,cAAc,UAAW,cAAa;AAC1C,YAAI,CAAC,qBAAqB,cAAc,cAAc,KAAK,GAAG;AAC5D,oBAAU;AACV,iBAAO,EAAE,GAAG,eAAe,cAAc,MAAM;AAAA,QACjD;AACA,YAAI,SAAS,KAAK,MAAM,eAAe;AACrC,oBAAU;AAAA,QACZ;AACA,eAAO;AAAA,MACT;AACA,gBAAU;AACV,aAAO,mBAAmB,OAAO,aAAa,MAAM;AAAA,QAClD,OAAO,OAAO,OAAO,KAAK,EAAE,KAAK,KAAK;AAAA,QACtC,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,aAAa,OAAQ;AAC1B,QAAI,CAAC,YAAY;AACf,gBAAU;AACV,mBAAa,CAAC,IAAI,EAAE,GAAG,aAAa,CAAC,GAAG,WAAW,KAAK;AAAA,IAC1D;AACA,QAAI,SAAS;AACX,eAAS,YAAY,YAAY;AAAA,IACnC;AAAA,EACF,GAAG;AAAA,IACD,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM;AACpB,mBAAe;AAAA,EACjB,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAO,UAAW;AACvB,UAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AACrE,QAAI,CAAC,SAAS,OAAQ;AACtB,QAAI,UAAU;AACd,UAAM,eAAe,SAAS,IAAI,CAAC,YAAY;AAC7C,UAAI,QAAQ,UAAW,QAAO;AAC9B,gBAAU;AACV,aAAO,EAAE,GAAG,SAAS,WAAW,OAAO,UAAU;AAAA,IACnD,CAAC;AACD,QAAI,SAAS;AACX,eAAS,YAAY,YAAY;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,CAAC;AAChD,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,WAAmB,OAA2B,UAAmB;AAChE,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,GAAG;AAAA,QACnE,CAAC,YAAY;AACX,cAAI,QAAQ,OAAO,UAAW,QAAO;AACrC,iBAAO,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,MAAM;AAAA,QACtC;AAAA,MACF;AACA,eAAS,YAAY,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,WAAmB,aAAqB,WAAmB;AAC1D,UAAI,OAAO,KAAK,EAAE,WAAW,GAAG,EAAG;AACnC,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,GAAG;AAAA,QACnE,CAAC,YAAY;AACX,cAAI,QAAQ,OAAO,UAAW,QAAO;AACrC,gBAAM,aAAa,EAAE,GAAI,QAAQ,UAAU,CAAC,EAAG;AAC/C,cAAI,WAAW,IAAI;AACjB,mBAAO,WAAW,WAAW;AAAA,UAC/B,OAAO;AACL,uBAAW,WAAW,IAAI,EAAE,OAAO;AAAA,UACrC;AACA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA,eAAS,YAAY,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,qBAAqB,MAAM;AAAA,IAC/B,CAAC,cAAsB;AACrB,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,GAAG;AAAA,QACnE,CAAC,aAAa;AAAA,UACZ,GAAG;AAAA,UACH,WAAW,QAAQ,OAAO;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,YAAY,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,0BAA0B,MAAM;AAAA,IACpC,CAAC,UAAkB,UAAkB;AACnC,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,QACjE,CAAC,WAAW;AACV,cAAI,OAAO,OAAO,SAAU,QAAO;AACnC,iBAAO,EAAE,GAAG,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,SAAS,QAAQ;AAAA,EAC3B;AAEA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,UAAkB,WAAqB;AACtC,YAAM,aAAa,OAChB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,UAAU,MAAM,MAAM;AACjC,YAAM,SAAS,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC;AAC7C,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,QACjE,CAAC,WAAW;AACV,cAAI,OAAO,OAAO,SAAU,QAAO;AACnC,gBAAM,kBAAkB,IAAI;AAAA,YAC1B,OAAO,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,OAAO,KAAK,CAAC;AAAA,UACnD;AACA,gBAAM,aAAa,OAAO;AAAA,YACxB,CAAC,UACC,gBAAgB,IAAI,KAAK,KAAK,EAAE,IAAI,cAAc,GAAG,MAAM;AAAA,UAC/D;AACA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,SAAS,QAAQ;AAAA,EAC3B;AAEA,QAAM,YAAY,MAAM,YAAY,MAAM;AACxC,UAAM,OAAO;AAAA,MACX,GAAI,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAAA,MACtD,EAAE,IAAI,cAAc,GAAG,OAAO,IAAI,QAAQ,CAAC,EAAE;AAAA,IAC/C;AACA,aAAS,WAAW,IAAI;AAAA,EAC1B,GAAG,CAAC,OAAO,SAAS,QAAQ,CAAC;AAE7B,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,aAAqB;AACpB,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,QACjE,CAAC,WAAW,OAAO,OAAO;AAAA,MAC5B;AACA,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,SAAS,QAAQ;AAAA,EAC3B;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAI,WAAU,gDACZ,gBAAM,IAAI,CAAC,MAAM,UAChB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,QACZ,oBACA;AAAA,QACN;AAAA,QACA,SAAS,MAAM,eAAe,KAAK;AAAA,QAElC;AAAA,mBAAS,aACR,EAAE,yCAAyC,cAAc;AAAA,UAC1D,SAAS,cACR,EAAE,0CAA0C,UAAU;AAAA,UACvD,SAAS,SACR,EAAE,8BAA8B,kBAAkB;AAAA,UACnD,SAAS,cACR,EAAE,0CAA0C,UAAU;AAAA,WACtD,WAAW,IAAI,GAAG,UAAU,KAAK,IACjC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd,IACE;AAAA,UACH,gBAAgB,QACf,oBAAC,UAAK,WAAU,kEAAiE,IAC/E;AAAA;AAAA;AAAA,MA5BC;AAAA,IA6BP,CACD,GACH;AAAA,IAEC,mBAAmB,YAClB,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAM,WAAU,2BACd;AAAA,YAAE,+BAA+B,OAAO;AAAA,UACzC,oBAAC,UAAK,WAAU,gBAAe,eAAC;AAAA,WAClC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,UAAU,SAAS,SAAS,MAAM,OAAO,KAAK;AAAA,YACzD,aAAa;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACC,OAAO,QACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,OAAM,IAChD;AAAA,SACN;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,SACE,YAAE,qCAAqC,aAAa,GACvD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,SAAS,eAAe,CAAC,OAAO,WAAW;AAAA,cAC1D,WAAU;AAAA,cAET;AAAA,uBAAO,cACN,oBAAC,aAAU,WAAU,WAAU,IAE/B,oBAAC,YAAS,WAAU,WAAU;AAAA,gBAE/B,OAAO,cACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF,IACA;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA;AAAA,UACN;AAAA,WACF;AAAA,QACC,OAAO,cACN;AAAA,UAAC;AAAA;AAAA,YACC,mBAAgB;AAAA,YAChB,WAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,OAAO;AAAA,gBACd,QAAQ;AAAA,gBACR,UAAU,CAAC,QAAQ,SAAS,eAAe,OAAO,EAAE;AAAA,gBACpD,gBAAgB,EAAE,eAAe,CAAC,EAAE;AAAA;AAAA,YACtC;AAAA;AAAA,QACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,UACT,SAAS,eAAe,MAAM,OAAO,KAAK;AAAA,YAE5C,aAAa;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,EAAE,QAAQ;AAAA,UACpB,eAAe,OAAO;AAAA,UACtB,OAAO;AAAA,UACP,gBAAgB,OAAO,kBAAkB;AAAA,UACzC,eAAe;AAAA,UACf,iBAAiB;AAAA;AAAA,MACnB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF,IACE;AAAA,IAEH,mBAAmB,aAClB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,IACE;AAAA,IAEH,mBAAmB,QAClB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAQ;AAAA;AAAA,IACV,IACE;AAAA,IAEH,mBAAmB,aAClB,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,WAAM,WAAU,+CACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,OAAO;AAAA,YAChB,UAAU,CAAC,UACT,SAAS,eAAe,MAAM,OAAO,OAAO;AAAA;AAAA,QAEhD;AAAA,QACC;AAAA,UACC;AAAA,UACA;AAAA,QACF;AAAA,SACF;AAAA,MAEC,OAAO,cACN,qBAAC,SAAI,WAAU,mCACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,QAAG,WAAU,yBACX;AAAA,YACC;AAAA,YACA;AAAA,UACF,GACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cAET;AAAA,oCAAC,QAAK,WAAU,gBAAe;AAAA,gBAC9B;AAAA,kBACC;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,WACF;AAAA,SACE,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,UACrD,CAAC,WACC,qBAAC,SAAoB,WAAU,8BAC7B;AAAA,iCAAC,SAAI,WAAU,2BACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,OAAO;AAAA,kBACd,UAAU,CAAC,UACT,wBAAwB,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,kBAEvD,aAAa;AAAA,oBACX;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,WAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS,MAAM,aAAa,OAAO,EAAE;AAAA,kBAErC,8BAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA,YACA,qBAAC,SAAI,WAAU,kBACb;AAAA,kCAAC,SAAM,WAAU,2CACd;AAAA,gBACC;AAAA,gBACA;AAAA,cACF,GACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK;AAAA,kBAC/C,UAAU,CAAC,WACT,gBAAgB,OAAO,IAAI,MAAM;AAAA,kBAEnC,aAAa;AAAA,oBACX;AAAA,oBACA;AAAA,kBACF;AAAA;AAAA,cACF;AAAA,eACF;AAAA,eAvCQ,OAAO,EAwCjB;AAAA,QAEJ;AAAA,QACC,CAAC,OAAO,SAAS,SAChB,oBAAC,OAAE,WAAU,iCACV;AAAA,UACC;AAAA,UACA;AAAA,QACF,GACF,IACE;AAAA,SACN,IACE;AAAA,MAEJ,qBAAC,SAAI,WAAU,qBACb;AAAA,4BAAC,SAAI,WAAU,0BACb,+BAAC,WAAM,WAAU,4DACf;AAAA,8BAAC,WAAM,WAAU,eACf,+BAAC,QACC;AAAA,gCAAC,QAAG,WAAU,uBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,uBACX,YAAE,kCAAkC,eAAe,GACtD;AAAA,YACA,oBAAC,QAAG,WAAU,uBACX,YAAE,+CAA+C,KAAK,GACzD;AAAA,YACA,oBAAC,QAAG,WAAU,uBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACC,WAAW,IAAI,CAAC,SACf,oBAAC,QAAiB,WAAU,uBAC1B,+BAAC,SAAI,WAAU,uBACb;AAAA,mCAAC,SAAI,WAAU,2BACb;AAAA,oCAAC,UACE;AAAA,kBACC;AAAA,kBACA;AAAA,gBACF,EAAE,QAAQ,aAAa,KAAK,KAAK,GACnC;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OACE,KAAK,gBAAgB,kBACjB;AAAA,sBACE;AAAA,sBACA;AAAA,oBACF,IACA;AAAA,sBACE;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEN,WAAU;AAAA,oBAET,eAAK,gBAAgB,kBAAkB,WAAM;AAAA;AAAA,gBAChD;AAAA,iBACF;AAAA,cACA,oBAAC,UAAK,WAAU,iCACb,eAAK,cAAc,YAAY,KAC9B;AAAA,gBACE;AAAA,gBACA;AAAA,cACF,GACJ;AAAA,eACF,KAjCO,KAAK,EAkCd,CACD;AAAA,YACD,oBAAC,QAAG,WAAU,yBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,aACF,GACF;AAAA,UACA,oBAAC,WACG,iBAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAChD,OAAO,WACP;AAAA,YACE,mBAAmB,OAAO,aAAa,MAAM;AAAA,cAC3C,WAAW;AAAA,YACb,CAAC;AAAA,UACH,GACF,IAAI,CAAC,YACL,qBAAC,QAAoB,WAAU,YAC7B;AAAA,iCAAC,QAAG,WAAU,aACZ;AAAA,mCAAC,WAAM,WAAU,0CACf;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAS,QAAQ;AAAA,oBACjB,UAAU,MAAM,mBAAmB,QAAQ,EAAE;AAAA;AAAA,gBAC/C;AAAA,gBACC,QAAQ,YACL;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF,IACA;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,iBACN;AAAA,cACC,OAAO,eAAe,QAAQ,eAC7B,oBAAC,OAAE,WAAU,iCACV,iBAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,KAAK,GACjD,IACE;AAAA,eACN;AAAA,YACA,oBAAC,QAAG,WAAU,aACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,QAAQ;AAAA,gBACf,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,aACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,QAAQ;AAAA,gBACf,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,aACZ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,QAAQ,aAAa;AAAA,gBAC5B,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO,SAAS;AAAA,gBACxB;AAAA,gBAEF,UAAU,CAAC,SAAS;AAAA,gBAEpB;AAAA,sCAAC,YAAO,OAAM,IACX,gCACG;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF,EAAE,QAAQ,aAAa,mBAAmB,IAC1C;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF,GACN;AAAA,kBACC,SAAS,IAAI,CAAC,SACb,oBAAC,YAAqB,OAAO,KAAK,IAC/B,6BAAmB,IAAI,KADb,KAAK,EAElB,CACD;AAAA;AAAA;AAAA,YACH,GACF;AAAA,YACC,WAAW,IAAI,CAAC,SACf,oBAAC,QAAiB,WAAU,aAC1B,+BAAC,SAAI,WAAU,2BACb;AAAA,kCAAC,UAAK,WAAU,iCACb,eAAK,gBAAgB,UACxB;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAO,QAAQ,SAAS,KAAK,EAAE,GAAG,UAAU;AAAA,kBAC5C,UAAU,CAAC,UACT;AAAA,oBACE,QAAQ;AAAA,oBACR,KAAK;AAAA,oBACL,MAAM,OAAO;AAAA,kBACf;AAAA,kBAEF,aAAY;AAAA,kBACZ,KAAK;AAAA;AAAA,cACP;AAAA,eACF,KAnBO,KAAK,EAoBd,CACD;AAAA,YACD,oBAAC,QAAG,WAAU,yBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,QAAQ;AAAA,gBACjB,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,UAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,QAAQ;AAAA,gBACjB,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,UAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,QAAQ;AAAA,gBACjB,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,UAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT,GACF;AAAA,eA9JO,QAAQ,EA+JjB,CACD,GACH;AAAA,WACF,GACF;AAAA,QACC,CAAC,WAAW,SACX,qBAAC,SAAI,WAAU,4EACb;AAAA,8BAAC,eAAY,WAAU,WAAU;AAAA,UAChC;AAAA,YACC;AAAA,YACA;AAAA,UACF;AAAA,WACF,IACE;AAAA,SACN;AAAA,OACF,IACE;AAAA,IAEJ,qBAAC,SAAI,WAAU,sCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAM,eAAe,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAAA,UAC1D,UAAU,gBAAgB;AAAA,UAC1B,WAAU;AAAA,UAEV;AAAA,gCAAC,eAAY,WAAU,WAAU;AAAA,YAChC,EAAE,0CAA0C,UAAU;AAAA;AAAA;AAAA,MACzD;AAAA,MACC,mBAAmB,aAClB;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MACP,eAAe,KAAK,IAAI,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC;AAAA,UAE5D,WAAU;AAAA,UAET;AAAA,cAAE,0CAA0C,UAAU;AAAA,YACvD,oBAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AAAA,MACpC,IAEA,oBAAC,UAAK;AAAA,OAEV;AAAA,KACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,IAAI,KAAK;AACf,QAAM,cAAc,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACxE,QAAM,cAAc,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AACtE,QAAM,uBAAuB,MAAM,OAAO,YAAY,KAAK,EAAE,WAAW,CAAC;AAEzE,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,qBAAqB,QAAS;AACnC,UAAM,kBAAkB,YAAY,KAAK;AACzC,QAAI,CAAC,iBAAiB;AACpB,UAAI,aAAa;AACf,iBAAS,UAAU,EAAE;AAAA,MACvB;AACA;AAAA,IACF;AACA,UAAM,aAAa,QAAQ,eAAe;AAC1C,QAAI,eAAe,aAAa;AAC9B,eAAS,UAAU,UAAU;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,QAAQ,CAAC;AAEvC,QAAM,0BAA0B,MAAM;AAAA,IACpC,CAAC,UAA+C;AAC9C,YAAM,YAAY,MAAM,OAAO;AAC/B,2BAAqB,UAAU,UAAU,KAAK,EAAE,WAAW;AAC3D,eAAS,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,uBAAuB,MAAM,YAAY,MAAM;AACnD,UAAM,OAAO,QAAQ,WAAW;AAChC,yBAAqB,UAAU;AAC/B,aAAS,UAAU,IAAI;AAAA,EACzB,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,SAAO,YAAE,kCAAkC,UAAU,GAAE;AAAA,MACxD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,UAC/D,UAAU,CAAC,UAAU,SAAS,YAAY,MAAM,OAAO,KAAK;AAAA,UAC5D,aAAa;AAAA,YACX;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC,OAAO,WACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,UAAS,IACnD;AAAA,OACN;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,SAAO,YAAE,gCAAgC,QAAQ,GAAE;AAAA,MACpD,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV,aAAa;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA,YACA,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YAER,YAAE,kDAAkD,UAAU;AAAA;AAAA,QACjE;AAAA,SACF;AAAA,MACA,oBAAC,OAAE,WAAU,iCACV;AAAA,QACC;AAAA,QACA;AAAA,MACF,GACF;AAAA,MACC,OAAO,SACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,QAAO,IACjD;AAAA,OACN;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,2CACb;AAAA,4BAAC,SACE,YAAE,0CAA0C,WAAW,GAC1D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM;AACb,kBAAI,OAAO,WAAW,aAAa;AACjC,uBAAO;AAAA,kBACL;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL;AAAA,cACA;AAAA,YACF;AAAA,YACA,WAAU;AAAA,YAEV;AAAA,kCAAC,YAAS,WAAU,WAAU;AAAA,cAC9B,oBAAC,UAAK,WAAU,WACb;AAAA,gBACC;AAAA,gBACA;AAAA,cACF,GACF;AAAA;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,OAAO,aAAa;AAAA,UAC3B,UAAU,CAAC,UACT,SAAS,aAAa,MAAM,OAAO,SAAS,IAAI;AAAA,UAElD,UAAU,CAAC,SAAS;AAAA,UAEpB;AAAA,gCAAC,YAAO,OAAM,IACX,mBAAS,SACN;AAAA,cACE;AAAA,cACA;AAAA,YACF,IACA;AAAA,cACE;AAAA,cACA;AAAA,YACF,GACN;AAAA,YACC,SAAS,IAAI,CAAC,SACb,oBAAC,YAAqB,OAAO,KAAK,IAC/B,6BAAmB,IAAI,KADb,KAAK,EAElB,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MACA,oBAAC,OAAE,WAAU,iCACV,mBAAS,SACN;AAAA,QACE;AAAA,QACA;AAAA,MACF,IACA;AAAA,QACE;AAAA,QACA;AAAA,MACF,GACN;AAAA,MACC,OAAO,YACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,WAAU,IACpD;AAAA,OACN;AAAA,KACF;AAEJ;",
4
+ "sourcesContent": ["\"use client\";\n\nimport * as React from \"react\";\nimport dynamic from \"next/dynamic\";\nimport { useRouter, useSearchParams } from \"next/navigation\";\nimport type { ZodType } from \"zod\";\nimport { Page, PageBody } from \"@open-mercato/ui/backend/Page\";\nimport {\n CrudForm,\n type CrudFormGroup,\n type CrudFormGroupComponentProps,\n} from \"@open-mercato/ui/backend/CrudForm\";\nimport { createCrud } from \"@open-mercato/ui/backend/utils/crud\";\nimport { createCrudFormError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { flash } from \"@open-mercato/ui/backend/FlashMessages\";\nimport { TagsInput } from \"@open-mercato/ui/backend/inputs/TagsInput\";\nimport { Button } from \"@open-mercato/ui/primitives/button\";\nimport { Input } from \"@open-mercato/ui/primitives/input\";\nimport { Label } from \"@open-mercato/ui/primitives/label\";\nimport { cn } from \"@open-mercato/shared/lib/utils\";\nimport {\n Plus,\n Trash2,\n FileText,\n AlignLeft,\n ChevronLeft,\n ChevronRight,\n AlertCircle,\n Settings,\n} from \"lucide-react\";\nimport {\n apiCall,\n readApiResultOrThrow,\n} from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { E } from \"#generated/entities.ids.generated\";\nimport {\n ProductMediaManager,\n type ProductMediaItem,\n} from \"@open-mercato/core/modules/catalog/components/products/ProductMediaManager\";\nimport { ProductCategorizeSection } from \"@open-mercato/core/modules/catalog/components/products/ProductCategorizeSection\";\nimport {\n PRODUCT_FORM_STEPS,\n type PriceKindSummary,\n type PriceKindApiPayload,\n type TaxRateSummary,\n type ProductOptionInput,\n type VariantPriceValue,\n type VariantDraft,\n type ProductFormValues,\n type ProductUnitConversionDraft,\n type ProductUnitPriceReferenceUnit,\n type ProductUnitRoundingMode,\n productFormSchema,\n createInitialProductFormValues,\n createVariantDraft,\n buildOptionValuesKey,\n haveSameOptionValues,\n normalizePriceKindSummary,\n formatTaxRateLabel,\n slugify,\n createLocalId,\n buildOptionSchemaDefinition,\n buildVariantCombinations,\n normalizeProductDimensions,\n normalizeProductWeight,\n sanitizeProductDimensions,\n sanitizeProductWeight,\n updateDimensionValue,\n updateWeightValue,\n} from \"@open-mercato/core/modules/catalog/components/products/productForm\";\nimport {\n buildAttachmentImageUrl,\n slugifyAttachmentFileName,\n} from \"@open-mercato/core/modules/attachments/lib/imageUrls\";\nimport { ProductUomSection } from \"@open-mercato/core/modules/catalog/components/products/ProductUomSection\";\nimport { canonicalizeUnitCode } from \"@open-mercato/core/modules/catalog/lib/unitCodes\";\nimport {\n UNIT_PRICE_REFERENCE_UNITS,\n toTrimmedOrNull,\n parseNumericInput,\n toPositiveNumberOrNull,\n toIntegerInRangeOrDefault,\n normalizeProductConversionInputs,\n type ProductUnitConversionInput,\n} from \"@open-mercato/core/modules/catalog/components/products/productFormUtils\";\n\nconst productFormTypedSchema =\n productFormSchema as unknown as ZodType<ProductFormValues>;\n\ntype VariantPriceRequest = {\n variantDraftId: string;\n priceKindId: string;\n currencyCode: string;\n amount: number;\n displayMode: PriceKindSummary[\"displayMode\"];\n taxRateId: string | null;\n taxRateValue: number | null;\n};\n\ntype UiMarkdownEditorProps = {\n value?: string;\n height?: number;\n onChange?: (value?: string) => void;\n previewOptions?: { remarkPlugins?: unknown[] };\n};\n\nconst MarkdownEditor = dynamic(() => import(\"@uiw/react-md-editor\"), {\n ssr: false,\n loading: () => (\n <div className=\"flex h-48 items-center justify-center text-sm text-muted-foreground\">\n Loading editor\u2026\n </div>\n ),\n}) as unknown as React.ComponentType<UiMarkdownEditorProps>;\n\ntype ProductFormStep = (typeof PRODUCT_FORM_STEPS)[number];\n\nconst TRUE_BOOLEAN_VALUES = new Set([\"true\", \"1\", \"yes\", \"y\", \"t\"]);\n\nconst matchField = (fieldId: string) => (value: string) =>\n value === fieldId ||\n value.startsWith(`${fieldId}.`) ||\n value.startsWith(`${fieldId}[`);\nconst matchPrefix = (prefix: string) => (value: string) =>\n value.startsWith(prefix);\n\nconst STEP_FIELD_MATCHERS: Record<\n ProductFormStep,\n ((value: string) => boolean)[]\n> = {\n general: [\n matchField(\"title\"),\n matchField(\"description\"),\n matchField(\"mediaItems\"),\n matchField(\"mediaDraftId\"),\n matchPrefix(\"defaultMedia\"),\n matchPrefix(\"dimensions\"),\n matchPrefix(\"weight\"),\n ],\n organize: [\n matchField(\"categoryIds\"),\n matchField(\"channelIds\"),\n matchField(\"tags\"),\n ],\n uom: [\n matchField(\"defaultUnit\"),\n matchField(\"defaultSalesUnit\"),\n matchField(\"defaultSalesUnitQuantity\"),\n matchField(\"uomRoundingScale\"),\n matchField(\"uomRoundingMode\"),\n matchField(\"unitPriceEnabled\"),\n matchField(\"unitPriceReferenceUnit\"),\n matchField(\"unitPriceBaseQuantity\"),\n matchPrefix(\"unitConversions\"),\n ],\n variants: [\n matchField(\"hasVariants\"),\n matchPrefix(\"options\"),\n matchPrefix(\"variants\"),\n ],\n};\n\nfunction resolveStepForField(fieldId: string): ProductFormStep | null {\n const normalized = fieldId?.trim();\n if (!normalized) return null;\n for (const step of PRODUCT_FORM_STEPS) {\n const matchers = STEP_FIELD_MATCHERS[step];\n if (matchers.some((matcher) => matcher(normalized))) return step;\n }\n return null;\n}\n\nfunction resolveBooleanFlag(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return false;\n if (TRUE_BOOLEAN_VALUES.has(normalized)) return true;\n if ([\"false\", \"0\", \"no\", \"n\", \"f\"].includes(normalized)) return false;\n }\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n\n\ninterface InboxProductDraft {\n actionId: string;\n proposalId: string;\n payload: Record<string, unknown>;\n}\n\nfunction readInboxProductDraft(): InboxProductDraft | null {\n try {\n const raw = sessionStorage.getItem(\"inbox_ops.productDraft\");\n if (!raw) return null;\n const parsed = JSON.parse(raw) as InboxProductDraft;\n if (!parsed.actionId || !parsed.proposalId || !parsed.payload) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport default function CreateCatalogProductPage() {\n const t = useT();\n const router = useRouter();\n const searchParams = useSearchParams();\n const fromInboxAction = searchParams.get(\"fromInboxAction\");\n\n const inboxDraft = React.useMemo<InboxProductDraft | null>(() => {\n if (!fromInboxAction) return null;\n return readInboxProductDraft();\n }, [fromInboxAction]);\n\n const initialValuesRef = React.useRef<ProductFormValues | null>(null);\n if (!initialValuesRef.current) {\n const initial = createInitialProductFormValues();\n if (inboxDraft?.payload) {\n const p = inboxDraft.payload;\n if (typeof p.title === \"string\" && p.title.trim()) initial.title = p.title.trim();\n if (typeof p.description === \"string\" && p.description.trim()) initial.description = p.description.trim();\n }\n initialValuesRef.current = initial;\n }\n const [priceKinds, setPriceKinds] = React.useState<PriceKindSummary[]>([]);\n const [taxRates, setTaxRates] = React.useState<TaxRateSummary[]>([]);\n React.useEffect(() => {\n const loadPriceKinds = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: PriceKindApiPayload[];\n }>(\"/api/catalog/price-kinds?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.priceKinds.errors.load\",\n \"Failed to load price kinds.\",\n ),\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setPriceKinds(\n items\n .map((item) => normalizePriceKindSummary(item))\n .filter((item): item is PriceKindSummary => item !== null),\n );\n } catch (err) {\n console.error(\"catalog.price-kinds.fetch failed\", err);\n setPriceKinds([]);\n }\n };\n loadPriceKinds().catch(() => {});\n }, [t]);\n\n React.useEffect(() => {\n const loadTaxRates = async () => {\n try {\n const payload = await readApiResultOrThrow<{\n items?: Array<Record<string, unknown>>;\n }>(\"/api/sales/tax-rates?pageSize=100\", undefined, {\n errorMessage: t(\n \"catalog.products.create.taxRates.error\",\n \"Failed to load tax rates.\",\n ),\n fallback: { items: [] },\n });\n const items = Array.isArray(payload.items) ? payload.items : [];\n setTaxRates(\n items.map((item) => {\n const rawRate =\n typeof item.rate === \"number\"\n ? item.rate\n : Number(item.rate ?? Number.NaN);\n return {\n id: String(item.id),\n name:\n typeof item.name === \"string\" && item.name.trim().length\n ? item.name\n : t(\n \"catalog.products.create.taxRates.unnamed\",\n \"Untitled tax rate\",\n ),\n code:\n typeof item.code === \"string\" && item.code.trim().length\n ? item.code\n : null,\n rate: Number.isFinite(rawRate) ? rawRate : null,\n isDefault: resolveBooleanFlag(\n typeof item.isDefault !== \"undefined\"\n ? item.isDefault\n : item.is_default,\n ),\n };\n }),\n );\n } catch (err) {\n console.error(\"sales.tax-rates.fetch failed\", err);\n setTaxRates([]);\n }\n };\n loadTaxRates().catch(() => {});\n }, [t]);\n\n const groups = React.useMemo<CrudFormGroup[]>(\n () => [\n {\n id: \"builder\",\n column: 1,\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductBuilder\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n priceKinds={priceKinds}\n taxRates={taxRates}\n />\n ),\n },\n {\n id: \"product-meta\",\n column: 2,\n title: t(\"catalog.products.create.meta.title\", \"Product meta\"),\n description: t(\n \"catalog.products.create.meta.description\",\n \"Manage subtitle and handle for storefronts.\",\n ),\n component: ({\n values,\n setValue,\n errors,\n }: CrudFormGroupComponentProps) => (\n <ProductMetaSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n taxRates={taxRates}\n />\n ),\n },\n ],\n [priceKinds, taxRates, t],\n );\n\n return (\n <Page>\n <PageBody>\n <CrudForm<ProductFormValues>\n title={t(\"catalog.products.create.title\", \"Create product\")}\n backHref=\"/backend/catalog/products\"\n fields={[]}\n groups={groups}\n injectionSpotId=\"crud-form:catalog.product\"\n initialValues={\n initialValuesRef.current ?? createInitialProductFormValues()\n }\n schema={productFormTypedSchema}\n submitLabel={t(\"catalog.products.create.submit\", \"Create\")}\n cancelHref=\"/backend/catalog/products\"\n onSubmit={async (formValues) => {\n const title = formValues.title?.trim();\n if (!title) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n {\n title: t(\n \"catalog.products.create.errors.title\",\n \"Provide a product title.\",\n ),\n },\n );\n }\n const handle = formValues.handle?.trim() || undefined;\n const description = formValues.description?.trim() || undefined;\n const defaultMediaId =\n typeof formValues.defaultMediaId === \"string\" &&\n formValues.defaultMediaId.trim().length\n ? formValues.defaultMediaId\n : null;\n const mediaItems = Array.isArray(formValues.mediaItems)\n ? formValues.mediaItems\n : [];\n const attachmentIds = mediaItems\n .map((item) => (typeof item.id === \"string\" ? item.id : null))\n .filter((value): value is string => !!value);\n const mediaDraftId =\n typeof formValues.mediaDraftId === \"string\"\n ? formValues.mediaDraftId\n : \"\";\n const defaultMediaEntry = defaultMediaId\n ? mediaItems.find((item) => item.id === defaultMediaId)\n : null;\n const defaultMediaUrl = defaultMediaEntry\n ? buildAttachmentImageUrl(defaultMediaEntry.id, {\n slug: slugifyAttachmentFileName(defaultMediaEntry.fileName),\n })\n : null;\n const optionSchemaDefinition = buildOptionSchemaDefinition(\n formValues.options,\n title,\n );\n const dimensions = sanitizeProductDimensions(\n formValues.dimensions ?? null,\n );\n const weight = sanitizeProductWeight(formValues.weight ?? null);\n const resolveTaxRateValue = (taxRateId?: string | null) => {\n if (!taxRateId) return null;\n const match = taxRates.find((rate) => rate.id === taxRateId);\n return typeof match?.rate === \"number\" ? match.rate : null;\n };\n const productLevelTaxRateId = formValues.taxRateId ?? null;\n const productTaxRate = resolveTaxRateValue(productLevelTaxRateId);\n const resolveVariantTax = (variant: VariantDraft) => {\n const resolvedVariantTaxRateId =\n variant.taxRateId ?? productLevelTaxRateId;\n const resolvedVariantTaxRate =\n resolveTaxRateValue(resolvedVariantTaxRateId) ??\n (resolvedVariantTaxRateId ? null : (productTaxRate ?? null));\n return { resolvedVariantTaxRateId, resolvedVariantTaxRate };\n };\n const defaultUnit = canonicalizeUnitCode(formValues.defaultUnit);\n const defaultSalesUnit = canonicalizeUnitCode(\n formValues.defaultSalesUnit,\n );\n const defaultSalesUnitQuantity =\n toPositiveNumberOrNull(formValues.defaultSalesUnitQuantity) ?? 1;\n const uomRoundingScale = toIntegerInRangeOrDefault(\n formValues.uomRoundingScale,\n 0,\n 6,\n 4,\n );\n const uomRoundingMode: ProductUnitRoundingMode =\n formValues.uomRoundingMode === \"down\" ||\n formValues.uomRoundingMode === \"up\"\n ? formValues.uomRoundingMode\n : \"half_up\";\n const unitPriceEnabled = Boolean(formValues.unitPriceEnabled);\n const unitPriceReferenceUnit = canonicalizeUnitCode(\n formValues.unitPriceReferenceUnit,\n );\n const unitPriceBaseQuantity = toPositiveNumberOrNull(\n formValues.unitPriceBaseQuantity,\n );\n if (defaultSalesUnit && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequired\",\n \"Base unit is required when default sales unit is set.\",\n );\n throw createCrudFormError(message, { defaultSalesUnit: message });\n }\n const conversionInputs = normalizeProductConversionInputs(\n formValues.unitConversions,\n t(\n \"catalog.products.uom.errors.duplicateConversion\",\n \"Duplicate conversion unit is not allowed.\",\n ),\n );\n if (conversionInputs.length && !defaultUnit) {\n const message = t(\n \"catalog.products.uom.errors.baseRequiredForConversions\",\n \"Base unit is required when conversions are configured.\",\n );\n throw createCrudFormError(message, { defaultUnit: message });\n }\n const defaultUnitKey = defaultUnit?.toLowerCase() ?? null;\n const defaultSalesUnitKey = defaultSalesUnit?.toLowerCase() ?? null;\n if (\n defaultUnitKey &&\n defaultSalesUnitKey &&\n defaultSalesUnitKey !== defaultUnitKey\n ) {\n const hasDefaultSalesConversion = conversionInputs.some(\n (entry) =>\n entry.isActive &&\n entry.unitCode.toLowerCase() === defaultSalesUnitKey,\n );\n if (!hasDefaultSalesConversion) {\n const message = t(\n \"catalog.products.uom.errors.defaultSalesConversionRequired\",\n \"Active conversion for default sales unit is required when it differs from base unit.\",\n );\n throw createCrudFormError(message, {\n defaultSalesUnit: message,\n unitConversions: message,\n });\n }\n }\n if (unitPriceEnabled) {\n if (\n !unitPriceReferenceUnit ||\n !UNIT_PRICE_REFERENCE_UNITS.has(\n unitPriceReferenceUnit as ProductUnitPriceReferenceUnit,\n )\n ) {\n const message = t(\n \"catalog.products.unitPrice.errors.referenceUnit\",\n \"Reference unit is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceReferenceUnit: message,\n });\n }\n if (unitPriceBaseQuantity === null) {\n const message = t(\n \"catalog.products.unitPrice.errors.baseQuantity\",\n \"Base quantity is required when unit price display is enabled.\",\n );\n throw createCrudFormError(message, {\n unitPriceBaseQuantity: message,\n });\n }\n }\n const productPayload: Record<string, unknown> = {\n title,\n subtitle: formValues.subtitle?.trim() || undefined,\n description,\n handle,\n taxRateId: formValues.taxRateId ?? null,\n taxRate: productTaxRate ?? null,\n isConfigurable: Boolean(formValues.hasVariants),\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n dimensions,\n weightValue: weight?.value ?? null,\n weightUnit: weight?.unit ?? null,\n defaultUnit: defaultUnit ?? null,\n defaultSalesUnit: defaultSalesUnit ?? defaultUnit ?? null,\n defaultSalesUnitQuantity,\n uomRoundingScale,\n uomRoundingMode,\n unitPriceEnabled,\n unitPriceReferenceUnit: unitPriceEnabled\n ? unitPriceReferenceUnit\n : undefined,\n unitPriceBaseQuantity: unitPriceEnabled\n ? unitPriceBaseQuantity\n : undefined,\n };\n if (optionSchemaDefinition) {\n productPayload.optionSchema = optionSchemaDefinition;\n }\n const categoryIds = Array.isArray(formValues.categoryIds)\n ? formValues.categoryIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (categoryIds.length) {\n productPayload.categoryIds = Array.from(new Set(categoryIds));\n }\n const tags = Array.isArray(formValues.tags)\n ? Array.from(\n new Set(\n formValues.tags\n .map((tag) => (typeof tag === \"string\" ? tag.trim() : \"\"))\n .filter((tag) => tag.length),\n ),\n )\n : [];\n if (tags.length) {\n productPayload.tags = tags;\n }\n const channelIds = Array.isArray(formValues.channelIds)\n ? formValues.channelIds\n .map((id) => (typeof id === \"string\" ? id.trim() : \"\"))\n .filter((id) => id.length)\n : [];\n if (channelIds.length) {\n productPayload.offers = channelIds.map((channelId) => ({\n channelId,\n title,\n description,\n defaultMediaId: defaultMediaId ?? undefined,\n defaultMediaUrl: defaultMediaUrl ?? undefined,\n }));\n }\n\n const variantDrafts =\n (Array.isArray(formValues.variants) && formValues.variants.length\n ? formValues.variants\n : [\n createVariantDraft(formValues.taxRateId ?? null, {\n isDefault: true,\n }),\n ]) ?? [];\n const priceRequests: VariantPriceRequest[] = [];\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n for (const priceKind of priceKinds) {\n const value = variant.prices?.[priceKind.id]?.amount?.trim();\n if (!value) continue;\n const numeric = Number(value);\n if (\n Number.isNaN(numeric) ||\n !Number.isFinite(numeric) ||\n numeric < 0\n ) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.priceNonNegative\",\n \"Prices must be zero or greater.\",\n ),\n );\n }\n const currencyCode =\n typeof priceKind.currencyCode === \"string\" &&\n priceKind.currencyCode.trim().length\n ? priceKind.currencyCode.trim().toUpperCase()\n : \"\";\n if (!currencyCode) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.currency\",\n \"Provide a currency for all price kinds.\",\n ),\n {},\n );\n }\n priceRequests.push({\n variantDraftId: variant.id,\n priceKindId: priceKind.id,\n currencyCode,\n amount: numeric,\n displayMode: priceKind.displayMode,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRateValue: resolvedVariantTaxRate ?? null,\n });\n }\n }\n\n const cleanupState: {\n productId: string | null;\n variantIds: string[];\n } = { productId: null, variantIds: [] };\n try {\n const { result: created } = await createCrud<{ id?: string }>(\n \"catalog/products\",\n productPayload,\n );\n const productId = created?.id;\n if (!productId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.id\",\n \"Product id missing after create.\",\n ),\n );\n }\n cleanupState.productId = productId;\n\n for (const conversion of conversionInputs) {\n await createCrud(\"catalog/product-unit-conversions\", {\n productId,\n unitCode: conversion.unitCode,\n toBaseFactor: conversion.toBaseFactor,\n sortOrder: conversion.sortOrder,\n isActive: conversion.isActive,\n });\n }\n\n const variantIdMap: Record<string, string> = {};\n for (const variant of variantDrafts) {\n const { resolvedVariantTaxRateId, resolvedVariantTaxRate } =\n resolveVariantTax(variant);\n const variantPayload: Record<string, unknown> = {\n productId,\n name:\n variant.title?.trim() ||\n Object.values(variant.optionValues).join(\" / \") ||\n \"Variant\",\n sku: variant.sku?.trim() || undefined,\n isDefault: Boolean(variant.isDefault),\n isActive: true,\n optionValues: Object.keys(variant.optionValues).length\n ? variant.optionValues\n : undefined,\n taxRateId: resolvedVariantTaxRateId ?? null,\n taxRate: resolvedVariantTaxRate ?? null,\n };\n const { result: variantResult } = await createCrud<{\n id?: string;\n variantId?: string;\n }>(\"catalog/variants\", variantPayload);\n const variantId = variantResult?.variantId ?? variantResult?.id;\n if (!variantId) {\n throw createCrudFormError(\n t(\n \"catalog.products.create.errors.variant\",\n \"Failed to create variant.\",\n ),\n );\n }\n variantIdMap[variant.id] = variantId;\n cleanupState.variantIds.push(variantId);\n }\n\n for (const draft of priceRequests) {\n const variantId = variantIdMap[draft.variantDraftId];\n if (!variantId) continue;\n const pricePayload: Record<string, unknown> = {\n productId,\n variantId,\n currencyCode: draft.currencyCode,\n priceKindId: draft.priceKindId,\n };\n if (draft.taxRateId) {\n pricePayload.taxRateId = draft.taxRateId;\n } else if (\n typeof draft.taxRateValue === \"number\" &&\n Number.isFinite(draft.taxRateValue)\n ) {\n pricePayload.taxRate = draft.taxRateValue;\n }\n if (draft.displayMode === \"including-tax\") {\n pricePayload.unitPriceGross = draft.amount;\n } else {\n pricePayload.unitPriceNet = draft.amount;\n }\n await createCrud(\"catalog/prices\", pricePayload);\n }\n\n if (mediaDraftId && attachmentIds.length) {\n const transfer = await apiCall<{\n ok?: boolean;\n error?: string;\n }>(\n \"/api/attachments/transfer\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n entityId: E.catalog.catalog_product,\n attachmentIds,\n fromRecordId: mediaDraftId,\n toRecordId: productId,\n }),\n },\n { fallback: null },\n );\n if (!transfer.ok) {\n console.error(\n \"attachments.transfer.failed\",\n transfer.result?.error,\n );\n }\n }\n\n if (inboxDraft) {\n try {\n sessionStorage.removeItem(\"inbox_ops.productDraft\");\n } catch { /* ignore */ }\n try {\n await apiCall(\n `/api/inbox_ops/proposals/${inboxDraft.proposalId}/actions/${inboxDraft.actionId}/complete`,\n {\n method: \"PATCH\",\n body: JSON.stringify({\n createdEntityId: productId,\n createdEntityType: \"catalog_product\",\n }),\n },\n );\n } catch {\n flash(\n t(\n \"inbox_ops.flash.complete_failed\",\n \"Product created but failed to update inbox action status.\",\n ),\n \"warning\",\n );\n }\n }\n\n flash(\n t(\"catalog.products.create.success\", \"Product created.\"),\n \"success\",\n );\n if (inboxDraft) {\n router.push(\n `/backend/inbox-ops/proposals/${encodeURIComponent(inboxDraft.proposalId)}`,\n );\n } else {\n router.push(\"/backend/catalog/products\");\n }\n } catch (err) {\n await cleanupFailedProduct(\n cleanupState.productId,\n cleanupState.variantIds,\n );\n throw err;\n }\n }}\n />\n </PageBody>\n </Page>\n );\n}\n\nasync function cleanupFailedProduct(\n productId: string | null,\n variantIds: string[],\n): Promise<void> {\n if (!productId && variantIds.length === 0) return;\n if (variantIds.length) {\n const variantDeletes = variantIds.map((variantId) =>\n apiCall(`/api/catalog/variants?id=${encodeURIComponent(variantId)}`, {\n method: \"DELETE\",\n }).catch(() => null),\n );\n await Promise.allSettled(variantDeletes);\n }\n if (productId) {\n await apiCall(`/api/catalog/products?id=${encodeURIComponent(productId)}`, {\n method: \"DELETE\",\n }).catch(() => null);\n }\n}\n\ntype ProductBuilderProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n priceKinds: PriceKindSummary[];\n taxRates: TaxRateSummary[];\n};\n\ntype ProductMetaSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n errors: Record<string, string>;\n taxRates: TaxRateSummary[];\n};\n\ntype ProductDimensionsSectionProps = {\n values: ProductFormValues;\n setValue: (id: string, value: unknown) => void;\n};\n\nfunction ProductDimensionsFields({\n values,\n setValue,\n}: ProductDimensionsSectionProps) {\n const t = useT();\n const dimensionValues = normalizeProductDimensions(values.dimensions);\n const weightValues = normalizeProductWeight(values.weight);\n\n return (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <h3 className=\"text-sm font-semibold\">\n {t(\"catalog.products.edit.dimensions\", \"Dimensions & weight\")}\n </h3>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.width\", \"Width\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.width ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"width\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.height\", \"Height\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.height ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"height\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.depth\", \"Depth\")}\n </Label>\n <Input\n type=\"number\"\n value={dimensionValues?.depth ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"depth\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.dimensions.unit\", \"Size unit\")}\n </Label>\n <Input\n value={dimensionValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"dimensions\",\n updateDimensionValue(\n values.dimensions ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"cm\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.value\", \"Weight\")}\n </Label>\n <Input\n type=\"number\"\n value={weightValues?.value ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"value\",\n event.target.value,\n ),\n )\n }\n placeholder=\"0\"\n />\n </div>\n <div className=\"space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\"catalog.products.edit.weight.unit\", \"Weight unit\")}\n </Label>\n <Input\n value={weightValues?.unit ?? \"\"}\n onChange={(event) =>\n setValue(\n \"weight\",\n updateWeightValue(\n values.weight ?? null,\n \"unit\",\n event.target.value,\n ),\n )\n }\n placeholder=\"kg\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProductBuilder({\n values,\n setValue,\n errors,\n priceKinds,\n taxRates,\n}: ProductBuilderProps) {\n const t = useT();\n const steps = PRODUCT_FORM_STEPS;\n const [currentStep, setCurrentStep] = React.useState(0);\n const defaultTaxRate = React.useMemo(\n () =>\n values.taxRateId\n ? (taxRates.find((rate) => rate.id === values.taxRateId) ?? null)\n : null,\n [taxRates, values.taxRateId],\n );\n React.useEffect(() => {\n if (values.taxRateId) return;\n if (!taxRates.length) return;\n const fallback = taxRates.find((rate) => rate.isDefault);\n if (!fallback) return;\n setValue(\"taxRateId\", fallback.id);\n }, [taxRates, setValue, values.taxRateId]);\n const stepErrors = React.useMemo(() => {\n const map = steps.reduce<Record<ProductFormStep, string[]>>(\n (acc, step) => {\n acc[step] = [];\n return acc;\n },\n {} as Record<ProductFormStep, string[]>,\n );\n Object.entries(errors).forEach(([fieldId, message]) => {\n const step = resolveStepForField(fieldId);\n if (!step) return;\n const text =\n typeof message === \"string\" && message.trim().length\n ? message.trim()\n : null;\n if (text) map[step] = [...map[step], text];\n });\n return map;\n }, [errors, steps]);\n const errorSignature = React.useMemo(\n () => Object.keys(errors).sort((a, b) => a.localeCompare(b)).join(\"|\"),\n [errors],\n );\n const lastErrorSignatureRef = React.useRef<string | null>(null);\n React.useEffect(() => {\n if (!errorSignature || errorSignature === lastErrorSignatureRef.current)\n return;\n lastErrorSignatureRef.current = errorSignature;\n const currentStepKey = steps[currentStep];\n if (currentStepKey && stepErrors[currentStepKey]?.length) return;\n const fallbackIndex = steps.findIndex(\n (step) => (stepErrors[step] ?? []).length > 0,\n );\n if (fallbackIndex >= 0 && fallbackIndex !== currentStep) {\n setCurrentStep(fallbackIndex);\n }\n }, [currentStep, errorSignature, setCurrentStep, stepErrors, steps]);\n const defaultTaxRateLabel = defaultTaxRate\n ? formatTaxRateLabel(defaultTaxRate)\n : null;\n const inventoryDisabledHint = t(\n \"catalog.products.create.variantsBuilder.inventoryDisabled\",\n \"Inventory tracking controls are not available yet.\",\n );\n\n React.useEffect(() => {\n if (currentStep >= steps.length) setCurrentStep(0);\n }, [currentStep, steps.length]);\n\n const currentStepKey = steps[currentStep] ?? steps[0];\n\n const mediaItems = React.useMemo(\n () => (Array.isArray(values.mediaItems) ? values.mediaItems : []),\n [values.mediaItems],\n );\n\n const handleMediaItemsChange = React.useCallback(\n (nextItems: ProductMediaItem[]) => {\n setValue(\"mediaItems\", nextItems);\n const hasCurrent = nextItems.some(\n (item) => item.id === values.defaultMediaId,\n );\n if (!hasCurrent) {\n const fallbackId = nextItems[0]?.id ?? null;\n setValue(\"defaultMediaId\", fallbackId);\n if (fallbackId && nextItems[0]) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(fallbackId, {\n slug: slugifyAttachmentFileName(nextItems[0].fileName),\n }),\n );\n } else {\n setValue(\"defaultMediaUrl\", \"\");\n }\n }\n },\n [setValue, values.defaultMediaId],\n );\n\n const handleDefaultMediaChange = React.useCallback(\n (attachmentId: string | null) => {\n setValue(\"defaultMediaId\", attachmentId);\n if (!attachmentId) {\n setValue(\"defaultMediaUrl\", \"\");\n return;\n }\n const target = mediaItems.find((item) => item.id === attachmentId);\n if (target) {\n setValue(\n \"defaultMediaUrl\",\n buildAttachmentImageUrl(target.id, {\n slug: slugifyAttachmentFileName(target.fileName),\n }),\n );\n }\n },\n [mediaItems, setValue],\n );\n\n const ensureVariants = React.useCallback(() => {\n const optionDefinitions = Array.isArray(values.options)\n ? values.options\n : [];\n if (!values.hasVariants || !optionDefinitions.length) {\n if (!values.variants || !values.variants.length) {\n setValue(\"variants\", [\n createVariantDraft(values.taxRateId ?? null, { isDefault: true }),\n ]);\n }\n return;\n }\n const combos = buildVariantCombinations(optionDefinitions);\n const existing = Array.isArray(values.variants) ? values.variants : [];\n const existingByKey = new Map(\n existing.map((variant) => [\n buildOptionValuesKey(variant.optionValues),\n variant,\n ]),\n );\n let hasDefault = existing.some((variant) => variant.isDefault);\n let changed = existing.length !== combos.length;\n const nextVariants: VariantDraft[] = combos.map((combo, index) => {\n const key = buildOptionValuesKey(combo);\n const existingMatch = existingByKey.get(key);\n if (existingMatch) {\n if (existingMatch.isDefault) hasDefault = true;\n if (!haveSameOptionValues(existingMatch.optionValues, combo)) {\n changed = true;\n return { ...existingMatch, optionValues: combo };\n }\n if (existing[index] !== existingMatch) {\n changed = true;\n }\n return existingMatch;\n }\n changed = true;\n return createVariantDraft(values.taxRateId ?? null, {\n title: Object.values(combo).join(\" / \"),\n optionValues: combo,\n });\n });\n if (!nextVariants.length) return;\n if (!hasDefault) {\n changed = true;\n nextVariants[0] = { ...nextVariants[0], isDefault: true };\n }\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [\n values.options,\n values.variants,\n values.hasVariants,\n values.taxRateId,\n setValue,\n ]);\n\n React.useEffect(() => {\n ensureVariants();\n }, [ensureVariants]);\n\n React.useEffect(() => {\n if (!values.taxRateId) return;\n const variants = Array.isArray(values.variants) ? values.variants : [];\n if (!variants.length) return;\n let changed = false;\n const nextVariants = variants.map((variant) => {\n if (variant.taxRateId) return variant;\n changed = true;\n return { ...variant, taxRateId: values.taxRateId };\n });\n if (changed) {\n setValue(\"variants\", nextVariants);\n }\n }, [values.taxRateId, values.variants, setValue]);\n const setVariantField = React.useCallback(\n (variantId: string, field: keyof VariantDraft, value: unknown) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n return { ...variant, [field]: value };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const setVariantPrice = React.useCallback(\n (variantId: string, priceKindId: string, amount: string) => {\n if (amount.trim().startsWith(\"-\")) return;\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => {\n if (variant.id !== variantId) return variant;\n const nextPrices = { ...(variant.prices ?? {}) };\n if (amount === \"\") {\n delete nextPrices[priceKindId];\n } else {\n nextPrices[priceKindId] = { amount };\n }\n return {\n ...variant,\n prices: nextPrices,\n };\n },\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const markDefaultVariant = React.useCallback(\n (variantId: string) => {\n const next = (Array.isArray(values.variants) ? values.variants : []).map(\n (variant) => ({\n ...variant,\n isDefault: variant.id === variantId,\n }),\n );\n setValue(\"variants\", next);\n },\n [values.variants, setValue],\n );\n\n const handleOptionTitleChange = React.useCallback(\n (optionId: string, title: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n return { ...option, title };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const setOptionValues = React.useCallback(\n (optionId: string, labels: string[]) => {\n const normalized = labels\n .map((label) => label.trim())\n .filter((label) => label.length);\n const unique = Array.from(new Set(normalized));\n const next = (Array.isArray(values.options) ? values.options : []).map(\n (option) => {\n if (option.id !== optionId) return option;\n const existingByLabel = new Map(\n option.values.map((value) => [value.label, value]),\n );\n const nextValues = unique.map(\n (label) =>\n existingByLabel.get(label) ?? { id: createLocalId(), label },\n );\n return {\n ...option,\n values: nextValues,\n };\n },\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n const addOption = React.useCallback(() => {\n const next = [\n ...(Array.isArray(values.options) ? values.options : []),\n { id: createLocalId(), title: \"\", values: [] },\n ];\n setValue(\"options\", next);\n }, [values.options, setValue]);\n\n const removeOption = React.useCallback(\n (optionId: string) => {\n const next = (Array.isArray(values.options) ? values.options : []).filter(\n (option) => option.id !== optionId,\n );\n setValue(\"options\", next);\n },\n [values.options, setValue],\n );\n\n return (\n <div className=\"space-y-6\">\n <nav className=\"flex gap-6 border-b pb-2 text-sm font-medium\">\n {steps.map((step, index) => (\n <Button\n key={step}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n \"relative h-auto rounded-none px-0 py-1 pb-2 font-medium\",\n currentStep === index\n ? \"text-foreground\"\n : \"text-muted-foreground hover:text-foreground\",\n )}\n onClick={() => setCurrentStep(index)}\n >\n {step === \"general\" &&\n t(\"catalog.products.create.steps.general\", \"General data\")}\n {step === \"organize\" &&\n t(\"catalog.products.create.steps.organize\", \"Organize\")}\n {step === \"uom\" &&\n t(\"catalog.products.uom.title\", \"Units of measure\")}\n {step === \"variants\" &&\n t(\"catalog.products.create.steps.variants\", \"Variants\")}\n {(stepErrors[step]?.length ?? 0) > 0 ? (\n <span\n className=\"absolute -right-2 top-0 h-2 w-2 rounded-full bg-destructive\"\n aria-hidden=\"true\"\n />\n ) : null}\n {currentStep === index ? (\n <span className=\"absolute inset-x-0 -bottom-px h-0.5 bg-foreground rounded-full\" />\n ) : null}\n </Button>\n ))}\n </nav>\n\n {currentStepKey === \"general\" ? (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <Label className=\"flex items-center gap-1\">\n {t(\"catalog.products.form.title\", \"Title\")}\n <span className=\"text-red-600\">*</span>\n </Label>\n <Input\n value={values.title}\n onChange={(event) => setValue(\"title\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.title\",\n \"e.g., Summer sneaker\",\n )}\n />\n {errors.title ? (\n <p className=\"text-xs text-red-600\">{errors.title}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <Label>\n {t(\"catalog.products.form.description\", \"Description\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setValue(\"useMarkdown\", !values.useMarkdown)}\n className=\"gap-2 text-xs\"\n >\n {values.useMarkdown ? (\n <AlignLeft className=\"h-4 w-4\" />\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n {values.useMarkdown\n ? t(\n \"catalog.products.create.actions.usePlain\",\n \"Use plain text\",\n )\n : t(\n \"catalog.products.create.actions.useMarkdown\",\n \"Use markdown\",\n )}\n </Button>\n </div>\n {values.useMarkdown ? (\n <div\n data-color-mode=\"light\"\n className=\"overflow-hidden rounded-md border\"\n >\n <MarkdownEditor\n value={values.description}\n height={260}\n onChange={(val) => setValue(\"description\", val ?? \"\")}\n previewOptions={{ remarkPlugins: [] }}\n />\n </div>\n ) : (\n <textarea\n className=\"min-h-[180px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.description}\n onChange={(event) =>\n setValue(\"description\", event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.placeholders.description\",\n \"Describe the product...\",\n )}\n />\n )}\n </div>\n\n <ProductMediaManager\n entityId={E.catalog.catalog_product}\n draftRecordId={values.mediaDraftId}\n items={mediaItems}\n defaultMediaId={values.defaultMediaId ?? null}\n onItemsChange={handleMediaItemsChange}\n onDefaultChange={handleDefaultMediaChange}\n />\n\n <ProductDimensionsFields\n values={values as ProductFormValues}\n setValue={setValue}\n />\n </div>\n ) : null}\n\n {currentStepKey === \"organize\" ? (\n <ProductCategorizeSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n />\n ) : null}\n\n {currentStepKey === \"uom\" ? (\n <ProductUomSection\n values={values as ProductFormValues}\n setValue={setValue}\n errors={errors}\n embedded\n />\n ) : null}\n\n {currentStepKey === \"variants\" ? (\n <div className=\"space-y-6\">\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border\"\n checked={values.hasVariants}\n onChange={(event) =>\n setValue(\"hasVariants\", event.target.checked)\n }\n />\n {t(\n \"catalog.products.create.variantsBuilder.toggle\",\n \"Yes, this is a product with variants\",\n )}\n </label>\n\n {values.hasVariants ? (\n <div className=\"space-y-4 rounded-lg border p-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-semibold\">\n {t(\n \"catalog.products.create.optionsBuilder.title\",\n \"Product options\",\n )}\n </h3>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addOption}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {t(\n \"catalog.products.create.optionsBuilder.add\",\n \"Add option\",\n )}\n </Button>\n </div>\n {(Array.isArray(values.options) ? values.options : []).map(\n (option) => (\n <div key={option.id} className=\"rounded-md bg-muted/40 p-4\">\n <div className=\"flex items-center gap-2\">\n <Input\n value={option.title}\n onChange={(event) =>\n handleOptionTitleChange(option.id, event.target.value)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.placeholder\",\n \"e.g., Color\",\n )}\n className=\"flex-1\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n type=\"button\"\n onClick={() => removeOption(option.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"mt-3 space-y-2\">\n <Label className=\"text-xs uppercase text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.values\",\n \"Values\",\n )}\n </Label>\n <TagsInput\n value={option.values.map((value) => value.label)}\n onChange={(labels) =>\n setOptionValues(option.id, labels)\n }\n placeholder={t(\n \"catalog.products.create.optionsBuilder.valuePlaceholder\",\n \"Type a value and press Enter\",\n )}\n />\n </div>\n </div>\n ),\n )}\n {!values.options?.length ? (\n <p className=\"text-sm text-muted-foreground\">\n {t(\n \"catalog.products.create.optionsBuilder.empty\",\n \"No options yet. Add your first option to generate variants.\",\n )}\n </p>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"rounded-lg border\">\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full min-w-[900px] table-fixed border-collapse text-sm\">\n <thead className=\"bg-muted/40\">\n <tr>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.defaultOption\",\n \"Default option\",\n )}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.form.variants\", \"Variant title\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\"catalog.products.create.variantsBuilder.sku\", \"SKU\")}\n </th>\n <th className=\"px-3 py-2 text-left\">\n {t(\n \"catalog.products.create.variantsBuilder.vatColumn\",\n \"Tax class\",\n )}\n </th>\n {priceKinds.map((kind) => (\n <th key={kind.id} className=\"px-3 py-2 text-left\">\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-1\">\n <span>\n {t(\n \"catalog.products.create.variantsBuilder.priceColumn\",\n \"Price {{title}}\",\n ).replace(\"{{title}}\", kind.title)}\n </span>\n <small\n title={\n kind.displayMode === \"including-tax\"\n ? t(\n \"catalog.priceKinds.form.displayMode.include\",\n \"Including tax\",\n )\n : t(\n \"catalog.priceKinds.form.displayMode.exclude\",\n \"Excluding tax\",\n )\n }\n className=\"text-xs text-muted-foreground\"\n >\n {kind.displayMode === \"including-tax\" ? \"\u24C9\" : \"\u24C3\"}\n </small>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode?.toUpperCase() ??\n t(\n \"catalog.products.create.variantsBuilder.currencyMissing\",\n \"Currency missing\",\n )}\n </span>\n </div>\n </th>\n ))}\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.manageInventory\",\n \"Managed inventory\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.allowBackorder\",\n \"Allow backorder\",\n )}\n </th>\n <th className=\"px-3 py-2 text-center\">\n {t(\n \"catalog.products.create.variantsBuilder.inventoryKit\",\n \"Has inventory kit\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {(Array.isArray(values.variants) && values.variants.length\n ? values.variants\n : [\n createVariantDraft(values.taxRateId ?? null, {\n isDefault: true,\n }),\n ]\n ).map((variant) => (\n <tr key={variant.id} className=\"border-t\">\n <td className=\"px-3 py-2\">\n <label className=\"inline-flex items-center gap-1 text-xs\">\n <input\n type=\"radio\"\n name=\"defaultVariant\"\n checked={variant.isDefault}\n onChange={() => markDefaultVariant(variant.id)}\n />\n {variant.isDefault\n ? t(\n \"catalog.products.create.variantsBuilder.defaultLabel\",\n \"Default option value\",\n )\n : t(\n \"catalog.products.create.variantsBuilder.makeDefault\",\n \"Set as default\",\n )}\n </label>\n {values.hasVariants && variant.optionValues ? (\n <p className=\"text-xs text-muted-foreground\">\n {Object.values(variant.optionValues).join(\" / \")}\n </p>\n ) : null}\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.title}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"title\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.titlePlaceholder\",\n \"Variant title\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <Input\n value={variant.sku}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"sku\",\n event.target.value,\n )\n }\n placeholder={t(\n \"catalog.products.create.variantsBuilder.skuPlaceholder\",\n \"e.g., SKU-001\",\n )}\n />\n </td>\n <td className=\"px-3 py-2\">\n <select\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\"\n value={variant.taxRateId ?? \"\"}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"taxRateId\",\n event.target.value || null,\n )\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {defaultTaxRateLabel\n ? t(\n \"catalog.products.create.variantsBuilder.vatOptionDefault\",\n \"Use product tax class ({{label}})\",\n ).replace(\"{{label}}\", defaultTaxRateLabel)\n : t(\n \"catalog.products.create.variantsBuilder.vatOptionNone\",\n \"No tax class\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n </td>\n {priceKinds.map((kind) => (\n <td key={kind.id} className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {kind.currencyCode ?? \"\u2014\"}\n </span>\n <input\n type=\"number\"\n className=\"w-full rounded-md border px-2 py-1\"\n value={variant.prices?.[kind.id]?.amount ?? \"\"}\n onChange={(event) =>\n setVariantPrice(\n variant.id,\n kind.id,\n event.target.value,\n )\n }\n placeholder=\"0.00\"\n min={0}\n />\n </div>\n </td>\n ))}\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.manageInventory}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"manageInventory\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.allowBackorder}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"allowBackorder\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n <td className=\"px-3 py-2 text-center\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 rounded border disabled:cursor-not-allowed disabled:opacity-60\"\n checked={variant.hasInventoryKit}\n onChange={(event) =>\n setVariantField(\n variant.id,\n \"hasInventoryKit\",\n event.target.checked,\n )\n }\n disabled\n title={inventoryDisabledHint}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {!priceKinds.length ? (\n <div className=\"flex items-center gap-2 border-t px-4 py-3 text-sm text-muted-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n {t(\n \"catalog.products.create.variantsBuilder.noPriceKinds\",\n \"Configure price kinds in Catalog settings to add price columns.\",\n )}\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div className=\"flex justify-between border-t pt-4\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setCurrentStep(Math.max(0, currentStep - 1))}\n disabled={currentStep === 0}\n className=\"gap-2\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n {t(\"catalog.products.create.steps.previous\", \"Previous\")}\n </Button>\n {currentStepKey !== \"variants\" ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n setCurrentStep(Math.min(steps.length - 1, currentStep + 1))\n }\n className=\"gap-2\"\n >\n {t(\"catalog.products.create.steps.continue\", \"Continue\")}\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n ) : (\n <span />\n )}\n </div>\n </div>\n );\n}\n\nfunction ProductMetaSection({\n values,\n setValue,\n errors,\n taxRates,\n}: ProductMetaSectionProps) {\n const t = useT();\n const handleValue = typeof values.handle === \"string\" ? values.handle : \"\";\n const titleSource = typeof values.title === \"string\" ? values.title : \"\";\n const autoHandleEnabledRef = React.useRef(handleValue.trim().length === 0);\n\n React.useEffect(() => {\n if (!autoHandleEnabledRef.current) return;\n const normalizedTitle = titleSource.trim();\n if (!normalizedTitle) {\n if (handleValue) {\n setValue(\"handle\", \"\");\n }\n return;\n }\n const nextHandle = slugify(normalizedTitle);\n if (nextHandle !== handleValue) {\n setValue(\"handle\", nextHandle);\n }\n }, [titleSource, handleValue, setValue]);\n\n const handleHandleInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n autoHandleEnabledRef.current = nextValue.trim().length === 0;\n setValue(\"handle\", nextValue);\n },\n [setValue],\n );\n\n const handleGenerateHandle = React.useCallback(() => {\n const slug = slugify(titleSource);\n autoHandleEnabledRef.current = true;\n setValue(\"handle\", slug);\n }, [titleSource, setValue]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.subtitle\", \"Subtitle\")}</Label>\n <Input\n value={typeof values.subtitle === \"string\" ? values.subtitle : \"\"}\n onChange={(event) => setValue(\"subtitle\", event.target.value)}\n placeholder={t(\n \"catalog.products.create.placeholders.subtitle\",\n \"Optional subtitle\",\n )}\n />\n {errors.subtitle ? (\n <p className=\"text-xs text-red-600\">{errors.subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <Label>{t(\"catalog.products.form.handle\", \"Handle\")}</Label>\n <div className=\"flex gap-2\">\n <Input\n value={handleValue}\n onChange={handleHandleInputChange}\n placeholder={t(\n \"catalog.products.create.placeholders.handle\",\n \"e.g., summer-sneaker\",\n )}\n className=\"font-mono lowercase\"\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleGenerateHandle}\n >\n {t(\"catalog.products.create.actions.generateHandle\", \"Generate\")}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n \"catalog.products.create.handleHelp\",\n \"Handle is used for URLs and must be unique.\",\n )}\n </p>\n {errors.handle ? (\n <p className=\"text-xs text-red-600\">{errors.handle}</p>\n ) : null}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <Label>\n {t(\"catalog.products.create.taxRates.label\", \"Tax class\")}\n </Label>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => {\n if (typeof window !== \"undefined\") {\n window.open(\n \"/backend/config/sales?section=tax-rates\",\n \"_blank\",\n \"noopener,noreferrer\",\n );\n }\n }}\n title={t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <Settings className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {t(\n \"catalog.products.create.taxRates.manage\",\n \"Manage tax classes\",\n )}\n </span>\n </Button>\n </div>\n <select\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\"\n value={values.taxRateId ?? \"\"}\n onChange={(event) =>\n setValue(\"taxRateId\", event.target.value || null)\n }\n disabled={!taxRates.length}\n >\n <option value=\"\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.noneSelected\",\n \"No tax class selected\",\n )\n : t(\n \"catalog.products.create.taxRates.emptyOption\",\n \"No tax classes available\",\n )}\n </option>\n {taxRates.map((rate) => (\n <option key={rate.id} value={rate.id}>\n {formatTaxRateLabel(rate)}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-muted-foreground\">\n {taxRates.length\n ? t(\n \"catalog.products.create.taxRates.help\",\n \"Applied to new prices unless overridden per variant.\",\n )\n : t(\n \"catalog.products.create.taxRates.empty\",\n \"Define tax classes under Sales \u2192 Configuration.\",\n )}\n </p>\n {errors.taxRateId ? (\n <p className=\"text-xs text-red-600\">{errors.taxRateId}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"],
5
+ "mappings": ";AA8GI,cA2uBI,YA3uBJ;AA5GJ,YAAY,WAAW;AACvB,OAAO,aAAa;AACpB,SAAS,WAAW,uBAAuB;AAE3C,SAAS,MAAM,gBAAgB;AAC/B;AAAA,EACE;AAAA,OAGK;AACP,SAAS,kBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,YAAY;AACrB,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,OAEK;AACP,SAAS,gCAAgC;AACzC;AAAA,EACE;AAAA,EAWA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAEP,MAAM,yBACJ;AAmBF,MAAM,iBAAiB,QAAQ,MAAM,OAAO,sBAAsB,GAAG;AAAA,EACnE,KAAK;AAAA,EACL,SAAS,MACP,oBAAC,SAAI,WAAU,uEAAsE,kCAErF;AAEJ,CAAC;AAID,MAAM,sBAAsB,oBAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,GAAG,CAAC;AAElE,MAAM,aAAa,CAAC,YAAoB,CAAC,UACvC,UAAU,WACV,MAAM,WAAW,GAAG,OAAO,GAAG,KAC9B,MAAM,WAAW,GAAG,OAAO,GAAG;AAChC,MAAM,cAAc,CAAC,WAAmB,CAAC,UACvC,MAAM,WAAW,MAAM;AAEzB,MAAM,sBAGF;AAAA,EACF,SAAS;AAAA,IACP,WAAW,OAAO;AAAA,IAClB,WAAW,aAAa;AAAA,IACxB,WAAW,YAAY;AAAA,IACvB,WAAW,cAAc;AAAA,IACzB,YAAY,cAAc;AAAA,IAC1B,YAAY,YAAY;AAAA,IACxB,YAAY,QAAQ;AAAA,EACtB;AAAA,EACA,UAAU;AAAA,IACR,WAAW,aAAa;AAAA,IACxB,WAAW,YAAY;AAAA,IACvB,WAAW,MAAM;AAAA,EACnB;AAAA,EACA,KAAK;AAAA,IACH,WAAW,aAAa;AAAA,IACxB,WAAW,kBAAkB;AAAA,IAC7B,WAAW,0BAA0B;AAAA,IACrC,WAAW,kBAAkB;AAAA,IAC7B,WAAW,iBAAiB;AAAA,IAC5B,WAAW,kBAAkB;AAAA,IAC7B,WAAW,wBAAwB;AAAA,IACnC,WAAW,uBAAuB;AAAA,IAClC,YAAY,iBAAiB;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,IACR,WAAW,aAAa;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,YAAY,UAAU;AAAA,EACxB;AACF;AAEA,SAAS,oBAAoB,SAAyC;AACpE,QAAM,aAAa,SAAS,KAAK;AACjC,MAAI,CAAC,WAAY,QAAO;AACxB,aAAW,QAAQ,oBAAoB;AACrC,UAAM,WAAW,oBAAoB,IAAI;AACzC,QAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,UAAU,CAAC,EAAG,QAAO;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAI,CAAC,WAAY,QAAO;AACxB,QAAI,oBAAoB,IAAI,UAAU,EAAG,QAAO;AAChD,QAAI,CAAC,SAAS,KAAK,MAAM,KAAK,GAAG,EAAE,SAAS,UAAU,EAAG,QAAO;AAAA,EAClE;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,UAAU;AAChD,SAAO;AACT;AASA,SAAS,wBAAkD;AACzD,MAAI;AACF,UAAM,MAAM,eAAe,QAAQ,wBAAwB;AAC3D,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,OAAO,YAAY,CAAC,OAAO,cAAc,CAAC,OAAO,QAAS,QAAO;AACtE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEe,SAAR,2BAA4C;AACjD,QAAM,IAAI,KAAK;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,eAAe,gBAAgB;AACrC,QAAM,kBAAkB,aAAa,IAAI,iBAAiB;AAE1D,QAAM,aAAa,MAAM,QAAkC,MAAM;AAC/D,QAAI,CAAC,gBAAiB,QAAO;AAC7B,WAAO,sBAAsB;AAAA,EAC/B,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,mBAAmB,MAAM,OAAiC,IAAI;AACpE,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,UAAU,+BAA+B;AAC/C,QAAI,YAAY,SAAS;AACvB,YAAM,IAAI,WAAW;AACrB,UAAI,OAAO,EAAE,UAAU,YAAY,EAAE,MAAM,KAAK,EAAG,SAAQ,QAAQ,EAAE,MAAM,KAAK;AAChF,UAAI,OAAO,EAAE,gBAAgB,YAAY,EAAE,YAAY,KAAK,EAAG,SAAQ,cAAc,EAAE,YAAY,KAAK;AAAA,IAC1G;AACA,qBAAiB,UAAU;AAAA,EAC7B;AACA,QAAM,CAAC,YAAY,aAAa,IAAI,MAAM,SAA6B,CAAC,CAAC;AACzE,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA2B,CAAC,CAAC;AACnE,QAAM,UAAU,MAAM;AACpB,UAAM,iBAAiB,YAAY;AACjC,UAAI;AACF,cAAM,UAAU,MAAM,qBAEnB,yCAAyC,QAAW;AAAA,UACrD,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AACD,cAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D;AAAA,UACE,MACG,IAAI,CAAC,SAAS,0BAA0B,IAAI,CAAC,EAC7C,OAAO,CAAC,SAAmC,SAAS,IAAI;AAAA,QAC7D;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,oCAAoC,GAAG;AACrD,sBAAc,CAAC,CAAC;AAAA,MAClB;AAAA,IACF;AACA,mBAAe,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACjC,GAAG,CAAC,CAAC,CAAC;AAEN,QAAM,UAAU,MAAM;AACpB,UAAM,eAAe,YAAY;AAC/B,UAAI;AACF,cAAM,UAAU,MAAM,qBAEnB,qCAAqC,QAAW;AAAA,UACjD,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,UACF;AAAA,UACA,UAAU,EAAE,OAAO,CAAC,EAAE;AAAA,QACxB,CAAC;AACD,cAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC9D;AAAA,UACE,MAAM,IAAI,CAAC,SAAS;AAClB,kBAAM,UACJ,OAAO,KAAK,SAAS,WACjB,KAAK,OACL,OAAO,KAAK,QAAQ,OAAO,GAAG;AACpC,mBAAO;AAAA,cACL,IAAI,OAAO,KAAK,EAAE;AAAA,cAClB,MACE,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC9C,KAAK,OACL;AAAA,gBACE;AAAA,gBACA;AAAA,cACF;AAAA,cACN,MACE,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,EAAE,SAC9C,KAAK,OACL;AAAA,cACN,MAAM,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,cAC3C,WAAW;AAAA,gBACT,OAAO,KAAK,cAAc,cACtB,KAAK,YACL,KAAK;AAAA,cACX;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,gCAAgC,GAAG;AACjD,oBAAY,CAAC,CAAC;AAAA,MAChB;AAAA,IACF;AACA,iBAAa,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/B,GAAG,CAAC,CAAC,CAAC;AAEN,QAAM,SAAS,MAAM;AAAA,IACnB,MAAM;AAAA,MACJ;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,WAAW,CAAC;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,MACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,OAAO,EAAE,sCAAsC,cAAc;AAAA,QAC7D,aAAa;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,QACA,WAAW,CAAC;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF,MACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAAA,IACA,CAAC,YAAY,UAAU,CAAC;AAAA,EAC1B;AAEA,SACE,oBAAC,QACC,8BAAC,YACC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,EAAE,iCAAiC,gBAAgB;AAAA,MAC1D,UAAS;AAAA,MACT,QAAQ,CAAC;AAAA,MACT;AAAA,MACA,iBAAgB;AAAA,MAChB,eACE,iBAAiB,WAAW,+BAA+B;AAAA,MAE7D,QAAQ;AAAA,MACR,aAAa,EAAE,kCAAkC,QAAQ;AAAA,MACzD,YAAW;AAAA,MACX,UAAU,OAAO,eAAe;AAC9B,cAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,YAAI,CAAC,OAAO;AACV,gBAAM;AAAA,YACJ;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE,OAAO;AAAA,gBACL;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,cAAM,SAAS,WAAW,QAAQ,KAAK,KAAK;AAC5C,cAAM,cAAc,WAAW,aAAa,KAAK,KAAK;AACtD,cAAM,iBACJ,OAAO,WAAW,mBAAmB,YACrC,WAAW,eAAe,KAAK,EAAE,SAC7B,WAAW,iBACX;AACN,cAAM,aAAa,MAAM,QAAQ,WAAW,UAAU,IAClD,WAAW,aACX,CAAC;AACL,cAAM,gBAAgB,WACnB,IAAI,CAAC,SAAU,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,IAAK,EAC5D,OAAO,CAAC,UAA2B,CAAC,CAAC,KAAK;AAC7C,cAAM,eACJ,OAAO,WAAW,iBAAiB,WAC/B,WAAW,eACX;AACN,cAAM,oBAAoB,iBACtB,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,cAAc,IACpD;AACJ,cAAM,kBAAkB,oBACpB,wBAAwB,kBAAkB,IAAI;AAAA,UAC5C,MAAM,0BAA0B,kBAAkB,QAAQ;AAAA,QAC5D,CAAC,IACD;AACJ,cAAM,yBAAyB;AAAA,UAC7B,WAAW;AAAA,UACX;AAAA,QACF;AACA,cAAM,aAAa;AAAA,UACjB,WAAW,cAAc;AAAA,QAC3B;AACA,cAAM,SAAS,sBAAsB,WAAW,UAAU,IAAI;AAC9D,cAAM,sBAAsB,CAAC,cAA8B;AACzD,cAAI,CAAC,UAAW,QAAO;AACvB,gBAAM,QAAQ,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS;AAC3D,iBAAO,OAAO,OAAO,SAAS,WAAW,MAAM,OAAO;AAAA,QACxD;AACA,cAAM,wBAAwB,WAAW,aAAa;AACtD,cAAM,iBAAiB,oBAAoB,qBAAqB;AAChE,cAAM,oBAAoB,CAAC,YAA0B;AACnD,gBAAM,2BACJ,QAAQ,aAAa;AACvB,gBAAM,yBACJ,oBAAoB,wBAAwB,MAC3C,2BAA2B,OAAQ,kBAAkB;AACxD,iBAAO,EAAE,0BAA0B,uBAAuB;AAAA,QAC5D;AACA,cAAM,cAAc,qBAAqB,WAAW,WAAW;AAC/D,cAAM,mBAAmB;AAAA,UACvB,WAAW;AAAA,QACb;AACA,cAAM,2BACJ,uBAAuB,WAAW,wBAAwB,KAAK;AACjE,cAAM,mBAAmB;AAAA,UACvB,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,kBACJ,WAAW,oBAAoB,UAC/B,WAAW,oBAAoB,OAC3B,WAAW,kBACX;AACN,cAAM,mBAAmB,QAAQ,WAAW,gBAAgB;AAC5D,cAAM,yBAAyB;AAAA,UAC7B,WAAW;AAAA,QACb;AACA,cAAM,wBAAwB;AAAA,UAC5B,WAAW;AAAA,QACb;AACA,YAAI,oBAAoB,CAAC,aAAa;AACpC,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,UACF;AACA,gBAAM,oBAAoB,SAAS,EAAE,kBAAkB,QAAQ,CAAC;AAAA,QAClE;AACA,cAAM,mBAAmB;AAAA,UACvB,WAAW;AAAA,UACX;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,iBAAiB,UAAU,CAAC,aAAa;AAC3C,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,UACF;AACA,gBAAM,oBAAoB,SAAS,EAAE,aAAa,QAAQ,CAAC;AAAA,QAC7D;AACA,cAAM,iBAAiB,aAAa,YAAY,KAAK;AACrD,cAAM,sBAAsB,kBAAkB,YAAY,KAAK;AAC/D,YACE,kBACA,uBACA,wBAAwB,gBACxB;AACA,gBAAM,4BAA4B,iBAAiB;AAAA,YACjD,CAAC,UACC,MAAM,YACN,MAAM,SAAS,YAAY,MAAM;AAAA,UACrC;AACA,cAAI,CAAC,2BAA2B;AAC9B,kBAAM,UAAU;AAAA,cACd;AAAA,cACA;AAAA,YACF;AACA,kBAAM,oBAAoB,SAAS;AAAA,cACjC,kBAAkB;AAAA,cAClB,iBAAiB;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,kBAAkB;AACpB,cACE,CAAC,0BACD,CAAC,2BAA2B;AAAA,YAC1B;AAAA,UACF,GACA;AACA,kBAAM,UAAU;AAAA,cACd;AAAA,cACA;AAAA,YACF;AACA,kBAAM,oBAAoB,SAAS;AAAA,cACjC,wBAAwB;AAAA,YAC1B,CAAC;AAAA,UACH;AACA,cAAI,0BAA0B,MAAM;AAClC,kBAAM,UAAU;AAAA,cACd;AAAA,cACA;AAAA,YACF;AACA,kBAAM,oBAAoB,SAAS;AAAA,cACjC,uBAAuB;AAAA,YACzB,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,iBAA0C;AAAA,UAC9C;AAAA,UACA,UAAU,WAAW,UAAU,KAAK,KAAK;AAAA,UACzC;AAAA,UACA;AAAA,UACA,WAAW,WAAW,aAAa;AAAA,UACnC,SAAS,kBAAkB;AAAA,UAC3B,gBAAgB,QAAQ,WAAW,WAAW;AAAA,UAC9C,gBAAgB,kBAAkB;AAAA,UAClC,iBAAiB,mBAAmB;AAAA,UACpC;AAAA,UACA,aAAa,QAAQ,SAAS;AAAA,UAC9B,YAAY,QAAQ,QAAQ;AAAA,UAC5B,aAAa,eAAe;AAAA,UAC5B,kBAAkB,oBAAoB,eAAe;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,wBAAwB,mBACpB,yBACA;AAAA,UACJ,uBAAuB,mBACnB,wBACA;AAAA,QACN;AACA,YAAI,wBAAwB;AAC1B,yBAAe,eAAe;AAAA,QAChC;AACA,cAAM,cAAc,MAAM,QAAQ,WAAW,WAAW,IACpD,WAAW,YACR,IAAI,CAAC,OAAQ,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI,EAAG,EACrD,OAAO,CAAC,OAAO,GAAG,MAAM,IAC3B,CAAC;AACL,YAAI,YAAY,QAAQ;AACtB,yBAAe,cAAc,MAAM,KAAK,IAAI,IAAI,WAAW,CAAC;AAAA,QAC9D;AACA,cAAM,OAAO,MAAM,QAAQ,WAAW,IAAI,IACtC,MAAM;AAAA,UACJ,IAAI;AAAA,YACF,WAAW,KACR,IAAI,CAAC,QAAS,OAAO,QAAQ,WAAW,IAAI,KAAK,IAAI,EAAG,EACxD,OAAO,CAAC,QAAQ,IAAI,MAAM;AAAA,UAC/B;AAAA,QACF,IACA,CAAC;AACL,YAAI,KAAK,QAAQ;AACf,yBAAe,OAAO;AAAA,QACxB;AACA,cAAM,aAAa,MAAM,QAAQ,WAAW,UAAU,IAClD,WAAW,WACR,IAAI,CAAC,OAAQ,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI,EAAG,EACrD,OAAO,CAAC,OAAO,GAAG,MAAM,IAC3B,CAAC;AACL,YAAI,WAAW,QAAQ;AACrB,yBAAe,SAAS,WAAW,IAAI,CAAC,eAAe;AAAA,YACrD;AAAA,YACA;AAAA,YACA;AAAA,YACA,gBAAgB,kBAAkB;AAAA,YAClC,iBAAiB,mBAAmB;AAAA,UACtC,EAAE;AAAA,QACJ;AAEA,cAAM,iBACH,MAAM,QAAQ,WAAW,QAAQ,KAAK,WAAW,SAAS,SACvD,WAAW,WACX;AAAA,UACE,mBAAmB,WAAW,aAAa,MAAM;AAAA,YAC/C,WAAW;AAAA,UACb,CAAC;AAAA,QACH,MAAM,CAAC;AACb,cAAM,gBAAuC,CAAC;AAC9C,mBAAW,WAAW,eAAe;AACnC,gBAAM,EAAE,0BAA0B,uBAAuB,IACvD,kBAAkB,OAAO;AAC3B,qBAAW,aAAa,YAAY;AAClC,kBAAM,QAAQ,QAAQ,SAAS,UAAU,EAAE,GAAG,QAAQ,KAAK;AAC3D,gBAAI,CAAC,MAAO;AACZ,kBAAM,UAAU,OAAO,KAAK;AAC5B,gBACE,OAAO,MAAM,OAAO,KACpB,CAAC,OAAO,SAAS,OAAO,KACxB,UAAU,GACV;AACA,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,kBAAM,eACJ,OAAO,UAAU,iBAAiB,YAClC,UAAU,aAAa,KAAK,EAAE,SAC1B,UAAU,aAAa,KAAK,EAAE,YAAY,IAC1C;AACN,gBAAI,CAAC,cAAc;AACjB,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA,CAAC;AAAA,cACH;AAAA,YACF;AACA,0BAAc,KAAK;AAAA,cACjB,gBAAgB,QAAQ;AAAA,cACxB,aAAa,UAAU;AAAA,cACvB;AAAA,cACA,QAAQ;AAAA,cACR,aAAa,UAAU;AAAA,cACvB,WAAW,4BAA4B;AAAA,cACvC,cAAc,0BAA0B;AAAA,YAC1C,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,eAGF,EAAE,WAAW,MAAM,YAAY,CAAC,EAAE;AACtC,YAAI;AACF,gBAAM,EAAE,QAAQ,QAAQ,IAAI,MAAM;AAAA,YAChC;AAAA,YACA;AAAA,UACF;AACA,gBAAM,YAAY,SAAS;AAC3B,cAAI,CAAC,WAAW;AACd,kBAAM;AAAA,cACJ;AAAA,gBACE;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,uBAAa,YAAY;AAEzB,qBAAW,cAAc,kBAAkB;AACzC,kBAAM,WAAW,oCAAoC;AAAA,cACnD;AAAA,cACA,UAAU,WAAW;AAAA,cACrB,cAAc,WAAW;AAAA,cACzB,WAAW,WAAW;AAAA,cACtB,UAAU,WAAW;AAAA,YACvB,CAAC;AAAA,UACH;AAEA,gBAAM,eAAuC,CAAC;AAC9C,qBAAW,WAAW,eAAe;AACnC,kBAAM,EAAE,0BAA0B,uBAAuB,IACvD,kBAAkB,OAAO;AAC3B,kBAAM,iBAA0C;AAAA,cAC9C;AAAA,cACA,MACE,QAAQ,OAAO,KAAK,KACpB,OAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,KAAK,KAC9C;AAAA,cACF,KAAK,QAAQ,KAAK,KAAK,KAAK;AAAA,cAC5B,WAAW,QAAQ,QAAQ,SAAS;AAAA,cACpC,UAAU;AAAA,cACV,cAAc,OAAO,KAAK,QAAQ,YAAY,EAAE,SAC5C,QAAQ,eACR;AAAA,cACJ,WAAW,4BAA4B;AAAA,cACvC,SAAS,0BAA0B;AAAA,YACrC;AACA,kBAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,WAGrC,oBAAoB,cAAc;AACrC,kBAAM,YAAY,eAAe,aAAa,eAAe;AAC7D,gBAAI,CAAC,WAAW;AACd,oBAAM;AAAA,gBACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,yBAAa,QAAQ,EAAE,IAAI;AAC3B,yBAAa,WAAW,KAAK,SAAS;AAAA,UACxC;AAEA,qBAAW,SAAS,eAAe;AACjC,kBAAM,YAAY,aAAa,MAAM,cAAc;AACnD,gBAAI,CAAC,UAAW;AAChB,kBAAM,eAAwC;AAAA,cAC5C;AAAA,cACA;AAAA,cACA,cAAc,MAAM;AAAA,cACpB,aAAa,MAAM;AAAA,YACrB;AACA,gBAAI,MAAM,WAAW;AACnB,2BAAa,YAAY,MAAM;AAAA,YACjC,WACE,OAAO,MAAM,iBAAiB,YAC9B,OAAO,SAAS,MAAM,YAAY,GAClC;AACA,2BAAa,UAAU,MAAM;AAAA,YAC/B;AACA,gBAAI,MAAM,gBAAgB,iBAAiB;AACzC,2BAAa,iBAAiB,MAAM;AAAA,YACtC,OAAO;AACL,2BAAa,eAAe,MAAM;AAAA,YACpC;AACA,kBAAM,WAAW,kBAAkB,YAAY;AAAA,UACjD;AAEA,cAAI,gBAAgB,cAAc,QAAQ;AACxC,kBAAM,WAAW,MAAM;AAAA,cAIrB;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,gBAC9C,MAAM,KAAK,UAAU;AAAA,kBACnB,UAAU,EAAE,QAAQ;AAAA,kBACpB;AAAA,kBACA,cAAc;AAAA,kBACd,YAAY;AAAA,gBACd,CAAC;AAAA,cACH;AAAA,cACA,EAAE,UAAU,KAAK;AAAA,YACnB;AACA,gBAAI,CAAC,SAAS,IAAI;AAChB,sBAAQ;AAAA,gBACN;AAAA,gBACA,SAAS,QAAQ;AAAA,cACnB;AAAA,YACF;AAAA,UACF;AAEA,cAAI,YAAY;AACd,gBAAI;AACF,6BAAe,WAAW,wBAAwB;AAAA,YACpD,QAAQ;AAAA,YAAe;AACvB,gBAAI;AACF,oBAAM;AAAA,gBACJ,4BAA4B,WAAW,UAAU,YAAY,WAAW,QAAQ;AAAA,gBAChF;AAAA,kBACE,QAAQ;AAAA,kBACR,MAAM,KAAK,UAAU;AAAA,oBACnB,iBAAiB;AAAA,oBACjB,mBAAmB;AAAA,kBACrB,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF,QAAQ;AACN;AAAA,gBACE;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA;AAAA,YACE,EAAE,mCAAmC,kBAAkB;AAAA,YACvD;AAAA,UACF;AACA,cAAI,YAAY;AACd,mBAAO;AAAA,cACL,gCAAgC,mBAAmB,WAAW,UAAU,CAAC;AAAA,YAC3E;AAAA,UACF,OAAO;AACL,mBAAO,KAAK,2BAA2B;AAAA,UACzC;AAAA,QACF,SAAS,KAAK;AACZ,gBAAM;AAAA,YACJ,aAAa;AAAA,YACb,aAAa;AAAA,UACf;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA,EACF,GACF,GACF;AAEJ;AAEA,eAAe,qBACb,WACA,YACe;AACf,MAAI,CAAC,aAAa,WAAW,WAAW,EAAG;AAC3C,MAAI,WAAW,QAAQ;AACrB,UAAM,iBAAiB,WAAW;AAAA,MAAI,CAAC,cACrC,QAAQ,4BAA4B,mBAAmB,SAAS,CAAC,IAAI;AAAA,QACnE,QAAQ;AAAA,MACV,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,IACrB;AACA,UAAM,QAAQ,WAAW,cAAc;AAAA,EACzC;AACA,MAAI,WAAW;AACb,UAAM,QAAQ,4BAA4B,mBAAmB,SAAS,CAAC,IAAI;AAAA,MACzE,QAAQ;AAAA,IACV,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,EACrB;AACF;AAsBA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,IAAI,KAAK;AACf,QAAM,kBAAkB,2BAA2B,OAAO,UAAU;AACpE,QAAM,eAAe,uBAAuB,OAAO,MAAM;AAEzD,SACE,qBAAC,SAAI,WAAU,mCACb;AAAA,wBAAC,QAAG,WAAU,yBACX,YAAE,oCAAoC,qBAAqB,GAC9D;AAAA,IACA,qBAAC,SAAI,WAAU,6BACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,0CAA0C,OAAO,GACtD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,iBAAiB,SAAS;AAAA,YACjC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,2CAA2C,QAAQ,GACxD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,iBAAiB,UAAU;AAAA,YAClC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,0CAA0C,OAAO,GACtD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,iBAAiB,SAAS;AAAA,YACjC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,yCAAyC,WAAW,GACzD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,iBAAiB,QAAQ;AAAA,YAChC,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,cAAc;AAAA,gBACrB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,sCAAsC,QAAQ,GACnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,cAAc,SAAS;AAAA,YAC9B,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,UAAU;AAAA,gBACjB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,SAAM,WAAU,2CACd,YAAE,qCAAqC,aAAa,GACvD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,cAAc,QAAQ;AAAA,YAC7B,UAAU,CAAC,UACT;AAAA,cACE;AAAA,cACA;AAAA,gBACE,OAAO,UAAU;AAAA,gBACjB;AAAA,gBACA,MAAM,OAAO;AAAA,cACf;AAAA,YACF;AAAA,YAEF,aAAY;AAAA;AAAA,QACd;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,IAAI,KAAK;AACf,QAAM,QAAQ;AACd,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAS,CAAC;AACtD,QAAM,iBAAiB,MAAM;AAAA,IAC3B,MACE,OAAO,YACF,SAAS,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,SAAS,KAAK,OAC1D;AAAA,IACN,CAAC,UAAU,OAAO,SAAS;AAAA,EAC7B;AACA,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO,UAAW;AACtB,QAAI,CAAC,SAAS,OAAQ;AACtB,UAAM,WAAW,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS;AACvD,QAAI,CAAC,SAAU;AACf,aAAS,aAAa,SAAS,EAAE;AAAA,EACnC,GAAG,CAAC,UAAU,UAAU,OAAO,SAAS,CAAC;AACzC,QAAM,aAAa,MAAM,QAAQ,MAAM;AACrC,UAAM,MAAM,MAAM;AAAA,MAChB,CAAC,KAAK,SAAS;AACb,YAAI,IAAI,IAAI,CAAC;AACb,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AACA,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,OAAO,MAAM;AACrD,YAAM,OAAO,oBAAoB,OAAO;AACxC,UAAI,CAAC,KAAM;AACX,YAAM,OACJ,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,SAC1C,QAAQ,KAAK,IACb;AACN,UAAI,KAAM,KAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,IAAI;AAAA,IAC3C,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,KAAK,CAAC;AAClB,QAAM,iBAAiB,MAAM;AAAA,IAC3B,MAAM,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,IACrE,CAAC,MAAM;AAAA,EACT;AACA,QAAM,wBAAwB,MAAM,OAAsB,IAAI;AAC9D,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,kBAAkB,mBAAmB,sBAAsB;AAC9D;AACF,0BAAsB,UAAU;AAChC,UAAMA,kBAAiB,MAAM,WAAW;AACxC,QAAIA,mBAAkB,WAAWA,eAAc,GAAG,OAAQ;AAC1D,UAAM,gBAAgB,MAAM;AAAA,MAC1B,CAAC,UAAU,WAAW,IAAI,KAAK,CAAC,GAAG,SAAS;AAAA,IAC9C;AACA,QAAI,iBAAiB,KAAK,kBAAkB,aAAa;AACvD,qBAAe,aAAa;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,aAAa,gBAAgB,gBAAgB,YAAY,KAAK,CAAC;AACnE,QAAM,sBAAsB,iBACxB,mBAAmB,cAAc,IACjC;AACJ,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,eAAe,MAAM,OAAQ,gBAAe,CAAC;AAAA,EACnD,GAAG,CAAC,aAAa,MAAM,MAAM,CAAC;AAE9B,QAAM,iBAAiB,MAAM,WAAW,KAAK,MAAM,CAAC;AAEpD,QAAM,aAAa,MAAM;AAAA,IACvB,MAAO,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AAAA,IAC/D,CAAC,OAAO,UAAU;AAAA,EACpB;AAEA,QAAM,yBAAyB,MAAM;AAAA,IACnC,CAAC,cAAkC;AACjC,eAAS,cAAc,SAAS;AAChC,YAAM,aAAa,UAAU;AAAA,QAC3B,CAAC,SAAS,KAAK,OAAO,OAAO;AAAA,MAC/B;AACA,UAAI,CAAC,YAAY;AACf,cAAM,aAAa,UAAU,CAAC,GAAG,MAAM;AACvC,iBAAS,kBAAkB,UAAU;AACrC,YAAI,cAAc,UAAU,CAAC,GAAG;AAC9B;AAAA,YACE;AAAA,YACA,wBAAwB,YAAY;AAAA,cAClC,MAAM,0BAA0B,UAAU,CAAC,EAAE,QAAQ;AAAA,YACvD,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,mBAAS,mBAAmB,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,UAAU,OAAO,cAAc;AAAA,EAClC;AAEA,QAAM,2BAA2B,MAAM;AAAA,IACrC,CAAC,iBAAgC;AAC/B,eAAS,kBAAkB,YAAY;AACvC,UAAI,CAAC,cAAc;AACjB,iBAAS,mBAAmB,EAAE;AAC9B;AAAA,MACF;AACA,YAAM,SAAS,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,YAAY;AACjE,UAAI,QAAQ;AACV;AAAA,UACE;AAAA,UACA,wBAAwB,OAAO,IAAI;AAAA,YACjC,MAAM,0BAA0B,OAAO,QAAQ;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,YAAY,QAAQ;AAAA,EACvB;AAEA,QAAM,iBAAiB,MAAM,YAAY,MAAM;AAC7C,UAAM,oBAAoB,MAAM,QAAQ,OAAO,OAAO,IAClD,OAAO,UACP,CAAC;AACL,QAAI,CAAC,OAAO,eAAe,CAAC,kBAAkB,QAAQ;AACpD,UAAI,CAAC,OAAO,YAAY,CAAC,OAAO,SAAS,QAAQ;AAC/C,iBAAS,YAAY;AAAA,UACnB,mBAAmB,OAAO,aAAa,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,QAClE,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,UAAM,SAAS,yBAAyB,iBAAiB;AACzD,UAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AACrE,UAAM,gBAAgB,IAAI;AAAA,MACxB,SAAS,IAAI,CAAC,YAAY;AAAA,QACxB,qBAAqB,QAAQ,YAAY;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,aAAa,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS;AAC7D,QAAI,UAAU,SAAS,WAAW,OAAO;AACzC,UAAM,eAA+B,OAAO,IAAI,CAAC,OAAO,UAAU;AAChE,YAAM,MAAM,qBAAqB,KAAK;AACtC,YAAM,gBAAgB,cAAc,IAAI,GAAG;AAC3C,UAAI,eAAe;AACjB,YAAI,cAAc,UAAW,cAAa;AAC1C,YAAI,CAAC,qBAAqB,cAAc,cAAc,KAAK,GAAG;AAC5D,oBAAU;AACV,iBAAO,EAAE,GAAG,eAAe,cAAc,MAAM;AAAA,QACjD;AACA,YAAI,SAAS,KAAK,MAAM,eAAe;AACrC,oBAAU;AAAA,QACZ;AACA,eAAO;AAAA,MACT;AACA,gBAAU;AACV,aAAO,mBAAmB,OAAO,aAAa,MAAM;AAAA,QAClD,OAAO,OAAO,OAAO,KAAK,EAAE,KAAK,KAAK;AAAA,QACtC,cAAc;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,aAAa,OAAQ;AAC1B,QAAI,CAAC,YAAY;AACf,gBAAU;AACV,mBAAa,CAAC,IAAI,EAAE,GAAG,aAAa,CAAC,GAAG,WAAW,KAAK;AAAA,IAC1D;AACA,QAAI,SAAS;AACX,eAAS,YAAY,YAAY;AAAA,IACnC;AAAA,EACF,GAAG;AAAA,IACD,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM;AACpB,mBAAe;AAAA,EACjB,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAO,UAAW;AACvB,UAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC;AACrE,QAAI,CAAC,SAAS,OAAQ;AACtB,QAAI,UAAU;AACd,UAAM,eAAe,SAAS,IAAI,CAAC,YAAY;AAC7C,UAAI,QAAQ,UAAW,QAAO;AAC9B,gBAAU;AACV,aAAO,EAAE,GAAG,SAAS,WAAW,OAAO,UAAU;AAAA,IACnD,CAAC;AACD,QAAI,SAAS;AACX,eAAS,YAAY,YAAY;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,CAAC;AAChD,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,WAAmB,OAA2B,UAAmB;AAChE,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,GAAG;AAAA,QACnE,CAAC,YAAY;AACX,cAAI,QAAQ,OAAO,UAAW,QAAO;AACrC,iBAAO,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,MAAM;AAAA,QACtC;AAAA,MACF;AACA,eAAS,YAAY,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,WAAmB,aAAqB,WAAmB;AAC1D,UAAI,OAAO,KAAK,EAAE,WAAW,GAAG,EAAG;AACnC,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,GAAG;AAAA,QACnE,CAAC,YAAY;AACX,cAAI,QAAQ,OAAO,UAAW,QAAO;AACrC,gBAAM,aAAa,EAAE,GAAI,QAAQ,UAAU,CAAC,EAAG;AAC/C,cAAI,WAAW,IAAI;AACjB,mBAAO,WAAW,WAAW;AAAA,UAC/B,OAAO;AACL,uBAAW,WAAW,IAAI,EAAE,OAAO;AAAA,UACrC;AACA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA,eAAS,YAAY,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,qBAAqB,MAAM;AAAA,IAC/B,CAAC,cAAsB;AACrB,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,GAAG;AAAA,QACnE,CAAC,aAAa;AAAA,UACZ,GAAG;AAAA,UACH,WAAW,QAAQ,OAAO;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,YAAY,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,OAAO,UAAU,QAAQ;AAAA,EAC5B;AAEA,QAAM,0BAA0B,MAAM;AAAA,IACpC,CAAC,UAAkB,UAAkB;AACnC,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,QACjE,CAAC,WAAW;AACV,cAAI,OAAO,OAAO,SAAU,QAAO;AACnC,iBAAO,EAAE,GAAG,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,SAAS,QAAQ;AAAA,EAC3B;AAEA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,UAAkB,WAAqB;AACtC,YAAM,aAAa,OAChB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,UAAU,MAAM,MAAM;AACjC,YAAM,SAAS,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC;AAC7C,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,QACjE,CAAC,WAAW;AACV,cAAI,OAAO,OAAO,SAAU,QAAO;AACnC,gBAAM,kBAAkB,IAAI;AAAA,YAC1B,OAAO,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,OAAO,KAAK,CAAC;AAAA,UACnD;AACA,gBAAM,aAAa,OAAO;AAAA,YACxB,CAAC,UACC,gBAAgB,IAAI,KAAK,KAAK,EAAE,IAAI,cAAc,GAAG,MAAM;AAAA,UAC/D;AACA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AACA,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,SAAS,QAAQ;AAAA,EAC3B;AAEA,QAAM,YAAY,MAAM,YAAY,MAAM;AACxC,UAAM,OAAO;AAAA,MACX,GAAI,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC;AAAA,MACtD,EAAE,IAAI,cAAc,GAAG,OAAO,IAAI,QAAQ,CAAC,EAAE;AAAA,IAC/C;AACA,aAAS,WAAW,IAAI;AAAA,EAC1B,GAAG,CAAC,OAAO,SAAS,QAAQ,CAAC;AAE7B,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,aAAqB;AACpB,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,QACjE,CAAC,WAAW,OAAO,OAAO;AAAA,MAC5B;AACA,eAAS,WAAW,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,OAAO,SAAS,QAAQ;AAAA,EAC3B;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,wBAAC,SAAI,WAAU,gDACZ,gBAAM,IAAI,CAAC,MAAM,UAChB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,QACZ,oBACA;AAAA,QACN;AAAA,QACA,SAAS,MAAM,eAAe,KAAK;AAAA,QAElC;AAAA,mBAAS,aACR,EAAE,yCAAyC,cAAc;AAAA,UAC1D,SAAS,cACR,EAAE,0CAA0C,UAAU;AAAA,UACvD,SAAS,SACR,EAAE,8BAA8B,kBAAkB;AAAA,UACnD,SAAS,cACR,EAAE,0CAA0C,UAAU;AAAA,WACtD,WAAW,IAAI,GAAG,UAAU,KAAK,IACjC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA;AAAA,UACd,IACE;AAAA,UACH,gBAAgB,QACf,oBAAC,UAAK,WAAU,kEAAiE,IAC/E;AAAA;AAAA;AAAA,MA5BC;AAAA,IA6BP,CACD,GACH;AAAA,IAEC,mBAAmB,YAClB,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAM,WAAU,2BACd;AAAA,YAAE,+BAA+B,OAAO;AAAA,UACzC,oBAAC,UAAK,WAAU,gBAAe,eAAC;AAAA,WAClC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,UAAU,SAAS,SAAS,MAAM,OAAO,KAAK;AAAA,YACzD,aAAa;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACC,OAAO,QACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,OAAM,IAChD;AAAA,SACN;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,SACE,YAAE,qCAAqC,aAAa,GACvD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,SAAS,eAAe,CAAC,OAAO,WAAW;AAAA,cAC1D,WAAU;AAAA,cAET;AAAA,uBAAO,cACN,oBAAC,aAAU,WAAU,WAAU,IAE/B,oBAAC,YAAS,WAAU,WAAU;AAAA,gBAE/B,OAAO,cACJ;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF,IACA;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA;AAAA,UACN;AAAA,WACF;AAAA,QACC,OAAO,cACN;AAAA,UAAC;AAAA;AAAA,YACC,mBAAgB;AAAA,YAChB,WAAU;AAAA,YAEV;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,OAAO;AAAA,gBACd,QAAQ;AAAA,gBACR,UAAU,CAAC,QAAQ,SAAS,eAAe,OAAO,EAAE;AAAA,gBACpD,gBAAgB,EAAE,eAAe,CAAC,EAAE;AAAA;AAAA,YACtC;AAAA;AAAA,QACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,OAAO;AAAA,YACd,UAAU,CAAC,UACT,SAAS,eAAe,MAAM,OAAO,KAAK;AAAA,YAE5C,aAAa;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,EAAE,QAAQ;AAAA,UACpB,eAAe,OAAO;AAAA,UACtB,OAAO;AAAA,UACP,gBAAgB,OAAO,kBAAkB;AAAA,UACzC,eAAe;AAAA,UACf,iBAAiB;AAAA;AAAA,MACnB;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF,IACE;AAAA,IAEH,mBAAmB,aAClB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,IACE;AAAA,IAEH,mBAAmB,QAClB;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAQ;AAAA;AAAA,IACV,IACE;AAAA,IAEH,mBAAmB,aAClB,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,WAAM,WAAU,+CACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,OAAO;AAAA,YAChB,UAAU,CAAC,UACT,SAAS,eAAe,MAAM,OAAO,OAAO;AAAA;AAAA,QAEhD;AAAA,QACC;AAAA,UACC;AAAA,UACA;AAAA,QACF;AAAA,SACF;AAAA,MAEC,OAAO,cACN,qBAAC,SAAI,WAAU,mCACb;AAAA,6BAAC,SAAI,WAAU,qCACb;AAAA,8BAAC,QAAG,WAAU,yBACX;AAAA,YACC;AAAA,YACA;AAAA,UACF,GACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cAET;AAAA,oCAAC,QAAK,WAAU,gBAAe;AAAA,gBAC9B;AAAA,kBACC;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,WACF;AAAA,SACE,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,UAAU,CAAC,GAAG;AAAA,UACrD,CAAC,WACC,qBAAC,SAAoB,WAAU,8BAC7B;AAAA,iCAAC,SAAI,WAAU,2BACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,OAAO;AAAA,kBACd,UAAU,CAAC,UACT,wBAAwB,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,kBAEvD,aAAa;AAAA,oBACX;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,WAAU;AAAA;AAAA,cACZ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,SAAS,MAAM,aAAa,OAAO,EAAE;AAAA,kBAErC,8BAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA,YACA,qBAAC,SAAI,WAAU,kBACb;AAAA,kCAAC,SAAM,WAAU,2CACd;AAAA,gBACC;AAAA,gBACA;AAAA,cACF,GACF;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK;AAAA,kBAC/C,UAAU,CAAC,WACT,gBAAgB,OAAO,IAAI,MAAM;AAAA,kBAEnC,aAAa;AAAA,oBACX;AAAA,oBACA;AAAA,kBACF;AAAA;AAAA,cACF;AAAA,eACF;AAAA,eAvCQ,OAAO,EAwCjB;AAAA,QAEJ;AAAA,QACC,CAAC,OAAO,SAAS,SAChB,oBAAC,OAAE,WAAU,iCACV;AAAA,UACC;AAAA,UACA;AAAA,QACF,GACF,IACE;AAAA,SACN,IACE;AAAA,MAEJ,qBAAC,SAAI,WAAU,qBACb;AAAA,4BAAC,SAAI,WAAU,0BACb,+BAAC,WAAM,WAAU,4DACf;AAAA,8BAAC,WAAM,WAAU,eACf,+BAAC,QACC;AAAA,gCAAC,QAAG,WAAU,uBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,uBACX,YAAE,kCAAkC,eAAe,GACtD;AAAA,YACA,oBAAC,QAAG,WAAU,uBACX,YAAE,+CAA+C,KAAK,GACzD;AAAA,YACA,oBAAC,QAAG,WAAU,uBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACC,WAAW,IAAI,CAAC,SACf,oBAAC,QAAiB,WAAU,uBAC1B,+BAAC,SAAI,WAAU,uBACb;AAAA,mCAAC,SAAI,WAAU,2BACb;AAAA,oCAAC,UACE;AAAA,kBACC;AAAA,kBACA;AAAA,gBACF,EAAE,QAAQ,aAAa,KAAK,KAAK,GACnC;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OACE,KAAK,gBAAgB,kBACjB;AAAA,sBACE;AAAA,sBACA;AAAA,oBACF,IACA;AAAA,sBACE;AAAA,sBACA;AAAA,oBACF;AAAA,oBAEN,WAAU;AAAA,oBAET,eAAK,gBAAgB,kBAAkB,WAAM;AAAA;AAAA,gBAChD;AAAA,iBACF;AAAA,cACA,oBAAC,UAAK,WAAU,iCACb,eAAK,cAAc,YAAY,KAC9B;AAAA,gBACE;AAAA,gBACA;AAAA,cACF,GACJ;AAAA,eACF,KAjCO,KAAK,EAkCd,CACD;AAAA,YACD,oBAAC,QAAG,WAAU,yBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACX;AAAA,cACC;AAAA,cACA;AAAA,YACF,GACF;AAAA,aACF,GACF;AAAA,UACA,oBAAC,WACG,iBAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,SAAS,SAChD,OAAO,WACP;AAAA,YACE,mBAAmB,OAAO,aAAa,MAAM;AAAA,cAC3C,WAAW;AAAA,YACb,CAAC;AAAA,UACH,GACF,IAAI,CAAC,YACL,qBAAC,QAAoB,WAAU,YAC7B;AAAA,iCAAC,QAAG,WAAU,aACZ;AAAA,mCAAC,WAAM,WAAU,0CACf;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,SAAS,QAAQ;AAAA,oBACjB,UAAU,MAAM,mBAAmB,QAAQ,EAAE;AAAA;AAAA,gBAC/C;AAAA,gBACC,QAAQ,YACL;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF,IACA;AAAA,kBACE;AAAA,kBACA;AAAA,gBACF;AAAA,iBACN;AAAA,cACC,OAAO,eAAe,QAAQ,eAC7B,oBAAC,OAAE,WAAU,iCACV,iBAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,KAAK,GACjD,IACE;AAAA,eACN;AAAA,YACA,oBAAC,QAAG,WAAU,aACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,QAAQ;AAAA,gBACf,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,aACZ;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,QAAQ;AAAA,gBACf,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,aAAa;AAAA,kBACX;AAAA,kBACA;AAAA,gBACF;AAAA;AAAA,YACF,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,aACZ;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,QAAQ,aAAa;AAAA,gBAC5B,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO,SAAS;AAAA,gBACxB;AAAA,gBAEF,UAAU,CAAC,SAAS;AAAA,gBAEpB;AAAA,sCAAC,YAAO,OAAM,IACX,gCACG;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF,EAAE,QAAQ,aAAa,mBAAmB,IAC1C;AAAA,oBACE;AAAA,oBACA;AAAA,kBACF,GACN;AAAA,kBACC,SAAS,IAAI,CAAC,SACb,oBAAC,YAAqB,OAAO,KAAK,IAC/B,6BAAmB,IAAI,KADb,KAAK,EAElB,CACD;AAAA;AAAA;AAAA,YACH,GACF;AAAA,YACC,WAAW,IAAI,CAAC,SACf,oBAAC,QAAiB,WAAU,aAC1B,+BAAC,SAAI,WAAU,2BACb;AAAA,kCAAC,UAAK,WAAU,iCACb,eAAK,gBAAgB,UACxB;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,OAAO,QAAQ,SAAS,KAAK,EAAE,GAAG,UAAU;AAAA,kBAC5C,UAAU,CAAC,UACT;AAAA,oBACE,QAAQ;AAAA,oBACR,KAAK;AAAA,oBACL,MAAM,OAAO;AAAA,kBACf;AAAA,kBAEF,aAAY;AAAA,kBACZ,KAAK;AAAA;AAAA,cACP;AAAA,eACF,KAnBO,KAAK,EAoBd,CACD;AAAA,YACD,oBAAC,QAAG,WAAU,yBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,QAAQ;AAAA,gBACjB,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,UAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,QAAQ;AAAA,gBACjB,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,UAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT,GACF;AAAA,YACA,oBAAC,QAAG,WAAU,yBACZ;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,QAAQ;AAAA,gBACjB,UAAU,CAAC,UACT;AAAA,kBACE,QAAQ;AAAA,kBACR;AAAA,kBACA,MAAM,OAAO;AAAA,gBACf;AAAA,gBAEF,UAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACT,GACF;AAAA,eA9JO,QAAQ,EA+JjB,CACD,GACH;AAAA,WACF,GACF;AAAA,QACC,CAAC,WAAW,SACX,qBAAC,SAAI,WAAU,4EACb;AAAA,8BAAC,eAAY,WAAU,WAAU;AAAA,UAChC;AAAA,YACC;AAAA,YACA;AAAA,UACF;AAAA,WACF,IACE;AAAA,SACN;AAAA,OACF,IACE;AAAA,IAEJ,qBAAC,SAAI,WAAU,sCACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MAAM,eAAe,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAAA,UAC1D,UAAU,gBAAgB;AAAA,UAC1B,WAAU;AAAA,UAEV;AAAA,gCAAC,eAAY,WAAU,WAAU;AAAA,YAChC,EAAE,0CAA0C,UAAU;AAAA;AAAA;AAAA,MACzD;AAAA,MACC,mBAAmB,aAClB;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,MACP,eAAe,KAAK,IAAI,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC;AAAA,UAE5D,WAAU;AAAA,UAET;AAAA,cAAE,0CAA0C,UAAU;AAAA,YACvD,oBAAC,gBAAa,WAAU,WAAU;AAAA;AAAA;AAAA,MACpC,IAEA,oBAAC,UAAK;AAAA,OAEV;AAAA,KACF;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,IAAI,KAAK;AACf,QAAM,cAAc,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;AACxE,QAAM,cAAc,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AACtE,QAAM,uBAAuB,MAAM,OAAO,YAAY,KAAK,EAAE,WAAW,CAAC;AAEzE,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,qBAAqB,QAAS;AACnC,UAAM,kBAAkB,YAAY,KAAK;AACzC,QAAI,CAAC,iBAAiB;AACpB,UAAI,aAAa;AACf,iBAAS,UAAU,EAAE;AAAA,MACvB;AACA;AAAA,IACF;AACA,UAAM,aAAa,QAAQ,eAAe;AAC1C,QAAI,eAAe,aAAa;AAC9B,eAAS,UAAU,UAAU;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,QAAQ,CAAC;AAEvC,QAAM,0BAA0B,MAAM;AAAA,IACpC,CAAC,UAA+C;AAC9C,YAAM,YAAY,MAAM,OAAO;AAC/B,2BAAqB,UAAU,UAAU,KAAK,EAAE,WAAW;AAC3D,eAAS,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,uBAAuB,MAAM,YAAY,MAAM;AACnD,UAAM,OAAO,QAAQ,WAAW;AAChC,yBAAqB,UAAU;AAC/B,aAAS,UAAU,IAAI;AAAA,EACzB,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,SAAO,YAAE,kCAAkC,UAAU,GAAE;AAAA,MACxD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,UAC/D,UAAU,CAAC,UAAU,SAAS,YAAY,MAAM,OAAO,KAAK;AAAA,UAC5D,aAAa;AAAA,YACX;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACC,OAAO,WACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,UAAS,IACnD;AAAA,OACN;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,SAAO,YAAE,gCAAgC,QAAQ,GAAE;AAAA,MACpD,qBAAC,SAAI,WAAU,cACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV,aAAa;AAAA,cACX;AAAA,cACA;AAAA,YACF;AAAA,YACA,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS;AAAA,YAER,YAAE,kDAAkD,UAAU;AAAA;AAAA,QACjE;AAAA,SACF;AAAA,MACA,oBAAC,OAAE,WAAU,iCACV;AAAA,QACC;AAAA,QACA;AAAA,MACF,GACF;AAAA,MACC,OAAO,SACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,QAAO,IACjD;AAAA,OACN;AAAA,IAEA,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,2CACb;AAAA,4BAAC,SACE,YAAE,0CAA0C,WAAW,GAC1D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAM;AACb,kBAAI,OAAO,WAAW,aAAa;AACjC,uBAAO;AAAA,kBACL;AAAA,kBACA;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO;AAAA,cACL;AAAA,cACA;AAAA,YACF;AAAA,YACA,WAAU;AAAA,YAEV;AAAA,kCAAC,YAAS,WAAU,WAAU;AAAA,cAC9B,oBAAC,UAAK,WAAU,WACb;AAAA,gBACC;AAAA,gBACA;AAAA,cACF,GACF;AAAA;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,OAAO,aAAa;AAAA,UAC3B,UAAU,CAAC,UACT,SAAS,aAAa,MAAM,OAAO,SAAS,IAAI;AAAA,UAElD,UAAU,CAAC,SAAS;AAAA,UAEpB;AAAA,gCAAC,YAAO,OAAM,IACX,mBAAS,SACN;AAAA,cACE;AAAA,cACA;AAAA,YACF,IACA;AAAA,cACE;AAAA,cACA;AAAA,YACF,GACN;AAAA,YACC,SAAS,IAAI,CAAC,SACb,oBAAC,YAAqB,OAAO,KAAK,IAC/B,6BAAmB,IAAI,KADb,KAAK,EAElB,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MACA,oBAAC,OAAE,WAAU,iCACV,mBAAS,SACN;AAAA,QACE;AAAA,QACA;AAAA,MACF,IACA;AAAA,QACE;AAAA,QACA;AAAA,MACF,GACN;AAAA,MACC,OAAO,YACN,oBAAC,OAAE,WAAU,wBAAwB,iBAAO,WAAU,IACpD;AAAA,OACN;AAAA,KACF;AAEJ;",
6
6
  "names": ["currentStepKey"]
7
7
  }
@@ -199,7 +199,7 @@ async function resolveScopedTaxRate(em, taxRateId, taxRateInput, organizationId,
199
199
  return { taxRateId, taxRate: record.rate ?? normalizedRate };
200
200
  }
201
201
  function slugifyCode(input) {
202
- return input.toLowerCase().trim().replace(/[^a-z0-9\-]+/g, "-").replace(/^-+|-+$/g, "");
202
+ return input.toLowerCase().trim().replace(/[^a-z0-9\-]+/g, "-").replace(/(?:^-+|-+$)/g, "");
203
203
  }
204
204
  function normalizeCatalogOptionSchema(input) {
205
205
  if (!input || !Array.isArray(input.options) || !input.options.length)