flowbite-react
Version:
Official React components built for Flowbite and Tailwind CSS
1 lines • 15.1 kB
Source Map (JSON)
{"version":3,"file":"compound-components.cjs","sources":["../../../src/cli/transformers/compound-components.ts"],"sourcesContent":["import MagicString from \"magic-string\";\nimport { parseSync, Visitor } from \"oxc-parser\";\nimport type { Transformer } from \"../commands/migrate\";\n\nconst COMPOUND_TO_SIMPLE_MAP: Record<string, string> = {\n // Accordion\n \"Accordion.Panel\": \"AccordionPanel\",\n \"Accordion.Title\": \"AccordionTitle\",\n \"Accordion.Content\": \"AccordionContent\",\n\n // Avatar\n \"Avatar.Group\": \"AvatarGroup\",\n \"Avatar.Counter\": \"AvatarGroupCounter\",\n\n // Banner\n \"Banner.CollapseButton\": \"BannerCollapseButton\",\n\n // Breadcrumb\n \"Breadcrumb.Item\": \"BreadcrumbItem\",\n\n // Button\n \"Button.Group\": \"ButtonGroup\",\n\n // Clipboard\n \"Clipboard.WithIcon\": \"ClipboardWithIcon\",\n \"Clipboard.WithIconText\": \"ClipboardWithIconText\",\n\n // Drawer\n \"Drawer.Header\": \"DrawerHeader\",\n \"Drawer.Items\": \"DrawerItems\",\n\n // Dropdown\n \"Dropdown.Item\": \"DropdownItem\",\n \"Dropdown.Header\": \"DropdownHeader\",\n \"Dropdown.Divider\": \"DropdownDivider\",\n\n // Footer\n \"Footer.Brand\": \"FooterBrand\",\n \"Footer.Copyright\": \"FooterCopyright\",\n \"Footer.Divider\": \"FooterDivider\",\n \"Footer.Icon\": \"FooterIcon\",\n \"Footer.Link\": \"FooterLink\",\n \"Footer.LinkGroup\": \"FooterLinkGroup\",\n \"Footer.Title\": \"FooterTitle\",\n\n // HR\n \"HR.Icon\": \"HRIcon\",\n \"HR.Square\": \"HRSquare\",\n \"HR.Text\": \"HRText\",\n \"HR.Trimmed\": \"HRTrimmed\",\n\n // List\n \"List.Item\": \"ListItem\",\n \"ListGroup.Item\": \"ListGroupItem\",\n\n // MegaMenu\n \"MegaMenu.Dropdown\": \"MegaMenuDropdown\",\n \"MegaMenu.DropdownToggle\": \"MegaMenuDropdownToggle\",\n\n // Modal\n \"Modal.Header\": \"ModalHeader\",\n \"Modal.Body\": \"ModalBody\",\n \"Modal.Footer\": \"ModalFooter\",\n\n // Navbar\n \"Navbar.Brand\": \"NavbarBrand\",\n \"Navbar.Collapse\": \"NavbarCollapse\",\n \"Navbar.Link\": \"NavbarLink\",\n \"Navbar.Toggle\": \"NavbarToggle\",\n\n // Pagination\n \"Pagination.Button\": \"PaginationButton\",\n\n // Rating\n \"Rating.Star\": \"RatingStar\",\n \"Rating.Advanced\": \"RatingAdvanced\",\n\n // Sidebar\n \"Sidebar.CTA\": \"SidebarCTA\",\n \"Sidebar.Collapse\": \"SidebarCollapse\",\n \"Sidebar.Item\": \"SidebarItem\",\n \"Sidebar.Items\": \"SidebarItems\",\n \"Sidebar.ItemGroup\": \"SidebarItemGroup\",\n \"Sidebar.Logo\": \"SidebarLogo\",\n\n // Table\n \"Table.Head\": \"TableHead\",\n \"Table.Body\": \"TableBody\",\n \"Table.Row\": \"TableRow\",\n \"Table.Cell\": \"TableCell\",\n \"Table.HeadCell\": \"TableHeadCell\",\n\n // Tabs\n \"Tabs.Item\": \"TabItem\",\n\n // Timeline\n \"Timeline.Item\": \"TimelineItem\",\n \"Timeline.Point\": \"TimelinePoint\",\n \"Timeline.Content\": \"TimelineContent\",\n \"Timeline.Time\": \"TimelineTime\",\n \"Timeline.Title\": \"TimelineTitle\",\n \"Timeline.Body\": \"TimelineBody\",\n\n // Toast\n \"Toast.Toggle\": \"ToastToggle\",\n};\n\ninterface SpecifierInfo {\n name: string;\n originalText: string;\n}\n\ninterface ImportInfo {\n start: number;\n end: number;\n specifiersStart: number;\n specifiersEnd: number;\n specifiers: SpecifierInfo[];\n source: string;\n}\n\ninterface Replacement {\n start: number;\n end: number;\n newText: string;\n}\n\nfunction transform(content: string): { content: string; changed: boolean } {\n try {\n const result = parseSync(\"file.tsx\", content);\n\n if (result.errors.length > 0) {\n console.warn(\"Warning: Parsing errors detected, skipping transformation\");\n return { content, changed: false };\n }\n\n const flowbiteImportSpecifiers: string[] = [];\n const flowbiteImportInfos: ImportInfo[] = [];\n const replacements: Replacement[] = [];\n const newImportsToAdd: Set<string> = new Set();\n\n const importVisitor = new Visitor({\n ImportDeclaration(node) {\n if (\n node.source?.value === \"flowbite-react\" ||\n (typeof node.source?.value === \"string\" && node.source.value.startsWith(\"flowbite-react/components/\"))\n ) {\n if (Array.isArray(node.specifiers) && node.specifiers.every((s) => s.type === \"ImportSpecifier\")) {\n const importText = content.slice(node.start, node.end);\n const braceStart = importText.indexOf(\"{\");\n const braceEnd = importText.lastIndexOf(\"}\");\n\n if (braceStart !== -1 && braceEnd !== -1) {\n const importInfo: ImportInfo = {\n start: node.start,\n end: node.end,\n specifiersStart: node.start + braceStart + 1,\n specifiersEnd: node.start + braceEnd,\n specifiers: [],\n source: node.source?.value as string,\n };\n\n node.specifiers.forEach((specifier) => {\n if (specifier.imported?.type === \"Identifier\") {\n flowbiteImportSpecifiers.push(specifier.imported.name);\n importInfo.specifiers.push({\n name: specifier.imported.name,\n originalText: content.slice(specifier.start, specifier.end),\n });\n }\n });\n\n flowbiteImportInfos.push(importInfo);\n }\n }\n }\n },\n });\n\n importVisitor.visit(result.program);\n\n const jsxVisitor = new Visitor({\n JSXMemberExpression(node) {\n if (\n node.object?.type === \"JSXIdentifier\" &&\n node.property?.type === \"JSXIdentifier\" &&\n flowbiteImportSpecifiers.includes(node.object.name)\n ) {\n const compoundName = `${node.object.name}.${node.property.name}`;\n const simpleName = COMPOUND_TO_SIMPLE_MAP[compoundName];\n\n if (simpleName && flowbiteImportInfos.length > 0) {\n replacements.push({\n start: node.start,\n end: node.end,\n newText: simpleName,\n });\n\n if (!flowbiteImportSpecifiers.includes(simpleName) && !newImportsToAdd.has(simpleName)) {\n newImportsToAdd.add(simpleName);\n }\n }\n }\n },\n });\n\n jsxVisitor.visit(result.program);\n\n if (replacements.length === 0) {\n return { content, changed: false };\n }\n\n const finalImportInfo =\n flowbiteImportInfos.find((info) => info.source === \"flowbite-react\") || flowbiteImportInfos[0] || null;\n const s = new MagicString(content);\n\n const sortedReplacements = [...replacements].sort((a, b) => b.start - a.start);\n for (const { start, end, newText } of sortedReplacements) {\n s.overwrite(start, end, newText);\n }\n\n if (newImportsToAdd.size > 0 && finalImportInfo) {\n const existingSpecifierTexts = finalImportInfo.specifiers.map((s) => s.originalText);\n const existingNames = new Set(finalImportInfo.specifiers.map((s) => s.name));\n const newSpecifierNames = [...newImportsToAdd].filter((name) => !existingNames.has(name));\n const allSpecifiers = [\n ...existingSpecifierTexts.map((text, i) => ({ text, name: finalImportInfo.specifiers[i].name })),\n ...newSpecifierNames.map((name) => ({ text: name, name })),\n ].sort((a, b) => a.name.localeCompare(b.name));\n const originalImportText = content.slice(finalImportInfo.specifiersStart, finalImportInfo.specifiersEnd);\n const isMultiline = originalImportText.includes(\"\\n\");\n\n let newSpecifiersText: string;\n if (isMultiline) {\n newSpecifiersText = \"\\n \" + allSpecifiers.map((s) => s.text).join(\",\\n \") + \",\\n\";\n } else {\n newSpecifiersText = \" \" + allSpecifiers.map((s) => s.text).join(\", \") + \" \";\n }\n\n s.overwrite(finalImportInfo.specifiersStart, finalImportInfo.specifiersEnd, newSpecifiersText);\n }\n\n return {\n content: s.toString(),\n changed: true,\n };\n } catch (_error) {\n console.warn(\"Warning: Could not parse file, skipping transformation\");\n return {\n content,\n changed: false,\n };\n }\n}\n\nexport const compoundComponentsTransformer: Transformer = {\n name: \"Compound Components\",\n transform,\n};\n"],"names":["parseSync","Visitor"],"mappings":";;;;;AAGA,MAAM,sBAAsB,GAAG;AAC/B;AACA,EAAE,iBAAiB,EAAE,gBAAgB;AACrC,EAAE,iBAAiB,EAAE,gBAAgB;AACrC,EAAE,mBAAmB,EAAE,kBAAkB;AACzC;AACA,EAAE,cAAc,EAAE,aAAa;AAC/B,EAAE,gBAAgB,EAAE,oBAAoB;AACxC;AACA,EAAE,uBAAuB,EAAE,sBAAsB;AACjD;AACA,EAAE,iBAAiB,EAAE,gBAAgB;AACrC;AACA,EAAE,cAAc,EAAE,aAAa;AAC/B;AACA,EAAE,oBAAoB,EAAE,mBAAmB;AAC3C,EAAE,wBAAwB,EAAE,uBAAuB;AACnD;AACA,EAAE,eAAe,EAAE,cAAc;AACjC,EAAE,cAAc,EAAE,aAAa;AAC/B;AACA,EAAE,eAAe,EAAE,cAAc;AACjC,EAAE,iBAAiB,EAAE,gBAAgB;AACrC,EAAE,kBAAkB,EAAE,iBAAiB;AACvC;AACA,EAAE,cAAc,EAAE,aAAa;AAC/B,EAAE,kBAAkB,EAAE,iBAAiB;AACvC,EAAE,gBAAgB,EAAE,eAAe;AACnC,EAAE,aAAa,EAAE,YAAY;AAC7B,EAAE,aAAa,EAAE,YAAY;AAC7B,EAAE,kBAAkB,EAAE,iBAAiB;AACvC,EAAE,cAAc,EAAE,aAAa;AAC/B;AACA,EAAE,SAAS,EAAE,QAAQ;AACrB,EAAE,WAAW,EAAE,UAAU;AACzB,EAAE,SAAS,EAAE,QAAQ;AACrB,EAAE,YAAY,EAAE,WAAW;AAC3B;AACA,EAAE,WAAW,EAAE,UAAU;AACzB,EAAE,gBAAgB,EAAE,eAAe;AACnC;AACA,EAAE,mBAAmB,EAAE,kBAAkB;AACzC,EAAE,yBAAyB,EAAE,wBAAwB;AACrD;AACA,EAAE,cAAc,EAAE,aAAa;AAC/B,EAAE,YAAY,EAAE,WAAW;AAC3B,EAAE,cAAc,EAAE,aAAa;AAC/B;AACA,EAAE,cAAc,EAAE,aAAa;AAC/B,EAAE,iBAAiB,EAAE,gBAAgB;AACrC,EAAE,aAAa,EAAE,YAAY;AAC7B,EAAE,eAAe,EAAE,cAAc;AACjC;AACA,EAAE,mBAAmB,EAAE,kBAAkB;AACzC;AACA,EAAE,aAAa,EAAE,YAAY;AAC7B,EAAE,iBAAiB,EAAE,gBAAgB;AACrC;AACA,EAAE,aAAa,EAAE,YAAY;AAC7B,EAAE,kBAAkB,EAAE,iBAAiB;AACvC,EAAE,cAAc,EAAE,aAAa;AAC/B,EAAE,eAAe,EAAE,cAAc;AACjC,EAAE,mBAAmB,EAAE,kBAAkB;AACzC,EAAE,cAAc,EAAE,aAAa;AAC/B;AACA,EAAE,YAAY,EAAE,WAAW;AAC3B,EAAE,YAAY,EAAE,WAAW;AAC3B,EAAE,WAAW,EAAE,UAAU;AACzB,EAAE,YAAY,EAAE,WAAW;AAC3B,EAAE,gBAAgB,EAAE,eAAe;AACnC;AACA,EAAE,WAAW,EAAE,SAAS;AACxB;AACA,EAAE,eAAe,EAAE,cAAc;AACjC,EAAE,gBAAgB,EAAE,eAAe;AACnC,EAAE,kBAAkB,EAAE,iBAAiB;AACvC,EAAE,eAAe,EAAE,cAAc;AACjC,EAAE,gBAAgB,EAAE,eAAe;AACnC,EAAE,eAAe,EAAE,cAAc;AACjC;AACA,EAAE,cAAc,EAAE;AAClB,CAAC;AACD,SAAS,SAAS,CAAC,OAAO,EAAE;AAC5B,EAAE,IAAI;AACN,IAAI,MAAM,MAAM,GAAGA,mBAAS,CAAC,UAAU,EAAE,OAAO,CAAC;AACjD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,MAAM,OAAO,CAAC,IAAI,CAAC,2DAA2D,CAAC;AAC/E,MAAM,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;AACxC,IAAI;AACJ,IAAI,MAAM,wBAAwB,GAAG,EAAE;AACvC,IAAI,MAAM,mBAAmB,GAAG,EAAE;AAClC,IAAI,MAAM,YAAY,GAAG,EAAE;AAC3B,IAAI,MAAM,eAAe,mBAAmB,IAAI,GAAG,EAAE;AACrD,IAAI,MAAM,aAAa,GAAG,IAAIC,iBAAO,CAAC;AACtC,MAAM,iBAAiB,CAAC,IAAI,EAAE;AAC9B,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,gBAAgB,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE;AAC7J,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,KAAK,iBAAiB,CAAC,EAAE;AAC9G,YAAY,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;AAClE,YAAY,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC;AACtD,YAAY,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC;AACxD,YAAY,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;AACtD,cAAc,MAAM,UAAU,GAAG;AACjC,gBAAgB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjC,gBAAgB,GAAG,EAAE,IAAI,CAAC,GAAG;AAC7B,gBAAgB,eAAe,EAAE,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC;AAC5D,gBAAgB,aAAa,EAAE,IAAI,CAAC,KAAK,GAAG,QAAQ;AACpD,gBAAgB,UAAU,EAAE,EAAE;AAC9B,gBAAgB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrC,eAAe;AACf,cAAc,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK;AACrD,gBAAgB,IAAI,SAAS,CAAC,QAAQ,EAAE,IAAI,KAAK,YAAY,EAAE;AAC/D,kBAAkB,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;AACxE,kBAAkB,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;AAC7C,oBAAoB,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI;AACjD,oBAAoB,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG;AAC9E,mBAAmB,CAAC;AACpB,gBAAgB;AAChB,cAAc,CAAC,CAAC;AAChB,cAAc,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,YAAY;AACZ,UAAU;AACV,QAAQ;AACR,MAAM;AACN,KAAK,CAAC;AACN,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;AACvC,IAAI,MAAM,UAAU,GAAG,IAAIA,iBAAO,CAAC;AACnC,MAAM,mBAAmB,CAAC,IAAI,EAAE;AAChC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,eAAe,IAAI,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AACrJ,UAAU,MAAM,YAAY,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1E,UAAU,MAAM,UAAU,GAAG,sBAAsB,CAAC,YAAY,CAAC;AACjE,UAAU,IAAI,UAAU,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5D,YAAY,YAAY,CAAC,IAAI,CAAC;AAC9B,cAAc,KAAK,EAAE,IAAI,CAAC,KAAK;AAC/B,cAAc,GAAG,EAAE,IAAI,CAAC,GAAG;AAC3B,cAAc,OAAO,EAAE;AACvB,aAAa,CAAC;AACd,YAAY,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACpG,cAAc,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC;AAC7C,YAAY;AACZ,UAAU;AACV,QAAQ;AACR,MAAM;AACN,KAAK,CAAC;AACN,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;AACpC,IAAI,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;AACnC,MAAM,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;AACxC,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,gBAAgB,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,IAAI;AAClI,IAAI,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC;AACtC,IAAI,MAAM,kBAAkB,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAClF,IAAI,KAAK,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,kBAAkB,EAAE;AAC9D,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC;AACtC,IAAI;AACJ,IAAI,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,IAAI,eAAe,EAAE;AACrD,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC;AAC5F,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;AACpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/F,MAAM,MAAM,aAAa,GAAG;AAC5B,QAAQ,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACxG,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpD,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,eAAe,EAAE,eAAe,CAAC,aAAa,CAAC;AAC9G,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC3D,MAAM,IAAI,iBAAiB;AAC3B,MAAM,IAAI,WAAW,EAAE;AACvB,QAAQ,iBAAiB,GAAG,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK;AAC7F,MAAM,CAAC,MAAM;AACb,QAAQ,iBAAiB,GAAG,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;AACrF,MAAM;AACN,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,eAAe,EAAE,eAAe,CAAC,aAAa,EAAE,iBAAiB,CAAC;AACpG,IAAI;AACJ,IAAI,OAAO;AACX,MAAM,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;AAC3B,MAAM,OAAO,EAAE;AACf,KAAK;AACL,EAAE,CAAC,CAAC,OAAO,MAAM,EAAE;AACnB,IAAI,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC;AAC1E,IAAI,OAAO;AACX,MAAM,OAAO;AACb,MAAM,OAAO,EAAE;AACf,KAAK;AACL,EAAE;AACF;AACY,MAAC,6BAA6B,GAAG;AAC7C,EAAE,IAAI,EAAE,qBAAqB;AAC7B,EAAE;AACF;;;;"}