@deriv-web-design/ui 0.1.33 → 0.1.34
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.
- package/block-registry.json +479 -1
- package/components.manifest.json +237 -1
- package/dist/index.css +3437 -2272
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +118 -2
- package/dist/index.d.ts +118 -2
- package/dist/index.js +3377 -1420
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3310 -1345
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/tokens.css +1 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../components/Button/Button.tsx","../components/Link/Link.tsx","../components/Chip/Chip.tsx","../components/Tag/Tag.tsx","../components/Accordion/Accordion.tsx","../components/TextField/TextField.tsx","../components/SearchField/SearchField.tsx","../components/Breadcrumb/Breadcrumb.tsx","../components/BottomSheet/BottomSheet.tsx","../components/ChipDropdown/ChipDropdown.tsx","../components/Card/CardPrimaryVariant.tsx","../components/Card/CardSecondaryVariant.tsx","../components/Card/CardThumbnailVariant.tsx","../components/Card/CardCategoryVariant.tsx","../components/Card/Card.tsx","../components/Pagination/Pagination.tsx","../components/Tabs/Tabs.tsx","../templates/FaqAccordion/FaqAccordion.tsx","../templates/FeatureCards/FeatureCards.tsx","../templates/FeatureCardsIcon/FeatureCardsIcon.tsx","../templates/FeatureBullets/FeatureBullets.tsx","../components/Footer/Footer.tsx","../templates/Hero/HeroTrustpilot.tsx","../templates/Hero/Hero.tsx","../templates/Header/Header.tsx","../templates/Stats/StatsV2.tsx","../templates/Stats/StatsSimple.tsx","../templates/FeatureScroll/FeatureScroll.tsx","../components/DotLottieInView/DotLottieInView.tsx","../components/DotLottieInView/lottie-src.ts","../templates/FeatureSplit/FeatureSplit.tsx","../templates/StickyStackedCards/StickyStackedCards.tsx","../templates/CTABanner/CTABanner.tsx","../components/Navbar/Navbar.tsx","../components/Navbar/languageGridVars.ts","../templates/DayNightTransition/DayNightTransition.tsx","../templates/DayNightTransition/webflowDayNightV2Ix.ts","../templates/DayNightTransition/dayNightTransitionPresets.ts","../templates/LogoMarquee/LogoMarquee.tsx","../components/DownloadBadge/DownloadBadge.tsx","../templates/Steps/Steps.tsx","../templates/DownloadBanner/DownloadBanner.tsx","../templates/TextScroll/TextScroll.tsx","../templates/StickyMarketCards/StickyMarketCards.tsx","../templates/StickyMarketCardsLottie/StickyMarketCardsLottie.tsx","../templates/Table/Table.tsx","../templates/DynamicTable/DynamicTable.tsx","../templates/Leaders/Leaders.tsx","../templates/ImageBanner/ImageBanner.tsx","../templates/Testimonial/Testimonial.tsx","../templates/ArticleHero/ArticleHero.tsx","../templates/ArticleSection/ArticleSection.tsx","../templates/CoralBanner/CoralBanner.tsx","../templates/FeatureAwards/FeatureAwards.tsx","../templates/FeatureBlog/FeatureBlog.tsx","../templates/FeatureBlogCategories/FeatureBlogCategories.tsx","../templates/HelpCentreCategories/HelpCentreCategories.tsx","../templates/HelpCentreSubCategories/HelpCentreSubCategories.tsx","../templates/HelpCenterPage/HelpCenterPage.tsx","../templates/FeatureBlogPage/FeatureBlogPage.tsx","../templates/ParallaxBanner/ParallaxBanner.tsx","../templates/TradingCalculator/TradingCalculator.tsx","../templates/TradingCalculatorHowTo/TradingCalculatorHowTo.tsx","../templates/FeatureOffices/FeatureOffices.tsx","../templates/Tiers/Tiers.tsx","../templates/PartnersPayout/PartnersPayout.tsx","../templates/MasterPartner/MasterPartner.tsx","../templates/ResourceBanner/ResourceBanner.tsx","../templates/OptionsTypes/OptionsTypes.tsx","../templates/OptionsTypes/OptionsTypes.data.ts","../templates/EntityInfoSection/EntityInfoSection.tsx","../templates/CountryLinkGrid/CountryLinkGrid.tsx","../templates/DocumentChips/DocumentChips.tsx","../components/LinkModal/LinkModal.tsx","../templates/LanguageSelectModal/LanguageSelectModal.tsx","../templates/AffiliatesSlider/AffiliatesSlider.tsx"],"sourcesContent":["import type { ButtonProps } from \"./Button.types\";\nimport \"./Button.css\";\n\nexport const Button = ({\n colorScheme = \"coral\",\n variant = \"primary\",\n iconPosition = \"none\",\n icon,\n label,\n fullWidth = false,\n showFocusRing = false,\n children,\n disabled,\n className,\n ...props\n}: ButtonProps) => {\n const isIconOnly = iconPosition === \"icon-only\";\n\n const classNames = [\n \"button\",\n `${colorScheme}_${variant}`,\n isIconOnly ? \"iconOnly\" : \"\",\n fullWidth ? \"fullWidth\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const iconNode = icon ? (\n <span className=\"icon\">{icon}</span>\n ) : null;\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-label={isIconOnly && label ? label : undefined}\n {...props}\n >\n {iconPosition === \"icon-left\" && iconNode}\n\n {!isIconOnly && (\n <span className=\"label\">{label ?? children}</span>\n )}\n\n {iconPosition === \"icon-only\" && iconNode}\n\n {iconPosition === \"icon-right\" && iconNode}\n\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import type { LinkProps } from \"./Link.types\";\nimport \"./Link.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Link = ({\n colorScheme = \"coral\",\n label,\n icon,\n iconPosition = \"left\",\n showChevron = true,\n disabled = false,\n children,\n className,\n onClick,\n ...props\n}: LinkProps) => {\n const hasIcon = !!icon;\n\n const classNames = [\n \"link\",\n colorScheme,\n hasIcon ? \"withIcon\" : \"withChevron\",\n disabled ? \"disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n return (\n <a\n className={classNames}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={handleClick}\n {...props}\n >\n {hasIcon && iconPosition === \"left\" && <span className=\"icon\">{icon}</span>}\n\n <span className=\"label\">{label ?? children}</span>\n\n {hasIcon && iconPosition === \"right\" && <span className=\"icon\">{icon}</span>}\n\n {!hasIcon && showChevron && (\n <span className=\"chevron\" aria-hidden=\"true\">\n <ChevronIcon />\n </span>\n )}\n </a>\n );\n};\n\nexport default Link;\n","import type { ChipProps } from \"./Chip.types\";\nimport \"./Chip.css\";\n\nexport const Chip = ({\n size = \"md\",\n label,\n icon,\n tag,\n selected = false,\n showFocusRing = false,\n disabled = false,\n children,\n className,\n ...props\n}: ChipProps) => {\n const classNames = [\n \"chip\",\n size,\n selected ? \"selected\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-pressed={selected}\n {...props}\n >\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{label ?? children}</span>\n {tag && <span className=\"tag\">{tag}</span>}\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Chip;\n","import type { TagProps } from \"./Tag.types\";\nimport \"./Tag.css\";\n\nexport const Tag = ({\n size = \"sm\",\n variant = \"fill\",\n fontWeight = \"regular\",\n label,\n icon,\n children,\n className,\n ...props\n}: TagProps) => {\n const classNames = [\n \"tag\",\n size,\n variant,\n fontWeight,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span className={classNames} {...props}>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{label ?? children}</span>\n </span>\n );\n};\n\nexport default Tag;\n","import { useState } from \"react\";\nimport type { AccordionProps } from \"./Accordion.types\";\nimport \"./Accordion.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Accordion = ({\n title,\n children,\n open,\n defaultOpen = false,\n onToggle,\n showTopDivider = true,\n showBottomDivider = true,\n showFocusRing = false,\n className,\n}: AccordionProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : internalOpen;\n\n const handleToggle = () => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onToggle?.(next);\n };\n\n const classNames = [\"accordion\", className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <div\n className={classNames}\n style={{\n borderTop: showTopDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n borderBottom: showBottomDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n }}\n >\n <button\n className=\"accordion__header\"\n onClick={handleToggle}\n aria-expanded={isOpen}\n >\n <span className=\"accordion__title-wrapper\">\n <span className=\"accordion__title\">{title}</span>\n </span>\n <span className={[\"accordion__chevron\", isOpen ? \"accordion__chevron--rotated\" : \"\"].filter(Boolean).join(\" \")}>\n <ChevronIcon />\n </span>\n {showFocusRing && (\n <span className=\"accordion__focus-ring\" aria-hidden=\"true\" />\n )}\n </button>\n\n <div className={[\"accordion__body-wrapper\", isOpen ? \"accordion__body-wrapper--open\" : \"\"].filter(Boolean).join(\" \")}>\n <div className=\"accordion__body-inner\">\n <div className=\"accordion__body\">{children}</div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Accordion;\n","import { forwardRef } from \"react\";\nimport type { TextFieldProps } from \"./TextField.types\";\nimport \"./TextField.css\";\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n variant = \"outline\",\n status = \"neutral\",\n label,\n disabled,\n className,\n id,\n ...inputProps\n },\n ref\n ) => {\n const wrapperClass = [\n \"tf-wrapper\",\n variant,\n status,\n label ? \"hasLabel\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const field = (\n <>\n <input\n ref={ref}\n id={id}\n className=\"tf-input\"\n disabled={disabled}\n {...inputProps}\n />\n\n {status === \"success\" && (\n <span className=\"iconSlot iconSuccess\">\n <SuccessIcon />\n </span>\n )}\n {status === \"fail\" && (\n <span className=\"iconSlot iconFail\">\n <FailIcon />\n </span>\n )}\n </>\n );\n\n return (\n <div className={wrapperClass} data-disabled={disabled || undefined}>\n {label && (\n <label className=\"tf-label\" htmlFor={id}>\n {label}\n </label>\n )}\n {label ? <div className=\"tf-row\">{field}</div> : field}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport default TextField;\n","import { forwardRef, useRef, useState, useCallback, type ChangeEvent } from \"react\";\nimport type { SearchFieldProps } from \"./SearchField.types\";\nimport \"./SearchField.css\";\n\n/* ── Icons ────────────────────────────────────────────────── */\n\nconst SearchIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M9.5 9.5L13 13\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst ClearIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M6 6l4 4M10 6l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\n/* ── Component ────────────────────────────────────────────── */\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n (\n {\n variant = \"outline\",\n status = \"neutral\",\n showSearchIcon = true,\n value,\n defaultValue,\n onChange,\n onClear,\n label,\n trailingSlot,\n hideClearButton = false,\n disabled,\n className,\n id,\n ...inputProps\n },\n ref\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n\n // Merge forwarded ref with inner ref so we can clear the native input\n const setRef = useCallback(\n (node: HTMLInputElement | null) => {\n (innerRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [ref]\n );\n\n // Track whether the input has text for uncontrolled usage\n const isControlled = value !== undefined;\n const [internalHasValue, setInternalHasValue] = useState(\n Boolean(defaultValue)\n );\n const hasValue = isControlled ? Boolean(value) : internalHasValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalHasValue(Boolean(e.target.value));\n }\n onChange?.(e);\n };\n\n const handleClear = () => {\n if (!isControlled && innerRef.current) {\n innerRef.current.value = \"\";\n setInternalHasValue(false);\n }\n onClear?.();\n innerRef.current?.focus();\n };\n\n // ── Derived display state ──────────────────────────────\n // Fail icon always visible when status=fail (even with no input)\n const showFailIcon = status === \"fail\" && !disabled;\n // Success icon only visible when status=success + has input\n const showSuccessIcon = status === \"success\" && hasValue && !disabled;\n // Clear button visible when has input (all statuses), unless suppressed\n const showClearButton = hasValue && !disabled && !hideClearButton;\n\n const wrapperClass = [\n \"sf-wrapper\",\n variant,\n status,\n label ? \"hasLabel\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const field = (\n <>\n {/* Leading search icon — optional */}\n {showSearchIcon && (\n <span className=\"iconSlot\">\n <SearchIcon />\n </span>\n )}\n\n <input\n ref={setRef}\n id={id}\n className=\"sf-input\"\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n {...inputProps}\n />\n\n {/* Status icons — right of input, left of clear */}\n {showSuccessIcon && (\n <span className=\"iconSlot iconSuccess\">\n <SuccessIcon />\n </span>\n )}\n {showFailIcon && (\n <span className=\"iconSlot iconFail\">\n <FailIcon />\n </span>\n )}\n\n {/* Clear button — rightmost, unless a trailing slot follows */}\n {showClearButton && (\n <button\n type=\"button\"\n className=\"clearButton\"\n onClick={handleClear}\n aria-label=\"Clear search\"\n tabIndex={-1}\n >\n <ClearIcon />\n </button>\n )}\n\n {/* Trailing slot — e.g. a combobox chevron, always last */}\n {trailingSlot && <span className=\"sf-trailing\">{trailingSlot}</span>}\n </>\n );\n\n return (\n <div\n className={wrapperClass}\n data-disabled={disabled || undefined}\n >\n {label && (\n <label className=\"sf-label\" htmlFor={id}>\n {label}\n </label>\n )}\n {label ? <div className=\"sf-row\">{field}</div> : field}\n </div>\n );\n }\n);\n\nSearchField.displayName = \"SearchField\";\n\nexport default SearchField;\n","import { useState } from \"react\";\nimport type { BreadcrumbProps, BreadcrumbItem } from \"./Breadcrumb.types\";\nimport { BottomSheet } from \"../BottomSheet\";\nimport \"./Breadcrumb.css\";\n\nconst ChevronRightIcon = () => (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 3.5L10.5 8L6 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nfunction BreadcrumbLink({ item }: { item: BreadcrumbItem }) {\n return (\n <>\n <a href={item.href} onClick={item.onClick} className=\"bc-link\">\n {item.label}\n </a>\n <span className=\"bc-separator\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </>\n );\n}\n\nexport function Breadcrumb({\n items,\n size = \"md\",\n collapsible = true,\n className,\n ...navProps\n}: BreadcrumbProps) {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n // Collapse only when there are enough items for the pattern:\n // first › … › parent › current (needs ≥ 4 items)\n const truncatable = collapsible && items.length > 3;\n\n const listClass = [\"bc-list\", size, truncatable ? \"collapsible\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n if (!truncatable) {\n return (\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"bc-item\">\n {isLast ? (\n <span className=\"bc-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <BreadcrumbLink item={item} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n }\n\n const firstItem = items[0];\n const middleItems = items.slice(1, items.length - 2);\n const parentItem = items[items.length - 2];\n const currentItem = items[items.length - 1];\n\n return (\n <>\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {/* Always-visible: first item */}\n <li className=\"bc-item\">\n <BreadcrumbLink item={firstItem} />\n </li>\n\n {/* Mobile only — ellipsis button, opens BottomSheet */}\n <li className=\"bc-ellipsisItem\">\n <button\n className=\"bc-ellipsisButton\"\n onClick={() => setSheetOpen(true)}\n aria-label=\"Show all breadcrumb items\"\n aria-haspopup=\"dialog\"\n >\n …\n </button>\n <span className=\"bc-separator\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </li>\n\n {/* Middle items — hidden on mobile (shown in BottomSheet instead) */}\n {middleItems.map((item, index) => (\n <li key={`m-${index}`} className=\"bc-middleItem\">\n <BreadcrumbLink item={item} />\n </li>\n ))}\n\n {/* Always-visible: parent (second-to-last) */}\n <li className=\"bc-item\">\n <BreadcrumbLink item={parentItem} />\n </li>\n\n {/* Always-visible: current page (last) */}\n <li className=\"bc-item\">\n <span className=\"bc-current\" aria-current=\"page\">\n {currentItem.label}\n </span>\n </li>\n </ol>\n </nav>\n\n {/* Mobile BottomSheet — shows hidden middle breadcrumb items */}\n <BottomSheet\n open={sheetOpen}\n onClose={() => setSheetOpen(false)}\n showHandleBar\n showHeader={false}\n >\n <ul className=\"bc-sheet-list\" role=\"list\">\n {middleItems.map((item, index) => (\n <li key={`sheet-${index}`} className=\"bc-sheet-item\">\n <a\n href={item.href}\n className=\"bc-sheet-link\"\n onClick={(e) => {\n item.onClick?.(e as React.MouseEvent<HTMLAnchorElement>);\n setSheetOpen(false);\n }}\n >\n {item.label}\n </a>\n </li>\n ))}\n </ul>\n </BottomSheet>\n </>\n );\n}\n\nexport default Breadcrumb;\n","import { useEffect, useId } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { BottomSheetProps } from \"./BottomSheet.types\";\nimport \"./BottomSheet.css\";\n\nconst XMarkIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 3l10 10M13 3L3 13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const BottomSheet = ({\n open,\n onClose,\n title,\n showHeader = true,\n showHandleBar = true,\n primaryAction,\n secondaryAction,\n children,\n}: BottomSheetProps) => {\n const titleId = useId();\n\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className=\"bs-overlay\"\n onClick={onClose}\n aria-hidden=\"true\"\n >\n <div\n className=\"bs-sheet\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n {showHandleBar && (\n <div className=\"bs-handle-container\">\n <div className=\"bs-handle-bar\" />\n </div>\n )}\n\n {showHeader && (\n <div className=\"bs-header\">\n <div className=\"bs-header-spacer\" />\n {title && (\n <p id={titleId} className=\"bs-title\">\n {title}\n </p>\n )}\n <div className=\"bs-close-container\">\n <button\n type=\"button\"\n className=\"bs-close-btn\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <XMarkIcon />\n </button>\n </div>\n </div>\n )}\n\n {children && <div className=\"bs-body\">{children}</div>}\n\n {(primaryAction || secondaryAction) && (\n <div className=\"bs-actions\">\n {primaryAction && (\n <button\n type=\"button\"\n className=\"bs-action-primary\"\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </button>\n )}\n {secondaryAction && (\n <button\n type=\"button\"\n className=\"bs-action-secondary\"\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </button>\n )}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n};\n\nexport default BottomSheet;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ChipDropdownProps } from \"./ChipDropdown.types\";\nimport { BottomSheet } from \"../BottomSheet\";\nimport \"./ChipDropdown.css\";\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 6l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const ChipDropdown = ({\n size = \"md\",\n label,\n tag,\n icon,\n options,\n value,\n onChange,\n disabled = false,\n className,\n ...props\n}: ChipDropdownProps) => {\n const [open, setOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(\n () => typeof window !== \"undefined\" && window.matchMedia(\"(max-width: 767px)\").matches\n );\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find((o) => o.value === value) ?? null;\n const displayLabel = selectedOption ? selectedOption.label : label;\n const isSelected = selectedOption !== null;\n\n // Track mobile breakpoint reactively\n useEffect(() => {\n const mq = window.matchMedia(\"(max-width: 767px)\");\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, []);\n\n // Close desktop dropdown on outside click\n useEffect(() => {\n if (!open || isMobile) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open, isMobile]);\n\n const triggerClassNames = [\n \"cd-trigger\",\n size,\n isSelected ? \"selected\" : \"\",\n open ? \"expand\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n\n const handleSelect = (optionValue: string) => {\n onChange?.(optionValue);\n setOpen(false);\n };\n\n const optionList = options.map((option) => {\n const isActive = option.value === value;\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isActive}\n className={[\"cd-item\", isActive ? \"itemSelected\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => handleSelect(option.value)}\n >\n <span className=\"cd-itemLabel\">{option.label}</span>\n {isActive && (\n <span className=\"cd-itemCheck\">\n <CheckIcon />\n </span>\n )}\n </li>\n );\n });\n\n return (\n <div ref={wrapperRef} className=\"cd-wrapper\">\n <button\n type=\"button\"\n className={triggerClassNames}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"cd-icon\">{icon}</span>}\n <span className=\"cd-label\">{displayLabel}</span>\n {tag && <span className=\"cd-tag\">{tag}</span>}\n <span\n className={[\"cd-chevron\", open ? \"chevronOpen\" : \"\"].filter(Boolean).join(\" \")}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon />\n </span>\n </button>\n\n {/* Desktop: inline dropdown list */}\n {!isMobile && open && (\n <ul role=\"listbox\" aria-label={label} className=\"cd-list\">\n {optionList}\n </ul>\n )}\n\n {/* Mobile: bottom sheet */}\n {isMobile && (\n <BottomSheet\n open={open}\n onClose={() => setOpen(false)}\n title={label}\n showHandleBar\n showHeader\n >\n <ul role=\"listbox\" aria-label={label} className=\"cd-list cd-list--sheet\">\n {optionList}\n </ul>\n </BottomSheet>\n )}\n </div>\n );\n};\n\nexport default ChipDropdown;\n","import type { CardProps } from \"./Card.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./CardPrimaryVariant.css\";\n\ntype PrimaryProps = Extract<CardProps, { variant: \"primary\" }>;\n\nexport const CardPrimaryVariant = ({\n colorScheme = \"light\",\n title,\n description,\n image,\n imageAlt = \"\",\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: PrimaryProps) => {\n const isInverse = colorScheme === \"dark\" || colorScheme === \"brand\" || colorScheme === \"image\";\n\n return (\n <div\n className={[\n \"card-primary\",\n `style--${colorScheme}`,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {/* ── Full-bleed image overlay (image colorScheme only) ─── */}\n {colorScheme === \"image\" && image && (\n <div aria-hidden=\"true\" className=\"cp-imageOverlay\">\n <img alt=\"\" className=\"cp-overlayImg\" src={image} />\n <div className=\"cp-gradient\" />\n </div>\n )}\n\n {/* ── Content ──────────────────────────────────────── */}\n <div className=\"cp-content\">\n <p className={[\"cp-title\", isInverse ? \"textInverse\" : \"textDefault\"].join(\" \")}>\n {title}\n </p>\n <p className={[\"cp-description\", isInverse ? \"textInverse\" : \"textDefault\"].join(\" \")}>\n {description}\n </p>\n {showLink && (\n <Link\n colorScheme={isInverse ? \"white\" : \"coral\"}\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n\n {/* ── Image section (light / dark / brand colorSchemes) ── */}\n {colorScheme !== \"image\" && image && (\n <div className=\"cp-imageSection\">\n <img alt={imageAlt} className=\"cp-image\" src={image} />\n </div>\n )}\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./CardSecondaryVariant.css\";\n\ntype SecondaryProps = Extract<CardProps, { variant: \"secondary\" }>;\n\nexport const CardSecondaryVariant = ({\n title,\n description,\n icon,\n showIcon = true,\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: SecondaryProps) => {\n return (\n <div\n className={[\"card-secondary\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {showIcon && icon && <span className=\"cs-icon\">{icon}</span>}\n\n <p className=\"cs-title\">{title}</p>\n\n <p className=\"cs-description\">{description}</p>\n\n {showLink && (\n <Link\n colorScheme=\"coral\"\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Tag } from \"../../components/Tag\";\nimport \"./CardThumbnailVariant.css\";\n\nconst LinkIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.25 2.625H3.5A1.75 1.75 0 0 0 1.75 4.375v5.25A1.75 1.75 0 0 0 3.5 11.375h5.25a1.75 1.75 0 0 0 1.75-1.75V7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M7.875 1.75h4.375v4.375M12.25 1.75 6.125 7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"80\"\n viewBox=\"0 0 80 80\"\n width=\"80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"40\" cy=\"40\" fill=\"rgba(255,255,255,0.88)\" r=\"40\" />\n <path d=\"M32 27l22 13-22 13V27z\" fill=\"rgba(24,28,37,0.72)\" />\n </svg>\n);\n\ntype ThumbnailProps = Extract<CardProps, { variant: \"thumbnail\" }>;\n\nexport const CardThumbnailVariant = ({\n type = \"video\",\n layout = \"vertical\",\n thumbnail,\n thumbnailAlt = \"\",\n hideThumbnail = false,\n title,\n summary,\n tags = [],\n hideTags = false,\n showCopyLink = true,\n onCopyLink,\n avatar,\n avatarAlt = \"\",\n hideAvatar = false,\n className,\n variant: _variant,\n ...props\n}: ThumbnailProps) => {\n const isVideo = type === \"video\";\n const isHorizontal = layout === \"horizontal\" || layout === \"horizontal-reverse\";\n const isReversed = layout === \"horizontal-reverse\";\n const hasTags = !hideTags && tags.length > 0;\n\n /* Horizontal (byline-style) layout keeps the original inline,\n * dot-separated tag list in the meta row alongside the copy-link\n * button. Vertical layout renders tags as standalone chip pills\n * above the title, matching the reference \"Deriv press releases\"\n * card design (deriv.com/newsroom). */\n const tagsNode = hasTags && (\n isHorizontal ? (\n <div className=\"ct-tagsList\">\n {tags.map((tag, i) => (\n <span className=\"ct-tagItem\" key={i}>\n {i > 0 && <span aria-hidden=\"true\" className=\"ct-tagDot\">·</span>}\n <Tag icon={tag.icon} label={tag.label} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n ) : (\n <div className=\"ct-tagsRow\">\n {tags.map((tag, i) => (\n <Tag icon={tag.icon} key={i} label={tag.label} size=\"md\" variant=\"fill\" />\n ))}\n </div>\n )\n );\n\n const copyLinkNode = showCopyLink && (\n <button\n aria-label=\"Copy link\"\n className=\"ct-copyLink\"\n onClick={onCopyLink}\n type=\"button\"\n >\n <LinkIcon />\n </button>\n );\n\n return (\n <div\n className={[\"card-thumbnail\", isHorizontal ? \"ct-horizontal\" : \"\", isReversed ? \"ct-reverse\" : \"\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* ── Thumbnail ──────────────────────────────────── */}\n {!hideThumbnail && (\n <div className=\"ct-thumbnailWrapper\">\n <img alt={thumbnailAlt} className=\"ct-thumbnailImage\" src={thumbnail} />\n {isVideo && (\n <span aria-label=\"Play video\" className=\"ct-playButton\">\n <PlayIcon />\n </span>\n )}\n {!isVideo && !hideAvatar && avatar && (\n <img alt={avatarAlt} className=\"ct-avatar\" src={avatar} />\n )}\n </div>\n )}\n\n {/* ── Content ───────────────────────────────────── */}\n <div className=\"ct-content\">\n {!isHorizontal && tagsNode}\n <p className=\"ct-title\">{title}</p>\n <p className=\"ct-summary\">{summary}</p>\n {isHorizontal ? (\n (tagsNode || copyLinkNode) && (\n <div className=\"ct-metaRow\">\n {tagsNode}\n {copyLinkNode}\n </div>\n )\n ) : (\n copyLinkNode && (\n <div className=\"ct-metaRow ct-metaRow--end\">{copyLinkNode}</div>\n )\n )}\n </div>\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Tag } from \"../../components/Tag\";\nimport { Card } from \"./Card\";\nimport \"./CardCategoryVariant.css\";\n\ntype CategoryProps = Extract<CardProps, { variant: \"category\" }>;\n\nexport const CardCategoryVariant = ({\n title,\n thumbnail,\n thumbnailAlt = \"\",\n onHeaderClick,\n articles = [],\n className,\n variant: _variant,\n ...props\n}: CategoryProps) => {\n return (\n <div\n className={[\"card-category\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n <div\n className=\"cc-header\"\n onClick={onHeaderClick}\n role={onHeaderClick ? \"button\" : undefined}\n tabIndex={onHeaderClick ? 0 : undefined}\n >\n <h3 className=\"cc-title\">{title}</h3>\n {thumbnail && (\n <div className=\"cc-thumbnailWrapper\">\n <img alt={thumbnailAlt} className=\"cc-thumbnailImage\" src={thumbnail} />\n </div>\n )}\n </div>\n <div className=\"cc-articleList\">\n {articles.map((article, i) => (\n <div className=\"cc-articleItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail=\"\"\n hideThumbnail\n title={article.title}\n summary=\"\"\n tags={article.date ? [{ label: article.date }] : []}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { CardPrimaryVariant } from \"./CardPrimaryVariant\";\nimport { CardSecondaryVariant } from \"./CardSecondaryVariant\";\nimport { CardThumbnailVariant } from \"./CardThumbnailVariant\";\nimport { CardCategoryVariant } from \"./CardCategoryVariant\";\n\nexport const Card = (props: CardProps) => {\n if (props.variant === \"primary\") {\n return <CardPrimaryVariant {...props} />;\n }\n if (props.variant === \"secondary\") {\n return <CardSecondaryVariant {...props} />;\n }\n if (props.variant === \"category\") {\n return <CardCategoryVariant {...props} />;\n }\n return <CardThumbnailVariant {...props} />;\n};\n\nexport default Card;\n","import type { PaginationProps } from \"./Pagination.types\";\nimport \"./Pagination.css\";\n\nconst ChevronLeft = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\ntype PageItem = number | \"ellipsis-left\" | \"ellipsis-right\";\n\nfunction getPageItems(currentPage: number, totalPages: number): PageItem[] {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n if (currentPage <= 3) {\n return [1, 2, 3, 4, 5, \"ellipsis-right\", totalPages];\n }\n if (currentPage >= totalPages - 2) {\n return [1, \"ellipsis-left\", totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages];\n }\n return [1, \"ellipsis-left\", currentPage - 1, currentPage, currentPage + 1, \"ellipsis-right\", totalPages];\n}\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n onPageChange,\n className,\n}: PaginationProps) => {\n const items = getPageItems(currentPage, totalPages);\n const isPrevDisabled = currentPage <= 1;\n const isNextDisabled = currentPage >= totalPages;\n\n return (\n <nav\n className={[\"pagination\", className ?? \"\"].filter(Boolean).join(\" \")}\n aria-label=\"Pagination navigation\"\n >\n <button\n className={[\"navButton\", isPrevDisabled ? \"navButtonDisabled\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={isPrevDisabled}\n aria-label=\"Previous page\"\n >\n <span className=\"navIcon\"><ChevronLeft /></span>\n </button>\n\n {items.map((item, index) => {\n if (item === \"ellipsis-left\" || item === \"ellipsis-right\") {\n return (\n <span\n key={`${item}-${index}`}\n className=\"ellipsis\"\n aria-hidden=\"true\"\n >\n …\n </span>\n );\n }\n\n const isSelected = item === currentPage;\n return (\n <button\n key={item}\n className={[\"pageButton\", isSelected ? \"pageButtonSelected\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => { if (!isSelected) onPageChange(item); }}\n aria-current={isSelected ? \"page\" : undefined}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n );\n })}\n\n <button\n className={[\"navButton\", isNextDisabled ? \"navButtonDisabled\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={isNextDisabled}\n aria-label=\"Next page\"\n >\n <span className=\"navIcon\"><ChevronRight /></span>\n </button>\n </nav>\n );\n};\n\nexport default Pagination;\n","import { useId, useRef } from \"react\";\nimport type { TabsProps } from \"./Tabs.types\";\nimport { Chip } from \"../Chip\";\nimport \"./Tabs.css\";\n\nexport const Tabs = ({\n items,\n activeId,\n onChange,\n idPrefix,\n className,\n ...props\n}: TabsProps) => {\n const generatedId = useId().replace(/:/g, \"\");\n const prefix = idPrefix ?? `tabs-${generatedId}`;\n const rootRef = useRef<HTMLDivElement>(null);\n\n const selectAndFocus = (index: number) => {\n const item = items[index];\n if (!item) return;\n onChange(item.id);\n rootRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[index]?.focus();\n };\n\n return (\n <div\n ref={rootRef}\n className={[\"tabs-menu w-tab-menu\", className].filter(Boolean).join(\" \")}\n role=\"tablist\"\n {...props}\n >\n {items.map((item, i) => {\n const isActive = item.id === activeId;\n return (\n <Chip\n key={item.id}\n label={item.label}\n selected={isActive}\n onClick={() => onChange(item.id)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n selectAndFocus((i + 1) % items.length);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n selectAndFocus((i - 1 + items.length) % items.length);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n selectAndFocus(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n selectAndFocus(items.length - 1);\n }\n }}\n className={isActive ? \"tab-active\" : \"\"}\n data-w-tab={item.label}\n id={`${prefix}-tab-${i}`}\n aria-controls={`${prefix}-panel-${i}`}\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n role=\"tab\"\n />\n );\n })}\n </div>\n );\n};\n\nexport default Tabs;\n","import { useState } from \"react\";\nimport { Accordion } from \"../../components/Accordion\";\nimport type { FaqAccordionProps } from \"./FaqAccordion.types\";\nimport \"./FaqAccordion.css\";\n\nexport const FaqAccordion = ({\n title,\n items,\n colorScheme = \"white\",\n}: FaqAccordionProps) => {\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n\n const handleToggle = (index: number) => (isOpen: boolean) => {\n setOpenIndex(isOpen ? index : null);\n };\n\n return (\n <section className={[\"faq-accordion\", `faq-accordion--${colorScheme}`].join(\" \")}>\n <div className=\"faq-accordion__container\">\n <div className=\"faq-accordion__header\">\n <h2 className=\"faq-accordion__title\">{title}</h2>\n </div>\n\n <div className=\"faq-accordion__list\">\n {items.map((item, index) => (\n <Accordion\n key={`${item.question}-${index}`}\n title={item.question}\n open={openIndex === index}\n onToggle={handleToggle(index)}\n showTopDivider={false}\n showBottomDivider={index < items.length - 1}\n >\n {item.answer}\n </Accordion>\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport type {\n FeatureCardItem,\n FeatureCardPlatformLink,\n FeatureCardsProps,\n} from \"./FeatureCards.types\";\nimport \"./FeatureCards.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst PlatformIcon = ({ platform }: { platform: FeatureCardPlatformLink }) => {\n if (!platform.iconSrc) return null;\n\n return (\n <img\n alt=\"\"\n className=\"fc-platformLink-icon\"\n height={32}\n src={platform.iconSrc}\n width={32}\n />\n );\n};\n\n/* ── Two Cards sub-component ────────────────────────────────── */\n\nconst TwoCardsItem = ({ card, index }: { card: FeatureCardItem; index: number }) => {\n const isDark = card.twoTone === \"dark\";\n const showCardLink = card.showLink !== false;\n\n return (\n <div className=\"fc-twoCardWrap\">\n <div\n className={[\n \"fc-twoCard\",\n isDark ? \"fc-twoCard--dark\" : \"fc-twoCard--light\",\n ].join(\" \")}\n >\n <div className=\"fc-twoCard-body\">\n <div className=\"fc-twoCard-content\">\n <h3 className=\"fc-twoCard-title\">{card.title}</h3>\n <p className=\"fc-twoCard-description\">{card.description}</p>\n {showCardLink && (\n <div className=\"fc-twoCard-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={card.linkHref}\n label={card.linkText ?? \"Learn more\"}\n rel={externalLinkRel(card.linkHref)}\n onClick={card.onLinkClick}\n />\n </div>\n )}\n </div>\n\n {card.platforms && card.platforms.length > 0 && (\n <div className=\"fc-twoCard-platformsOuter\">\n <h3 className=\"fc-twoCard-platformsHeading\">\n {card.platformsHeading ?? \"Available on\"}\n </h3>\n <div className=\"fc-twoCard-platformRow\">\n {card.platforms.map((platform, i) => (\n <a\n key={`${platform.label}-${i}`}\n className={[\n \"fc-platformLink\",\n isDark ? \"fc-platformLink--dark\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n href={platform.href}\n rel={externalLinkRel(platform.href)}\n >\n <PlatformIcon platform={platform} />\n <span className=\"fc-platformLink-label\">{platform.label}</span>\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {card.image && (\n <div className=\"fc-twoCard-imageSection\">\n <img\n alt={card.imageAlt ?? \"\"}\n className=\"fc-twoCard-image\"\n decoding=\"async\"\n loading={index === 0 ? \"eager\" : \"lazy\"}\n src={card.image}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ── One Card sub-component ─────────────────────────────────── */\n\nconst OneCardPanel = ({ card }: { card: FeatureCardItem }) => {\n const showCardLink = card.showLink !== false;\n\n return (\n <div className=\"fc-oneCardShell\">\n <div className=\"fc-oneCardGrid fc-twoCard--dark\">\n <div className=\"fc-oneCardLeft\">\n <div className=\"fc-oneCardContentBlock\">\n <h3 className=\"fc-twoCard-title\">{card.title}</h3>\n <p className=\"fc-twoCard-description\">{card.description}</p>\n {showCardLink && (\n <div className=\"fc-twoCard-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={card.linkHref}\n label={card.linkText ?? \"Learn more\"}\n rel={externalLinkRel(card.linkHref)}\n onClick={card.onLinkClick}\n />\n </div>\n )}\n </div>\n\n {card.platforms && card.platforms.length > 0 && (\n <div className=\"fc-twoCard-platformsOuter\">\n <h3 className=\"fc-twoCard-platformsHeading\">\n {card.platformsHeading ?? \"Available on\"}\n </h3>\n <div className=\"fc-twoCard-platformRow\">\n {card.platforms.map((platform, i) => (\n <a\n key={`${platform.label}-${i}`}\n className=\"fc-platformLink fc-platformLink--dark\"\n href={platform.href}\n rel={externalLinkRel(platform.href)}\n >\n <PlatformIcon platform={platform} />\n <span className=\"fc-platformLink-label\">{platform.label}</span>\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {card.image && (\n <div className=\"fc-oneCardRight\">\n <img\n alt={card.imageAlt ?? \"\"}\n className=\"fc-oneCardImage\"\n decoding=\"async\"\n loading=\"eager\"\n src={card.image}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ── Main component ─────────────────────────────────────────── */\n\nexport const FeatureCards = ({\n variant = \"default\",\n sectionTitle,\n sectionDescription,\n showLink = false,\n linkText = \"Learn more\",\n onLinkClick,\n cardColorScheme = \"image\",\n cards,\n}: FeatureCardsProps) => {\n const sectionHeader = (\n <div className=\"fc-header\">\n <h2 className=\"fc-sectionTitle\">{sectionTitle}</h2>\n\n {sectionDescription && (\n <p className=\"fc-sectionDescription\">{sectionDescription}</p>\n )}\n\n {showLink && (\n <Link colorScheme=\"coral\" label={linkText} onClick={onLinkClick} />\n )}\n </div>\n );\n\n if (variant === \"twoCards\") {\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n {sectionHeader}\n\n <div className=\"fc-grid fc-grid--twoCards\">\n {cards.map((card, index) => (\n <TwoCardsItem\n card={card}\n index={index}\n key={`${card.title}-${index}`}\n />\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (variant === \"oneCard\") {\n const card = cards[0];\n if (!card) return null;\n\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n {sectionHeader}\n\n <OneCardPanel card={card} />\n </div>\n </section>\n );\n }\n\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n {sectionHeader}\n\n <div className={`fc-grid fc-grid--${cards.length === 4 ? \"4\" : \"3\"}`}>\n {cards.map((card, index) => (\n <Card\n key={index}\n variant=\"primary\"\n colorScheme={card.colorScheme ?? cardColorScheme}\n title={card.title}\n description={card.description}\n image={card.image}\n imageAlt={card.imageAlt}\n showLink={card.showLink}\n linkText={card.linkText}\n onLinkClick={card.onLinkClick}\n />\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport type { FeatureCardsIconProps } from \"./FeatureCardsIcon.types\";\nimport \"./FeatureCardsIcon.css\";\n\nexport const FeatureCardsIcon = ({\n sectionTitle,\n sectionDescription,\n showLink = false,\n linkText = \"Learn more\",\n onLinkClick,\n cards,\n}: FeatureCardsIconProps) => {\n return (\n <section className=\"fci-section\">\n <div className=\"fci-container\">\n <div className=\"fci-header\">\n {sectionTitle && <h2 className=\"fci-sectionTitle\">{sectionTitle}</h2>}\n\n {sectionDescription && (\n <p className=\"fci-sectionDescription\">{sectionDescription}</p>\n )}\n\n {showLink && (\n <Link colorScheme=\"coral\" label={linkText} onClick={onLinkClick} />\n )}\n </div>\n\n <div className={`fci-grid fci-grid--${cards.length === 4 ? \"4\" : \"3\"}`}>\n {cards.map((card, index) => (\n <Card\n key={index}\n variant=\"secondary\"\n title={card.title}\n description={card.description}\n icon={card.icon}\n showIcon={card.showIcon}\n showLink={card.showLink}\n linkText={card.linkText}\n onLinkClick={card.onLinkClick}\n />\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import type { FeatureBulletsProps } from \"./FeatureBullets.types\";\nimport \"./FeatureBullets.css\";\n\nconst CheckIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" className=\"feature-bullets__icon\">\n <path d=\"M12 4.375C9.07031 4.375 6.41406 5.9375 4.92969 8.4375C3.48438 10.9766 3.48438 14.0625 4.92969 16.5625C6.41406 19.1016 9.07031 20.625 12 20.625C14.8906 20.625 17.5469 19.1016 19.0312 16.5625C20.4766 14.0625 20.4766 10.9766 19.0312 8.4375C17.5469 5.9375 14.8906 4.375 12 4.375ZM12 22.5C8.40625 22.5 5.125 20.625 3.32812 17.5C1.53125 14.4141 1.53125 10.625 3.32812 7.5C5.125 4.41406 8.40625 2.5 12 2.5C15.5547 2.5 18.8359 4.41406 20.6328 7.5C22.4297 10.625 22.4297 14.4141 20.6328 17.5C18.8359 20.625 15.5547 22.5 12 22.5ZM16.4141 10.6641L11.4141 15.6641C11.0234 16.0547 10.4375 16.0547 10.0859 15.6641L7.58594 13.1641C7.19531 12.8125 7.19531 12.2266 7.58594 11.875C7.9375 11.4844 8.52344 11.4844 8.91406 11.875L10.75 13.7109L15.0859 9.375C15.4375 8.98438 16.0234 8.98438 16.4141 9.375C16.7656 9.72656 16.7656 10.3125 16.4141 10.6641Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const FeatureBullets = ({\n title,\n bullets,\n image,\n imageAlt = \"\",\n imagePosition = \"right\",\n}: FeatureBulletsProps) => {\n return (\n <section className=\"feature-bullets\">\n <div className=\"feature-bullets__container\">\n <div\n className={[\n \"feature-bullets__split\",\n imagePosition === \"left\" ? \"feature-bullets__split--image-left\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"feature-bullets__content\">\n <h2 className=\"feature-bullets__title\">{title}</h2>\n\n {bullets && bullets.length > 0 && (\n <div className=\"feature-bullets__bullet-list\">\n {bullets.map((bullet, i) => (\n <div key={i} className=\"feature-bullets__bullet-item\">\n <div className=\"feature-bullets__icon-wrapper\">\n <CheckIcon />\n </div>\n <p className=\"feature-bullets__bullet-text\">{bullet}</p>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {image && (\n <div className=\"feature-bullets__image-wrapper\">\n <img\n alt={imageAlt}\n className=\"feature-bullets__image\"\n src={image}\n />\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureBullets;\n","import { useState } from \"react\";\nimport type { FooterProps, FooterDerivGoProps, FooterTradeOnProps } from \"./Footer.types\";\nimport \"./Footer.css\";\n\n/* ── Internal icons ───────────────────────────────────────────── */\n\nconst ExternalLinkIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M2 2H10M10 2V10M10 2L2 10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M2 4L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ── Deriv GO shared content ──────────────────────────────────── */\n\ninterface DerivGoBadgesProps {\n googlePlayBadge?: FooterDerivGoProps[\"googlePlayBadge\"];\n appStoreBadge?: FooterDerivGoProps[\"appStoreBadge\"];\n huaweiBadge?: FooterDerivGoProps[\"huaweiBadge\"];\n availabilityNote?: string;\n}\n\nconst DerivGoBadges = ({\n googlePlayBadge,\n appStoreBadge,\n huaweiBadge,\n availabilityNote,\n}: DerivGoBadgesProps) => (\n <>\n <div className=\"footer__app-badges\">\n {googlePlayBadge && (\n <a\n href={googlePlayBadge.href}\n className={googlePlayBadge.icon ? \"footer__app-badge-svg\" : \"footer__app-badge\"}\n aria-label={googlePlayBadge.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {googlePlayBadge.icon ?? <img src={googlePlayBadge.imageSrc} alt={googlePlayBadge.imageAlt} />}\n </a>\n )}\n {appStoreBadge && (\n <a\n href={appStoreBadge.href}\n className={appStoreBadge.icon ? \"footer__app-badge-svg\" : \"footer__app-badge\"}\n aria-label={appStoreBadge.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {appStoreBadge.icon ?? <img src={appStoreBadge.imageSrc} alt={appStoreBadge.imageAlt} />}\n </a>\n )}\n {huaweiBadge && (\n <a\n href={huaweiBadge.href}\n className={huaweiBadge.icon ? \"footer__app-badge-svg\" : \"footer__app-badge\"}\n aria-label={huaweiBadge.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {huaweiBadge.icon ?? <img src={huaweiBadge.imageSrc} alt={huaweiBadge.imageAlt} />}\n </a>\n )}\n </div>\n {availabilityNote && (\n <p className=\"footer__app-note\">{availabilityNote}</p>\n )}\n</>\n);\n\n/* ── Nav link ─────────────────────────────────────────────────── */\n\ninterface NavLinkProps {\n label: string;\n href?: string;\n isExternal?: boolean;\n onClick?: () => void;\n}\n\nconst NavLink = ({ label, href, isExternal, onClick }: NavLinkProps) => (\n <a\n href={href}\n className=\"footer__nav-link\"\n onClick={onClick}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n >\n {label}\n {isExternal && <ExternalLinkIcon />}\n </a>\n);\n\n/* ── Trade-on banner (e.g. \"Trade on TradingView\") ────────────── */\n\nconst TradeOnBanner = ({ imageSrc, imageAlt, href }: FooterTradeOnProps) => (\n <a\n href={href}\n className=\"footer__trade-on\"\n aria-label={imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img src={imageSrc} alt={imageAlt} className=\"footer__trade-on-img\" />\n </a>\n);\n\n/* ── Footer ───────────────────────────────────────────────────── */\n\nexport const Footer = ({\n logoSrc,\n logoAlt = \"Deriv\",\n navColumns,\n socialLinks = [],\n derivGo,\n tradingView,\n investorsInPeopleSrc,\n investorsInPeopleAlt = \"Investors in People - Platinum\",\n investorsInPeopleInHeader = false,\n licenseText,\n riskWarningText,\n aiSummary,\n className,\n ...props\n}: FooterProps) => {\n // Flatten all nav sections for the mobile/tablet accordion\n const allSections = navColumns.flat();\n\n const [openSections, setOpenSections] = useState<Set<number>>(new Set());\n\n const toggleSection = (index: number) => {\n setOpenSections((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const aiLabel = aiSummary?.label ?? \"Ask AI for a summary of Deriv\";\n\n return (\n <footer\n className={[\"footer\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"footer__inner\">\n\n {/* ── HEADER ROW: Logo · [AI bar — desktop] · Social icons ── */}\n <div className=\"footer__header\">\n <div className=\"footer__logo-wrapper\">\n <img\n src={logoSrc}\n alt={logoAlt}\n className=\"footer__logo\"\n />\n </div>\n\n {/* AI summary bar — visible only on desktop, inline in header */}\n {aiSummary && (\n <div className=\"footer__ai-bar footer__ai-bar--inline\">\n <span className=\"footer__ai-bar-label\">{aiLabel}</span>\n <div className=\"footer__ai-bar-icons\">\n {aiSummary.items.map((item, i) => (\n <a\n key={i}\n href={item.href}\n aria-label={item.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img className=\"footer__ai-icon\" src={item.imageSrc} alt={item.imageAlt} />\n </a>\n ))}\n </div>\n </div>\n )}\n\n <div\n className={[\n \"footer__social\",\n \"footer__social--in-header\",\n investorsInPeopleInHeader && \"footer__social--centered\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {socialLinks.map((link, i) => (\n <a\n key={i}\n href={link.href}\n className=\"footer__social-icon\"\n aria-label={link.ariaLabel}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {link.icon}\n </a>\n ))}\n </div>\n\n {investorsInPeopleInHeader && investorsInPeopleSrc && (\n <div className=\"footer__investors-header\">\n <img\n src={investorsInPeopleSrc}\n alt={investorsInPeopleAlt}\n className=\"footer__investors-img\"\n />\n </div>\n )}\n </div>\n\n {/* ── AI SUMMARY BAR — mobile only (standalone card) ── */}\n {aiSummary && (\n <div className=\"footer__ai-section\">\n <div className=\"footer__ai-bar footer__ai-bar--block\">\n <span className=\"footer__ai-bar-label\">{aiLabel}</span>\n <div className=\"footer__ai-bar-icons\">\n {aiSummary.items.map((item, i) => (\n <a\n key={i}\n href={item.href}\n aria-label={item.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img className=\"footer__ai-icon\" src={item.imageSrc} alt={item.imageAlt} />\n </a>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* ── NAVIGATION — Desktop: multi-column grid + sidebar ── */}\n <div className=\"footer__nav footer__nav--columns\">\n {navColumns.map((column, colIdx) => (\n <div key={colIdx} className=\"footer__column\">\n {column.map((section, secIdx) => (\n <div key={secIdx} className=\"footer__nav-section\">\n <p className=\"footer__nav-title\">{section.title}</p>\n <ul className=\"footer__nav-links\">\n {section.links.map((link, linkIdx) => (\n <li key={linkIdx}>\n <NavLink {...link} />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n ))}\n\n {/* Desktop sidebar: Investors in People + Deriv GO with QR */}\n <div className=\"footer__sidebar\">\n {investorsInPeopleSrc && !investorsInPeopleInHeader && (\n <div className=\"footer__investors-card\">\n <img\n src={investorsInPeopleSrc}\n alt={investorsInPeopleAlt}\n className=\"footer__investors-img\"\n />\n </div>\n )}\n\n {derivGo && (\n <div className=\"footer__deriv-go-card\">\n <div className=\"footer__deriv-go-header\">\n <img\n src={derivGo.logoSrc}\n alt={derivGo.logoAlt ?? \"Deriv GO\"}\n className=\"footer__deriv-go-logo\"\n />\n <span className=\"footer__deriv-go-title\">\n {derivGo.title ?? \"Deriv GO\"}\n </span>\n </div>\n <p className=\"footer__deriv-go-desc\">\n {derivGo.description ?? \"Trade multipliers on our mobile app.\"}\n </p>\n {(derivGo.qrCodeSrc || derivGo.qrCodeIcon) && (\n <div\n className={[\n \"footer__deriv-go-qr\",\n derivGo.qrCodeIcon && \"footer__deriv-go-qr--framed\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {derivGo.qrCodeIcon ? (\n <div className=\"footer__deriv-go-qr-icon\">\n {derivGo.qrCodeIcon}\n </div>\n ) : (\n <img\n src={derivGo.qrCodeSrc}\n alt={derivGo.qrCodeAlt ?? \"Scan to download\"}\n className=\"footer__deriv-go-qr-img\"\n />\n )}\n <span className=\"footer__deriv-go-qr-label\">\n {derivGo.scanToDownloadLabel ?? \"Scan to download\"}\n </span>\n </div>\n )}\n <DerivGoBadges\n googlePlayBadge={derivGo.googlePlayBadge}\n appStoreBadge={derivGo.appStoreBadge}\n huaweiBadge={derivGo.huaweiBadge}\n availabilityNote={derivGo.availabilityNote}\n />\n </div>\n )}\n\n {tradingView && <TradeOnBanner {...tradingView} />}\n </div>\n </div>\n\n {/* ── NAVIGATION — Mobile/Tablet: accordion ── */}\n <div className=\"footer__nav footer__nav--accordion\">\n {allSections.map((section, idx) => {\n const isOpen = openSections.has(idx);\n return (\n <div\n key={idx}\n className={[\n \"footer__accordion-item\",\n isOpen && \"footer__accordion-item--open\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <button\n type=\"button\"\n className=\"footer__accordion-toggle\"\n onClick={() => toggleSection(idx)}\n aria-expanded={isOpen}\n >\n <span className=\"footer__accordion-label\">\n {section.title}\n </span>\n <span className=\"footer__accordion-chevron\">\n <ChevronDownIcon />\n </span>\n </button>\n {isOpen && (\n <ul className=\"footer__accordion-links\">\n {section.links.map((link, linkIdx) => (\n <li key={linkIdx}>\n <NavLink {...link} />\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n })}\n </div>\n\n {/* ── SOCIAL ICONS — Mobile only (standalone, above Deriv GO) ── */}\n {socialLinks.length > 0 && (\n <div className=\"footer__social footer__social--standalone\">\n {socialLinks.map((link, i) => (\n <a\n key={i}\n href={link.href}\n className=\"footer__social-icon\"\n aria-label={link.ariaLabel}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {link.icon}\n </a>\n ))}\n </div>\n )}\n\n {/* ── DERIV GO BANNER — Mobile/Tablet stacked (no QR) ── */}\n {derivGo && (\n <div className=\"footer__deriv-go-banner\">\n <div className=\"footer__deriv-go-banner-info\">\n <div className=\"footer__deriv-go-header\">\n <img\n src={derivGo.logoSrc}\n alt={derivGo.logoAlt ?? \"Deriv GO\"}\n className=\"footer__deriv-go-logo\"\n />\n <span className=\"footer__deriv-go-title\">\n {derivGo.title ?? \"Deriv GO\"}\n </span>\n </div>\n <p className=\"footer__deriv-go-desc\">\n {derivGo.description ?? \"Trade multipliers on our mobile app.\"}\n </p>\n </div>\n <div className=\"footer__deriv-go-banner-badges\">\n <DerivGoBadges\n googlePlayBadge={derivGo.googlePlayBadge}\n appStoreBadge={derivGo.appStoreBadge}\n huaweiBadge={derivGo.huaweiBadge}\n availabilityNote={derivGo.availabilityNote}\n />\n </div>\n </div>\n )}\n\n {/* ── TRADE ON TRADINGVIEW — Mobile/Tablet only (desktop shows it in the sidebar) ── */}\n {tradingView && (\n <div className=\"footer__trade-on-stacked\">\n <TradeOnBanner {...tradingView} />\n </div>\n )}\n\n {/* ── LEGAL & RISK WARNING ── */}\n {(licenseText || riskWarningText) && (\n <div className=\"footer__legal-block\">\n {licenseText && (\n <div className=\"footer__license\">{licenseText}</div>\n )}\n {riskWarningText && (\n <div className=\"footer__risk-warning\">\n <p className=\"footer__risk-warning-text\">{riskWarningText}</p>\n </div>\n )}\n </div>\n )}\n\n {/* ── INVESTORS IN PEOPLE — Mobile/Tablet (centred) ── */}\n {investorsInPeopleSrc && (\n <div className=\"footer__investors-stacked\">\n <img\n src={investorsInPeopleSrc}\n alt={investorsInPeopleAlt}\n className=\"footer__investors-img\"\n />\n </div>\n )}\n </div>\n </footer>\n );\n};\n\nexport default Footer;\n","import React from \"react\";\nimport type { HeroTrustpilotProps } from \"./Hero.types\";\n\n/* ── Trustpilot band (opt-in) ─────────────────────────────────\n * Mirrors deriv.com's `home-hero_trustpilot-wrapper`: a flat dark 56px strip\n * pinned to the bottom edge of the hero, holding \"stars · score copy ·\n * Trustpilot wordmark\" as a single outbound link. Square-cornered at rest;\n * the hero's scroll-shrink animation rounds it together with the section. Rendered only when `Hero` receives a `trustpilot`\n * prop, so heroes without it are byte-for-byte unchanged.\n *\n * Star and wordmark geometry is Trustpilot's own (the same SVGs deriv.com\n * serves), drawn inline so no asset file or network fetch is needed and the\n * star fill can follow the score.\n * ──────────────────────────────────────────────────────────── */\n\nexport const DEFAULT_TRUSTPILOT_URL =\n \"https://www.trustpilot.com/review/deriv.com?utm_medium=trustbox&utm_source=Mini\";\n\nconst STAR_CELL = 24;\nconst STAR_GAP = 8;\nconst STAR_COUNT = 5;\nconst STARS_WIDTH = STAR_COUNT * STAR_CELL + (STAR_COUNT - 1) * STAR_GAP; // 152\n\n/* Star glyph as drawn in Trustpilot's `stars-*.svg`, in a 24×24 cell. */\nconst STAR_GLYPH =\n \"M15.6562 15.2812L12 16.25L17.1875 20L15.6562 15.2812ZM20.4062 10.125L12 16.25L6.78125 20L8.78125 13.9062L3.5625 10.125H10L12 4L13.9688 10.125H20.4062Z\";\n\n/**\n * Trustpilot's display rounding: .25–.74 shows a half star, ≥ .75 rounds up.\n * A 4.3 TrustScore therefore renders four full stars and one half star.\n */\nexport function trustpilotStars(score: number): number {\n const clamped = Math.max(0, Math.min(STAR_COUNT, score));\n const whole = Math.floor(clamped);\n const frac = clamped - whole;\n const rounded = frac < 0.25 ? 0 : frac < 0.75 ? 0.5 : 1;\n return Math.min(STAR_COUNT, whole + rounded);\n}\n\nconst Stars = ({ score }: { score: number }) => {\n const stars = trustpilotStars(score);\n return (\n <svg\n className=\"hero__trustpilot-stars\"\n viewBox={`0 0 ${STARS_WIDTH} ${STAR_CELL}`}\n width={STARS_WIDTH}\n height={STAR_CELL}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {Array.from({ length: STAR_COUNT }, (_, i) => {\n const x = i * (STAR_CELL + STAR_GAP);\n const fill = Math.max(0, Math.min(1, stars - i));\n return (\n <g key={i} transform={`translate(${x} 0)`}>\n {/* Empty portion of the cell */}\n <rect\n width={STAR_CELL}\n height={STAR_CELL}\n className=\"hero__trustpilot-star-empty\"\n />\n {/* Filled portion — partial width for the half star */}\n {fill > 0 && (\n <rect\n width={STAR_CELL * fill}\n height={STAR_CELL}\n className=\"hero__trustpilot-star-fill\"\n />\n )}\n <path d={STAR_GLYPH} className=\"hero__trustpilot-star-glyph\" />\n </g>\n );\n })}\n </svg>\n );\n};\n\n/* Trustpilot wordmark (100×24), text in currentColor, brand-green star. */\nconst Wordmark = () => (\n <svg\n className=\"hero__trustpilot-logo\"\n viewBox=\"0 0 100 24\"\n width={100}\n height={24}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n className=\"hero__trustpilot-logo-text\"\n d=\"M26.2033 8.56587H36.289V10.4286H32.3323V20.8067H30.16V10.3906H26.2033V8.56587ZM35.8623 11.9112H37.7242V13.6219H37.763C37.8406 13.3938 37.957 13.1657 38.1122 12.9376C38.2673 12.7095 38.5001 12.4814 38.7328 12.3294C38.9656 12.1393 39.2371 11.9872 39.5086 11.8732C39.7802 11.7591 40.0905 11.6831 40.4008 11.6831C40.6336 11.6831 40.7887 11.6831 40.8663 11.6831C40.9439 11.6831 41.0603 11.7211 41.1378 11.7211V13.5839C40.9827 13.5458 40.8663 13.5458 40.7111 13.5078C40.556 13.5078 40.4396 13.4698 40.2845 13.4698C39.9353 13.4698 39.625 13.5458 39.3535 13.6599C39.0431 13.7739 38.8104 14.002 38.5776 14.2301C38.3449 14.4962 38.1897 14.8003 38.0346 15.1805C37.9182 15.5606 37.8406 15.9788 37.8406 16.473V20.6927H35.8623V11.9112ZM48.353 20.7687V19.5522H48.3142C48.0814 20.0084 47.6935 20.3505 47.228 20.6166C46.7625 20.8827 46.2583 21.0348 45.754 21.0348C44.5515 21.0348 43.6981 20.7687 43.1938 20.1605C42.6507 19.5902 42.418 18.7159 42.418 17.5374V11.9112H44.3963V17.3473C44.3963 18.1076 44.5514 18.6779 44.8618 18.982C45.1721 19.2861 45.5988 19.4762 46.1419 19.4762C46.5686 19.4762 46.9177 19.4002 47.1892 19.2861C47.4608 19.1721 47.6935 18.982 47.8487 18.7919C48.0426 18.6018 48.159 18.3357 48.2366 18.0316C48.3142 17.7275 48.353 17.4234 48.353 17.0812V11.9492H50.3313V20.7687H48.353ZM53.7061 17.9176C53.7837 18.4878 53.9776 18.8679 54.3656 19.1341C54.7535 19.3621 55.219 19.4762 55.762 19.4762C55.956 19.4762 56.1499 19.4762 56.3827 19.4382C56.6154 19.4002 56.8482 19.3621 57.0421 19.2861C57.2361 19.2101 57.43 19.096 57.5464 18.944C57.6628 18.7919 57.7404 18.6018 57.7404 18.3357C57.7404 18.0696 57.624 17.8796 57.4688 17.7275C57.2749 17.5754 57.0809 17.4614 56.8094 17.3473C56.5378 17.2713 56.2275 17.1573 55.8784 17.0812C55.5293 17.0052 55.1802 16.9292 54.831 16.8532C54.4431 16.7771 54.094 16.6631 53.7449 16.549C53.3958 16.435 53.0855 16.2829 52.8139 16.0929C52.5424 15.9028 52.3096 15.6367 52.1545 15.3325C51.9993 15.0284 51.9217 14.6483 51.9217 14.2301C51.9217 13.7359 52.0381 13.3558 52.2708 13.0136C52.5036 12.6715 52.8139 12.4434 53.163 12.2153C53.5509 12.0252 53.9389 11.8732 54.4043 11.7971C54.8698 11.7211 55.2965 11.6831 55.6844 11.6831C56.1499 11.6831 56.6154 11.7211 57.0033 11.8352C57.43 11.9112 57.8179 12.1013 58.1671 12.2913C58.5162 12.5194 58.7877 12.7855 59.0205 13.1277C59.2532 13.4698 59.4084 13.888 59.4472 14.3822H57.3525C57.2749 13.926 57.0421 13.5839 56.693 13.4318C56.3439 13.2797 55.956 13.2037 55.5293 13.2037C55.3741 13.2037 55.219 13.2037 55.025 13.2417C54.831 13.2797 54.6371 13.3177 54.4819 13.3558C54.3268 13.4318 54.1716 13.5078 54.0552 13.6219C53.9389 13.7359 53.8613 13.888 53.8613 14.0781C53.8613 14.3061 53.9389 14.4962 54.1328 14.6483C54.288 14.8003 54.5207 14.9144 54.7923 15.0284C55.0638 15.1045 55.3741 15.2185 55.7232 15.2945C56.0724 15.3706 56.4215 15.4466 56.8094 15.5226C57.1585 15.5987 57.5076 15.7127 57.8567 15.8267C58.2059 15.9408 58.5162 16.0929 58.7877 16.2829C59.0593 16.473 59.292 16.7391 59.4472 17.0052C59.6023 17.2713 59.7187 17.6515 59.7187 18.1076C59.7187 18.6399 59.6023 19.058 59.3308 19.4382C59.098 19.8183 58.7489 20.0844 58.3998 20.3125C58.0119 20.5406 57.5852 20.6927 57.0809 20.8067C56.6154 20.9208 56.1499 20.9588 55.6457 20.9588C55.0638 20.9588 54.5595 20.8827 54.0552 20.7687C53.5897 20.6547 53.163 20.4646 52.8139 20.1985C52.4648 19.9324 52.1933 19.6282 51.9605 19.2481C51.7666 18.8679 51.6502 18.4118 51.6502 17.8796L53.7061 17.9176ZM60.2618 11.9112H61.7746V9.25014H63.753V11.9112H65.5373V13.3558H63.753V18.0696C63.753 18.2597 63.753 18.4498 63.7917 18.6018C63.7917 18.7539 63.8693 18.8679 63.9081 18.982C63.9857 19.096 64.0633 19.1721 64.1797 19.2101C64.296 19.2481 64.49 19.2861 64.7227 19.2861C64.8779 19.2861 64.9943 19.2861 65.1494 19.2861C65.3046 19.2861 65.421 19.2481 65.5761 19.2101V20.7307C65.3434 20.7687 65.1494 20.7687 64.9167 20.8067C64.7227 20.8447 64.49 20.8447 64.2572 20.8447C63.7142 20.8447 63.3263 20.8067 62.9771 20.6927C62.6668 20.6166 62.3953 20.4646 62.2401 20.2745C62.0462 20.0844 61.9298 19.8563 61.8522 19.5522C61.7746 19.2861 61.7358 18.944 61.7358 18.5638V13.3938H60.223L60.2618 11.9112ZM66.9726 11.9112H68.8734V13.1277H68.9122C69.1837 12.5955 69.5716 12.2533 70.0759 12.0252C70.5802 11.7971 71.1232 11.6831 71.7051 11.6831C72.4033 11.6831 73.024 11.7971 73.5671 12.0633C74.1101 12.2913 74.5368 12.6335 74.8859 13.0897C75.2351 13.5078 75.5066 14.04 75.6618 14.5722C75.8557 15.1425 75.9333 15.7507 75.9333 16.397C75.9333 17.0052 75.8557 17.5754 75.7006 18.1076C75.5454 18.6779 75.3127 19.1721 75.0023 19.5902C74.692 20.0084 74.2653 20.3505 73.7998 20.6166C73.2955 20.8827 72.7524 20.9968 72.0542 20.9968C71.7827 20.9968 71.4723 20.9588 71.2008 20.9208C70.9293 20.8827 70.6189 20.7687 70.3474 20.6547C70.0759 20.5406 69.8431 20.3885 69.6104 20.1985C69.3776 20.0084 69.1837 19.8183 69.0285 19.5902H68.9897V24H67.0114V11.9112H66.9726ZM73.9162 16.359C73.9162 15.9788 73.8774 15.5606 73.761 15.1805C73.6446 14.8003 73.4895 14.4582 73.2955 14.1921C73.1016 13.888 72.83 13.6599 72.5197 13.5078C72.2094 13.3178 71.8603 13.2417 71.4336 13.2417C70.5802 13.2417 69.9595 13.5078 69.5328 14.0781C69.1061 14.6483 68.9122 15.4086 68.9122 16.359C68.9122 16.8151 68.9509 17.2333 69.0673 17.6135C69.1837 17.9936 69.3388 18.3357 69.5716 18.6018C69.8043 18.8679 70.0371 19.096 70.3474 19.2481C70.6577 19.4002 71.0069 19.4762 71.4336 19.4762C71.8991 19.4762 72.287 19.4002 72.5973 19.2101C72.9076 19.02 73.1792 18.7919 73.3731 18.4878C73.5671 18.1837 73.7222 17.8796 73.7998 17.4994C73.8774 17.1193 73.9162 16.7391 73.9162 16.359ZM77.4074 8.56587H79.3857V10.4286H77.4074V8.56587ZM77.4074 11.9112H79.3857V20.7687H77.4074V11.9112ZM81.1701 8.56587H83.1484V20.7687H81.1701V8.56587ZM89.2774 20.9968C88.5404 20.9968 87.9197 20.8827 87.3378 20.6547C86.756 20.4266 86.2905 20.0844 85.9026 19.7043C85.5147 19.2861 85.2043 18.7919 85.0104 18.2217C84.8164 17.6515 84.7001 17.0052 84.7001 16.359C84.7001 15.6747 84.8164 15.0664 85.0104 14.4962C85.2043 13.926 85.5147 13.4318 85.9026 13.0136C86.2905 12.5955 86.756 12.2913 87.3378 12.0633C87.9197 11.8352 88.5404 11.7211 89.2774 11.7211C90.0144 11.7211 90.6351 11.8352 91.2169 12.0633C91.7988 12.2913 92.2643 12.6335 92.6522 13.0136C93.0401 13.4318 93.3504 13.926 93.5444 14.4962C93.7383 15.0664 93.8547 15.6747 93.8547 16.359C93.8547 17.0432 93.7383 17.6515 93.5444 18.2217C93.3504 18.7919 93.0401 19.2861 92.6522 19.7043C92.2643 20.1224 91.7988 20.4266 91.2169 20.6547C90.6351 20.8827 90.0144 20.9968 89.2774 20.9968ZM89.2774 19.4762C89.7041 19.4762 90.092 19.4002 90.4411 19.2101C90.7514 19.02 91.023 18.7919 91.2557 18.4878C91.4497 18.1837 91.6048 17.8415 91.7212 17.4994C91.7988 17.1193 91.8764 16.7391 91.8764 16.359C91.8764 15.9788 91.8376 15.5987 91.7212 15.2185C91.6436 14.8384 91.4497 14.4962 91.2557 14.2301C91.0618 13.926 90.7902 13.6979 90.4411 13.5078C90.1308 13.3178 89.7429 13.2417 89.2774 13.2417C88.8507 13.2417 88.4628 13.3178 88.1137 13.5078C87.8033 13.6979 87.5318 13.926 87.299 14.2301C87.1051 14.5342 86.9499 14.8384 86.8336 15.2185C86.756 15.5987 86.6784 15.9788 86.6784 16.359C86.6784 16.7391 86.7172 17.1193 86.8336 17.4994C86.9111 17.8796 87.1051 18.2217 87.299 18.4878C87.493 18.7919 87.7645 19.02 88.1137 19.2101C88.4628 19.4002 88.8507 19.4762 89.2774 19.4762ZM94.3978 11.9112H95.9106V9.25014H97.889V11.9112H99.6733V13.3558H97.889V18.0696C97.889 18.2597 97.889 18.4498 97.9278 18.6018C97.9278 18.7539 98.0053 18.8679 98.0441 18.982C98.1217 19.096 98.1993 19.1721 98.3157 19.2101C98.432 19.2481 98.626 19.2861 98.8587 19.2861C99.0139 19.2861 99.1303 19.2861 99.2854 19.2861C99.4406 19.2861 99.557 19.2481 99.7121 19.2101V20.7307C99.4794 20.7687 99.2854 20.7687 99.0527 20.8067C98.8587 20.8447 98.626 20.8447 98.3933 20.8447C97.8502 20.8447 97.4623 20.8067 97.1131 20.6927C96.8028 20.6166 96.5313 20.4646 96.3761 20.2745C96.1822 20.0844 96.0658 19.8563 95.9882 19.5522C95.9106 19.2861 95.8718 18.944 95.8718 18.5638V13.3938H94.359L94.3978 11.9112Z\"\n />\n <path\n className=\"hero__trustpilot-logo-star\"\n d=\"M11.9424 16.999L17.1435 15.6794L19.326 22.2513L11.9424 16.999ZM23.8759 8.50378H14.7585L11.9424 0L9.12618 8.50378L0 8.49515L7.38366 13.7475L4.56748 22.2513L11.9424 16.999L16.501 13.7561L23.8759 8.50378Z\"\n />\n <path\n className=\"hero__trustpilot-logo-star-shadow\"\n d=\"M11.9424 16.999L17.1408 15.6801L16.501 13.7561L11.9424 16.999Z\"\n />\n </svg>\n);\n\nexport const DEFAULT_TRUSTPILOT_TEXT =\n \"Deriv scores {score} out of 5 based on {reviewCount} reviews\";\n\nconst formatCount = (value: number | string, locale: string) =>\n typeof value === \"number\" ? new Intl.NumberFormat(locale).format(value) : value;\n\nconst formatScore = (value: number, locale: string) =>\n new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value);\n\nconst PLACEHOLDER = /(\\{score\\}|\\{reviewCount\\})/g;\n\n/**\n * Split the sentence template around its two placeholders so each value can\n * carry its own span while the surrounding words stay one translatable\n * string. Unknown or missing placeholders are simply left as written.\n */\nfunction renderTemplate(template: string, values: { score: string; reviewCount: string }) {\n return template.split(PLACEHOLDER).map((part, i) => {\n if (part === \"{score}\") {\n return (\n <span key={i} className=\"hero__trustpilot-text-score\">\n {values.score}\n </span>\n );\n }\n if (part === \"{reviewCount}\") {\n return (\n <span key={i} className=\"hero__trustpilot-text-count\">\n {values.reviewCount}\n </span>\n );\n }\n return part;\n });\n}\n\nfunction fillTemplate(template: string, values: { score: string; reviewCount: string }) {\n return template.replace(\"{score}\", values.score).replace(\"{reviewCount}\", values.reviewCount);\n}\n\nexport const HeroTrustpilot = ({\n score,\n reviewCount,\n href = DEFAULT_TRUSTPILOT_URL,\n text,\n label,\n locale = \"en-US\",\n ariaLabel,\n}: HeroTrustpilotProps) => {\n const values = {\n score: formatScore(score, locale),\n reviewCount: formatCount(reviewCount, locale),\n };\n /* `label` predates `text`; keep honouring it when no full sentence is\n supplied so existing English callers render unchanged. */\n const template =\n text ?? (label ? `${label} {score} out of 5 based on {reviewCount} reviews` : DEFAULT_TRUSTPILOT_TEXT);\n const sentence = fillTemplate(template, values);\n\n return (\n <div className=\"hero__trustpilot home-hero_trustpilot-wrapper\">\n <a\n href={href}\n className=\"hero__trustpilot-link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={ariaLabel ?? `${sentence} — Trustpilot`}\n >\n <Stars score={score} />\n <span className=\"hero__trustpilot-text\" aria-hidden=\"true\">\n {renderTemplate(template, values)}\n </span>\n <Wordmark />\n </a>\n </div>\n );\n};\n\nexport default HeroTrustpilot;\n","import React from \"react\";\nimport type { HeroProps } from \"./Hero.types\";\nimport { Button } from \"../../components/Button\";\nimport { HeroTrustpilot } from \"./HeroTrustpilot\";\nimport \"./Hero.css\";\n\n/* ── Helpers ──────────────────────────────────────────────── */\n\n/** Renders a ReactNode or a plain string as an <img> */\nconst Visual = ({\n src,\n className,\n alt = \"\",\n}: {\n src: React.ReactNode | string;\n className: string;\n alt?: string;\n}) => (\n <div className={className}>\n {typeof src === \"string\" ? <img src={src} alt={alt} /> : src}\n </div>\n);\n\n/* ── Button block helper ──────────────────────────────────── */\n\nconst ButtonBlock = ({\n primaryButton,\n secondaryButton,\n}: Pick<HeroProps, \"primaryButton\" | \"secondaryButton\">) => {\n if (!primaryButton && !secondaryButton) return null;\n return (\n <div className=\"hero__buttons\">\n {primaryButton &&\n (primaryButton.href ? (\n <a href={primaryButton.href}>\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n ))}\n {secondaryButton &&\n (secondaryButton.href ? (\n <a href={secondaryButton.href}>\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n ))}\n </div>\n );\n};\n\n/* ── Hero ─────────────────────────────────────────────────── */\n\nexport const Hero = ({\n variant,\n subtitle,\n title,\n description,\n primaryButton,\n secondaryButton,\n backgroundImageSrc,\n heroImage,\n productImage,\n floatingImage,\n trustpilot,\n className,\n ...props\n}: HeroProps) => {\n const variantClass = `hero--${variant}`;\n /* The band is purely additive: without the prop no class, node or style\n is emitted, so existing heroes are unaffected. */\n const trustpilotClass = trustpilot ? \"hero--has-trustpilot\" : undefined;\n const trustpilotBand = trustpilot ? <HeroTrustpilot {...trustpilot} /> : null;\n\n /* ── Split ── */\n if (variant === \"split\") {\n return (\n <section\n className={[\"hero\", variantClass, trustpilotClass, className].filter(Boolean).join(\" \")}\n style={\n backgroundImageSrc\n ? { backgroundImage: `url(${backgroundImageSrc})` }\n : undefined\n }\n {...props}\n >\n {/* Layer 1: gradient overlay */}\n <div className=\"hero__overlay\" aria-hidden=\"true\" />\n\n {/* Layer 2a: secondary foreground (e.g. a device mockup).\n Rendered BEFORE the hero image so that, at equal z-index,\n DOM order paints it underneath the subject. */}\n {floatingImage && (\n <Visual\n src={floatingImage}\n className=\"hero__floating-image\"\n alt=\"\"\n />\n )}\n\n {/* Layer 2b: transparent PNG — direct child of section for correct z-index */}\n {heroImage && (\n <Visual src={heroImage} className=\"hero__image-slot\" alt=\"\" />\n )}\n\n {/* Layer 3: text + buttons */}\n <div className=\"hero__inner\">\n <div className=\"hero__content\">\n <div className=\"hero__left\">\n <div className=\"hero__body\">\n <div className=\"hero__text\">\n {subtitle && (\n <p className=\"hero__subtitle\">{subtitle}</p>\n )}\n <h2 className=\"hero__title\">{title}</h2>\n {description && (\n <p className=\"hero__description\">{description}</p>\n )}\n </div>\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n </div>\n </div>\n </div>\n </div>\n\n {trustpilotBand}\n </section>\n );\n }\n\n /* ── Centered ── */\n if (variant === \"centered\") {\n return (\n <section\n className={[\"hero\", variantClass, trustpilotClass, className].filter(Boolean).join(\" \")}\n style={\n backgroundImageSrc\n ? { backgroundImage: `url(${backgroundImageSrc})` }\n : undefined\n }\n {...props}\n >\n <div className=\"hero__overlay\" aria-hidden=\"true\" />\n <div className=\"hero__inner\">\n <div className=\"hero__content\">\n <div className=\"hero__text\">\n {subtitle && <p className=\"hero__subtitle\">{subtitle}</p>}\n <h2 className=\"hero__title\">{title}</h2>\n {description && (\n <p className=\"hero__description\">{description}</p>\n )}\n </div>\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n </div>\n </div>\n\n {trustpilotBand}\n </section>\n );\n }\n\n /* ── Showcase ── */\n return (\n <section\n className={[\"hero\", variantClass, trustpilotClass, className].filter(Boolean).join(\" \")}\n style={\n backgroundImageSrc\n ? { backgroundImage: `url(${backgroundImageSrc})` }\n : undefined\n }\n {...props}\n >\n <div className=\"hero__overlay\" aria-hidden=\"true\" />\n <div className=\"hero__inner\">\n <div className=\"hero__content\">\n <div className=\"hero__text\">\n {subtitle && <p className=\"hero__subtitle\">{subtitle}</p>}\n <h2 className=\"hero__title\">{title}</h2>\n {description && (\n <p className=\"hero__description\">{description}</p>\n )}\n </div>\n\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n\n {productImage && (\n <Visual\n src={productImage}\n className=\"hero__product-image\"\n alt=\"\"\n />\n )}\n\n {floatingImage && (\n <Visual\n src={floatingImage}\n className=\"hero__floating-image\"\n alt=\"\"\n />\n )}\n </div>\n </div>\n\n {trustpilotBand}\n </section>\n );\n};\n\nexport default Hero;\n","import React, { useEffect, useRef } from \"react\";\nimport type { HeaderProps } from \"./Header.types\";\nimport { Button } from \"../../components/Button\";\nimport { SearchField } from \"../../components/SearchField\";\nimport \"./Header.css\";\n\n/* ── Button block helper ──────────────────────────────────── */\n\nconst ButtonBlock = ({\n primaryButton,\n secondaryButton,\n}: Pick<HeaderProps, \"primaryButton\" | \"secondaryButton\">) => {\n if (!primaryButton && !secondaryButton) return null;\n return (\n <div className=\"header__buttons\">\n {primaryButton &&\n (primaryButton.href ? (\n <a href={primaryButton.href}>\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n ))}\n {secondaryButton &&\n (secondaryButton.href ? (\n <a href={secondaryButton.href}>\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n ))}\n </div>\n );\n};\n\n/* ── Search block helper (dark-search variant only) ──────────── */\n\nconst SearchBlock = ({ search }: Pick<HeaderProps, \"search\">) => {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n search?.onSubmit?.(event.currentTarget.value);\n }\n };\n\n return (\n <div className=\"header__search\">\n <SearchField\n placeholder={search?.placeholder ?? \"Search\"}\n value={search?.value}\n onChange={search?.onChange}\n onClear={search?.onClear}\n onKeyDown={handleKeyDown}\n showSearchIcon={false}\n />\n </div>\n );\n};\n\n/* ── Header ───────────────────────────────────────────────── */\n\nexport const Header = ({\n variant,\n subtitle,\n title,\n description,\n primaryButton,\n secondaryButton,\n leftVisual,\n rightVisual,\n search,\n underNavbar = false,\n className,\n ...props\n}: HeaderProps) => {\n const variantClass = `header--${variant}`;\n\n /* ── Parallax refs (visuals variant only) ── */\n const sectionRef = useRef<HTMLElement>(null);\n const leftRef = useRef<HTMLDivElement>(null);\n const rightRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (variant !== \"visuals\") return;\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n\n const section = sectionRef.current;\n const leftEl = leftRef.current;\n const rightEl = rightRef.current;\n if (!section || !leftEl || !rightEl) return;\n\n const STRENGTH = 60; // px travel distance\n\n const onScroll = () => {\n const rect = section.getBoundingClientRect();\n const viewH = window.innerHeight;\n const progress = 1 - rect.bottom / (viewH + rect.height);\n const clamped = Math.max(0, Math.min(1, progress));\n const offset = (clamped - 0.5) * STRENGTH * 2;\n leftEl.style.transform = `translateY(${-offset}px)`;\n rightEl.style.transform = `translateY(${offset}px)`;\n };\n\n const scrollEl = (() => {\n let el: Element | null = section.parentElement;\n while (el && el !== document.documentElement) {\n const { overflow, overflowY } = getComputedStyle(el);\n if (/auto|scroll/.test(overflow + overflowY)) return el;\n el = el.parentElement;\n }\n return window;\n })();\n\n scrollEl.addEventListener(\"scroll\", onScroll, { passive: true });\n onScroll();\n\n return () => scrollEl.removeEventListener(\"scroll\", onScroll);\n }, [variant]);\n\n /* ── Shared text block ── */\n const textBlock = (\n <div className=\"header__text\">\n {subtitle && <p className=\"header__subtitle\">{subtitle}</p>}\n <h2 className=\"header__title\">{title}</h2>\n {description && <p className=\"header__description\">{description}</p>}\n </div>\n );\n\n return (\n <section\n ref={sectionRef}\n className={[\"header\", variantClass, underNavbar && \"header--under-navbar\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* Layer 1: grid pattern */}\n <div className=\"header__grid\" aria-hidden=\"true\" />\n\n {/* Layer 2: floating visuals (visuals variant only) */}\n {variant === \"visuals\" && leftVisual && (\n <div ref={leftRef} className=\"header__visual header__visual--left\">\n {typeof leftVisual === \"string\" ? (\n <img src={leftVisual} alt=\"\" />\n ) : (\n leftVisual\n )}\n </div>\n )}\n {variant === \"visuals\" && rightVisual && (\n <div ref={rightRef} className=\"header__visual header__visual--right\">\n {typeof rightVisual === \"string\" ? (\n <img src={rightVisual} alt=\"\" />\n ) : (\n rightVisual\n )}\n </div>\n )}\n\n {/* Layer 3: overlay fades the visuals at edges */}\n <div className=\"header__overlay\" aria-hidden=\"true\" />\n\n {/* Layer 4: text + button always on top */}\n <div className=\"header__inner\">\n <div className=\"header__content\">\n <div className=\"header__body\">\n {textBlock}\n {variant === \"dark-search\" && <SearchBlock search={search} />}\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Header;\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { StatsAward, StatsProps } from \"./StatsV2.types\";\nimport \"./StatsV2.css\";\n\n/* ── Animation constants ─────────────────────────────────────\n * Values extracted directly from the Webflow IX2 action list\n * `a-2` (\"Сarousel of Achievements 175\") on\n * `.achievements_slider-component` in the `stats-carousel`\n * reference. Each animated keyframe uses:\n *\n * delay : 1000ms ← hold between transitions\n * duration : 700ms ← length of each transition\n * easing : cubic-bezier(0.33, 1, 0.68, 1) (ease-out-cubic)\n * loop : true\n *\n * We model this in React with:\n * • a CSS transition that ONLY holds the duration + easing\n * (no delay), so the animation runs the moment the inline\n * transform/opacity change;\n * • a self-rescheduling `setTimeout` loop that uses HOLD_MS\n * (1000ms) for the first tick + after every snap-back, and\n * INTERVAL_MS (1700ms = delay + duration) between normal\n * advances — matching Webflow's IX2 cadence frame-for-frame.\n *\n * Putting the delay inside `transition` (which we tried first)\n * pushes the very first animation 2.7 s out from mount and\n * re-introduces a delay between Storybook's hot-reload and the\n * first visible movement — so we keep the wait outside CSS.\n */\nconst HOLD_MS = 1000;\nconst STEP_DURATION_MS = 700;\nconst INTERVAL_MS = HOLD_MS + STEP_DURATION_MS;\nconst EASING = \"cubic-bezier(0.33, 1, 0.68, 1)\";\nconst TRANSITION =\n `transform ${STEP_DURATION_MS}ms ${EASING},` +\n ` opacity ${STEP_DURATION_MS}ms ${EASING}`;\n\n/* ── Scroll-driven parallax on the side blocks ───────────────\n * Custom approach (no longer a literal port of the Webflow IX2\n * keyframes): the two side columns are centred in the layout\n * and start with a CSS stagger applied as an initial transform\n * (LEFT `translateY(-26.3%)`, RIGHT `translateY(+26.3%)`). The\n * scroll-driven parallax then interpolates those transforms\n * back to `translateY(0%)` as the user scrolls past the\n * section, so when the animation ends both columns are at\n * exactly the same transform — guaranteed parallel regardless\n * of how tall the badge stacks are.\n *\n * scroll ≤ PARALLAX_START → LEFT −26.3% / RIGHT +26.3%\n * scroll = PARALLAX_END → LEFT 0% / RIGHT 0%\n * scroll > PARALLAX_END → held at 0% / 0% (parallel)\n *\n * Keep `PARALLAX_MAX_PERCENT` here in sync with the initial\n * transform values on `.stats-v2__awards-col--left/--right`\n * in StatsV2.css.\n */\nconst PARALLAX_START = 0.10;\nconst PARALLAX_END = 0.45;\nconst PARALLAX_MAX_PERCENT = 26.3;\nconst PARALLAX_BREAKPOINT = 992;\n\n/* ── Carousel slot model ─────────────────────────────────────\n * Webflow's IX2 maps every slider item to one of FIVE logical\n * slots. The inline styles in `index.html` show the exact\n * transform values the live site uses on each slider item,\n * which we mirror 1:1:\n *\n * above : translate3d(0, -110%, 0) scale3d(0.65, 0.65, 1) opacity 1\n * active : translate3d(0, 0%, 0) scale3d(1.0, 1.0, 1) opacity 1\n * below : translate3d(0, +110%, 0) scale3d(0.65, 0.65, 1) opacity 1\n * exiting : translate3d(0, -110%, 0) scale3d(0.4, 0.4, 1) opacity 0\n * queued : translate3d(0, +110%, 0) scale3d(0.4, 0.4, 1) opacity 0\n *\n * Webflow's reference ships 0.7 for above/below, but the design\n * uses 0.65 here for slightly stronger visual deference to the\n * centred active stat.\n *\n * The CSS already centres each item via `translate(-50%, -50%)`\n * (see `.stats-v2__stat`), so we PREPEND that centring translate\n * to the Webflow transform here. Order matters — the centring\n * must come first so the slot translate's `%` units are applied\n * to the element's own box, not to a half-shifted origin.\n *\n * The `--stats-v2-slot-offset` CSS var lets a designer adjust\n * the 110% spacing without touching the component file.\n */\ntype Slot = \"above\" | \"active\" | \"below\" | \"exiting\" | \"queued\";\n\nconst SLOT_OFFSET = \"var(--stats-v2-slot-offset, 110%)\";\nconst CENTER = \"translate(-50%, -50%)\";\n\nfunction getSlotStyle(slot: Slot, transition: string): CSSProperties {\n switch (slot) {\n case \"active\":\n return {\n transform: `${CENTER} translateY(0%) scale(1)`,\n opacity: 1,\n zIndex: 2,\n transition,\n };\n case \"above\":\n return {\n transform: `${CENTER} translateY(calc(${SLOT_OFFSET} * -1)) scale(0.65)`,\n opacity: 1,\n zIndex: 1,\n transition,\n };\n case \"below\":\n return {\n transform: `${CENTER} translateY(${SLOT_OFFSET}) scale(0.65)`,\n opacity: 1,\n zIndex: 1,\n transition,\n };\n case \"exiting\":\n return {\n transform: `${CENTER} translateY(calc(${SLOT_OFFSET} * -1)) scale(0.4)`,\n opacity: 0,\n zIndex: 0,\n transition,\n };\n case \"queued\":\n default:\n return {\n transform: `${CENTER} translateY(${SLOT_OFFSET}) scale(0.4)`,\n opacity: 0,\n zIndex: 0,\n transition,\n };\n }\n}\n\n/**\n * Maps a DOM-strip index to its slot for a given step.\n *\n * Step 0 is the initial state — items[0] is `above`, items[1]\n * is `active`, items[2] is `below`, the rest are `queued`.\n *\n * Each step shifts every item up exactly one slot, mirroring\n * Webflow's \"promote one slot per tick\" choreography.\n */\nfunction slotForIndex(index: number, step: number): Slot {\n const rel = index - step - 1;\n if (rel === 0) return \"active\";\n if (rel === -1) return \"above\";\n if (rel === 1) return \"below\";\n if (rel < -1) return \"exiting\";\n return \"queued\";\n}\n\n/* ── Laurel decoration (left half) ───────────────────────────\n * Vector copied from the Webflow `award_image-svg` markup. The\n * right-hand laurel mirrors the same path via `scaleX(-1)` so\n * we don't ship duplicate geometry.\n */\nconst Laurel = ({ flip = false }: { flip?: boolean }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"84\"\n viewBox=\"0 0 32 84\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className={[\n \"stats-v2__laurel\",\n flip ? \"stats-v2__laurel--flip\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <g opacity=\"0.2\">\n <path\n d=\"M20.8655 76.0151C21.3631 78.5487 22.4577 80.4673 23.4245 81.7447C23.7945 82.2337 24.145 82.6275 24.4343 82.9245C24.5003 81.0424 24.5392 77.0209 23.854 73.543C23.3836 71.2282 22.6189 69.4263 21.9723 68.1997C21.7486 67.7754 21.539 67.42 21.3608 67.1361C21.2158 67.6487 21.042 68.3446 20.8935 69.1718C20.5634 71.0111 20.3623 73.4782 20.8655 76.0151Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M9.19518 69.4464C8.5612 69.2311 8.01354 69.0792 7.6041 68.9776C7.77674 69.5261 8.03563 70.2542 8.40971 71.0711C9.16156 72.713 10.3603 74.6729 12.1472 76.0342C13.9141 77.3864 15.8077 77.7752 17.2669 77.8239C17.9963 77.8483 18.6126 77.7873 19.0419 77.7209C18.3715 76.5307 16.6347 73.8279 14.0892 71.9349C12.4167 70.7081 10.6015 69.924 9.19518 69.4464Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M14.1789 62.4853C14.1095 65.0056 14.7018 67.1343 15.3106 68.6265C15.5268 69.1563 15.7445 69.6045 15.9342 69.9597C16.0737 69.4242 16.2473 68.7196 16.4239 67.9038C16.8294 66.0308 17.2467 63.5892 17.309 61.2688C17.3584 58.9612 17.0322 57.019 16.6942 55.65C16.5809 55.1908 16.4663 54.7965 16.3643 54.4749C16.1414 54.8952 15.8702 55.4487 15.5956 56.1107C14.9268 57.7233 14.2444 59.9642 14.1789 62.4853Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M6.16644 56.5363L5.92729 56.2113C4.18123 53.9739 2.10237 52.4221 0.99942 51.685C1.0448 52.2219 1.13195 52.9558 1.29599 53.7969C1.6458 55.5904 2.33816 57.834 3.68889 59.699C5.02796 61.5534 6.66938 62.5331 7.97363 63.0496C8.56984 63.2857 9.09434 63.4244 9.48448 63.5049C9.08235 62.1271 8.06278 59.1136 6.16644 56.5363Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M12.9202 41.9556C12.9103 41.468 12.8857 41.0438 12.8578 40.6964C12.5852 41.0139 12.2554 41.4254 11.9043 41.9234C10.9787 43.2365 9.91222 45.1415 9.34811 47.5086L9.21888 48.0509C8.78948 50.2094 8.89878 52.2002 9.13088 53.6853C9.21855 54.2463 9.32345 54.7333 9.42253 55.1275C10.2101 53.5777 11.6117 50.5783 12.3444 47.5177C12.8519 45.3454 12.9491 43.3817 12.9202 41.9556Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M4.26838 40.1575C3.16507 37.3338 1.55966 35.0449 0.658674 33.8839C0.595099 34.3962 0.53299 35.0674 0.509766 35.8425C0.454879 37.6743 0.618233 40.0556 1.46849 42.2871C2.30759 44.5064 3.60611 45.9871 4.68907 46.9107C5.12959 47.2864 5.53393 47.5694 5.85602 47.7717C5.82536 47.3041 5.77132 46.6715 5.67501 45.9295C5.46619 44.3205 5.06044 42.211 4.27156 40.1569L4.26838 40.1575Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M12.6632 27.4606C11.6314 28.3597 10.3804 29.7129 9.40352 31.5834L9.20135 32.004C8.19489 34.0975 7.83678 36.2499 7.73379 37.8807C7.69736 38.4576 7.693 38.9667 7.70264 39.3814C7.98105 39.0479 8.31846 38.6306 8.68777 38.1462C9.68653 36.8365 10.9078 35.0512 11.829 33.1204C12.7356 31.1936 13.238 29.3215 13.5154 27.9233C13.6157 27.4178 13.6864 26.9753 13.7361 26.6158C13.4324 26.8302 13.0648 27.1106 12.6632 27.4606Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M7.15889 23.0454L7.23043 22.5253C7.54518 19.6881 7.36017 17.0948 7.19664 15.6517C6.9244 16.0575 6.59747 16.5777 6.25738 17.1905C5.37216 18.7855 4.41002 20.986 4.07631 23.4177C3.74032 25.8399 4.108 27.8499 4.55657 29.25C4.7215 29.7648 4.89717 30.1965 5.05235 30.5349C5.64762 29.1157 6.71893 26.2445 7.15889 23.0454Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M20.7056 14.8951C19.4372 15.269 17.7724 15.9875 16.1554 17.3693L16.021 17.4932C14.3576 18.9542 13.2217 20.7665 12.5041 22.2202C12.2403 22.7546 12.0346 23.2374 11.8812 23.6318C12.2297 23.4596 12.6507 23.2423 13.1195 22.9822C14.4495 22.2442 16.1506 21.1686 17.6705 19.808C19.177 18.446 20.3493 16.9414 21.1512 15.7693C21.4549 15.3255 21.7047 14.9307 21.8987 14.6109C21.5673 14.6707 21.1626 14.7604 20.7056 14.8951Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M15.246 9.89451L15.3989 9.48769C16.3817 6.71545 16.8681 4.08928 17.0948 2.56556C16.7641 2.88544 16.3703 3.28963 15.9481 3.76978C14.7583 5.12276 13.3571 7.06214 12.4902 9.40367C11.6163 11.7394 11.483 13.8564 11.5665 15.3854C11.595 15.9081 11.6489 16.3613 11.7069 16.7298C11.9415 16.3768 12.2271 15.9318 12.5414 15.4103C13.3841 14.0121 14.4266 12.0747 15.246 9.89451Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M24.236 2.86551C22.4046 4.24716 21.0854 6.09763 20.225 7.6144C19.8673 8.24502 19.5916 8.81333 19.3933 9.25894C19.765 9.11933 20.2233 8.93634 20.7396 8.70812C22.1292 8.09394 23.9267 7.15785 25.5896 5.86671C27.2408 4.56435 28.6049 3.04428 29.5633 1.84034C29.9762 1.32163 30.3123 0.863542 30.5622 0.509562C30.206 0.526204 29.7564 0.567871 29.2396 0.659382C27.8788 0.900297 26.0564 1.48555 24.236 2.86551Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n </g>\n </svg>\n);\n\n/* ── Award badge ─────────────────────────────────────────── */\n\nconst AwardBadge = ({ heading, subheading }: StatsAward) => (\n <div className=\"stats-v2__award\">\n <Laurel />\n <div className=\"stats-v2__award-text\">\n <div className=\"stats-v2__award-heading\">{heading}</div>\n <div className=\"stats-v2__award-subheading\">{subheading}</div>\n </div>\n <Laurel flip />\n </div>\n);\n\n/* ── Stats V2 ────────────────────────────────────────────── */\n\nexport const Stats = ({\n title,\n description,\n stats,\n leftAwards = [],\n rightAwards = [],\n className,\n ...props\n}: StatsProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const leftColRef = useRef<HTMLDivElement>(null);\n const rightColRef = useRef<HTMLDivElement>(null);\n const rafRef = useRef<number | null>(null);\n\n const N = stats.length;\n const hasAwards = leftAwards.length > 0 || rightAwards.length > 0;\n const allAwards: StatsAward[] = [...leftAwards, ...rightAwards];\n\n /* ── DOM strip (Webflow's `is-1` … `is-8` trick) ─────────\n * Webflow renders 2× the unique stats and snaps everything\n * back to the start once the active item reaches index N+1.\n * Because items[N+1] holds the SAME stat as items[1] (and\n * items[N]==items[0], items[N+2]==items[2]), the reset is\n * visually invisible — the three on-screen slots\n * (above / active / below) keep showing the same text from\n * the frame before to the frame after the snap.\n *\n * The minimum strip size we need is N + 3 (so that the\n * `below` slot at the reset step has an item to point at).\n * For N ≥ 3 that's ≤ 2N, so 2N is the natural choice and\n * matches Webflow exactly.\n */\n const strip = useMemo(() => {\n if (N === 0) return [];\n const target = Math.max(2 * N, N + 3);\n return Array.from({ length: target }, (_, i) => stats[i % N]);\n }, [stats, N]);\n\n /* ── Step + invisible reset state machine ─────────────────\n * Mirrors Webflow's IX2 timeline frame-for-frame.\n *\n * Webflow's `a-2` action list runs as a sequence:\n *\n * group 0 (initial) : instant\n * group 1..4 (animations) : delay 1000ms + duration 700ms\n * group 5 (snap reset) : INSTANT, fires the moment\n * group 4's animation ends\n * loop back to group 1\n *\n * The user-visible cadence is therefore:\n * - HOLD 1000ms after mount (group 1 delay)\n * - ANIMATE 700ms ← group 1\n * - HOLD 1000ms (group 2 delay)\n * - ANIMATE 700ms ← group 2\n * - … (groups 3, 4) …\n * - ANIMATE 700ms ← group 4 (TO is-6)\n * - SNAP (instant, is-2 takes over content) ← group 5\n * - HOLD 1000ms (group 1 delay of next cycle)\n * - ANIMATE 700ms ← cycle restarts\n *\n * Three crucial details we replicate exactly:\n *\n * 1. The snap fires the **moment the previous animation\n * ends** — there's NO extra hold between group 4\n * finishing and group 5 firing. We previously held for\n * INTERVAL_MS (1700ms) before snapping, which gave the\n * loop boundary an obvious 1000ms-too-long pause.\n *\n * 2. The first hold (after mount) and the post-snap hold\n * are both 1000ms — same as every inter-step hold.\n *\n * 3. Each tick is scheduled with the exact delay it needs:\n * • first tick ........ HOLD_MS (1000ms)\n * • normal advance .... INTERVAL_MS (1700ms)\n * • advance to step N . STEP_DURATION_MS (700ms) ←\n * no hold before snap; snap fires the instant\n * the animation reaches step N's resting state\n * • after snap-back ... HOLD_MS (1000ms)\n *\n * The snap-back itself uses an explicit 3-phase dance so\n * that `transition: none` is guaranteed to be applied to\n * the DOM BEFORE the position change, otherwise some\n * browsers still animate the snap.\n *\n * idle → normal CSS transition is applied\n * snap-disable → render with step=N + `transition:none`\n * (kills any in-flight transition)\n * snap-jump → render with step=0 + `transition:none`\n * (positions snap; invisible because the\n * visible slots show the same content\n * before and after)\n * idle (again) → restore transitions; the next tick\n * (scheduled for HOLD_MS later) starts\n * the new cycle\n */\n type Phase = \"idle\" | \"snap-disable\" | \"snap-jump\";\n const [step, setStep] = useState(0);\n const [phase, setPhase] = useState<Phase>(\"idle\");\n\n /* `scheduleRef` lets the snap-back rAF re-arm the next\n animation tick after the snap completes. */\n const scheduleRef = useRef<((delayMs: number) => void) | null>(null);\n\n useEffect(() => {\n if (N <= 1) return;\n\n let timerId: number | null = null;\n let cancelled = false;\n\n const advance = () => {\n timerId = null;\n if (cancelled) return;\n setStep((prev) => {\n if (prev >= N) {\n setPhase(\"snap-disable\");\n return prev;\n }\n const next = prev + 1;\n /* When we advance INTO the final step, schedule\n the snap to fire the moment the animation ends\n (STEP_DURATION_MS later) — NOT INTERVAL_MS.\n Webflow's group 5 reset has no delay; it fires\n immediately after group 4's animation completes,\n and the post-snap 1000ms hold happens as part\n of group 1's delay in the next cycle. Holding\n for the full INTERVAL_MS here would double the\n visible pause at the loop boundary. */\n const delayMs =\n next >= N ? STEP_DURATION_MS : INTERVAL_MS;\n schedule(delayMs);\n return next;\n });\n };\n\n const schedule = (delayMs: number) => {\n if (cancelled) return;\n if (timerId !== null) window.clearTimeout(timerId);\n timerId = window.setTimeout(advance, delayMs);\n };\n\n scheduleRef.current = schedule;\n schedule(HOLD_MS);\n\n return () => {\n cancelled = true;\n scheduleRef.current = null;\n if (timerId !== null) window.clearTimeout(timerId);\n };\n }, [N]);\n\n /* Drive the reset dance with rAFs so each phase actually\n paints to screen before the next one fires. */\n useEffect(() => {\n if (phase === \"snap-disable\") {\n const raf = requestAnimationFrame(() => {\n setStep(0);\n setPhase(\"snap-jump\");\n });\n rafRef.current = raf;\n return () => cancelAnimationFrame(raf);\n }\n if (phase === \"snap-jump\") {\n const raf = requestAnimationFrame(() => {\n setPhase(\"idle\");\n /* Schedule the next animation 1000ms after the\n snap — matching Webflow's group 1 delay that\n immediately follows group 5's snap reset. */\n scheduleRef.current?.(HOLD_MS);\n });\n rafRef.current = raf;\n return () => cancelAnimationFrame(raf);\n }\n }, [phase]);\n\n /* Reset everything if the stats list itself changes. */\n useEffect(() => {\n setStep(0);\n setPhase(\"idle\");\n }, [N]);\n\n /* ── Scroll-progress parallax (Webflow IX2 list `a`) ───── */\n useEffect(() => {\n const apply = () => {\n const section = sectionRef.current;\n if (!section || window.innerWidth < PARALLAX_BREAKPOINT) {\n /* Clearing inline transforms lets the CSS stagger\n (the `.stats-v2__awards-col--left/--right` rules)\n take over again. */\n if (leftColRef.current) leftColRef.current.style.transform = \"\";\n if (rightColRef.current)\n rightColRef.current.style.transform = \"\";\n return;\n }\n\n const rect = section.getBoundingClientRect();\n const viewport = window.innerHeight;\n const totalTravel = rect.height + viewport;\n const traveled = viewport - rect.top;\n const rawProgress = traveled / totalTravel;\n const progress = Math.max(0, Math.min(1, rawProgress));\n\n const normalised = Math.max(\n 0,\n Math.min(\n 1,\n (progress - PARALLAX_START) /\n (PARALLAX_END - PARALLAX_START),\n ),\n );\n\n /* `remaining` goes 1 → 0 as the scroll progresses from\n PARALLAX_START to PARALLAX_END, i.e. it pulls each\n column back from its ±26.3% resting stagger to 0%. */\n const remaining = 1 - normalised;\n const leftOffset = -PARALLAX_MAX_PERCENT * remaining;\n const rightOffset = PARALLAX_MAX_PERCENT * remaining;\n\n if (leftColRef.current) {\n leftColRef.current.style.transform = `translateY(${leftOffset}%)`;\n }\n if (rightColRef.current) {\n rightColRef.current.style.transform = `translateY(${rightOffset}%)`;\n }\n };\n\n const onScroll = () => {\n requestAnimationFrame(apply);\n };\n\n apply();\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onScroll);\n };\n }, []);\n\n const transition = phase === \"idle\" ? TRANSITION : \"none\";\n\n return (\n <section\n ref={sectionRef}\n className={[\"stats-v2\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"stats-v2__inner\">\n <div className=\"stats-v2__header\">\n <h2 className=\"stats-v2__title\">{title}</h2>\n {description && (\n <p className=\"stats-v2__description\">{description}</p>\n )}\n </div>\n\n <div className=\"stats-v2__content\">\n {leftAwards.length > 0 && (\n <div\n ref={leftColRef}\n className=\"stats-v2__awards-col stats-v2__awards-col--left\"\n >\n {leftAwards.map((award, i) => (\n <AwardBadge key={`l-${i}`} {...award} />\n ))}\n </div>\n )}\n\n <div className=\"stats-v2__card\">\n <div className=\"stats-v2__card-track\">\n <div\n className=\"stats-v2__fade stats-v2__fade--top\"\n aria-hidden=\"true\"\n />\n <div\n className=\"stats-v2__fade stats-v2__fade--bottom\"\n aria-hidden=\"true\"\n />\n {strip.map((stat, i) => {\n const slot = slotForIndex(i, step);\n const active = slot === \"active\";\n return (\n <div\n key={i}\n className={[\n \"stats-v2__stat\",\n active\n ? \"stats-v2__stat--active\"\n : \"stats-v2__stat--inactive\",\n ].join(\" \")}\n style={getSlotStyle(slot, transition)}\n aria-hidden={!active}\n >\n <span className=\"stats-v2__stat-value\">\n {stat.value}\n </span>\n <span className=\"stats-v2__stat-label\">\n {stat.label}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n\n {rightAwards.length > 0 && (\n <div\n ref={rightColRef}\n className=\"stats-v2__awards-col stats-v2__awards-col--right\"\n >\n {rightAwards.map((award, i) => (\n <AwardBadge key={`r-${i}`} {...award} />\n ))}\n </div>\n )}\n\n {hasAwards && (\n <div className=\"stats-v2__awards-mobile\">\n {allAwards.map((award, i) => (\n <AwardBadge key={`m-${i}`} {...award} />\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default Stats;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { StatsSimpleProps } from \"./StatsSimple.types\";\nimport \"./StatsSimple.css\";\n\n/* ── Count-up helpers ─────────────────────────────────────────\n * Parses a display string like \"$118M+\" into its constituent\n * parts so we can animate only the numeric portion while\n * keeping the prefix/suffix stable.\n *\n * Examples:\n * \"117K+\" → { prefix: \"\", number: 117, suffix: \"K+\" }\n * \"$118M+\" → { prefix: \"$\", number: 118, suffix: \"M+\" }\n * \"190+\" → { prefix: \"\", number: 190, suffix: \"+\" }\n * \"3M+\" → { prefix: \"\", number: 3, suffix: \"M+\" }\n * \"1999\" → { prefix: \"\", number: 1999, suffix: \"\" }\n */\nfunction parseValue(raw: string): {\n prefix: string;\n number: number;\n suffix: string;\n} {\n const match = raw.match(/^([^0-9]*)([0-9]+(?:\\.[0-9]+)?)(.*)$/);\n if (!match) return { prefix: \"\", number: 0, suffix: raw };\n return {\n prefix: match[1],\n number: parseFloat(match[2]),\n suffix: match[3],\n };\n}\n\nconst DURATION_MS = 1800;\nconst EASING = (t: number) => 1 - Math.pow(1 - t, 3); // ease-out-cubic\n\nfunction useCountUp(target: number, active: boolean) {\n const [display, setDisplay] = useState(0);\n const rafRef = useRef<number | null>(null);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!active) return;\n\n startRef.current = null;\n\n const tick = (now: number) => {\n if (startRef.current === null) startRef.current = now;\n const elapsed = now - startRef.current;\n const progress = Math.min(elapsed / DURATION_MS, 1);\n const eased = EASING(progress);\n setDisplay(Math.round(eased * target));\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick);\n }\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n };\n }, [target, active]);\n\n return display;\n}\n\n/* ── Animated stat item ───────────────────────────────────── */\n\nconst AnimatedValue = ({\n raw,\n active,\n}: {\n raw: string;\n active: boolean;\n}) => {\n const { prefix, number, suffix } = parseValue(raw);\n const count = useCountUp(number, active);\n\n /* Format with locale thousands separators if the original\n value contained a comma or is ≥ 1000 without a suffix\n that implies it's already abbreviated (K/M/B). */\n const formatted =\n number >= 1000 && !/[KMBkmb]/.test(suffix)\n ? count.toLocaleString()\n : String(count);\n\n return (\n <span className=\"stats-simple__value\">\n {prefix}\n {formatted}\n {suffix}\n </span>\n );\n};\n\n/* ── StatsSimple ──────────────────────────────────────────── */\n\nexport const StatsSimple = ({\n stats,\n className,\n ...props\n}: StatsSimpleProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const el = sectionRef.current;\n if (!el) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setAnimated(true);\n observer.disconnect();\n }\n },\n { threshold: 0.25 },\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n return (\n <section\n ref={sectionRef}\n className={[\"stats-simple\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"stats-simple__inner\">\n {stats.map((stat, i) => (\n <div key={i} className=\"stats-simple__item\">\n <AnimatedValue raw={stat.value} active={animated} />\n <span className=\"stats-simple__label\">{stat.label}</span>\n </div>\n ))}\n </div>\n </section>\n );\n};\n\nexport default StatsSimple;\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { DotLottieInView, isLottieSrc } from \"../../components/DotLottieInView\";\nimport type { FeatureScrollItem, FeatureScrollProps } from \"./FeatureScroll.types\";\nimport \"./FeatureScroll.css\";\n\n/* ── Default data ──────────────────────────────────────────── */\n/*\n * Paths match @deriv-web-design/lottie public paths. Storybook serves\n * packages/lottie/assets at /lottie via staticDirs. Consumers pass their own\n * CMS/CDN URLs at runtime — these fixtures do not pull in the lottie package.\n */\n\nexport const FEATURE_SCROLL_DATA: FeatureScrollItem[] = [\n {\n title: \"Forex\",\n description: \"Trade the most popular currency pairs with high leverage, tight spreads, and fast execution.\",\n linkLabel: \"Learn more\",\n link: \"/markets/forex\",\n mediaUrl: \"/lottie/markets/forex.lottie\",\n },\n {\n title: \"Derived Indices\",\n description: \"Trade 24/7 on exclusive Synthetic and Derived Indices. Choose volatility levels that match your strategy.\",\n linkLabel: \"Learn more\",\n link: \"/markets/derived-indices/synthetic-indices\",\n mediaUrl: \"/lottie/markets/derived-indices.lottie\",\n },\n {\n title: \"Stocks\",\n description: \"Trade global market leaders like Apple, Tesla, and NVIDIA.\",\n linkLabel: \"Learn more\",\n link: \"/markets/stocks\",\n mediaUrl: \"/lottie/markets/stocks.lottie\",\n },\n {\n title: \"Commodities\",\n description: \"Trade gold, silver, oil, natural gas, sugar, and more.\",\n linkLabel: \"Learn more\",\n link: \"/markets/commodities\",\n mediaUrl: \"/lottie/markets/commodities.lottie\",\n },\n {\n title: \"Cryptos\",\n description: \"Trade round the clock on the volatility of cryptocurrencies like Bitcoin and Ethereum.\",\n linkLabel: \"Learn more\",\n link: \"/markets/cryptocurrencies\",\n mediaUrl: \"/lottie/markets/crypto.lottie\",\n },\n {\n title: \"Stock Indices\",\n description: \"Trade offerings that track the top global stock indices.\",\n linkLabel: \"Learn more\",\n link: \"/markets/stock-indices\",\n mediaUrl: \"/lottie/markets/stock-indices.lottie\",\n },\n];\n\n/* ── Chevron SVG icon ──────────────────────────────────────── */\n\nconst ChevronRight = () => (\n <svg\n className=\"fs__item-link-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 3l5 5-5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ── Media renderer ────────────────────────────────────────── */\n\n/**\n * The column this template actually lays out, as a browser layout contract.\n *\n * Desktop is a half-width column inside a 1280 container; below the layout\n * breakpoint the stacked list paints full-bleed. Used when a consumer supplies\n * responsive candidates but no `sizes`, so the browser still picks correctly\n * instead of falling back to the largest candidate.\n */\nconst DEFAULT_MEDIA_SIZES = \"(min-width: 992px) 50vw, 100vw\";\n\n/**\n * `mediaUrl` as a usable string, or null.\n *\n * `mediaUrl` is typed `string`, but a consumer passing something else used to\n * reach `.split()` and throw during render — turning one mistyped item into a\n * 500 for the whole page rather than one unrendered slot. Reading it defensively\n * costs nothing and keeps a content error contained to the band that has it.\n */\nfunction mediaSrc(item: FeatureScrollItem): string | null {\n return typeof item.mediaUrl === \"string\" && item.mediaUrl !== \"\" ? item.mediaUrl : null;\n}\n\nfunction resolveMediaType(item: FeatureScrollItem): \"lottie\" | \"image\" {\n if (item.mediaType) return item.mediaType;\n const src = mediaSrc(item);\n return src && isLottieSrc(src) ? \"lottie\" : \"image\";\n}\n\ninterface MediaRendererProps {\n item: FeatureScrollItem;\n active: boolean;\n rootMargin?: string;\n threshold?: number | number[];\n}\n\nconst MediaRenderer = ({ item, active, rootMargin, threshold }: MediaRendererProps) => {\n const src = mediaSrc(item);\n if (!src) return null;\n\n if (resolveMediaType(item) === \"lottie\") {\n return (\n <DotLottieInView\n src={src}\n enabled={active}\n rootMargin={rootMargin}\n threshold={threshold}\n poster={\n item.posterUrl ? (\n <img\n src={item.posterUrl}\n {...(item.posterSrcSet\n ? {\n srcSet: item.posterSrcSet,\n sizes: item.posterSizes ?? DEFAULT_MEDIA_SIZES,\n }\n : {})}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : undefined\n }\n />\n );\n }\n return (\n <img\n src={src}\n // Responsive only when the consumer supplied candidates. Emitting a\n // `sizes` without a `srcset` would be a no-op, and emitting a\n // single-candidate `srcset` would be a dishonest one.\n {...(item.mediaSrcSet\n ? { srcSet: item.mediaSrcSet, sizes: item.mediaSizes ?? DEFAULT_MEDIA_SIZES }\n : {})}\n alt={item.title}\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n};\n\n/* ── FeatureScroll ─────────────────────────────────────────── */\n\nexport const FeatureScroll = ({\n header,\n items,\n variant = \"media-right\",\n className,\n // Destructured, not spread: `...props` lands on the <section>, and an\n // unknown attribute there is a React DOM warning at best.\n mediaRootMargin,\n mediaThreshold,\n ...props\n}: FeatureScrollProps) => {\n const [activeIndex, setActiveIndex] = useState(0);\n const [mobileActiveIndex, setMobileActiveIndex] = useState(0);\n const titleRefs = useRef<(HTMLHeadingElement | null)[]>([]);\n const mobileItemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const mediaColRef = useRef<HTMLDivElement | null>(null);\n\n /*\n * Desktop: when step i's *title* (h3) top reaches the same line as the sticky\n * media (viewport band under nav), show the *next* step's Lottie/image.\n * pinned = largest i with title top <= threshold; media index = min(last, pinned + 1).\n */\n useLayoutEffect(() => {\n if (items.length === 0) return;\n\n const readThresholdPx = (): number => {\n const col = mediaColRef.current;\n if (!col) return 80;\n const top = getComputedStyle(col).top;\n const px = parseFloat(top);\n return Number.isFinite(px) ? px : 80;\n };\n\n let rafId = 0;\n const tick = () => {\n rafId = 0;\n if (typeof window === \"undefined\") return;\n if (!window.matchMedia(\"(min-width: 992px)\").matches) return;\n\n const threshold = readThresholdPx();\n const refs = titleRefs.current;\n let pinned = -1;\n for (let i = 0; i < items.length; i++) {\n const el = refs[i];\n if (!el) continue;\n if (el.getBoundingClientRect().top <= threshold) pinned = i;\n }\n const mediaIndex = Math.min(\n items.length - 1,\n pinned + 1,\n );\n setActiveIndex((prev) =>\n prev === mediaIndex ? prev : mediaIndex,\n );\n };\n\n const schedule = () => {\n if (rafId !== 0) return;\n rafId = window.requestAnimationFrame(tick);\n };\n\n tick();\n window.addEventListener(\"scroll\", schedule, { passive: true });\n window.addEventListener(\"resize\", schedule, { passive: true });\n const mq = window.matchMedia(\"(min-width: 992px)\");\n mq.addEventListener(\"change\", schedule);\n\n return () => {\n window.removeEventListener(\"scroll\", schedule);\n window.removeEventListener(\"resize\", schedule);\n mq.removeEventListener(\"change\", schedule);\n if (rafId !== 0) window.cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n /*\n * Mobile: exactly one item is active at a time, the one nearest the middle\n * of the viewport.\n *\n * The stacked list used to pass `active` for every card, which meant every\n * intersecting animation loaded and played at once — up to ten players, ten\n * `.lottie` payloads and the shared engine all competing on the connection\n * least able to afford it, while the visitor can only see one. This mirrors\n * what the desktop column already does: one active index, driven by\n * position.\n *\n * The inset `rootMargin` biases selection to the middle band so the active\n * card is the one being read, not one clipped at the top or bottom edge.\n * Skipped above the layout breakpoint, where this list is `display: none`\n * and the desktop `activeIndex` owns playback.\n */\n useEffect(() => {\n if (items.length === 0) return;\n if (typeof window === \"undefined\") return;\n\n const ratios = new Map<number, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n if (window.matchMedia(\"(min-width: 992px)\").matches) return;\n\n for (const entry of entries) {\n const idx = Number(entry.target.getAttribute(\"data-fs-mobile-idx\"));\n if (!Number.isFinite(idx)) continue;\n ratios.set(idx, entry.isIntersecting ? entry.intersectionRatio : 0);\n }\n\n let best = 0;\n let bestRatio = -1;\n for (const [idx, ratio] of ratios) {\n if (ratio > bestRatio) {\n bestRatio = ratio;\n best = idx;\n }\n }\n if (bestRatio <= 0) return;\n setMobileActiveIndex((prev) => (prev === best ? prev : best));\n },\n {\n root: null,\n rootMargin: \"-28% 0px -28% 0px\",\n threshold: [0, 0.15, 0.3, 0.5, 0.75, 1],\n }\n );\n\n for (const el of mobileItemRefs.current) {\n if (el) observer.observe(el);\n }\n return () => observer.disconnect();\n }, [items.length]);\n\n const rootClass = [\n \"fs\",\n `fs--${variant}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (items.length === 0) {\n return (\n <section className={rootClass} {...props}>\n <div className=\"fs__inner\">\n <h2 className=\"fs__header\">{header}</h2>\n </div>\n </section>\n );\n }\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"fs__inner\">\n\n {/* ── Section header ── */}\n <h2 className=\"fs__header\">{header}</h2>\n\n {/* ══ DESKTOP LAYOUT (hidden on mobile) ══════════════\n * Two equal columns; sticky media + scrolling text.\n * Column order is reversed by .fs--media-left.\n */}\n <div className=\"fs__layout\">\n\n {/* Media column: outer stretches to section height; inner is sticky so\n bottom constraint matches the full layout (fixes upward shift when\n scrolling back from the section below). */}\n <div className=\"fs__media-col\" aria-hidden=\"true\">\n <div\n ref={mediaColRef}\n className=\"fs__media-sticky\"\n >\n <div className=\"fs__media-wrap\">\n {items.map((item, i) => (\n <div\n key={i}\n className={[\n \"fs__media-item\",\n i === activeIndex\n ? \"fs__media-item--active\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <MediaRenderer\n item={item}\n active={i === activeIndex}\n rootMargin={mediaRootMargin}\n threshold={mediaThreshold}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Text column: every step in flow — continuous scroll; ~viewport band min-height per step */}\n <div className=\"fs__content-col\">\n {items.map((item, i) => (\n <div\n key={i}\n className=\"fs__item\"\n >\n <h3\n ref={(el) => {\n titleRefs.current[i] = el;\n }}\n className=\"fs__item-title\"\n >\n {item.title}\n </h3>\n <p className=\"fs__item-desc\">\n {item.description}\n </p>\n <a\n href={item.link}\n className=\"fs__item-link\"\n >\n <span>{item.linkLabel}</span>\n <ChevronRight />\n </a>\n </div>\n ))}\n </div>\n </div>\n\n {/* ══ MOBILE LAYOUT (hidden on desktop) ══════════════\n * Stacked items: Title → Media → Description → Link.\n * Variant prop has no effect; layout is always stacked.\n */}\n <div className=\"fs__mobile-list\">\n {items.map((item, i) => (\n <div\n key={i}\n className=\"fs__mobile-item\"\n data-fs-mobile-idx={i}\n ref={(el) => {\n mobileItemRefs.current[i] = el;\n }}\n >\n <h3 className=\"fs__item-title\">\n {item.title}\n </h3>\n <div className=\"fs__mobile-media\">\n <MediaRenderer\n item={item}\n active={i === mobileActiveIndex}\n rootMargin={mediaRootMargin}\n threshold={mediaThreshold}\n />\n </div>\n <p className=\"fs__item-desc\">\n {item.description}\n </p>\n <a\n href={item.link}\n className=\"fs__item-link\"\n >\n <span>{item.linkLabel}</span>\n <ChevronRight />\n </a>\n </div>\n ))}\n </div>\n\n </div>\n </section>\n );\n};\n\nexport default FeatureScroll;\n","import {\n lazy,\n Suspense,\n useEffect,\n useRef,\n useState,\n type ComponentProps,\n type ReactNode,\n} from \"react\";\nimport type { DotLottieReact, DotLottie } from \"@lottiefiles/dotlottie-react\";\n\n/**\n * The player, loaded on demand.\n *\n * `@lottiefiles/dotlottie-react` is a static import away from being in every\n * consumer's FIRST LOAD — measured at 325,794 B parsed / ~40 KB on the wire in\n * a Next.js app, on every page, including the majority that contain no\n * animation at all. Because this component already decides *when* an animation\n * may run, it is also the right place to decide when the player is fetched: the\n * same IntersectionObserver gate now controls the download, not just play/stop.\n *\n * The type import above is erased at build time, so `ComponentProps` keeps\n * working without pulling the module into the bundle.\n */\nconst DotLottiePlayer = lazy(() =>\n import(\"@lottiefiles/dotlottie-react\").then((m) => ({ default: m.DotLottieReact }))\n);\n\nexport type DotLottieInViewProps = Omit<\n ComponentProps<typeof DotLottieReact>,\n \"autoplay\" | \"dotLottieRefCallback\"\n> & {\n /**\n * When false, playback is stopped (e.g. inactive slide in a stacked player).\n * When true, plays once whenever the instance is both enabled and intersecting.\n */\n enabled?: boolean;\n rootMargin?: string;\n threshold?: number | number[];\n /** Loop while enabled and in view. Defaults to false. */\n loop?: boolean;\n /**\n * Painted in place of the player until the animation is ready, and as the\n * Suspense fallback while the player chunk loads.\n *\n * Worth supplying on anything a visitor meets early on a slow connection:\n * the WebAssembly engine is ~630 KB compressed and one engine serves every\n * animation on the page, so the first animated band on a cold visit can sit\n * empty for seconds. A still frame makes that a progressive load rather than\n * a hole in the layout. A `ReactNode` rather than a URL so the consumer can\n * pass a properly sized, responsive `<img>` rather than a bare `src`.\n */\n poster?: ReactNode;\n};\n\n/**\n * Plays a .lottie once when it scrolls into view. Stops and resets when it leaves view.\n * When it enters view again, it plays once more. Set `enabled={false}` to force stop\n * (e.g. hidden slides) without relying on geometry alone.\n *\n * The player itself is fetched lazily, the first time this instance is in view —\n * so a page with no animation never downloads it, and a below-the-fold band does\n * not pay for it during initial load. `enabled` gates playback only: a consumer\n * that crossfades between stacked instances needs them all loaded, not just the\n * one currently showing.\n */\nexport function DotLottieInView({\n enabled = true,\n rootMargin = \"0px\",\n threshold = 0.2,\n loop = false,\n className,\n style,\n poster,\n ...dotProps\n}: DotLottieInViewProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const [inView, setInView] = useState(false);\n /**\n * Latched: once the player has been mounted it stays mounted.\n *\n * Scrolling away still stops playback (below), but tearing the player down\n * would discard the engine and the `.lottie` payload and re-fetch both the\n * next time the band came back — which on a slow connection is the whole\n * cost paid twice for something the visitor has already seen.\n */\n const [mounted, setMounted] = useState(false);\n const [dotLottie, setDotLottie] = useState<DotLottie | null>(null);\n\n useEffect(() => {\n const el = wrapRef.current;\n if (!el) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n setInView(entry.isIntersecting);\n },\n { root: null, rootMargin, threshold }\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, [rootMargin, threshold]);\n\n /**\n * Commit the first mount when the browser is next idle.\n *\n * Not a fixed delay: `requestIdleCallback` fires within a frame or two on an\n * unloaded page, so this is imperceptible on a fast connection. On a slow\n * one the main thread and the network are busy with images the visitor is\n * actually looking at, and deferring by even that much lets those finish\n * first. The timeout is the ceiling, so a permanently busy page still\n * animates rather than never mounting.\n */\n useEffect(() => {\n if (mounted) return;\n // Deliberately NOT `inView && enabled`. `enabled` says which animation may\n // PLAY; it must not decide which one may load.\n //\n // FeatureScroll's desktop column stacks every item absolutely in one\n // sticky box and crossfades between them, so all of them intersect\n // together while only one is enabled. Gating the mount on `enabled` meant\n // each item began loading at the moment it became active — the fetch and\n // player init landed inside the crossfade, so the media box flashed empty\n // on the way past and looked different scrolling up vs down.\n //\n // Intersection alone is the right gate: a band that is never reached\n // still downloads nothing, but once a band IS on screen everything it can\n // crossfade to is ready. On stacked mobile layouts each item has its own\n // box, so this still staggers naturally.\n if (!inView) return;\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n const commit = () => {\n if (!cancelled) setMounted(true);\n };\n\n const idleId =\n typeof window.requestIdleCallback === \"function\"\n ? window.requestIdleCallback(commit, { timeout: 400 })\n : null;\n const timerId = idleId === null ? window.setTimeout(commit, 0) : null;\n\n return () => {\n cancelled = true;\n if (idleId !== null && typeof window.cancelIdleCallback === \"function\") {\n window.cancelIdleCallback(idleId);\n }\n if (timerId !== null) window.clearTimeout(timerId);\n };\n }, [inView, mounted]);\n\n useEffect(() => {\n if (!dotLottie) return;\n\n if (!enabled || !inView) {\n dotLottie.stop();\n return;\n }\n\n /**\n * Wait for the animation to be loaded before starting it.\n *\n * `play()` on an instance whose `.lottie` is still downloading is a\n * silent no-op — and with `autoplay={false}` and `loop={false}` nothing\n * starts it afterwards, so the animation sits on frame 0 until something\n * happens to re-run this effect.\n *\n * That is a race this component used to win by accident: when the player\n * was imported statically it mounted at page load, so by the time anyone\n * scrolled to it the data was long since ready. Now that mounting is\n * deferred to intersection, the very first item — the one already\n * `enabled` when its band arrives — reliably LOSES it: the visitor sees a\n * still frame, and only scrolling away and back (which toggles `inView`\n * and re-runs this effect, by which point the data has arrived) makes it\n * play. Later items are unaffected because they become `enabled` a scroll\n * later, after their data has landed.\n */\n const start = () => {\n dotLottie.stop();\n dotLottie.play();\n };\n\n if (dotLottie.isLoaded) {\n start();\n return;\n }\n\n dotLottie.addEventListener(\"load\", start);\n return () => dotLottie.removeEventListener(\"load\", start);\n }, [dotLottie, enabled, inView]);\n\n return (\n <div\n ref={wrapRef}\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n minHeight: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n ...style,\n }}\n >\n {mounted ? (\n <Suspense fallback={poster ?? null}>\n <DotLottiePlayer\n {...dotProps}\n loop={loop}\n autoplay={false}\n dotLottieRefCallback={setDotLottie}\n />\n </Suspense>\n ) : (\n (poster ?? null)\n )}\n </div>\n );\n}\n","/**\n * Decide whether a stored media URL is a Lottie payload rather than a picture.\n *\n * `.lottie` is unambiguous. `.json` is not — most JSON is not animation — so it\n * only counts when the URL also looks like animation hosting (the same test\n * Raven uses in `isLottieMediaUrl`).\n */\nexport function isLottieSrc(value: string): boolean {\n if (!value) return false;\n if (/\\.lottie(\\?|#|$)/i.test(value)) return true;\n return /\\/[^/?#]+\\.json(\\?|#|$)/i.test(value) && /lottie|cdn\\.|website-files/i.test(value);\n}\n","import { Link } from \"../../components/Link\";\nimport type { FeatureSplitProps } from \"./FeatureSplit.types\";\nimport \"./FeatureSplit.css\";\n\nexport const FeatureSplit = ({\n title,\n description,\n showDescription = true,\n linkText = \"Learn more\",\n showLink = true,\n onLinkClick,\n image,\n imageAlt = \"\",\n imagePosition = \"right\",\n}: FeatureSplitProps) => {\n return (\n <section className=\"feature-split\">\n <div className=\"feature-split__container\">\n <div\n className={[\n \"feature-split__split\",\n imagePosition === \"left\" ? \"feature-split__split--image-left\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"feature-split__content\">\n <h2 className=\"feature-split__title\">{title}</h2>\n\n {showDescription && description && (\n <p className=\"feature-split__description\">{description}</p>\n )}\n\n {showLink && (\n <Link\n colorScheme=\"coral\"\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n\n {image && (\n <div className=\"feature-split__image-wrapper\">\n <img\n alt={imageAlt}\n className=\"feature-split__image\"\n src={image}\n />\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport type { StickyCardItem, StickyStackedCardsProps } from \"./StickyStackedCards.types\";\nimport \"./StickyStackedCards.css\";\n\n/* ── Default data ──────────────────────────────────────────── */\n\n/* ── Shared design-system placeholder image ────────────────── */\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\nexport const STEPS_DATA: StickyCardItem[] = [\n {\n title: \"Title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n imageUrl: PLACEHOLDER_IMAGE,\n theme: \"light\",\n },\n {\n title: \"Title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n imageUrl: PLACEHOLDER_IMAGE,\n theme: \"coral\",\n },\n {\n title: \"Title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n imageUrl: PLACEHOLDER_IMAGE,\n theme: \"dark\",\n },\n];\n\n/* ── Scale targets per card depth ─────────────────────────── */\n/*\n * When a card is fully covered by the card on top of it, its\n * scale reaches this minimum — creating the visual depth seen\n * in the stacked state. The last card always stays at 1.\n *\n * Index → minimum scale when fully covered:\n * 0 (Sign up) → 0.88 (furthest back)\n * 1 (Deposit) → 0.94 (one level back)\n * 2 (Trade) → 1.00 (front card, never scales down)\n */\nconst MIN_SCALE: Record<number, number> = { 0: 0.88, 1: 0.94 };\n\n/* ── StickyStackedCards ────────────────────────────────────── */\n\nexport const StickyStackedCards = ({\n header,\n items,\n className,\n ...props\n}: StickyStackedCardsProps) => {\n const cardRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n /*\n * SCALE SCROLL HANDLER\n * --------------------\n * Runs on every scroll tick (passive, rAF-debounced).\n * For each card that has a card on top of it, we measure\n * how close the next card is to its fully-stacked position\n * and interpolate --card-scale toward the MIN_SCALE value.\n *\n * progress = 0 → next card is still far below (no scale)\n * progress = 1 → next card has landed on its sticky top (full scale-down)\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let rafId = 0;\n\n const update = () => {\n const cards = cardRefs.current.filter(Boolean) as HTMLDivElement[];\n const n = cards.length;\n\n cards.forEach((card, i) => {\n const minScale = MIN_SCALE[i];\n if (minScale === undefined) {\n // Last card — always full size\n card.style.setProperty(\"--card-scale\", \"1\");\n return;\n }\n\n const nextCard = cards[i + 1];\n if (!nextCard) return;\n\n const cardRect = card.getBoundingClientRect();\n const nextRect = nextCard.getBoundingClientRect();\n\n /*\n * \"gap\" = how far the next card's top is above the\n * current card's top in the viewport.\n *\n * gap ≥ cardHeight → next card is a full card-height below\n * (hasn't started overlapping) → progress 0\n * gap ≈ 0 or negative → next card is fully on top → progress 1\n */\n const cardHeight = cardRect.height;\n const gap = nextRect.top - cardRect.top;\n const progress = Math.max(0, Math.min(1, 1 - gap / cardHeight));\n\n const scale = 1 - (1 - minScale) * progress;\n card.style.setProperty(\"--card-scale\", String(+scale.toFixed(4)));\n });\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n // Run once immediately so initial state is correct\n update();\n\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n return (\n <section\n className={[\"ssc\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"ssc__inner\">\n\n {/* ── Section header ── */}\n <h2 className=\"ssc__header\">{header}</h2>\n\n {/* ── Card track ──────────────────────────────────────\n * CRITICAL:\n * • display:block on desktop (not flex) — see CSS note\n * • NO overflow:hidden — breaks position:sticky\n */}\n <div className=\"ssc__track\">\n {items.map((item, i) => (\n <div\n key={i}\n ref={(el) => { cardRefs.current[i] = el; }}\n className={[\n \"ssc__card\",\n `ssc__card--${item.theme ?? \"light\"}`,\n ].join(\" \")}\n style={{\n zIndex: i + 1,\n /*\n * PEEK OFFSET — every card gets i × peek-offset so each\n * prior card shows as a thin strip at the top of the next.\n *\n * Example with 3 cards, peek = 16px:\n * Card 0 (Sign up) → 80px\n * Card 1 (Deposit) → 96px (Sign up peeks 16px above)\n * Card 2 (Trade) → 112px (Deposit peeks 16px, Sign up 32px above)\n *\n * Final state: two 16px colour strips at top, Trade fills the rest.\n */\n top: `calc(var(--ssc-sticky-top) + ${i} * var(--ssc-peek-offset))`,\n } as React.CSSProperties}\n >\n {/* Left column — text content, top-left anchored */}\n <div className=\"ssc__card-content\">\n <h3 className=\"ssc__card-title\">{item.title}</h3>\n <p className=\"ssc__card-desc\">{item.description}</p>\n </div>\n\n {/* Right column — hero image */}\n <div className=\"ssc__card-image\">\n <img\n src={item.imageUrl}\n alt={item.title}\n loading={i === 0 ? \"eager\" : \"lazy\"}\n />\n </div>\n </div>\n ))}\n </div>\n\n </div>\n </section>\n );\n};\n\nexport default StickyStackedCards;\n","import { useRef } from \"react\";\nimport {\n motion,\n useScroll,\n useSpring,\n useTransform,\n useMotionTemplate,\n type MotionValue,\n} from \"framer-motion\";\nimport type { CTABannerProps, AvatarItem } from \"./CTABanner.types\";\nimport { Button } from \"../../components/Button\";\nimport \"./CTABanner.css\";\n\n/* ── Entrance distance constants ─────────────────────────────────\n * How far from the centre each tier starts before scrolling in.\n * Values are intentionally large so the \"coming from far away\"\n * effect is clearly visible. Each avatar moves radially outward\n * from the centre — top avatars fly in from above, left avatars\n * from the left, corners from their diagonal, etc.\n *\n * Tier mapping (by staggerRank / distance from centre):\n * near → rank 0–1 → 80px\n * mid → rank 2–5 → 130px\n * far → rank 6–8 → 180px\n * edge → rank 9–11 → 240px (corners, most dramatic)\n *\n * blurStart: initial CSS blur in px when section enters.\n * blurStart corresponds to --spacing-16 (1rem = 16px).\n */\nconst ENTRANCE = {\n near: 80,\n mid: 130,\n far: 180,\n edge: 240,\n blurStart: 28,\n} as const;\n\n/* ── Spring config ───────────────────────────────────────────────\n * Wrapping scrollYProgress in useSpring adds a slight lag that\n * makes the parallax feel organic rather than mechanically locked\n * to the scroll wheel.\n *\n */\nconst SPRING = { stiffness: 80, damping: 30, restDelta: 0.001 } as const;\n\n/* ── Scroll range ────────────────────────────────────────────────\n * Avatars settle into their final grid positions by this progress\n * value (0 = section just entering viewport, 0.5 = section\n * centred). After LOCK_AT, y stays clamped at 0 — they \"snap\" to\n * the grid without continuing to move.\n */\nconst LOCK_AT = 0.5;\n\n/* ── Default data ────────────────────────────────────────────────\n * Desktop positions: 9-row stage (9 × 96px = 864px).\n * Stage centre = 432px = row 4 centre → hero aligns with mid-left/right.\n * Equal 1-cell breathing room top (row 1) and bottom (row 7 bottom = 768px, stage = 864px).\n *\n * Row 1 (y=96): col 0, 6, 12 — top outer (3 avatars)\n * Row 2 (y=192): col 3, 9 — upper inner (2 avatars)\n * Row 4 (y=384): col 0, 12 — mid, hero level (2 avatars)\n * Row 6 (y=576): col 3, 9 — lower inner (2 avatars)\n * Row 7 (y=672): col 0, 6, 12 — bottom outer (3 avatars)\n *\n * Mobile/tablet: identical layout to the compact variant (6 avatars).\n *\n * staggerRank: Euclidean distance rank from stage centre (col 6.5, row 4).\n * 0 = closest → slowest parallax (near tier)\n * 11 = furthest (corner) → fastest parallax (edge tier)\n */\n\nconst PLACEHOLDER_URL =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86ce1a_footer-member-5.webp\";\n\nexport const AVATAR_DATA: AvatarItem[] = [\n /* ── Rank 0 — top-centre (col 6, row 1) ─────── */\n {\n id: 12, staggerRank: 0, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 6)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobileVisible: true,\n },\n /* ── Rank 1 — bot-centre (col 6, row 7) ─────── */\n {\n id: 11, staggerRank: 1, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 6)\", top: \"calc(var(--ctab-grid-cell) * 7)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 2 — upper-inner-left (col 3, row 2) ── */\n {\n id: 3, staggerRank: 2, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 3)\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 3 — upper-inner-right (col 9, row 2) ── */\n {\n id: 6, staggerRank: 3, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 9)\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 4 — lower-inner-left (col 3, row 6) ── */\n {\n id: 1, staggerRank: 4, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 3)\", top: \"calc(var(--ctab-grid-cell) * 6)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 9)\" },\n mobileVisible: true,\n },\n /* ── Rank 5 — lower-inner-right (col 9, row 6) ── */\n {\n id: 10, staggerRank: 5, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 9)\", top: \"calc(var(--ctab-grid-cell) * 6)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 6 — mid-left (col 0, row 4) ──────── */\n {\n id: 5, staggerRank: 6, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 4)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 7 — mid-right (col 12, row 4) ────── */\n {\n id: 8, staggerRank: 7, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 4)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 8 — top-left corner (col 0, row 1) ── */\n {\n id: 4, staggerRank: 8, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 9 — top-right corner (col 12, row 1) ── */\n {\n id: 7, staggerRank: 9, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 10 — bot-left corner (col 0, row 7) ── */\n {\n id: 2, staggerRank: 10, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 7)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 11 — bot-right corner (col 12, row 7) ── */\n {\n id: 9, staggerRank: 11, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 7)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n];\n\n/* ── Compact variant data ────────────────────────────────────────\n * 7 desktop avatars within the 1280 × 680 stage (Figma node 6865-13441).\n * Desktop grid cell = 96px. Positions as col/row multiples.\n *\n * Mobile reuses the standard 6-avatar mobile layout (same positions).\n */\nexport const COMPACT_AVATAR_DATA: AvatarItem[] = [\n /* ── Rank 0 — top-centre (col ~6, row 1) ── */\n {\n id: 12, staggerRank: 0, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobileVisible: true,\n },\n /* ── Rank 1 — top-left (col 2, row 1) ───── */\n {\n id: 3, staggerRank: 1, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 2 — top-right (col 10, row 1) ─── */\n {\n id: 6, staggerRank: 2, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 10)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 3 — mid-left (col 0, row 3) ────── */\n {\n id: 5, staggerRank: 3, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 3)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 4 — mid-right (col 12, row 3) ──── */\n {\n id: 8, staggerRank: 4, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 3)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 5 — bot-left (col 2, row 5) ────── */\n {\n id: 1, staggerRank: 5, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 2)\", top: \"calc(var(--ctab-grid-cell) * 5)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 9)\" },\n mobileVisible: true,\n },\n /* ── Rank 6 — bot-right (col 10, row 5) — desktop only ─── */\n {\n id: 11, staggerRank: 6, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 10)\", top: \"calc(var(--ctab-grid-cell) * 5)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n];\n\n/* ── Avatar radial entrance hooks ────────────────────────────────\n *\n * Hooks cannot be called inside a loop, so each of the 12\n * useTransform calls is explicit and always runs in the same order.\n * Index maps directly to AVATAR_DATA order (= staggerRank order).\n *\n * Y sign: + = avatar starts BELOW final position (bottom half)\n * - = avatar starts ABOVE final position (top half)\n * 0 = avatar is on the horizontal mid-line\n *\n * X sign: + = avatar starts to the RIGHT (right half)\n * - = avatar starts to the LEFT (left half)\n * 0 = avatar is on the vertical mid-line\n *\n * rank 0 (col 6, row 1) top-centre → X=0, Y=-near\n * rank 1 (col 6, row 7) bot-centre → X=0, Y=+near\n * rank 2 (col 3, row 2) upper-inner-left → X=-mid, Y=-mid\n * rank 3 (col 9, row 2) upper-inner-right → X=+mid, Y=-mid\n * rank 4 (col 3, row 6) lower-inner-left → X=-mid, Y=+mid\n * rank 5 (col 9, row 6) lower-inner-right → X=+mid, Y=+mid\n * rank 6 (col 0, row 4) mid-left → X=-far, Y=0\n * rank 7 (col 12, row 4) mid-right → X=+far, Y=0\n * rank 8 (col 0, row 1) top-left corner → X=-edge, Y=-edge\n * rank 9 (col 12, row 1) top-right corner → X=+edge, Y=-edge\n * rank 10 (col 0, row 7) bot-left corner → X=-edge, Y=+edge\n * rank 11 (col 12, row 7) bot-right corner → X=+edge, Y=+edge\n */\nfunction useAvatarYValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const y0 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]); // top-centre\n const y1 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.near, 0]); // bot-centre\n const y2 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // upper-inner-left\n const y3 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // upper-inner-right\n const y4 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // lower-inner-left\n const y5 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // lower-inner-right\n const y6 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-left (no Y)\n const y7 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-right (no Y)\n const y8 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // top-left corner\n const y9 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // top-right corner\n const y10 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // bot-left corner\n const y11 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // bot-right corner\n return [y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11];\n}\n\nfunction useAvatarXValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const x0 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // top-centre (no X)\n const x1 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // bot-centre (no X)\n const x2 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // upper-inner-left\n const x3 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // upper-inner-right\n const x4 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // lower-inner-left\n const x5 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // lower-inner-right\n const x6 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]); // mid-left\n const x7 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]); // mid-right\n const x8 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // top-left corner\n const x9 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // top-right corner\n const x10 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // bot-left corner\n const x11 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // bot-right corner\n return [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11];\n}\n\n/* ── Compact variant parallax hooks (7 avatars) ──────────────────\n *\n * rank 0 (top-centre): X=0, Y=-near\n * rank 1 (top-left): X=-mid, Y=-mid\n * rank 2 (top-right): X=+mid, Y=-mid\n * rank 3 (mid-left): X=-far, Y=0\n * rank 4 (mid-right): X=+far, Y=0\n * rank 5 (bot-left): X=-mid, Y=+mid\n * rank 6 (bot-right): X=+mid, Y=+mid\n */\nfunction useCompactAvatarYValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const y0 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]); // top-centre\n const y1 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // top-left\n const y2 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // top-right\n const y3 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-left (no Y)\n const y4 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-right (no Y)\n const y5 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // bot-left\n const y6 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // bot-right\n return [y0, y1, y2, y3, y4, y5, y6];\n}\n\nfunction useCompactAvatarXValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const x0 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // top-centre (no X)\n const x1 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // top-left\n const x2 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // top-right\n const x3 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]); // mid-left\n const x4 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]); // mid-right\n const x5 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // bot-left\n const x6 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // bot-right\n return [x0, x1, x2, x3, x4, x5, x6];\n}\n\n/* ── CTABanner ────────────────────────────────────────────────── */\n\nexport const CTABanner = ({\n headline = \"Short section title goes here\",\n ctaLabel = \"Open account\",\n ctaHref = \"#\",\n avatars,\n variant = \"standard\",\n className,\n ...props\n}: CTABannerProps) => {\n const resolvedAvatars = avatars ?? (variant === \"compact\" ? COMPACT_AVATAR_DATA : AVATAR_DATA);\n const sectionRef = useRef<HTMLElement>(null);\n\n /* Track scroll progress as section crosses the viewport.\n * offset: \"start end\" = section top reaches viewport bottom → progress 0\n * offset: \"end start\" = section bottom reaches viewport top → progress 1\n * The spring smooths the raw scroll value into the organic\n * \"butter\" feel that matches the video reference. */\n const { scrollYProgress } = useScroll({\n target: sectionRef,\n offset: [\"start end\", \"end start\"],\n });\n\n const smooth = useSpring(scrollYProgress, SPRING);\n\n /* ── Grid: fade in as section enters ── */\n const gridOpacity = useTransform(smooth, [0, 0.3], [0, 1]);\n\n /* ── Hero: slight upward rise + fade ── */\n const heroY = useTransform(smooth, [0, LOCK_AT], [32, 0]);\n const heroOpacity = useTransform(smooth, [0, 0.3], [0, 1]);\n\n /* ── Avatar fade: all avatars share one opacity track ── */\n const avatarOpacity = useTransform(smooth, [0, 0.25], [0, 1]);\n\n /* ── Avatar blur: clears from blurStart → 0 as section enters ──\n * useMotionTemplate builds a valid CSS filter string so Framer\n * Motion can interpolate it at 60fps without touching the DOM\n * style attribute directly. */\n const blurPx = useTransform(smooth, [0, 0.3, 0.7, 1], [ENTRANCE.blurStart, 0, 0, ENTRANCE.blurStart]);\n const avatarFilter = useMotionTemplate`blur(${blurPx}px)`;\n\n /* ── Per-avatar radial entrance ── */\n const standardYValues = useAvatarYValues(smooth);\n const standardXValues = useAvatarXValues(smooth);\n const compactYValues = useCompactAvatarYValues(smooth);\n const compactXValues = useCompactAvatarXValues(smooth);\n\n const avatarYValues = variant === \"compact\" ? compactYValues : standardYValues;\n const avatarXValues = variant === \"compact\" ? compactXValues : standardXValues;\n\n return (\n <section\n ref={sectionRef}\n className={[\"ctab\", variant === \"compact\" ? \"ctab--compact\" : \"\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* ── Background grid ─────────────────────────────────── */}\n <motion.div\n className=\"ctab__grid\"\n style={{ opacity: gridOpacity }}\n aria-hidden=\"true\"\n />\n\n {/* ── Content stage ───────────────────────────────────── */}\n <div className=\"ctab__inner\">\n <div className=\"ctab__stage\">\n\n {/* ── Floating avatars ─────────────────────────────────\n * Position supplied as inline CSS custom properties so the\n * CSS token layer controls all sizing/spacing.\n *\n * Framer Motion controls only `y` (scroll-driven parallax)\n * and `opacity` (scroll-driven fade). No fixed initial\n * state — the animation is tied continuously to scroll.\n */}\n {resolvedAvatars.map((avatar, index) => {\n const posStyle: Record<string, string> = {};\n if (avatar.desktopPos.left) posStyle[\"--av-d-left\"] = avatar.desktopPos.left;\n if (avatar.desktopPos.right) posStyle[\"--av-d-right\"] = avatar.desktopPos.right;\n if (avatar.desktopPos.top) posStyle[\"--av-d-top\"] = avatar.desktopPos.top;\n if (avatar.mobilePos?.left) posStyle[\"--av-m-left\"] = avatar.mobilePos.left;\n if (avatar.mobilePos?.right) posStyle[\"--av-m-right\"] = avatar.mobilePos.right;\n if (avatar.mobilePos?.top) posStyle[\"--av-m-top\"] = avatar.mobilePos.top;\n\n return (\n <motion.div\n key={avatar.id}\n className={[\n \"ctab__avatar\",\n !avatar.mobileVisible ? \"ctab__avatar--desktop-only\" : \"\",\n ].filter(Boolean).join(\" \")}\n style={{\n ...(posStyle as React.CSSProperties),\n x: avatarXValues[index],\n y: avatarYValues[index],\n opacity: avatarOpacity,\n filter: avatarFilter,\n }}\n >\n <img\n src={avatar.imageUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n />\n </motion.div>\n );\n })}\n\n {/* ── Hero — headline + CTA ──────────────────── */}\n <motion.div\n className=\"ctab__hero\"\n style={{ y: heroY, opacity: heroOpacity }}\n >\n <h2 className=\"ctab__headline\">{headline}</h2>\n <a href={ctaHref}>\n <Button colorScheme=\"black\" variant=\"primary\" label={ctaLabel} />\n </a>\n </motion.div>\n\n </div>\n </div>\n </section>\n );\n};\n\nexport default CTABanner;\n","import { useRef, useState, useEffect, useCallback } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport type { NavbarProps, NavItem, NavDropdownFeature, NavDropdownSection, LanguageItem } from \"./Navbar.types\";\nimport { resolveLanguageGridVars } from \"./languageGridVars\";\nimport { Button } from \"../../components/Button\";\nimport GLOBE_ICON from \"../../assets/icon-globe.svg\";\nimport \"./Navbar.css\";\n\n/* ── Animation config ────────────────────────────────────────── */\n\nconst EASE_OUT_EXPO = [0.16, 1, 0.3, 1] as const;\n\nconst dropdownVariants = {\n hidden: { opacity: 0, scale: 0.96, y: -8 },\n visible: { opacity: 1, scale: 1, y: 0 },\n};\n\nconst drawerVariants = {\n hidden: { y: \"-100%\" },\n visible: { y: 0 },\n};\n\nconst accordionVariants = {\n hidden: { height: 0, opacity: 0 },\n visible: { height: \"auto\", opacity: 1 },\n};\n\n/* ── Inline SVG icons ────────────────────────────────────────── */\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.625 4.8125L7 9.1875L11.375 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ArrowRightIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.625 7H11.375M11.375 7L7.875 3.5M11.375 7L7.875 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ArrowUpRightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.5 11.5L11.5 4.5M11.5 4.5H5.5M11.5 4.5V10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst BarsIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 5H17.5M2.5 10H17.5M2.5 15H17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst XMarkIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M15 5L5 15M5 5L15 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst ChevronLeftIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst GlobeIcon = ({ className }: { className?: string }) => (\n <img src={GLOBE_ICON} alt=\"\" aria-hidden=\"true\" width=\"20\" height=\"20\" className={className} />\n);\n\n/* ── Desktop Dropdown Panel ──────────────────────────────────── */\n\ninterface DropdownPanelProps {\n item: NavItem;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n}\n\nconst DropdownPanel = ({ item, onMouseEnter, onMouseLeave }: DropdownPanelProps) => {\n const { dropdown } = item;\n if (!dropdown) return null;\n\n return (\n <motion.div\n className=\"navbar__dropdown\"\n variants={dropdownVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.18, ease: EASE_OUT_EXPO }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <div className=\"navbar__dropdown-inner\">\n {/* Left: link columns */}\n <div className=\"navbar__dropdown-left\">\n {dropdown.columns.map((col, colIdx) => (\n <div key={colIdx} className=\"navbar__dropdown-col\">\n {col.sections.map((section: NavDropdownSection) => (\n <div key={section.title} className=\"navbar__dropdown-col-list\">\n <p className=\"navbar__dropdown-col-title\">{section.title}</p>\n {section.items.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className=\"navbar__dropdown-link\"\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n >\n {link.label}\n {link.external ? <ArrowUpRightIcon /> : <ArrowRightIcon />}\n </a>\n ))}\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Right: feature card */}\n {dropdown.feature && (\n <div className=\"navbar__dropdown-right\">\n <FeatureCard feature={dropdown.feature} />\n </div>\n )}\n </div>\n </motion.div>\n );\n};\n\n/* ── Feature Card (shared desktop + mobile) ──────────────────── */\n\ninterface FeatureCardProps {\n feature: NavDropdownFeature;\n mobile?: boolean;\n}\n\nconst FeatureCard = ({ feature, mobile }: FeatureCardProps) => (\n <div\n className={mobile ? \"navbar__drawer-feature\" : \"navbar__dropdown-feature\"}\n style={\n feature.backgroundImageUrl\n ? { backgroundImage: `url(${feature.backgroundImageUrl})` }\n : undefined\n }\n >\n {feature.backgroundImageUrl && (\n <img\n src={feature.backgroundImageUrl}\n alt=\"\"\n className={mobile ? \"navbar__drawer-feature-img\" : \"navbar__dropdown-feature-img\"}\n aria-hidden=\"true\"\n />\n )}\n <div className={mobile ? \"navbar__drawer-feature-overlay\" : \"navbar__dropdown-feature-overlay\"} aria-hidden=\"true\" />\n <div className={mobile ? \"navbar__drawer-feature-content\" : \"navbar__dropdown-feature-content\"}>\n <div>\n <p className={mobile ? \"navbar__drawer-feature-title\" : \"navbar__dropdown-feature-title\"}>\n {feature.title}\n </p>\n <p className={mobile ? \"navbar__drawer-feature-desc\" : \"navbar__dropdown-feature-desc\"}>\n {feature.description}\n </p>\n </div>\n <a\n href={feature.ctaHref}\n className={mobile ? \"navbar__drawer-feature-cta\" : \"navbar__dropdown-feature-cta\"}\n >\n {feature.ctaLabel}\n <ArrowRightIcon />\n </a>\n </div>\n </div>\n);\n\n/* ── Mobile Accordion Item ───────────────────────────────────── */\n\ninterface DrawerAccordionProps {\n item: NavItem;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nconst DrawerAccordion = ({ item, isOpen, onToggle }: DrawerAccordionProps) => {\n const { dropdown } = item;\n\n return (\n <div className=\"navbar__drawer-item\">\n <button\n className={`navbar__drawer-trigger ${isOpen ? \"navbar__drawer-trigger--open\" : \"\"}`}\n onClick={onToggle}\n aria-expanded={isOpen}\n >\n {item.label}\n <ChevronDownIcon className=\"navbar__drawer-trigger__chevron\" />\n </button>\n\n <AnimatePresence initial={false}>\n {isOpen && dropdown && (\n <motion.div\n className=\"navbar__drawer-panel\"\n variants={accordionVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.22, ease: EASE_OUT_EXPO }}\n >\n <div className=\"navbar__drawer-panel-inner\">\n {/* Link columns — each column's sections stack vertically */}\n <div className=\"navbar__drawer-panel-cols\">\n {dropdown.columns.map((col, colIdx) => (\n <div key={colIdx} className=\"navbar__drawer-panel-col\">\n {col.sections.map((section: NavDropdownSection) => (\n <div key={section.title} className=\"navbar__drawer-col-section\">\n <p className=\"navbar__drawer-col-title\">{section.title}</p>\n <div className=\"navbar__drawer-col-links\">\n {section.items.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className=\"navbar__drawer-link\"\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Feature card */}\n {dropdown.feature && (\n <FeatureCard feature={dropdown.feature} mobile />\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n\n/* ── Navbar ───────────────────────────────────────────────────── */\n\nexport const Navbar = ({\n theme = \"dark\",\n logoSrc,\n logoSrcDark,\n logoHref = \"/\",\n navItems = [],\n loginLabel = \"Log in\",\n loginHref,\n ctaLabel = \"Open account\",\n ctaHref,\n languageLabel,\n onLanguageClick,\n languageItems,\n languageRows,\n activeLanguageCode,\n onLanguageSelect,\n className,\n ...props\n}: NavbarProps) => {\n const [openDropdown, setOpenDropdown] = useState<string | null>(null);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileExpanded, setMobileExpanded] = useState<string | null>(null);\n const [scrolled, setScrolled] = useState(false);\n const [isDesktop, setIsDesktop] = useState(false);\n const [langDropdownOpen, setLangDropdownOpen] = useState(false);\n const [mobileLangOpen, setMobileLangOpen] = useState(false);\n\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const langHoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pillAreaRef = useRef<HTMLDivElement>(null);\n const langBtnRef = useRef<HTMLButtonElement>(null);\n\n const hasLangDropdown = Boolean(languageItems && languageItems.length > 0);\n\n const resolvedLogo = theme === \"light\" ? (logoSrcDark ?? logoSrc) : logoSrc;\n\n /* ── Dev warning: condensed pill logo goes invisible without logoSrcDark ──\n The pill background turns near-white on scroll for both themes, and\n the pill logo always renders `logoSrcDark ?? logoSrc` regardless of\n theme. Omitting logoSrcDark silently falls back to the light-coloured\n logoSrc, which is invisible against that white pill. */\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && !logoSrcDark) {\n console.warn(\n \"[Navbar] `logoSrcDark` was not provided. The condensed pill logo (shown once the page is scrolled) falls back to `logoSrc`, which is typically the light-coloured logo — it will be invisible against the pill's white/near-white scrolled background. Pass `logoSrcDark` to fix this.\",\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [logoSrcDark]);\n\n /* ── Scroll detection ── */\n useEffect(() => {\n const onScroll = () => setScrolled(window.scrollY > 0);\n onScroll(); // sync state with an already-scrolled page (anchor links, restored scroll, back-nav)\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n /* ── Desktop breakpoint — outer logo/actions only duplicate on ≥992px.\n Must not mark them inert on mobile, where the pill copies are display:none\n and the outer logo remains the sole visible home control. ── */\n useEffect(() => {\n const mq = window.matchMedia(\"(min-width: 992px)\");\n const onChange = () => setIsDesktop(mq.matches);\n onChange();\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n /* ── Close on Escape ── */\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpenDropdown(null);\n setMobileOpen(false);\n setMobileLangOpen(false);\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, []);\n\n /* ── Reset language panel when drawer closes ── */\n useEffect(() => {\n if (!mobileOpen) setMobileLangOpen(false);\n }, [mobileOpen]);\n\n /* ── Body scroll lock when drawer is open ── */\n useEffect(() => {\n document.body.style.overflow = mobileOpen ? \"hidden\" : \"\";\n return () => { document.body.style.overflow = \"\"; };\n }, [mobileOpen]);\n\n /* ── Close dropdown on outside click ── */\n useEffect(() => {\n if (!openDropdown) return;\n const onPointerDown = (e: PointerEvent) => {\n if (pillAreaRef.current && !pillAreaRef.current.contains(e.target as Node)) {\n setOpenDropdown(null);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [openDropdown]);\n\n /* ── Hover handlers with debounce ── */\n const clearHoverTimeout = useCallback(() => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n }, []);\n\n /* ── Language dropdown hover handlers ── */\n const clearLangHoverTimeout = useCallback(() => {\n if (langHoverTimeoutRef.current) {\n clearTimeout(langHoverTimeoutRef.current);\n langHoverTimeoutRef.current = null;\n }\n }, []);\n\n const handleLangEnter = useCallback(() => {\n clearLangHoverTimeout();\n setLangDropdownOpen(true);\n }, [clearLangHoverTimeout]);\n\n const handleLangLeave = useCallback(() => {\n clearLangHoverTimeout();\n langHoverTimeoutRef.current = setTimeout(() => setLangDropdownOpen(false), 150);\n }, [clearLangHoverTimeout]);\n\n const handleLangSelect = useCallback((code: string) => {\n setLangDropdownOpen(false);\n setMobileLangOpen(false);\n onLanguageSelect?.(code);\n }, [onLanguageSelect]);\n\n const handleNavEnter = useCallback((label: string) => {\n clearHoverTimeout();\n setOpenDropdown(label);\n }, [clearHoverTimeout]);\n\n const handleNavLeave = useCallback(() => {\n clearHoverTimeout();\n hoverTimeoutRef.current = setTimeout(() => setOpenDropdown(null), 120);\n }, [clearHoverTimeout]);\n\n const activeDropdownItem = navItems.find((item) => item.label === openDropdown);\n\n /* Inactive desktop copies stay visually transitioned but must leave the\n tab order / a11y tree. Pill copies are inert at top-of-page; outer logo\n and actions are inert once scrolled (desktop only). */\n const pillCopyInert = !scrolled;\n const outerCopyInert = scrolled && isDesktop;\n\n /* ── Render ── */\n return (\n <nav\n className={[\"navbar\", `navbar--${theme}`, scrolled && \"navbar--scrolled\", mobileOpen && \"navbar--menu-open\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"navbar__bar\">\n\n {/* Logo */}\n <a\n href={logoHref}\n className=\"navbar__logo\"\n aria-label=\"Home\"\n inert={outerCopyInert || undefined}\n >\n <img src={resolvedLogo} alt=\"Logo\" />\n </a>\n\n {/* ── Desktop pill (full-width centering layer) ── */}\n <div className=\"navbar__nav-center\" ref={pillAreaRef}>\n <div className=\"navbar__pill\">\n\n {/* Logo — hidden by default, slides in when scrolled (desktop) */}\n <a\n href={logoHref}\n className=\"navbar__pill-logo\"\n aria-label=\"Home\"\n inert={pillCopyInert || undefined}\n >\n <img src={logoSrcDark ?? logoSrc} alt=\"Logo\" />\n </a>\n\n {/* Nav items + language switcher */}\n <div className=\"navbar__nav-group\">\n {navItems.map((item) => {\n if (item.external) {\n return (\n <a\n key={item.label}\n href={item.href}\n className=\"navbar__nav-item\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.label}\n <ArrowUpRightIcon />\n </a>\n );\n }\n\n if (item.dropdown) {\n return (\n <button\n key={item.label}\n className={[\n \"navbar__nav-item\",\n openDropdown === item.label ? \"navbar__nav-item--open\" : \"\",\n ].filter(Boolean).join(\" \")}\n onMouseEnter={() => handleNavEnter(item.label)}\n onMouseLeave={handleNavLeave}\n aria-expanded={openDropdown === item.label}\n aria-haspopup=\"true\"\n >\n {item.label}\n <ChevronDownIcon className=\"navbar__nav-item__chevron\" />\n </button>\n );\n }\n\n return (\n <a key={item.label} href={item.href} className=\"navbar__nav-item\">\n {item.label}\n </a>\n );\n })}\n\n {/* Language switcher — inside nav-group so spacing matches nav items */}\n {languageLabel && (\n <div\n className=\"navbar__lang-wrapper\"\n onMouseEnter={hasLangDropdown ? handleLangEnter : undefined}\n onMouseLeave={hasLangDropdown ? handleLangLeave : undefined}\n >\n <button\n ref={langBtnRef}\n className={[\n \"navbar__nav-item\",\n \"navbar__lang-btn\",\n hasLangDropdown && langDropdownOpen ? \"navbar__nav-item--open\" : \"\",\n ].filter(Boolean).join(\" \")}\n onClick={hasLangDropdown ? () => setLangDropdownOpen((o) => !o) : onLanguageClick}\n aria-haspopup={hasLangDropdown ? \"true\" : undefined}\n aria-expanded={hasLangDropdown ? langDropdownOpen : undefined}\n >\n <GlobeIcon className=\"navbar__lang-globe\" />\n {languageLabel}\n </button>\n </div>\n )}\n </div>\n\n {/* CTA buttons — hidden by default, slides in when scrolled (desktop) */}\n <div\n className=\"navbar__pill-actions\"\n inert={pillCopyInert || undefined}\n >\n {loginHref && (\n <a href={loginHref}>\n <Button colorScheme=\"black\" variant=\"secondary\" label={loginLabel} />\n </a>\n )}\n {ctaHref && (\n <a href={ctaHref}>\n <Button colorScheme=\"coral\" variant=\"primary\" label={ctaLabel} />\n </a>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Desktop dropdown — child of navbar__bar (position:relative,\n full viewport width), so left:50% + translateX(-50%)\n centres relative to the screen ── */}\n <AnimatePresence>\n {openDropdown && activeDropdownItem?.dropdown && (\n <DropdownPanel\n key=\"dropdown\"\n item={activeDropdownItem}\n onMouseEnter={clearHoverTimeout}\n onMouseLeave={handleNavLeave}\n />\n )}\n </AnimatePresence>\n\n {/* ── Desktop language dropdown — same positioning as nav dropdown,\n child of navbar__bar so it centres relative to the screen ── */}\n <AnimatePresence>\n {hasLangDropdown && langDropdownOpen && (\n <motion.div\n className=\"navbar__lang-dropdown\"\n variants={dropdownVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.18, ease: EASE_OUT_EXPO }}\n onMouseEnter={clearLangHoverTimeout}\n onMouseLeave={handleLangLeave}\n >\n <div\n className=\"navbar__lang-dropdown-grid\"\n style={\n resolveLanguageGridVars(\n languageItems!.length,\n languageRows,\n ) as React.CSSProperties\n }\n >\n {languageItems!.map((lang) => (\n <button\n key={lang.code}\n className={[\n \"navbar__lang-dropdown-item\",\n lang.code === activeLanguageCode\n ? \"navbar__lang-dropdown-item--active\"\n : \"\",\n ].filter(Boolean).join(\" \")}\n onClick={() => handleLangSelect(lang.code)}\n >\n {lang.label}\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* ── Desktop CTA buttons ── */}\n <div\n className=\"navbar__actions\"\n inert={outerCopyInert || undefined}\n >\n {loginHref && (\n <a href={loginHref} className=\"navbar__actions-login\">\n <Button\n colorScheme={theme === \"dark\" ? \"white\" : \"black\"}\n variant=\"secondary\"\n label={loginLabel}\n />\n </a>\n )}\n {ctaHref && (\n <a href={ctaHref}>\n <Button colorScheme=\"coral\" variant=\"primary\" label={ctaLabel} />\n </a>\n )}\n </div>\n\n {/* ── Mobile: Login + Hamburger ── */}\n <div className=\"navbar__mobile-actions\">\n {loginHref && (\n <a href={loginHref}>\n <Button\n colorScheme={scrolled || theme === \"light\" ? \"black\" : \"white\"}\n variant=\"secondary\"\n label={loginLabel}\n />\n </a>\n )}\n <button\n className=\"navbar__mobile-trigger\"\n onClick={() => setMobileOpen((o) => !o)}\n aria-label={mobileOpen ? \"Close navigation menu\" : \"Open navigation menu\"}\n >\n {mobileOpen ? <XMarkIcon /> : <BarsIcon />}\n </button>\n </div>\n\n </div>\n\n {/* ── Mobile drawer ── */}\n {/* Clip container: prevents the drawer from showing above the bar\n during open/close animation */}\n <div className=\"navbar__drawer-clip\">\n <AnimatePresence>\n {mobileOpen && (\n <motion.div\n className=\"navbar__drawer\"\n variants={drawerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.3, ease: EASE_OUT_EXPO }}\n aria-modal=\"true\"\n role=\"dialog\"\n aria-label=\"Navigation menu\"\n >\n {/* Drawer nav */}\n <nav className=\"navbar__drawer-nav\">\n {navItems.map((item) => {\n if (item.dropdown) {\n return (\n <DrawerAccordion\n key={item.label}\n item={item}\n isOpen={mobileExpanded === item.label}\n onToggle={() =>\n setMobileExpanded((prev) =>\n prev === item.label ? null : item.label\n )\n }\n />\n );\n }\n\n return (\n <a\n key={item.label}\n href={item.href}\n className=\"navbar__drawer-single\"\n target={item.external ? \"_blank\" : undefined}\n rel={item.external ? \"noopener noreferrer\" : undefined}\n >\n {item.label}\n {item.external && <ArrowUpRightIcon />}\n </a>\n );\n })}\n\n {/* Language — simple button (no dropdown items) */}\n {languageLabel && !hasLangDropdown && (\n <button className=\"navbar__drawer-lang\" onClick={onLanguageClick}>\n <GlobeIcon className=\"navbar__lang-globe\" />\n {languageLabel}\n </button>\n )}\n {/* Language — opens full-screen language panel */}\n {languageLabel && hasLangDropdown && (\n <button\n className=\"navbar__drawer-lang\"\n onClick={() => setMobileLangOpen(true)}\n >\n <GlobeIcon className=\"navbar__lang-globe\" />\n {languageLabel}\n </button>\n )}\n </nav>\n\n {/* Drawer footer CTAs — hidden when language panel is open */}\n {!mobileLangOpen && (\n <div className=\"navbar__drawer-footer\">\n {loginHref && (\n <a href={loginHref} style={{ display: \"block\" }}>\n <Button\n colorScheme=\"black\"\n variant=\"secondary\"\n label={loginLabel}\n fullWidth\n />\n </a>\n )}\n {ctaHref && (\n <a href={ctaHref} style={{ display: \"block\" }}>\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={ctaLabel}\n fullWidth\n />\n </a>\n )}\n </div>\n )}\n\n {/* ── Mobile language full-screen panel ── */}\n <AnimatePresence>\n {hasLangDropdown && mobileLangOpen && (\n <motion.div\n className=\"navbar__drawer-lang-panel\"\n initial={{ y: \"100%\" }}\n animate={{ y: 0 }}\n exit={{ y: \"100%\" }}\n transition={{ duration: 0.25, ease: EASE_OUT_EXPO }}\n >\n <button\n className=\"navbar__drawer-lang-back\"\n onClick={() => setMobileLangOpen(false)}\n aria-label=\"Back to menu\"\n >\n <ChevronLeftIcon />\n </button>\n\n <div className=\"navbar__drawer-lang-grid\">\n {languageItems!.map((lang) => (\n <button\n key={lang.code}\n className={[\n \"navbar__drawer-lang-item\",\n lang.code === activeLanguageCode\n ? \"navbar__drawer-lang-item--active\"\n : \"\",\n ].filter(Boolean).join(\" \")}\n onClick={() => handleLangSelect(lang.code)}\n >\n {lang.label}\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </nav>\n );\n};\n\nexport default Navbar;\n","/**\n * Resolves CSS custom properties for the desktop language dropdown grid.\n *\n * - Default (no `languageRows`): 3 columns, rows = ceil(n / 3).\n * - With `languageRows` ≥ 1: rows fixed, columns = ceil(n / languageRows).\n */\nexport function resolveLanguageGridVars(\n itemCount: number,\n languageRows?: number,\n): { \"--lang-rows\": number; \"--lang-cols\"?: number } {\n if (\n typeof languageRows === \"number\" &&\n Number.isFinite(languageRows) &&\n languageRows >= 1\n ) {\n const rows = Math.floor(languageRows);\n return {\n \"--lang-rows\": rows,\n \"--lang-cols\": Math.ceil(itemCount / rows),\n };\n }\n return { \"--lang-rows\": Math.ceil(itemCount / 3) };\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport {\n motion,\n useScroll,\n useSpring,\n useTransform,\n useMotionTemplate,\n} from \"framer-motion\";\nimport type { DayNightTransitionProps } from \"./DayNightTransition.types\";\nimport {\n webflowV2DayClipPercent,\n webflowV2DayWordOpacity,\n webflowV2DescriptionColor,\n webflowV2NightWordOpacity,\n webflowV2TitleColor,\n type WebflowDayNightV2Media,\n} from \"./webflowDayNightV2Ix\";\nimport \"./DayNightTransition.css\";\n\n/* ── Spring config (default preset only) ──────────────────────── */\nconst SPRING = { stiffness: 80, damping: 30, restDelta: 0.001 } as const;\n\nconst FADE_START = 0.35;\nconst FADE_END = 0.65;\n\n/** Webflow V2 desktop (>991px): dual headline/description crossfade on section `scrollYProgress`. */\nconst V2_TEXT_SCROLL_CROSSFADE_DESKTOP_START = 0.49;\nconst V2_TEXT_SCROLL_CROSSFADE_DESKTOP_END = 0.52;\n\n/** Webflow V2 mobile (≤991px): same crossfade, separate IX-aligned band. */\nconst V2_TEXT_SCROLL_CROSSFADE_MOBILE_START = 0.58;\nconst V2_TEXT_SCROLL_CROSSFADE_MOBILE_END = 0.61;\n\nconst TEXT_CHANNEL_DAY = 0;\nconst TEXT_CHANNEL_NIGHT = 255;\n\n/** Piecewise linear between (t0,v0) and (t1,v1); clamps outside [t0,t1]. */\nconst seg = (t: number, t0: number, t1: number, v0: number, v1: number) => {\n if (t <= t0) return v0;\n if (t >= t1) return v1;\n return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));\n};\n\n/* ── DayNightTransition ───────────────────────────────────────── */\n\nexport const DayNightTransition = ({\n dayImageUrl,\n nightImageUrl,\n dayHeadline = \"Medium length section title goes here\",\n nightHeadline = \"Medium length section title goes here\",\n dayDescription = \"Description goes here. Description goes here. Description goes here.\",\n nightDescription = \"Description goes here. Description goes here. Description goes here.\",\n ctaLabel = \"Get started\",\n ctaHref = \"#\",\n hideCta = false,\n headlineLevel = \"h2\",\n descriptionLevel = \"body-md\",\n inlineDayNightHeadline,\n scrollPreset = \"default\",\n className,\n ...props\n}: DayNightTransitionProps) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dayWordRef = useRef<HTMLSpanElement>(null);\n\n const [nightMarginStart, setNightMarginStart] = useState(\"0px\");\n const [nightMarginEnd, setNightMarginEnd] = useState(\"0px\");\n\n const [ixMedia, setIxMedia] = useState<WebflowDayNightV2Media>(\"desktop\");\n\n const webflowV2 = scrollPreset === \"webflow-day-night-v2\";\n\n useEffect(() => {\n const mq = window.matchMedia(\"(max-width: 991px)\");\n const sync = () => setIxMedia(mq.matches ? \"mobile\" : \"desktop\");\n sync();\n mq.addEventListener(\"change\", sync);\n return () => mq.removeEventListener(\"change\", sync);\n }, []);\n\n const MotionHeadline = headlineLevel === \"h1\" ? motion.h1 : motion.h2;\n\n useLayoutEffect(() => {\n if (!inlineDayNightHeadline) return;\n\n const syncNightPull = () => {\n const dayEl = dayWordRef.current;\n if (!dayEl) return;\n const w = dayEl.offsetWidth;\n const doc = document.documentElement;\n const rtl =\n doc.getAttribute(\"dir\") === \"rtl\" ||\n doc.lang.toLowerCase().startsWith(\"ar\");\n if (rtl) {\n setNightMarginStart(\"0px\");\n setNightMarginEnd(w ? `-${w}px` : \"0px\");\n } else {\n setNightMarginStart(w ? `-${w}px` : \"0px\");\n setNightMarginEnd(\"0px\");\n }\n };\n\n syncNightPull();\n const ro = new ResizeObserver(syncNightPull);\n if (dayWordRef.current) ro.observe(dayWordRef.current);\n window.addEventListener(\"resize\", syncNightPull);\n return () => {\n ro.disconnect();\n window.removeEventListener(\"resize\", syncNightPull);\n };\n }, [\n inlineDayNightHeadline,\n inlineDayNightHeadline?.dayWord,\n inlineDayNightHeadline?.nightWord,\n inlineDayNightHeadline?.prefix,\n ]);\n\n const { scrollYProgress } = useScroll({\n target: wrapperRef,\n offset: [\"start end\", \"end start\"],\n });\n\n /* Webflow IX uses raw scroll progress (smoothing:50 is mild; spring would skew keyframes). */\n const smooth = useSpring(scrollYProgress, SPRING);\n const progress = webflowV2 ? scrollYProgress : smooth;\n\n const nightOpacity = useTransform(progress, [FADE_START, FADE_END], [0, 1]);\n const channel = useTransform(progress, [FADE_START, FADE_END], [TEXT_CHANNEL_DAY, TEXT_CHANNEL_NIGHT]);\n const textColor = useMotionTemplate`rgb(${channel}, ${channel}, ${channel})`;\n\n /**\n * Dual headline / description crossfade.\n * - Default: [FADE_START, FADE_END] with the night image opacity.\n * - Webflow V2: desktop vs mobile `scrollYProgress` bands (see `V2_TEXT_SCROLL_CROSSFADE_*`).\n */\n const dayOpacity = useTransform(progress, (t) => {\n if (webflowV2) {\n return ixMedia === \"mobile\"\n ? seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_START,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_END,\n 1,\n 0,\n )\n : seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_START,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_END,\n 1,\n 0,\n );\n }\n return seg(t, FADE_START, FADE_END, 1, 0);\n });\n const nightOpacity2 = useTransform(progress, (t) => {\n if (webflowV2) {\n return ixMedia === \"mobile\"\n ? seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_START,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_END,\n 0,\n 1,\n )\n : seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_START,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_END,\n 0,\n 1,\n );\n }\n return seg(t, FADE_START, FADE_END, 0, 1);\n });\n\n const v2DescColor = useTransform(progress, (t) => webflowV2DescriptionColor(t, ixMedia));\n const v2TitleColor = useTransform(progress, (t) => webflowV2TitleColor(t, ixMedia));\n const v2DayWordOp = useTransform(progress, (t) => webflowV2DayWordOpacity(t, ixMedia));\n const v2NightWordOp = useTransform(progress, (t) => webflowV2NightWordOpacity(t, ixMedia));\n /**\n * IX mobile: `STYLE_SIZE` uses **%** on `.trade-day-night_background-day` (parent = 200vh wrapper).\n * Desktop: fixed `100vh` like `.is-alternative` in Webflow CSS.\n */\n const v2DayHeight = useTransform(progress, (t) =>\n ixMedia === \"mobile\"\n ? `${webflowV2DayClipPercent(t, ixMedia)}%`\n : \"100vh\",\n );\n\n const hasDescription = Boolean(dayDescription || nightDescription);\n\n const useInlineHeadline = Boolean(inlineDayNightHeadline);\n\n const rootClass = [\n \"dnt\",\n headlineLevel === \"h1\" && \"dnt--headline-h1\",\n descriptionLevel === \"body-lg\" && \"dnt--desc-body-lg\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={wrapperRef}\n className={rootClass}\n {...props}\n >\n {webflowV2 && (\n <div className=\"dnt__v2-background-wrapper\" aria-hidden=\"true\">\n {/*\n Webflow DOM order (both layers, both images):\n 1) trade-day-night_background-day\n 2) trade-day-night_background-night\n */}\n <motion.div\n className=\"dnt__v2-bg-day trade-day-night_background-day is-alternative\"\n style={{\n backgroundImage: `url(${dayImageUrl})`,\n height: v2DayHeight,\n }}\n />\n <div\n className=\"dnt__v2-bg-night trade-day-night_background-night is-alternative\"\n style={{ backgroundImage: `url(${nightImageUrl})` }}\n />\n </div>\n )}\n\n <div className={webflowV2 ? \"dnt__sticky dnt__sticky--webflow-v2\" : \"dnt__sticky\"}>\n\n {!webflowV2 && (\n <>\n <img\n className=\"dnt__bg dnt__bg--day\"\n src={dayImageUrl}\n alt=\"\"\n loading=\"eager\"\n draggable={false}\n />\n <motion.img\n className=\"dnt__bg dnt__bg--night\"\n src={nightImageUrl}\n alt=\"\"\n loading=\"eager\"\n draggable={false}\n style={{ opacity: nightOpacity }}\n />\n </>\n )}\n\n <div className=\"dnt__content\">\n <div className=\"dnt__inner\">\n {webflowV2 ? (\n <div className=\"dnt__text-wrap\">\n {useInlineHeadline && inlineDayNightHeadline ? (\n <MotionHeadline\n className=\"dnt__headline dnt__headline--inline-day-night\"\n style={{ color: v2TitleColor }}\n aria-label={`${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.dayWord} / ${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.nightWord}`}\n >\n <span className=\"dnt__headline-prefix\">\n {inlineDayNightHeadline.prefix}\n </span>\n <span className=\"dnt__headline-pair\">\n <motion.span\n ref={dayWordRef}\n className=\"dnt__headline-wday\"\n style={{ opacity: v2DayWordOp }}\n >\n {inlineDayNightHeadline.dayWord}\n </motion.span>\n <motion.span\n className=\"dnt__headline-wnight\"\n style={{\n opacity: v2NightWordOp,\n marginInlineStart: nightMarginStart,\n marginInlineEnd: nightMarginEnd,\n }}\n >\n {inlineDayNightHeadline.nightWord}\n </motion.span>\n </span>\n </MotionHeadline>\n ) : (\n <div className=\"dnt__crossfade-wrap\">\n <MotionHeadline\n className=\"dnt__headline\"\n style={{ color: v2TitleColor, opacity: dayOpacity }}\n >\n {dayHeadline}\n </MotionHeadline>\n <MotionHeadline\n className=\"dnt__headline\"\n aria-hidden=\"true\"\n style={{ color: v2TitleColor, opacity: nightOpacity2 }}\n >\n {nightHeadline}\n </MotionHeadline>\n </div>\n )}\n\n {hasDescription && (\n <div className=\"dnt__crossfade-wrap\">\n <motion.p\n className=\"dnt__description\"\n style={{\n color: v2DescColor,\n opacity: dayOpacity,\n }}\n >\n {dayDescription ?? \"\"}\n </motion.p>\n <motion.p\n className=\"dnt__description\"\n aria-hidden=\"true\"\n style={{\n color: v2DescColor,\n opacity: nightOpacity2,\n }}\n >\n {nightDescription ?? \"\"}\n </motion.p>\n </div>\n )}\n\n {!hideCta && (\n <a href={ctaHref} className=\"dnt__btn\">\n {ctaLabel}\n </a>\n )}\n </div>\n ) : (\n <motion.div\n className=\"dnt__text-wrap\"\n style={{ color: textColor }}\n >\n {useInlineHeadline && inlineDayNightHeadline ? (\n <MotionHeadline\n className=\"dnt__headline dnt__headline--inline-day-night\"\n aria-label={`${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.dayWord} / ${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.nightWord}`}\n >\n <span className=\"dnt__headline-prefix\">\n {inlineDayNightHeadline.prefix}\n </span>\n <span className=\"dnt__headline-pair\">\n <motion.span\n ref={dayWordRef}\n className=\"dnt__headline-wday\"\n style={{ opacity: dayOpacity }}\n >\n {inlineDayNightHeadline.dayWord}\n </motion.span>\n <motion.span\n className=\"dnt__headline-wnight\"\n style={{\n opacity: nightOpacity2,\n marginInlineStart: nightMarginStart,\n marginInlineEnd: nightMarginEnd,\n }}\n >\n {inlineDayNightHeadline.nightWord}\n </motion.span>\n </span>\n </MotionHeadline>\n ) : (\n <div className=\"dnt__crossfade-wrap\">\n <MotionHeadline\n className=\"dnt__headline\"\n style={{ opacity: dayOpacity }}\n >\n {dayHeadline}\n </MotionHeadline>\n <MotionHeadline\n className=\"dnt__headline\"\n aria-hidden=\"true\"\n style={{ opacity: nightOpacity2 }}\n >\n {nightHeadline}\n </MotionHeadline>\n </div>\n )}\n\n {hasDescription && (\n <div className=\"dnt__crossfade-wrap\">\n <motion.p\n className=\"dnt__description\"\n style={{ opacity: dayOpacity }}\n >\n {dayDescription ?? \"\"}\n </motion.p>\n <motion.p\n className=\"dnt__description\"\n aria-hidden=\"true\"\n style={{ opacity: nightOpacity2 }}\n >\n {nightDescription ?? \"\"}\n </motion.p>\n </div>\n )}\n\n {!hideCta && (\n <a href={ctaHref} className=\"dnt__btn\">\n {ctaLabel}\n </a>\n )}\n </motion.div>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n};\n\nexport default DayNightTransition;\n","/**\n * Scroll mapping reverse-engineered from Webflow IX2 in\n * `DayNightTransitionV2/js/webflow.js` (actionLists `a` = mobile, `a-2` = desktop).\n * `t` is continuous scroll progress 0 → 1 on the 200vh driver (SCROLL_PROGRESS).\n */\n\nexport type WebflowDayNightV2Media = \"desktop\" | \"mobile\";\n\n/** Description swatch from IX (STYLE_TEXT_COLOR r/g/b). */\nconst DESC_SWATCH = { r: 24, g: 28, b: 37 } as const;\n\n/** Webflow `body { color: #333 }` before IX touches description (mobile). */\nconst BODY_TEXT = { r: 51, g: 51, b: 51 } as const;\n\nconst rgb = (r: number, g: number, b: number) => `rgb(${r},${g},${b})`;\n\nconst lerp = (a: number, b: number, u: number) => a + (b - a) * u;\n\n/** Piecewise linear between (t0,v0) and (t1,v1); clamps outside [t0,t1]. */\nconst seg = (t: number, t0: number, t1: number, v0: number, v1: number) => {\n if (t <= t0) return v0;\n if (t >= t1) return v1;\n return lerp(v0, v1, (t - t0) / (t1 - t0));\n};\n\nexport function webflowV2DescriptionColor(t: number, media: WebflowDayNightV2Media): string {\n if (media === \"desktop\") {\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n const dark = rgb(DESC_SWATCH.r, DESC_SWATCH.g, DESC_SWATCH.b);\n const white = rgb(255, 255, 255);\n /* IX kf 49 → swatch, kf 50 → white; before kf 49 inherits `body` #333. */\n if (t < 0.49) return body;\n if (t < 0.5) return dark;\n return white;\n }\n /* mobile: default body #333 until kf 58 → IX swatch, kf 59 → white. */\n const white = rgb(255, 255, 255);\n const dark = rgb(DESC_SWATCH.r, DESC_SWATCH.g, DESC_SWATCH.b);\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n if (t < 0.58) return body;\n if (t < 0.59) return dark;\n return white;\n}\n\n/** Title / prefix colour on `.trade-day-night_title.new-heading-style-h1`. */\nexport function webflowV2TitleColor(t: number, media: WebflowDayNightV2Media): string {\n if (media === \"desktop\") {\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n const black = rgb(0, 0, 0);\n const white = rgb(255, 255, 255);\n /* Title first touched at IX kf 51 (#000); before that inherits `body` #333. */\n if (t < 0.51) return body;\n if (t >= 0.52) return white;\n return seg(t, 0.51, 0.52, black, white);\n }\n const dark = rgb(DESC_SWATCH.r, DESC_SWATCH.g, DESC_SWATCH.b);\n const white = rgb(255, 255, 255);\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n /* IX kf 60 → dark title, kf 61 → white; before IX, title inherits `body` #333. */\n if (t < 0.6) return body;\n if (t >= 0.61) return white;\n const u = (t - 0.6) / 0.01;\n return rgb(\n lerp(DESC_SWATCH.r, 255, u),\n lerp(DESC_SWATCH.g, 255, u),\n lerp(DESC_SWATCH.b, 255, u),\n );\n}\n\nexport function webflowV2DayWordOpacity(t: number, media: WebflowDayNightV2Media): number {\n if (media === \"desktop\") {\n if (t < 0.51) return 1;\n if (t >= 0.52) return 0;\n return seg(t, 0.51, 0.52, 1, 0);\n }\n if (t < 0.6) return 1;\n if (t >= 0.61) return 0;\n return seg(t, 0.6, 0.61, 1, 0);\n}\n\nexport function webflowV2NightWordOpacity(t: number, media: WebflowDayNightV2Media): number {\n if (media === \"desktop\") {\n if (t < 0.51) return 0;\n if (t >= 0.52) return 1;\n return seg(t, 0.51, 0.52, 0, 1);\n }\n if (t < 0.6) return 0;\n if (t >= 0.61) return 1;\n return seg(t, 0.6, 0.61, 0, 1);\n}\n\n/** Scroll progress (0–1 on the 200vh driver) where mobile day-layer height finishes (IX kf 65). */\nexport const WEBFLOW_V2_DAY_CLIP_SCROLL_END = 0.65;\n\n/**\n * Mobile only: IX2 `STYLE_SIZE` height **%** on `.trade-day-night_background-day.is-alternative`\n * from keyframe **0 → 65** (parent height = `.trade-day-night_background-wrapper` / 200vh track).\n * Returns **0–100** for use as `${value}%` in Framer.\n */\nexport function webflowV2DayClipPercent(t: number, media: WebflowDayNightV2Media): number {\n if (media === \"desktop\") return 100;\n return seg(t, 0, WEBFLOW_V2_DAY_CLIP_SCROLL_END, 100, 0);\n}\n","import type { DayNightTransitionProps } from \"./DayNightTransition.types\";\n\n/**\n * **DayNightTransitionV2** Storybook preset: same headlines, body copy, CTA, and\n * typography defaults (h2 + body-md) as the **Default** story; Webflow IX2 scroll\n * timing via `scrollPreset: \"webflow-day-night-v2\"` plus `dnt--layout-v2` /\n * `dnt--webflow-v2` for layout and backgrounds.\n */\nexport const dayNightTransitionV2Preset: Pick<\n DayNightTransitionProps,\n | \"className\"\n | \"dayImageUrl\"\n | \"nightImageUrl\"\n | \"dayHeadline\"\n | \"nightHeadline\"\n | \"dayDescription\"\n | \"nightDescription\"\n | \"ctaLabel\"\n | \"ctaHref\"\n | \"scrollPreset\"\n> = {\n className: \"dnt--layout-v2 dnt--webflow-v2\",\n scrollPreset: \"webflow-day-night-v2\",\n dayImageUrl:\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86cd8f_trade_day.webp\",\n nightImageUrl:\n \"https://cdn.prod.website-files.com/66585fe0e1dc7e70cc75d440/6757df573bf331c84b6c69fe_trade_night.webp\",\n dayHeadline: \"Section title light\\n\",\n nightHeadline: \"Section title dark\\n\",\n dayDescription:\n \"This section is designed to give your visitors a quick overview of why your solution is the right choice. Use this space to provide high-level context.\\n\",\n nightDescription:\n \"This section is designed to give your visitors a quick overview of why your solution is the right choice. Use this space to provide high-level context.\",\n ctaLabel: \"Open account\",\n ctaHref: \"#\",\n};\n","import { useRef } from \"react\";\nimport {\n motion,\n useScroll,\n useVelocity,\n useAnimationFrame,\n useMotionValue,\n} from \"framer-motion\";\nimport type { LogoMarqueeProps, LogoItem } from \"./LogoMarquee.types\";\nimport \"./LogoMarquee.css\";\n\n/* ── Modular wrap ─────────────────────────────────────────────────\n * Keeps `v` cycling within [min, max).\n * JS % operator returns negative results for negative numbers, so\n * we normalise with the double-mod pattern.\n *\n * Example (cycleH = 1500):\n * modWrap(-1500, 0, -1501) → -1\n * modWrap(-1500, 0, 1) → -1499 (seamless cross-boundary)\n */\nfunction modWrap(min: number, max: number, v: number): number {\n const range = max - min;\n return ((((v - min) % range) + range) % range) + min;\n}\n\n/* ── Speed constants ──────────────────────────────────────────────\n * VELOCITY_FACTOR scales raw scroll px/s → column marquee px/s.\n * MAX_SCROLL_V clamps very fast flicks so the marquee stays\n * readable instead of blurring past.\n * DEADZONE minimum scroll velocity (px/s) needed to move\n * the columns — prevents micro-drift from inertia.\n */\nconst VELOCITY_FACTOR = 0.4;\nconst MAX_SCROLL_V = 2500;\nconst DEADZONE = 2;\n\n/* ── Placeholder image ────────────────────────────────────────── */\n\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\n/* ── Logo data ────────────────────────────────────────────────── */\n\nexport const COL_ONE_LOGOS: LogoItem[] = [\n { name: \"Logo 1\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 2\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 3\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 4\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 5\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 6\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 7\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 8\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 9\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 10\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 11\", url: PLACEHOLDER_IMAGE },\n];\n\nexport const COL_TWO_LOGOS: LogoItem[] = [\n { name: \"Logo 1\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 2\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 3\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 4\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 5\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 6\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 7\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 8\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 9\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 10\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 11\", url: PLACEHOLDER_IMAGE },\n];\n\nexport const TEXT_CONTENT = {\n headline: \"Section title goes here\",\n body: \"Explain how this specific feature helps your user.\",\n disclaimer: \"*Add any relevant disclaimers or legal copy here.\",\n ctaLabel: \"Learn more\",\n ctaHref: \"#\",\n};\n\n/* ── LogoMarquee ──────────────────────────────────────────────── */\n\nexport const LogoMarquee = ({\n headline = TEXT_CONTENT.headline,\n body = TEXT_CONTENT.body,\n disclaimer = TEXT_CONTENT.disclaimer,\n ctaLabel = TEXT_CONTENT.ctaLabel,\n ctaHref = TEXT_CONTENT.ctaHref,\n col1Logos = COL_ONE_LOGOS,\n col2Logos = COL_TWO_LOGOS,\n className,\n ...props\n}: LogoMarqueeProps) => {\n /* ── Scroll velocity source ─────────────────────────────────────\n * useScroll() (no args) tracks the global window scroll.\n * useVelocity() derives the rate of change in px/s.\n * When the user isn't scrolling, velocity → 0 and the columns\n * freeze immediately — no spring lag, no easing drift.\n */\n const { scrollY } = useScroll();\n const scrollVelocity = useVelocity(scrollY);\n\n /* ── Column Y positions ─────────────────────────────────────────\n * useMotionValue gives Framer Motion a mutable number it can\n * directly wire to the DOM transform without React re-renders.\n */\n const col1Y = useMotionValue(0);\n const col2Y = useMotionValue(0);\n\n /* Refs to measure each column's rendered height so modWrap can\n * calculate the exact single-cycle length at runtime. */\n const col1Ref = useRef<HTMLDivElement>(null);\n const col2Ref = useRef<HTMLDivElement>(null);\n\n /* ── Per-frame marquee update ───────────────────────────────────\n * useAnimationFrame runs every rAF tick.\n * `delta` is ms since the previous frame (~16 at 60 fps).\n *\n * step = scrollVelocity (px/s) × VELOCITY_FACTOR × (delta / 1000s)\n *\n * Col 1 subtracts step → scrolls UP when scrolling down.\n * Col 2 adds step → scrolls DOWN when scrolling down.\n * Opposite on scroll-up — naturally reversed.\n *\n * modWrap(-cycleH, 0, newPos) keeps the position looping within\n * one cycle so the column never runs out of cards.\n */\n useAnimationFrame((_, delta) => {\n const raw = scrollVelocity.get();\n\n // Frozen while not scrolling\n if (Math.abs(raw) < DEADZONE) return;\n\n const clamped = Math.sign(raw) * Math.min(Math.abs(raw), MAX_SCROLL_V);\n const step = clamped * VELOCITY_FACTOR * (delta / 1000);\n\n // Single-cycle height = half of total track (2× duplication)\n const cycleH1 = (col1Ref.current?.offsetHeight ?? 2000) / 2;\n const cycleH2 = (col2Ref.current?.offsetHeight ?? 2000) / 2;\n\n col1Y.set(modWrap(-cycleH1, 0, col1Y.get() - step)); // UP\n col2Y.set(modWrap(-cycleH2, 0, col2Y.get() + step)); // DOWN (opposite)\n });\n\n /* 2× duplication creates a seamless loop:\n * offsetHeight / 2 = one cycle → wrapping at that boundary\n * always reveals identical content (the other copy). */\n const track1 = [...col1Logos, ...col1Logos];\n const track2 = [...col2Logos, ...col2Logos];\n\n return (\n <section\n className={[\"lm\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"lm__inner\">\n\n {/* ── Media — two opposing marquee columns ──────── */}\n <div className=\"lm__media\">\n <div className=\"lm__carousel\">\n\n {/* Top gradient fade */}\n <div className=\"lm__fade lm__fade--top\" aria-hidden=\"true\" />\n\n {/* Column 1 — scrolls UP when page scrolls DOWN */}\n <motion.div\n ref={col1Ref}\n className=\"lm__col\"\n style={{ y: col1Y }}\n >\n {track1.map((logo, i) => (\n <div key={`c1-${i}`} className=\"lm__card\">\n <div className=\"lm__card-img-wrap\">\n <img\n src={logo.url}\n alt={logo.name}\n loading=\"lazy\"\n draggable={false}\n />\n </div>\n </div>\n ))}\n </motion.div>\n\n {/* Column 2 — scrolls DOWN when page scrolls DOWN */}\n <motion.div\n ref={col2Ref}\n className=\"lm__col\"\n style={{ y: col2Y }}\n >\n {track2.map((logo, i) => (\n <div key={`c2-${i}`} className=\"lm__card\">\n <div className=\"lm__card-img-wrap\">\n <img\n src={logo.url}\n alt={logo.name}\n loading=\"lazy\"\n draggable={false}\n />\n </div>\n </div>\n ))}\n </motion.div>\n\n {/* Bottom gradient fade */}\n <div className=\"lm__fade lm__fade--bottom\" aria-hidden=\"true\" />\n\n </div>\n </div>\n\n {/* ── Text content ────────────────────────────── */}\n <div className=\"lm__content\">\n <h2 className=\"lm__headline\">{headline}</h2>\n\n <div className=\"lm__text-group\">\n <p className=\"lm__body\">{body}</p>\n <p className=\"lm__disclaimer\">{disclaimer}</p>\n </div>\n\n <a href={ctaHref} className=\"lm__link\">\n {ctaLabel}\n <span className=\"lm__link-icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </a>\n </div>\n\n </div>\n </section>\n );\n};\n\nexport default LogoMarquee;\n","import type { DownloadBadgeProps } from \"./DownloadBadge.types\";\nimport \"./DownloadBadge.css\";\n\n/* ── Light badge assets ─────────────────────────────────────── */\nimport googlePlayLight from \"../../assets/appstore-googleplay-light.svg\";\nimport appStoreLight from \"../../assets/appstore-appstore-light.svg\";\nimport appGalleryLight from \"../../assets/appstore-appgallery-light.svg\";\nimport windowsLight from \"../../assets/appstore-windows-light.svg\";\nimport macOSLight from \"../../assets/appstore-macos-light.svg\";\nimport linuxLight from \"../../assets/appstore-linux-light.svg\";\nimport browserLight from \"../../assets/appstore-browser-light.svg\";\n\n/* ── Dark badge assets ──────────────────────────────────────── */\nimport googlePlayDark from \"../../assets/appstore-googleplay-dark.svg\";\nimport appStoreDark from \"../../assets/appstore-appstore-dark.svg\";\nimport appGalleryDark from \"../../assets/appstore-appgallery-dark.svg\";\nimport windowsDark from \"../../assets/appstore-windows-dark.svg\";\nimport macOSDark from \"../../assets/appstore-macos-dark.svg\";\nimport linuxDark from \"../../assets/appstore-linux-dark.svg\";\nimport browserDark from \"../../assets/appstore-browser-dark.svg\";\n\n/* ── Asset map ──────────────────────────────────────────────── */\n\nconst BADGE_ASSETS = {\n light: {\n googleplay: { src: googlePlayLight, alt: \"Get it on Google Play\" },\n appstore: { src: appStoreLight, alt: \"Download on the App Store\" },\n appgallery: { src: appGalleryLight, alt: \"Explore it on AppGallery\" },\n windows: { src: windowsLight, alt: \"Download for Windows\" },\n macos: { src: macOSLight, alt: \"Download on the Mac App Store\" },\n linux: { src: linuxLight, alt: \"Installation on Linux\" },\n web: { src: browserLight, alt: \"Trade on Web browser\" },\n },\n dark: {\n googleplay: { src: googlePlayDark, alt: \"Get it on Google Play\" },\n appstore: { src: appStoreDark, alt: \"Download on the App Store\" },\n appgallery: { src: appGalleryDark, alt: \"Explore it on AppGallery\" },\n windows: { src: windowsDark, alt: \"Download for Windows\" },\n macos: { src: macOSDark, alt: \"Download on the Mac App Store\" },\n linux: { src: linuxDark, alt: \"Installation on Linux\" },\n web: { src: browserDark, alt: \"Trade on Web browser\" },\n },\n} as const;\n\n/* ── Component ──────────────────────────────────────────────── */\n\nexport const DownloadBadge = ({\n platform,\n colorScheme = \"light\",\n href,\n className,\n ...props\n}: DownloadBadgeProps) => {\n const { src, alt } = BADGE_ASSETS[colorScheme][platform];\n\n return (\n <a\n className={[\n \"download-badge\",\n `download-badge--${colorScheme}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n href={href ?? \"#\"}\n aria-label={alt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...props}\n >\n <img className=\"download-badge__img\" src={src} alt={alt} />\n </a>\n );\n};\n","import type { StepsProps } from \"./Steps.types\";\nimport \"./Steps.css\";\n\nexport const Steps = ({\n title,\n steps,\n image,\n imageAlt = \"\",\n imagePosition = \"left\",\n embedded = false,\n titleId,\n}: StepsProps) => {\n const containerClass = [\n \"steps__container\",\n imagePosition === \"right\" ? \"steps__container--image-right\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n const wrapperClass = [\"steps\", embedded ? \"steps--embedded\" : \"\"].filter(Boolean).join(\" \");\n // Embedded usage (e.g. inside FeatureBlogPage's article body) drops the\n // standalone page-section shell, so it should not also introduce a\n // nested <section> landmark — a plain <div> keeps the surrounding\n // document outline flat, matching how sibling content blocks render.\n const Wrapper: \"section\" | \"div\" = embedded ? \"div\" : \"section\";\n\n return (\n <Wrapper className={wrapperClass}>\n <div className={containerClass}>\n {/* ── Image column ── */}\n {image && (\n <div className=\"steps__image-wrapper\">\n <img\n src={image}\n alt={imageAlt}\n className=\"steps__image\"\n />\n </div>\n )}\n\n {/* ── Content column ── */}\n <div className=\"steps__content\">\n <h2 className=\"steps__title\" id={titleId}>{title}</h2>\n\n <ol className=\"steps__list\">\n {steps.map((step, index) => (\n <li key={index} className=\"steps__item\">\n <div className=\"steps__item-inner\">\n <span className=\"steps__number\" aria-hidden=\"true\">\n {index + 1}\n </span>\n\n <div className=\"steps__item-body\">\n <h3 className=\"steps__item-title\">\n {step.title}\n </h3>\n <p className=\"steps__item-description\">\n {step.description}\n </p>\n </div>\n </div>\n </li>\n ))}\n </ol>\n </div>\n </div>\n </Wrapper>\n );\n};\n","import { DownloadBadge } from \"../../components/DownloadBadge\";\nimport type { DownloadBannerProps } from \"./DownloadBanner.types\";\nimport \"./DownloadBanner.css\";\n\nexport const DownloadBanner = ({\n style = \"light-2\",\n qrCodeImage,\n qrCodeAlt = \"QR code to download the app\",\n qrTitle = \"Scan to download\",\n qrSubtitle = \"Android & iOS\",\n mobileTitle = \"Available on\",\n showAppStore = true,\n showGooglePlay = true,\n showAppGallery = true,\n showWindows = true,\n showMacOS = true,\n showLinux = true,\n showWeb = true,\n appStoreHref,\n googlePlayHref,\n appGalleryHref,\n windowsHref,\n macOSHref,\n linuxHref,\n webHref,\n disclaimer,\n}: DownloadBannerProps) => {\n const colorScheme = style === \"dark\" ? \"dark\" : \"light\";\n\n return (\n <section className={`db-section db-section--${style}`}>\n <div className=\"db-container\">\n <div className=\"db-card\">\n {/* ── QR block (desktop) / heading (mobile) ── */}\n <div className=\"db-qr-block\">\n {qrCodeImage && (\n <img\n className=\"db-qr-image\"\n src={qrCodeImage}\n alt={qrCodeAlt}\n />\n )}\n <div className=\"db-qr-text\">\n {/* Desktop: two-line QR label */}\n <span className=\"db-qr-text__title db-qr-text__title--desktop\">\n {qrTitle}\n </span>\n <h2 className=\"db-qr-text__subtitle db-qr-text__subtitle--desktop\">\n {qrSubtitle}\n </h2>\n {/* Mobile: single heading */}\n <span className=\"db-qr-text__title db-qr-text__title--mobile\">\n {mobileTitle}\n </span>\n {disclaimer && (\n <span className=\"db-disclaimer\">{disclaimer}</span>\n )}\n </div>\n </div>\n\n {/* ── Badge grid ── */}\n <div className=\"db-badges\">\n {showGooglePlay && (\n <DownloadBadge platform=\"googleplay\" colorScheme={colorScheme} href={googlePlayHref} />\n )}\n {showAppGallery && (\n <DownloadBadge platform=\"appgallery\" colorScheme={colorScheme} href={appGalleryHref} />\n )}\n {showMacOS && (\n <DownloadBadge platform=\"macos\" colorScheme={colorScheme} href={macOSHref} />\n )}\n {showWindows && (\n <DownloadBadge platform=\"windows\" colorScheme={colorScheme} href={windowsHref} />\n )}\n {showLinux && (\n <DownloadBadge platform=\"linux\" colorScheme={colorScheme} href={linuxHref} />\n )}\n {showAppStore && (\n <DownloadBadge platform=\"appstore\" colorScheme={colorScheme} href={appStoreHref} />\n )}\n {showWeb && (\n <DownloadBadge platform=\"web\" colorScheme={colorScheme} href={webHref} />\n )}\n </div>\n </div>\n </div>\n </section>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { gsap } from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\nimport type { TextScrollProps } from \"./TextScroll.types\";\nimport \"./TextScroll.css\";\n\ngsap.registerPlugin(ScrollTrigger);\n\nexport const TextScroll = ({ text, className }: TextScrollProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const wordsRef = useRef<HTMLSpanElement[]>([]);\n\n /* Split the text string into individual word <span> elements.\n We do this in render so SSR / hydration is consistent. */\n const words = text.split(/\\s+/).filter(Boolean);\n\n useEffect(() => {\n const section = sectionRef.current;\n const wordEls = wordsRef.current.filter(Boolean);\n if (!section || wordEls.length === 0) return;\n\n const isMobile = window.matchMedia(\"(max-width: 767px)\").matches;\n const startValue = isMobile ? \"top 35%\" : \"top center\";\n const endValue = isMobile ? \"bottom 90%\" : \"bottom center\";\n\n /* Defer setup by one frame so the first paint renders words at\n full opacity (no flash of invisible content). After the frame,\n dim them and attach ScrollTrigger. */\n const rafId = requestAnimationFrame(() => {\n gsap.set(wordEls, { opacity: 0.2 });\n\n const tl = gsap.timeline({\n scrollTrigger: {\n trigger: section,\n start: startValue,\n end: endValue,\n scrub: 2,\n },\n });\n\n tl.to(wordEls, {\n opacity: 1,\n stagger: 0.1,\n ease: \"none\",\n });\n\n /* Store cleanup on the section element so the return fn can reach it */\n (section as HTMLElement & { _tl?: gsap.core.Timeline })._tl = tl;\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n const tl = (section as HTMLElement & { _tl?: gsap.core.Timeline })._tl;\n if (tl) {\n tl.scrollTrigger?.kill();\n tl.kill();\n }\n gsap.set(wordEls, { clearProps: \"opacity\" });\n };\n }, [text]);\n\n return (\n <section\n ref={sectionRef}\n className={[\"ts\", className].filter(Boolean).join(\" \")}\n >\n <div className=\"ts__inner\">\n <p className=\"ts__text\" aria-label={text}>\n {words.map((word, i) => (\n <span\n key={i}\n ref={(el) => {\n if (el) wordsRef.current[i] = el;\n }}\n className=\"ts__word\"\n aria-hidden=\"true\"\n >\n {word}\n {i < words.length - 1 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n </section>\n );\n};\n\nexport default TextScroll;\n","import { useEffect, useRef } from \"react\";\nimport type { StickyMarketCardItem, StickyMarketCardsProps } from \"./StickyMarketCards.types\";\nimport \"./StickyMarketCards.css\";\n\n/* ── Shared design-system placeholder image ────────────────── */\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\nexport const StickyMarketCards = ({\n sectionTitle,\n sectionDescription,\n items,\n className,\n ...props\n}: StickyMarketCardsProps) => {\n /* outer sticky wrappers — used for measuring overlap */\n const cardRefs = useRef<(HTMLElement | null)[]>([]);\n /* inner card elements — receive transform + filter on scroll */\n const cardInnerRefs = useRef<(HTMLElement | null)[]>([]);\n\n /* ── Scroll-driven scale + brightness ─────── */\n /*\n * Transform is applied to the INNER card element (not the sticky wrapper)\n * so that the layout position of the sticky wrapper is unchanged while\n * the visual card scales and dims as the next card overlaps it.\n * Max scale-down: 5% (scale = 0.95)\n * Max brightness reduction: 40% (brightness = 0.6)\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let rafId = 0;\n\n const update = () => {\n const wrappers = cardRefs.current.filter(Boolean) as HTMLElement[];\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n const n = wrappers.length;\n\n wrappers.forEach((wrapper, i) => {\n const inner = inners[i];\n if (!inner) return;\n\n /* Last card is always full scale + full brightness */\n if (i === n - 1) {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n return;\n }\n\n const nextWrapper = wrappers[i + 1];\n if (!nextWrapper) return;\n\n const currentRect = wrapper.getBoundingClientRect();\n const nextRect = nextWrapper.getBoundingClientRect();\n const overlap = currentRect.bottom - nextRect.top;\n\n if (overlap > 0) {\n const progress = Math.min(overlap / currentRect.height, 1);\n inner.style.transform = `scale(${(1 - progress * 0.05).toFixed(4)})`;\n inner.style.filter = `brightness(${(1 - progress * 0.4).toFixed(4)})`;\n } else {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n }\n });\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n update();\n\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n /* ── Sync card heights ────────────────────── */\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const syncHeights = () => {\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n if (!inners.length) return;\n\n /* 1. Clear explicit heights to get natural CSS height */\n inners.forEach((inner) => {\n inner.style.minHeight = \"\";\n });\n\n /* 2. Measure the tallest card */\n let maxH = 0;\n inners.forEach((inner) => {\n const h = inner.getBoundingClientRect().height;\n if (h > maxH) maxH = h;\n });\n\n /* 3. Apply max height to all cards */\n inners.forEach((inner) => {\n inner.style.minHeight = `${maxH}px`;\n });\n };\n\n /* Initial sync */\n syncHeights();\n\n /* Sync on resize */\n window.addEventListener(\"resize\", syncHeights);\n\n /* Sync after custom fonts load to prevent layout shift */\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(syncHeights);\n }\n\n return () => {\n window.removeEventListener(\"resize\", syncHeights);\n };\n }, [items.length]);\n\n const n = items.length;\n const maxStack = 4;\n const baseIndex = Math.max(0, n - maxStack);\n\n return (\n <section\n className={[\"smc\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"smc__inner\">\n <div className=\"smc__header-wrap\">\n <h2 className=\"smc__header\">{sectionTitle}</h2>\n {sectionDescription && (\n <p className=\"smc__description\">{sectionDescription}</p>\n )}\n </div>\n\n <div className=\"smc__track\">\n {items.map((item, i) => {\n const theme = item.theme ?? \"dark\";\n const offsetMultiplier = Math.max(0, i - baseIndex);\n\n return (\n <div\n key={i}\n ref={(el) => { cardRefs.current[i] = el; }}\n className=\"smc__card\"\n style={{\n [\"--smc-card-index\" as string]: String(offsetMultiplier),\n zIndex: i + 1,\n }}\n >\n <div\n ref={(el) => { cardInnerRefs.current[i] = el; }}\n className={[\n \"smc__card-inner\",\n `smc__card-inner--${theme}`,\n ].join(\" \")}\n >\n {/* Background image with semi-transparent overlay */}\n <div className=\"smc__card-bg\">\n <img\n src={item.imageUrl ?? PLACEHOLDER_IMAGE}\n alt=\"\"\n aria-hidden=\"true\"\n loading={i === 0 ? \"eager\" : \"lazy\"}\n />\n <div\n className={[\n \"smc__card-overlay\",\n `smc__card-overlay--${theme}`,\n ].join(\" \")}\n />\n </div>\n\n <div className=\"smc__card-content\">\n <div className=\"smc__card-title-wrap\">\n <h3 className=\"smc__card-title\">{item.title}</h3>\n </div>\n <div className=\"smc__card-desc-wrap\">\n <p className=\"smc__card-desc\">{item.description}</p>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </section>\n );\n};\n\nexport default StickyMarketCards;\n","import { useEffect, useRef, useState } from \"react\";\nimport { DotLottieInView, isLottieSrc } from \"../../components/DotLottieInView\";\nimport type {\n StickyMarketCardsLottieItem,\n StickyMarketCardsLottieProps,\n} from \"./StickyMarketCardsLottie.types\";\nimport \"./StickyMarketCardsLottie.css\";\n\nfunction safeHref(value?: string): string | null {\n if (!value) return null;\n if (value.startsWith(\"/\") && !value.startsWith(\"//\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction safeLottieSrc(value?: string): string | null {\n const href = safeHref(value);\n if (!href || !isLottieSrc(href)) return null;\n return href;\n}\n\nfunction PlaybackGlyph({ playing }: { playing: boolean }) {\n return (\n <svg className=\"smcl__control-icon\" viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n <circle className=\"smcl__control-disc\" cx=\"32\" cy=\"32\" r=\"32\" />\n {playing ? (\n <>\n <rect className=\"smcl__control-glyph\" x=\"23\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n <rect className=\"smcl__control-glyph\" x=\"35\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n </>\n ) : (\n <path\n className=\"smcl__control-glyph\"\n d=\"M26.5058 19.9527L42.7058 29.8527C43.4933 30.359 43.9996 31.259 43.9996 32.159C43.9996 33.1152 43.4933 34.0152 42.7058 34.4652L26.5058 44.3652C25.6621 44.8715 24.5933 44.9277 23.7496 44.4215C22.9058 43.9715 22.3996 43.0715 22.3996 42.059V22.259C22.3996 21.3027 22.9058 20.4027 23.7496 19.9527C24.5933 19.4465 25.6621 19.4465 26.5058 19.9527Z\"\n />\n )}\n </svg>\n );\n}\n\ninterface LottiePanelProps {\n item: StickyMarketCardsLottieItem;\n index: number;\n playing: boolean;\n onToggle: () => void;\n}\n\nfunction LottiePanel({ item, index, playing, onToggle }: LottiePanelProps) {\n const src = safeLottieSrc(item.lottieSrc);\n const posterSrc = safeHref(item.lottiePosterUrl);\n const controlId = `smcl-lottie-${index}-${item.title}`\n .replace(/[^a-zA-Z0-9_-]/g, \"-\")\n .slice(0, 80);\n\n return (\n <div className=\"smcl__lottie\">\n <div id={controlId} className=\"smcl__lottie-media\" aria-hidden=\"true\">\n {src ? (\n <DotLottieInView\n src={src}\n enabled={playing}\n loop\n className=\"smcl__lottie-player\"\n style={{ alignItems: \"stretch\", justifyContent: \"stretch\" }}\n poster={\n posterSrc ? (\n <img src={posterSrc} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n ) : undefined\n }\n />\n ) : null}\n </div>\n {posterSrc && !playing ? (\n <img\n className=\"smcl__lottie-poster\"\n src={posterSrc}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : null}\n {src ? (\n <button\n type=\"button\"\n className={`smcl__playback-toggle${playing ? \" smcl__playback-toggle--playing\" : \"\"}`}\n aria-controls={controlId}\n aria-pressed={playing}\n aria-label={`${playing ? \"Pause\" : \"Play\"} ${item.title} animation`}\n onClick={onToggle}\n >\n <PlaybackGlyph playing={playing} />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport const StickyMarketCardsLottie = ({\n sectionTitle,\n sectionDescription,\n items,\n className,\n ...props\n}: StickyMarketCardsLottieProps) => {\n const cardRefs = useRef<(HTMLElement | null)[]>([]);\n const cardInnerRefs = useRef<(HTMLElement | null)[]>([]);\n const [playing, setPlaying] = useState<Record<number, boolean>>({});\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let rafId = 0;\n\n const update = () => {\n const wrappers = cardRefs.current.filter(Boolean) as HTMLElement[];\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n const n = wrappers.length;\n\n wrappers.forEach((wrapper, i) => {\n const inner = inners[i];\n if (!inner) return;\n\n if (i === n - 1) {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n return;\n }\n\n const nextWrapper = wrappers[i + 1];\n if (!nextWrapper) return;\n\n const currentRect = wrapper.getBoundingClientRect();\n const nextRect = nextWrapper.getBoundingClientRect();\n const overlap = currentRect.bottom - nextRect.top;\n\n if (overlap > 0) {\n const progress = Math.min(overlap / currentRect.height, 1);\n inner.style.transform = `scale(${(1 - progress * 0.05).toFixed(4)})`;\n inner.style.filter = `brightness(${(1 - progress * 0.4).toFixed(4)})`;\n } else {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n }\n });\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n update();\n\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const syncHeights = () => {\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n if (!inners.length) return;\n\n inners.forEach((inner) => {\n inner.style.minHeight = \"\";\n });\n\n let maxH = 0;\n inners.forEach((inner) => {\n const h = inner.getBoundingClientRect().height;\n if (h > maxH) maxH = h;\n });\n\n inners.forEach((inner) => {\n inner.style.minHeight = `${maxH}px`;\n });\n };\n\n syncHeights();\n window.addEventListener(\"resize\", syncHeights);\n\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(syncHeights);\n }\n\n return () => {\n window.removeEventListener(\"resize\", syncHeights);\n };\n }, [items.length]);\n\n const n = items.length;\n const maxStack = 4;\n const baseIndex = Math.max(0, n - maxStack);\n\n return (\n <section\n className={[\"smcl\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"smcl__inner\">\n <div className=\"smcl__header-wrap\">\n <h2 className=\"smcl__header\">{sectionTitle}</h2>\n {sectionDescription && (\n <p className=\"smcl__description\">{sectionDescription}</p>\n )}\n </div>\n\n <div className=\"smcl__track\">\n {items.map((item, i) => {\n const theme = item.theme ?? \"dark\";\n const offsetMultiplier = Math.max(0, i - baseIndex);\n\n return (\n <div\n key={i}\n ref={(el) => {\n cardRefs.current[i] = el;\n }}\n className=\"smcl__card\"\n style={{\n [\"--smcl-card-index\" as string]: String(offsetMultiplier),\n zIndex: i + 1,\n }}\n >\n <div\n ref={(el) => {\n cardInnerRefs.current[i] = el;\n }}\n className={[\n \"smcl__card-inner\",\n `smcl__card-inner--${theme}`,\n ].join(\" \")}\n >\n <div className=\"smcl__card-content\">\n <LottiePanel\n item={item}\n index={i}\n playing={Boolean(playing[i])}\n onToggle={() =>\n setPlaying((prev) => ({\n ...prev,\n [i]: !prev[i],\n }))\n }\n />\n <div className=\"smcl__card-text\">\n <h3 className=\"smcl__card-title\">{item.title}</h3>\n <p className=\"smcl__card-desc\">{item.description}</p>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </section>\n );\n};\n\nexport default StickyMarketCardsLottie;\n","import { useState, useMemo } from \"react\";\nimport type { TableProps } from \"./Table.types\";\nimport { SearchField } from \"../../components/SearchField\";\nimport { Pagination } from \"../../components/Pagination\";\nimport \"./Table.css\";\n\nconst InfoIcon = ({ className }: { className?: string }) => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className={className}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 16V12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"8\" r=\"1\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n);\n\nexport const Table = ({\n sectionTitle,\n columns,\n rows,\n mainColumnKey,\n pageSize = 10,\n searchPlaceholder = \"Search\",\n infoText,\n className,\n ...props\n}: TableProps) => {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n const [tooltip, setTooltip] = useState({ visible: false, heading: \"\", description: \"\", x: 0, y: 0, arrowOffset: 0 });\n\n const mainKey =\n mainColumnKey ??\n columns.find((c) => c.width === \"main\")?.key ??\n columns[0]?.key;\n\n /* ── Filter ── */\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return rows;\n return rows.filter((row) =>\n Object.values(row).some((v) => v.toLowerCase().includes(q))\n );\n }, [rows, search]);\n\n /* ── Pagination ── */\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const startIdx = (currentPage - 1) * pageSize;\n const endIdx = Math.min(startIdx + pageSize, filtered.length);\n const visible = filtered.slice(startIdx, endIdx);\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n setPage(1);\n };\n\n const handleClear = () => {\n setSearch(\"\");\n setPage(1);\n };\n\n return (\n <section className={[\"tbl-section\", className].filter(Boolean).join(\" \")} {...props}>\n {sectionTitle && (\n <div className=\"tbl-section__header\">\n <h2 className=\"tbl-section__title\">{sectionTitle}</h2>\n </div>\n )}\n <div className=\"tbl-section__content\">\n <div className=\"tbl\">\n {/* ── Search + summary bar ── */}\n <div className=\"tbl__topbar\">\n <div className=\"tbl__search-wrap\">\n <SearchField\n placeholder={searchPlaceholder}\n value={search}\n onChange={handleSearch}\n onClear={handleClear}\n variant=\"fill\"\n aria-label={searchPlaceholder}\n />\n </div>\n <div className=\"tbl__summary\">\n {filtered.length > 0\n ? <>Showing {startIdx + 1}- {endIdx} of {filtered.length}</>\n : \"No results\"\n }\n </div>\n </div>\n\n {/* ── Scrollable table area ── */}\n <div className=\"tbl__scroll-wrapper\">\n <table className=\"tbl__table\">\n <thead>\n <tr className=\"tbl__tr\">\n {columns.map((col, colIdx) => {\n const isFirst = colIdx === 0;\n const isLast = colIdx === columns.length - 1;\n const isMain = col.width === \"main\" || col.key === mainKey;\n return (\n <th\n key={col.key}\n className={[\n \"tbl__th\",\n isMain ? \"tbl__th--main\" : \"\",\n col.width === \"big\" ? \"tbl__th--big\" : \"\",\n ].filter(Boolean).join(\" \")}\n >\n <div \n className=\"tbl__th-inner\"\n onMouseEnter={(e) => {\n if (!col.tooltip) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const targetX = rect.left + rect.width / 2;\n const targetY = rect.top;\n \n // Tooltip width is 13rem (208px). Half is 104px.\n const tooltipHalfWidth = 104;\n const margin = 16;\n \n // Clamp the tooltip box so it doesn't overflow screen edges\n const clampedX = Math.max(\n margin + tooltipHalfWidth,\n Math.min(window.innerWidth - margin - tooltipHalfWidth, targetX)\n );\n \n // Offset the arrow so it still points to the exact center of the header\n const arrowOffset = targetX - clampedX;\n\n setTooltip({\n visible: true,\n heading: col.tooltip.heading,\n description: col.tooltip.description,\n x: clampedX,\n y: targetY,\n arrowOffset\n });\n }}\n onMouseLeave={() => {\n if (col.tooltip) {\n setTooltip(prev => ({ ...prev, visible: false }));\n }\n }}\n >\n <span className={[\"tbl__col-label\", col.tooltip ? \"tbl__col-label--dashed\" : \"\"].filter(Boolean).join(\" \")}>\n {Array.isArray(col.header)\n ? col.header.map((line, li) => (\n <span key={li}>\n {line}\n {li < (col.header as string[]).length - 1 && <br />}\n </span>\n ))\n : col.header\n }\n </span>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n\n <tbody className=\"tbl__tbody\">\n {visible.length > 0 ? (\n visible.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"tbl__tr\">\n {columns.map((col) => {\n const isMain = col.width === \"main\" || col.key === mainKey;\n const iconUrl = row[`${col.key}_iconUrl`];\n return (\n <td\n key={col.key}\n className={[\n \"tbl__td\",\n isMain ? \"tbl__td--main\" : \"\",\n col.width === \"big\" ? \"tbl__td--big\" : \"\",\n ].filter(Boolean).join(\" \")}\n >\n {isMain ? (\n <div className=\"tbl__cell-inner\">\n {iconUrl && (\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"tbl__cell-icon\"\n loading=\"lazy\"\n width=\"24\"\n height=\"24\"\n />\n )}\n <span className=\"tbl__cell-text tbl__cell-text--bold\">{row[col.key] ?? \"\"}</span>\n </div>\n ) : (\n <span className=\"tbl__cell-text\">{row[col.key] ?? \"\"}</span>\n )}\n </td>\n );\n })}\n </tr>\n ))\n ) : (\n <tr className=\"tbl__tr\">\n <td colSpan={columns.length} className=\"tbl__empty-cell\">\n No results found for \"{search}\"\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── Footer: Pagination ── */}\n {totalPages > 1 && (\n <div className=\"tbl__footer\">\n <div className=\"tbl__pagination-wrap\">\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n />\n </div>\n </div>\n )}\n </div>\n \n {/* ── Message Box (Out of table, bottom center) ── */}\n {infoText && (\n <div className=\"tbl-section__info-box\">\n <InfoIcon className=\"tbl-section__info-icon\" />\n <p className=\"tbl-section__info-text\">{infoText}</p>\n </div>\n )}\n </div>\n\n {/* ── Global Tooltip Portal ── */}\n <div \n className={[\"tbl__global-hint\", tooltip.visible ? \"tbl__global-hint--visible\" : \"\"].filter(Boolean).join(\" \")}\n style={{ left: tooltip.x, top: tooltip.y - 8 }}\n >\n <div className=\"tbl__global-hint-desc\">{tooltip.description}</div>\n <div \n className=\"tbl__global-hint-arrow\" \n style={{ transform: `translateX(calc(-50% + ${tooltip.arrowOffset}px))` }}\n />\n </div>\n </section>\n );\n};\n\nexport default Table;\n","import type { DynamicTableColumnDef, DynamicTableProps, DynamicTableRowData } from \"./DynamicTable.types\";\nimport \"./DynamicTable.css\";\n\nconst VARIANT_COLUMN_COUNT = {\n \"Three columns\": 3,\n \"Four columns\": 4,\n} as const;\n\nconst VARIANT_CLASS = {\n \"Three columns\": \"dtbl--three-columns\",\n \"Four columns\": \"dtbl--four-columns\",\n} as const;\n\nconst toLines = (value: string | string[] | undefined): string[] => {\n if (value == null) return [];\n const parts = Array.isArray(value) ? value : [value];\n return parts.flatMap((part) => part.split(\"\\n\")).filter((line) => line.length > 0);\n};\n\nconst renderLines = (value: string | string[] | undefined) => {\n const lines = toLines(value);\n if (lines.length === 0) return null;\n\n return lines.map((line, index) => (\n <span key={index} className=\"dtbl__cell-line\">\n {line}\n </span>\n ));\n};\n\nconst renderHeader = (col: DynamicTableColumnDef) => (\n <span className=\"dtbl__cell\">\n {renderLines(col.header)}\n </span>\n);\n\nconst renderCell = (row: DynamicTableRowData, col: DynamicTableColumnDef) => (\n <span className=\"dtbl__cell\">\n {renderLines(row[col.key])}\n </span>\n);\n\nexport const DynamicTable = ({\n sectionTitle,\n variant = \"Three columns\",\n columns,\n rows,\n className,\n ...props\n}: DynamicTableProps) => {\n const columnCount = VARIANT_COLUMN_COUNT[variant];\n const visibleColumns = columns.slice(0, columnCount);\n const labelColumn = visibleColumns[0];\n const valueColumns = visibleColumns.slice(1);\n\n return (\n <section\n className={[\"dtbl-section\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {sectionTitle && (\n <div className=\"dtbl-section__header\">\n <h2 className=\"dtbl-section__title\">{sectionTitle}</h2>\n </div>\n )}\n\n <div className=\"dtbl-section__content\">\n <div className={[\"dtbl\", VARIANT_CLASS[variant]].join(\" \")}>\n <div className=\"dtbl__scroll-wrapper\">\n <table className=\"dtbl__table\">\n <thead>\n <tr className=\"dtbl__tr\">\n {visibleColumns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n className=\"dtbl__th\"\n >\n {renderHeader(col)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"dtbl__tr\">\n {labelColumn && (\n <th scope=\"row\" className=\"dtbl__th-row\">\n {renderCell(row, labelColumn)}\n </th>\n )}\n {valueColumns.map((col) => (\n <td key={col.key} className=\"dtbl__td\">\n {renderCell(row, col)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default DynamicTable;\n","import { useState } from \"react\";\nimport { Link } from \"../../components/Link\";\nimport { Button } from \"../../components/Button\";\nimport type { PersonItem, AvatarGridProps } from \"./Leaders.types\";\nimport \"./Leaders.css\";\n\nconst ChevronDownIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronUpIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/* ── Card content — shared between both grid sections ─────── */\nconst CardContent = ({ item }: { item: PersonItem }) => (\n <>\n <div className=\"avatar-grid__image-wrapper\">\n <img\n src={item.imageUrl}\n alt={item.name}\n className=\"avatar-grid__image\"\n loading=\"lazy\"\n />\n </div>\n <div className=\"avatar-grid__content\">\n <h3 className=\"avatar-grid__name\">{item.name}</h3>\n <p className=\"avatar-grid__role\">{item.role}</p>\n </div>\n {item.linkUrl && (\n <Link\n href={item.linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={item.linkIcon}\n label={item.linkLabel ?? \"Profile\"}\n colorScheme=\"black\"\n showChevron={false}\n className=\"avatar-grid__link\"\n />\n )}\n </>\n);\n\nexport const AvatarGrid = ({\n title,\n description,\n items,\n initialVisibleCount = 4,\n expandText = \"View all\",\n collapseText = \"View less\",\n className,\n ...props\n}: AvatarGridProps) => {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const hasMore = items.length > initialVisibleCount;\n const visibleItems = items.slice(0, initialVisibleCount);\n const extraItems = items.slice(initialVisibleCount);\n\n return (\n <section className={[\"avatar-grid\", className].filter(Boolean).join(\" \")} {...props}>\n <div className=\"avatar-grid__container\">\n {(title || description) && (\n <div className=\"avatar-grid__header\">\n {title && <h2 className=\"avatar-grid__title\">{title}</h2>}\n {description && <p className=\"avatar-grid__description\">{description}</p>}\n </div>\n )}\n\n <div className=\"avatar-grid__grid-wrapper\">\n {/* ── Always-visible first N cards ── */}\n <div className=\"avatar-grid__grid\">\n {visibleItems.map((item, i) => (\n <div key={i} className=\"avatar-grid__card\">\n <CardContent item={item} />\n </div>\n ))}\n </div>\n\n {/* ── Animated extra cards ── */}\n {hasMore && (\n <div\n className={[\n \"avatar-grid__extra-cards\",\n isExpanded ? \"avatar-grid__extra-cards--open\" : \"\",\n ].join(\" \")}\n aria-hidden={!isExpanded}\n >\n <div className=\"avatar-grid__extra-grid\">\n {extraItems.map((item, i) => (\n <div\n key={i}\n className={[\n \"avatar-grid__card\",\n \"avatar-grid__extra-card\",\n isExpanded ? \"avatar-grid__extra-card--visible\" : \"\",\n ].join(\" \")}\n style={{\n transitionDelay: isExpanded\n ? `${i * 70 + 120}ms`\n : \"0ms\",\n }}\n >\n <CardContent item={item} />\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {hasMore && (\n <div className=\"avatar-grid__actions\">\n <Button\n variant=\"secondary\"\n colorScheme=\"black\"\n onClick={() => setIsExpanded(!isExpanded)}\n iconPosition=\"icon-right\"\n icon={isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n fullWidth\n >\n {isExpanded ? collapseText : expandText}\n </Button>\n </div>\n )}\n </div>\n </section>\n );\n};\n\n/** @deprecated Use AvatarGrid instead */\nexport const PeopleGrid = AvatarGrid;\n/** @deprecated Use AvatarGrid instead */\nexport const Leaders = AvatarGrid;\n\nexport default AvatarGrid;\n","import type { ImageBannerProps } from \"./ImageBanner.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./ImageBanner.css\";\n\nconst DEFAULT_CHIPS = [\n \"Dynamic ads\",\n \"AI insights\",\n \"Performance tracking\",\n \"Events\",\n];\n\n/** Reference collage for chips variants (1920×1440). Banner height follows this asset’s ratio. */\nexport const IMAGE_BANNER_CHIPS_DEFAULT_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69a13cf79748b347527dc74d_tier-cover.webp\";\n\n/** Checkmark glyph matching the partners_tag icon on deriv.com/partners. */\nconst ChipCheckIcon = () => (\n <svg\n className=\"image-banner__chip-icon\"\n width=\"11\"\n height=\"12\"\n viewBox=\"0 0 11 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M10.5156 5.98438C10.8203 6.26562 10.8203 6.75781 10.5156 7.03906L4.51562 13.0391C4.23438 13.3438 3.74219 13.3438 3.46094 13.0391L0.460938 10.0391C0.15625 9.75781 0.15625 9.26562 0.460938 8.98438C0.742188 8.67969 1.23438 8.67969 1.51562 8.98438L4 11.4453L9.46094 5.98438C9.74219 5.67969 10.2344 5.67969 10.5156 5.98438Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.88\"\n />\n </svg>\n);\n\nexport const ImageBanner = ({\n variant = \"split-left\",\n title = \"Join our global community\",\n description = \"Connect with traders around the world to exchange insights, explore portfolios, and gain valuable expertise.\",\n ctaLabel = \"Trader's Hub\",\n ctaHref,\n onCtaClick,\n chips = DEFAULT_CHIPS,\n imageUrl,\n imageAlt = \"\",\n className,\n ...props\n}: ImageBannerProps) => {\n const isFullBg = variant === \"full-bg-left\" || variant === \"full-bg-right\";\n const isChips = variant === \"chips-left\" || variant === \"chips-right\";\n const showCta = !isChips && Boolean(ctaLabel);\n const visibleChips = isChips ? chips.filter((label) => label.trim().length > 0) : [];\n const resolvedImageUrl =\n imageUrl ?? (isChips ? IMAGE_BANNER_CHIPS_DEFAULT_IMAGE : undefined);\n\n return (\n <section\n className={[\n \"image-banner\",\n isChips ? \"image-banner--chips\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n <div\n className={[\n \"image-banner__inner\",\n `image-banner__inner--${variant}`,\n ].join(\" \")}\n >\n {/* ── Full-bg: image as CSS background ── */}\n {isFullBg && resolvedImageUrl && (\n <div className=\"image-banner__bg-image-wrapper\">\n <img\n src={resolvedImageUrl}\n alt={imageAlt}\n className=\"image-banner__bg-image\"\n loading=\"lazy\"\n />\n <div className=\"image-banner__bg-overlay\" aria-hidden=\"true\" />\n </div>\n )}\n\n {/* ── Text + CTA / chips ── */}\n <div className=\"image-banner__content\">\n <h2 className=\"image-banner__title\">{title}</h2>\n\n {description && (\n <p className=\"image-banner__description\">{description}</p>\n )}\n\n {visibleChips.length > 0 && (\n <ul className=\"image-banner__chips\" aria-label=\"Features\">\n {visibleChips.map((label) => (\n <li key={label} className=\"image-banner__chip\">\n <ChipCheckIcon />\n <span className=\"image-banner__chip-label\">{label}</span>\n </li>\n ))}\n </ul>\n )}\n\n {showCta && (\n <div className=\"image-banner__actions\">\n <Link\n colorScheme=\"coral\"\n label={ctaLabel}\n href={ctaHref}\n onClick={onCtaClick}\n showChevron\n className=\"image-banner__cta-link\"\n />\n </div>\n )}\n </div>\n\n {/* ── Split / chips: image in side panel ── */}\n {!isFullBg && resolvedImageUrl && (\n <div className=\"image-banner__image-wrapper\">\n <img\n src={resolvedImageUrl}\n alt={imageAlt}\n className=\"image-banner__image\"\n loading=\"lazy\"\n />\n {isChips && (\n <div\n className=\"image-banner__image-fade\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default ImageBanner;\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { TestimonialItem, TestimonialProps } from \"./Testimonial.types\";\nimport quoteLeft from \"../../assets/quote-left.webp\";\nimport quoteRight from \"../../assets/quote-right.webp\";\nimport trustpilotBadge from \"../../assets/trustpilot-rating-badge.png\";\nimport \"./Testimonial.css\";\n\n/* ── Star rating icon (Trustpilot variant) ────────────────────────\n * Renders a single \"star cell\" with a partial fill (0–1) so half-star\n * ratings (e.g. 4.5) render correctly. Geometry (flush square corners,\n * the asymmetric star-with-notch glyph) and colors are traced from\n * Trustpilot's own rating-widget SVGs (cdn.trustpilot.net/brand-assets),\n * not approximated — same source as the footer wordmark's star glyph.\n */\nconst StarCell = ({ fill }: { fill: number }) => {\n const clipId = useId();\n const clamped = Math.max(0, Math.min(1, fill));\n\n return (\n <svg\n className=\"testimonial__tp-star\"\n viewBox=\"0 0 96 96\"\n width=\"20\"\n height=\"20\"\n aria-hidden=\"true\"\n >\n <rect width=\"96\" height=\"96\" className=\"testimonial__tp-star-bg\" />\n <clipPath id={clipId}>\n <rect width={96 * clamped} height=\"96\" />\n </clipPath>\n <rect\n width=\"96\"\n height=\"96\"\n className=\"testimonial__tp-star-fill\"\n clipPath={`url(#${clipId})`}\n />\n <path\n d=\"M48,64.7L62.6,61l6.1,18.8L48,64.7z M81.6,40.4H55.9L48,16.2l-7.9,24.2H14.4l20.8,15l-7.9,24.2 l20.8-15l12.8-9.2L81.6,40.4L81.6,40.4L81.6,40.4L81.6,40.4z\"\n className=\"testimonial__tp-star-glyph\"\n />\n </svg>\n );\n};\n\n/* ── Star row — builds N star cells from a numeric rating (0–5) ── */\nconst StarRow = ({ rating, size = \"sm\" }: { rating: number; size?: \"sm\" | \"md\" | \"lg\" }) => {\n const stars = [0, 1, 2, 3, 4].map((i) => Math.max(0, Math.min(1, rating - i)));\n return (\n <span\n className={[\"testimonial__tp-stars\", `testimonial__tp-stars--${size}`].join(\" \")}\n role=\"img\"\n aria-label={`Rated ${rating} out of 5 stars`}\n >\n {stars.map((fill, i) => (\n <StarCell key={i} fill={fill} />\n ))}\n </span>\n );\n};\n\nconst ArrowIcon = ({ direction }: { direction: \"prev\" | \"next\" }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n {direction === \"prev\" ? (\n <path d=\"M10 3.5 5.5 8l4.5 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n ) : (\n <path d=\"M6 3.5 10.5 8 6 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n )}\n </svg>\n);\n\n/* ── Trustpilot variant ────────────────────────────────────────── */\n\nconst SCROLL_EPS = 4;\n\nfunction readScrollState(el: HTMLDivElement | null) {\n if (!el) return { canPrev: false, canNext: false };\n const { scrollLeft, scrollWidth, clientWidth } = el;\n const maxScroll = scrollWidth - clientWidth;\n return {\n canPrev: scrollLeft > SCROLL_EPS,\n canNext: scrollLeft < maxScroll - SCROLL_EPS,\n };\n}\n\nconst TrustpilotTestimonial = ({\n title,\n items,\n className,\n trustpilotUrl = \"https://www.trustpilot.com/review/deriv.com?utm_medium=trustbox&utm_source=Mini\",\n trustpilotScore = 4.5,\n ...props\n}: TestimonialProps) => {\n const trackRef = useRef<HTMLDivElement>(null);\n const [canPrev, setCanPrev] = useState(false);\n const [canNext, setCanNext] = useState(true);\n\n const syncScrollState = useCallback(() => {\n const next = readScrollState(trackRef.current);\n setCanPrev(next.canPrev);\n setCanNext(next.canNext);\n }, []);\n\n useEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n syncScrollState();\n const ro = new ResizeObserver(() => syncScrollState());\n ro.observe(el);\n return () => ro.disconnect();\n }, [syncScrollState]);\n\n const scrollByCard = (direction: -1 | 1) => {\n const el = trackRef.current;\n if (!el) return;\n const card = el.querySelector<HTMLElement>(\".testimonial__tp-card-wrap\");\n const gap = Number.parseFloat(getComputedStyle(el).columnGap || \"0\") || 0;\n const delta = card?.offsetWidth ?? el.clientWidth * 0.85;\n el.scrollBy({ left: direction * (delta + gap), behavior: \"smooth\" });\n window.requestAnimationFrame(() => window.setTimeout(syncScrollState, 320));\n };\n\n return (\n <section\n className={[\"testimonial\", \"testimonial--trustpilot\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* Title sits in the normal padded/centered content column. */}\n <div className=\"testimonial__tp-head\">\n {title && (\n <h2 className=\"testimonial__title testimonial__title--trustpilot\">{title}</h2>\n )}\n </div>\n\n {/* Full-bleed row: spans the entire viewport (not the 1280px content\n * column) so scrolling reveals cards flush with — and past — the\n * browser edge, matching deriv.com's homepage carousel. The card\n * track (not this wrapper) carries the matching inline gutter, so\n * the resting position still lines up with the title/footer above\n * and below, but that gutter scrolls away with the content. */}\n <div className=\"testimonial__tp-bleed\">\n <div\n ref={trackRef}\n className=\"testimonial__tp-carousel\"\n tabIndex={0}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"Customer reviews on Trustpilot\"\n onScroll={syncScrollState}\n >\n <div className=\"testimonial__tp-track\">\n {items.map((item, i) => (\n <div key={i} className=\"testimonial__tp-card-wrap\">\n <a\n href={item.reviewUrl ?? trustpilotUrl}\n className=\"testimonial__tp-card\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <StarRow rating={item.rating ?? 5} size=\"sm\" />\n <p className=\"testimonial__tp-quote\">{item.quote}</p>\n <p className=\"testimonial__tp-author\">{item.authorName}</p>\n </a>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Footer returns to the normal padded/centered content column. */}\n <div className=\"testimonial__tp-foot\">\n <div className=\"testimonial__tp-footer\">\n {/* This wrapper grows to fill the space next to the nav buttons\n * and centers the badge within it, so the badge sits centered\n * in the row rather than pinned to the far left — matching\n * deriv.com's homepage footer layout. */}\n <div className=\"testimonial__tp-trust\">\n <a\n href={trustpilotUrl}\n className=\"testimonial__tp-badge\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Deriv on Trustpilot — rated ${trustpilotScore} out of 5`}\n >\n <img\n src={trustpilotBadge}\n alt=\"\"\n className=\"testimonial__tp-badge-img\"\n />\n </a>\n </div>\n\n {/* Both buttons always mount in their fixed slots, so the\n * nav's footprint (and therefore the centered badge beside\n * it) never shifts as canPrev/canNext toggle while\n * scrolling. At either end, the inactive direction stays\n * visible but muted (native `disabled`, dimmed via CSS)\n * rather than hidden — showing both directions up front\n * makes it clear from the first render that this is a\n * carousel, instead of the \"next\" arrow appearing to come\n * from nowhere once the first one is scrolled away.\n * `disabled` already removes the button from the tab\n * order and blocks activation, so no extra tabIndex is\n * needed; leaving `aria-hidden` off keeps it announced to\n * assistive tech as present-but-unavailable rather than\n * disappearing from the accessibility tree. */}\n {items.length > 1 && (canPrev || canNext) && (\n <div className=\"testimonial__tp-nav\">\n <button\n type=\"button\"\n className=\"testimonial__tp-nav-btn\"\n aria-label=\"Show previous testimonials\"\n disabled={!canPrev}\n onClick={() => scrollByCard(-1)}\n >\n <ArrowIcon direction=\"prev\" />\n </button>\n <button\n type=\"button\"\n className=\"testimonial__tp-nav-btn\"\n aria-label=\"Show next testimonials\"\n disabled={!canNext}\n onClick={() => scrollByCard(1)}\n >\n <ArrowIcon direction=\"next\" />\n </button>\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\n/* ── Default variant ──────────────────────────────────────────────\n * Single-slide auto-advancing quote carousel with dot pagination.\n */\n\ntype Phase = \"idle\" | \"exiting\";\n\nconst DefaultTestimonial = ({\n title,\n items,\n className,\n ...props\n}: TestimonialProps) => {\n const [activeIndex, setActiveIndex] = useState(0);\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const pendingIndex = useRef<number | null>(null);\n const autoRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const goTo = (next: number) => {\n if (next === activeIndex || phase !== \"idle\") return;\n pendingIndex.current = next;\n setPhase(\"exiting\");\n };\n\n /* After exit transition (200ms), switch to the new slide */\n useEffect(() => {\n if (phase === \"exiting\") {\n const t = setTimeout(() => {\n setActiveIndex(pendingIndex.current ?? activeIndex);\n setPhase(\"idle\");\n }, 200);\n return () => clearTimeout(t);\n }\n }, [phase, activeIndex]);\n\n /* Auto-advance every 5 s; resets on manual navigation */\n useEffect(() => {\n if (items.length <= 1) return;\n autoRef.current = setTimeout(() => {\n const next = (activeIndex + 1) % items.length;\n pendingIndex.current = next;\n setPhase(\"exiting\");\n }, 5000);\n return () => {\n if (autoRef.current) clearTimeout(autoRef.current);\n };\n }, [activeIndex, items.length]);\n\n return (\n <section\n className={[\"testimonial\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"testimonial__container\">\n {title && <h2 className=\"testimonial__title\">{title}</h2>}\n\n <div className=\"testimonial__carousel\">\n {/* ── All slides stacked — container height = tallest card ── */}\n <div className=\"testimonial__slides\">\n {items.map((item: TestimonialItem, i) => {\n const isActive = i === activeIndex;\n const isExiting = isActive && phase === \"exiting\";\n\n const slideClass = [\n \"testimonial__slide\",\n isActive && !isExiting ? \"testimonial__slide--active\" : \"\",\n isExiting ? \"testimonial__slide--exiting\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={i}\n className={slideClass}\n role=\"region\"\n aria-label={`Testimonial ${i + 1} of ${items.length}`}\n aria-hidden={!isActive}\n >\n <div className=\"testimonial__card\">\n {/* Opening quote mark */}\n <span className=\"testimonial__quotemark testimonial__quotemark--open\" aria-hidden=\"true\">\n <img src={quoteLeft} alt=\"\" className=\"testimonial__quotemark-img\" />\n </span>\n\n {/* Quote */}\n <p className=\"testimonial__quote\">{item.quote}</p>\n\n {/* Author */}\n <div className=\"testimonial__author\">\n {item.avatarUrl && (\n <img\n src={item.avatarUrl}\n alt={item.authorName}\n className=\"testimonial__author-avatar\"\n loading=\"lazy\"\n />\n )}\n <p className=\"testimonial__author-name\">\n {item.authorName}\n </p>\n {item.authorLocation && (\n <p className=\"testimonial__author-location\">\n {item.authorLocation}\n </p>\n )}\n </div>\n\n {/* Closing quote mark */}\n <span className=\"testimonial__quotemark testimonial__quotemark--close\" aria-hidden=\"true\">\n <img src={quoteRight} alt=\"\" className=\"testimonial__quotemark-img\" />\n </span>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* ── Dot pagination ── */}\n {items.length > 1 && (\n <div\n className=\"testimonial__dots\"\n role=\"tablist\"\n aria-label=\"Testimonial navigation\"\n >\n {items.map((_, i) => (\n <button\n key={i}\n role=\"tab\"\n aria-selected={i === activeIndex}\n aria-label={`Go to testimonial ${i + 1}`}\n className={[\n \"testimonial__dot\",\n i === activeIndex\n ? \"testimonial__dot--active\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => {\n if (autoRef.current) clearTimeout(autoRef.current);\n goTo(i);\n }}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\n/* ── Public component — dispatches to the selected variant ───────\n * Kept hook-free so switching `variant` never risks a rules-of-hooks\n * violation; each variant owns its own state/effects internally.\n */\nexport const Testimonial = (props: TestimonialProps) => {\n if (!props.items || props.items.length === 0) return null;\n\n if (props.variant === \"trustpilot\") {\n return <TrustpilotTestimonial {...props} />;\n }\n\n return <DefaultTestimonial {...props} />;\n};\n","import type { ArticleHeroProps, ArticleHeroArticle, ArticleHeroColumn } from \"./ArticleHero.types\";\nimport { Card } from \"../../components/Card\";\nimport { Tag } from \"../../components/Tag\";\nimport \"./ArticleHero.css\";\n\nconst ArticleCard = ({ article, showThumbnail = false }: { article: ArticleHeroArticle; showThumbnail?: boolean }) => (\n <div className=\"bh-listItem\">\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!showThumbnail || !article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n);\n\nconst ColumnSection = ({ column, showThumbnails = false }: { column: ArticleHeroColumn; showThumbnails?: boolean }) => (\n <div className=\"bh-column\">\n {column.label && (\n <div className=\"bh-columnHeader\">\n <span className=\"bh-columnLabel\">{column.label}</span>\n <span className=\"bh-columnLine\" />\n </div>\n )}\n <div className=\"bh-columnList\">\n {column.articles.map((article, i) => (\n <ArticleCard article={article} key={i} showThumbnail={showThumbnails} />\n ))}\n </div>\n </div>\n);\n\nexport const ArticleHero = ({\n featured,\n featuredFooter = [],\n leftColumn,\n rightColumn,\n className,\n}: ArticleHeroProps) => {\n return (\n <section className={[\"bh-root\", className ?? \"\"].filter(Boolean).join(\" \")}>\n {/* ── Desktop layout ────────────────────────────── */}\n <div className=\"bh-desktop\">\n <div className=\"bh-desktopHeader\">\n <div className=\"bh-headerLeft\">\n {leftColumn.label && (\n <div className=\"bh-columnHeader\">\n <span className=\"bh-columnLabel\">{leftColumn.label}</span>\n <span className=\"bh-columnLine\" />\n </div>\n )}\n </div>\n <div className=\"bh-headerRight\">\n {rightColumn.label && (\n <div className=\"bh-columnHeader\">\n <span className=\"bh-columnLabel\">{rightColumn.label}</span>\n <span className=\"bh-columnLine\" />\n </div>\n )}\n </div>\n </div>\n <div className=\"bh-desktopBody\">\n <div className=\"bh-sidebar bh-sidebarLeft\">\n <ColumnSection column={{ ...leftColumn, label: undefined }} showThumbnails />\n </div>\n <span className=\"bh-divider\" />\n <div className=\"bh-center\">\n <div className=\"bh-featured\">\n <div className=\"bh-featuredInfo\">\n <h2 className=\"bh-featuredTitle\">{featured.title}</h2>\n {featured.summary && <p className=\"bh-featuredSummary\">{featured.summary}</p>}\n {featured.tags && featured.tags.length > 0 && (\n <div className=\"bh-featuredTags\">\n {featured.tags.map((tag, i) => (\n <span className=\"bh-tagItem\" key={i}>\n {i > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n {featured.thumbnail && (\n <div className=\"bh-featuredImage\">\n <img alt={featured.thumbnailAlt ?? \"\"} className=\"bh-featuredImg\" src={featured.thumbnail} />\n </div>\n )}\n </div>\n {featuredFooter.length > 0 && (\n <div className=\"bh-featuredFooter\">\n {featuredFooter.map((article, i) => (\n <div className=\"bh-footerItem\" key={i}>\n {i > 0 && <span className=\"bh-footerDivider\" />}\n <div className=\"bh-footerContent\">\n <p className=\"bh-footerTitle\">{article.title}</p>\n {article.tags && article.tags.length > 0 && (\n <div className=\"bh-listItemTags\">\n {article.tags.map((tag, j) => (\n <span className=\"bh-tagItem\" key={j}>\n {j > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n <span className=\"bh-divider\" />\n <div className=\"bh-sidebar bh-sidebarRight\">\n <ColumnSection column={{ ...rightColumn, label: undefined }} />\n </div>\n </div>\n </div>\n\n {/* ── Mobile layout ─────────────────────────────── */}\n <div className=\"bh-mobile\">\n <div className=\"bh-mobileFeatured\">\n <span className=\"bh-mobileLabel\">{leftColumn.label ?? \"Trending stories\"}</span>\n <div className=\"bh-featuredInfo\">\n <h2 className=\"bh-featuredTitle\">{featured.title}</h2>\n {featured.summary && <p className=\"bh-featuredSummary\">{featured.summary}</p>}\n {featured.tags && featured.tags.length > 0 && (\n <div className=\"bh-featuredTags\">\n {featured.tags.map((tag, i) => (\n <span className=\"bh-tagItem\" key={i}>\n {i > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n {featured.thumbnail && (\n <div className=\"bh-mobileFeaturedImage\">\n <img alt={featured.thumbnailAlt ?? \"\"} className=\"bh-featuredImg\" src={featured.thumbnail} />\n </div>\n )}\n {featuredFooter.length > 0 && (\n <div className=\"bh-featuredFooter\">\n {featuredFooter.map((article, i) => (\n <div className=\"bh-footerItem\" key={i}>\n {i > 0 && <span className=\"bh-footerDivider\" />}\n <div className=\"bh-footerContent\">\n <p className=\"bh-footerTitle\">{article.title}</p>\n {article.tags && article.tags.length > 0 && (\n <div className=\"bh-listItemTags\">\n {article.tags.map((tag, j) => (\n <span className=\"bh-tagItem\" key={j}>\n {j > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"bh-mobileSection\">\n <ColumnSection column={{ ...leftColumn, label: undefined }} showThumbnails />\n </div>\n <div className=\"bh-mobileSection\">\n <ColumnSection column={rightColumn} />\n </div>\n </div>\n </section>\n );\n};\n\nexport default ArticleHero;\n","import type { ArticleSectionProps } from \"./ArticleSection.types\";\nimport { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport \"./ArticleSection.css\";\n\nexport const ArticleSection = ({\n variant = \"featured\",\n sectionTitle,\n linkText = \"View all articles\",\n onLinkClick,\n featured,\n articles,\n className,\n}: ArticleSectionProps) => {\n const isShowcase = variant === \"showcase\";\n const isGrid = variant === \"grid\";\n const rootClass = [\"as-root\", isShowcase ? \"as-showcase\" : \"\", isGrid ? \"as-grid-variant\" : \"\", className ?? \"\"].filter(Boolean).join(\" \");\n\n const midpoint = Math.ceil(articles.length / 2);\n const col2 = articles.slice(0, midpoint);\n const col3 = articles.slice(midpoint);\n\n return (\n <section className={rootClass}>\n {/* ── Header ─────────────────────────────────────── */}\n <div className=\"as-header\">\n <h2 className=\"as-title\">{sectionTitle}</h2>\n {linkText && (\n <Link colorScheme=\"coral\" label={linkText} onClick={onLinkClick} />\n )}\n </div>\n\n {/* ── Desktop layout ──────────────────────────────── */}\n <div className=\"as-desktop\">\n {!isShowcase && !isGrid && featured && (\n <>\n <div className=\"as-featuredRow\">\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail={featured.thumbnail ?? \"\"}\n thumbnailAlt={featured.thumbnailAlt}\n hideThumbnail={!featured.thumbnail}\n title={featured.title}\n summary={featured.summary ?? \"\"}\n tags={(featured.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n <div className=\"as-grid\">\n {articles.map((article, i) => (\n <div className=\"as-gridItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n </>\n )}\n {isGrid && (\n <div className=\"as-grid\">\n {articles.map((article, i) => (\n <div className=\"as-gridItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary={article.summary ?? \"\"}\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n )}\n {isShowcase && (\n <div className=\"as-showcaseGrid\">\n <div className=\"as-showcaseFeatured\">\n {featured && (\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={featured.thumbnail ?? \"\"}\n thumbnailAlt={featured.thumbnailAlt}\n hideThumbnail={!featured.thumbnail}\n title={featured.title}\n summary={featured.summary ?? \"\"}\n tags={(featured.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n )}\n </div>\n <div className=\"as-showcaseCol\">\n {col2.map((article, i) => (\n <div className=\"as-showcaseItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal-reverse\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n <div className=\"as-showcaseCol\">\n {col3.map((article, i) => (\n <div className=\"as-showcaseItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal-reverse\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* ── Mobile layout ───────────────────────────────── */}\n <div className={isGrid ? \"as-mobile-grid\" : \"as-mobile\"}>\n {!isGrid && featured && (\n <div className=\"as-mobileFeatured\">\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={featured.thumbnail ?? \"\"}\n thumbnailAlt={featured.thumbnailAlt}\n hideThumbnail={!featured.thumbnail}\n title={featured.title}\n summary={featured.summary ?? \"\"}\n tags={(featured.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n )}\n {!isGrid && (\n <div className=\"as-mobileList\">\n {articles.map((article, i) => (\n <div className=\"as-mobileListItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout={isShowcase ? \"horizontal-reverse\" : \"horizontal\"}\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!isShowcase || !article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n )}\n {isGrid && (\n <div className=\"as-mobileScroll\">\n {articles.map((article, i) => (\n <div className=\"as-mobileScrollItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary={article.summary ?? \"\"}\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default ArticleSection;\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { CoralBannerProps, CoralBannerSlide } from \"./CoralBanner.types\";\nimport { Button } from \"../../components/Button\";\nimport \"./CoralBanner.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ── */\n\nconst DEFAULT_SLIDES: CoralBannerSlide[] = [\n {\n title: \"Section title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n primaryButton: { label: \"Get started\", href: \"#\" },\n },\n];\n\n/**\n * Real deriv.com copy, exported for consumers who want to reproduce the\n * exact reference banner (deriv.com homepage / deriv.com/markets/forex footer promo).\n */\nexport const CORAL_BANNER_DERIV_SLIDES: CoralBannerSlide[] = [\n {\n id: \"ai-insights\",\n title: \"Analyse markets with AI-powered insights\",\n primaryButton: { label: \"Explore TradersView\", href: \"#\" },\n },\n {\n id: \"join-traders\",\n title: \"Join 3M+\\nglobal traders\",\n description:\n \"Open an account in minutes and start trading the world's markets — forex, stocks, indices, and more.\",\n primaryButton: { label: \"Trade now\", href: \"#\" },\n },\n];\n\n/* ── Arrow icons — exact paths from the reference slider ────────── */\n\nconst LeftArrowIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M3.31066 8.75001L9.03033 14.4697L7.96967 15.5303L0.439339 8.00001L7.96967 0.469676L9.03033 1.53034L3.31066 7.25001L15.5 7.25L15.5 8.75L3.31066 8.75001Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst RightArrowIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M12.6893 7.25L6.96967 1.53033L8.03033 0.469666L15.5607 8L8.03033 15.5303L6.96967 14.4697L12.6893 8.75H0.5V7.25H12.6893Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/* ── Helpers ──────────────────────────────────────────────────── */\n\n/** Splits on \"\\n\" so a title can force a manual line break (e.g. \"Join 3M+\\nglobal traders\") */\nconst renderTitleLines = (title: string) => {\n const lines = title.split(\"\\n\");\n return lines.map((line, i) => (\n <span key={i}>\n {line}\n {i < lines.length - 1 && <br />}\n </span>\n ));\n};\n\nconst ButtonBlock = ({\n primaryButton,\n secondaryButton,\n}: Pick<CoralBannerSlide, \"primaryButton\" | \"secondaryButton\">) => {\n if (!primaryButton && !secondaryButton) return null;\n return (\n <div className=\"crb__buttons\">\n {primaryButton &&\n (primaryButton.href ? (\n <a href={primaryButton.href}>\n <Button\n colorScheme=\"black\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"black\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n ))}\n {secondaryButton &&\n (secondaryButton.href ? (\n <a href={secondaryButton.href}>\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n ))}\n </div>\n );\n};\n\nconst SlideContent = ({ slide }: { slide: CoralBannerSlide }) => (\n <div className=\"crb__grid\">\n <div className=\"crb__content\">\n <h3 className=\"crb__title\">{renderTitleLines(slide.title)}</h3>\n {slide.description && <p className=\"crb__description\">{slide.description}</p>}\n <ButtonBlock\n primaryButton={slide.primaryButton}\n secondaryButton={slide.secondaryButton}\n />\n </div>\n {/* Reserved right-hand column — matches the reference grid (2.15fr / 1fr); empty by default */}\n <div className=\"crb__spacer\" aria-hidden=\"true\" />\n </div>\n);\n\n/* ── CoralBanner ──────────────────────────────────────────────── */\n\nexport const CoralBanner = ({\n variant = \"static\",\n slides,\n autoplay = true,\n autoplayDelay = 2000,\n transitionDuration = 330,\n infinite = true,\n showArrows = true,\n showDots = true,\n className,\n ...props\n}: CoralBannerProps) => {\n const resolvedSlides = slides && slides.length > 0 ? slides : DEFAULT_SLIDES;\n const count = resolvedSlides.length;\n const isCarousel = variant === \"carousel\" && count > 1;\n\n const [activeIndex, setActiveIndex] = useState(0);\n const autoplayTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dragState = useRef<{ startX: number } | null>(null);\n\n const goTo = useCallback(\n (index: number) => {\n if (count <= 1) return;\n const next = infinite\n ? ((index % count) + count) % count\n : Math.max(0, Math.min(index, count - 1));\n setActiveIndex(next);\n },\n [count, infinite],\n );\n\n const goNext = useCallback(() => goTo(activeIndex + 1), [activeIndex, goTo]);\n const goPrev = useCallback(() => goTo(activeIndex - 1), [activeIndex, goTo]);\n\n const resetAutoplay = () => {\n if (autoplayTimer.current) clearTimeout(autoplayTimer.current);\n };\n\n /* Auto-advance — mirrors the reference `data-autoplay=\"true\" data-delay=\"2000\"`.\n * Resets on manual navigation (arrow / dot / swipe) via resetAutoplay(). */\n useEffect(() => {\n if (!isCarousel || !autoplay) return;\n autoplayTimer.current = setTimeout(() => {\n goTo(activeIndex + 1);\n }, autoplayDelay);\n return () => resetAutoplay();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isCarousel, autoplay, autoplayDelay, activeIndex]);\n\n /* Swipe — reference slider ships with `data-disable-swipe=\"false\"` */\n const handlePointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!isCarousel) return;\n dragState.current = { startX: e.clientX };\n };\n const handlePointerUp = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!isCarousel || !dragState.current) return;\n const delta = e.clientX - dragState.current.startX;\n dragState.current = null;\n const SWIPE_THRESHOLD = 40;\n if (delta > SWIPE_THRESHOLD) {\n resetAutoplay();\n goPrev();\n } else if (delta < -SWIPE_THRESHOLD) {\n resetAutoplay();\n goNext();\n }\n };\n\n const rootClass = [\n \"crb\",\n isCarousel ? \"crb--carousel\" : \"crb--static\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n /* ── Static ── */\n if (!isCarousel) {\n return (\n <section className={rootClass} {...props}>\n <div className=\"crb__inner\">\n <div className=\"crb__stage\">\n <SlideContent slide={resolvedSlides[0]} />\n </div>\n </div>\n </section>\n );\n }\n\n /* ── Carousel ──\n * `.crb__stage` carries the vertical padding and is the positioning\n * context for the dots/arrows (zero horizontal padding of its own —\n * `.crb__inner` owns that), so `left: 0` / `right: 0` line up exactly\n * with the text column edges, matching the reference banner. */\n return (\n <section className={rootClass} {...props}>\n <div className=\"crb__inner\">\n <div className=\"crb__stage\">\n <div\n className=\"crb__viewport\"\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n >\n <div\n className=\"crb__track\"\n style={{\n transform: `translateX(-${activeIndex * 100}%)`,\n transitionDuration: `${transitionDuration}ms`,\n }}\n >\n {resolvedSlides.map((slide, i) => (\n <div\n key={slide.id ?? i}\n className=\"crb__slide\"\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${i + 1} of ${count}`}\n aria-hidden={i !== activeIndex}\n >\n <SlideContent slide={slide} />\n </div>\n ))}\n </div>\n </div>\n\n {showDots && (\n <div className=\"crb__dots\" role=\"tablist\" aria-label=\"Banner slide navigation\">\n {resolvedSlides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === activeIndex}\n aria-label={`Go to slide ${i + 1} of ${count}`}\n className={[\n \"crb__dot\",\n i === activeIndex ? \"crb__dot--active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => {\n resetAutoplay();\n goTo(i);\n }}\n />\n ))}\n </div>\n )}\n\n {showArrows && (\n <div className=\"crb__arrows\">\n <button\n type=\"button\"\n className=\"crb__arrow crb__arrow--prev\"\n aria-label=\"Previous slide\"\n onClick={() => {\n resetAutoplay();\n goPrev();\n }}\n >\n <LeftArrowIcon />\n </button>\n <button\n type=\"button\"\n className=\"crb__arrow crb__arrow--next\"\n aria-label=\"Next slide\"\n onClick={() => {\n resetAutoplay();\n goNext();\n }}\n >\n <RightArrowIcon />\n </button>\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default CoralBanner;\n","import type { CSSProperties } from \"react\";\nimport type { AwardItem, FeatureAwardsProps } from \"./FeatureAwards.types\";\nimport leafLeft from \"../../assets/award-leaf-left.png\";\nimport leafRight from \"../../assets/award-leaf-right.png\";\nimport \"./FeatureAwards.css\";\n\n/* ── Default copy ─────────────────────────────────────────────\n * Every string below is only a starting point — `title` and each\n * award's `title`/`subtitle` are plain props, so an AI agent or\n * developer can replace any of this copy without touching this\n * file. See `schema.ts` / `fingerprint.json` for the machine-\n * readable content contract consumed by AI editing tools.\n */\nexport const FEATURE_AWARDS_TEXT_CONTENT = {\n title: \"Our awards\",\n};\n\nexport const DEFAULT_AWARDS: AwardItem[] = [\n { title: \"Best Trade Execution Award (MEA)\", subtitle: \"Ultimate Fintech 2026\" },\n { title: \"Best Trading Experience - Global\", subtitle: \"UF Awards 2025\" },\n { title: \"Best CFD Broker - LATAM\", subtitle: \"UF Awards 2025\" },\n { title: \"Most Innovative Broker - MEA\", subtitle: \"UF Awards 2025\" },\n { title: \"Most Transparent Broker - Global\", subtitle: \"Global Forex Awards 2025\" },\n { title: \"Best Broker - Africa\", subtitle: \"Global Forex Awards 2025\" },\n { title: \"Best Trading Platform - MENA\", subtitle: \"Global Forex Awards 2025\" },\n { title: \"Most Innovative Online Trading Platform\", subtitle: \"Forex Expo Dubai 2025\" },\n { title: \"Chief Risk & Compliance Officer of the Year\", subtitle: \"Forex Expo Dubai 2025\" },\n { title: \"Best Broker - APAC\", subtitle: \"UF Awards 2025\" },\n { title: \"Best Trading Conditions - Global\", subtitle: \"Finance Magnates 2025\" },\n { title: \"Most Trusted Broker - Middle East\", subtitle: \"Finance Magnates 2025\" },\n { title: \"Affiliate Program of the Year\", subtitle: \"Forex Expo Dubai 2024\" },\n { title: \"Best Customer Service - Global\", subtitle: \"Global Forex Awards 2024\" },\n { title: \"Most Trusted Broker - Africa\", subtitle: \"Finance Magnates 2024\" },\n { title: \"Best LATAM Region Broker\", subtitle: \"ADVFN Awards 2024\" },\n { title: \"Broker of the Year - Global\", subtitle: \"Finance Magnates 2024\" },\n];\n\n/* ── Decorative laurel branch ─────────────────────────────────\n * Purely visual bracket flanking each award's text. Two distinct\n * source images (already mirror images of each other) are used\n * rather than a single icon flipped with CSS, matching the\n * hand-drawn leaf artwork provided for this component.\n */\nconst LaurelIcon = ({ side }: { side: \"left\" | \"right\" }) => (\n <img\n className={`fa__leaf fa__leaf--${side}`}\n src={side === \"left\" ? leafLeft : leafRight}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n draggable={false}\n />\n);\n\n/* ── Single award badge — icon / title+subtitle / icon ────────── */\nconst AwardBadge = ({ award }: { award: AwardItem }) => (\n <div className=\"fa__item\" role=\"listitem\">\n <LaurelIcon side=\"left\" />\n <div className=\"fa__item-text\">\n <p className=\"fa__item-title\">{award.title}</p>\n <p className=\"fa__item-subtitle\">{award.subtitle}</p>\n </div>\n <LaurelIcon side=\"right\" />\n </div>\n);\n\n/* ── FeatureAwards ─────────────────────────────────────────────\n * Single variant. Desktop/tablet (≥768px): a centered, wrapping\n * row of award badges — the final, partially-filled row stays\n * centered rather than left-aligned.\n *\n * Mobile (<768px): the same badges laid out in a single horizontal\n * row that always auto-scrolls continuously (seamless CSS-looped\n * marquee — no on/off variant). The list is duplicated once so the\n * loop never shows a seam; the duplicate copy is `aria-hidden` so\n * screen readers only announce each award once. Hovering/focusing\n * pauses the scroll, and `prefers-reduced-motion` disables the\n * animation in favor of a manually swipeable strip.\n *\n * `autoScrollDuration` is exposed so the loop speed can be tuned\n * later without touching the component.\n */\nexport const FeatureAwards = ({\n title = FEATURE_AWARDS_TEXT_CONTENT.title,\n awards = DEFAULT_AWARDS,\n autoScrollDuration = 32,\n className,\n ...props\n}: FeatureAwardsProps) => {\n if (!awards || awards.length === 0) return null;\n\n const trackStyle = {\n \"--fa-duration\": `${autoScrollDuration}s`,\n } as CSSProperties;\n\n return (\n <section\n className={[\"fa\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"fa__inner\">\n {title && <h2 className=\"fa__title\">{title}</h2>}\n\n {/* ── Tablet / desktop — centered wrapping grid ── */}\n <div className=\"fa__grid\" role=\"list\">\n {awards.map((award, i) => (\n <AwardBadge key={`g-${i}`} award={award} />\n ))}\n </div>\n\n {/* ── Mobile — horizontal auto-scroll marquee ── */}\n <div className=\"fa__scroller\">\n <div className=\"fa__track fa__track--auto\" style={trackStyle}>\n <div className=\"fa__track-group\" role=\"list\">\n {awards.map((award, i) => (\n <AwardBadge key={`m-${i}`} award={award} />\n ))}\n </div>\n\n {/* Duplicate copy powers the seamless loop; hidden from AT */}\n <div\n className=\"fa__track-group\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\n {awards.map((award, i) => (\n <AwardBadge key={`m-dup-${i}`} award={award} />\n ))}\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureAwards;\n","import type { FeatureBlogPost, FeatureBlogProps } from \"./FeatureBlog.types\";\nimport { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport \"./FeatureBlog.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\n/* ── Default copy ─────────────────────────────────────────────\n * Starting-point content only — every string is a plain prop, so\n * an AI agent or developer can fully replace it. See `schema.ts` /\n * `fingerprint.json` for the machine-readable content contract.\n */\nexport const FEATURE_BLOG_TEXT_CONTENT = {\n title: \"Deriv press releases\",\n linkText: \"See all press releases\",\n};\n\n/* ── Single post card ──────────────────────────────────────────\n * Built on top of the shared `Card` (variant=\"thumbnail\", type=\n * \"article\", layout=\"vertical\") — image on top, title + summary\n * below, date/category tags in the meta row. Wrapped in an anchor\n * when `href` is supplied so the whole card is clickable.\n */\nconst PostCard = ({ post, index }: { post: FeatureBlogPost; index: number }) => {\n const tags = [post.date, post.category]\n .filter((value): value is string => Boolean(value))\n .map((label) => ({ label }));\n\n const card = (\n <Card\n hideAvatar\n layout=\"vertical\"\n showCopyLink={false}\n summary={post.summary}\n tags={tags}\n thumbnail={post.thumbnail}\n thumbnailAlt={post.thumbnailAlt}\n title={post.title}\n type=\"article\"\n variant=\"thumbnail\"\n />\n );\n\n if (post.href) {\n return (\n <a\n className=\"fb-cardLink\"\n href={post.href}\n key={`${post.title}-${index}`}\n rel={externalLinkRel(post.href)}\n >\n {card}\n </a>\n );\n }\n\n if (post.onClick) {\n return (\n <button\n className=\"fb-cardLink fb-cardButton\"\n key={`${post.title}-${index}`}\n onClick={post.onClick}\n type=\"button\"\n >\n {card}\n </button>\n );\n }\n\n return <div key={`${post.title}-${index}`}>{card}</div>;\n};\n\n/* ── FeatureBlog ───────────────────────────────────────────────\n * Centred H2 heading above a responsive grid of press-release /\n * blog-post cards (1 column mobile, 2 tablet, 3 desktop), with an\n * optional centred \"See all\" link below the grid.\n *\n * Modeled after the \"Deriv press releases\" section on\n * deriv.com/newsroom.\n */\nexport const FeatureBlog = ({\n title = FEATURE_BLOG_TEXT_CONTENT.title,\n posts,\n showLink = true,\n linkText = FEATURE_BLOG_TEXT_CONTENT.linkText,\n linkHref,\n onLinkClick,\n className,\n ...props\n}: FeatureBlogProps) => {\n if (!posts || posts.length === 0) return null;\n\n return (\n <section className={[\"fb-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"fb-container\">\n {title && <h2 className=\"fb-title\">{title}</h2>}\n\n <div className=\"fb-grid\">\n {posts.map((post, index) => (\n <PostCard index={index} key={`${post.title}-${index}`} post={post} />\n ))}\n </div>\n\n {showLink && (\n <div className=\"fb-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={linkHref}\n label={linkText}\n rel={externalLinkRel(linkHref)}\n onClick={onLinkClick}\n />\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default FeatureBlog;\n","import { useMemo, useState, type ChangeEvent } from \"react\";\nimport type { FeatureBlogCategoryPost, FeatureBlogCategoriesProps } from \"./FeatureBlogCategories.types\";\nimport { Card } from \"../../components/Card\";\nimport { SearchField } from \"../../components/SearchField\";\nimport { Tabs } from \"../../components/Tabs\";\nimport \"./FeatureBlogCategories.css\";\n\nconst isExternalUrl = (href: string | undefined) => Boolean(href && /^https?:\\/\\//i.test(href));\n\n/* ── Default copy ─────────────────────────────────────────────\n * Starting-point content only — every string is a plain prop, so\n * an AI agent, CMS, or developer can fully replace it. See\n * `schema.ts` / `fingerprint.json` for the machine-readable\n * content contract.\n */\nexport const FEATURE_BLOG_CATEGORIES_TEXT_CONTENT = {\n title: \"Deriv press releases\",\n allCategoryId: \"all\",\n allCategoryLabel: \"View all\",\n searchPlaceholder: \"Search\",\n emptyStateText: \"Sorry, we couldn't find any results matching.\",\n};\n\n/* ── Single post card ──────────────────────────────────────────\n * Built on top of the shared `Card` (variant=\"thumbnail\", type=\n * \"article\", layout=\"vertical\"). Internal hrefs (relative paths)\n * navigate as a normal same-tab inner-page link; absolute\n * `http(s)://` hrefs are treated as external and always open in a\n * new tab.\n */\nconst PostCard = ({\n post,\n categoryLabel,\n}: {\n post: FeatureBlogCategoryPost;\n categoryLabel?: string;\n}) => {\n const tags = [post.date, categoryLabel]\n .filter((value): value is string => Boolean(value))\n .map((label) => ({ label }));\n\n const card = (\n <Card\n hideAvatar\n layout=\"vertical\"\n showCopyLink={false}\n summary={post.summary}\n tags={tags}\n thumbnail={post.thumbnail}\n thumbnailAlt={post.thumbnailAlt}\n title={post.title}\n type=\"article\"\n variant=\"thumbnail\"\n />\n );\n\n if (post.href) {\n const external = isExternalUrl(post.href);\n return (\n <a\n className=\"fbc-cardLink\"\n href={post.href}\n rel={external ? \"noopener noreferrer\" : undefined}\n target={external ? \"_blank\" : undefined}\n >\n {card}\n </a>\n );\n }\n\n if (post.onClick) {\n return (\n <button className=\"fbc-cardLink fbc-cardButton\" onClick={post.onClick} type=\"button\">\n {card}\n </button>\n );\n }\n\n return <div>{card}</div>;\n};\n\n/* ── FeatureBlogCategories ────────────────────────────────────\n * Centred H2 heading, a search field, and a row of category tabs\n * above a responsive grid of post cards (1 column mobile, 2\n * tablet, 3 desktop). Tabs and posts are CMS-managed data — the\n * \"all\" tab is always prepended automatically. Filtering by tab\n * and search query happens client-side.\n *\n * Modeled after deriv.com/newsroom/press-releases and\n * deriv.com/newsroom/deriv-in-the-news.\n */\nexport const FeatureBlogCategories = ({\n title = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.title,\n categories,\n allCategoryId = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.allCategoryId,\n allCategoryLabel = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.allCategoryLabel,\n activeCategoryId,\n defaultActiveCategoryId,\n onCategoryChange,\n posts,\n searchPlaceholder = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.searchPlaceholder,\n searchAriaLabel,\n onSearchChange,\n emptyStateText = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.emptyStateText,\n className,\n ...props\n}: FeatureBlogCategoriesProps) => {\n const [search, setSearch] = useState(\"\");\n const [internalActiveId, setInternalActiveId] = useState(defaultActiveCategoryId ?? allCategoryId);\n\n const isControlled = activeCategoryId !== undefined;\n const activeId = isControlled ? activeCategoryId : internalActiveId;\n\n const tabs = useMemo(\n () => [{ id: allCategoryId, label: allCategoryLabel }, ...categories],\n [allCategoryId, allCategoryLabel, categories],\n );\n\n const categoryLabelById = useMemo(() => {\n const map = new Map<string, string>();\n categories.forEach((category) => map.set(category.id, category.label));\n return map;\n }, [categories]);\n\n const filteredPosts = useMemo(() => {\n const query = search.trim().toLowerCase();\n return posts.filter((post) => {\n const matchesCategory = activeId === allCategoryId || post.category === activeId;\n if (!matchesCategory) return false;\n if (!query) return true;\n return (\n post.title.toLowerCase().includes(query) ||\n post.summary.toLowerCase().includes(query)\n );\n });\n }, [posts, activeId, allCategoryId, search]);\n\n const handleTabChange = (id: string) => {\n if (!isControlled) setInternalActiveId(id);\n onCategoryChange?.(id);\n };\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n onSearchChange?.(e.target.value);\n };\n\n const handleSearchClear = () => {\n setSearch(\"\");\n onSearchChange?.(\"\");\n };\n\n return (\n <section className={[\"fbc-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"fbc-container\">\n {title && <h2 className=\"fbc-title\">{title}</h2>}\n\n <div className=\"fbc-searchWrap\">\n <SearchField\n aria-label={searchAriaLabel ?? searchPlaceholder}\n onChange={handleSearchChange}\n onClear={handleSearchClear}\n placeholder={searchPlaceholder}\n value={search}\n variant=\"outline\"\n />\n </div>\n\n <div className=\"fbc-tabsWrap\">\n <Tabs activeId={activeId ?? allCategoryId} items={tabs} onChange={handleTabChange} />\n </div>\n\n {filteredPosts.length > 0 ? (\n <div className=\"fbc-grid\">\n {filteredPosts.map((post, index) => (\n <PostCard\n categoryLabel={post.categoryLabel ?? categoryLabelById.get(post.category)}\n key={`${post.title}-${index}`}\n post={post}\n />\n ))}\n </div>\n ) : (\n <p className=\"fbc-emptyState\">{emptyStateText}</p>\n )}\n </div>\n </section>\n );\n};\n\nexport default FeatureBlogCategories;\n","import type { HelpCentreCategoriesProps, HelpCentreCategoryItem } from \"./HelpCentreCategories.types\";\nimport \"./HelpCentreCategories.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst CategoryTileContent = ({ category }: { category: HelpCentreCategoryItem }) => (\n <>\n {category.icon && (\n <span className=\"hcc-tile-icon\">\n {typeof category.icon === \"string\" ? (\n <img\n alt={category.iconAlt ?? \"\"}\n className=\"hcc-tile-iconImage\"\n decoding=\"async\"\n height={48}\n loading=\"lazy\"\n src={category.icon}\n width={48}\n />\n ) : (\n category.icon\n )}\n </span>\n )}\n\n <span className=\"hcc-tile-title\">{category.title}</span>\n </>\n);\n\nconst CategoryTile = ({ category }: { category: HelpCentreCategoryItem }) => {\n if (category.href) {\n return (\n <a\n className=\"hcc-tile\"\n href={category.href}\n onClick={category.onClick}\n rel={externalLinkRel(category.href)}\n >\n <CategoryTileContent category={category} />\n </a>\n );\n }\n\n return (\n <button className=\"hcc-tile\" onClick={category.onClick} type=\"button\">\n <CategoryTileContent category={category} />\n </button>\n );\n};\n\n/**\n * Caps the grid at 3 columns (desktop). With fewer categories than that, the\n * grid uses exactly that many columns instead of stretching/leaving a sparse\n * trailing row — with 3 or more it always wraps to a 3-column desktop grid\n * (2-column tablet, 1-column mobile), no matter how many extra rows that adds.\n */\nconst getColumnCount = (categoryCount: number) => Math.max(1, Math.min(categoryCount, 3));\n\nexport const HelpCentreCategories = ({\n sectionTitle,\n sectionDescription,\n categories,\n}: HelpCentreCategoriesProps) => {\n const columnCount = getColumnCount(categories.length);\n\n return (\n <section className=\"hcc-section\">\n <div className=\"hcc-container\">\n {(sectionTitle || sectionDescription) && (\n <div className=\"hcc-header\">\n {sectionTitle && <h2 className=\"hcc-sectionTitle\">{sectionTitle}</h2>}\n\n {sectionDescription && (\n <p className=\"hcc-sectionDescription\">{sectionDescription}</p>\n )}\n </div>\n )}\n\n <div className={`hcc-grid hcc-grid--${columnCount}`} role=\"list\">\n {categories.map((category, index) => (\n <div className=\"hcc-gridItem\" key={category.id ?? `${category.title}-${index}`} role=\"listitem\">\n <CategoryTile category={category} />\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import { useMemo, useState, type ChangeEvent } from \"react\";\nimport type { HelpCentreSubCategoriesProps, HelpCentreSubCategoryItem } from \"./HelpCentreSubCategories.types\";\nimport { SearchField } from \"../../components/SearchField\";\nimport \"./HelpCentreSubCategories.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst QuestionCard = ({ item }: { item: HelpCentreSubCategoryItem }) => {\n if (item.href) {\n return (\n <a className=\"hcsc-card\" href={item.href} onClick={item.onClick} rel={externalLinkRel(item.href)}>\n <span className=\"hcsc-card-text\">{item.question}</span>\n </a>\n );\n }\n\n return (\n <button className=\"hcsc-card\" onClick={item.onClick} type=\"button\">\n <span className=\"hcsc-card-text\">{item.question}</span>\n </button>\n );\n};\n\nexport const HelpCentreSubCategories = ({\n title,\n searchPlaceholder = \"Search\",\n searchAriaLabel,\n items,\n noResultsText = 'No results found for \"{query}\"',\n onSearchChange,\n}: HelpCentreSubCategoriesProps) => {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return items;\n return items.filter((item) => item.question.toLowerCase().includes(q));\n }, [items, search]);\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n onSearchChange?.(e.target.value);\n };\n\n const handleClear = () => {\n setSearch(\"\");\n onSearchChange?.(\"\");\n };\n\n return (\n <section className=\"hcsc-section\">\n <div className=\"hcsc-container\">\n <h1 className=\"hcsc-title\">{title}</h1>\n\n <div className=\"hcsc-searchWrap\">\n <SearchField\n aria-label={searchAriaLabel ?? searchPlaceholder}\n onChange={handleSearchChange}\n onClear={handleClear}\n placeholder={searchPlaceholder}\n value={search}\n variant=\"outline\"\n />\n </div>\n\n {filtered.length > 0 ? (\n <div className=\"hcsc-grid\" role=\"list\">\n {filtered.map((item, index) => (\n <div className=\"hcsc-gridItem\" key={item.id ?? `${item.question}-${index}`} role=\"listitem\">\n <QuestionCard item={item} />\n </div>\n ))}\n </div>\n ) : (\n <p className=\"hcsc-noResults\">{noResultsText.replace(\"{query}\", search)}</p>\n )}\n </div>\n </section>\n );\n};\n\nexport default HelpCentreSubCategories;\n","import { useMemo, useState, type ChangeEvent } from \"react\";\nimport type { HelpCenterContentBlock, HelpCenterPageProps, HelpCenterQuestionItem } from \"./HelpCenterPage.types\";\nimport { SearchField } from \"../../components/SearchField\";\nimport { BottomSheet } from \"../../components/BottomSheet\";\nimport \"./HelpCenterPage.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst ChevronDownIcon = () => (\n <svg aria-hidden=\"true\" fill=\"none\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.5\" />\n </svg>\n);\n\nconst renderBlock = (block: HelpCenterContentBlock, index: number) => {\n if (block.type === \"heading\") {\n const HeadingTag = block.level === 3 ? \"h3\" : \"h2\";\n return (\n <HeadingTag className=\"hcp-blockHeading\" key={index}>\n {block.text}\n </HeadingTag>\n );\n }\n\n if (block.type === \"list\") {\n const ListTag = block.ordered ? \"ol\" : \"ul\";\n return (\n <ListTag className=\"hcp-blockList\" key={index}>\n {(block.items ?? []).map((item, i) => (\n <li className=\"hcp-blockListItem\" key={i}>\n {item}\n </li>\n ))}\n </ListTag>\n );\n }\n\n return (\n <p className=\"hcp-blockParagraph\" key={index}>\n {block.text}\n </p>\n );\n};\n\nconst QuestionRow = ({\n item,\n isActive,\n onSelect,\n}: {\n item: HelpCenterQuestionItem;\n isActive: boolean;\n onSelect: (item: HelpCenterQuestionItem) => void;\n}) => {\n const rowClass = [\"hcp-row\", isActive ? \"hcp-row--active\" : \"\"].filter(Boolean).join(\" \");\n\n if (item.href) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={rowClass}\n href={item.href}\n onClick={() => {\n item.onClick?.();\n onSelect(item);\n }}\n rel={externalLinkRel(item.href)}\n >\n <span className=\"hcp-rowText\">{item.question}</span>\n </a>\n );\n }\n\n return (\n <button\n aria-current={isActive ? \"page\" : undefined}\n className={rowClass}\n onClick={() => {\n item.onClick?.();\n onSelect(item);\n }}\n type=\"button\"\n >\n <span className=\"hcp-rowText\">{item.question}</span>\n </button>\n );\n};\n\nexport const HelpCenterPage = ({\n categoryTitle,\n questions,\n activeQuestionId,\n defaultActiveQuestionId,\n onQuestionSelect,\n contentTitle,\n content,\n searchPlaceholder = \"Search\",\n searchAriaLabel,\n onSearchChange,\n searchNoResultsText = 'No results found for \"{query}\"',\n articlesSheetTitle = \"Articles in this section\",\n className,\n}: HelpCenterPageProps) => {\n const [search, setSearch] = useState(\"\");\n const [internalActiveId, setInternalActiveId] = useState(defaultActiveQuestionId ?? questions[0]?.id);\n const [sheetOpen, setSheetOpen] = useState(false);\n\n const isControlled = activeQuestionId !== undefined;\n const activeId = isControlled ? activeQuestionId : internalActiveId;\n const activeItem = questions.find((item) => item.id === activeId);\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return questions;\n return questions.filter((item) => item.question.toLowerCase().includes(q));\n }, [questions, search]);\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n onSearchChange?.(e.target.value);\n };\n\n const handleClear = () => {\n setSearch(\"\");\n onSearchChange?.(\"\");\n };\n\n const handleSelect = (item: HelpCenterQuestionItem) => {\n if (!isControlled) setInternalActiveId(item.id);\n onQuestionSelect?.(item.id);\n setSheetOpen(false);\n };\n\n // Per-question `content` (self-contained/SPA mode) overrides the page-level\n // `contentTitle`/`content` props; otherwise those props are the source of\n // truth (real multi-page apps update them whenever `onQuestionSelect` fires).\n const resolvedTitle = activeItem?.content ? activeItem.contentTitle ?? contentTitle : contentTitle;\n const resolvedContent = activeItem?.content ?? content;\n\n const rootClass = [\"hcp-section\", className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass}>\n <div className=\"hcp-container\">\n <div className=\"hcp-searchWrap\">\n <SearchField\n aria-label={searchAriaLabel ?? searchPlaceholder}\n onChange={handleSearchChange}\n onClear={handleClear}\n placeholder={searchPlaceholder}\n value={search}\n variant=\"outline\"\n />\n </div>\n\n <div className=\"hcp-body\">\n {/* ── Sidebar question table (tablet/desktop) ─────── */}\n <aside className=\"hcp-sidebar\">\n <div className=\"hcp-sidebarCard\">\n <h2 className=\"hcp-sidebarTitle\">{categoryTitle}</h2>\n\n {filtered.length > 0 ? (\n <div className=\"hcp-list\" role=\"list\">\n {filtered.map((item) => (\n <div className=\"hcp-listItem\" key={item.id} role=\"listitem\">\n <QuestionRow isActive={item.id === activeId} item={item} onSelect={handleSelect} />\n </div>\n ))}\n </div>\n ) : (\n <p className=\"hcp-noResults\">{searchNoResultsText.replace(\"{query}\", search)}</p>\n )}\n </div>\n </aside>\n\n {/* ── Category dropdown trigger (mobile) ──────────── */}\n <button\n aria-expanded={sheetOpen}\n className=\"hcp-mobileToggle\"\n onClick={() => setSheetOpen(true)}\n type=\"button\"\n >\n <span className=\"hcp-mobileToggleLabel\">{categoryTitle}</span>\n <span className=\"hcp-mobileToggleChevron\">\n <ChevronDownIcon />\n </span>\n </button>\n\n {/* ── Main content column (CMS answer body) ───────── */}\n <div className=\"hcp-content\">\n <h1 className=\"hcp-contentTitle\">{resolvedTitle}</h1>\n <div className=\"hcp-contentBody\">{resolvedContent.map(renderBlock)}</div>\n </div>\n </div>\n </div>\n\n {/* ── \"Articles in this section\" sheet (mobile) ───────────── */}\n <BottomSheet onClose={() => setSheetOpen(false)} open={sheetOpen} title={articlesSheetTitle}>\n {filtered.length > 0 ? (\n <div className=\"hcp-sheetList\" role=\"list\">\n {filtered.map((item) => (\n <div className=\"hcp-sheetItem\" key={item.id} role=\"listitem\">\n <QuestionRow isActive={item.id === activeId} item={item} onSelect={handleSelect} />\n </div>\n ))}\n </div>\n ) : (\n <p className=\"hcp-noResults\">{searchNoResultsText.replace(\"{query}\", search)}</p>\n )}\n </BottomSheet>\n </section>\n );\n};\n\nexport default HelpCenterPage;\n","import { useEffect, useMemo, useState } from \"react\";\nimport type {\n FeatureBlogContentBlock,\n FeatureBlogPageProps,\n FeatureBlogSharePlatform,\n} from \"./FeatureBlogPage.types\";\nimport { Tag } from \"../../components/Tag\";\nimport { Steps } from \"../Steps\";\nimport shareLinkIcon from \"../../assets/share-link.png\";\nimport shareFacebookIcon from \"../../assets/share-facebook.png\";\nimport shareXIcon from \"../../assets/share-x.png\";\nimport shareTelegramIcon from \"../../assets/share-telegram.png\";\nimport shareLinkedInIcon from \"../../assets/share-linkedin.png\";\nimport \"./FeatureBlogPage.css\";\n\n/* ── Icons ─────────────────────────────────────────────────────\n * Share icons are bundled flat brand-mark artwork (matching the\n * reference site's monochrome icon row) rather than hand-drawn SVGs,\n * so they render pixel-for-pixel the same everywhere. The chevron and\n * \"copied\" checkmark are the only inline SVGs — small UI glyphs, not\n * brand marks, sized via the button they sit in and coloured via\n * `currentColor`.\n */\n\nconst ChevronDownIcon = () => (\n <svg aria-hidden=\"true\" fill=\"none\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.5\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg aria-hidden=\"true\" fill=\"none\" height=\"18\" viewBox=\"0 0 16 16\" width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.5 8.5l3 3 6-7\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.6\" />\n </svg>\n);\n\nconst SHARE_ICONS: Record<FeatureBlogSharePlatform, { src: string; alt: string }> = {\n facebook: { src: shareFacebookIcon, alt: \"Facebook\" },\n twitter: { src: shareXIcon, alt: \"X\" },\n linkedin: { src: shareLinkedInIcon, alt: \"LinkedIn\" },\n telegram: { src: shareTelegramIcon, alt: \"Telegram\" },\n};\n\nconst LABELS: Record<FeatureBlogSharePlatform, string> = {\n facebook: \"Share on Facebook\",\n twitter: \"Share on X\",\n linkedin: \"Share on LinkedIn\",\n telegram: \"Share on Telegram\",\n};\n\n/* ── Helpers ───────────────────────────────────────────────────── */\n\nconst slugify = (text: string): string =>\n text\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\nfunction shareHref(platform: FeatureBlogSharePlatform, url: string, text: string): string {\n const encodedUrl = encodeURIComponent(url);\n const encodedText = encodeURIComponent(text);\n switch (platform) {\n case \"facebook\":\n return `https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`;\n case \"twitter\":\n return `https://twitter.com/intent/tweet?url=${encodedUrl}&text=${encodedText}`;\n case \"linkedin\":\n return `https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`;\n case \"telegram\":\n return `https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`;\n }\n}\n\n/* ── Table of contents card ────────────────────────────────────── */\n\nconst TocCard = ({\n tocTitle,\n headings,\n activeId,\n defaultOpen,\n onNavigate,\n idSuffix,\n collapsible,\n}: {\n tocTitle: string;\n headings: { id: string; text: string }[];\n activeId: string | null;\n defaultOpen: boolean;\n onNavigate: (id: string) => void;\n idSuffix: string;\n /** Mobile renders a real disclosure (chevron toggle); desktop is always expanded, matching the reference site. */\n collapsible: boolean;\n}) => {\n const [open, setOpen] = useState(defaultOpen);\n const panelId = `fbp-toc-panel-${idSuffix}`;\n const isOpen = collapsible ? open : true;\n\n const list = (\n <ol className=\"fbp-tocList\" id={panelId}>\n {headings.map((heading) => (\n <li className=\"fbp-tocItem\" key={heading.id}>\n <a\n aria-current={activeId === heading.id ? \"location\" : undefined}\n className={[\"fbp-tocLink\", activeId === heading.id ? \"fbp-tocLink--active\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n href={`#${heading.id}`}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(heading.id);\n }}\n >\n {heading.text}\n </a>\n </li>\n ))}\n </ol>\n );\n\n return (\n <div className=\"fbp-tocCard\">\n {collapsible ? (\n <button\n aria-controls={panelId}\n aria-expanded={isOpen}\n className=\"fbp-tocHeader fbp-tocHeader--button\"\n onClick={() => setOpen((prev) => !prev)}\n type=\"button\"\n >\n <span className=\"fbp-tocTitle\">{tocTitle}</span>\n <span className={[\"fbp-tocChevron\", isOpen ? \"fbp-tocChevron--open\" : \"\"].filter(Boolean).join(\" \")}>\n <ChevronDownIcon />\n </span>\n </button>\n ) : (\n <div className=\"fbp-tocHeader\">\n <span className=\"fbp-tocTitle\">{tocTitle}</span>\n </div>\n )}\n {isOpen && list}\n </div>\n );\n};\n\n/* ── Share row ─────────────────────────────────────────────────── */\n\nconst ShareRow = ({\n shareTitle,\n shareUrl,\n shareText,\n platforms,\n onShare,\n copiedLabel,\n}: {\n shareTitle: string;\n shareUrl: string;\n shareText: string;\n platforms: FeatureBlogSharePlatform[];\n onShare?: (platform: FeatureBlogSharePlatform | \"copy\") => void;\n copiedLabel: string;\n}) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n onShare?.(\"copy\");\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2000);\n }\n } catch {\n /* Clipboard access denied by the browser/user — fail silently. */\n }\n };\n\n return (\n <div className=\"fbp-shareCard\">\n <span className=\"fbp-shareTitle\">{shareTitle}</span>\n <div className=\"fbp-shareIcons\">\n <button\n aria-label={copied ? copiedLabel : \"Copy link\"}\n className=\"fbp-shareIcon\"\n onClick={handleCopy}\n type=\"button\"\n >\n {copied ? <CheckIcon /> : <img alt=\"\" className=\"fbp-shareIconImg\" src={shareLinkIcon} />}\n </button>\n {platforms.map((platform) => {\n const icon = SHARE_ICONS[platform];\n return (\n <a\n aria-label={LABELS[platform]}\n className=\"fbp-shareIcon\"\n href={shareHref(platform, shareUrl, shareText)}\n key={platform}\n onClick={() => onShare?.(platform)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <img alt=\"\" className=\"fbp-shareIconImg\" src={icon.src} />\n </a>\n );\n })}\n </div>\n </div>\n );\n};\n\n/* ── Content block renderer ───────────────────────────────────── */\n\nconst renderBlock = (block: FeatureBlogContentBlock, index: number, headingIds: Map<number, string>) => {\n if (block.type === \"heading\") {\n const level = block.level ?? 2;\n const HeadingTag = level === 3 ? \"h3\" : \"h2\";\n const headingClass = level === 3 ? \"fbp-blockHeading fbp-blockHeading--h3\" : \"fbp-blockHeading\";\n return (\n <HeadingTag className={headingClass} id={headingIds.get(index)} key={index}>\n {block.text}\n </HeadingTag>\n );\n }\n\n if (block.type === \"list\") {\n const ListTag = block.ordered ? \"ol\" : \"ul\";\n return (\n <ListTag className=\"fbp-blockList\" key={index}>\n {(block.items ?? []).map((item, i) => (\n <li className=\"fbp-blockListItem\" key={i}>\n {item}\n </li>\n ))}\n </ListTag>\n );\n }\n\n if (block.type === \"quote\") {\n return (\n <blockquote className=\"fbp-blockQuote\" key={index}>\n <p className=\"fbp-blockQuoteText\">{block.text}</p>\n {block.cite && <cite className=\"fbp-blockQuoteCite\">{block.cite}</cite>}\n </blockquote>\n );\n }\n\n if (block.type === \"image\") {\n return (\n <figure className=\"fbp-blockImageWrap\" key={index}>\n <img alt={block.imageAlt ?? \"\"} className=\"fbp-blockImage\" src={block.image} />\n {block.caption && <figcaption className=\"fbp-blockCaption\">{block.caption}</figcaption>}\n </figure>\n );\n }\n\n if (block.type === \"steps\") {\n return (\n <div className=\"fbp-blockSteps\" key={index}>\n <Steps embedded steps={block.steps ?? []} title={block.text ?? \"\"} titleId={headingIds.get(index)} />\n </div>\n );\n }\n\n return (\n <p className=\"fbp-blockParagraph\" key={index}>\n {block.text}\n </p>\n );\n};\n\n/* ── FeatureBlogPage ───────────────────────────────────────────\n * A full blog-article page: category tag, title, author/date meta,\n * hero image, and a rich-content body. A \"Contents\" (table of\n * contents) + \"Share article\" sidebar sits beside the\n * title/hero/content column and stays sticky while scrolling on\n * desktop. On mobile the sidebar collapses into an expandable\n * \"Contents\" card above the title and a horizontal share-icon row\n * below the hero image, so both stay reachable without a persistent\n * floating widget.\n *\n * Breadcrumb navigation is intentionally not part of this template —\n * it is composed separately above it by the consuming page.\n *\n * Modeled after deriv.com/newsroom/updates/deriv-derived-indices-on-tradingview.\n */\nexport const FeatureBlogPage = ({\n category,\n title,\n publishDate,\n author,\n heroImage,\n heroImageAlt,\n content,\n tocTitle = \"Contents\",\n tocDefaultOpen = true,\n hideToc = false,\n shareTitle = \"Share article\",\n shareUrl,\n shareText,\n sharePlatforms = [\"facebook\", \"twitter\", \"telegram\", \"linkedin\"],\n hideShare = false,\n onShare,\n copiedLabel = \"Copied!\",\n className,\n}: FeatureBlogPageProps) => {\n const headingIds = useMemo(() => {\n const seen = new Map<string, number>();\n const ids = new Map<number, string>();\n content.forEach((block, i) => {\n if (block.type !== \"heading\" && block.type !== \"steps\") return;\n const base = block.id ?? (slugify(block.text ?? \"\") || `section-${i}`);\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n ids.set(i, count === 0 ? base : `${base}-${count}`);\n });\n return ids;\n }, [content]);\n\n const headings = useMemo(\n () =>\n content\n .map((block, i) => ({ block, i }))\n .filter(\n ({ block }) =>\n block.type === \"steps\" || (block.type === \"heading\" && (block.level ?? 2) === 2),\n )\n .map(({ block, i }) => ({ id: headingIds.get(i) as string, text: block.text ?? \"\" })),\n [content, headingIds],\n );\n\n // No section is \"active\" until the reader actually scrolls into one —\n // matches the reference site, which shows a plain (non-highlighted)\n // list on first load.\n const [activeId, setActiveId] = useState<string | null>(null);\n\n useEffect(() => {\n if (typeof IntersectionObserver === \"undefined\" || headings.length === 0) return;\n\n const elements = headings\n .map((heading) => document.getElementById(heading.id))\n .filter((el): el is HTMLElement => el !== null);\n if (elements.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries.filter((entry) => entry.isIntersecting);\n if (visible.length === 0) return;\n const topMost = visible.reduce((a, b) =>\n a.boundingClientRect.top < b.boundingClientRect.top ? a : b,\n );\n setActiveId(topMost.target.id);\n },\n { rootMargin: \"-112px 0px -70% 0px\", threshold: 0 },\n );\n\n elements.forEach((el) => observer.observe(el));\n return () => observer.disconnect();\n }, [headings]);\n\n const handleNavigate = (id: string) => {\n setActiveId(id);\n const el = document.getElementById(id);\n if (!el) return;\n const prefersReducedMotion =\n typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n el.scrollIntoView({ behavior: prefersReducedMotion ? \"auto\" : \"smooth\", block: \"start\" });\n };\n\n const showToc = !hideToc && headings.length > 0;\n const showShare = !hideShare && Boolean(shareUrl);\n const resolvedShareText = shareText ?? title;\n\n return (\n <section className={[\"fbp-section\", className ?? \"\"].filter(Boolean).join(\" \")}>\n <div className=\"fbp-container\">\n {/* ── Mobile/tablet \"Contents\" card — sits above the title ── */}\n {showToc && (\n <div className=\"fbp-tocMobileWrap\">\n <TocCard\n activeId={activeId}\n collapsible\n defaultOpen={tocDefaultOpen}\n headings={headings}\n idSuffix=\"mobile\"\n onNavigate={handleNavigate}\n tocTitle={tocTitle}\n />\n </div>\n )}\n\n <div className=\"fbp-body\">\n <div className=\"fbp-main\">\n <header className=\"fbp-header\">\n {category && <Tag label={category} size=\"md\" variant=\"fill\" />}\n <h1 className=\"fbp-title\">{title}</h1>\n {(publishDate || author) && (\n <div className=\"fbp-meta\">\n {author && (\n <span className=\"fbp-metaAuthor\">\n {author.avatar && (\n <img\n alt={author.avatarAlt ?? \"\"}\n className=\"fbp-avatar\"\n src={author.avatar}\n />\n )}\n <span className=\"fbp-authorName\">{author.name}</span>\n </span>\n )}\n {publishDate && <span className=\"fbp-dateChip\">{publishDate}</span>}\n </div>\n )}\n </header>\n\n {heroImage && (\n <div className=\"fbp-heroImageWrap\">\n <img alt={heroImageAlt ?? \"\"} className=\"fbp-heroImage\" src={heroImage} />\n </div>\n )}\n\n <div className=\"fbp-content\">\n {content.map((block, index) => renderBlock(block, index, headingIds))}\n </div>\n\n {/* ── Mobile/tablet share row — at the end of the article body ── */}\n {showShare && (\n <div className=\"fbp-shareMobileWrap\">\n <ShareRow\n copiedLabel={copiedLabel}\n onShare={onShare}\n platforms={sharePlatforms}\n shareText={resolvedShareText}\n shareTitle={shareTitle}\n shareUrl={shareUrl as string}\n />\n </div>\n )}\n </div>\n\n {(showToc || showShare) && (\n <aside className=\"fbp-sidebar\">\n <div className=\"fbp-sidebarSticky\">\n {showToc && (\n <TocCard\n activeId={activeId}\n collapsible={false}\n defaultOpen={tocDefaultOpen}\n headings={headings}\n idSuffix=\"desktop\"\n onNavigate={handleNavigate}\n tocTitle={tocTitle}\n />\n )}\n {showShare && (\n <ShareRow\n copiedLabel={copiedLabel}\n onShare={onShare}\n platforms={sharePlatforms}\n shareText={resolvedShareText}\n shareTitle={shareTitle}\n shareUrl={shareUrl as string}\n />\n )}\n </div>\n </aside>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureBlogPage;\n","import { useRef } from \"react\";\nimport { motion, useScroll, useSpring, useTransform, useReducedMotion } from \"framer-motion\";\nimport type { ParallaxBannerCultureCard, ParallaxBannerProps } from \"./ParallaxBanner.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./ParallaxBanner.css\";\n\nexport const PARALLAX_BANNER_TEXT_CONTENT = {\n title: \"Our culture\",\n description:\n \"We combine human values with AI precision. Collaboration, integrity, and continuous learning guide every project.\",\n ctaLabel: \"Culture at Deriv\",\n};\n\nexport const DEFAULT_CULTURE_CARDS: ParallaxBannerCultureCard[] = [\n {\n title: \"Customer focus\",\n description:\n \"We obsess over customers, prioritising measurable user value and using AI to surface insights and tailor experiences, always keeping human judgment central.\",\n },\n {\n title: \"Integrity\",\n description:\n \"We act with candour and accountability. We make clear trade-offs, give honest feedback, and design our AI and data use with ethics and transparency to build trust.\",\n },\n {\n title: \"Teamwork\",\n description:\n \"We move together in cross-functional teams. We share credit, solve problems collaboratively, and welcome diverse perspectives to deliver better outcomes.\",\n },\n {\n title: \"Competence\",\n description:\n \"We hold high standards and keep learning. We pair deep expertise with pragmatic delivery from prototype to production, and we use AI thoughtfully to amplify judgment and scale impact.\",\n },\n];\n\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\n/* How far (in px) the photo travels as the banner crosses the viewport.\n * Kept small so the effect reads as a gentle depth cue, not a slide-in. */\nconst PARALLAX_PX = 36;\n\n/* Spring smoothing so the photo lags the scroll position slightly instead of\n * being mechanically locked to it — this is what gives the \"overscroll\"\n * softness seen on careers.deriv.com rather than a stiff 1:1 translate. */\nconst PARALLAX_SPRING = { stiffness: 90, damping: 26, restDelta: 0.001 } as const;\n\nexport const ParallaxBanner = ({\n variant = \"default\",\n title = PARALLAX_BANNER_TEXT_CONTENT.title,\n description = PARALLAX_BANNER_TEXT_CONTENT.description,\n ctaLabel = PARALLAX_BANNER_TEXT_CONTENT.ctaLabel,\n ctaHref,\n onCtaClick,\n imageUrl = PLACEHOLDER_IMAGE,\n imageAlt = \"\",\n cards = DEFAULT_CULTURE_CARDS,\n enableParallax = true,\n className,\n ...props\n}: ParallaxBannerProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const prefersReducedMotion = useReducedMotion();\n const parallaxActive = enableParallax && !prefersReducedMotion;\n const showCards = variant !== \"banner-only\" && cards.length > 0;\n\n /* Track scroll progress as the section crosses the viewport, exactly like\n * the entering/leaving overscroll parallax on careers.deriv.com. */\n const { scrollYProgress } = useScroll({\n target: sectionRef,\n offset: [\"start end\", \"end start\"],\n });\n const smoothProgress = useSpring(scrollYProgress, PARALLAX_SPRING);\n const parallaxY = useTransform(smoothProgress, [0, 1], [-PARALLAX_PX, PARALLAX_PX]);\n\n return (\n <section\n ref={sectionRef}\n className={[\n \"parallax-banner\",\n variant === \"banner-only\" ? \"parallax-banner--banner-only\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n <div className=\"parallax-banner__inner\">\n <div className=\"parallax-banner__card\">\n <div className=\"parallax-banner__content\">\n <h2 className=\"parallax-banner__title\">{title}</h2>\n\n {description && (\n <p className=\"parallax-banner__description\">{description}</p>\n )}\n\n {ctaLabel && (\n <div className=\"parallax-banner__actions\">\n <Link\n colorScheme=\"white\"\n label={ctaLabel}\n href={ctaHref}\n onClick={onCtaClick}\n showChevron\n className=\"parallax-banner__cta-link\"\n />\n </div>\n )}\n </div>\n\n {imageUrl && (\n <div className=\"parallax-banner__image-wrapper\">\n <motion.img\n src={imageUrl}\n alt={imageAlt}\n className=\"parallax-banner__image\"\n loading=\"lazy\"\n style={parallaxActive ? { y: parallaxY } : undefined}\n />\n </div>\n )}\n </div>\n\n {showCards && (\n <div className=\"parallax-banner__cards\" role=\"list\">\n {cards.map((card, index) => (\n <div\n className=\"parallax-banner__card-item\"\n role=\"listitem\"\n key={`${card.title}-${index}`}\n >\n <h3 className=\"parallax-banner__card-title\">{card.title}</h3>\n <p className=\"parallax-banner__card-description\">\n {card.description}\n </p>\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default ParallaxBanner;\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Button } from \"../../components/Button\";\nimport { TextField } from \"../../components/TextField\";\nimport { SearchField } from \"../../components/SearchField\";\nimport type {\n TradingCalculatorProps,\n TradingCalculatorResults,\n TradingSymbolSpec,\n} from \"./TradingCalculator.types\";\nimport \"./TradingCalculator.css\";\n\nexport const DEFAULT_SYMBOLS_ENDPOINT =\n \"https://deriv-static-pricingfeedv2.firebaseio.com/n8n/row/prod/dynamic_trading_specs.json\";\nexport const DEFAULT_EXCHANGE_RATE_WS_URL = \"wss://ws.derivws.com/websockets/v3?app_id=1089\";\n\nconst USD = \"USD\";\nconst RATES_CACHE_TTL_MS = 30_000;\n\n/* ── Formatting helpers ───────────────────────────────────────── */\n\nconst moneyFormatter = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n});\nconst integerFormatter = new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 0 });\n\nconst formatMoney = (value: number | null): string =>\n value === null || Number.isNaN(value) ? \"N/A\" : `$ ${moneyFormatter.format(value)}`;\n\nconst formatInteger = (value: number): string =>\n Number.isNaN(value) ? \"N/A\" : `$ ${integerFormatter.format(Math.round(value))}`;\n\n/* ── Calculation ──────────────────────────────────────────────── */\n\nfunction computeResults(\n symbol: TradingSymbolSpec,\n volumeInLots: number,\n assetPrice: number,\n rates: Record<string, number> | null,\n): TradingCalculatorResults {\n const rateFor = (currency: string): number => {\n if (currency === USD) return 1;\n const rate = rates?.[currency];\n return rate ? 1 / rate : NaN;\n };\n\n const convertedRateProfit = rateFor(symbol.profit_currency);\n const convertedRateMargin = rateFor(symbol.base_currency);\n\n const tradeVolume =\n symbol.market === \"forex\"\n ? volumeInLots * symbol.contract_size * convertedRateMargin\n : volumeInLots * symbol.contract_size * convertedRateProfit * assetPrice;\n\n const marginRequired = tradeVolume / symbol.effective_leverage;\n\n const swapMode = symbol.swap_mode.trim().toLowerCase();\n let swapChargeLong: number | null = null;\n let swapChargeShort: number | null = null;\n\n if (swapMode === \"in points\") {\n swapChargeLong =\n volumeInLots * symbol.contract_size * symbol.point_size * symbol.swap_rate_long * convertedRateProfit;\n swapChargeShort =\n volumeInLots * symbol.contract_size * symbol.point_size * symbol.swap_rate_short * convertedRateProfit;\n } else if (swapMode === \"in percentage terms, using end of gmt day price\") {\n swapChargeLong =\n ((volumeInLots * symbol.contract_size * assetPrice * (symbol.swap_rate_long / 100)) / 360) *\n convertedRateProfit;\n swapChargeShort =\n ((volumeInLots * symbol.contract_size * assetPrice * (symbol.swap_rate_short / 100)) / 360) *\n convertedRateProfit;\n }\n\n const pipValue = symbol.pip_size * volumeInLots * symbol.contract_size * convertedRateProfit;\n\n return { marginRequired, tradeVolume, pipValue, swapChargeLong, swapChargeShort };\n}\n\n/* ── Live exchange-rate hook ──────────────────────────────────────\n * Lazily opens a single WebSocket connection to Deriv's public API on the\n * first calculation that actually needs currency conversion, reuses it for\n * subsequent calculations, and caches each base currency's rates for 30s so\n * rapid re-calculates of the same instrument don't re-hit the network.\n */\nfunction useExchangeRates(wsUrl: string | null | undefined) {\n const socketRef = useRef<WebSocket | null>(null);\n const reqIdRef = useRef(1);\n const pendingRef = useRef(\n new Map<number, { resolve: (rates: Record<string, number>) => void; reject: (error: Error) => void }>(),\n );\n const cacheRef = useRef(new Map<string, { rates: Record<string, number>; fetchedAt: number }>());\n\n useEffect(() => {\n const pending = pendingRef.current;\n return () => {\n socketRef.current?.close();\n socketRef.current = null;\n pending.forEach((entry) => entry.reject(new Error(\"Component unmounted\")));\n pending.clear();\n };\n }, [wsUrl]);\n\n const getRates = useCallback(\n (baseCurrency: string): Promise<Record<string, number>> => {\n if (!wsUrl) return Promise.reject(new Error(\"Live exchange rate conversion is disabled\"));\n\n const cached = cacheRef.current.get(baseCurrency);\n if (cached && Date.now() - cached.fetchedAt < RATES_CACHE_TTL_MS) {\n return Promise.resolve(cached.rates);\n }\n\n return new Promise((resolve, reject) => {\n const sendRequest = (socket: WebSocket) => {\n const reqId = reqIdRef.current++;\n pendingRef.current.set(reqId, {\n resolve: (rates) => {\n cacheRef.current.set(baseCurrency, { rates, fetchedAt: Date.now() });\n resolve(rates);\n },\n reject,\n });\n socket.send(JSON.stringify({ exchange_rates: 1, base_currency: baseCurrency, req_id: reqId }));\n };\n\n const existing = socketRef.current;\n const needsNewSocket = !existing || existing.readyState === WebSocket.CLOSED || existing.readyState === WebSocket.CLOSING;\n\n if (needsNewSocket || !existing) {\n const socket = new WebSocket(wsUrl);\n socketRef.current = socket;\n\n socket.onmessage = (event) => {\n let data: { req_id?: number; exchange_rates?: { rates?: Record<string, number> }; error?: { message?: string } };\n try {\n data = JSON.parse(event.data as string);\n } catch {\n return;\n }\n if (data.req_id == null) return;\n const entry = pendingRef.current.get(data.req_id);\n if (!entry) return;\n pendingRef.current.delete(data.req_id);\n if (data.error) {\n entry.reject(new Error(data.error.message ?? \"Exchange rate request failed\"));\n } else {\n entry.resolve(data.exchange_rates?.rates ?? {});\n }\n };\n\n socket.onerror = () => {\n pendingRef.current.forEach((entry) => entry.reject(new Error(\"Exchange rate connection failed\")));\n pendingRef.current.clear();\n };\n\n socket.onopen = () => sendRequest(socket);\n } else if (existing.readyState === WebSocket.OPEN) {\n sendRequest(existing);\n } else {\n const previousOnOpen = existing.onopen;\n existing.onopen = (event) => {\n if (typeof previousOnOpen === \"function\") previousOnOpen.call(existing, event);\n sendRequest(existing);\n };\n }\n });\n },\n [wsUrl],\n );\n\n return getRates;\n}\n\n/* ── Symbol data hook ─────────────────────────────────────────────\n * Uses `symbolsProp` verbatim when supplied (tests / Storybook / SSR-safe\n * override); otherwise fetches Deriv's public specs feed once on mount.\n */\ntype SymbolsState =\n | { status: \"loading\" }\n | { status: \"ready\"; data: TradingSymbolSpec[] }\n | { status: \"error\"; message: string };\n\nfunction useSymbols(symbolsProp: TradingSymbolSpec[] | undefined, endpoint: string): [SymbolsState, () => void] {\n const [state, setState] = useState<SymbolsState>(\n symbolsProp ? { status: \"ready\", data: symbolsProp } : { status: \"loading\" },\n );\n const [retryToken, setRetryToken] = useState(0);\n\n useEffect(() => {\n if (symbolsProp) {\n setState({ status: \"ready\", data: symbolsProp });\n return;\n }\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n setState({ status: \"loading\" });\n\n fetch(endpoint)\n .then((response) => {\n if (!response.ok) throw new Error(`Request failed with status ${response.status}`);\n return response.json();\n })\n .then((data: TradingSymbolSpec[]) => {\n if (cancelled) return;\n setState({ status: \"ready\", data });\n })\n .catch((error: Error) => {\n if (cancelled) return;\n setState({ status: \"error\", message: error.message || \"Unable to load symbols\" });\n });\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [symbolsProp, endpoint, retryToken]);\n\n const retry = useCallback(() => setRetryToken((n) => n + 1), []);\n return [state, retry];\n}\n\n/* ── Icons ────────────────────────────────────────────────────── */\n/* Icons not covered by a shared component live here. */\n\nconst ErrorIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\nconst ChevronIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/* ── Symbol combobox ──────────────────────────────────────────── */\n\ninterface SymbolComboboxProps {\n symbolsState: SymbolsState;\n onRetry: () => void;\n selected: TradingSymbolSpec | null;\n onSelect: (symbol: TradingSymbolSpec) => void;\n error?: string;\n inputId: string;\n}\n\n/**\n * Groups are kept in first-seen order from `symbols` (i.e. the order the\n * source feed lists them in) rather than alphabetically — this mirrors the\n * reference page's own grouping (`array.reduce(...)` into a plain object,\n * then `Object.entries`, which preserves insertion order), so the dropdown's\n * sector order matches deriv.com/trading-calculators exactly. Symbols within\n * each group are still sorted alphabetically, same as the reference.\n */\nfunction groupByAssetClass(symbols: TradingSymbolSpec[]): [string, TradingSymbolSpec[]][] {\n const groups = new Map<string, TradingSymbolSpec[]>();\n for (const item of symbols) {\n const list = groups.get(item.asset_class) ?? [];\n list.push(item);\n groups.set(item.asset_class, list);\n }\n for (const list of groups.values()) {\n list.sort((a, b) => a.symbol.localeCompare(b.symbol));\n }\n return [...groups.entries()];\n}\n\nconst SymbolCombobox = ({ symbolsState, onRetry, selected, onSelect, error, inputId }: SymbolComboboxProps) => {\n const [query, setQuery] = useState(\"\");\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n\n const isLoading = symbolsState.status === \"loading\";\n const isError = symbolsState.status === \"error\";\n const allSymbols = symbolsState.status === \"ready\" ? symbolsState.data : [];\n\n const filtered = useMemo(() => {\n const term = query.trim().toLowerCase();\n if (!term) return allSymbols;\n return allSymbols.filter(\n (item) =>\n item.symbol.toLowerCase().includes(term) ||\n item.description.toLowerCase().includes(term) ||\n item.asset_class.toLowerCase().includes(term),\n );\n }, [allSymbols, query]);\n\n const grouped = useMemo(() => groupByAssetClass(filtered), [filtered]);\n const flatOptions = useMemo(() => grouped.flatMap(([, items]) => items), [grouped]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n return () => document.removeEventListener(\"mousedown\", handlePointerDown);\n }, [isOpen]);\n\n const displayValue = isOpen ? query : selected ? `${selected.symbol} — ${selected.description}` : query;\n\n const commit = (item: TradingSymbolSpec) => {\n onSelect(item);\n setQuery(\"\");\n setIsOpen(false);\n setActiveIndex(-1);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex((i) => Math.min(i + 1, flatOptions.length - 1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (event.key === \"Enter\") {\n if (isOpen && activeIndex >= 0 && flatOptions[activeIndex]) {\n event.preventDefault();\n commit(flatOptions[activeIndex]);\n }\n } else if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n return (\n <div className=\"tcalc-field\" ref={wrapperRef}>\n <SearchField\n id={inputId}\n label={\n <>\n Symbols <span className=\"tcalc-required\">*</span>\n </>\n }\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n isOpen && activeIndex >= 0 ? `${listboxId}-${activeIndex}` : undefined\n }\n aria-invalid={Boolean(error)}\n status={error ? \"fail\" : \"neutral\"}\n showSearchIcon={false}\n autoComplete=\"off\"\n disabled={isLoading || isError}\n hideClearButton\n trailingSlot={<ChevronIcon />}\n placeholder={isLoading ? \"Loading symbols…\" : isError ? \"Symbols unavailable\" : \"Search symbol, e.g. EURUSD\"}\n value={displayValue}\n onFocus={() => setIsOpen(true)}\n onChange={(event) => {\n setQuery(event.target.value);\n setIsOpen(true);\n setActiveIndex(-1);\n }}\n onKeyDown={handleKeyDown}\n />\n\n {isOpen && !isLoading && !isError && (\n <div className=\"tcalc-dropdown\" id={listboxId} role=\"listbox\">\n {grouped.length === 0 && <p className=\"tcalc-dropdownEmpty\">No symbols match \"{query}\"</p>}\n {grouped.map(([assetClass, items]) => (\n <div className=\"tcalc-dropdownGroup\" key={assetClass}>\n <p className=\"tcalc-dropdownGroupTitle\">{assetClass}</p>\n {items.map((item) => {\n const flatIndex = flatOptions.indexOf(item);\n return (\n <div\n className={[\n \"tcalc-dropdownOption\",\n flatIndex === activeIndex ? \"tcalc-dropdownOption--active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n id={`${listboxId}-${flatIndex}`}\n key={item.symbol}\n role=\"option\"\n aria-selected={selected?.symbol === item.symbol}\n onMouseDown={(event) => {\n event.preventDefault();\n commit(item);\n }}\n onMouseEnter={() => setActiveIndex(flatIndex)}\n >\n <span className=\"tcalc-dropdownSymbol\">{item.symbol}</span>\n <span className=\"tcalc-dropdownDesc\">{item.description}</span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n )}\n\n {isError && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> Unable to load symbols.{\" \"}\n <button type=\"button\" className=\"tcalc-retryLink\" onClick={onRetry}>\n Retry\n </button>\n </p>\n )}\n {!isError && error && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> {error}\n </p>\n )}\n </div>\n );\n};\n\n/* ── Meta / info rows ─────────────────────────────────────────── */\n\nconst InfoRow = ({\n label,\n value,\n separator = \"=\",\n}: {\n label: string;\n value: string;\n separator?: \"=\" | \":\";\n}) => (\n <p className=\"tcalc-infoRow\">\n <span className=\"tcalc-infoLabel\">{label}</span>\n {separator === \"=\" ? \" = \" : \": \"}\n <span className=\"tcalc-infoValue\">{value}</span>\n </p>\n);\n\nconst ResultBox = ({ label, value }: { label: string; value: string }) => (\n <div className=\"tcalc-resultBox\">\n <p className=\"tcalc-resultLabel\">{label}</p>\n <p className=\"tcalc-resultValue\">{value}</p>\n </div>\n);\n\n/* ── TradingCalculator ────────────────────────────────────────────\n * A two-panel \"Calculator\" / \"Results\" trading calculator (margin, pip\n * value, swap charges), modeled after deriv.com/trading-calculators.\n *\n * Fully wired to the same live data sources as the reference page:\n * - instrument specs (contract size, leverage, swap rates, live price) from\n * Deriv's public `dynamic_trading_specs.json` feed, fetched on mount;\n * - USD exchange rates from Deriv's public WebSocket API, fetched on demand\n * only for instruments whose base/profit currency isn't already USD.\n *\n * These sources power all four `variant`s identically — deriv.com's own\n * margin/pip/swap calculator pages are three thin views over the same\n * instrument feed and exchange-rate API, they just each surface a different\n * subset of the shared \"Results\" panel. See `symbols` / `symbolsEndpoint` /\n * `exchangeRateWsUrl` in `TradingCalculator.types.ts` to override either data\n * source, and `variant` to pick which page's results panel to render.\n */\nexport const TradingCalculator = ({\n variant = \"main\",\n symbols: symbolsProp,\n symbolsEndpoint = DEFAULT_SYMBOLS_ENDPOINT,\n exchangeRateWsUrl = DEFAULT_EXCHANGE_RATE_WS_URL,\n defaultSymbol,\n className,\n ...props\n}: TradingCalculatorProps) => {\n const showMargin = variant === \"main\" || variant === \"margin\";\n const showPip = variant === \"main\" || variant === \"pip\";\n const showSwap = variant === \"main\" || variant === \"swap\";\n const showTradeVolume = variant === \"main\";\n const [symbolsState, retrySymbols] = useSymbols(symbolsProp, symbolsEndpoint);\n const getRates = useExchangeRates(exchangeRateWsUrl);\n\n const [selectedSymbol, setSelectedSymbol] = useState<TradingSymbolSpec | null>(null);\n const [volumeInLots, setVolumeInLots] = useState(\"\");\n const [assetPrice, setAssetPrice] = useState(\"\");\n const [errors, setErrors] = useState<{ symbol?: string; volume?: string; price?: string }>({});\n const [results, setResults] = useState<TradingCalculatorResults | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n const [calcError, setCalcError] = useState<string | null>(null);\n const didPreselect = useRef(false);\n\n useEffect(() => {\n if (didPreselect.current || !defaultSymbol || symbolsState.status !== \"ready\") return;\n const match = symbolsState.data.find((item) => item.symbol === defaultSymbol);\n if (match) {\n didPreselect.current = true;\n setSelectedSymbol(match);\n setAssetPrice(String(match.ask_last));\n }\n }, [defaultSymbol, symbolsState]);\n\n const handleSelectSymbol = (symbol: TradingSymbolSpec) => {\n setSelectedSymbol(symbol);\n setAssetPrice(String(symbol.ask_last));\n setVolumeInLots(\"\");\n setResults(null);\n setCalcError(null);\n setErrors((prev) => ({ ...prev, symbol: undefined }));\n };\n\n const handleReset = () => {\n setSelectedSymbol(null);\n setVolumeInLots(\"\");\n setAssetPrice(\"\");\n setResults(null);\n setErrors({});\n setCalcError(null);\n };\n\n const handleCalculate = async () => {\n const volume = Number.parseFloat(volumeInLots);\n const price = Number.parseFloat(assetPrice);\n const nextErrors: typeof errors = {};\n\n if (!selectedSymbol) nextErrors.symbol = \"Select a symbol to continue.\";\n if (!volumeInLots || Number.isNaN(volume)) {\n nextErrors.volume = \"Enter a valid volume in lots.\";\n } else if (volume <= 0) {\n nextErrors.volume = \"Volume must be greater than 0.\";\n } else if (selectedSymbol && (volume < selectedSymbol.volume_min || volume > selectedSymbol.volume_limit)) {\n nextErrors.volume = `Volume must be between ${selectedSymbol.volume_min} and ${selectedSymbol.volume_limit} lots.`;\n }\n if (!assetPrice || Number.isNaN(price) || price <= 0) nextErrors.price = \"Enter a valid asset price.\";\n\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0 || !selectedSymbol) return;\n\n setCalcError(null);\n setIsCalculating(true);\n try {\n const needsConversion = selectedSymbol.profit_currency !== USD || selectedSymbol.base_currency !== USD;\n const rates = needsConversion ? await getRates(USD) : null;\n setResults(computeResults(selectedSymbol, volume, price, rates));\n } catch (error) {\n setCalcError(\n error instanceof Error\n ? `Unable to fetch live exchange rates (${error.message}). Please try again.`\n : \"Unable to fetch live exchange rates. Please try again.\",\n );\n } finally {\n setIsCalculating(false);\n }\n };\n\n const symbolInputId = useId();\n const volumeInputId = useId();\n const priceInputId = useId();\n\n return (\n <section className={[\"tcalc-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"tcalc-container\">\n <div className=\"tcalc-card\">\n {/* ── Calculator column ── */}\n <div className=\"tcalc-column\">\n <h3 className=\"tcalc-panelTitle\">Calculator</h3>\n\n <SymbolCombobox\n symbolsState={symbolsState}\n onRetry={retrySymbols}\n selected={selectedSymbol}\n onSelect={handleSelectSymbol}\n error={errors.symbol}\n inputId={symbolInputId}\n />\n\n <div className=\"tcalc-infoGrid\">\n <InfoRow label=\"Contract size\" value={selectedSymbol ? integerFormatter.format(selectedSymbol.contract_size) : \"-\"} />\n <InfoRow label=\"Pip size\" value={selectedSymbol ? String(selectedSymbol.pip_size) : \"-\"} />\n <InfoRow\n label=\"Effective Leverage\"\n value={selectedSymbol ? `1 : ${Math.round((selectedSymbol.effective_leverage + Number.EPSILON) * 100) / 100}` : \"-\"}\n />\n <InfoRow label=\"Point size\" value={selectedSymbol ? String(selectedSymbol.point_size) : \"-\"} />\n </div>\n\n <div className=\"tcalc-field\">\n <TextField\n id={volumeInputId}\n className=\"tcalc-numberField\"\n label={\n <>\n Volume in Lots <span className=\"tcalc-required\">*</span>\n </>\n }\n status={errors.volume ? \"fail\" : \"neutral\"}\n type=\"number\"\n inputMode=\"decimal\"\n min={0}\n step=\"any\"\n aria-invalid={Boolean(errors.volume)}\n value={volumeInLots}\n onChange={(event) => {\n const value = event.target.value;\n setVolumeInLots(value);\n const parsed = Number.parseFloat(value);\n const isNegative = value !== \"\" && !Number.isNaN(parsed) && parsed <= 0;\n setErrors((prev) => ({\n ...prev,\n volume: isNegative ? \"Volume must be greater than 0.\" : undefined,\n }));\n }}\n />\n {errors.volume && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> {errors.volume}\n </p>\n )}\n </div>\n\n <div className=\"tcalc-field\">\n <TextField\n id={priceInputId}\n className=\"tcalc-numberField\"\n label={\n <>\n Asset price <span className=\"tcalc-required\">*</span>\n </>\n }\n status={errors.price ? \"fail\" : \"neutral\"}\n type=\"number\"\n inputMode=\"decimal\"\n min={0}\n step=\"any\"\n aria-invalid={Boolean(errors.price)}\n value={assetPrice}\n onChange={(event) => {\n setAssetPrice(event.target.value);\n setErrors((prev) => ({ ...prev, price: undefined }));\n }}\n />\n {errors.price && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> {errors.price}\n </p>\n )}\n </div>\n\n <div className=\"tcalc-actions\">\n <Button\n type=\"button\"\n colorScheme=\"coral\"\n variant=\"primary\"\n label={isCalculating ? \"Calculating…\" : \"Calculate\"}\n onClick={handleCalculate}\n disabled={isCalculating}\n fullWidth\n />\n <Button\n type=\"button\"\n colorScheme=\"black\"\n variant=\"secondary\"\n label=\"Reset\"\n onClick={handleReset}\n fullWidth\n />\n </div>\n </div>\n\n {/* ── Results column ──\n * \"main\" renders every result in one combined panel;\n * \"margin\"/\"pip\"/\"swap\" each render only their own\n * result(s), mirroring the corresponding single-purpose\n * deriv.com/trading-calculators page. */}\n <div className=\"tcalc-column tcalc-column--results\">\n <h3 className=\"tcalc-panelTitle\">Results</h3>\n\n {showMargin && (\n <ResultBox label=\"Margin Required\" value={results ? formatMoney(results.marginRequired) : \"$\"} />\n )}\n\n {showTradeVolume && showPip && (\n <div className=\"tcalc-resultRow\">\n <ResultBox label=\"Trade Volume\" value={results ? formatInteger(results.tradeVolume) : \"$\"} />\n <ResultBox label=\"Pip value\" value={results ? formatMoney(results.pipValue) : \"$\"} />\n </div>\n )}\n\n {!showTradeVolume && showPip && (\n <ResultBox label=\"Pip value\" value={results ? formatMoney(results.pipValue) : \"$\"} />\n )}\n\n {showSwap && (\n <div className=\"tcalc-resultRow\">\n <ResultBox label=\"Swap Charge Long\" value={results ? formatMoney(results.swapChargeLong) : \"$\"} />\n <ResultBox label=\"Swap Charge Short\" value={results ? formatMoney(results.swapChargeShort) : \"$\"} />\n </div>\n )}\n\n {calcError && (\n <p className=\"tcalc-fieldError tcalc-calcError\">\n <ErrorIcon /> {calcError}\n </p>\n )}\n\n {showSwap && (\n <>\n <div className=\"tcalc-infoGrid\">\n <InfoRow label=\"Swap long rate\" value={selectedSymbol ? String(selectedSymbol.swap_rate_long) : \"-\"} />\n <InfoRow label=\"Swap short rate\" value={selectedSymbol ? String(selectedSymbol.swap_rate_short) : \"-\"} />\n </div>\n\n <InfoRow separator=\":\" label=\"Swap calculation type\" value={selectedSymbol ? selectedSymbol.swap_mode : \"-\"} />\n <InfoRow separator=\":\" label=\"Three-day swap\" value={selectedSymbol ? selectedSymbol.three_day_swap || \"No\" : \"-\"} />\n <InfoRow separator=\":\" label=\"Weekend swaps\" value={selectedSymbol ? String(selectedSymbol.weekend_swaps ?? \"-\") : \"-\"} />\n </>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default TradingCalculator;\n","import { Fragment, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { Tabs } from \"../../components/Tabs\";\nimport type {\n CalculationToken,\n FormulaBlock,\n SwapCalculationMode,\n TradingCalculatorHowToProps,\n TradingCalculatorHowToVariant,\n} from \"./TradingCalculatorHowTo.types\";\nimport \"./TradingCalculatorHowTo.css\";\n\ninterface HowToContent {\n title: string;\n description: string;\n formulaHeading: string;\n formulaBlocks: FormulaBlock[];\n exampleHeading: string;\n exampleIntro: string;\n exampleLead?: string;\n calculations: CalculationToken[][];\n resultText: string;\n note: string;\n}\n\n/* ── Canonical content ────────────────────────────────────────────\n * Mirrors deriv.com/trading-calculators' three \"How to calculate…\"\n * explainer sections word-for-word. `title`/`description` are overridable\n * props (see `TradingCalculatorHowToProps`); the formula/example content\n * itself is fixed per `variant` — like `TradingCalculator`'s own panel\n * labels, this is reference copy, not per-instance CMS content.\n */\n\nconst MARGIN_CONTENT: HowToContent = {\n title: \"How to calculate margin requirements\",\n description:\n \"Use this formula to calculate how much margin is required based on your lot size, leverage ratio, and the current market price.\",\n formulaHeading: \"Formula\",\n formulaBlocks: [\n { type: \"text\", content: \"Required margin = Volume ÷ Effective leverage*\" },\n { type: \"footnote\", content: \"* Use the denominator of the Effective leverage ratio, 1 : XXXX.\" },\n { type: \"text\", content: \"Volume is calculated based on the following formula:\" },\n {\n type: \"bullets\",\n items: [\n { term: \"Forex\", content: \"Lots x Contract size x BSE/USD*\" },\n { term: \"Other\", content: \"Lots x Contract size x Execution price x QTE/USD**\" },\n ],\n },\n {\n type: \"footnote\",\n content:\n '*BSE/USD is the conversion rate from the base currency (BSE), referred to as the \"Margin Currency\" in MT5, to USD.',\n },\n {\n type: \"footnote\",\n content:\n '**QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleHeading: \"Example\",\n exampleIntro:\n \"You are trading 0.25 lots of EUR/GBP with leverage of 1:1000. The EUR to USD conversion rate is 1.10634.\",\n calculations: [\n [\n { text: \"0.25\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"100,000\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"1.10634\", label: \"EUR to USD\" },\n { text: \"=\" },\n { text: \"27,658.5\", label: \"Volume\" },\n ],\n [\n { text: \"27,658.5\", label: \"Volume\" },\n { text: \"÷\" },\n { text: \"1,000\", label: \"Leverage\" },\n { text: \"=\" },\n { text: \"27.66\", label: \"Required margin\" },\n ],\n ],\n resultText: \"The margin required is USD 27.66 to open the above position.\",\n note: \"Note: These are approximate values only and will differ depending on the leverage that is set for your account and the asset you want to trade.\",\n};\n\nconst PIP_CONTENT: HowToContent = {\n title: \"How to calculate pip values\",\n description: \"Calculate how much each pip equals in dollar terms for your position size and trading instrument.\",\n formulaHeading: \"Formula\",\n formulaBlocks: [\n { type: \"text\", content: \"Pip value USD: Pip size* x Lots x Contract size x QTE/USD*\" },\n {\n type: \"footnote\",\n content:\n '*QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleHeading: \"Example\",\n exampleIntro: \"You are trading 0.25 lots of EUR/GBP, with a GBP to USD conversion rate of 1.31386.\",\n exampleLead: \"The calculation would be:\",\n calculations: [\n [\n { text: \"0.0001\", label: \"Pip size\" },\n { text: \"x\" },\n { text: \"0.25\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"100,000\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"1.31386\", label: \"GBP to USD\" },\n { text: \"=\" },\n { text: \"3.28 USD per pip\", label: \"Pip value\" },\n ],\n ],\n resultText:\n \"This means that for every pip movement of EUR/GBP, your profit or loss (PnL) will change by USD 3.28.\",\n note: \"Note: These values are approximate and may vary based on the leverage set for your account and the specific asset being traded.\",\n};\n\nconst SWAP_POINTS_CONTENT: HowToContent = {\n title: \"How to calculate swap fees\",\n description: \"Use this formula to work out how much you'll pay or receive in swap fees when holding trades overnight.\",\n formulaHeading: \"Formula\",\n formulaBlocks: [\n { type: \"text\", content: \"Swap = Lots x Contract size x Point size* x Swap rate x QTE/USD**\" },\n {\n type: \"footnote\",\n content:\n \"*Point size = 10⁻digits (digits can be found in the instrument specification table in your trading terminal)\",\n },\n {\n type: \"footnote\",\n content:\n '**QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleHeading: \"Example\",\n exampleIntro:\n \"You hold a short position of 0.2 lots of AUD/JPY overnight that has a point size of 0.001 and a short swap rate of -12.92. The JPY to USD conversion rate is 0.00681.\",\n calculations: [\n [\n { text: \"0.2\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"100,000\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"0.001\", label: \"Point size\" },\n { text: \"x\" },\n { text: \"-12.92\", label: \"Swap rate\" },\n { text: \"x\" },\n { text: \"0.00681\", label: \"JPY to USD\" },\n { text: \"=\" },\n { text: \"-1.76 USD\", label: \"Swap\" },\n ],\n ],\n resultText: \"This means the swap charge is USD 1.76 to keep the position open overnight.\",\n note: \"Note: These are approximate values only and will differ depending on the leverage that is set for your account and the asset you want to trade.\",\n};\n\nconst SWAP_PERCENTAGE_CONTENT: HowToContent = {\n ...SWAP_POINTS_CONTENT,\n formulaBlocks: [\n { type: \"text\", content: \"Swap = (Lots x Contract size x Rollover price*) x (Swap rate ÷ 100) ÷ 360 x QTE/USD**\" },\n {\n type: \"footnote\",\n content:\n \"*Rollover price = The last price of the day before the swap is processed, typically at 20:59 or 21:59 GMT.\",\n },\n {\n type: \"footnote\",\n content:\n '**QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleIntro:\n \"You hold a long position of 0.2 lots of France 40 overnight, with a long swap rate of -5.46 and the rollover price is 7,654. The EUR to USD conversion rate is 1.10722.\",\n calculations: [\n [\n { text: \"[0.2\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"1\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"7,654]\", label: \"Rollover price\" },\n { text: \"x\" },\n { text: \"(-5.46 ÷ 100)\", label: \"Swap rate\" },\n { text: \"÷ 360\" },\n { text: \"x\" },\n { text: \"1.10722\", label: \"EUR to USD\" },\n { text: \"=\" },\n { text: \"-0.26 USD\", label: \"Swap\" },\n ],\n ],\n resultText: \"This means the swap charge is USD -0.26 to keep the position open overnight.\",\n};\n\nconst SWAP_TABS: { id: SwapCalculationMode; label: string }[] = [\n { id: \"points\", label: \"Swap calculation (In points)\" },\n { id: \"percentage\", label: \"Swap calculation (In percentage)\" },\n];\n\n/** Which formula `variant`'s swap tab switch should start on. Non-swap variants ignore this. */\nconst swapModeForVariant = (variant: TradingCalculatorHowToVariant): SwapCalculationMode =>\n variant === \"swap-percentage\" ? \"percentage\" : \"points\";\n\n/* `useLayoutEffect` warns during SSR; fall back to `useEffect` there. Only\n * matters for the initial server-rendered markup — the shrink-to-fit effect\n * itself is inherently client-only (it measures real DOM boxes). */\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/* ── Formula column ───────────────────────────────────────────── */\n\nconst FormulaBlockView = ({ block }: { block: FormulaBlock }) => {\n if (block.type === \"footnote\") {\n return <p className=\"tchow-footnote\">{block.content}</p>;\n }\n if (block.type === \"bullets\") {\n return (\n <ul className=\"tchow-bullets\">\n {block.items.map((item) => (\n <li className=\"tchow-bulletItem\" key={item.term}>\n <strong>{item.term}:</strong> {item.content}\n </li>\n ))}\n </ul>\n );\n }\n return <p className=\"tchow-text\">{block.content}</p>;\n};\n\n/* A short vertical connector pointing straight down from a value to its\n * caption underneath, replacing a plain dot so the top-to-bottom link\n * reads as directional rather than decorative. */\nconst ConnectorArrow = () => (\n <svg width=\"8\" height=\"11\" viewBox=\"0 0 8 11\" fill=\"none\" aria-hidden=\"true\" className=\"tchow-stripArrow\">\n <path d=\"M4 0V7.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <path d=\"M1.4 5.6L4 8.6L6.6 5.6\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/* ── Calculation strip ─────────────────────────────────────────\n * A single CSS Grid with `grid-auto-flow: column` and two explicit rows —\n * each token contributes a (value, caption) pair consecutively in the DOM,\n * so the grid auto-places them into the same column, guaranteeing the\n * connector arrow + label always lines up under its value with no manual\n * column bookkeeping.\n *\n * The strip must always render on one line — no wrapping, no horizontal\n * scrollbar — on every viewport, shrinking instead once it no longer fits.\n * `.tchow-strip` is sized to its own natural (unscaled) content width via\n * `display: inline-grid`, then a `ResizeObserver` compares that natural\n * width against the available width in `.tchow-stripWrap` and applies a\n * `transform: scale(...)` factor (≤ 1) so the whole box — background,\n * padding, text — shrinks uniformly and never overflows. The wrapper's\n * height is set to match the scaled box so it never leaves extra blank\n * space (a CSS `transform` never changes layout size, only paint size).\n */\nconst CalculationStrip = ({ tokens }: { tokens: CalculationToken[] }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const stripRef = useRef<HTMLDivElement>(null);\n const [fit, setFit] = useState({ scale: 1, naturalHeight: 0 });\n\n useIsomorphicLayoutEffect(() => {\n const wrapper = wrapperRef.current;\n const strip = stripRef.current;\n if (!wrapper || !strip) return;\n\n const recompute = () => {\n const available = wrapper.clientWidth;\n const naturalWidth = strip.scrollWidth;\n const naturalHeight = strip.scrollHeight;\n if (!available || !naturalWidth) return;\n setFit({ scale: Math.min(1, available / naturalWidth), naturalHeight });\n };\n\n recompute();\n\n const observer = new ResizeObserver(recompute);\n observer.observe(wrapper);\n observer.observe(strip);\n\n // Web fonts finishing an async load after first paint can change the\n // strip's natural width; re-measure once they're ready too.\n if (typeof document !== \"undefined\" && document.fonts?.ready) {\n document.fonts.ready.then(recompute).catch(() => {});\n }\n\n return () => observer.disconnect();\n }, [tokens]);\n\n const isShrunk = fit.scale < 1;\n\n return (\n <div\n className=\"tchow-stripWrap\"\n ref={wrapperRef}\n style={isShrunk ? { height: fit.naturalHeight * fit.scale } : undefined}\n >\n <div\n className=\"tchow-strip\"\n ref={stripRef}\n style={isShrunk ? { transform: `scale(${fit.scale})` } : undefined}\n role=\"img\"\n aria-label={tokens.map((token) => token.text).join(\" \")}\n >\n {tokens.map((token, i) => (\n <Fragment key={i}>\n <span\n className={[\"tchow-stripValue\", token.label ? \"tchow-stripValue--labeled\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <span\n className={[\n \"tchow-stripValueText\",\n token.label ? \"tchow-stripValueText--labeled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {token.text}\n </span>\n </span>\n <span className=\"tchow-stripCaption\" aria-hidden=\"true\">\n {token.label && (\n <>\n <ConnectorArrow />\n <span\n className={[\n \"tchow-stripLabel\",\n i === 0 || i === tokens.length - 1 ? \"tchow-stripLabel--edge\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <span className=\"tchow-stripLabelText\">{token.label}</span>\n </span>\n </>\n )}\n </span>\n </Fragment>\n ))}\n </div>\n </div>\n );\n};\n\n/* ── TradingCalculatorHowTo ───────────────────────────────────────\n * A \"How to calculate…\" explainer section: a centered title/description,\n * an optional interactive tab switch (swap only), and a two-column\n * \"Formula\" / \"Example\" card — modeled after the explainer sections on\n * deriv.com's margin/pip/swap calculator pages.\n *\n * Pairs naturally above or below `TradingCalculator` on the same page —\n * `TradingCalculator` is the live tool, this is the worked-example copy\n * explaining how its numbers are derived.\n */\nexport const TradingCalculatorHowTo = ({\n variant = \"margin\",\n title,\n description,\n className,\n ...props\n}: TradingCalculatorHowToProps) => {\n const isSwap = variant === \"swap-points\" || variant === \"swap-percentage\";\n const [swapTab, setSwapTab] = useState<SwapCalculationMode>(() => swapModeForVariant(variant));\n\n // Keep the tab switch in sync if a consumer changes `variant` after mount\n // (e.g. a Storybook control) — the tabs still stay independently\n // clickable afterwards, this only resets which one starts active.\n useEffect(() => {\n setSwapTab(swapModeForVariant(variant));\n }, [variant]);\n\n const content: HowToContent =\n variant === \"pip\"\n ? PIP_CONTENT\n : isSwap\n ? swapTab === \"percentage\"\n ? SWAP_PERCENTAGE_CONTENT\n : SWAP_POINTS_CONTENT\n : MARGIN_CONTENT;\n\n const heading = title ?? content.title;\n const desc = description ?? content.description;\n\n return (\n <section className={[\"tchow-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"tchow-container\">\n <div className=\"tchow-intro\">\n <h2 className=\"tchow-title\">{heading}</h2>\n {desc && <p className=\"tchow-description\">{desc}</p>}\n </div>\n\n {isSwap && (\n <Tabs\n className=\"tchow-tabs\"\n items={SWAP_TABS}\n activeId={swapTab}\n onChange={(id) => setSwapTab(id as SwapCalculationMode)}\n />\n )}\n\n <div className=\"tchow-card\">\n <div className=\"tchow-column\">\n <h3 className=\"tchow-columnTitle\">{content.formulaHeading}</h3>\n {content.formulaBlocks.map((block, i) => (\n <FormulaBlockView block={block} key={i} />\n ))}\n </div>\n\n <div className=\"tchow-column\">\n <h3 className=\"tchow-columnTitle\">{content.exampleHeading}</h3>\n <p className=\"tchow-text\">{content.exampleIntro}</p>\n {content.exampleLead && <p className=\"tchow-text\">{content.exampleLead}</p>}\n\n {content.calculations.map((strip, i) => (\n <CalculationStrip key={i} tokens={strip} />\n ))}\n\n <p className=\"tchow-text\">{content.resultText}</p>\n <p className=\"tchow-note\">{content.note}</p>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default TradingCalculatorHowTo;\n","import { useMemo, useState } from \"react\";\nimport type { FeatureOffice, FeatureOfficesProps } from \"./FeatureOffices.types\";\nimport { Link } from \"../../components/Link\";\nimport { Tabs } from \"../../components/Tabs\";\nimport \"./FeatureOffices.css\";\n\nconst isExternalUrl = (href: string | undefined) => Boolean(href && /^https?:\\/\\//i.test(href));\n\n/* ── Default copy ─────────────────────────────────────────────\n * Starting-point content only — every string is a plain prop, so\n * an AI agent, CMS, or developer can fully replace it. See\n * `schema.ts` / `fingerprint.json` for the machine-readable\n * content contract.\n */\nexport const FEATURE_OFFICES_TEXT_CONTENT = {\n title: \"Our offices\",\n linkText: \"See location\",\n};\n\n/* ── Single office card ────────────────────────────────────────\n * Flag emoji, city/country heading, multi-line address, and an\n * optional \"See location\" link. Absolute `http(s)://` hrefs open\n * in a new tab; relative/internal hrefs navigate same-tab.\n */\nconst OfficeCard = ({ office, linkText }: { office: FeatureOffice; linkText: string }) => {\n const label = office.linkText ?? linkText;\n const external = isExternalUrl(office.href);\n\n return (\n <div className=\"fo-card\">\n <img\n alt={office.flagAlt ?? office.country}\n className=\"fo-flag\"\n height={24}\n loading=\"lazy\"\n src={office.flagImage}\n width={32}\n />\n\n <h3 className=\"fo-cardTitle\">\n {office.city}, {office.country}\n </h3>\n\n <p className=\"fo-address\">\n {office.address.split(\"\\n\").map((line, i) => (\n <span key={i}>\n {line}\n {i < office.address.split(\"\\n\").length - 1 && <br />}\n </span>\n ))}\n </p>\n\n {office.href && (\n <div className=\"fo-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={office.href}\n label={label}\n rel={external ? \"noopener noreferrer\" : undefined}\n target={external ? \"_blank\" : undefined}\n />\n </div>\n )}\n </div>\n );\n};\n\n/* ── FeatureOffices ────────────────────────────────────────────\n * Centred H2 heading and a row of region tabs above a responsive\n * grid of office cards. Regions and offices are CMS-managed data;\n * filtering by region happens client-side. Modeled after\n * deriv.com/contact-us (\"Our offices\").\n */\nexport const FeatureOffices = ({\n title = FEATURE_OFFICES_TEXT_CONTENT.title,\n regions,\n activeRegionId,\n defaultActiveRegionId,\n onRegionChange,\n offices,\n linkText = FEATURE_OFFICES_TEXT_CONTENT.linkText,\n className,\n ...props\n}: FeatureOfficesProps) => {\n const [internalActiveId, setInternalActiveId] = useState(\n defaultActiveRegionId ?? regions[0]?.id,\n );\n\n const isControlled = activeRegionId !== undefined;\n const activeId = isControlled ? activeRegionId : internalActiveId;\n\n const filteredOffices = useMemo(\n () => offices.filter((office) => office.region === activeId),\n [offices, activeId],\n );\n\n const handleTabChange = (id: string) => {\n if (!isControlled) setInternalActiveId(id);\n onRegionChange?.(id);\n };\n\n return (\n <section className={[\"fo-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"fo-container\">\n {title && <h2 className=\"fo-title\">{title}</h2>}\n\n <div className=\"fo-tabsWrap\">\n <Tabs activeId={activeId ?? \"\"} items={regions} onChange={handleTabChange} />\n </div>\n\n <div className=\"fo-grid\">\n {filteredOffices.map((office, index) => (\n <OfficeCard key={`${office.city}-${index}`} linkText={linkText} office={office} />\n ))}\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureOffices;\n","import { Link } from \"../../components/Link\";\nimport type { TierAccent, TierItem, TiersProps } from \"./Tiers.types\";\nimport \"./Tiers.css\";\n\nconst DEFAULT_ACCENTS: TierAccent[] = [\"bronze\", \"silver\", \"gold\", \"platinum\"];\n\nconst resolveAccent = (tier: TierItem, index: number): TierAccent =>\n tier.accent ?? DEFAULT_ACCENTS[index] ?? \"bronze\";\n\n/**\n * Partnership-tier comparison section — centred header, a responsive\n * track of medal tiers (with desktop connector lines), and an optional CTA.\n * Modeled after the \"Growing rewards as you scale\" block on\n * https://deriv.com/partners.\n *\n * Mobile (<768px): single column; each tier is a white outer card with\n * the medal, a horizontal name/status row, a slate benefit panel, and an\n * optional requirement. Desktop (≥992px): four equal columns with metallic\n * connector lines through the medals.\n */\nexport const Tiers = ({\n title,\n description,\n tiers,\n showLink = false,\n linkText = \"Learn more about partner tiers\",\n linkHref,\n onLinkClick,\n}: TiersProps) => {\n return (\n <section className=\"tiers\">\n <div className=\"tiers__container\">\n <header className=\"tiers__header\">\n <h2 className=\"tiers__title\">{title}</h2>\n {description && <p className=\"tiers__description\">{description}</p>}\n </header>\n\n <ol className=\"tiers__list\">\n {tiers.map((tier, index) => {\n const accent = resolveAccent(tier, index);\n\n return (\n <li\n key={tier.name}\n className={`tiers__item tiers__item--${accent}`}\n >\n <div className=\"tiers__shell\">\n <div className=\"tiers__icon-row\">\n <span\n className=\"tiers__line tiers__line--left\"\n aria-hidden=\"true\"\n />\n <div className=\"tiers__icon-wrap\">\n <img\n src={tier.icon}\n alt={tier.iconAlt ?? tier.name}\n className=\"tiers__icon\"\n width={64}\n height={64}\n loading=\"lazy\"\n />\n </div>\n <span\n className=\"tiers__line tiers__line--right\"\n aria-hidden=\"true\"\n />\n </div>\n\n <div className=\"tiers__heading\">\n <h3 className=\"tiers__name\">{tier.name}</h3>\n <p className=\"tiers__status\">{tier.status}</p>\n </div>\n\n <div className=\"tiers__card\">\n <p className=\"tiers__card-title\">{tier.title}</p>\n <p className=\"tiers__card-description\">\n {tier.description}\n </p>\n </div>\n\n {tier.requirement && (\n <p className=\"tiers__requirement\">\n {tier.requirement}\n </p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n\n {showLink && (\n <div className=\"tiers__footer\">\n <Link\n colorScheme=\"coral\"\n label={linkText}\n href={linkHref}\n onClick={onLinkClick}\n />\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default Tiers;\n","import type { PartnersPayoutProps } from \"./PartnersPayout.types\";\nimport \"./PartnersPayout.css\";\n\n/**\n * Dark partner-payout section with a responsive metric grid and globe image,\n * modeled after the \"Top partner payouts\" section on deriv.com/partners.\n */\nexport const PartnersPayout = ({\n title,\n period,\n payouts,\n imageUrl,\n imageAlt = \"\",\n className,\n ...props\n}: PartnersPayoutProps) => (\n <section\n className={[\"partners-payout\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"partners-payout__container\">\n <div className=\"partners-payout__content\">\n <header className=\"partners-payout__header\">\n <h2 className=\"partners-payout__title\">{title}</h2>\n <p className=\"partners-payout__period\">{period}</p>\n </header>\n\n <ul className=\"partners-payout__grid\">\n {payouts.map((payout, index) => (\n <li\n className=\"partners-payout__item\"\n key={`${payout.region}-${index}`}\n >\n <span className=\"partners-payout__region\">{payout.region}</span>\n <span className=\"partners-payout__amount\">{payout.amount}</span>\n </li>\n ))}\n </ul>\n </div>\n\n <img\n className=\"partners-payout__image\"\n src={imageUrl}\n alt={imageAlt}\n loading=\"lazy\"\n />\n </div>\n </section>\n);\n\nexport default PartnersPayout;\n","import { Button } from \"../../components/Button\";\nimport type { MasterPartnerProps } from \"./MasterPartner.types\";\nimport \"./MasterPartner.css\";\n\n/**\n * \"Master Partner programme\" section — headline and intro copy beside a\n * foreground image, a desktop-only coral CTA placed after the copy and\n * before the numbered steps, and a full-width row of numbered \"how it\n * works\" steps underneath. Modeled after the \"Master Partner programme\"\n * block on https://deriv.com/partners.\n *\n * Mobile/tablet (<992px): single column (content, then image), steps stack\n * to 1-2 columns, and the CTA button is hidden.\n * Desktop (≥992px): content and image sit side by side, the CTA button\n * becomes visible right after the copy, and steps lay out in a single row.\n */\nexport const MasterPartner = ({\n title,\n description,\n note,\n closingText,\n ctaLabel,\n ctaHref,\n onCtaClick,\n image,\n imageAlt = \"\",\n steps,\n}: MasterPartnerProps) => {\n const ctaButton = <Button colorScheme=\"coral\" variant=\"primary\" label={ctaLabel} onClick={onCtaClick} />;\n\n return (\n <section className=\"master-partner\">\n <div className=\"master-partner__container\">\n <div className=\"master-partner__top\">\n <div className=\"master-partner__content\">\n <h2 className=\"master-partner__title\">{title}</h2>\n\n <div className=\"master-partner__copy\">\n <p className=\"master-partner__paragraph\">{description}</p>\n {note && (\n <p className=\"master-partner__paragraph\">\n <strong>{note.label}</strong> {note.text}\n </p>\n )}\n {closingText && (\n <p className=\"master-partner__paragraph\">{closingText}</p>\n )}\n </div>\n\n {ctaLabel && (\n <div className=\"master-partner__cta\">\n {ctaHref ? <a href={ctaHref}>{ctaButton}</a> : ctaButton}\n </div>\n )}\n </div>\n\n <div className=\"master-partner__image-wrapper\">\n <img\n className=\"master-partner__image\"\n src={image}\n alt={imageAlt}\n loading=\"lazy\"\n />\n </div>\n </div>\n\n <ol className=\"master-partner__steps\">\n {steps.map((step, index) => (\n <li className=\"master-partner__step\" key={index}>\n <img\n className=\"master-partner__step-icon\"\n src={step.icon}\n alt={step.iconAlt ?? \"\"}\n aria-hidden=\"true\"\n width={32}\n height={32}\n loading=\"lazy\"\n />\n <p className=\"master-partner__step-description\">{step.description}</p>\n </li>\n ))}\n </ol>\n </div>\n </section>\n );\n};\n\nexport default MasterPartner;\n","import type { ResourceBannerLink, ResourceBannerProps } from \"./ResourceBanner.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./ResourceBanner.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ──\n * `title` / `description` are inlined as literals in the destructuring\n * below rather than referenced through a const, so the registry\n * generator can read them and `validate:registry` can verify the\n * documented defaults against the code. */\n\nconst DEFAULT_LINKS: ResourceBannerLink[] = [{ label: \"Learn more\", href: \"#\" }];\n\n/**\n * Real deriv.com copy, exported for consumers who want to reproduce the\n * exact reference section (deriv.com/fraud-prevention → `.section_fraud_resources`).\n *\n * Opt-in only — the component's defaults and the Storybook stories both use\n * generic placeholder copy (design-system Rule 6). Import this when you want\n * the reference content specifically; don't treat it as the template's content.\n */\nexport const RESOURCE_BANNER_DERIV_CONTENT = {\n title: \"Learn more about staying safe\",\n description:\n \"Read our guide on secure and responsible trading for more on protecting your account.\",\n links: [\n {\n id: \"responsible\",\n label: \"Secure and responsible trading\",\n href: \"/responsible\",\n external: true,\n },\n ] as ResourceBannerLink[],\n};\n\n/* ── External-link icon ────────────────────────────────────────\n * Stands in for the reference site's Font Awesome glyph (U+E09F,\n * \"arrow-up-right-from-square\"). Inlined as SVG because the design\n * system does not depend on an icon font. */\n\nconst ExternalLinkIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4.5 11.5 11.5 4.5M5.5 4.5h6v6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ── ResourceBanner ───────────────────────────────────────────── */\n\nexport const ResourceBanner = ({\n title = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n links,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: ResourceBannerProps) => {\n const resolvedLinks = links && links.length > 0 ? links : DEFAULT_LINKS;\n\n const rootClass = [\"rsb\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"rsb__inner\">\n <div className=\"rsb__card\">\n <div className=\"rsb__grid\">\n <div className=\"rsb__content\">\n <HeadingTag className=\"rsb__title\">{title}</HeadingTag>\n {description && <p className=\"rsb__description\">{description}</p>}\n </div>\n\n <ul className=\"rsb__links\">\n {resolvedLinks.map((link, i) => {\n const isExternal = link.external ?? true;\n return (\n <li key={link.id ?? i} className=\"rsb__links-item\">\n <Link\n className=\"rsb__link\"\n colorScheme=\"white\"\n href={link.href}\n label={link.label}\n icon={isExternal ? <ExternalLinkIcon /> : undefined}\n iconPosition=\"right\"\n showChevron={!isExternal}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n />\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ResourceBanner;\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type Dispatch,\n type KeyboardEvent as ReactKeyboardEvent,\n type SetStateAction,\n} from \"react\";\nimport { DotLottieInView } from \"../../components/DotLottieInView\";\nimport { Tabs } from \"../../components/Tabs\";\nimport type {\n OptionsTypesAnimation,\n OptionsTypesIcon,\n OptionsTypesItem,\n OptionsTypesMetaItem,\n OptionsTypesProps,\n} from \"./OptionsTypes.types\";\nimport \"./OptionsTypes.css\";\n\nexport const OPTIONS_TYPES_PLACEHOLDER_ITEMS: OptionsTypesItem[] = [\n {\n id: \"option-type\",\n title: \"Option type\",\n description: \"Explain how this option type works and when a customer might use it.\",\n animations: [],\n markets: [{ label: \"Market\" }],\n platforms: [{ label: \"Platform\" }],\n },\n];\n\nfunction safeHref(value?: string): string | null {\n if (!value) return null;\n if (value.startsWith(\"/\") && !value.startsWith(\"//\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction safeLottieSrc(value: string): string | null {\n const href = safeHref(value);\n if (!href) return null;\n try {\n const pathname = href.startsWith(\"/\") ? href : new URL(href).pathname;\n return pathname.toLowerCase().endsWith(\".lottie\") ? href : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Market glyphs, traced from the icons the reference pages embed inline. They\n * are filled rather than stroked and share the source 25x24 viewBox.\n */\nconst iconPaths: Partial<Record<OptionsTypesIcon, string[]>> = {\n forex: [\n \"M9.7002 10H7.7002V8H13.2002C14.0302 8 14.7002 7.33 14.7002 6.5V5.5C14.7002 4.67 14.0302 4 13.2002 4H6.2002C4.8202 4 3.7002 5.12 3.7002 6.5V18.5C3.7002 19.33 4.3702 20 5.2002 20H6.2002C7.0302 20 7.7002 19.33 7.7002 18.5V14H9.7002C10.8002 14 11.7002 13.1 11.7002 12C11.7002 10.9 10.8002 10 9.7002 10ZM9.7002 13H7.2002C6.9202 13 6.7002 13.22 6.7002 13.5V18.5C6.7002 18.78 6.4802 19 6.2002 19H5.2002C4.9202 19 4.7002 18.78 4.7002 18.5V6.5C4.7002 5.67 5.3702 5 6.2002 5H13.2002C13.4802 5 13.7002 5.22 13.7002 5.5V6.5C13.7002 6.78 13.4802 7 13.2002 7H7.2002C6.9202 7 6.7002 7.22 6.7002 7.5V10.5C6.7002 10.78 6.9202 11 7.2002 11H9.7002C10.2502 11 10.7002 11.45 10.7002 12C10.7002 12.55 10.2502 13 9.7002 13Z\",\n \"M20.9902 9.72C20.7202 9.27 20.2402 9 19.7102 9H18.5002C17.9402 9 17.4302 9.31 17.1702 9.81L16.9202 10.3L16.6702 9.81C16.4102 9.31 15.9002 9 15.3402 9H14.1302C13.6002 9 13.1202 9.27 12.8502 9.72C12.5802 10.17 12.5602 10.72 12.8002 11.19L14.6302 14.71L13.0202 17.8C12.7802 18.27 12.7902 18.82 13.0702 19.27C13.3502 19.72 13.8202 19.99 14.3502 19.99H15.5602C16.1202 19.99 16.6302 19.68 16.8902 19.18L16.9202 19.12L16.9502 19.18C17.2102 19.68 17.7202 19.99 18.2802 19.99H19.4902C20.0202 19.99 20.5002 19.72 20.7702 19.27C21.0402 18.82 21.0602 18.27 20.8202 17.8L19.2102 14.71L21.0402 11.19C21.2802 10.72 21.2702 10.17 20.9902 9.72ZM20.1502 10.73L18.2002 14.48C18.1202 14.62 18.1202 14.8 18.2002 14.94L19.9302 18.27C20.0502 18.5 19.9602 18.69 19.9102 18.76C19.8702 18.83 19.7402 19 19.4802 19H18.2702C18.0802 19 17.9102 18.9 17.8302 18.73L17.3602 17.82C17.2702 17.65 17.1002 17.55 16.9202 17.55C16.7402 17.55 16.5602 17.65 16.4802 17.82L16.0102 18.73C15.9202 18.9 15.7502 19 15.5702 19H14.3602C14.1102 19 13.9802 18.83 13.9302 18.76C13.8902 18.69 13.8002 18.5 13.9102 18.27L15.6402 14.94C15.7202 14.8 15.7202 14.62 15.6402 14.48L13.6902 10.73C13.5702 10.51 13.6602 10.31 13.7102 10.24C13.7602 10.17 13.8802 10 14.1402 10H15.3502C15.5402 10 15.7102 10.1 15.7902 10.27L16.4902 11.61C16.6602 11.94 17.2002 11.94 17.3802 11.61L18.0802 10.27C18.1702 10.1 18.3402 10 18.5202 10H19.7302C19.9802 10 20.1102 10.17 20.1602 10.24C20.2102 10.31 20.2902 10.5 20.1802 10.73H20.1502Z\",\n ],\n \"stock-indices\": [\n \"M19 10.5H18C17.17 10.5 16.5 11.17 16.5 12V19C16.5 19.83 17.17 20.5 18 20.5H19C19.83 20.5 20.5 19.83 20.5 19V12C20.5 11.17 19.83 10.5 19 10.5ZM19.5 19C19.5 19.28 19.28 19.5 19 19.5H18C17.72 19.5 17.5 19.28 17.5 19V12C17.5 11.72 17.72 11.5 18 11.5H19C19.28 11.5 19.5 11.72 19.5 12V19Z\",\n \"M13 13.5H12C11.17 13.5 10.5 14.17 10.5 15V19C10.5 19.83 11.17 20.5 12 20.5H13C13.83 20.5 14.5 19.83 14.5 19V15C14.5 14.17 13.83 13.5 13 13.5ZM13.5 19C13.5 19.28 13.28 19.5 13 19.5H12C11.72 19.5 11.5 19.28 11.5 19V15C11.5 14.72 11.72 14.5 12 14.5H13C13.28 14.5 13.5 14.72 13.5 15V19Z\",\n \"M7 15.5H6C5.17 15.5 4.5 16.17 4.5 17V19C4.5 19.83 5.17 20.5 6 20.5H7C7.83 20.5 8.5 19.83 8.5 19V17C8.5 16.17 7.83 15.5 7 15.5ZM7.5 19C7.5 19.28 7.28 19.5 7 19.5H6C5.72 19.5 5.5 19.28 5.5 19V17C5.5 16.72 5.72 16.5 6 16.5H7C7.28 16.5 7.5 16.72 7.5 17V19Z\",\n \"M21.47 3.85C21.47 3.85 21.47 3.82 21.46 3.8C21.46 3.78 21.44 3.77 21.43 3.75C21.41 3.71 21.38 3.67 21.35 3.64C21.33 3.63 21.31 3.62 21.3 3.61C21.27 3.58 21.23 3.56 21.19 3.54C21.16 3.53 21.12 3.52 21.08 3.52C21.05 3.52 21.03 3.5 21 3.5H18C17.72 3.5 17.5 3.72 17.5 4C17.5 4.28 17.72 4.5 18 4.5H19.76C17.68 6.51 15.34 8.22 12.77 9.56C9.98996 11 7.00996 11.99 3.91996 12.51C3.64996 12.56 3.45996 12.81 3.50996 13.09C3.54996 13.33 3.75996 13.51 3.99996 13.51C4.02996 13.51 4.05996 13.51 4.07996 13.51C7.27996 12.98 10.36 11.95 13.23 10.46C15.91 9.07 18.34 7.29 20.5 5.19V7.01C20.5 7.29 20.72 7.51 21 7.51C21.28 7.51 21.5 7.29 21.5 7.01V4.01C21.5 3.96 21.49 3.91 21.47 3.87V3.85Z\",\n ],\n commodities: [\n \"M21.9703 17.33L20.1803 12.48C19.9603 11.89 19.4003 11.5 18.7703 11.5H17.3403L15.6803 6.98C15.4603 6.39 14.9003 6 14.2703 6H10.7203C10.0903 6 9.53031 6.39 9.31031 6.98L7.64031 11.5H6.21031C5.58031 11.5 5.02031 11.89 4.80031 12.48L3.01031 17.33C2.95031 17.48 2.97031 17.65 3.07031 17.79C3.16031 17.92 3.32031 18 3.48031 18H21.5003C21.6603 18 21.8203 17.92 21.9103 17.79C22.0003 17.66 22.0303 17.48 21.9703 17.33ZM10.2603 7.33C10.3303 7.13 10.5203 7 10.7303 7H14.2803C14.4903 7 14.6803 7.13 14.7503 7.33L16.2903 11.5H8.72031L10.2603 7.33ZM12.5003 16.06L11.1903 12.5H13.8103L12.5003 16.06ZM4.22031 17L5.76031 12.83C5.83031 12.63 6.02031 12.5 6.23031 12.5H9.78031C9.99031 12.5 10.1803 12.63 10.2503 12.83L11.7903 17H4.22031ZM13.2203 17L14.7603 12.83C14.8303 12.63 15.0203 12.5 15.2303 12.5H18.7803C18.9903 12.5 19.1803 12.63 19.2503 12.83L20.7903 17H13.2203Z\",\n ],\n \"derived-indices\": [\n \"M12.5 2.5C7.26 2.5 3 6.76 3 12C3 17.24 7.26 21.5 12.5 21.5C17.74 21.5 22 17.24 22 12C22 6.76 17.74 2.5 12.5 2.5ZM12.5 20.5C11.62 20.5 10.68 19.03 10.12 16.63C10.89 16.55 11.69 16.5 12.5 16.5C13.31 16.5 14.11 16.55 14.88 16.63C14.32 19.02 13.38 20.5 12.5 20.5ZM12.5 15.5C11.61 15.5 10.75 15.55 9.92 15.65C9.76 14.7 9.66 13.65 9.63 12.5H15.36C15.34 13.64 15.24 14.7 15.07 15.65C14.24 15.56 13.38 15.5 12.49 15.5H12.5ZM12.5 3.5C13.38 3.5 14.32 4.97 14.88 7.37C14.11 7.45 13.31 7.5 12.5 7.5C11.69 7.5 10.89 7.45 10.12 7.37C10.68 4.98 11.62 3.5 12.5 3.5ZM12.5 8.5C13.39 8.5 14.25 8.45 15.08 8.35C15.24 9.3 15.34 10.35 15.37 11.5H9.64C9.66 10.36 9.76 9.3 9.93 8.35C10.76 8.44 11.62 8.5 12.51 8.5H12.5ZM4.03 11.5C4.12 9.92 4.64 8.46 5.48 7.23C6.44 7.67 7.63 8 8.95 8.22C8.77 9.27 8.67 10.39 8.65 11.5H4.03ZM8.63 12.5C8.65 13.61 8.76 14.73 8.93 15.78C7.61 16 6.43 16.33 5.46 16.77C4.62 15.54 4.11 14.07 4.01 12.5H8.63ZM20.97 12.5C20.88 14.08 20.36 15.54 19.52 16.77C18.56 16.33 17.37 16 16.05 15.78C16.23 14.73 16.33 13.61 16.35 12.5H20.97ZM16.36 11.5C16.34 10.39 16.23 9.27 16.06 8.22C17.38 8 18.56 7.67 19.53 7.23C20.37 8.46 20.88 9.93 20.98 11.5H16.36ZM18.89 6.42C18.04 6.77 17.01 7.05 15.86 7.23C15.54 5.83 15.08 4.6 14.48 3.74C16.22 4.16 17.75 5.11 18.89 6.41V6.42ZM10.51 3.74C9.91 4.59 9.45 5.82 9.13 7.23C7.99 7.05 6.95 6.77 6.1 6.42C7.24 5.12 8.77 4.16 10.51 3.75V3.74ZM6.1 17.58C6.95 17.23 7.98 16.95 9.13 16.77C9.45 18.17 9.91 19.4 10.51 20.26C8.77 19.84 7.24 18.89 6.1 17.59V17.58ZM14.49 20.25C15.09 19.4 15.55 18.17 15.87 16.76C17.01 16.94 18.05 17.22 18.9 17.57C17.76 18.87 16.23 19.83 14.49 20.24V20.25Z\",\n ],\n cryptocurrencies: [\n \"M12.49 2.50977C7.26 2.50977 3 6.75977 3 11.9998C3 17.2398 7.26 21.4898 12.49 21.4898C17.72 21.4898 21.99 17.2298 21.99 11.9998C21.99 6.76977 17.73 2.50977 12.49 2.50977ZM12.49 20.4998C7.81 20.4998 4 16.6898 4 12.0098C4 7.32977 7.81 3.50977 12.49 3.50977C17.17 3.50977 20.99 7.31977 20.99 11.9998C20.99 16.6798 17.18 20.4898 12.49 20.4898V20.4998Z\",\n \"M15.05 11.9098C15.33 11.5698 15.51 11.1398 15.51 10.6698C15.51 9.76977 14.89 9.00977 14.06 8.78977V6.99977C14.06 6.71977 13.84 6.49977 13.56 6.49977C13.28 6.49977 13.06 6.71977 13.06 6.99977V8.71977H12.12V6.99977C12.12 6.71977 11.9 6.49977 11.62 6.49977C11.34 6.49977 11.12 6.71977 11.12 6.99977V8.71977C10.31 8.74977 9.67 9.39977 9.67 10.2198V14.0298C9.67 14.8398 10.32 15.4998 11.12 15.5298V16.9998C11.12 17.2798 11.34 17.4998 11.62 17.4998C11.9 17.4998 12.12 17.2798 12.12 16.9998V15.5298H13.06V16.9998C13.06 17.2798 13.28 17.4998 13.56 17.4998C13.84 17.4998 14.06 17.2798 14.06 16.9998V15.5298C15.13 15.5298 16 14.6498 16 13.5798C16 12.8698 15.62 12.2598 15.06 11.9198L15.05 11.9098ZM11.17 9.70977H13.56C14.09 9.70977 14.51 10.1398 14.51 10.6598C14.51 11.1798 14.08 11.6098 13.56 11.6098H10.67V10.1998C10.67 9.91977 10.89 9.69977 11.17 9.69977V9.70977ZM14.05 14.5198H11.17C10.89 14.5198 10.67 14.2998 10.67 14.0198V12.6098H14.05C14.58 12.6098 15 13.0398 15 13.5598C15 14.0798 14.57 14.5098 14.05 14.5098V14.5198Z\",\n ],\n};\n\nfunction MetaIcon({ icon, iconUrl }: { icon?: OptionsTypesIcon; iconUrl?: string }) {\n // A CMS-hosted glyph always wins, since it is the artwork the page ships.\n const imageSrc = safeHref(iconUrl);\n if (imageSrc) {\n return (\n <img\n className=\"ot__meta-image\"\n src={imageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n }\n if (!icon) return null;\n const paths = iconPaths[icon];\n if (!paths) {\n const initials =\n icon === \"deriv-trader\" ? \"DT\" : icon === \"deriv-bot\" ? \"DB\" : \"ST\";\n return <span className=\"ot__platform-icon\" aria-hidden=\"true\">{initials}</span>;\n }\n return (\n <svg className=\"ot__meta-icon\" viewBox=\"0 0 25 24\" fill=\"none\" aria-hidden=\"true\">\n {paths.map((d) => (\n <path key={d} d={d} fill=\"currentColor\" />\n ))}\n </svg>\n );\n}\n\nfunction MetaList({ items = [] }: { items?: OptionsTypesMetaItem[] }) {\n return (\n <ul className=\"ot__meta-list\">\n {items.map((item, index) => {\n const href = safeHref(item.href);\n const content = (\n <>\n <MetaIcon icon={item.icon} iconUrl={item.iconUrl} />\n <span>{item.label}</span>\n </>\n );\n return (\n <li key={`${item.label}-${index}`}>\n {href ? <a href={href}>{content}</a> : <span>{content}</span>}\n </li>\n );\n })}\n </ul>\n );\n}\n\nfunction PlaybackGlyph({ playing }: { playing: boolean }) {\n return (\n <svg className=\"ot__control-icon\" viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n <circle className=\"ot__control-disc\" cx=\"32\" cy=\"32\" r=\"32\" />\n {playing ? (\n <>\n <rect className=\"ot__control-glyph\" x=\"23\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n <rect className=\"ot__control-glyph\" x=\"35\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n </>\n ) : (\n <path\n className=\"ot__control-glyph\"\n d=\"M26.5058 19.9527L42.7058 29.8527C43.4933 30.359 43.9996 31.259 43.9996 32.159C43.9996 33.1152 43.4933 34.0152 42.7058 34.4652L26.5058 44.3652C25.6621 44.8715 24.5933 44.9277 23.7496 44.4215C22.9058 43.9715 22.3996 43.0715 22.3996 42.059V22.259C22.3996 21.3027 22.9058 20.4027 23.7496 19.9527C24.5933 19.4465 25.6621 19.4465 26.5058 19.9527Z\"\n />\n )}\n </svg>\n );\n}\n\ninterface AnimationCardProps {\n animation: OptionsTypesAnimation;\n itemId: string;\n playing: boolean;\n onToggle: () => void;\n}\n\nfunction AnimationCard({\n animation,\n itemId,\n playing,\n onToggle,\n}: AnimationCardProps) {\n const src = safeLottieSrc(animation.src);\n const posterSrc = safeHref(animation.posterUrl);\n const controlId = `ot-animation-${itemId}-${animation.id ?? animation.label}`\n .replace(/[^a-zA-Z0-9_-]/g, \"-\");\n\n return (\n <div className=\"ot__animation-card\">\n {/* The artwork carries its own background and outcome label, so the\n card adds no text of its own — `label` names the control instead. */}\n <div id={controlId} className=\"ot__animation-media\" aria-hidden=\"true\">\n {src ? (\n <DotLottieInView\n src={src}\n enabled={playing}\n loop\n poster={\n posterSrc ? (\n <img src={posterSrc} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n ) : undefined\n }\n />\n ) : null}\n </div>\n {posterSrc && !playing ? (\n <img\n className=\"ot__animation-poster\"\n src={posterSrc}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : null}\n {src ? (\n <button\n type=\"button\"\n className={`ot__playback-toggle${playing ? \" ot__playback-toggle--playing\" : \"\"}`}\n aria-controls={controlId}\n aria-pressed={playing}\n aria-label={`${playing ? \"Pause\" : \"Play\"} ${animation.label} animation`}\n onClick={onToggle}\n >\n <PlaybackGlyph playing={playing} />\n </button>\n ) : null}\n </div>\n );\n}\n\ninterface OptionPanelProps {\n item: OptionsTypesItem;\n variant: \"tabs\" | \"single\";\n marketsLabel: string;\n platformsLabel: string;\n playing: Record<string, boolean>;\n setPlaying: Dispatch<SetStateAction<Record<string, boolean>>>;\n}\n\nfunction OptionPanel({\n item,\n variant,\n marketsLabel,\n platformsLabel,\n playing,\n setPlaying,\n}: OptionPanelProps) {\n const description = (\n <div className=\"ot__description\">\n <p>{item.description}</p>\n </div>\n );\n\n const animations = (\n <div className={`ot__animations ot__animations--${Math.min(item.animations.length, 2)}`}>\n {item.animations.slice(0, 2).map((animation, index) => {\n const key = `${item.id}-${animation.id ?? index}`;\n return (\n <AnimationCard\n key={key}\n animation={animation}\n itemId={item.id}\n playing={Boolean(playing[key])}\n onToggle={() =>\n setPlaying((current) => ({\n ...current,\n [key]: !current[key],\n }))\n }\n />\n );\n })}\n </div>\n );\n\n const metadata = (\n <div className=\"ot__metadata\">\n <div className=\"ot__meta-group\">\n <h4>{marketsLabel}</h4>\n <MetaList items={item.markets} />\n </div>\n <div className=\"ot__meta-group\">\n <h4>{platformsLabel}</h4>\n <MetaList items={item.platforms} />\n </div>\n </div>\n );\n\n /**\n * The reference pages choose the layout by how many animations an option\n * has, not by whether tabs are present: a lone animation sits beside its\n * copy, while a pair sits under centred copy with the availability lists\n * below. Tabbed pages always show pairs, so they always stack.\n */\n const layout =\n variant === \"single\" && item.animations.length === 1 ? \"split\" : \"stacked\";\n const optionClass = `ot__option ot__option--${variant} ot__option--${layout}`;\n\n if (layout === \"split\") {\n return (\n <div className={optionClass}>\n {animations}\n {/* Collapses to `display: contents` below the split so the stacked\n order becomes copy, media, availability. */}\n <div className=\"ot__option-side\">\n {description}\n {metadata}\n </div>\n </div>\n );\n }\n\n return (\n <div className={optionClass}>\n {description}\n {animations}\n {metadata}\n </div>\n );\n}\n\ninterface TogglePanelProps {\n item: OptionsTypesItem;\n idPrefix: string;\n marketsLabel: string;\n platformsLabel: string;\n playing: Record<string, boolean>;\n setPlaying: Dispatch<SetStateAction<Record<string, boolean>>>;\n}\n\n/**\n * One option shown as a single media well whose animation is swapped by an\n * icon switch sitting directly above the card heading.\n *\n * The reference section positions that switch absolutely and reserves room for\n * it with an empty 72px spacer. Both are avoidable: the switch is simply the\n * first thing in the copy column, which puts it above the heading on desktop\n * and between media and heading once the card stacks — the same result the\n * reference reaches the long way round.\n */\nfunction TogglePanel({\n item,\n idPrefix,\n marketsLabel,\n platformsLabel,\n playing,\n setPlaying,\n}: TogglePanelProps) {\n const animations = item.animations;\n const [activeIndex, setActiveIndex] = useState(0);\n const switchRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n /* Guard against a caller swapping the animation array out from under us. */\n const safeIndex = Math.min(activeIndex, Math.max(animations.length - 1, 0));\n\n /* Swapping the clip stops playback, so the incoming animation starts from\n its poster rather than mid-motion. */\n useEffect(() => {\n setPlaying({});\n }, [safeIndex, setPlaying]);\n\n const hasMarkets = Boolean(item.markets && item.markets.length > 0);\n const hasPlatforms = Boolean(item.platforms && item.platforms.length > 0);\n\n /* The reference switch is a pair of links with no keyboard handling at\n all. This is a real tablist: arrows wrap, Home/End jump. */\n const onSwitchKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const last = animations.length - 1;\n let next: number | null = null;\n\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n next = safeIndex === last ? 0 : safeIndex + 1;\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n next = safeIndex === 0 ? last : safeIndex - 1;\n } else if (event.key === \"Home\") {\n next = 0;\n } else if (event.key === \"End\") {\n next = last;\n }\n\n if (next === null) return;\n event.preventDefault();\n setActiveIndex(next);\n switchRefs.current[next]?.focus();\n };\n\n return (\n <div className=\"ot__option ot__option--toggle\">\n <div className=\"ot__toggle-media\">\n {/* A panel per animation so every switch's `aria-controls`\n resolves; only the active one builds its contents. */}\n {animations.map((animation, index) => {\n const key = `${item.id}-${animation.id ?? index}`;\n const isActive = index === safeIndex;\n\n return (\n <div\n key={key}\n className=\"ot__toggle-pane\"\n id={`${idPrefix}-media-${index}`}\n role=\"tabpanel\"\n aria-labelledby={`${idPrefix}-switch-${index}`}\n hidden={!isActive}\n >\n {isActive ? (\n <AnimationCard\n animation={animation}\n itemId={item.id}\n playing={Boolean(playing[key])}\n onToggle={() =>\n setPlaying((current) => ({\n ...current,\n [key]: !current[key],\n }))\n }\n />\n ) : null}\n </div>\n );\n })}\n </div>\n\n <div className=\"ot__toggle-side\">\n {animations.length > 1 ? (\n <div\n className=\"ot__toggle-switch\"\n role=\"tablist\"\n aria-label={`${item.title} views`}\n onKeyDown={onSwitchKeyDown}\n >\n {animations.map((animation, index) => {\n const isActive = index === safeIndex;\n const iconUrl = safeHref(animation.iconUrl);\n\n return (\n <button\n key={`${item.id}-switch-${animation.id ?? index}`}\n ref={(node) => {\n switchRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"tab\"\n id={`${idPrefix}-switch-${index}`}\n aria-controls={`${idPrefix}-media-${index}`}\n aria-selected={isActive}\n aria-label={animation.label}\n tabIndex={isActive ? 0 : -1}\n className={`ot__toggle-option${\n isActive ? \" ot__toggle-option--active\" : \"\"\n }`}\n onClick={() => setActiveIndex(index)}\n >\n {iconUrl ? (\n <img\n className=\"ot__toggle-icon\"\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : (\n <span className=\"ot__toggle-option-label\">\n {animation.label}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ) : null}\n\n <h3 className=\"ot__toggle-title\">{item.title}</h3>\n\n <div className=\"ot__description\">\n <p>{item.description}</p>\n </div>\n\n {/* The reference section carries no availability lists, so\n these render only when a caller supplies them. */}\n {hasMarkets || hasPlatforms ? (\n <div className=\"ot__metadata\">\n {hasMarkets ? (\n <div className=\"ot__meta-group\">\n <h4>{marketsLabel}</h4>\n <MetaList items={item.markets} />\n </div>\n ) : null}\n {hasPlatforms ? (\n <div className=\"ot__meta-group\">\n <h4>{platformsLabel}</h4>\n <MetaList items={item.platforms} />\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport function OptionsTypes({\n variant = \"tabs\",\n heading = \"Section title goes here\",\n headingLevel = \"h2\",\n items = OPTIONS_TYPES_PLACEHOLDER_ITEMS,\n defaultActiveId,\n activeId,\n onChange,\n marketsLabel = \"Markets available\",\n platformsLabel = \"Trade on\",\n disclaimer,\n className,\n ...props\n}: OptionsTypesProps) {\n const usableItems = Array.isArray(items) ? items.filter((item) => item?.id) : [];\n const [internalActiveId, setInternalActiveId] = useState(\n defaultActiveId ?? usableItems[0]?.id ?? \"\",\n );\n const selectedId =\n usableItems.find((item) => item.id === activeId)?.id ??\n usableItems.find((item) => item.id === internalActiveId)?.id ??\n usableItems[0]?.id ??\n \"\";\n const [playing, setPlaying] = useState<Record<string, boolean>>({});\n const generatedId = useId().replace(/:/g, \"\");\n const tabPrefix = `options-types-${generatedId}`;\n const Heading = headingLevel;\n\n useEffect(() => {\n setPlaying({});\n }, [selectedId]);\n\n const selectItem = (id: string) => {\n if (activeId === undefined) setInternalActiveId(id);\n onChange?.(id);\n };\n\n const rootClass = [\"ot\", `ot--${variant}`, className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"ot__inner\">\n <header className=\"ot__header\">\n <Heading className=\"ot__heading\">{heading}</Heading>\n {variant === \"tabs\" && usableItems.length > 1 ? (\n <Tabs\n items={usableItems.map((item) => ({\n id: item.id,\n label: item.label ?? item.title,\n }))}\n activeId={selectedId}\n onChange={selectItem}\n idPrefix={tabPrefix}\n aria-label={`${heading} categories`}\n className=\"ot__tabs\"\n />\n ) : null}\n </header>\n\n {usableItems.length === 0 ? null : variant === \"tabs\" ? (\n <div className=\"ot__panels\">\n {usableItems.map((item, index) => {\n const isActive = item.id === selectedId;\n return (\n <div\n key={item.id}\n id={`${tabPrefix}-panel-${index}`}\n role=\"tabpanel\"\n aria-labelledby={`${tabPrefix}-tab-${index}`}\n hidden={!isActive}\n tabIndex={0}\n >\n <OptionPanel\n item={item}\n variant=\"tabs\"\n marketsLabel={marketsLabel}\n platformsLabel={platformsLabel}\n playing={playing}\n setPlaying={setPlaying}\n />\n </div>\n );\n })}\n </div>\n ) : variant === \"toggle\" ? (\n <TogglePanel\n item={usableItems[0]}\n idPrefix={tabPrefix}\n marketsLabel={marketsLabel}\n platformsLabel={platformsLabel}\n playing={playing}\n setPlaying={setPlaying}\n />\n ) : (\n <OptionPanel\n item={usableItems[0]}\n variant=\"single\"\n marketsLabel={marketsLabel}\n platformsLabel={platformsLabel}\n playing={playing}\n setPlaying={setPlaying}\n />\n )}\n\n {disclaimer ? (\n <p className=\"ot__disclaimer\">\n <svg\n className=\"ot__disclaimer-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path\n d=\"M8 7v4.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"8\" cy=\"4.9\" r=\"0.85\" fill=\"currentColor\" />\n </svg>\n <span>{disclaimer}</span>\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n\nexport default OptionsTypes;\n","import type { OptionsTypesMetaItem, OptionsTypesProps } from \"./OptionsTypes.types\";\n\n/**\n * Animation paths match @deriv-web-design/lottie (`/lottie/trade-clips/...`).\n * Storybook serves packages/lottie/assets at /lottie. Icon SVGs remain on Webflow.\n */\nconst WEBFLOW_ICON_CDN = \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c2b7\";\nconst LOTTIE = \"/lottie/trade-clips\";\n\nconst FOREX: OptionsTypesMetaItem = {\n label: \"Forex\",\n icon: \"forex\",\n href: \"/markets/forex\",\n};\nconst STOCK_INDICES: OptionsTypesMetaItem = {\n label: \"Stock Indices\",\n icon: \"stock-indices\",\n href: \"/markets/stock-indices\",\n};\nconst COMMODITIES: OptionsTypesMetaItem = {\n label: \"Commodities\",\n icon: \"commodities\",\n href: \"/markets/commodities\",\n};\nconst DERIVED_INDICES: OptionsTypesMetaItem = {\n label: \"Derived Indices\",\n icon: \"derived-indices\",\n href: \"/markets/derived-indices/synthetic-indices\",\n};\nconst CRYPTOCURRENCIES: OptionsTypesMetaItem = {\n label: \"Cryptocurrencies\",\n icon: \"cryptocurrencies\",\n href: \"/markets/cryptocurrencies\",\n};\nconst DERIV_TRADER: OptionsTypesMetaItem = {\n label: \"Deriv Trader\",\n icon: \"deriv-trader\",\n iconUrl: `${WEBFLOW_ICON_CDN}/68e3a18f20e4f9f6eb9109e8_6751d07ab72617a385122395_deriv%2520product-deriv%2520trader.svg`,\n href: \"/trading-platforms/deriv-trader\",\n};\nconst DERIV_BOT: OptionsTypesMetaItem = {\n label: \"Deriv Bot\",\n icon: \"deriv-bot\",\n iconUrl: `${WEBFLOW_ICON_CDN}/68e3a18f42c1592e9454466e_674992f6dd562e5f0b8e7679_deriv%2520product-deriv%2520bot.svg`,\n href: \"/trading-platforms/deriv-bot\",\n};\n\nconst DIGITAL_MARKETS = [FOREX, STOCK_INDICES, COMMODITIES, DERIVED_INDICES];\nconst TRADER_AND_BOT = [DERIV_TRADER, DERIV_BOT];\n\nexport const OPTIONS_TYPES_DIGITAL_CONTENT: OptionsTypesProps = {\n variant: \"tabs\",\n heading: \"Types of Digital Options\",\n defaultActiveId: \"rise-fall\",\n disclaimer: \"Trade types and features offered may vary by platform and device.\",\n items: [\n {\n id: \"rise-fall\",\n title: \"Rise/Fall\",\n description:\n \"Predict whether the market price will rise above or fall below the entry price at the end of your contract.\",\n animations: [\n {\n id: \"rise\",\n label: \"Rise\",\n src: `${LOTTIE}/rise.lottie`,\n },\n {\n id: \"fall\",\n label: \"Fall\",\n src: `${LOTTIE}/fall.lottie`,\n },\n ],\n markets: DIGITAL_MARKETS,\n platforms: TRADER_AND_BOT,\n },\n {\n id: \"higher-lower\",\n title: \"Higher/Lower\",\n description:\n \"Choose a target price at the start (barrier), and predict if the final price will be higher or lower than barrier.\",\n animations: [\n {\n id: \"higher\",\n label: \"Higher\",\n src: `${LOTTIE}/higher.lottie`,\n },\n {\n id: \"lower\",\n label: \"Lower\",\n src: `${LOTTIE}/lower.lottie`,\n },\n ],\n markets: DIGITAL_MARKETS,\n platforms: TRADER_AND_BOT,\n },\n {\n id: \"touch-no-touch\",\n title: \"Touch/No Touch\",\n description:\n 'Predict whether the market price will \"touch\" or not touch a target price (barrier) during the contract period.',\n animations: [\n {\n id: \"touch\",\n label: \"Touch\",\n src: `${LOTTIE}/touch.lottie`,\n },\n {\n id: \"no-touch\",\n label: \"No Touch\",\n src: `${LOTTIE}/no-touch.lottie`,\n },\n ],\n markets: DIGITAL_MARKETS,\n platforms: TRADER_AND_BOT,\n },\n ],\n};\n\nexport const OPTIONS_TYPES_ACCUMULATOR_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Accumulator Options work\",\n items: [\n {\n id: \"accumulator-options\",\n title: \"Accumulator Options\",\n description:\n \"Set a growth rate between 1–5% and see if the market price stays within a defined range from the previous spot price. Your payout grows exponentially based on the growth rate you choose. Keep in mind: higher growth rates mean narrower ranges for price movements.\",\n animations: [\n {\n id: \"accumulator\",\n label: \"Accumulator\",\n src: `${LOTTIE}/accumulator.lottie`,\n },\n ],\n markets: [DERIVED_INDICES],\n platforms: TRADER_AND_BOT,\n },\n ],\n};\n\nexport const OPTIONS_TYPES_VANILLA_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Vanilla Options work\",\n items: [\n {\n id: \"vanilla-call-put\",\n title: \"Vanilla Call/Put\",\n description:\n \"Choose a strike price and decide your position. Open a Call position if you expect the price to rise above the strike price, or a Put position if you think it will fall below it. With fixed expiry times, this provides precise price level trading.\",\n animations: [\n {\n id: \"call\",\n label: \"Call\",\n src: `${LOTTIE}/vanilla-call.lottie`,\n },\n {\n id: \"put\",\n label: \"Put\",\n src: `${LOTTIE}/vanilla-put.lottie`,\n },\n ],\n markets: [DERIVED_INDICES],\n platforms: [DERIV_TRADER],\n },\n ],\n};\n\nexport const OPTIONS_TYPES_TURBO_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Turbo Options work\",\n items: [\n {\n id: \"turbo-long-short\",\n title: \"Turbo Long/Short\",\n description:\n \"Decide whether the market price will stay above (Long) or drop below (Short) a set barrier. Your payout adjusts based on how far the price moves in your chosen direction, letting you take advantage of both rising and falling markets.\",\n animations: [\n {\n id: \"long\",\n label: \"Long\",\n src: `${LOTTIE}/turbo-long.lottie`,\n },\n {\n id: \"short\",\n label: \"Short\",\n src: `${LOTTIE}/turbo-short.lottie`,\n },\n ],\n markets: [DERIVED_INDICES],\n platforms: [DERIV_TRADER],\n },\n ],\n};\n\nexport const OPTIONS_TYPES_MULTIPLIERS_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Multipliers work\",\n items: [\n {\n id: \"multipliers-up-down\",\n title: \"Multipliers Up/Down\",\n description:\n \"Select whether you expect the price to rise (Up) or fall (Down). Your multiplier will help amplify any potential gains. The more the market moves in your predicted direction, the greater your potential payout.\",\n animations: [\n {\n id: \"up\",\n label: \"Up\",\n src: `${LOTTIE}/multipliers-up.lottie`,\n },\n {\n id: \"down\",\n label: \"Down\",\n src: `${LOTTIE}/multipliers-down.lottie`,\n },\n ],\n markets: [DERIVED_INDICES, FOREX, CRYPTOCURRENCIES, COMMODITIES],\n platforms: TRADER_AND_BOT,\n },\n ],\n};\n\n/**\n * EU multipliers — `.section_multipliers_types` on\n * deriv.com/eu/trade/multipliers.\n *\n * The EU section differs from the ROW one above in three ways: the two clips\n * are two views of one idea rather than two things to show at once, so they\n * share a single well behind an Up/Down switch (`variant: \"toggle\"`); the card\n * carries its own heading; and there are no availability lists.\n */\nexport const OPTIONS_TYPES_EU_MULTIPLIERS_CONTENT: OptionsTypesProps = {\n variant: \"toggle\",\n heading: \"How do multipliers work\",\n items: [\n {\n id: \"eu-multipliers\",\n title: \"Multipliers\",\n description:\n \"Choose a multiplier (up to 30x) and predict if the market price will go up or down compared to the entry price. Your potential payout grows the further the market price moves in your predicted direction, boosted by the multiplier. Losses are limited to the initial amount you put into the contract.\",\n animations: [\n {\n id: \"up\",\n label: \"Up\",\n src: `${LOTTIE}/multipliers-up.lottie`,\n iconUrl: `${WEBFLOW_ICON_CDN}/68e4859893e33d078096e151_66585fe0e1dc7e70cc75dec1_multipliers-up-sm.svg`,\n },\n {\n id: \"down\",\n label: \"Down\",\n src: `${LOTTIE}/multipliers-down.lottie`,\n iconUrl: `${WEBFLOW_ICON_CDN}/68e4859893e33d078096e155_66585fe0e1dc7e70cc75dee8_multipliers-down-sm.svg`,\n },\n ],\n },\n ],\n};\n","import type { EntityInfoSectionLink, EntityInfoSectionProps } from \"./EntityInfoSection.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./EntityInfoSection.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ──\n * `name` / `description` are inlined as literals in the destructuring below\n * rather than referenced through a const, so the registry generator can read\n * them and `validate:registry` can verify the documented defaults. */\n\nconst DEFAULT_LINKS: EntityInfoSectionLink[] = [{ label: \"View licence\", href: \"#\" }];\n\n/* ── EntityInfoSection ─────────────────────────────────────────── */\n\nexport const EntityInfoSection = ({\n name = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n bullets,\n links,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: EntityInfoSectionProps) => {\n const resolvedLinks = links && links.length > 0 ? links : DEFAULT_LINKS;\n const hasBullets = !!bullets && bullets.length > 0;\n\n const rootClass = [\"eis\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"eis__inner\">\n <div className=\"eis__content\">\n <HeadingTag className=\"eis__name\">{name}</HeadingTag>\n\n {description && <p className=\"eis__description\">{description}</p>}\n\n {hasBullets && (\n <ul className=\"eis__bullets\">\n {bullets!.map((bullet, i) => (\n <li key={i} className=\"eis__bullets-item\">\n {bullet}\n </li>\n ))}\n </ul>\n )}\n\n {resolvedLinks.length > 0 && (\n <ul className=\"eis__links\">\n {resolvedLinks.map((link, i) => {\n const isExternal = link.external ?? true;\n return (\n <li key={link.id ?? i} className=\"eis__links-item\">\n <Link\n className=\"eis__link\"\n colorScheme=\"coral\"\n href={link.href}\n label={link.label}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n />\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default EntityInfoSection;\n","import type { CountryLinkGridItem, CountryLinkGridProps } from \"./CountryLinkGrid.types\";\nimport \"./CountryLinkGrid.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ──\n * `title` / `description` are inlined as literals in the destructuring below\n * rather than referenced through a const, so the registry generator can read\n * them and `validate:registry` can verify the documented defaults.\n *\n * No real country list is baked in — the placeholder items are numbered\n * \"Country name\" entries and carry no flag sources. */\n\nconst DEFAULT_ITEMS: CountryLinkGridItem[] = [\n { label: \"Country name\", href: \"#\" },\n { label: \"Country name\", href: \"#\" },\n { label: \"Country name\", href: \"#\" },\n { label: \"Country name\", href: \"#\" },\n];\n\n/* ── CountryLinkGrid ───────────────────────────────────────────── */\n\nexport const CountryLinkGrid = ({\n title = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n items,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: CountryLinkGridProps) => {\n const resolvedItems = items && items.length > 0 ? items : DEFAULT_ITEMS;\n\n const rootClass = [\"clg\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"clg__inner\">\n <div className=\"clg__layout\">\n <div className=\"clg__header\">\n <HeadingTag className=\"clg__title\">{title}</HeadingTag>\n\n {description && <p className=\"clg__description\">{description}</p>}\n </div>\n\n {resolvedItems.length > 0 && (\n <ul className=\"clg__list\">\n {resolvedItems.map((item, i) => {\n const isExternal = item.external ?? true;\n return (\n <li key={item.id ?? i} className=\"clg__item\">\n {/* Plain anchor, not the shared `Link`: the whole\n row (flag + name) is the click target, there is\n no chevron, and the label must wrap. */}\n <a\n className=\"clg__link\"\n href={item.href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n {item.iconSrc && (\n <img\n className=\"clg__flag\"\n src={item.iconSrc}\n alt={item.iconAlt ?? \"\"}\n loading=\"lazy\"\n width={36}\n height={24}\n />\n )}\n <span className=\"clg__text\">{item.label}</span>\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default CountryLinkGrid;\n","import { useState } from \"react\";\nimport type { MouseEvent } from \"react\";\nimport type {\n DocumentChipsDocument,\n DocumentChipsGroup,\n DocumentChipsProps,\n} from \"./DocumentChips.types\";\nimport { Accordion } from \"../../components/Accordion\";\nimport { Link } from \"../../components/Link\";\nimport \"./DocumentChips.css\";\n\nconst DEFAULT_GROUPS: DocumentChipsGroup[] = [\n {\n id: \"group-one\",\n title: \"First group title\",\n documents: [\n {\n id: \"doc-one\",\n title: \"First document title\",\n href: \"#\",\n languageLink: { label: \"Choose language\", href: \"#\" },\n },\n {\n id: \"doc-two\",\n title: \"Second document title\",\n href: \"#\",\n languageLink: { label: \"Choose language\", href: \"#\" },\n },\n ],\n },\n {\n id: \"group-two\",\n title: \"Second group title\",\n documents: [\n { id: \"doc-three\", title: \"Third document title\", href: \"#\" },\n { id: \"doc-four\", title: \"Fourth document title\", href: \"#\" },\n ],\n },\n];\n\ninterface DocumentChipProps {\n document: DocumentChipsDocument;\n iconSrc: string;\n iconAlt: string;\n onLanguageSelect?: (\n document: DocumentChipsDocument,\n event: MouseEvent<HTMLAnchorElement>\n ) => void;\n}\n\nconst DocumentChip = ({ document, iconSrc, iconAlt, onLanguageSelect }: DocumentChipProps) => {\n const isExternal = document.external ?? true;\n const languageLink = document.languageLink;\n\n const handleLanguageClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (!onLanguageSelect) return;\n event.preventDefault();\n onLanguageSelect(document, event);\n };\n\n return (\n <li className=\"dch__doc-item\">\n <div className=\"dch__doc\">\n <a\n className=\"dch__doc-link\"\n href={document.href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n <img\n className=\"dch__doc-icon\"\n src={document.iconSrc ?? iconSrc}\n alt={iconAlt}\n loading=\"lazy\"\n aria-hidden={iconAlt ? undefined : true}\n />\n <span className=\"dch__doc-title\">{document.title}</span>\n </a>\n\n {languageLink && (\n <div className=\"dch__doc-action\">\n <Link\n className=\"dch__doc-language\"\n colorScheme=\"black\"\n label={languageLink.label ?? \"Choose language\"}\n href={languageLink.href ?? document.href}\n onClick={handleLanguageClick}\n aria-haspopup={onLanguageSelect ? \"dialog\" : undefined}\n />\n </div>\n )}\n </div>\n </li>\n );\n};\n\nconst DocumentChipList = ({\n documents,\n iconSrc,\n iconAlt,\n onLanguageSelect,\n}: {\n documents: DocumentChipsDocument[];\n iconSrc: string;\n iconAlt: string;\n onLanguageSelect?: DocumentChipsProps[\"onLanguageSelect\"];\n}) => (\n <ul className=\"dch__docs\">\n {documents.map((document, j) => (\n <DocumentChip\n key={document.id ?? j}\n document={document}\n iconSrc={iconSrc}\n iconAlt={iconAlt}\n onLanguageSelect={onLanguageSelect}\n />\n ))}\n </ul>\n);\n\nexport const DocumentChips = ({\n variant = \"accordion\",\n title = \"Section title goes here\",\n description,\n groups,\n iconSrc = \"https://media.ffycdn.net/eu/deriv/d/8d33a322464c4809a9d01119104caa0d\",\n iconAlt = \"\",\n allowMultipleOpen = false,\n onLanguageSelect,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: DocumentChipsProps) => {\n const resolvedGroups = groups && groups.length > 0 ? groups : DEFAULT_GROUPS;\n const groupKeys = resolvedGroups.map((group, i) => String(group.id ?? i));\n\n const [openKeys, setOpenKeys] = useState<string[] | undefined>(undefined);\n const resolvedOpenKeys = openKeys === undefined ? groupKeys.slice(0, 1) : openKeys;\n\n const handleToggle = (key: string, next: boolean) => {\n setOpenKeys((current) => {\n const base = current === undefined ? groupKeys.slice(0, 1) : current;\n if (!next) return base.filter((k) => k !== key);\n return allowMultipleOpen ? [...base.filter((k) => k !== key), key] : [key];\n });\n };\n\n const flatDocuments = resolvedGroups.flatMap((group) => group.documents ?? []);\n\n const rootClass = [\"dch\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"dch__inner\">\n {(title || description) && (\n <div className=\"dch__header\">\n {title && <HeadingTag className=\"dch__title\">{title}</HeadingTag>}\n {description && <p className=\"dch__description\">{description}</p>}\n </div>\n )}\n\n {variant === \"flat\" ? (\n <DocumentChipList\n documents={flatDocuments}\n iconAlt={iconAlt}\n iconSrc={iconSrc}\n onLanguageSelect={onLanguageSelect}\n />\n ) : (\n <div className=\"dch__groups\">\n {resolvedGroups.map((group, i) => {\n const key = groupKeys[i];\n return (\n <Accordion\n key={key}\n className=\"dch__group\"\n title={group.title}\n open={resolvedOpenKeys.includes(key)}\n onToggle={(next) => handleToggle(key, next)}\n showTopDivider={i > 0}\n >\n <DocumentChipList\n documents={group.documents ?? []}\n iconAlt={iconAlt}\n iconSrc={iconSrc}\n onLanguageSelect={onLanguageSelect}\n />\n </Accordion>\n );\n })}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default DocumentChips;\n","import { useCallback, useEffect, useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport type { LinkModalProps } from \"./LinkModal.types\";\nimport \"./LinkModal.css\";\n\nconst XMarkIcon = () => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5 5l14 14M19 5L5 19\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(\",\");\n\nexport const LinkModal = ({\n open,\n onClose,\n title = \"Dialog title\",\n closeLabel = \"Close\",\n children,\n headingLevel: HeadingTag = \"h2\",\n container,\n className,\n ...props\n}: LinkModalProps) => {\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const getFocusable = useCallback(() => {\n const panel = panelRef.current;\n if (!panel) return [] as HTMLElement[];\n return Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement\n );\n }, []);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n triggerRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\n panelRef.current?.focus();\n\n return () => {\n const trigger = triggerRef.current;\n triggerRef.current = null;\n if (trigger && document.contains(trigger)) trigger.focus();\n };\n }, [open]);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onClose]);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n const body = document.body;\n const previousOverflow = body.style.overflow;\n const previousPaddingRight = body.style.paddingRight;\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n const current = parseFloat(window.getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${current + scrollbarWidth}px`;\n }\n\n return () => {\n body.style.overflow = previousOverflow;\n body.style.paddingRight = previousPaddingRight;\n };\n }, [open]);\n\n const handlePanelKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") return;\n\n const focusable = getFocusable();\n if (focusable.length === 0) {\n event.preventDefault();\n panelRef.current?.focus();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement;\n\n if (event.shiftKey) {\n if (active === first || active === panelRef.current) {\n event.preventDefault();\n last.focus();\n }\n return;\n }\n\n if (active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n if (!open || typeof document === \"undefined\") return null;\n\n const rootClass = [\"lkm\", className].filter(Boolean).join(\" \");\n\n return createPortal(\n <div className={rootClass} onClick={onClose}>\n <div className=\"lkm__scrim\" aria-hidden=\"true\" />\n\n <div\n ref={panelRef}\n className=\"lkm__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={handlePanelKeyDown}\n {...props}\n >\n <button\n type=\"button\"\n className=\"lkm__close\"\n onClick={onClose}\n aria-label={closeLabel}\n >\n <XMarkIcon />\n </button>\n\n <HeadingTag id={titleId} className=\"lkm__title\">\n {title}\n </HeadingTag>\n\n {children && <div className=\"lkm__body\">{children}</div>}\n </div>\n </div>,\n container ?? document.body\n );\n};\n\nexport default LinkModal;\n","import { LinkModal } from \"../../components/LinkModal\";\nimport type { LanguageSelectModalOption, LanguageSelectModalProps } from \"./LanguageSelectModal.types\";\nimport \"./LanguageSelectModal.css\";\n\nconst DEFAULT_OPTIONS: LanguageSelectModalOption[] = [\n { id: \"option-one\", label: \"First option\", href: \"#\" },\n { id: \"option-two\", label: \"Second option\", href: \"#\" },\n { id: \"option-three\", label: \"Third option\", href: \"#\" },\n { id: \"option-four\", label: \"Fourth option\", href: \"#\" },\n { id: \"option-five\", label: \"Fifth option\", href: \"#\" },\n { id: \"option-six\", label: \"Sixth option\", href: \"#\" },\n];\n\nexport const LanguageSelectModal = ({\n open,\n onClose,\n title = \"Select your language\",\n closeLabel = \"Close\",\n options,\n headingLevel = \"h2\",\n container,\n className,\n ...props\n}: LanguageSelectModalProps) => {\n const resolvedOptions = options && options.length > 0 ? options : DEFAULT_OPTIONS;\n\n return (\n <LinkModal\n open={open}\n onClose={onClose}\n title={title}\n closeLabel={closeLabel}\n headingLevel={headingLevel}\n container={container}\n className={className}\n {...props}\n >\n <ul className=\"lsm__grid\">\n {resolvedOptions.map((option, i) => {\n const isExternal = option.external ?? true;\n return (\n <li key={option.id ?? i} className=\"lsm__grid-item\">\n <a\n className=\"lsm__option\"\n href={option.href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n {option.flagSrc && (\n <img\n className=\"lsm__flag\"\n src={option.flagSrc}\n alt={option.flagAlt ?? \"\"}\n loading=\"lazy\"\n aria-hidden={option.flagAlt ? undefined : true}\n />\n )}\n <span className=\"lsm__option-label\">{option.label}</span>\n </a>\n </li>\n );\n })}\n </ul>\n </LinkModal>\n );\n};\n\nexport default LanguageSelectModal;\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { AffiliatesSliderProps } from \"./AffiliatesSlider.types\";\nimport \"./AffiliatesSlider.css\";\n\nconst ArrowIcon = () => (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M24.5547 16.9688L17.6797 23.8438C17.4453 24.0781 17.0156 24.0781 16.7812 23.8438C16.5469 23.6094 16.5469 23.1797 16.7812 22.9453L22.6016 17.125H7.875C7.52344 17.125 7.25 16.8516 7.25 16.5C7.25 16.1875 7.52344 15.875 7.875 15.875H22.6016L16.7812 10.0938C16.5469 9.85938 16.5469 9.42969 16.7812 9.19531C17.0156 8.96094 17.4453 8.96094 17.6797 9.19531L24.5547 16.0703C24.7891 16.3047 24.7891 16.7344 24.5547 16.9688Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.72\"\n />\n </svg>\n);\n\nconst TrackGradient = () => (\n <svg\n preserveAspectRatio=\"none\"\n width=\"100%\"\n height=\"49\"\n viewBox=\"0 0 408 50\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"afs__track-gradient\"\n >\n <path\n opacity=\"0.5\"\n d=\"M408 0.25L0 49.25H408V0.25Z\"\n fill=\"url(#afs-track-gradient)\"\n />\n <defs>\n <linearGradient\n id=\"afs-track-gradient\"\n x1=\"0\"\n y1=\"9.91566\"\n x2=\"178.34\"\n y2=\"227.916\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"var(--afs-track-gradient-start)\" />\n <stop offset=\"1\" stopColor=\"var(--afs-track-gradient-end)\" />\n </linearGradient>\n </defs>\n </svg>\n);\n\nconst buildDefaultTicks = (min: number, max: number) => {\n const span = max - min;\n return [0, 0.25, 0.5, 0.75, 1].map((ratio) => Math.round(min + span * ratio));\n};\n\nconst formatIncome = (value: number) =>\n new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 0 }).format(value);\n\nexport const AffiliatesSlider = ({\n title = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n min = 10,\n max = 50,\n step = 1,\n defaultValue = 10,\n value,\n onValueChange,\n referralsLabel = \"total referrals (Min deposit amount of $100 each)\",\n incomeLabel = \"your potential income per month\",\n incomePerReferral = 100,\n currencySymbol = \"$\",\n tickValues,\n disclaimer = \"This calculator provides estimates only and may not reflect actual earnings.\",\n disclaimerIconSrc = \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86cdaf_icon.svg\",\n disclaimerIconAlt = \"\",\n sliderLabel = \"Number of referrals\",\n className,\n ...props\n}: AffiliatesSliderProps) => {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const currentValue = value ?? internalValue;\n\n const handleChange = useCallback(\n (next: number) => {\n if (value === undefined) setInternalValue(next);\n onValueChange?.(next);\n },\n [onValueChange, value]\n );\n\n const ticks = useMemo(\n () => tickValues ?? buildDefaultTicks(min, max),\n [max, min, tickValues]\n );\n\n const fillPercent = ((currentValue - min) / (max - min)) * 100;\n const income = currentValue * incomePerReferral;\n\n const rootClass = [\"afs\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"afs__inner\">\n <div className=\"afs__header\">\n {title && <h2 className=\"afs__title\">{title}</h2>}\n {description && <p className=\"afs__description\">{description}</p>}\n </div>\n\n <div className=\"afs__form\">\n <div className=\"afs__controls\">\n <div className=\"afs__referrals\">\n <div className=\"afs__metric\">{currentValue}</div>\n <p className=\"afs__metric-label\">{referralsLabel}</p>\n </div>\n\n <div className=\"afs__arrow\" aria-hidden=\"true\">\n <ArrowIcon />\n </div>\n\n <div className=\"afs__slider-block\">\n <TrackGradient />\n\n <div className=\"afs__track-wrap\">\n <div className=\"afs__track\">\n <div\n className=\"afs__fill\"\n style={{ width: `${fillPercent}%` }}\n />\n <div\n className=\"afs__handle\"\n style={{ left: `${fillPercent}%` }}\n aria-hidden=\"true\"\n />\n <input\n type=\"range\"\n className=\"afs__input\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n aria-label={sliderLabel}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n onChange={(event) =>\n handleChange(Number(event.target.value))\n }\n />\n </div>\n </div>\n\n <div className=\"afs__ticks\">\n {ticks.map((tick) => (\n <span key={tick} className=\"afs__tick\">\n {tick}\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"afs__income\">\n <div className=\"afs__income-value\">\n <span className=\"afs__metric\">{currencySymbol}</span>\n <span className=\"afs__metric\">{formatIncome(income)}</span>\n </div>\n <p className=\"afs__metric-label afs__metric-label--right\">\n {incomeLabel}\n </p>\n </div>\n </div>\n </div>\n\n {disclaimer && (\n <div className=\"afs__disclaimer\">\n {disclaimerIconSrc && (\n <img\n className=\"afs__disclaimer-icon\"\n src={disclaimerIconSrc}\n alt={disclaimerIconAlt}\n loading=\"lazy\"\n aria-hidden={disclaimerIconAlt ? undefined : true}\n />\n )}\n <p className=\"afs__disclaimer-text\">{disclaimer}</p>\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default AffiliatesSlider;\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","ChevronIcon","jsx","jsxs","forwardRef","useState","Fragment","jsx","jsxs","SuccessIcon","FailIcon","forwardRef","useState","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","useId","useRef","jsx","useId","useRef","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","CheckIcon","useState","Fragment","jsx","jsxs","ChevronDownIcon","useState","jsx","jsxs","jsx","jsxs","useEffect","useRef","jsx","jsxs","ButtonBlock","useRef","useEffect","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","useEffect","useRef","useState","jsx","jsxs","EASING","useState","useRef","useEffect","useEffect","useRef","useState","useEffect","useRef","useState","jsx","jsx","jsxs","ChevronRight","useState","useRef","useEffect","jsx","jsxs","useEffect","useRef","jsx","jsxs","useRef","useEffect","useRef","jsx","jsxs","useRef","useRef","useState","useEffect","useCallback","motion","jsx","jsxs","ChevronDownIcon","XMarkIcon","motion","useState","useRef","useEffect","useCallback","useEffect","useLayoutEffect","useRef","useState","motion","useScroll","useSpring","useTransform","useMotionTemplate","body","dark","white","Fragment","jsx","jsxs","SPRING","seg","useRef","useState","useEffect","motion","useLayoutEffect","useScroll","useSpring","useTransform","useMotionTemplate","useRef","motion","useScroll","jsx","jsxs","PLACEHOLDER_IMAGE","useScroll","useRef","motion","jsx","jsx","jsxs","jsx","jsxs","useEffect","useRef","jsx","jsxs","useRef","useEffect","useEffect","useRef","jsx","jsxs","PLACEHOLDER_IMAGE","useRef","useEffect","n","useEffect","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useEffect","n","useState","useMemo","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","useState","Fragment","jsx","jsxs","ChevronDownIcon","useState","jsx","jsxs","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","useCallback","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useCallback","useEffect","useRef","useState","jsx","jsxs","ButtonBlock","useState","useRef","useCallback","useEffect","jsx","jsxs","AwardBadge","jsx","jsxs","externalLinkRel","useMemo","useState","jsx","jsxs","PostCard","useState","useMemo","Fragment","jsx","jsxs","externalLinkRel","useMemo","useState","jsx","jsxs","externalLinkRel","useState","useMemo","useMemo","useState","jsx","jsxs","externalLinkRel","ChevronDownIcon","useState","useMemo","useEffect","useMemo","useState","jsx","jsxs","ChevronDownIcon","CheckIcon","useState","renderBlock","useMemo","useEffect","useRef","motion","useScroll","useSpring","useTransform","jsx","jsxs","PLACEHOLDER_IMAGE","useRef","useScroll","useSpring","useTransform","motion","useCallback","useEffect","useId","useMemo","useRef","useState","Fragment","jsx","jsxs","useRef","useEffect","useCallback","useState","ChevronIcon","useId","useMemo","Fragment","useEffect","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","useLayoutEffect","useEffect","useRef","useState","useMemo","useState","jsx","jsxs","isExternalUrl","useState","useMemo","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","ExternalLinkIcon","useEffect","useId","useRef","useState","Fragment","jsx","jsxs","safeHref","safeLottieSrc","PlaybackGlyph","useState","useRef","useEffect","useId","jsx","jsxs","DEFAULT_LINKS","jsx","jsxs","useState","jsx","jsxs","document","useState","useCallback","useEffect","useId","useRef","createPortal","jsx","jsxs","XMarkIcon","useId","useRef","useCallback","useEffect","createPortal","jsx","jsxs","useCallback","useMemo","useState","jsx","jsxs","ArrowIcon","useState","useCallback","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../components/Button/Button.tsx","../components/Link/Link.tsx","../components/Chip/Chip.tsx","../components/Tag/Tag.tsx","../components/Accordion/Accordion.tsx","../components/TextField/TextField.tsx","../components/SearchField/SearchField.tsx","../components/Breadcrumb/Breadcrumb.tsx","../components/BottomSheet/BottomSheet.tsx","../components/ChipDropdown/ChipDropdown.tsx","../components/Card/CardPrimaryVariant.tsx","../components/Card/CardSecondaryVariant.tsx","../components/Card/CardThumbnailVariant.tsx","../components/Card/CardCategoryVariant.tsx","../components/Card/Card.tsx","../components/Pagination/Pagination.tsx","../components/Tabs/Tabs.tsx","../templates/FaqAccordion/FaqAccordion.tsx","../templates/FeatureCards/FeatureCards.tsx","../templates/FeatureCardsCarousel/FeatureCardsCarousel.tsx","../templates/ComparisonCards/ComparisonCards.tsx","../templates/FeatureCardsIcon/FeatureCardsIcon.tsx","../templates/FeatureBullets/FeatureBullets.tsx","../components/Footer/Footer.tsx","../templates/Hero/HeroTrustpilot.tsx","../templates/Hero/Hero.tsx","../templates/Header/Header.tsx","../templates/Stats/StatsV2.tsx","../templates/Stats/StatsSimple.tsx","../templates/FeatureScroll/FeatureScroll.tsx","../components/DotLottieInView/DotLottieInView.tsx","../components/DotLottieInView/lottie-src.ts","../templates/FeatureSplit/FeatureSplit.tsx","../templates/StickyStackedCards/StickyStackedCards.tsx","../templates/CTABanner/CTABanner.tsx","../components/Navbar/Navbar.tsx","../components/Navbar/languageGridVars.ts","../templates/DayNightTransition/DayNightTransition.tsx","../templates/DayNightTransition/webflowDayNightV2Ix.ts","../templates/DayNightTransition/dayNightTransitionPresets.ts","../templates/LogoMarquee/LogoMarquee.tsx","../components/DownloadBadge/DownloadBadge.tsx","../templates/Steps/Steps.tsx","../templates/DownloadBanner/DownloadBanner.tsx","../templates/TextScroll/TextScroll.tsx","../templates/StickyMarketCards/StickyMarketCards.tsx","../templates/StickyMarketCardsLottie/StickyMarketCardsLottie.tsx","../templates/Table/Table.tsx","../templates/DynamicTable/DynamicTable.tsx","../templates/Leaders/Leaders.tsx","../templates/ImageBanner/ImageBanner.tsx","../templates/Testimonial/Testimonial.tsx","../templates/ArticleHero/ArticleHero.tsx","../templates/ArticleSection/ArticleSection.tsx","../templates/CoralBanner/CoralBanner.tsx","../templates/FeatureAwards/FeatureAwards.tsx","../templates/FeatureBlog/FeatureBlog.tsx","../templates/FeatureBlogCategories/FeatureBlogCategories.tsx","../templates/HelpCentreCategories/HelpCentreCategories.tsx","../templates/HelpCentreSubCategories/HelpCentreSubCategories.tsx","../templates/HelpCenterPage/HelpCenterPage.tsx","../templates/FeatureBlogPage/FeatureBlogPage.tsx","../templates/ParallaxBanner/ParallaxBanner.tsx","../templates/TradingCalculator/TradingCalculator.tsx","../templates/TradingCalculatorHowTo/TradingCalculatorHowTo.tsx","../templates/CryptoTradeConverter/CryptoTradeConverter.tsx","../templates/cryptoMarketData/origins.ts","../templates/cryptoMarketData/schemas.ts","../templates/cryptoMarketData/rest.ts","../templates/cryptoMarketData/conversion.ts","../templates/cryptoMarketData/websocket.ts","../templates/cryptoMarketData/MarketDataClient.ts","../templates/cryptoMarketData/useCryptoMarketData.ts","../templates/CryptoMarketsTable/CryptoMarketsTable.tsx","../templates/FeatureOffices/FeatureOffices.tsx","../templates/Tiers/Tiers.tsx","../templates/PartnersPayout/PartnersPayout.tsx","../templates/MasterPartner/MasterPartner.tsx","../templates/ResourceBanner/ResourceBanner.tsx","../templates/OptionsTypes/OptionsTypes.tsx","../templates/OptionsTypes/OptionsTypes.data.ts","../templates/EntityInfoSection/EntityInfoSection.tsx","../templates/CountryLinkGrid/CountryLinkGrid.tsx","../templates/DocumentChips/DocumentChips.tsx","../components/LinkModal/LinkModal.tsx","../templates/LanguageSelectModal/LanguageSelectModal.tsx","../templates/AffiliatesSlider/AffiliatesSlider.tsx"],"sourcesContent":["import type { ButtonProps } from \"./Button.types\";\nimport \"./Button.css\";\n\nexport const Button = ({\n colorScheme = \"coral\",\n variant = \"primary\",\n iconPosition = \"none\",\n icon,\n label,\n fullWidth = false,\n showFocusRing = false,\n children,\n disabled,\n className,\n ...props\n}: ButtonProps) => {\n const isIconOnly = iconPosition === \"icon-only\";\n\n const classNames = [\n \"button\",\n `${colorScheme}_${variant}`,\n isIconOnly ? \"iconOnly\" : \"\",\n fullWidth ? \"fullWidth\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const iconNode = icon ? (\n <span className=\"icon\">{icon}</span>\n ) : null;\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-label={isIconOnly && label ? label : undefined}\n {...props}\n >\n {iconPosition === \"icon-left\" && iconNode}\n\n {!isIconOnly && (\n <span className=\"label\">{label ?? children}</span>\n )}\n\n {iconPosition === \"icon-only\" && iconNode}\n\n {iconPosition === \"icon-right\" && iconNode}\n\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import type { LinkProps } from \"./Link.types\";\nimport \"./Link.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M3 8h10M9 4l4 4-4 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Link = ({\n colorScheme = \"coral\",\n label,\n icon,\n iconPosition = \"left\",\n showChevron = true,\n disabled = false,\n children,\n className,\n onClick,\n ...props\n}: LinkProps) => {\n const hasIcon = !!icon;\n\n const classNames = [\n \"link\",\n colorScheme,\n hasIcon ? \"withIcon\" : \"withChevron\",\n disabled ? \"disabled\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.(e);\n };\n\n return (\n <a\n className={classNames}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n onClick={handleClick}\n {...props}\n >\n {hasIcon && iconPosition === \"left\" && <span className=\"icon\">{icon}</span>}\n\n <span className=\"label\">{label ?? children}</span>\n\n {hasIcon && iconPosition === \"right\" && <span className=\"icon\">{icon}</span>}\n\n {!hasIcon && showChevron && (\n <span className=\"chevron\" aria-hidden=\"true\">\n <ChevronIcon />\n </span>\n )}\n </a>\n );\n};\n\nexport default Link;\n","import type { ChipProps } from \"./Chip.types\";\nimport \"./Chip.css\";\n\nexport const Chip = ({\n size = \"md\",\n label,\n icon,\n tag,\n selected = false,\n showFocusRing = false,\n disabled = false,\n children,\n className,\n ...props\n}: ChipProps) => {\n const classNames = [\n \"chip\",\n size,\n selected ? \"selected\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n className={classNames}\n disabled={disabled}\n aria-pressed={selected}\n {...props}\n >\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{label ?? children}</span>\n {tag && <span className=\"tag\">{tag}</span>}\n {showFocusRing && (\n <span className=\"focusRing\" aria-hidden=\"true\" />\n )}\n </button>\n );\n};\n\nexport default Chip;\n","import type { TagProps } from \"./Tag.types\";\nimport \"./Tag.css\";\n\nexport const Tag = ({\n size = \"sm\",\n variant = \"fill\",\n fontWeight = \"regular\",\n label,\n icon,\n children,\n className,\n ...props\n}: TagProps) => {\n const classNames = [\n \"tag\",\n size,\n variant,\n fontWeight,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <span className={classNames} {...props}>\n {icon && <span className=\"icon\">{icon}</span>}\n <span className=\"label\">{label ?? children}</span>\n </span>\n );\n};\n\nexport default Tag;\n","import { useState } from \"react\";\nimport type { AccordionProps } from \"./Accordion.types\";\nimport \"./Accordion.css\";\n\nconst ChevronIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nexport const Accordion = ({\n title,\n children,\n open,\n defaultOpen = false,\n onToggle,\n showTopDivider = true,\n showBottomDivider = true,\n showFocusRing = false,\n className,\n}: AccordionProps) => {\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isControlled = open !== undefined;\n const isOpen = isControlled ? open : internalOpen;\n\n const handleToggle = () => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onToggle?.(next);\n };\n\n const classNames = [\"accordion\", className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <div\n className={classNames}\n style={{\n borderTop: showTopDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n borderBottom: showBottomDivider ? `1px solid var(--accordion-divider-color)` : undefined,\n }}\n >\n <button\n className=\"accordion__header\"\n onClick={handleToggle}\n aria-expanded={isOpen}\n >\n <span className=\"accordion__title-wrapper\">\n <span className=\"accordion__title\">{title}</span>\n </span>\n <span className={[\"accordion__chevron\", isOpen ? \"accordion__chevron--rotated\" : \"\"].filter(Boolean).join(\" \")}>\n <ChevronIcon />\n </span>\n {showFocusRing && (\n <span className=\"accordion__focus-ring\" aria-hidden=\"true\" />\n )}\n </button>\n\n <div className={[\"accordion__body-wrapper\", isOpen ? \"accordion__body-wrapper--open\" : \"\"].filter(Boolean).join(\" \")}>\n <div className=\"accordion__body-inner\">\n <div className=\"accordion__body\">{children}</div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default Accordion;\n","import { forwardRef } from \"react\";\nimport type { TextFieldProps } from \"./TextField.types\";\nimport \"./TextField.css\";\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(\n (\n {\n variant = \"outline\",\n status = \"neutral\",\n label,\n disabled,\n className,\n id,\n ...inputProps\n },\n ref\n ) => {\n const wrapperClass = [\n \"tf-wrapper\",\n variant,\n status,\n label ? \"hasLabel\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const field = (\n <>\n <input\n ref={ref}\n id={id}\n className=\"tf-input\"\n disabled={disabled}\n {...inputProps}\n />\n\n {status === \"success\" && (\n <span className=\"iconSlot iconSuccess\">\n <SuccessIcon />\n </span>\n )}\n {status === \"fail\" && (\n <span className=\"iconSlot iconFail\">\n <FailIcon />\n </span>\n )}\n </>\n );\n\n return (\n <div className={wrapperClass} data-disabled={disabled || undefined}>\n {label && (\n <label className=\"tf-label\" htmlFor={id}>\n {label}\n </label>\n )}\n {label ? <div className=\"tf-row\">{field}</div> : field}\n </div>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport default TextField;\n","import { forwardRef, useRef, useState, useCallback, type ChangeEvent } from \"react\";\nimport type { SearchFieldProps } from \"./SearchField.types\";\nimport \"./SearchField.css\";\n\n/* ── Icons ────────────────────────────────────────────────── */\n\nconst SearchIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"6.5\" cy=\"6.5\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M9.5 9.5L13 13\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst ClearIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <path d=\"M6 6l4 4M10 6l-4 4\" stroke=\"currentColor\" strokeWidth=\"1.25\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst SuccessIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 8l2 2 3-3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst FailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\n/* ── Component ────────────────────────────────────────────── */\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(\n (\n {\n variant = \"outline\",\n status = \"neutral\",\n showSearchIcon = true,\n value,\n defaultValue,\n onChange,\n onClear,\n label,\n trailingSlot,\n hideClearButton = false,\n disabled,\n className,\n id,\n ...inputProps\n },\n ref\n ) => {\n const innerRef = useRef<HTMLInputElement>(null);\n\n // Merge forwarded ref with inner ref so we can clear the native input\n const setRef = useCallback(\n (node: HTMLInputElement | null) => {\n (innerRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n },\n [ref]\n );\n\n // Track whether the input has text for uncontrolled usage\n const isControlled = value !== undefined;\n const [internalHasValue, setInternalHasValue] = useState(\n Boolean(defaultValue)\n );\n const hasValue = isControlled ? Boolean(value) : internalHasValue;\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalHasValue(Boolean(e.target.value));\n }\n onChange?.(e);\n };\n\n const handleClear = () => {\n if (!isControlled && innerRef.current) {\n innerRef.current.value = \"\";\n setInternalHasValue(false);\n }\n onClear?.();\n innerRef.current?.focus();\n };\n\n // ── Derived display state ──────────────────────────────\n // Fail icon always visible when status=fail (even with no input)\n const showFailIcon = status === \"fail\" && !disabled;\n // Success icon only visible when status=success + has input\n const showSuccessIcon = status === \"success\" && hasValue && !disabled;\n // Clear button visible when has input (all statuses), unless suppressed\n const showClearButton = hasValue && !disabled && !hideClearButton;\n\n const wrapperClass = [\n \"sf-wrapper\",\n variant,\n status,\n label ? \"hasLabel\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const field = (\n <>\n {/* Leading search icon — optional */}\n {showSearchIcon && (\n <span className=\"iconSlot\">\n <SearchIcon />\n </span>\n )}\n\n <input\n ref={setRef}\n id={id}\n className=\"sf-input\"\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n {...inputProps}\n />\n\n {/* Status icons — right of input, left of clear */}\n {showSuccessIcon && (\n <span className=\"iconSlot iconSuccess\">\n <SuccessIcon />\n </span>\n )}\n {showFailIcon && (\n <span className=\"iconSlot iconFail\">\n <FailIcon />\n </span>\n )}\n\n {/* Clear button — rightmost, unless a trailing slot follows */}\n {showClearButton && (\n <button\n type=\"button\"\n className=\"clearButton\"\n onClick={handleClear}\n aria-label=\"Clear search\"\n tabIndex={-1}\n >\n <ClearIcon />\n </button>\n )}\n\n {/* Trailing slot — e.g. a combobox chevron, always last */}\n {trailingSlot && <span className=\"sf-trailing\">{trailingSlot}</span>}\n </>\n );\n\n return (\n <div\n className={wrapperClass}\n data-disabled={disabled || undefined}\n >\n {label && (\n <label className=\"sf-label\" htmlFor={id}>\n {label}\n </label>\n )}\n {label ? <div className=\"sf-row\">{field}</div> : field}\n </div>\n );\n }\n);\n\nSearchField.displayName = \"SearchField\";\n\nexport default SearchField;\n","import { useState } from \"react\";\nimport type { BreadcrumbProps, BreadcrumbItem } from \"./Breadcrumb.types\";\nimport { BottomSheet } from \"../BottomSheet\";\nimport \"./Breadcrumb.css\";\n\nconst ChevronRightIcon = () => (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 3.5L10.5 8L6 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nfunction BreadcrumbLink({ item }: { item: BreadcrumbItem }) {\n return (\n <>\n <a href={item.href} onClick={item.onClick} className=\"bc-link\">\n {item.label}\n </a>\n <span className=\"bc-separator\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </>\n );\n}\n\nexport function Breadcrumb({\n items,\n size = \"md\",\n collapsible = true,\n className,\n ...navProps\n}: BreadcrumbProps) {\n const [sheetOpen, setSheetOpen] = useState(false);\n\n // Collapse only when there are enough items for the pattern:\n // first › … › parent › current (needs ≥ 4 items)\n const truncatable = collapsible && items.length > 3;\n\n const listClass = [\"bc-list\", size, truncatable ? \"collapsible\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n if (!truncatable) {\n return (\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"bc-item\">\n {isLast ? (\n <span className=\"bc-current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : (\n <BreadcrumbLink item={item} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n }\n\n const firstItem = items[0];\n const middleItems = items.slice(1, items.length - 2);\n const parentItem = items[items.length - 2];\n const currentItem = items[items.length - 1];\n\n return (\n <>\n <nav aria-label=\"Breadcrumb\" className={className} {...navProps}>\n <ol className={listClass}>\n {/* Always-visible: first item */}\n <li className=\"bc-item\">\n <BreadcrumbLink item={firstItem} />\n </li>\n\n {/* Mobile only — ellipsis button, opens BottomSheet */}\n <li className=\"bc-ellipsisItem\">\n <button\n className=\"bc-ellipsisButton\"\n onClick={() => setSheetOpen(true)}\n aria-label=\"Show all breadcrumb items\"\n aria-haspopup=\"dialog\"\n >\n …\n </button>\n <span className=\"bc-separator\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n </li>\n\n {/* Middle items — hidden on mobile (shown in BottomSheet instead) */}\n {middleItems.map((item, index) => (\n <li key={`m-${index}`} className=\"bc-middleItem\">\n <BreadcrumbLink item={item} />\n </li>\n ))}\n\n {/* Always-visible: parent (second-to-last) */}\n <li className=\"bc-item\">\n <BreadcrumbLink item={parentItem} />\n </li>\n\n {/* Always-visible: current page (last) */}\n <li className=\"bc-item\">\n <span className=\"bc-current\" aria-current=\"page\">\n {currentItem.label}\n </span>\n </li>\n </ol>\n </nav>\n\n {/* Mobile BottomSheet — shows hidden middle breadcrumb items */}\n <BottomSheet\n open={sheetOpen}\n onClose={() => setSheetOpen(false)}\n showHandleBar\n showHeader={false}\n >\n <ul className=\"bc-sheet-list\" role=\"list\">\n {middleItems.map((item, index) => (\n <li key={`sheet-${index}`} className=\"bc-sheet-item\">\n <a\n href={item.href}\n className=\"bc-sheet-link\"\n onClick={(e) => {\n item.onClick?.(e as React.MouseEvent<HTMLAnchorElement>);\n setSheetOpen(false);\n }}\n >\n {item.label}\n </a>\n </li>\n ))}\n </ul>\n </BottomSheet>\n </>\n );\n}\n\nexport default Breadcrumb;\n","import { useEffect, useId } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { BottomSheetProps } from \"./BottomSheet.types\";\nimport \"./BottomSheet.css\";\n\nconst XMarkIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 3l10 10M13 3L3 13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const BottomSheet = ({\n open,\n onClose,\n title,\n showHeader = true,\n showHandleBar = true,\n primaryAction,\n secondaryAction,\n children,\n}: BottomSheetProps) => {\n const titleId = useId();\n\n useEffect(() => {\n if (!open) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onClose]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n className=\"bs-overlay\"\n onClick={onClose}\n aria-hidden=\"true\"\n >\n <div\n className=\"bs-sheet\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n {showHandleBar && (\n <div className=\"bs-handle-container\">\n <div className=\"bs-handle-bar\" />\n </div>\n )}\n\n {showHeader && (\n <div className=\"bs-header\">\n <div className=\"bs-header-spacer\" />\n {title && (\n <p id={titleId} className=\"bs-title\">\n {title}\n </p>\n )}\n <div className=\"bs-close-container\">\n <button\n type=\"button\"\n className=\"bs-close-btn\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <XMarkIcon />\n </button>\n </div>\n </div>\n )}\n\n {children && <div className=\"bs-body\">{children}</div>}\n\n {(primaryAction || secondaryAction) && (\n <div className=\"bs-actions\">\n {primaryAction && (\n <button\n type=\"button\"\n className=\"bs-action-primary\"\n onClick={primaryAction.onClick}\n >\n {primaryAction.label}\n </button>\n )}\n {secondaryAction && (\n <button\n type=\"button\"\n className=\"bs-action-secondary\"\n onClick={secondaryAction.onClick}\n >\n {secondaryAction.label}\n </button>\n )}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n};\n\nexport default BottomSheet;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ChipDropdownProps } from \"./ChipDropdown.types\";\nimport { BottomSheet } from \"../BottomSheet\";\nimport \"./ChipDropdown.css\";\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M3 6l5 5 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const ChipDropdown = ({\n size = \"md\",\n label,\n tag,\n icon,\n options,\n value,\n onChange,\n disabled = false,\n className,\n ...props\n}: ChipDropdownProps) => {\n const [open, setOpen] = useState(false);\n const [isMobile, setIsMobile] = useState(\n () => typeof window !== \"undefined\" && window.matchMedia(\"(max-width: 767px)\").matches\n );\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find((o) => o.value === value) ?? null;\n const displayLabel = selectedOption ? selectedOption.label : label;\n const isSelected = selectedOption !== null;\n\n // Track mobile breakpoint reactively\n useEffect(() => {\n const mq = window.matchMedia(\"(max-width: 767px)\");\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, []);\n\n // Close desktop dropdown on outside click\n useEffect(() => {\n if (!open || isMobile) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [open, isMobile]);\n\n const triggerClassNames = [\n \"cd-trigger\",\n size,\n isSelected ? \"selected\" : \"\",\n open ? \"expand\" : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n\n const handleSelect = (optionValue: string) => {\n onChange?.(optionValue);\n setOpen(false);\n };\n\n const optionList = options.map((option) => {\n const isActive = option.value === value;\n return (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={isActive}\n className={[\"cd-item\", isActive ? \"itemSelected\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => handleSelect(option.value)}\n >\n <span className=\"cd-itemLabel\">{option.label}</span>\n {isActive && (\n <span className=\"cd-itemCheck\">\n <CheckIcon />\n </span>\n )}\n </li>\n );\n });\n\n return (\n <div ref={wrapperRef} className=\"cd-wrapper\">\n <button\n type=\"button\"\n className={triggerClassNames}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n onClick={() => setOpen((prev) => !prev)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {icon && <span className=\"cd-icon\">{icon}</span>}\n <span className=\"cd-label\">{displayLabel}</span>\n {tag && <span className=\"cd-tag\">{tag}</span>}\n <span\n className={[\"cd-chevron\", open ? \"chevronOpen\" : \"\"].filter(Boolean).join(\" \")}\n aria-hidden=\"true\"\n >\n <ChevronDownIcon />\n </span>\n </button>\n\n {/* Desktop: inline dropdown list */}\n {!isMobile && open && (\n <ul role=\"listbox\" aria-label={label} className=\"cd-list\">\n {optionList}\n </ul>\n )}\n\n {/* Mobile: bottom sheet */}\n {isMobile && (\n <BottomSheet\n open={open}\n onClose={() => setOpen(false)}\n title={label}\n showHandleBar\n showHeader\n >\n <ul role=\"listbox\" aria-label={label} className=\"cd-list cd-list--sheet\">\n {optionList}\n </ul>\n </BottomSheet>\n )}\n </div>\n );\n};\n\nexport default ChipDropdown;\n","import type { CardProps } from \"./Card.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./CardPrimaryVariant.css\";\n\ntype PrimaryProps = Extract<CardProps, { variant: \"primary\" }>;\n\nexport const CardPrimaryVariant = ({\n colorScheme = \"light\",\n title,\n description,\n image,\n imageAlt = \"\",\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: PrimaryProps) => {\n const isInverse = colorScheme === \"dark\" || colorScheme === \"brand\" || colorScheme === \"image\";\n\n return (\n <div\n className={[\n \"card-primary\",\n `style--${colorScheme}`,\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {/* ── Full-bleed image overlay (image colorScheme only) ─── */}\n {colorScheme === \"image\" && image && (\n <div aria-hidden=\"true\" className=\"cp-imageOverlay\">\n <img alt=\"\" className=\"cp-overlayImg\" src={image} />\n <div className=\"cp-gradient\" />\n </div>\n )}\n\n {/* ── Content ──────────────────────────────────────── */}\n <div className=\"cp-content\">\n <p className={[\"cp-title\", isInverse ? \"textInverse\" : \"textDefault\"].join(\" \")}>\n {title}\n </p>\n <p className={[\"cp-description\", isInverse ? \"textInverse\" : \"textDefault\"].join(\" \")}>\n {description}\n </p>\n {showLink && (\n <Link\n colorScheme={isInverse ? \"white\" : \"coral\"}\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n\n {/* ── Image section (light / dark / brand colorSchemes) ── */}\n {colorScheme !== \"image\" && image && (\n <div className=\"cp-imageSection\">\n <img alt={imageAlt} className=\"cp-image\" src={image} />\n </div>\n )}\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./CardSecondaryVariant.css\";\n\ntype SecondaryProps = Extract<CardProps, { variant: \"secondary\" }>;\n\nexport const CardSecondaryVariant = ({\n title,\n description,\n icon,\n showIcon = true,\n showLink = true,\n linkText = \"Learn more\",\n onLinkClick,\n className,\n variant: _variant,\n ...props\n}: SecondaryProps) => {\n return (\n <div\n className={[\"card-secondary\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {showIcon && icon && <span className=\"cs-icon\">{icon}</span>}\n\n <p className=\"cs-title\">{title}</p>\n\n <p className=\"cs-description\">{description}</p>\n\n {showLink && (\n <Link\n colorScheme=\"coral\"\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Tag } from \"../../components/Tag\";\nimport \"./CardThumbnailVariant.css\";\n\nconst LinkIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.25 2.625H3.5A1.75 1.75 0 0 0 1.75 4.375v5.25A1.75 1.75 0 0 0 3.5 11.375h5.25a1.75 1.75 0 0 0 1.75-1.75V7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M7.875 1.75h4.375v4.375M12.25 1.75 6.125 7.875\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.25\"\n />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"80\"\n viewBox=\"0 0 80 80\"\n width=\"80\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"40\" cy=\"40\" fill=\"rgba(255,255,255,0.88)\" r=\"40\" />\n <path d=\"M32 27l22 13-22 13V27z\" fill=\"rgba(24,28,37,0.72)\" />\n </svg>\n);\n\ntype ThumbnailProps = Extract<CardProps, { variant: \"thumbnail\" }>;\n\nexport const CardThumbnailVariant = ({\n type = \"video\",\n layout = \"vertical\",\n thumbnail,\n thumbnailAlt = \"\",\n hideThumbnail = false,\n title,\n summary,\n tags = [],\n hideTags = false,\n showCopyLink = true,\n onCopyLink,\n avatar,\n avatarAlt = \"\",\n hideAvatar = false,\n className,\n variant: _variant,\n ...props\n}: ThumbnailProps) => {\n const isVideo = type === \"video\";\n const isHorizontal = layout === \"horizontal\" || layout === \"horizontal-reverse\";\n const isReversed = layout === \"horizontal-reverse\";\n const hasTags = !hideTags && tags.length > 0;\n\n /* Horizontal (byline-style) layout keeps the original inline,\n * dot-separated tag list in the meta row alongside the copy-link\n * button. Vertical layout renders tags as standalone chip pills\n * above the title, matching the reference \"Deriv press releases\"\n * card design (deriv.com/newsroom). */\n const tagsNode = hasTags && (\n isHorizontal ? (\n <div className=\"ct-tagsList\">\n {tags.map((tag, i) => (\n <span className=\"ct-tagItem\" key={i}>\n {i > 0 && <span aria-hidden=\"true\" className=\"ct-tagDot\">·</span>}\n <Tag icon={tag.icon} label={tag.label} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n ) : (\n <div className=\"ct-tagsRow\">\n {tags.map((tag, i) => (\n <Tag icon={tag.icon} key={i} label={tag.label} size=\"md\" variant=\"fill\" />\n ))}\n </div>\n )\n );\n\n const copyLinkNode = showCopyLink && (\n <button\n aria-label=\"Copy link\"\n className=\"ct-copyLink\"\n onClick={onCopyLink}\n type=\"button\"\n >\n <LinkIcon />\n </button>\n );\n\n return (\n <div\n className={[\"card-thumbnail\", isHorizontal ? \"ct-horizontal\" : \"\", isReversed ? \"ct-reverse\" : \"\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* ── Thumbnail ──────────────────────────────────── */}\n {!hideThumbnail && (\n <div className=\"ct-thumbnailWrapper\">\n <img alt={thumbnailAlt} className=\"ct-thumbnailImage\" src={thumbnail} />\n {isVideo && (\n <span aria-label=\"Play video\" className=\"ct-playButton\">\n <PlayIcon />\n </span>\n )}\n {!isVideo && !hideAvatar && avatar && (\n <img alt={avatarAlt} className=\"ct-avatar\" src={avatar} />\n )}\n </div>\n )}\n\n {/* ── Content ───────────────────────────────────── */}\n <div className=\"ct-content\">\n {!isHorizontal && tagsNode}\n <p className=\"ct-title\">{title}</p>\n <p className=\"ct-summary\">{summary}</p>\n {isHorizontal ? (\n (tagsNode || copyLinkNode) && (\n <div className=\"ct-metaRow\">\n {tagsNode}\n {copyLinkNode}\n </div>\n )\n ) : (\n copyLinkNode && (\n <div className=\"ct-metaRow ct-metaRow--end\">{copyLinkNode}</div>\n )\n )}\n </div>\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { Tag } from \"../../components/Tag\";\nimport { Card } from \"./Card\";\nimport \"./CardCategoryVariant.css\";\n\ntype CategoryProps = Extract<CardProps, { variant: \"category\" }>;\n\nexport const CardCategoryVariant = ({\n title,\n thumbnail,\n thumbnailAlt = \"\",\n onHeaderClick,\n articles = [],\n className,\n variant: _variant,\n ...props\n}: CategoryProps) => {\n return (\n <div\n className={[\"card-category\", className ?? \"\"].filter(Boolean).join(\" \")}\n {...props}\n >\n <div\n className=\"cc-header\"\n onClick={onHeaderClick}\n role={onHeaderClick ? \"button\" : undefined}\n tabIndex={onHeaderClick ? 0 : undefined}\n >\n <h3 className=\"cc-title\">{title}</h3>\n {thumbnail && (\n <div className=\"cc-thumbnailWrapper\">\n <img alt={thumbnailAlt} className=\"cc-thumbnailImage\" src={thumbnail} />\n </div>\n )}\n </div>\n <div className=\"cc-articleList\">\n {articles.map((article, i) => (\n <div className=\"cc-articleItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail=\"\"\n hideThumbnail\n title={article.title}\n summary=\"\"\n tags={article.date ? [{ label: article.date }] : []}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n </div>\n );\n};\n","import type { CardProps } from \"./Card.types\";\nimport { CardPrimaryVariant } from \"./CardPrimaryVariant\";\nimport { CardSecondaryVariant } from \"./CardSecondaryVariant\";\nimport { CardThumbnailVariant } from \"./CardThumbnailVariant\";\nimport { CardCategoryVariant } from \"./CardCategoryVariant\";\n\nexport const Card = (props: CardProps) => {\n if (props.variant === \"primary\") {\n return <CardPrimaryVariant {...props} />;\n }\n if (props.variant === \"secondary\") {\n return <CardSecondaryVariant {...props} />;\n }\n if (props.variant === \"category\") {\n return <CardCategoryVariant {...props} />;\n }\n return <CardThumbnailVariant {...props} />;\n};\n\nexport default Card;\n","import type { PaginationProps } from \"./Pagination.types\";\nimport \"./Pagination.css\";\n\nconst ChevronLeft = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\ntype PageItem = number | \"ellipsis-left\" | \"ellipsis-right\";\n\nfunction getPageItems(currentPage: number, totalPages: number): PageItem[] {\n if (totalPages <= 5) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n if (currentPage <= 3) {\n return [1, 2, 3, 4, 5, \"ellipsis-right\", totalPages];\n }\n if (currentPage >= totalPages - 2) {\n return [1, \"ellipsis-left\", totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages];\n }\n return [1, \"ellipsis-left\", currentPage - 1, currentPage, currentPage + 1, \"ellipsis-right\", totalPages];\n}\n\nexport const Pagination = ({\n currentPage,\n totalPages,\n onPageChange,\n className,\n}: PaginationProps) => {\n const items = getPageItems(currentPage, totalPages);\n const isPrevDisabled = currentPage <= 1;\n const isNextDisabled = currentPage >= totalPages;\n\n return (\n <nav\n className={[\"pagination\", className ?? \"\"].filter(Boolean).join(\" \")}\n aria-label=\"Pagination navigation\"\n >\n <button\n className={[\"navButton\", isPrevDisabled ? \"navButtonDisabled\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage - 1)}\n disabled={isPrevDisabled}\n aria-label=\"Previous page\"\n >\n <span className=\"navIcon\"><ChevronLeft /></span>\n </button>\n\n {items.map((item, index) => {\n if (item === \"ellipsis-left\" || item === \"ellipsis-right\") {\n return (\n <span\n key={`${item}-${index}`}\n className=\"ellipsis\"\n aria-hidden=\"true\"\n >\n …\n </span>\n );\n }\n\n const isSelected = item === currentPage;\n return (\n <button\n key={item}\n className={[\"pageButton\", isSelected ? \"pageButtonSelected\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => { if (!isSelected) onPageChange(item); }}\n aria-current={isSelected ? \"page\" : undefined}\n aria-label={`Page ${item}`}\n >\n {item}\n </button>\n );\n })}\n\n <button\n className={[\"navButton\", isNextDisabled ? \"navButtonDisabled\" : \"\"].filter(Boolean).join(\" \")}\n onClick={() => onPageChange(currentPage + 1)}\n disabled={isNextDisabled}\n aria-label=\"Next page\"\n >\n <span className=\"navIcon\"><ChevronRight /></span>\n </button>\n </nav>\n );\n};\n\nexport default Pagination;\n","import { useId, useRef } from \"react\";\nimport type { TabsProps } from \"./Tabs.types\";\nimport { Chip } from \"../Chip\";\nimport \"./Tabs.css\";\n\nexport const Tabs = ({\n items,\n activeId,\n onChange,\n idPrefix,\n className,\n ...props\n}: TabsProps) => {\n const generatedId = useId().replace(/:/g, \"\");\n const prefix = idPrefix ?? `tabs-${generatedId}`;\n const rootRef = useRef<HTMLDivElement>(null);\n\n const selectAndFocus = (index: number) => {\n const item = items[index];\n if (!item) return;\n onChange(item.id);\n rootRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[index]?.focus();\n };\n\n return (\n <div\n ref={rootRef}\n className={[\"tabs-menu w-tab-menu\", className].filter(Boolean).join(\" \")}\n role=\"tablist\"\n {...props}\n >\n {items.map((item, i) => {\n const isActive = item.id === activeId;\n return (\n <Chip\n key={item.id}\n label={item.label}\n selected={isActive}\n onClick={() => onChange(item.id)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n selectAndFocus((i + 1) % items.length);\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n selectAndFocus((i - 1 + items.length) % items.length);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n selectAndFocus(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n selectAndFocus(items.length - 1);\n }\n }}\n className={isActive ? \"tab-active\" : \"\"}\n data-w-tab={item.label}\n id={`${prefix}-tab-${i}`}\n aria-controls={`${prefix}-panel-${i}`}\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n role=\"tab\"\n />\n );\n })}\n </div>\n );\n};\n\nexport default Tabs;\n","import { useState } from \"react\";\nimport { Accordion } from \"../../components/Accordion\";\nimport type { FaqAccordionProps } from \"./FaqAccordion.types\";\nimport \"./FaqAccordion.css\";\n\nexport const FaqAccordion = ({\n title,\n items,\n colorScheme = \"white\",\n}: FaqAccordionProps) => {\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n\n const handleToggle = (index: number) => (isOpen: boolean) => {\n setOpenIndex(isOpen ? index : null);\n };\n\n return (\n <section className={[\"faq-accordion\", `faq-accordion--${colorScheme}`].join(\" \")}>\n <div className=\"faq-accordion__container\">\n <div className=\"faq-accordion__header\">\n <h2 className=\"faq-accordion__title\">{title}</h2>\n </div>\n\n <div className=\"faq-accordion__list\">\n {items.map((item, index) => (\n <Accordion\n key={`${item.question}-${index}`}\n title={item.question}\n open={openIndex === index}\n onToggle={handleToggle(index)}\n showTopDivider={false}\n showBottomDivider={index < items.length - 1}\n >\n {item.answer}\n </Accordion>\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport type {\n FeatureCardItem,\n FeatureCardPlatformLink,\n FeatureCardsProps,\n} from \"./FeatureCards.types\";\nimport \"./FeatureCards.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst PlatformIcon = ({ platform }: { platform: FeatureCardPlatformLink }) => {\n if (!platform.iconSrc) return null;\n\n return (\n <img\n alt=\"\"\n className=\"fc-platformLink-icon\"\n height={32}\n src={platform.iconSrc}\n width={32}\n />\n );\n};\n\n/* ── Two Cards sub-component ────────────────────────────────── */\n\nconst TwoCardsItem = ({ card, index }: { card: FeatureCardItem; index: number }) => {\n const isDark = card.twoTone === \"dark\";\n const showCardLink = card.showLink !== false;\n\n return (\n <div className=\"fc-twoCardWrap\">\n <div\n className={[\n \"fc-twoCard\",\n isDark ? \"fc-twoCard--dark\" : \"fc-twoCard--light\",\n ].join(\" \")}\n >\n <div className=\"fc-twoCard-body\">\n <div className=\"fc-twoCard-content\">\n <h3 className=\"fc-twoCard-title\">{card.title}</h3>\n <p className=\"fc-twoCard-description\">{card.description}</p>\n {showCardLink && (\n <div className=\"fc-twoCard-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={card.linkHref}\n label={card.linkText ?? \"Learn more\"}\n rel={externalLinkRel(card.linkHref)}\n onClick={card.onLinkClick}\n />\n </div>\n )}\n </div>\n\n {card.platforms && card.platforms.length > 0 && (\n <div className=\"fc-twoCard-platformsOuter\">\n <h3 className=\"fc-twoCard-platformsHeading\">\n {card.platformsHeading ?? \"Available on\"}\n </h3>\n <div className=\"fc-twoCard-platformRow\">\n {card.platforms.map((platform, i) => (\n <a\n key={`${platform.label}-${i}`}\n className={[\n \"fc-platformLink\",\n isDark ? \"fc-platformLink--dark\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n href={platform.href}\n rel={externalLinkRel(platform.href)}\n >\n <PlatformIcon platform={platform} />\n <span className=\"fc-platformLink-label\">{platform.label}</span>\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {card.image && (\n <div className=\"fc-twoCard-imageSection\">\n <img\n alt={card.imageAlt ?? \"\"}\n className=\"fc-twoCard-image\"\n decoding=\"async\"\n loading={index === 0 ? \"eager\" : \"lazy\"}\n src={card.image}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ── One Card sub-component ─────────────────────────────────── */\n\nconst OneCardPanel = ({ card }: { card: FeatureCardItem }) => {\n const showCardLink = card.showLink !== false;\n\n return (\n <div className=\"fc-oneCardShell\">\n <div className=\"fc-oneCardGrid fc-twoCard--dark\">\n <div className=\"fc-oneCardLeft\">\n <div className=\"fc-oneCardContentBlock\">\n <h3 className=\"fc-twoCard-title\">{card.title}</h3>\n <p className=\"fc-twoCard-description\">{card.description}</p>\n {showCardLink && (\n <div className=\"fc-twoCard-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={card.linkHref}\n label={card.linkText ?? \"Learn more\"}\n rel={externalLinkRel(card.linkHref)}\n onClick={card.onLinkClick}\n />\n </div>\n )}\n </div>\n\n {card.platforms && card.platforms.length > 0 && (\n <div className=\"fc-twoCard-platformsOuter\">\n <h3 className=\"fc-twoCard-platformsHeading\">\n {card.platformsHeading ?? \"Available on\"}\n </h3>\n <div className=\"fc-twoCard-platformRow\">\n {card.platforms.map((platform, i) => (\n <a\n key={`${platform.label}-${i}`}\n className=\"fc-platformLink fc-platformLink--dark\"\n href={platform.href}\n rel={externalLinkRel(platform.href)}\n >\n <PlatformIcon platform={platform} />\n <span className=\"fc-platformLink-label\">{platform.label}</span>\n </a>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {card.image && (\n <div className=\"fc-oneCardRight\">\n <img\n alt={card.imageAlt ?? \"\"}\n className=\"fc-oneCardImage\"\n decoding=\"async\"\n loading=\"eager\"\n src={card.image}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\n/* ── Main component ─────────────────────────────────────────── */\n\nexport const FeatureCards = ({\n variant = \"default\",\n sectionTitle,\n sectionDescription,\n showLink = false,\n linkText = \"Learn more\",\n onLinkClick,\n cardColorScheme = \"image\",\n cards,\n}: FeatureCardsProps) => {\n const sectionHeader = (\n <div className=\"fc-header\">\n <h2 className=\"fc-sectionTitle\">{sectionTitle}</h2>\n\n {sectionDescription && (\n <p className=\"fc-sectionDescription\">{sectionDescription}</p>\n )}\n\n {showLink && (\n <Link colorScheme=\"coral\" label={linkText} onClick={onLinkClick} />\n )}\n </div>\n );\n\n if (variant === \"twoCards\") {\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n {sectionHeader}\n\n <div className=\"fc-grid fc-grid--twoCards\">\n {cards.map((card, index) => (\n <TwoCardsItem\n card={card}\n index={index}\n key={`${card.title}-${index}`}\n />\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (variant === \"oneCard\") {\n const card = cards[0];\n if (!card) return null;\n\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n {sectionHeader}\n\n <OneCardPanel card={card} />\n </div>\n </section>\n );\n }\n\n return (\n <section className=\"fc-section\">\n <div className=\"fc-container\">\n {sectionHeader}\n\n <div className={`fc-grid fc-grid--${cards.length === 4 ? \"4\" : \"3\"}`}>\n {cards.map((card, index) => (\n <Card\n key={index}\n variant=\"primary\"\n colorScheme={card.colorScheme ?? cardColorScheme}\n title={card.title}\n description={card.description}\n image={card.image}\n imageAlt={card.imageAlt}\n showLink={card.showLink}\n linkText={card.linkText}\n onLinkClick={card.onLinkClick}\n />\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport type {\n FeatureCardsCarouselItem,\n FeatureCardsCarouselProps,\n FeatureCardsCarouselTone,\n} from \"./FeatureCardsCarousel.types\";\nimport \"./FeatureCardsCarousel.css\";\n\nconst TONE_CYCLE: FeatureCardsCarouselTone[] = [\"coral\", \"dark\", \"light\"];\nconst TRANSITION_MS = 500;\n\nconst DEFAULT_ITEMS: FeatureCardsCarouselItem[] = [\n {\n title: \"Feature title goes here\",\n description: \"Explain how this specific feature helps your user in one or two short sentences.\",\n tone: \"coral\",\n },\n {\n title: \"Another feature highlight\",\n description: \"Keep each slide focused on a single benefit with supporting artwork.\",\n tone: \"dark\",\n },\n {\n title: \"A third capability\",\n description: \"Carousel slides stay authored marketing content — no live market data.\",\n tone: \"light\",\n },\n];\n\nfunction resolveTone(item: FeatureCardsCarouselItem, index: number): FeatureCardsCarouselTone {\n return item.tone ?? TONE_CYCLE[index % TONE_CYCLE.length]!;\n}\n\nconst ChevronLeft = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M3.31066 8.75001L9.03033 14.4697L7.96967 15.5303L0.439339 8.00001L7.96967 0.469676L9.03033 1.53034L3.31066 7.25001L15.5 7.25L15.5 8.75L3.31066 8.75001Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst ChevronRight = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M12.6893 7.25L6.96967 1.53033L8.03033 0.469666L15.5607 8L8.03033 15.5303L6.96967 14.4697L12.6893 8.75H0.5V7.25H12.6893Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nfunction SlideCard({\n item,\n index,\n count,\n active,\n slideId,\n}: {\n item: FeatureCardsCarouselItem;\n index: number;\n count: number;\n active: boolean;\n slideId: string;\n}) {\n const tone = resolveTone(item, index);\n const cover = Boolean(item.image && item.imageFit === \"cover\");\n return (\n <article\n id={slideId}\n className={[\n \"fcc-slide\",\n `fcc-slide--${tone}`,\n cover ? \"fcc-slide--cover\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${index + 1} of ${count}`}\n aria-hidden={!active}\n >\n {cover ? (\n <img\n className=\"fcc-slide__cover\"\n src={item.image}\n alt={item.imageAlt ?? \"\"}\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : null}\n <div className=\"fcc-slide__body\">\n <h3 className=\"fcc-slide__title\">{item.title}</h3>\n <p className=\"fcc-slide__description\">{item.description}</p>\n {item.ctaLabel ? (\n item.ctaHref ? (\n <a className=\"fcc-slide__cta\" href={item.ctaHref}>\n {item.ctaLabel}\n </a>\n ) : (\n <span className=\"fcc-slide__cta\">{item.ctaLabel}</span>\n )\n ) : null}\n </div>\n {item.image && !cover ? (\n <div className=\"fcc-slide__media\">\n <img\n className=\"fcc-slide__image\"\n src={item.image}\n alt={item.imageAlt ?? \"\"}\n loading=\"lazy\"\n decoding=\"async\"\n />\n </div>\n ) : null}\n </article>\n );\n}\n\nexport const FeatureCardsCarousel = ({\n title,\n description,\n items,\n defaultActiveIndex = 0,\n autoplay = false,\n autoplayDelay = 5000,\n showArrows = true,\n showDots = true,\n className,\n}: FeatureCardsCarouselProps) => {\n const reactId = useId().replace(/:/g, \"\");\n const resolvedItems = items?.length ? items : DEFAULT_ITEMS;\n const count = resolvedItems.length;\n const clampedDefault = Math.max(0, Math.min(defaultActiveIndex, Math.max(0, count - 1)));\n\n const [activeIndex, setActiveIndex] = useState(clampedDefault);\n const [paused, setPaused] = useState(false);\n const [reducedMotion, setReducedMotion] = useState(false);\n const [stepPx, setStepPx] = useState(0);\n /** Furthest page index — stop once the last cards fill the viewport (no empty right gap). */\n const [maxIndex, setMaxIndex] = useState(Math.max(0, count - 1));\n /** Max translate in px — last page may be a partial step on very wide viewports. */\n const [maxOffsetPx, setMaxOffsetPx] = useState(0);\n const viewportRef = useRef<HTMLDivElement>(null);\n const trackRef = useRef<HTMLDivElement>(null);\n const dragState = useRef<{ startX: number } | null>(null);\n const autoplayTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const update = () => setReducedMotion(mq.matches);\n update();\n mq.addEventListener?.(\"change\", update);\n return () => mq.removeEventListener?.(\"change\", update);\n }, []);\n\n /* Measure card step + how many pages fit so we never scroll into empty space.\n Staging (5 cards @ ~1440px) advances only 3 pages / shows 3 dots. */\n useEffect(() => {\n const track = trackRef.current;\n const viewport = viewportRef.current;\n if (!track || !viewport) return;\n\n const measure = () => {\n const first = track.querySelector<HTMLElement>(\"[data-fcc-index]\");\n if (!first) return;\n const styles = window.getComputedStyle(track);\n const gap = Number.parseFloat(styles.columnGap || styles.gap) || 0;\n const cardW = first.getBoundingClientRect().width;\n const step = cardW + gap;\n setStepPx(step);\n\n const viewportStyles = window.getComputedStyle(viewport);\n const railStart = Number.parseFloat(viewportStyles.paddingInlineStart) || 0;\n const railEnd = Number.parseFloat(viewportStyles.paddingInlineEnd) || 0;\n const section = viewport.closest(\".fcc-section\") ?? viewport;\n const container = section.querySelector(\".fcc-container\");\n /* Resolve gutter in px (custom props may be rem / var()). */\n const gutterPx = container\n ? Number.parseFloat(window.getComputedStyle(container).paddingInlineStart) || 24\n : 24;\n /* Desktop bleeds mid-scroll, but the last page keeps a right inset so\n the final card isn’t flush to the viewport edge. */\n const endInset = railEnd > 0 ? railEnd : gutterPx;\n const available = Math.max(\n 0,\n viewport.getBoundingClientRect().width - railStart - endInset,\n );\n /* Stop when the last card fills the padded viewport — same as staging\n (5 cards → 3 pages on desktop; full pages on mobile with side gutters). */\n const trackWidth = count * step - gap;\n const maxOffset = Math.max(0, trackWidth - available);\n setMaxOffsetPx(maxOffset);\n\n /* Page count: round keeps ~3 dots at mid widths. On ultrawide, round can\n collapse to 1 advance (2 dots) while 2+ cards remain off-screen — bump\n to 2 advances (3 dots), matching staging. Clamp translate to maxOffset\n so the last page never opens a large empty gap. */\n const ratio = step > 0 ? maxOffset / step : 0;\n let nextMax = Math.min(count - 1, Math.round(ratio));\n if (ratio > 1 && nextMax < 2) {\n nextMax = Math.min(count - 1, 2);\n } else if (ratio > 0 && nextMax < 1) {\n nextMax = Math.min(count - 1, Math.ceil(ratio - 1e-6));\n }\n setMaxIndex(nextMax);\n setActiveIndex((current) => Math.min(current, nextMax));\n };\n\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(viewport);\n ro?.observe(track);\n window.addEventListener(\"resize\", measure);\n return () => {\n ro?.disconnect();\n window.removeEventListener(\"resize\", measure);\n };\n }, [count]);\n\n const pageCount = maxIndex + 1;\n\n const goTo = useCallback(\n (index: number) => {\n if (pageCount <= 1) return;\n setActiveIndex(Math.max(0, Math.min(index, maxIndex)));\n },\n [pageCount, maxIndex],\n );\n\n const goNext = useCallback(() => goTo(activeIndex + 1), [activeIndex, goTo]);\n const goPrev = useCallback(() => goTo(activeIndex - 1), [activeIndex, goTo]);\n\n useEffect(() => {\n if (!autoplay || paused || reducedMotion || pageCount <= 1) return;\n autoplayTimer.current = setTimeout(() => {\n setActiveIndex((current) => (current >= maxIndex ? 0 : current + 1));\n }, Math.max(2000, autoplayDelay));\n return () => {\n if (autoplayTimer.current) clearTimeout(autoplayTimer.current);\n };\n }, [autoplay, autoplayDelay, paused, reducedMotion, pageCount, maxIndex, activeIndex]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (pageCount <= 1) return;\n dragState.current = { startX: event.clientX };\n setPaused(true);\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const onPointerUp = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dragState.current) return;\n const delta = event.clientX - dragState.current.startX;\n dragState.current = null;\n setPaused(false);\n const THRESHOLD = 48;\n if (delta > THRESHOLD) goPrev();\n else if (delta < -THRESHOLD) goNext();\n };\n\n const onKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n goNext();\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n goPrev();\n } else if (event.key === \"Home\") {\n event.preventDefault();\n goTo(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n goTo(maxIndex);\n }\n };\n\n const canPrev = activeIndex > 0;\n const canNext = activeIndex < maxIndex;\n const headingId = `fcc-heading-${reactId}`;\n const descId = description ? `fcc-desc-${reactId}` : undefined;\n /* Intermediate pages step by card width; the last page snaps to maxOffset so\n the final card keeps a right-edge inset instead of sitting flush. */\n const offset =\n stepPx <= 0\n ? 0\n : activeIndex >= maxIndex\n ? maxOffsetPx\n : activeIndex * stepPx;\n\n const trackStyle: CSSProperties = {\n transform: `translate3d(-${offset}px, 0, 0)`,\n transitionDuration: reducedMotion ? \"0ms\" : `${TRANSITION_MS}ms`,\n };\n\n return (\n <section\n className={[\"fcc-section\", className].filter(Boolean).join(\" \")}\n aria-labelledby={headingId}\n aria-describedby={descId}\n >\n <div className=\"fcc-container\">\n <header className=\"fcc-header\">\n <h2 id={headingId} className=\"fcc-title\">\n {title}\n </h2>\n {description ? (\n <p id={descId} className=\"fcc-description\">\n {description}\n </p>\n ) : null}\n </header>\n </div>\n\n <div\n className=\"fcc-carousel\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={title}\n onMouseEnter={() => setPaused(true)}\n onMouseLeave={() => setPaused(false)}\n onFocusCapture={() => setPaused(true)}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget as Node)) {\n setPaused(false);\n }\n }}\n >\n {/* Viewport starts on the content rail; track overflows right to the screen edge */}\n <div\n ref={viewportRef}\n className=\"fcc-viewport\"\n tabIndex={0}\n aria-live={autoplay && !paused ? \"off\" : \"polite\"}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n >\n <div ref={trackRef} className=\"fcc-track\" style={trackStyle}>\n {resolvedItems.map((item, index) => {\n const slideId = `fcc-slide-${reactId}-${index}`;\n const active = index === activeIndex;\n return (\n <div\n key={slideId}\n className={[\"fcc-track__item\", active ? \"is-active\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n data-fcc-index={index}\n aria-current={active ? \"true\" : undefined}\n >\n <SlideCard\n item={item}\n index={index}\n count={count}\n active={active}\n slideId={slideId}\n />\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"fcc-controls\">\n {showDots && pageCount > 1 ? (\n <div className=\"fcc-dots\" role=\"tablist\" aria-label=\"Slide navigation\">\n {Array.from({ length: pageCount }, (_, index) => {\n const selected = index === activeIndex;\n const slideId = `fcc-slide-${reactId}-${index}`;\n return (\n <button\n key={slideId}\n type=\"button\"\n role=\"tab\"\n className={selected ? \"fcc-dot is-active\" : \"fcc-dot\"}\n aria-label={`Show slide ${index + 1} of ${pageCount}`}\n aria-controls={slideId}\n aria-selected={selected}\n tabIndex={selected ? 0 : -1}\n onClick={() => goTo(index)}\n />\n );\n })}\n </div>\n ) : (\n <span className=\"fcc-controls__spacer\" aria-hidden=\"true\" />\n )}\n\n {showArrows && pageCount > 1 ? (\n <div className=\"fcc-arrows\">\n {canPrev ? (\n <button\n type=\"button\"\n className=\"fcc-arrow\"\n aria-label=\"Previous slide\"\n onClick={goPrev}\n >\n <ChevronLeft />\n </button>\n ) : null}\n {canNext ? (\n <button\n type=\"button\"\n className=\"fcc-arrow\"\n aria-label=\"Next slide\"\n onClick={goNext}\n >\n <ChevronRight />\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n\n {autoplay ? (\n <div className=\"fcc-controls\">\n <button\n type=\"button\"\n className=\"fcc-pause\"\n aria-pressed={paused}\n onClick={() => setPaused((value) => !value)}\n >\n {paused ? \"Play slideshow\" : \"Pause slideshow\"}\n </button>\n </div>\n ) : null}\n </div>\n </section>\n );\n};\n\nexport default FeatureCardsCarousel;\n","import { useId } from \"react\";\nimport type {\n ComparisonCardsCard,\n ComparisonCardsProps,\n ComparisonCardsTheme,\n} from \"./ComparisonCards.types\";\nimport \"./ComparisonCards.css\";\n\nconst THEME_CYCLE: ComparisonCardsTheme[] = [\"light\", \"dark\"];\n\nconst DEFAULT_CARDS: ComparisonCardsCard[] = [\n {\n title: \"Option A\",\n description: \"Explain how this option works in one or two short sentences.\",\n theme: \"light\",\n rows: [\n { label: \"What you hold\", value: \"Asset or contract\" },\n { label: \"Maximum loss\", value: \"Your investment\" },\n { label: \"Holding cost\", value: \"None\" },\n { label: \"Cost per trade\", value: \"Fee\" },\n ],\n },\n {\n title: \"Option B\",\n description: \"Explain the alternate option and when a customer might choose it.\",\n theme: \"dark\",\n rows: [\n { label: \"What you hold\", value: \"Asset or contract\" },\n { label: \"Maximum loss\", value: \"Up to your margin\" },\n { label: \"Holding cost\", value: \"Funding or swap\" },\n { label: \"Cost per trade\", value: \"Fee\" },\n ],\n footnote: \"Optional risk disclaimer for this option only.\",\n },\n];\n\nfunction resolveTheme(card: ComparisonCardsCard, index: number): ComparisonCardsTheme {\n return card.theme ?? THEME_CYCLE[index % THEME_CYCLE.length]!;\n}\n\nfunction ComparisonCard({\n card,\n index,\n headingId,\n}: {\n card: ComparisonCardsCard;\n index: number;\n headingId: string;\n}) {\n const theme = resolveTheme(card, index);\n const rows = card.rows?.length ? card.rows : [];\n\n return (\n <article\n className={`cc-card cc-card--${theme}`}\n aria-labelledby={headingId}\n >\n <div className=\"cc-card__intro\">\n <h3 id={headingId} className=\"cc-card__title\">\n {card.title}\n </h3>\n <p className=\"cc-card__description\">{card.description}</p>\n </div>\n\n <div className=\"cc-card__body\">\n {rows.length > 0 ? (\n <dl className=\"cc-rows\">\n {rows.map((row, rowIndex) => (\n <div\n key={`${row.label}-${rowIndex}`}\n className={[\n \"cc-row\",\n rowIndex === rows.length - 1 ? \"is-last\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <dt className=\"cc-row__label\">{row.label}</dt>\n <dd className=\"cc-row__value\">{row.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {card.footnote ? (\n <p className=\"cc-card__footnote\">\n <em>{card.footnote}</em>\n </p>\n ) : null}\n </div>\n </article>\n );\n}\n\nexport const ComparisonCards = ({\n title,\n description,\n cards,\n className,\n}: ComparisonCardsProps) => {\n const reactId = useId().replace(/:/g, \"\");\n const resolvedCards = cards?.length ? cards.slice(0, 3) : DEFAULT_CARDS;\n const visibleCards = resolvedCards;\n const headingId = `cc-heading-${reactId}`;\n const descId = description ? `cc-desc-${reactId}` : undefined;\n\n return (\n <section\n className={[\"cc-section\", className].filter(Boolean).join(\" \")}\n aria-labelledby={headingId}\n aria-describedby={descId}\n >\n <div className=\"cc-container\">\n <header className=\"cc-header\">\n <h2 id={headingId} className=\"cc-title\">\n {title}\n </h2>\n {description ? (\n <p id={descId} className=\"cc-description\">\n {description}\n </p>\n ) : null}\n </header>\n\n <div\n className={`cc-grid cc-grid--${visibleCards.length}`}\n role=\"list\"\n >\n {visibleCards.map((card, index) => (\n <div key={`${card.title}-${index}`} role=\"listitem\">\n <ComparisonCard\n card={card}\n index={index}\n headingId={`cc-card-${reactId}-${index}`}\n />\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n};\n\nexport default ComparisonCards;\n","import { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport type { FeatureCardsIconProps } from \"./FeatureCardsIcon.types\";\nimport \"./FeatureCardsIcon.css\";\n\nexport const FeatureCardsIcon = ({\n sectionTitle,\n sectionDescription,\n showLink = false,\n linkText = \"Learn more\",\n onLinkClick,\n cards,\n}: FeatureCardsIconProps) => {\n return (\n <section className=\"fci-section\">\n <div className=\"fci-container\">\n <div className=\"fci-header\">\n {sectionTitle && <h2 className=\"fci-sectionTitle\">{sectionTitle}</h2>}\n\n {sectionDescription && (\n <p className=\"fci-sectionDescription\">{sectionDescription}</p>\n )}\n\n {showLink && (\n <Link colorScheme=\"coral\" label={linkText} onClick={onLinkClick} />\n )}\n </div>\n\n <div className={`fci-grid fci-grid--${cards.length === 4 ? \"4\" : \"3\"}`}>\n {cards.map((card, index) => (\n <Card\n key={index}\n variant=\"secondary\"\n title={card.title}\n description={card.description}\n icon={card.icon}\n showIcon={card.showIcon}\n showLink={card.showLink}\n linkText={card.linkText}\n onLinkClick={card.onLinkClick}\n />\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import type { FeatureBulletsProps } from \"./FeatureBullets.types\";\nimport \"./FeatureBullets.css\";\n\nconst CheckIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" className=\"feature-bullets__icon\">\n <path d=\"M12 4.375C9.07031 4.375 6.41406 5.9375 4.92969 8.4375C3.48438 10.9766 3.48438 14.0625 4.92969 16.5625C6.41406 19.1016 9.07031 20.625 12 20.625C14.8906 20.625 17.5469 19.1016 19.0312 16.5625C20.4766 14.0625 20.4766 10.9766 19.0312 8.4375C17.5469 5.9375 14.8906 4.375 12 4.375ZM12 22.5C8.40625 22.5 5.125 20.625 3.32812 17.5C1.53125 14.4141 1.53125 10.625 3.32812 7.5C5.125 4.41406 8.40625 2.5 12 2.5C15.5547 2.5 18.8359 4.41406 20.6328 7.5C22.4297 10.625 22.4297 14.4141 20.6328 17.5C18.8359 20.625 15.5547 22.5 12 22.5ZM16.4141 10.6641L11.4141 15.6641C11.0234 16.0547 10.4375 16.0547 10.0859 15.6641L7.58594 13.1641C7.19531 12.8125 7.19531 12.2266 7.58594 11.875C7.9375 11.4844 8.52344 11.4844 8.91406 11.875L10.75 13.7109L15.0859 9.375C15.4375 8.98438 16.0234 8.98438 16.4141 9.375C16.7656 9.72656 16.7656 10.3125 16.4141 10.6641Z\" fill=\"currentColor\" />\n </svg>\n);\n\nexport const FeatureBullets = ({\n title,\n bullets,\n image,\n imageAlt = \"\",\n imagePosition = \"right\",\n}: FeatureBulletsProps) => {\n return (\n <section className=\"feature-bullets\">\n <div className=\"feature-bullets__container\">\n <div\n className={[\n \"feature-bullets__split\",\n imagePosition === \"left\" ? \"feature-bullets__split--image-left\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"feature-bullets__content\">\n <h2 className=\"feature-bullets__title\">{title}</h2>\n\n {bullets && bullets.length > 0 && (\n <div className=\"feature-bullets__bullet-list\">\n {bullets.map((bullet, i) => (\n <div key={i} className=\"feature-bullets__bullet-item\">\n <div className=\"feature-bullets__icon-wrapper\">\n <CheckIcon />\n </div>\n <p className=\"feature-bullets__bullet-text\">{bullet}</p>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {image && (\n <div className=\"feature-bullets__image-wrapper\">\n <img\n alt={imageAlt}\n className=\"feature-bullets__image\"\n src={image}\n />\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureBullets;\n","import { useState } from \"react\";\nimport type { FooterProps, FooterDerivGoProps, FooterTradeOnProps } from \"./Footer.types\";\nimport \"./Footer.css\";\n\n/* ── Internal icons ───────────────────────────────────────────── */\n\nconst ExternalLinkIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M2 2H10M10 2V10M10 2L2 10\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M2 4L6 8L10 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ── Deriv GO shared content ──────────────────────────────────── */\n\ninterface DerivGoBadgesProps {\n googlePlayBadge?: FooterDerivGoProps[\"googlePlayBadge\"];\n appStoreBadge?: FooterDerivGoProps[\"appStoreBadge\"];\n huaweiBadge?: FooterDerivGoProps[\"huaweiBadge\"];\n availabilityNote?: string;\n}\n\nconst DerivGoBadges = ({\n googlePlayBadge,\n appStoreBadge,\n huaweiBadge,\n availabilityNote,\n}: DerivGoBadgesProps) => (\n <>\n <div className=\"footer__app-badges\">\n {googlePlayBadge && (\n <a\n href={googlePlayBadge.href}\n className={googlePlayBadge.icon ? \"footer__app-badge-svg\" : \"footer__app-badge\"}\n aria-label={googlePlayBadge.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {googlePlayBadge.icon ?? <img src={googlePlayBadge.imageSrc} alt={googlePlayBadge.imageAlt} />}\n </a>\n )}\n {appStoreBadge && (\n <a\n href={appStoreBadge.href}\n className={appStoreBadge.icon ? \"footer__app-badge-svg\" : \"footer__app-badge\"}\n aria-label={appStoreBadge.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {appStoreBadge.icon ?? <img src={appStoreBadge.imageSrc} alt={appStoreBadge.imageAlt} />}\n </a>\n )}\n {huaweiBadge && (\n <a\n href={huaweiBadge.href}\n className={huaweiBadge.icon ? \"footer__app-badge-svg\" : \"footer__app-badge\"}\n aria-label={huaweiBadge.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {huaweiBadge.icon ?? <img src={huaweiBadge.imageSrc} alt={huaweiBadge.imageAlt} />}\n </a>\n )}\n </div>\n {availabilityNote && (\n <p className=\"footer__app-note\">{availabilityNote}</p>\n )}\n</>\n);\n\n/* ── Nav link ─────────────────────────────────────────────────── */\n\ninterface NavLinkProps {\n label: string;\n href?: string;\n isExternal?: boolean;\n onClick?: () => void;\n}\n\nconst NavLink = ({ label, href, isExternal, onClick }: NavLinkProps) => (\n <a\n href={href}\n className=\"footer__nav-link\"\n onClick={onClick}\n {...(isExternal ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n >\n {label}\n {isExternal && <ExternalLinkIcon />}\n </a>\n);\n\n/* ── Trade-on banner (e.g. \"Trade on TradingView\") ────────────── */\n\nconst TradeOnBanner = ({ imageSrc, imageAlt, href }: FooterTradeOnProps) => (\n <a\n href={href}\n className=\"footer__trade-on\"\n aria-label={imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img src={imageSrc} alt={imageAlt} className=\"footer__trade-on-img\" />\n </a>\n);\n\n/* ── Footer ───────────────────────────────────────────────────── */\n\nexport const Footer = ({\n logoSrc,\n logoAlt = \"Deriv\",\n navColumns,\n socialLinks = [],\n derivGo,\n tradingView,\n investorsInPeopleSrc,\n investorsInPeopleAlt = \"Investors in People - Platinum\",\n investorsInPeopleInHeader = false,\n licenseText,\n riskWarningText,\n aiSummary,\n className,\n ...props\n}: FooterProps) => {\n // Flatten all nav sections for the mobile/tablet accordion\n const allSections = navColumns.flat();\n\n const [openSections, setOpenSections] = useState<Set<number>>(new Set());\n\n const toggleSection = (index: number) => {\n setOpenSections((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const aiLabel = aiSummary?.label ?? \"Ask AI for a summary of Deriv\";\n\n return (\n <footer\n className={[\"footer\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"footer__inner\">\n\n {/* ── HEADER ROW: Logo · [AI bar — desktop] · Social icons ── */}\n <div className=\"footer__header\">\n <div className=\"footer__logo-wrapper\">\n <img\n src={logoSrc}\n alt={logoAlt}\n className=\"footer__logo\"\n />\n </div>\n\n {/* AI summary bar — visible only on desktop, inline in header */}\n {aiSummary && (\n <div className=\"footer__ai-bar footer__ai-bar--inline\">\n <span className=\"footer__ai-bar-label\">{aiLabel}</span>\n <div className=\"footer__ai-bar-icons\">\n {aiSummary.items.map((item, i) => (\n <a\n key={i}\n href={item.href}\n aria-label={item.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img className=\"footer__ai-icon\" src={item.imageSrc} alt={item.imageAlt} />\n </a>\n ))}\n </div>\n </div>\n )}\n\n <div\n className={[\n \"footer__social\",\n \"footer__social--in-header\",\n investorsInPeopleInHeader && \"footer__social--centered\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {socialLinks.map((link, i) => (\n <a\n key={i}\n href={link.href}\n className=\"footer__social-icon\"\n aria-label={link.ariaLabel}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {link.icon}\n </a>\n ))}\n </div>\n\n {investorsInPeopleInHeader && investorsInPeopleSrc && (\n <div className=\"footer__investors-header\">\n <img\n src={investorsInPeopleSrc}\n alt={investorsInPeopleAlt}\n className=\"footer__investors-img\"\n />\n </div>\n )}\n </div>\n\n {/* ── AI SUMMARY BAR — mobile only (standalone card) ── */}\n {aiSummary && (\n <div className=\"footer__ai-section\">\n <div className=\"footer__ai-bar footer__ai-bar--block\">\n <span className=\"footer__ai-bar-label\">{aiLabel}</span>\n <div className=\"footer__ai-bar-icons\">\n {aiSummary.items.map((item, i) => (\n <a\n key={i}\n href={item.href}\n aria-label={item.imageAlt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img className=\"footer__ai-icon\" src={item.imageSrc} alt={item.imageAlt} />\n </a>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* ── NAVIGATION — Desktop: multi-column grid + sidebar ── */}\n <div className=\"footer__nav footer__nav--columns\">\n {navColumns.map((column, colIdx) => (\n <div key={colIdx} className=\"footer__column\">\n {column.map((section, secIdx) => (\n <div key={secIdx} className=\"footer__nav-section\">\n <p className=\"footer__nav-title\">{section.title}</p>\n <ul className=\"footer__nav-links\">\n {section.links.map((link, linkIdx) => (\n <li key={linkIdx}>\n <NavLink {...link} />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n ))}\n\n {/* Desktop sidebar: Investors in People + Deriv GO with QR */}\n <div className=\"footer__sidebar\">\n {investorsInPeopleSrc && !investorsInPeopleInHeader && (\n <div className=\"footer__investors-card\">\n <img\n src={investorsInPeopleSrc}\n alt={investorsInPeopleAlt}\n className=\"footer__investors-img\"\n />\n </div>\n )}\n\n {derivGo && (\n <div className=\"footer__deriv-go-card\">\n <div className=\"footer__deriv-go-header\">\n <img\n src={derivGo.logoSrc}\n alt={derivGo.logoAlt ?? \"Deriv GO\"}\n className=\"footer__deriv-go-logo\"\n />\n <span className=\"footer__deriv-go-title\">\n {derivGo.title ?? \"Deriv GO\"}\n </span>\n </div>\n <p className=\"footer__deriv-go-desc\">\n {derivGo.description ?? \"Trade multipliers on our mobile app.\"}\n </p>\n {(derivGo.qrCodeSrc || derivGo.qrCodeIcon) && (\n <div\n className={[\n \"footer__deriv-go-qr\",\n derivGo.qrCodeIcon && \"footer__deriv-go-qr--framed\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {derivGo.qrCodeIcon ? (\n <div className=\"footer__deriv-go-qr-icon\">\n {derivGo.qrCodeIcon}\n </div>\n ) : (\n <img\n src={derivGo.qrCodeSrc}\n alt={derivGo.qrCodeAlt ?? \"Scan to download\"}\n className=\"footer__deriv-go-qr-img\"\n />\n )}\n <span className=\"footer__deriv-go-qr-label\">\n {derivGo.scanToDownloadLabel ?? \"Scan to download\"}\n </span>\n </div>\n )}\n <DerivGoBadges\n googlePlayBadge={derivGo.googlePlayBadge}\n appStoreBadge={derivGo.appStoreBadge}\n huaweiBadge={derivGo.huaweiBadge}\n availabilityNote={derivGo.availabilityNote}\n />\n </div>\n )}\n\n {tradingView && <TradeOnBanner {...tradingView} />}\n </div>\n </div>\n\n {/* ── NAVIGATION — Mobile/Tablet: accordion ── */}\n <div className=\"footer__nav footer__nav--accordion\">\n {allSections.map((section, idx) => {\n const isOpen = openSections.has(idx);\n return (\n <div\n key={idx}\n className={[\n \"footer__accordion-item\",\n isOpen && \"footer__accordion-item--open\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <button\n type=\"button\"\n className=\"footer__accordion-toggle\"\n onClick={() => toggleSection(idx)}\n aria-expanded={isOpen}\n >\n <span className=\"footer__accordion-label\">\n {section.title}\n </span>\n <span className=\"footer__accordion-chevron\">\n <ChevronDownIcon />\n </span>\n </button>\n {isOpen && (\n <ul className=\"footer__accordion-links\">\n {section.links.map((link, linkIdx) => (\n <li key={linkIdx}>\n <NavLink {...link} />\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n })}\n </div>\n\n {/* ── SOCIAL ICONS — Mobile only (standalone, above Deriv GO) ── */}\n {socialLinks.length > 0 && (\n <div className=\"footer__social footer__social--standalone\">\n {socialLinks.map((link, i) => (\n <a\n key={i}\n href={link.href}\n className=\"footer__social-icon\"\n aria-label={link.ariaLabel}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {link.icon}\n </a>\n ))}\n </div>\n )}\n\n {/* ── DERIV GO BANNER — Mobile/Tablet stacked (no QR) ── */}\n {derivGo && (\n <div className=\"footer__deriv-go-banner\">\n <div className=\"footer__deriv-go-banner-info\">\n <div className=\"footer__deriv-go-header\">\n <img\n src={derivGo.logoSrc}\n alt={derivGo.logoAlt ?? \"Deriv GO\"}\n className=\"footer__deriv-go-logo\"\n />\n <span className=\"footer__deriv-go-title\">\n {derivGo.title ?? \"Deriv GO\"}\n </span>\n </div>\n <p className=\"footer__deriv-go-desc\">\n {derivGo.description ?? \"Trade multipliers on our mobile app.\"}\n </p>\n </div>\n <div className=\"footer__deriv-go-banner-badges\">\n <DerivGoBadges\n googlePlayBadge={derivGo.googlePlayBadge}\n appStoreBadge={derivGo.appStoreBadge}\n huaweiBadge={derivGo.huaweiBadge}\n availabilityNote={derivGo.availabilityNote}\n />\n </div>\n </div>\n )}\n\n {/* ── TRADE ON TRADINGVIEW — Mobile/Tablet only (desktop shows it in the sidebar) ── */}\n {tradingView && (\n <div className=\"footer__trade-on-stacked\">\n <TradeOnBanner {...tradingView} />\n </div>\n )}\n\n {/* ── LEGAL & RISK WARNING ── */}\n {(licenseText || riskWarningText) && (\n <div className=\"footer__legal-block\">\n {licenseText && (\n <div className=\"footer__license\">{licenseText}</div>\n )}\n {riskWarningText && (\n <div className=\"footer__risk-warning\">\n <p className=\"footer__risk-warning-text\">{riskWarningText}</p>\n </div>\n )}\n </div>\n )}\n\n {/* ── INVESTORS IN PEOPLE — Mobile/Tablet (centred) ── */}\n {investorsInPeopleSrc && (\n <div className=\"footer__investors-stacked\">\n <img\n src={investorsInPeopleSrc}\n alt={investorsInPeopleAlt}\n className=\"footer__investors-img\"\n />\n </div>\n )}\n </div>\n </footer>\n );\n};\n\nexport default Footer;\n","import React from \"react\";\nimport type { HeroTrustpilotProps } from \"./Hero.types\";\n\n/* ── Trustpilot band (opt-in) ─────────────────────────────────\n * Mirrors deriv.com's `home-hero_trustpilot-wrapper`: a flat dark 56px strip\n * pinned to the bottom edge of the hero, holding \"stars · score copy ·\n * Trustpilot wordmark\" as a single outbound link. Square-cornered at rest;\n * the hero's scroll-shrink animation rounds it together with the section. Rendered only when `Hero` receives a `trustpilot`\n * prop, so heroes without it are byte-for-byte unchanged.\n *\n * Star and wordmark geometry is Trustpilot's own (the same SVGs deriv.com\n * serves), drawn inline so no asset file or network fetch is needed and the\n * star fill can follow the score.\n * ──────────────────────────────────────────────────────────── */\n\nexport const DEFAULT_TRUSTPILOT_URL =\n \"https://www.trustpilot.com/review/deriv.com?utm_medium=trustbox&utm_source=Mini\";\n\nconst STAR_CELL = 24;\nconst STAR_GAP = 8;\nconst STAR_COUNT = 5;\nconst STARS_WIDTH = STAR_COUNT * STAR_CELL + (STAR_COUNT - 1) * STAR_GAP; // 152\n\n/* Star glyph as drawn in Trustpilot's `stars-*.svg`, in a 24×24 cell. */\nconst STAR_GLYPH =\n \"M15.6562 15.2812L12 16.25L17.1875 20L15.6562 15.2812ZM20.4062 10.125L12 16.25L6.78125 20L8.78125 13.9062L3.5625 10.125H10L12 4L13.9688 10.125H20.4062Z\";\n\n/**\n * Trustpilot's display rounding: .25–.74 shows a half star, ≥ .75 rounds up.\n * A 4.3 TrustScore therefore renders four full stars and one half star.\n */\nexport function trustpilotStars(score: number): number {\n const clamped = Math.max(0, Math.min(STAR_COUNT, score));\n const whole = Math.floor(clamped);\n const frac = clamped - whole;\n const rounded = frac < 0.25 ? 0 : frac < 0.75 ? 0.5 : 1;\n return Math.min(STAR_COUNT, whole + rounded);\n}\n\nconst Stars = ({ score }: { score: number }) => {\n const stars = trustpilotStars(score);\n return (\n <svg\n className=\"hero__trustpilot-stars\"\n viewBox={`0 0 ${STARS_WIDTH} ${STAR_CELL}`}\n width={STARS_WIDTH}\n height={STAR_CELL}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {Array.from({ length: STAR_COUNT }, (_, i) => {\n const x = i * (STAR_CELL + STAR_GAP);\n const fill = Math.max(0, Math.min(1, stars - i));\n return (\n <g key={i} transform={`translate(${x} 0)`}>\n {/* Empty portion of the cell */}\n <rect\n width={STAR_CELL}\n height={STAR_CELL}\n className=\"hero__trustpilot-star-empty\"\n />\n {/* Filled portion — partial width for the half star */}\n {fill > 0 && (\n <rect\n width={STAR_CELL * fill}\n height={STAR_CELL}\n className=\"hero__trustpilot-star-fill\"\n />\n )}\n <path d={STAR_GLYPH} className=\"hero__trustpilot-star-glyph\" />\n </g>\n );\n })}\n </svg>\n );\n};\n\n/* Trustpilot wordmark (100×24), text in currentColor, brand-green star. */\nconst Wordmark = () => (\n <svg\n className=\"hero__trustpilot-logo\"\n viewBox=\"0 0 100 24\"\n width={100}\n height={24}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n className=\"hero__trustpilot-logo-text\"\n d=\"M26.2033 8.56587H36.289V10.4286H32.3323V20.8067H30.16V10.3906H26.2033V8.56587ZM35.8623 11.9112H37.7242V13.6219H37.763C37.8406 13.3938 37.957 13.1657 38.1122 12.9376C38.2673 12.7095 38.5001 12.4814 38.7328 12.3294C38.9656 12.1393 39.2371 11.9872 39.5086 11.8732C39.7802 11.7591 40.0905 11.6831 40.4008 11.6831C40.6336 11.6831 40.7887 11.6831 40.8663 11.6831C40.9439 11.6831 41.0603 11.7211 41.1378 11.7211V13.5839C40.9827 13.5458 40.8663 13.5458 40.7111 13.5078C40.556 13.5078 40.4396 13.4698 40.2845 13.4698C39.9353 13.4698 39.625 13.5458 39.3535 13.6599C39.0431 13.7739 38.8104 14.002 38.5776 14.2301C38.3449 14.4962 38.1897 14.8003 38.0346 15.1805C37.9182 15.5606 37.8406 15.9788 37.8406 16.473V20.6927H35.8623V11.9112ZM48.353 20.7687V19.5522H48.3142C48.0814 20.0084 47.6935 20.3505 47.228 20.6166C46.7625 20.8827 46.2583 21.0348 45.754 21.0348C44.5515 21.0348 43.6981 20.7687 43.1938 20.1605C42.6507 19.5902 42.418 18.7159 42.418 17.5374V11.9112H44.3963V17.3473C44.3963 18.1076 44.5514 18.6779 44.8618 18.982C45.1721 19.2861 45.5988 19.4762 46.1419 19.4762C46.5686 19.4762 46.9177 19.4002 47.1892 19.2861C47.4608 19.1721 47.6935 18.982 47.8487 18.7919C48.0426 18.6018 48.159 18.3357 48.2366 18.0316C48.3142 17.7275 48.353 17.4234 48.353 17.0812V11.9492H50.3313V20.7687H48.353ZM53.7061 17.9176C53.7837 18.4878 53.9776 18.8679 54.3656 19.1341C54.7535 19.3621 55.219 19.4762 55.762 19.4762C55.956 19.4762 56.1499 19.4762 56.3827 19.4382C56.6154 19.4002 56.8482 19.3621 57.0421 19.2861C57.2361 19.2101 57.43 19.096 57.5464 18.944C57.6628 18.7919 57.7404 18.6018 57.7404 18.3357C57.7404 18.0696 57.624 17.8796 57.4688 17.7275C57.2749 17.5754 57.0809 17.4614 56.8094 17.3473C56.5378 17.2713 56.2275 17.1573 55.8784 17.0812C55.5293 17.0052 55.1802 16.9292 54.831 16.8532C54.4431 16.7771 54.094 16.6631 53.7449 16.549C53.3958 16.435 53.0855 16.2829 52.8139 16.0929C52.5424 15.9028 52.3096 15.6367 52.1545 15.3325C51.9993 15.0284 51.9217 14.6483 51.9217 14.2301C51.9217 13.7359 52.0381 13.3558 52.2708 13.0136C52.5036 12.6715 52.8139 12.4434 53.163 12.2153C53.5509 12.0252 53.9389 11.8732 54.4043 11.7971C54.8698 11.7211 55.2965 11.6831 55.6844 11.6831C56.1499 11.6831 56.6154 11.7211 57.0033 11.8352C57.43 11.9112 57.8179 12.1013 58.1671 12.2913C58.5162 12.5194 58.7877 12.7855 59.0205 13.1277C59.2532 13.4698 59.4084 13.888 59.4472 14.3822H57.3525C57.2749 13.926 57.0421 13.5839 56.693 13.4318C56.3439 13.2797 55.956 13.2037 55.5293 13.2037C55.3741 13.2037 55.219 13.2037 55.025 13.2417C54.831 13.2797 54.6371 13.3177 54.4819 13.3558C54.3268 13.4318 54.1716 13.5078 54.0552 13.6219C53.9389 13.7359 53.8613 13.888 53.8613 14.0781C53.8613 14.3061 53.9389 14.4962 54.1328 14.6483C54.288 14.8003 54.5207 14.9144 54.7923 15.0284C55.0638 15.1045 55.3741 15.2185 55.7232 15.2945C56.0724 15.3706 56.4215 15.4466 56.8094 15.5226C57.1585 15.5987 57.5076 15.7127 57.8567 15.8267C58.2059 15.9408 58.5162 16.0929 58.7877 16.2829C59.0593 16.473 59.292 16.7391 59.4472 17.0052C59.6023 17.2713 59.7187 17.6515 59.7187 18.1076C59.7187 18.6399 59.6023 19.058 59.3308 19.4382C59.098 19.8183 58.7489 20.0844 58.3998 20.3125C58.0119 20.5406 57.5852 20.6927 57.0809 20.8067C56.6154 20.9208 56.1499 20.9588 55.6457 20.9588C55.0638 20.9588 54.5595 20.8827 54.0552 20.7687C53.5897 20.6547 53.163 20.4646 52.8139 20.1985C52.4648 19.9324 52.1933 19.6282 51.9605 19.2481C51.7666 18.8679 51.6502 18.4118 51.6502 17.8796L53.7061 17.9176ZM60.2618 11.9112H61.7746V9.25014H63.753V11.9112H65.5373V13.3558H63.753V18.0696C63.753 18.2597 63.753 18.4498 63.7917 18.6018C63.7917 18.7539 63.8693 18.8679 63.9081 18.982C63.9857 19.096 64.0633 19.1721 64.1797 19.2101C64.296 19.2481 64.49 19.2861 64.7227 19.2861C64.8779 19.2861 64.9943 19.2861 65.1494 19.2861C65.3046 19.2861 65.421 19.2481 65.5761 19.2101V20.7307C65.3434 20.7687 65.1494 20.7687 64.9167 20.8067C64.7227 20.8447 64.49 20.8447 64.2572 20.8447C63.7142 20.8447 63.3263 20.8067 62.9771 20.6927C62.6668 20.6166 62.3953 20.4646 62.2401 20.2745C62.0462 20.0844 61.9298 19.8563 61.8522 19.5522C61.7746 19.2861 61.7358 18.944 61.7358 18.5638V13.3938H60.223L60.2618 11.9112ZM66.9726 11.9112H68.8734V13.1277H68.9122C69.1837 12.5955 69.5716 12.2533 70.0759 12.0252C70.5802 11.7971 71.1232 11.6831 71.7051 11.6831C72.4033 11.6831 73.024 11.7971 73.5671 12.0633C74.1101 12.2913 74.5368 12.6335 74.8859 13.0897C75.2351 13.5078 75.5066 14.04 75.6618 14.5722C75.8557 15.1425 75.9333 15.7507 75.9333 16.397C75.9333 17.0052 75.8557 17.5754 75.7006 18.1076C75.5454 18.6779 75.3127 19.1721 75.0023 19.5902C74.692 20.0084 74.2653 20.3505 73.7998 20.6166C73.2955 20.8827 72.7524 20.9968 72.0542 20.9968C71.7827 20.9968 71.4723 20.9588 71.2008 20.9208C70.9293 20.8827 70.6189 20.7687 70.3474 20.6547C70.0759 20.5406 69.8431 20.3885 69.6104 20.1985C69.3776 20.0084 69.1837 19.8183 69.0285 19.5902H68.9897V24H67.0114V11.9112H66.9726ZM73.9162 16.359C73.9162 15.9788 73.8774 15.5606 73.761 15.1805C73.6446 14.8003 73.4895 14.4582 73.2955 14.1921C73.1016 13.888 72.83 13.6599 72.5197 13.5078C72.2094 13.3178 71.8603 13.2417 71.4336 13.2417C70.5802 13.2417 69.9595 13.5078 69.5328 14.0781C69.1061 14.6483 68.9122 15.4086 68.9122 16.359C68.9122 16.8151 68.9509 17.2333 69.0673 17.6135C69.1837 17.9936 69.3388 18.3357 69.5716 18.6018C69.8043 18.8679 70.0371 19.096 70.3474 19.2481C70.6577 19.4002 71.0069 19.4762 71.4336 19.4762C71.8991 19.4762 72.287 19.4002 72.5973 19.2101C72.9076 19.02 73.1792 18.7919 73.3731 18.4878C73.5671 18.1837 73.7222 17.8796 73.7998 17.4994C73.8774 17.1193 73.9162 16.7391 73.9162 16.359ZM77.4074 8.56587H79.3857V10.4286H77.4074V8.56587ZM77.4074 11.9112H79.3857V20.7687H77.4074V11.9112ZM81.1701 8.56587H83.1484V20.7687H81.1701V8.56587ZM89.2774 20.9968C88.5404 20.9968 87.9197 20.8827 87.3378 20.6547C86.756 20.4266 86.2905 20.0844 85.9026 19.7043C85.5147 19.2861 85.2043 18.7919 85.0104 18.2217C84.8164 17.6515 84.7001 17.0052 84.7001 16.359C84.7001 15.6747 84.8164 15.0664 85.0104 14.4962C85.2043 13.926 85.5147 13.4318 85.9026 13.0136C86.2905 12.5955 86.756 12.2913 87.3378 12.0633C87.9197 11.8352 88.5404 11.7211 89.2774 11.7211C90.0144 11.7211 90.6351 11.8352 91.2169 12.0633C91.7988 12.2913 92.2643 12.6335 92.6522 13.0136C93.0401 13.4318 93.3504 13.926 93.5444 14.4962C93.7383 15.0664 93.8547 15.6747 93.8547 16.359C93.8547 17.0432 93.7383 17.6515 93.5444 18.2217C93.3504 18.7919 93.0401 19.2861 92.6522 19.7043C92.2643 20.1224 91.7988 20.4266 91.2169 20.6547C90.6351 20.8827 90.0144 20.9968 89.2774 20.9968ZM89.2774 19.4762C89.7041 19.4762 90.092 19.4002 90.4411 19.2101C90.7514 19.02 91.023 18.7919 91.2557 18.4878C91.4497 18.1837 91.6048 17.8415 91.7212 17.4994C91.7988 17.1193 91.8764 16.7391 91.8764 16.359C91.8764 15.9788 91.8376 15.5987 91.7212 15.2185C91.6436 14.8384 91.4497 14.4962 91.2557 14.2301C91.0618 13.926 90.7902 13.6979 90.4411 13.5078C90.1308 13.3178 89.7429 13.2417 89.2774 13.2417C88.8507 13.2417 88.4628 13.3178 88.1137 13.5078C87.8033 13.6979 87.5318 13.926 87.299 14.2301C87.1051 14.5342 86.9499 14.8384 86.8336 15.2185C86.756 15.5987 86.6784 15.9788 86.6784 16.359C86.6784 16.7391 86.7172 17.1193 86.8336 17.4994C86.9111 17.8796 87.1051 18.2217 87.299 18.4878C87.493 18.7919 87.7645 19.02 88.1137 19.2101C88.4628 19.4002 88.8507 19.4762 89.2774 19.4762ZM94.3978 11.9112H95.9106V9.25014H97.889V11.9112H99.6733V13.3558H97.889V18.0696C97.889 18.2597 97.889 18.4498 97.9278 18.6018C97.9278 18.7539 98.0053 18.8679 98.0441 18.982C98.1217 19.096 98.1993 19.1721 98.3157 19.2101C98.432 19.2481 98.626 19.2861 98.8587 19.2861C99.0139 19.2861 99.1303 19.2861 99.2854 19.2861C99.4406 19.2861 99.557 19.2481 99.7121 19.2101V20.7307C99.4794 20.7687 99.2854 20.7687 99.0527 20.8067C98.8587 20.8447 98.626 20.8447 98.3933 20.8447C97.8502 20.8447 97.4623 20.8067 97.1131 20.6927C96.8028 20.6166 96.5313 20.4646 96.3761 20.2745C96.1822 20.0844 96.0658 19.8563 95.9882 19.5522C95.9106 19.2861 95.8718 18.944 95.8718 18.5638V13.3938H94.359L94.3978 11.9112Z\"\n />\n <path\n className=\"hero__trustpilot-logo-star\"\n d=\"M11.9424 16.999L17.1435 15.6794L19.326 22.2513L11.9424 16.999ZM23.8759 8.50378H14.7585L11.9424 0L9.12618 8.50378L0 8.49515L7.38366 13.7475L4.56748 22.2513L11.9424 16.999L16.501 13.7561L23.8759 8.50378Z\"\n />\n <path\n className=\"hero__trustpilot-logo-star-shadow\"\n d=\"M11.9424 16.999L17.1408 15.6801L16.501 13.7561L11.9424 16.999Z\"\n />\n </svg>\n);\n\nexport const DEFAULT_TRUSTPILOT_TEXT =\n \"Deriv scores {score} out of 5 based on {reviewCount} reviews\";\n\nconst formatCount = (value: number | string, locale: string) =>\n typeof value === \"number\" ? new Intl.NumberFormat(locale).format(value) : value;\n\nconst formatScore = (value: number, locale: string) =>\n new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value);\n\nconst PLACEHOLDER = /(\\{score\\}|\\{reviewCount\\})/g;\n\n/**\n * Split the sentence template around its two placeholders so each value can\n * carry its own span while the surrounding words stay one translatable\n * string. Unknown or missing placeholders are simply left as written.\n */\nfunction renderTemplate(template: string, values: { score: string; reviewCount: string }) {\n return template.split(PLACEHOLDER).map((part, i) => {\n if (part === \"{score}\") {\n return (\n <span key={i} className=\"hero__trustpilot-text-score\">\n {values.score}\n </span>\n );\n }\n if (part === \"{reviewCount}\") {\n return (\n <span key={i} className=\"hero__trustpilot-text-count\">\n {values.reviewCount}\n </span>\n );\n }\n return part;\n });\n}\n\nfunction fillTemplate(template: string, values: { score: string; reviewCount: string }) {\n return template.replace(\"{score}\", values.score).replace(\"{reviewCount}\", values.reviewCount);\n}\n\nexport const HeroTrustpilot = ({\n score,\n reviewCount,\n href = DEFAULT_TRUSTPILOT_URL,\n text,\n label,\n locale = \"en-US\",\n ariaLabel,\n}: HeroTrustpilotProps) => {\n const values = {\n score: formatScore(score, locale),\n reviewCount: formatCount(reviewCount, locale),\n };\n /* `label` predates `text`; keep honouring it when no full sentence is\n supplied so existing English callers render unchanged. */\n const template =\n text ?? (label ? `${label} {score} out of 5 based on {reviewCount} reviews` : DEFAULT_TRUSTPILOT_TEXT);\n const sentence = fillTemplate(template, values);\n\n return (\n <div className=\"hero__trustpilot home-hero_trustpilot-wrapper\">\n <a\n href={href}\n className=\"hero__trustpilot-link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={ariaLabel ?? `${sentence} — Trustpilot`}\n >\n <Stars score={score} />\n <span className=\"hero__trustpilot-text\" aria-hidden=\"true\">\n {renderTemplate(template, values)}\n </span>\n <Wordmark />\n </a>\n </div>\n );\n};\n\nexport default HeroTrustpilot;\n","import React from \"react\";\nimport type { HeroProps } from \"./Hero.types\";\nimport { Button } from \"../../components/Button\";\nimport { HeroTrustpilot } from \"./HeroTrustpilot\";\nimport \"./Hero.css\";\n\n/* ── Helpers ──────────────────────────────────────────────── */\n\n/** Renders a ReactNode or a plain string as an <img> */\nconst Visual = ({\n src,\n className,\n alt = \"\",\n}: {\n src: React.ReactNode | string;\n className: string;\n alt?: string;\n}) => (\n <div className={className}>\n {typeof src === \"string\" ? <img src={src} alt={alt} /> : src}\n </div>\n);\n\nconst HeroTitle = ({\n title,\n headingLevel = 1,\n}: {\n title: string;\n headingLevel?: 1 | 2;\n}) => {\n const Tag = headingLevel === 2 ? \"h2\" : \"h1\";\n return <Tag className=\"hero__title\">{title}</Tag>;\n};\n\n/* ── Button block helper ──────────────────────────────────── */\n\nconst ButtonBlock = ({\n primaryButton,\n secondaryButton,\n}: Pick<HeroProps, \"primaryButton\" | \"secondaryButton\">) => {\n if (!primaryButton && !secondaryButton) return null;\n return (\n <div className=\"hero__buttons\">\n {primaryButton &&\n (primaryButton.href ? (\n <a href={primaryButton.href}>\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n ))}\n {secondaryButton &&\n (secondaryButton.href ? (\n <a href={secondaryButton.href}>\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n ))}\n </div>\n );\n};\n\n/* ── Hero ─────────────────────────────────────────────────── */\n\nexport const Hero = ({\n variant,\n subtitle,\n title,\n headingLevel = 1,\n description,\n primaryButton,\n secondaryButton,\n backgroundImageSrc,\n heroImage,\n productImage,\n floatingImage,\n trustpilot,\n className,\n ...props\n}: HeroProps) => {\n const variantClass = `hero--${variant}`;\n /* The band is purely additive: without the prop no class, node or style\n is emitted, so existing heroes are unaffected. */\n const trustpilotClass = trustpilot ? \"hero--has-trustpilot\" : undefined;\n const trustpilotBand = trustpilot ? <HeroTrustpilot {...trustpilot} /> : null;\n\n /* ── Split ── */\n if (variant === \"split\") {\n return (\n <section\n className={[\"hero\", variantClass, trustpilotClass, className].filter(Boolean).join(\" \")}\n style={\n backgroundImageSrc\n ? { backgroundImage: `url(${backgroundImageSrc})` }\n : undefined\n }\n {...props}\n >\n {/* Layer 1: gradient overlay */}\n <div className=\"hero__overlay\" aria-hidden=\"true\" />\n\n {/* Layer 2a: secondary foreground (e.g. a device mockup).\n Rendered BEFORE the hero image so that, at equal z-index,\n DOM order paints it underneath the subject. */}\n {floatingImage && (\n <Visual\n src={floatingImage}\n className=\"hero__floating-image\"\n alt=\"\"\n />\n )}\n\n {/* Layer 2b: transparent PNG — direct child of section for correct z-index */}\n {heroImage && (\n <Visual src={heroImage} className=\"hero__image-slot\" alt=\"\" />\n )}\n\n {/* Layer 3: text + buttons */}\n <div className=\"hero__inner\">\n <div className=\"hero__content\">\n <div className=\"hero__left\">\n <div className=\"hero__body\">\n <div className=\"hero__text\">\n {subtitle && (\n <p className=\"hero__subtitle\">{subtitle}</p>\n )}\n <HeroTitle title={title} headingLevel={headingLevel} />\n {description && (\n <p className=\"hero__description\">{description}</p>\n )}\n </div>\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n </div>\n </div>\n </div>\n </div>\n\n {trustpilotBand}\n </section>\n );\n }\n\n /* ── Centered ── */\n if (variant === \"centered\") {\n return (\n <section\n className={[\"hero\", variantClass, trustpilotClass, className].filter(Boolean).join(\" \")}\n style={\n backgroundImageSrc\n ? { backgroundImage: `url(${backgroundImageSrc})` }\n : undefined\n }\n {...props}\n >\n <div className=\"hero__overlay\" aria-hidden=\"true\" />\n <div className=\"hero__inner\">\n <div className=\"hero__content\">\n <div className=\"hero__text\">\n {subtitle && <p className=\"hero__subtitle\">{subtitle}</p>}\n <HeroTitle title={title} headingLevel={headingLevel} />\n {description && (\n <p className=\"hero__description\">{description}</p>\n )}\n </div>\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n </div>\n </div>\n\n {trustpilotBand}\n </section>\n );\n }\n\n /* ── Showcase ── */\n return (\n <section\n className={[\"hero\", variantClass, trustpilotClass, className].filter(Boolean).join(\" \")}\n style={\n backgroundImageSrc\n ? { backgroundImage: `url(${backgroundImageSrc})` }\n : undefined\n }\n {...props}\n >\n <div className=\"hero__overlay\" aria-hidden=\"true\" />\n <div className=\"hero__inner\">\n <div className=\"hero__content\">\n <div className=\"hero__text\">\n {subtitle && <p className=\"hero__subtitle\">{subtitle}</p>}\n <HeroTitle title={title} headingLevel={headingLevel} />\n {description && (\n <p className=\"hero__description\">{description}</p>\n )}\n </div>\n\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n\n {productImage && (\n <Visual\n src={productImage}\n className=\"hero__product-image\"\n alt=\"\"\n />\n )}\n\n {floatingImage && (\n <Visual\n src={floatingImage}\n className=\"hero__floating-image\"\n alt=\"\"\n />\n )}\n </div>\n </div>\n\n {trustpilotBand}\n </section>\n );\n};\n\nexport default Hero;\n","import React, { useEffect, useRef } from \"react\";\nimport type { HeaderProps } from \"./Header.types\";\nimport { Button } from \"../../components/Button\";\nimport { SearchField } from \"../../components/SearchField\";\nimport \"./Header.css\";\n\n/* ── Button block helper ──────────────────────────────────── */\n\nconst ButtonBlock = ({\n primaryButton,\n secondaryButton,\n}: Pick<HeaderProps, \"primaryButton\" | \"secondaryButton\">) => {\n if (!primaryButton && !secondaryButton) return null;\n return (\n <div className=\"header__buttons\">\n {primaryButton &&\n (primaryButton.href ? (\n <a href={primaryButton.href}>\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n ))}\n {secondaryButton &&\n (secondaryButton.href ? (\n <a href={secondaryButton.href}>\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n ))}\n </div>\n );\n};\n\n/* ── Search block helper (dark-search variant only) ──────────── */\n\nconst SearchBlock = ({ search }: Pick<HeaderProps, \"search\">) => {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n search?.onSubmit?.(event.currentTarget.value);\n }\n };\n\n return (\n <div className=\"header__search\">\n <SearchField\n placeholder={search?.placeholder ?? \"Search\"}\n value={search?.value}\n onChange={search?.onChange}\n onClear={search?.onClear}\n onKeyDown={handleKeyDown}\n showSearchIcon={false}\n />\n </div>\n );\n};\n\n/* ── Header ───────────────────────────────────────────────── */\n\nexport const Header = ({\n variant,\n subtitle,\n title,\n description,\n primaryButton,\n secondaryButton,\n leftVisual,\n rightVisual,\n search,\n underNavbar = false,\n className,\n ...props\n}: HeaderProps) => {\n const variantClass = `header--${variant}`;\n\n /* ── Parallax refs (visuals variant only) ── */\n const sectionRef = useRef<HTMLElement>(null);\n const leftRef = useRef<HTMLDivElement>(null);\n const rightRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (variant !== \"visuals\") return;\n if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) return;\n\n const section = sectionRef.current;\n const leftEl = leftRef.current;\n const rightEl = rightRef.current;\n if (!section || !leftEl || !rightEl) return;\n\n const STRENGTH = 60; // px travel distance\n\n const onScroll = () => {\n const rect = section.getBoundingClientRect();\n const viewH = window.innerHeight;\n const progress = 1 - rect.bottom / (viewH + rect.height);\n const clamped = Math.max(0, Math.min(1, progress));\n const offset = (clamped - 0.5) * STRENGTH * 2;\n leftEl.style.transform = `translateY(${-offset}px)`;\n rightEl.style.transform = `translateY(${offset}px)`;\n };\n\n const scrollEl = (() => {\n let el: Element | null = section.parentElement;\n while (el && el !== document.documentElement) {\n const { overflow, overflowY } = getComputedStyle(el);\n if (/auto|scroll/.test(overflow + overflowY)) return el;\n el = el.parentElement;\n }\n return window;\n })();\n\n scrollEl.addEventListener(\"scroll\", onScroll, { passive: true });\n onScroll();\n\n return () => scrollEl.removeEventListener(\"scroll\", onScroll);\n }, [variant]);\n\n /* ── Shared text block ── */\n const textBlock = (\n <div className=\"header__text\">\n {subtitle && <p className=\"header__subtitle\">{subtitle}</p>}\n <h2 className=\"header__title\">{title}</h2>\n {description && <p className=\"header__description\">{description}</p>}\n </div>\n );\n\n return (\n <section\n ref={sectionRef}\n className={[\"header\", variantClass, underNavbar && \"header--under-navbar\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* Layer 1: grid pattern */}\n <div className=\"header__grid\" aria-hidden=\"true\" />\n\n {/* Layer 2: floating visuals (visuals variant only) */}\n {variant === \"visuals\" && leftVisual && (\n <div ref={leftRef} className=\"header__visual header__visual--left\">\n {typeof leftVisual === \"string\" ? (\n <img src={leftVisual} alt=\"\" />\n ) : (\n leftVisual\n )}\n </div>\n )}\n {variant === \"visuals\" && rightVisual && (\n <div ref={rightRef} className=\"header__visual header__visual--right\">\n {typeof rightVisual === \"string\" ? (\n <img src={rightVisual} alt=\"\" />\n ) : (\n rightVisual\n )}\n </div>\n )}\n\n {/* Layer 3: overlay fades the visuals at edges */}\n <div className=\"header__overlay\" aria-hidden=\"true\" />\n\n {/* Layer 4: text + button always on top */}\n <div className=\"header__inner\">\n <div className=\"header__content\">\n <div className=\"header__body\">\n {textBlock}\n {variant === \"dark-search\" && <SearchBlock search={search} />}\n <ButtonBlock\n primaryButton={primaryButton}\n secondaryButton={secondaryButton}\n />\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Header;\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { StatsAward, StatsProps } from \"./StatsV2.types\";\nimport \"./StatsV2.css\";\n\n/* ── Animation constants ─────────────────────────────────────\n * Values extracted directly from the Webflow IX2 action list\n * `a-2` (\"Сarousel of Achievements 175\") on\n * `.achievements_slider-component` in the `stats-carousel`\n * reference. Each animated keyframe uses:\n *\n * delay : 1000ms ← hold between transitions\n * duration : 700ms ← length of each transition\n * easing : cubic-bezier(0.33, 1, 0.68, 1) (ease-out-cubic)\n * loop : true\n *\n * We model this in React with:\n * • a CSS transition that ONLY holds the duration + easing\n * (no delay), so the animation runs the moment the inline\n * transform/opacity change;\n * • a self-rescheduling `setTimeout` loop that uses HOLD_MS\n * (1000ms) for the first tick + after every snap-back, and\n * INTERVAL_MS (1700ms = delay + duration) between normal\n * advances — matching Webflow's IX2 cadence frame-for-frame.\n *\n * Putting the delay inside `transition` (which we tried first)\n * pushes the very first animation 2.7 s out from mount and\n * re-introduces a delay between Storybook's hot-reload and the\n * first visible movement — so we keep the wait outside CSS.\n */\nconst HOLD_MS = 1000;\nconst STEP_DURATION_MS = 700;\nconst INTERVAL_MS = HOLD_MS + STEP_DURATION_MS;\nconst EASING = \"cubic-bezier(0.33, 1, 0.68, 1)\";\nconst TRANSITION =\n `transform ${STEP_DURATION_MS}ms ${EASING},` +\n ` opacity ${STEP_DURATION_MS}ms ${EASING}`;\n\n/* ── Scroll-driven parallax on the side blocks ───────────────\n * Custom approach (no longer a literal port of the Webflow IX2\n * keyframes): the two side columns are centred in the layout\n * and start with a CSS stagger applied as an initial transform\n * (LEFT `translateY(-26.3%)`, RIGHT `translateY(+26.3%)`). The\n * scroll-driven parallax then interpolates those transforms\n * back to `translateY(0%)` as the user scrolls past the\n * section, so when the animation ends both columns are at\n * exactly the same transform — guaranteed parallel regardless\n * of how tall the badge stacks are.\n *\n * scroll ≤ PARALLAX_START → LEFT −26.3% / RIGHT +26.3%\n * scroll = PARALLAX_END → LEFT 0% / RIGHT 0%\n * scroll > PARALLAX_END → held at 0% / 0% (parallel)\n *\n * Keep `PARALLAX_MAX_PERCENT` here in sync with the initial\n * transform values on `.stats-v2__awards-col--left/--right`\n * in StatsV2.css.\n */\nconst PARALLAX_START = 0.10;\nconst PARALLAX_END = 0.45;\nconst PARALLAX_MAX_PERCENT = 26.3;\nconst PARALLAX_BREAKPOINT = 992;\n\n/* ── Carousel slot model ─────────────────────────────────────\n * Webflow's IX2 maps every slider item to one of FIVE logical\n * slots. The inline styles in `index.html` show the exact\n * transform values the live site uses on each slider item,\n * which we mirror 1:1:\n *\n * above : translate3d(0, -110%, 0) scale3d(0.65, 0.65, 1) opacity 1\n * active : translate3d(0, 0%, 0) scale3d(1.0, 1.0, 1) opacity 1\n * below : translate3d(0, +110%, 0) scale3d(0.65, 0.65, 1) opacity 1\n * exiting : translate3d(0, -110%, 0) scale3d(0.4, 0.4, 1) opacity 0\n * queued : translate3d(0, +110%, 0) scale3d(0.4, 0.4, 1) opacity 0\n *\n * Webflow's reference ships 0.7 for above/below, but the design\n * uses 0.65 here for slightly stronger visual deference to the\n * centred active stat.\n *\n * The CSS already centres each item via `translate(-50%, -50%)`\n * (see `.stats-v2__stat`), so we PREPEND that centring translate\n * to the Webflow transform here. Order matters — the centring\n * must come first so the slot translate's `%` units are applied\n * to the element's own box, not to a half-shifted origin.\n *\n * The `--stats-v2-slot-offset` CSS var lets a designer adjust\n * the 110% spacing without touching the component file.\n */\ntype Slot = \"above\" | \"active\" | \"below\" | \"exiting\" | \"queued\";\n\nconst SLOT_OFFSET = \"var(--stats-v2-slot-offset, 110%)\";\nconst CENTER = \"translate(-50%, -50%)\";\n\nfunction getSlotStyle(slot: Slot, transition: string): CSSProperties {\n switch (slot) {\n case \"active\":\n return {\n transform: `${CENTER} translateY(0%) scale(1)`,\n opacity: 1,\n zIndex: 2,\n transition,\n };\n case \"above\":\n return {\n transform: `${CENTER} translateY(calc(${SLOT_OFFSET} * -1)) scale(0.65)`,\n opacity: 1,\n zIndex: 1,\n transition,\n };\n case \"below\":\n return {\n transform: `${CENTER} translateY(${SLOT_OFFSET}) scale(0.65)`,\n opacity: 1,\n zIndex: 1,\n transition,\n };\n case \"exiting\":\n return {\n transform: `${CENTER} translateY(calc(${SLOT_OFFSET} * -1)) scale(0.4)`,\n opacity: 0,\n zIndex: 0,\n transition,\n };\n case \"queued\":\n default:\n return {\n transform: `${CENTER} translateY(${SLOT_OFFSET}) scale(0.4)`,\n opacity: 0,\n zIndex: 0,\n transition,\n };\n }\n}\n\n/**\n * Maps a DOM-strip index to its slot for a given step.\n *\n * Step 0 is the initial state — items[0] is `above`, items[1]\n * is `active`, items[2] is `below`, the rest are `queued`.\n *\n * Each step shifts every item up exactly one slot, mirroring\n * Webflow's \"promote one slot per tick\" choreography.\n */\nfunction slotForIndex(index: number, step: number): Slot {\n const rel = index - step - 1;\n if (rel === 0) return \"active\";\n if (rel === -1) return \"above\";\n if (rel === 1) return \"below\";\n if (rel < -1) return \"exiting\";\n return \"queued\";\n}\n\n/* ── Laurel decoration (left half) ───────────────────────────\n * Vector copied from the Webflow `award_image-svg` markup. The\n * right-hand laurel mirrors the same path via `scaleX(-1)` so\n * we don't ship duplicate geometry.\n */\nconst Laurel = ({ flip = false }: { flip?: boolean }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"84\"\n viewBox=\"0 0 32 84\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n className={[\n \"stats-v2__laurel\",\n flip ? \"stats-v2__laurel--flip\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <g opacity=\"0.2\">\n <path\n d=\"M20.8655 76.0151C21.3631 78.5487 22.4577 80.4673 23.4245 81.7447C23.7945 82.2337 24.145 82.6275 24.4343 82.9245C24.5003 81.0424 24.5392 77.0209 23.854 73.543C23.3836 71.2282 22.6189 69.4263 21.9723 68.1997C21.7486 67.7754 21.539 67.42 21.3608 67.1361C21.2158 67.6487 21.042 68.3446 20.8935 69.1718C20.5634 71.0111 20.3623 73.4782 20.8655 76.0151Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M9.19518 69.4464C8.5612 69.2311 8.01354 69.0792 7.6041 68.9776C7.77674 69.5261 8.03563 70.2542 8.40971 71.0711C9.16156 72.713 10.3603 74.6729 12.1472 76.0342C13.9141 77.3864 15.8077 77.7752 17.2669 77.8239C17.9963 77.8483 18.6126 77.7873 19.0419 77.7209C18.3715 76.5307 16.6347 73.8279 14.0892 71.9349C12.4167 70.7081 10.6015 69.924 9.19518 69.4464Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M14.1789 62.4853C14.1095 65.0056 14.7018 67.1343 15.3106 68.6265C15.5268 69.1563 15.7445 69.6045 15.9342 69.9597C16.0737 69.4242 16.2473 68.7196 16.4239 67.9038C16.8294 66.0308 17.2467 63.5892 17.309 61.2688C17.3584 58.9612 17.0322 57.019 16.6942 55.65C16.5809 55.1908 16.4663 54.7965 16.3643 54.4749C16.1414 54.8952 15.8702 55.4487 15.5956 56.1107C14.9268 57.7233 14.2444 59.9642 14.1789 62.4853Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M6.16644 56.5363L5.92729 56.2113C4.18123 53.9739 2.10237 52.4221 0.99942 51.685C1.0448 52.2219 1.13195 52.9558 1.29599 53.7969C1.6458 55.5904 2.33816 57.834 3.68889 59.699C5.02796 61.5534 6.66938 62.5331 7.97363 63.0496C8.56984 63.2857 9.09434 63.4244 9.48448 63.5049C9.08235 62.1271 8.06278 59.1136 6.16644 56.5363Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M12.9202 41.9556C12.9103 41.468 12.8857 41.0438 12.8578 40.6964C12.5852 41.0139 12.2554 41.4254 11.9043 41.9234C10.9787 43.2365 9.91222 45.1415 9.34811 47.5086L9.21888 48.0509C8.78948 50.2094 8.89878 52.2002 9.13088 53.6853C9.21855 54.2463 9.32345 54.7333 9.42253 55.1275C10.2101 53.5777 11.6117 50.5783 12.3444 47.5177C12.8519 45.3454 12.9491 43.3817 12.9202 41.9556Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M4.26838 40.1575C3.16507 37.3338 1.55966 35.0449 0.658674 33.8839C0.595099 34.3962 0.53299 35.0674 0.509766 35.8425C0.454879 37.6743 0.618233 40.0556 1.46849 42.2871C2.30759 44.5064 3.60611 45.9871 4.68907 46.9107C5.12959 47.2864 5.53393 47.5694 5.85602 47.7717C5.82536 47.3041 5.77132 46.6715 5.67501 45.9295C5.46619 44.3205 5.06044 42.211 4.27156 40.1569L4.26838 40.1575Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M12.6632 27.4606C11.6314 28.3597 10.3804 29.7129 9.40352 31.5834L9.20135 32.004C8.19489 34.0975 7.83678 36.2499 7.73379 37.8807C7.69736 38.4576 7.693 38.9667 7.70264 39.3814C7.98105 39.0479 8.31846 38.6306 8.68777 38.1462C9.68653 36.8365 10.9078 35.0512 11.829 33.1204C12.7356 31.1936 13.238 29.3215 13.5154 27.9233C13.6157 27.4178 13.6864 26.9753 13.7361 26.6158C13.4324 26.8302 13.0648 27.1106 12.6632 27.4606Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M7.15889 23.0454L7.23043 22.5253C7.54518 19.6881 7.36017 17.0948 7.19664 15.6517C6.9244 16.0575 6.59747 16.5777 6.25738 17.1905C5.37216 18.7855 4.41002 20.986 4.07631 23.4177C3.74032 25.8399 4.108 27.8499 4.55657 29.25C4.7215 29.7648 4.89717 30.1965 5.05235 30.5349C5.64762 29.1157 6.71893 26.2445 7.15889 23.0454Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M20.7056 14.8951C19.4372 15.269 17.7724 15.9875 16.1554 17.3693L16.021 17.4932C14.3576 18.9542 13.2217 20.7665 12.5041 22.2202C12.2403 22.7546 12.0346 23.2374 11.8812 23.6318C12.2297 23.4596 12.6507 23.2423 13.1195 22.9822C14.4495 22.2442 16.1506 21.1686 17.6705 19.808C19.177 18.446 20.3493 16.9414 21.1512 15.7693C21.4549 15.3255 21.7047 14.9307 21.8987 14.6109C21.5673 14.6707 21.1626 14.7604 20.7056 14.8951Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M15.246 9.89451L15.3989 9.48769C16.3817 6.71545 16.8681 4.08928 17.0948 2.56556C16.7641 2.88544 16.3703 3.28963 15.9481 3.76978C14.7583 5.12276 13.3571 7.06214 12.4902 9.40367C11.6163 11.7394 11.483 13.8564 11.5665 15.3854C11.595 15.9081 11.6489 16.3613 11.7069 16.7298C11.9415 16.3768 12.2271 15.9318 12.5414 15.4103C13.3841 14.0121 14.4266 12.0747 15.246 9.89451Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n <path\n d=\"M24.236 2.86551C22.4046 4.24716 21.0854 6.09763 20.225 7.6144C19.8673 8.24502 19.5916 8.81333 19.3933 9.25894C19.765 9.11933 20.2233 8.93634 20.7396 8.70812C22.1292 8.09394 23.9267 7.15785 25.5896 5.86671C27.2408 4.56435 28.6049 3.04428 29.5633 1.84034C29.9762 1.32163 30.3123 0.863542 30.5622 0.509562C30.206 0.526204 29.7564 0.567871 29.2396 0.659382C27.8788 0.900297 26.0564 1.48555 24.236 2.86551Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n />\n </g>\n </svg>\n);\n\n/* ── Award badge ─────────────────────────────────────────── */\n\nconst AwardBadge = ({ heading, subheading }: StatsAward) => (\n <div className=\"stats-v2__award\">\n <Laurel />\n <div className=\"stats-v2__award-text\">\n <div className=\"stats-v2__award-heading\">{heading}</div>\n <div className=\"stats-v2__award-subheading\">{subheading}</div>\n </div>\n <Laurel flip />\n </div>\n);\n\n/* ── Stats V2 ────────────────────────────────────────────── */\n\nexport const Stats = ({\n title,\n description,\n stats,\n leftAwards = [],\n rightAwards = [],\n className,\n ...props\n}: StatsProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const leftColRef = useRef<HTMLDivElement>(null);\n const rightColRef = useRef<HTMLDivElement>(null);\n const rafRef = useRef<number | null>(null);\n\n const N = stats.length;\n const hasAwards = leftAwards.length > 0 || rightAwards.length > 0;\n const allAwards: StatsAward[] = [...leftAwards, ...rightAwards];\n\n /* ── DOM strip (Webflow's `is-1` … `is-8` trick) ─────────\n * Webflow renders 2× the unique stats and snaps everything\n * back to the start once the active item reaches index N+1.\n * Because items[N+1] holds the SAME stat as items[1] (and\n * items[N]==items[0], items[N+2]==items[2]), the reset is\n * visually invisible — the three on-screen slots\n * (above / active / below) keep showing the same text from\n * the frame before to the frame after the snap.\n *\n * The minimum strip size we need is N + 3 (so that the\n * `below` slot at the reset step has an item to point at).\n * For N ≥ 3 that's ≤ 2N, so 2N is the natural choice and\n * matches Webflow exactly.\n */\n const strip = useMemo(() => {\n if (N === 0) return [];\n const target = Math.max(2 * N, N + 3);\n return Array.from({ length: target }, (_, i) => stats[i % N]);\n }, [stats, N]);\n\n /* ── Step + invisible reset state machine ─────────────────\n * Mirrors Webflow's IX2 timeline frame-for-frame.\n *\n * Webflow's `a-2` action list runs as a sequence:\n *\n * group 0 (initial) : instant\n * group 1..4 (animations) : delay 1000ms + duration 700ms\n * group 5 (snap reset) : INSTANT, fires the moment\n * group 4's animation ends\n * loop back to group 1\n *\n * The user-visible cadence is therefore:\n * - HOLD 1000ms after mount (group 1 delay)\n * - ANIMATE 700ms ← group 1\n * - HOLD 1000ms (group 2 delay)\n * - ANIMATE 700ms ← group 2\n * - … (groups 3, 4) …\n * - ANIMATE 700ms ← group 4 (TO is-6)\n * - SNAP (instant, is-2 takes over content) ← group 5\n * - HOLD 1000ms (group 1 delay of next cycle)\n * - ANIMATE 700ms ← cycle restarts\n *\n * Three crucial details we replicate exactly:\n *\n * 1. The snap fires the **moment the previous animation\n * ends** — there's NO extra hold between group 4\n * finishing and group 5 firing. We previously held for\n * INTERVAL_MS (1700ms) before snapping, which gave the\n * loop boundary an obvious 1000ms-too-long pause.\n *\n * 2. The first hold (after mount) and the post-snap hold\n * are both 1000ms — same as every inter-step hold.\n *\n * 3. Each tick is scheduled with the exact delay it needs:\n * • first tick ........ HOLD_MS (1000ms)\n * • normal advance .... INTERVAL_MS (1700ms)\n * • advance to step N . STEP_DURATION_MS (700ms) ←\n * no hold before snap; snap fires the instant\n * the animation reaches step N's resting state\n * • after snap-back ... HOLD_MS (1000ms)\n *\n * The snap-back itself uses an explicit 3-phase dance so\n * that `transition: none` is guaranteed to be applied to\n * the DOM BEFORE the position change, otherwise some\n * browsers still animate the snap.\n *\n * idle → normal CSS transition is applied\n * snap-disable → render with step=N + `transition:none`\n * (kills any in-flight transition)\n * snap-jump → render with step=0 + `transition:none`\n * (positions snap; invisible because the\n * visible slots show the same content\n * before and after)\n * idle (again) → restore transitions; the next tick\n * (scheduled for HOLD_MS later) starts\n * the new cycle\n */\n type Phase = \"idle\" | \"snap-disable\" | \"snap-jump\";\n const [step, setStep] = useState(0);\n const [phase, setPhase] = useState<Phase>(\"idle\");\n\n /* `scheduleRef` lets the snap-back rAF re-arm the next\n animation tick after the snap completes. */\n const scheduleRef = useRef<((delayMs: number) => void) | null>(null);\n\n useEffect(() => {\n if (N <= 1) return;\n\n let timerId: number | null = null;\n let cancelled = false;\n\n const advance = () => {\n timerId = null;\n if (cancelled) return;\n setStep((prev) => {\n if (prev >= N) {\n setPhase(\"snap-disable\");\n return prev;\n }\n const next = prev + 1;\n /* When we advance INTO the final step, schedule\n the snap to fire the moment the animation ends\n (STEP_DURATION_MS later) — NOT INTERVAL_MS.\n Webflow's group 5 reset has no delay; it fires\n immediately after group 4's animation completes,\n and the post-snap 1000ms hold happens as part\n of group 1's delay in the next cycle. Holding\n for the full INTERVAL_MS here would double the\n visible pause at the loop boundary. */\n const delayMs =\n next >= N ? STEP_DURATION_MS : INTERVAL_MS;\n schedule(delayMs);\n return next;\n });\n };\n\n const schedule = (delayMs: number) => {\n if (cancelled) return;\n if (timerId !== null) window.clearTimeout(timerId);\n timerId = window.setTimeout(advance, delayMs);\n };\n\n scheduleRef.current = schedule;\n schedule(HOLD_MS);\n\n return () => {\n cancelled = true;\n scheduleRef.current = null;\n if (timerId !== null) window.clearTimeout(timerId);\n };\n }, [N]);\n\n /* Drive the reset dance with rAFs so each phase actually\n paints to screen before the next one fires. */\n useEffect(() => {\n if (phase === \"snap-disable\") {\n const raf = requestAnimationFrame(() => {\n setStep(0);\n setPhase(\"snap-jump\");\n });\n rafRef.current = raf;\n return () => cancelAnimationFrame(raf);\n }\n if (phase === \"snap-jump\") {\n const raf = requestAnimationFrame(() => {\n setPhase(\"idle\");\n /* Schedule the next animation 1000ms after the\n snap — matching Webflow's group 1 delay that\n immediately follows group 5's snap reset. */\n scheduleRef.current?.(HOLD_MS);\n });\n rafRef.current = raf;\n return () => cancelAnimationFrame(raf);\n }\n }, [phase]);\n\n /* Reset everything if the stats list itself changes. */\n useEffect(() => {\n setStep(0);\n setPhase(\"idle\");\n }, [N]);\n\n /* ── Scroll-progress parallax (Webflow IX2 list `a`) ───── */\n useEffect(() => {\n const apply = () => {\n const section = sectionRef.current;\n if (!section || window.innerWidth < PARALLAX_BREAKPOINT) {\n /* Clearing inline transforms lets the CSS stagger\n (the `.stats-v2__awards-col--left/--right` rules)\n take over again. */\n if (leftColRef.current) leftColRef.current.style.transform = \"\";\n if (rightColRef.current)\n rightColRef.current.style.transform = \"\";\n return;\n }\n\n const rect = section.getBoundingClientRect();\n const viewport = window.innerHeight;\n const totalTravel = rect.height + viewport;\n const traveled = viewport - rect.top;\n const rawProgress = traveled / totalTravel;\n const progress = Math.max(0, Math.min(1, rawProgress));\n\n const normalised = Math.max(\n 0,\n Math.min(\n 1,\n (progress - PARALLAX_START) /\n (PARALLAX_END - PARALLAX_START),\n ),\n );\n\n /* `remaining` goes 1 → 0 as the scroll progresses from\n PARALLAX_START to PARALLAX_END, i.e. it pulls each\n column back from its ±26.3% resting stagger to 0%. */\n const remaining = 1 - normalised;\n const leftOffset = -PARALLAX_MAX_PERCENT * remaining;\n const rightOffset = PARALLAX_MAX_PERCENT * remaining;\n\n if (leftColRef.current) {\n leftColRef.current.style.transform = `translateY(${leftOffset}%)`;\n }\n if (rightColRef.current) {\n rightColRef.current.style.transform = `translateY(${rightOffset}%)`;\n }\n };\n\n const onScroll = () => {\n requestAnimationFrame(apply);\n };\n\n apply();\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onScroll);\n };\n }, []);\n\n const transition = phase === \"idle\" ? TRANSITION : \"none\";\n\n return (\n <section\n ref={sectionRef}\n className={[\"stats-v2\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"stats-v2__inner\">\n <div className=\"stats-v2__header\">\n <h2 className=\"stats-v2__title\">{title}</h2>\n {description && (\n <p className=\"stats-v2__description\">{description}</p>\n )}\n </div>\n\n <div className=\"stats-v2__content\">\n {leftAwards.length > 0 && (\n <div\n ref={leftColRef}\n className=\"stats-v2__awards-col stats-v2__awards-col--left\"\n >\n {leftAwards.map((award, i) => (\n <AwardBadge key={`l-${i}`} {...award} />\n ))}\n </div>\n )}\n\n <div className=\"stats-v2__card\">\n <div className=\"stats-v2__card-track\">\n <div\n className=\"stats-v2__fade stats-v2__fade--top\"\n aria-hidden=\"true\"\n />\n <div\n className=\"stats-v2__fade stats-v2__fade--bottom\"\n aria-hidden=\"true\"\n />\n {strip.map((stat, i) => {\n const slot = slotForIndex(i, step);\n const active = slot === \"active\";\n return (\n <div\n key={i}\n className={[\n \"stats-v2__stat\",\n active\n ? \"stats-v2__stat--active\"\n : \"stats-v2__stat--inactive\",\n ].join(\" \")}\n style={getSlotStyle(slot, transition)}\n aria-hidden={!active}\n >\n <span className=\"stats-v2__stat-value\">\n {stat.value}\n </span>\n <span className=\"stats-v2__stat-label\">\n {stat.label}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n\n {rightAwards.length > 0 && (\n <div\n ref={rightColRef}\n className=\"stats-v2__awards-col stats-v2__awards-col--right\"\n >\n {rightAwards.map((award, i) => (\n <AwardBadge key={`r-${i}`} {...award} />\n ))}\n </div>\n )}\n\n {hasAwards && (\n <div className=\"stats-v2__awards-mobile\">\n {allAwards.map((award, i) => (\n <AwardBadge key={`m-${i}`} {...award} />\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default Stats;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { StatsSimpleProps } from \"./StatsSimple.types\";\nimport \"./StatsSimple.css\";\n\n/* ── Count-up helpers ─────────────────────────────────────────\n * Parses a display string like \"$118M+\" into its constituent\n * parts so we can animate only the numeric portion while\n * keeping the prefix/suffix stable.\n *\n * Examples:\n * \"117K+\" → { prefix: \"\", number: 117, suffix: \"K+\" }\n * \"$118M+\" → { prefix: \"$\", number: 118, suffix: \"M+\" }\n * \"190+\" → { prefix: \"\", number: 190, suffix: \"+\" }\n * \"3M+\" → { prefix: \"\", number: 3, suffix: \"M+\" }\n * \"1999\" → { prefix: \"\", number: 1999, suffix: \"\" }\n */\nfunction parseValue(raw: string): {\n prefix: string;\n number: number;\n suffix: string;\n} {\n const match = raw.match(/^([^0-9]*)([0-9]+(?:\\.[0-9]+)?)(.*)$/);\n if (!match) return { prefix: \"\", number: 0, suffix: raw };\n return {\n prefix: match[1],\n number: parseFloat(match[2]),\n suffix: match[3],\n };\n}\n\nconst DURATION_MS = 1800;\nconst EASING = (t: number) => 1 - Math.pow(1 - t, 3); // ease-out-cubic\n\nfunction useCountUp(target: number, active: boolean) {\n const [display, setDisplay] = useState(0);\n const rafRef = useRef<number | null>(null);\n const startRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!active) return;\n\n startRef.current = null;\n\n const tick = (now: number) => {\n if (startRef.current === null) startRef.current = now;\n const elapsed = now - startRef.current;\n const progress = Math.min(elapsed / DURATION_MS, 1);\n const eased = EASING(progress);\n setDisplay(Math.round(eased * target));\n if (progress < 1) {\n rafRef.current = requestAnimationFrame(tick);\n }\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n };\n }, [target, active]);\n\n return display;\n}\n\n/* ── Animated stat item ───────────────────────────────────── */\n\nconst AnimatedValue = ({\n raw,\n active,\n}: {\n raw: string;\n active: boolean;\n}) => {\n const { prefix, number, suffix } = parseValue(raw);\n const count = useCountUp(number, active);\n\n /* Format with locale thousands separators if the original\n value contained a comma or is ≥ 1000 without a suffix\n that implies it's already abbreviated (K/M/B). */\n const formatted =\n number >= 1000 && !/[KMBkmb]/.test(suffix)\n ? count.toLocaleString()\n : String(count);\n\n return (\n <span className=\"stats-simple__value\">\n {prefix}\n {formatted}\n {suffix}\n </span>\n );\n};\n\n/* ── StatsSimple ──────────────────────────────────────────── */\n\nexport const StatsSimple = ({\n stats,\n className,\n ...props\n}: StatsSimpleProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n const el = sectionRef.current;\n if (!el) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setAnimated(true);\n observer.disconnect();\n }\n },\n { threshold: 0.25 },\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n return (\n <section\n ref={sectionRef}\n className={[\"stats-simple\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"stats-simple__inner\">\n {stats.map((stat, i) => (\n <div key={i} className=\"stats-simple__item\">\n <AnimatedValue raw={stat.value} active={animated} />\n <span className=\"stats-simple__label\">{stat.label}</span>\n </div>\n ))}\n </div>\n </section>\n );\n};\n\nexport default StatsSimple;\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { DotLottieInView, isLottieSrc } from \"../../components/DotLottieInView\";\nimport type { FeatureScrollItem, FeatureScrollProps } from \"./FeatureScroll.types\";\nimport \"./FeatureScroll.css\";\n\n/* ── Default data ──────────────────────────────────────────── */\n/*\n * Paths match @deriv-web-design/lottie public paths. Storybook serves\n * packages/lottie/assets at /lottie via staticDirs. Consumers pass their own\n * CMS/CDN URLs at runtime — these fixtures do not pull in the lottie package.\n */\n\nexport const FEATURE_SCROLL_DATA: FeatureScrollItem[] = [\n {\n title: \"Forex\",\n description: \"Trade the most popular currency pairs with high leverage, tight spreads, and fast execution.\",\n linkLabel: \"Learn more\",\n link: \"/markets/forex\",\n mediaUrl: \"/lottie/markets/forex.lottie\",\n },\n {\n title: \"Derived Indices\",\n description: \"Trade 24/7 on exclusive Synthetic and Derived Indices. Choose volatility levels that match your strategy.\",\n linkLabel: \"Learn more\",\n link: \"/markets/derived-indices/synthetic-indices\",\n mediaUrl: \"/lottie/markets/derived-indices.lottie\",\n },\n {\n title: \"Stocks\",\n description: \"Trade global market leaders like Apple, Tesla, and NVIDIA.\",\n linkLabel: \"Learn more\",\n link: \"/markets/stocks\",\n mediaUrl: \"/lottie/markets/stocks.lottie\",\n },\n {\n title: \"Commodities\",\n description: \"Trade gold, silver, oil, natural gas, sugar, and more.\",\n linkLabel: \"Learn more\",\n link: \"/markets/commodities\",\n mediaUrl: \"/lottie/markets/commodities.lottie\",\n },\n {\n title: \"Cryptos\",\n description: \"Trade round the clock on the volatility of cryptocurrencies like Bitcoin and Ethereum.\",\n linkLabel: \"Learn more\",\n link: \"/markets/cryptocurrencies\",\n mediaUrl: \"/lottie/markets/crypto.lottie\",\n },\n {\n title: \"Stock Indices\",\n description: \"Trade offerings that track the top global stock indices.\",\n linkLabel: \"Learn more\",\n link: \"/markets/stock-indices\",\n mediaUrl: \"/lottie/markets/stock-indices.lottie\",\n },\n];\n\n/* ── Chevron SVG icon ──────────────────────────────────────── */\n\nconst ChevronRight = () => (\n <svg\n className=\"fs__item-link-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 3l5 5-5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ── Media renderer ────────────────────────────────────────── */\n\n/**\n * The column this template actually lays out, as a browser layout contract.\n *\n * Desktop is a half-width column inside a 1280 container; below the layout\n * breakpoint the stacked list paints full-bleed. Used when a consumer supplies\n * responsive candidates but no `sizes`, so the browser still picks correctly\n * instead of falling back to the largest candidate.\n */\nconst DEFAULT_MEDIA_SIZES = \"(min-width: 992px) 50vw, 100vw\";\n\n/**\n * `mediaUrl` as a usable string, or null.\n *\n * `mediaUrl` is typed `string`, but a consumer passing something else used to\n * reach `.split()` and throw during render — turning one mistyped item into a\n * 500 for the whole page rather than one unrendered slot. Reading it defensively\n * costs nothing and keeps a content error contained to the band that has it.\n */\nfunction mediaSrc(item: FeatureScrollItem): string | null {\n return typeof item.mediaUrl === \"string\" && item.mediaUrl !== \"\" ? item.mediaUrl : null;\n}\n\nfunction resolveMediaType(item: FeatureScrollItem): \"lottie\" | \"image\" {\n if (item.mediaType) return item.mediaType;\n const src = mediaSrc(item);\n return src && isLottieSrc(src) ? \"lottie\" : \"image\";\n}\n\ninterface MediaRendererProps {\n item: FeatureScrollItem;\n active: boolean;\n rootMargin?: string;\n threshold?: number | number[];\n}\n\nconst MediaRenderer = ({ item, active, rootMargin, threshold }: MediaRendererProps) => {\n const src = mediaSrc(item);\n if (!src) return null;\n\n if (resolveMediaType(item) === \"lottie\") {\n return (\n <DotLottieInView\n src={src}\n enabled={active}\n rootMargin={rootMargin}\n threshold={threshold}\n poster={\n item.posterUrl ? (\n <img\n src={item.posterUrl}\n {...(item.posterSrcSet\n ? {\n srcSet: item.posterSrcSet,\n sizes: item.posterSizes ?? DEFAULT_MEDIA_SIZES,\n }\n : {})}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : undefined\n }\n />\n );\n }\n return (\n <img\n src={src}\n // Responsive only when the consumer supplied candidates. Emitting a\n // `sizes` without a `srcset` would be a no-op, and emitting a\n // single-candidate `srcset` would be a dishonest one.\n {...(item.mediaSrcSet\n ? { srcSet: item.mediaSrcSet, sizes: item.mediaSizes ?? DEFAULT_MEDIA_SIZES }\n : {})}\n alt={item.title}\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n};\n\n/* ── FeatureScroll ─────────────────────────────────────────── */\n\nexport const FeatureScroll = ({\n header,\n items,\n variant = \"media-right\",\n className,\n // Destructured, not spread: `...props` lands on the <section>, and an\n // unknown attribute there is a React DOM warning at best.\n mediaRootMargin,\n mediaThreshold,\n ...props\n}: FeatureScrollProps) => {\n const [activeIndex, setActiveIndex] = useState(0);\n const [mobileActiveIndex, setMobileActiveIndex] = useState(0);\n const titleRefs = useRef<(HTMLHeadingElement | null)[]>([]);\n const mobileItemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const mediaColRef = useRef<HTMLDivElement | null>(null);\n\n /*\n * Desktop: when step i's *title* (h3) top reaches the same line as the sticky\n * media (viewport band under nav), show the *next* step's Lottie/image.\n * pinned = largest i with title top <= threshold; media index = min(last, pinned + 1).\n */\n useLayoutEffect(() => {\n if (items.length === 0) return;\n\n const readThresholdPx = (): number => {\n const col = mediaColRef.current;\n if (!col) return 80;\n const top = getComputedStyle(col).top;\n const px = parseFloat(top);\n return Number.isFinite(px) ? px : 80;\n };\n\n let rafId = 0;\n const tick = () => {\n rafId = 0;\n if (typeof window === \"undefined\") return;\n if (!window.matchMedia(\"(min-width: 992px)\").matches) return;\n\n const threshold = readThresholdPx();\n const refs = titleRefs.current;\n let pinned = -1;\n for (let i = 0; i < items.length; i++) {\n const el = refs[i];\n if (!el) continue;\n if (el.getBoundingClientRect().top <= threshold) pinned = i;\n }\n const mediaIndex = Math.min(\n items.length - 1,\n pinned + 1,\n );\n setActiveIndex((prev) =>\n prev === mediaIndex ? prev : mediaIndex,\n );\n };\n\n const schedule = () => {\n if (rafId !== 0) return;\n rafId = window.requestAnimationFrame(tick);\n };\n\n tick();\n window.addEventListener(\"scroll\", schedule, { passive: true });\n window.addEventListener(\"resize\", schedule, { passive: true });\n const mq = window.matchMedia(\"(min-width: 992px)\");\n mq.addEventListener(\"change\", schedule);\n\n return () => {\n window.removeEventListener(\"scroll\", schedule);\n window.removeEventListener(\"resize\", schedule);\n mq.removeEventListener(\"change\", schedule);\n if (rafId !== 0) window.cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n /*\n * Mobile: exactly one item is active at a time, the one nearest the middle\n * of the viewport.\n *\n * The stacked list used to pass `active` for every card, which meant every\n * intersecting animation loaded and played at once — up to ten players, ten\n * `.lottie` payloads and the shared engine all competing on the connection\n * least able to afford it, while the visitor can only see one. This mirrors\n * what the desktop column already does: one active index, driven by\n * position.\n *\n * The inset `rootMargin` biases selection to the middle band so the active\n * card is the one being read, not one clipped at the top or bottom edge.\n * Skipped above the layout breakpoint, where this list is `display: none`\n * and the desktop `activeIndex` owns playback.\n */\n useEffect(() => {\n if (items.length === 0) return;\n if (typeof window === \"undefined\") return;\n\n const ratios = new Map<number, number>();\n const observer = new IntersectionObserver(\n (entries) => {\n if (window.matchMedia(\"(min-width: 992px)\").matches) return;\n\n for (const entry of entries) {\n const idx = Number(entry.target.getAttribute(\"data-fs-mobile-idx\"));\n if (!Number.isFinite(idx)) continue;\n ratios.set(idx, entry.isIntersecting ? entry.intersectionRatio : 0);\n }\n\n let best = 0;\n let bestRatio = -1;\n for (const [idx, ratio] of ratios) {\n if (ratio > bestRatio) {\n bestRatio = ratio;\n best = idx;\n }\n }\n if (bestRatio <= 0) return;\n setMobileActiveIndex((prev) => (prev === best ? prev : best));\n },\n {\n root: null,\n rootMargin: \"-28% 0px -28% 0px\",\n threshold: [0, 0.15, 0.3, 0.5, 0.75, 1],\n }\n );\n\n for (const el of mobileItemRefs.current) {\n if (el) observer.observe(el);\n }\n return () => observer.disconnect();\n }, [items.length]);\n\n const rootClass = [\n \"fs\",\n `fs--${variant}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (items.length === 0) {\n return (\n <section className={rootClass} {...props}>\n <div className=\"fs__inner\">\n <h2 className=\"fs__header\">{header}</h2>\n </div>\n </section>\n );\n }\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"fs__inner\">\n\n {/* ── Section header ── */}\n <h2 className=\"fs__header\">{header}</h2>\n\n {/* ══ DESKTOP LAYOUT (hidden on mobile) ══════════════\n * Two equal columns; sticky media + scrolling text.\n * Column order is reversed by .fs--media-left.\n */}\n <div className=\"fs__layout\">\n\n {/* Media column: outer stretches to section height; inner is sticky so\n bottom constraint matches the full layout (fixes upward shift when\n scrolling back from the section below). */}\n <div className=\"fs__media-col\" aria-hidden=\"true\">\n <div\n ref={mediaColRef}\n className=\"fs__media-sticky\"\n >\n <div className=\"fs__media-wrap\">\n {items.map((item, i) => (\n <div\n key={i}\n className={[\n \"fs__media-item\",\n i === activeIndex\n ? \"fs__media-item--active\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <MediaRenderer\n item={item}\n active={i === activeIndex}\n rootMargin={mediaRootMargin}\n threshold={mediaThreshold}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Text column: every step in flow — continuous scroll; ~viewport band min-height per step */}\n <div className=\"fs__content-col\">\n {items.map((item, i) => (\n <div\n key={i}\n className=\"fs__item\"\n >\n <h3\n ref={(el) => {\n titleRefs.current[i] = el;\n }}\n className=\"fs__item-title\"\n >\n {item.title}\n </h3>\n <p className=\"fs__item-desc\">\n {item.description}\n </p>\n <a\n href={item.link}\n className=\"fs__item-link\"\n >\n <span>{item.linkLabel}</span>\n <ChevronRight />\n </a>\n </div>\n ))}\n </div>\n </div>\n\n {/* ══ MOBILE LAYOUT (hidden on desktop) ══════════════\n * Stacked items: Title → Media → Description → Link.\n * Variant prop has no effect; layout is always stacked.\n */}\n <div className=\"fs__mobile-list\">\n {items.map((item, i) => (\n <div\n key={i}\n className=\"fs__mobile-item\"\n data-fs-mobile-idx={i}\n ref={(el) => {\n mobileItemRefs.current[i] = el;\n }}\n >\n <h3 className=\"fs__item-title\">\n {item.title}\n </h3>\n <div className=\"fs__mobile-media\">\n <MediaRenderer\n item={item}\n active={i === mobileActiveIndex}\n rootMargin={mediaRootMargin}\n threshold={mediaThreshold}\n />\n </div>\n <p className=\"fs__item-desc\">\n {item.description}\n </p>\n <a\n href={item.link}\n className=\"fs__item-link\"\n >\n <span>{item.linkLabel}</span>\n <ChevronRight />\n </a>\n </div>\n ))}\n </div>\n\n </div>\n </section>\n );\n};\n\nexport default FeatureScroll;\n","import {\n lazy,\n Suspense,\n useEffect,\n useRef,\n useState,\n type ComponentProps,\n type ReactNode,\n} from \"react\";\nimport type { DotLottieReact, DotLottie } from \"@lottiefiles/dotlottie-react\";\n\n/**\n * The player, loaded on demand.\n *\n * `@lottiefiles/dotlottie-react` is a static import away from being in every\n * consumer's FIRST LOAD — measured at 325,794 B parsed / ~40 KB on the wire in\n * a Next.js app, on every page, including the majority that contain no\n * animation at all. Because this component already decides *when* an animation\n * may run, it is also the right place to decide when the player is fetched: the\n * same IntersectionObserver gate now controls the download, not just play/stop.\n *\n * The type import above is erased at build time, so `ComponentProps` keeps\n * working without pulling the module into the bundle.\n */\nconst DotLottiePlayer = lazy(() =>\n import(\"@lottiefiles/dotlottie-react\").then((m) => ({ default: m.DotLottieReact }))\n);\n\nexport type DotLottieInViewProps = Omit<\n ComponentProps<typeof DotLottieReact>,\n \"autoplay\" | \"dotLottieRefCallback\"\n> & {\n /**\n * When false, playback is stopped (e.g. inactive slide in a stacked player).\n * When true, plays once whenever the instance is both enabled and intersecting.\n */\n enabled?: boolean;\n rootMargin?: string;\n threshold?: number | number[];\n /** Loop while enabled and in view. Defaults to false. */\n loop?: boolean;\n /**\n * Painted in place of the player until the animation is ready, and as the\n * Suspense fallback while the player chunk loads.\n *\n * Worth supplying on anything a visitor meets early on a slow connection:\n * the WebAssembly engine is ~630 KB compressed and one engine serves every\n * animation on the page, so the first animated band on a cold visit can sit\n * empty for seconds. A still frame makes that a progressive load rather than\n * a hole in the layout. A `ReactNode` rather than a URL so the consumer can\n * pass a properly sized, responsive `<img>` rather than a bare `src`.\n */\n poster?: ReactNode;\n};\n\n/**\n * Plays a .lottie once when it scrolls into view. Stops and resets when it leaves view.\n * When it enters view again, it plays once more. Set `enabled={false}` to force stop\n * (e.g. hidden slides) without relying on geometry alone.\n *\n * The player itself is fetched lazily, the first time this instance is in view —\n * so a page with no animation never downloads it, and a below-the-fold band does\n * not pay for it during initial load. `enabled` gates playback only: a consumer\n * that crossfades between stacked instances needs them all loaded, not just the\n * one currently showing.\n */\nexport function DotLottieInView({\n enabled = true,\n rootMargin = \"0px\",\n threshold = 0.2,\n loop = false,\n className,\n style,\n poster,\n ...dotProps\n}: DotLottieInViewProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const [inView, setInView] = useState(false);\n /**\n * Latched: once the player has been mounted it stays mounted.\n *\n * Scrolling away still stops playback (below), but tearing the player down\n * would discard the engine and the `.lottie` payload and re-fetch both the\n * next time the band came back — which on a slow connection is the whole\n * cost paid twice for something the visitor has already seen.\n */\n const [mounted, setMounted] = useState(false);\n const [dotLottie, setDotLottie] = useState<DotLottie | null>(null);\n\n useEffect(() => {\n const el = wrapRef.current;\n if (!el) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n setInView(entry.isIntersecting);\n },\n { root: null, rootMargin, threshold }\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, [rootMargin, threshold]);\n\n /**\n * Commit the first mount when the browser is next idle.\n *\n * Not a fixed delay: `requestIdleCallback` fires within a frame or two on an\n * unloaded page, so this is imperceptible on a fast connection. On a slow\n * one the main thread and the network are busy with images the visitor is\n * actually looking at, and deferring by even that much lets those finish\n * first. The timeout is the ceiling, so a permanently busy page still\n * animates rather than never mounting.\n */\n useEffect(() => {\n if (mounted) return;\n // Deliberately NOT `inView && enabled`. `enabled` says which animation may\n // PLAY; it must not decide which one may load.\n //\n // FeatureScroll's desktop column stacks every item absolutely in one\n // sticky box and crossfades between them, so all of them intersect\n // together while only one is enabled. Gating the mount on `enabled` meant\n // each item began loading at the moment it became active — the fetch and\n // player init landed inside the crossfade, so the media box flashed empty\n // on the way past and looked different scrolling up vs down.\n //\n // Intersection alone is the right gate: a band that is never reached\n // still downloads nothing, but once a band IS on screen everything it can\n // crossfade to is ready. On stacked mobile layouts each item has its own\n // box, so this still staggers naturally.\n if (!inView) return;\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n const commit = () => {\n if (!cancelled) setMounted(true);\n };\n\n const idleId =\n typeof window.requestIdleCallback === \"function\"\n ? window.requestIdleCallback(commit, { timeout: 400 })\n : null;\n const timerId = idleId === null ? window.setTimeout(commit, 0) : null;\n\n return () => {\n cancelled = true;\n if (idleId !== null && typeof window.cancelIdleCallback === \"function\") {\n window.cancelIdleCallback(idleId);\n }\n if (timerId !== null) window.clearTimeout(timerId);\n };\n }, [inView, mounted]);\n\n useEffect(() => {\n if (!dotLottie) return;\n\n if (!enabled || !inView) {\n dotLottie.stop();\n return;\n }\n\n /**\n * Wait for the animation to be loaded before starting it.\n *\n * `play()` on an instance whose `.lottie` is still downloading is a\n * silent no-op — and with `autoplay={false}` and `loop={false}` nothing\n * starts it afterwards, so the animation sits on frame 0 until something\n * happens to re-run this effect.\n *\n * That is a race this component used to win by accident: when the player\n * was imported statically it mounted at page load, so by the time anyone\n * scrolled to it the data was long since ready. Now that mounting is\n * deferred to intersection, the very first item — the one already\n * `enabled` when its band arrives — reliably LOSES it: the visitor sees a\n * still frame, and only scrolling away and back (which toggles `inView`\n * and re-runs this effect, by which point the data has arrived) makes it\n * play. Later items are unaffected because they become `enabled` a scroll\n * later, after their data has landed.\n */\n const start = () => {\n dotLottie.stop();\n dotLottie.play();\n };\n\n if (dotLottie.isLoaded) {\n start();\n return;\n }\n\n dotLottie.addEventListener(\"load\", start);\n return () => dotLottie.removeEventListener(\"load\", start);\n }, [dotLottie, enabled, inView]);\n\n return (\n <div\n ref={wrapRef}\n className={className}\n style={{\n width: \"100%\",\n height: \"100%\",\n minHeight: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n ...style,\n }}\n >\n {mounted ? (\n <Suspense fallback={poster ?? null}>\n <DotLottiePlayer\n {...dotProps}\n loop={loop}\n autoplay={false}\n dotLottieRefCallback={setDotLottie}\n />\n </Suspense>\n ) : (\n (poster ?? null)\n )}\n </div>\n );\n}\n","/**\n * Decide whether a stored media URL is a Lottie payload rather than a picture.\n *\n * `.lottie` is unambiguous. `.json` is not — most JSON is not animation — so it\n * only counts when the URL also looks like animation hosting (the same test\n * Raven uses in `isLottieMediaUrl`).\n */\nexport function isLottieSrc(value: string): boolean {\n if (!value) return false;\n if (/\\.lottie(\\?|#|$)/i.test(value)) return true;\n return /\\/[^/?#]+\\.json(\\?|#|$)/i.test(value) && /lottie|cdn\\.|website-files/i.test(value);\n}\n","import { Link } from \"../../components/Link\";\nimport type { FeatureSplitProps } from \"./FeatureSplit.types\";\nimport \"./FeatureSplit.css\";\n\nexport const FeatureSplit = ({\n title,\n description,\n showDescription = true,\n linkText = \"Learn more\",\n showLink = true,\n onLinkClick,\n image,\n imageAlt = \"\",\n imagePosition = \"right\",\n}: FeatureSplitProps) => {\n return (\n <section className=\"feature-split\">\n <div className=\"feature-split__container\">\n <div\n className={[\n \"feature-split__split\",\n imagePosition === \"left\" ? \"feature-split__split--image-left\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <div className=\"feature-split__content\">\n <h2 className=\"feature-split__title\">{title}</h2>\n\n {showDescription && description && (\n <p className=\"feature-split__description\">{description}</p>\n )}\n\n {showLink && (\n <Link\n colorScheme=\"coral\"\n label={linkText}\n onClick={onLinkClick}\n />\n )}\n </div>\n\n {image && (\n <div className=\"feature-split__image-wrapper\">\n <img\n alt={imageAlt}\n className=\"feature-split__image\"\n src={image}\n />\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport type { StickyCardItem, StickyStackedCardsProps } from \"./StickyStackedCards.types\";\nimport \"./StickyStackedCards.css\";\n\n/* ── Default data ──────────────────────────────────────────── */\n\n/* ── Shared design-system placeholder image ────────────────── */\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\nexport const STEPS_DATA: StickyCardItem[] = [\n {\n title: \"Title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n imageUrl: PLACEHOLDER_IMAGE,\n theme: \"light\",\n },\n {\n title: \"Title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n imageUrl: PLACEHOLDER_IMAGE,\n theme: \"coral\",\n },\n {\n title: \"Title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n imageUrl: PLACEHOLDER_IMAGE,\n theme: \"dark\",\n },\n];\n\n/* ── Scale targets per card depth ─────────────────────────── */\n/*\n * When a card is fully covered by the card on top of it, its\n * scale reaches this minimum — creating the visual depth seen\n * in the stacked state. The last card always stays at 1.\n *\n * Index → minimum scale when fully covered:\n * 0 (Sign up) → 0.88 (furthest back)\n * 1 (Deposit) → 0.94 (one level back)\n * 2 (Trade) → 1.00 (front card, never scales down)\n */\nconst MIN_SCALE: Record<number, number> = { 0: 0.88, 1: 0.94 };\n\n/* ── StickyStackedCards ────────────────────────────────────── */\n\nexport const StickyStackedCards = ({\n header,\n items,\n className,\n ...props\n}: StickyStackedCardsProps) => {\n const cardRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n /*\n * SCALE SCROLL HANDLER\n * --------------------\n * Runs on every scroll tick (passive, rAF-debounced).\n * For each card that has a card on top of it, we measure\n * how close the next card is to its fully-stacked position\n * and interpolate --card-scale toward the MIN_SCALE value.\n *\n * progress = 0 → next card is still far below (no scale)\n * progress = 1 → next card has landed on its sticky top (full scale-down)\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let rafId = 0;\n\n const update = () => {\n const cards = cardRefs.current.filter(Boolean) as HTMLDivElement[];\n const n = cards.length;\n\n cards.forEach((card, i) => {\n const minScale = MIN_SCALE[i];\n if (minScale === undefined) {\n // Last card — always full size\n card.style.setProperty(\"--card-scale\", \"1\");\n return;\n }\n\n const nextCard = cards[i + 1];\n if (!nextCard) return;\n\n const cardRect = card.getBoundingClientRect();\n const nextRect = nextCard.getBoundingClientRect();\n\n /*\n * \"gap\" = how far the next card's top is above the\n * current card's top in the viewport.\n *\n * gap ≥ cardHeight → next card is a full card-height below\n * (hasn't started overlapping) → progress 0\n * gap ≈ 0 or negative → next card is fully on top → progress 1\n */\n const cardHeight = cardRect.height;\n const gap = nextRect.top - cardRect.top;\n const progress = Math.max(0, Math.min(1, 1 - gap / cardHeight));\n\n const scale = 1 - (1 - minScale) * progress;\n card.style.setProperty(\"--card-scale\", String(+scale.toFixed(4)));\n });\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n // Run once immediately so initial state is correct\n update();\n\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n return (\n <section\n className={[\"ssc\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"ssc__inner\">\n\n {/* ── Section header ── */}\n <h2 className=\"ssc__header\">{header}</h2>\n\n {/* ── Card track ──────────────────────────────────────\n * CRITICAL:\n * • display:block on desktop (not flex) — see CSS note\n * • NO overflow:hidden — breaks position:sticky\n */}\n <div className=\"ssc__track\">\n {items.map((item, i) => (\n <div\n key={i}\n ref={(el) => { cardRefs.current[i] = el; }}\n className={[\n \"ssc__card\",\n `ssc__card--${item.theme ?? \"light\"}`,\n ].join(\" \")}\n style={{\n zIndex: i + 1,\n /*\n * PEEK OFFSET — every card gets i × peek-offset so each\n * prior card shows as a thin strip at the top of the next.\n *\n * Example with 3 cards, peek = 16px:\n * Card 0 (Sign up) → 80px\n * Card 1 (Deposit) → 96px (Sign up peeks 16px above)\n * Card 2 (Trade) → 112px (Deposit peeks 16px, Sign up 32px above)\n *\n * Final state: two 16px colour strips at top, Trade fills the rest.\n */\n top: `calc(var(--ssc-sticky-top) + ${i} * var(--ssc-peek-offset))`,\n } as React.CSSProperties}\n >\n {/* Left column — text content, top-left anchored */}\n <div className=\"ssc__card-content\">\n <h3 className=\"ssc__card-title\">{item.title}</h3>\n <p className=\"ssc__card-desc\">{item.description}</p>\n </div>\n\n {/* Right column — hero image */}\n <div className=\"ssc__card-image\">\n <img\n src={item.imageUrl}\n alt={item.title}\n loading={i === 0 ? \"eager\" : \"lazy\"}\n />\n </div>\n </div>\n ))}\n </div>\n\n </div>\n </section>\n );\n};\n\nexport default StickyStackedCards;\n","import { useRef } from \"react\";\nimport {\n motion,\n useScroll,\n useSpring,\n useTransform,\n useMotionTemplate,\n type MotionValue,\n} from \"framer-motion\";\nimport type { CTABannerProps, AvatarItem } from \"./CTABanner.types\";\nimport { Button } from \"../../components/Button\";\nimport \"./CTABanner.css\";\n\n/* ── Entrance distance constants ─────────────────────────────────\n * How far from the centre each tier starts before scrolling in.\n * Values are intentionally large so the \"coming from far away\"\n * effect is clearly visible. Each avatar moves radially outward\n * from the centre — top avatars fly in from above, left avatars\n * from the left, corners from their diagonal, etc.\n *\n * Tier mapping (by staggerRank / distance from centre):\n * near → rank 0–1 → 80px\n * mid → rank 2–5 → 130px\n * far → rank 6–8 → 180px\n * edge → rank 9–11 → 240px (corners, most dramatic)\n *\n * blurStart: initial CSS blur in px when section enters.\n * blurStart corresponds to --spacing-16 (1rem = 16px).\n */\nconst ENTRANCE = {\n near: 80,\n mid: 130,\n far: 180,\n edge: 240,\n blurStart: 28,\n} as const;\n\n/* ── Spring config ───────────────────────────────────────────────\n * Wrapping scrollYProgress in useSpring adds a slight lag that\n * makes the parallax feel organic rather than mechanically locked\n * to the scroll wheel.\n *\n */\nconst SPRING = { stiffness: 80, damping: 30, restDelta: 0.001 } as const;\n\n/* ── Scroll range ────────────────────────────────────────────────\n * Avatars settle into their final grid positions by this progress\n * value (0 = section just entering viewport, 0.5 = section\n * centred). After LOCK_AT, y stays clamped at 0 — they \"snap\" to\n * the grid without continuing to move.\n */\nconst LOCK_AT = 0.5;\n\n/* ── Default data ────────────────────────────────────────────────\n * Desktop positions: 9-row stage (9 × 96px = 864px).\n * Stage centre = 432px = row 4 centre → hero aligns with mid-left/right.\n * Equal 1-cell breathing room top (row 1) and bottom (row 7 bottom = 768px, stage = 864px).\n *\n * Row 1 (y=96): col 0, 6, 12 — top outer (3 avatars)\n * Row 2 (y=192): col 3, 9 — upper inner (2 avatars)\n * Row 4 (y=384): col 0, 12 — mid, hero level (2 avatars)\n * Row 6 (y=576): col 3, 9 — lower inner (2 avatars)\n * Row 7 (y=672): col 0, 6, 12 — bottom outer (3 avatars)\n *\n * Mobile/tablet: identical layout to the compact variant (6 avatars).\n *\n * staggerRank: Euclidean distance rank from stage centre (col 6.5, row 4).\n * 0 = closest → slowest parallax (near tier)\n * 11 = furthest (corner) → fastest parallax (edge tier)\n */\n\nconst PLACEHOLDER_URL =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86ce1a_footer-member-5.webp\";\n\nexport const AVATAR_DATA: AvatarItem[] = [\n /* ── Rank 0 — top-centre (col 6, row 1) ─────── */\n {\n id: 12, staggerRank: 0, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 6)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobileVisible: true,\n },\n /* ── Rank 1 — bot-centre (col 6, row 7) ─────── */\n {\n id: 11, staggerRank: 1, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 6)\", top: \"calc(var(--ctab-grid-cell) * 7)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 2 — upper-inner-left (col 3, row 2) ── */\n {\n id: 3, staggerRank: 2, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 3)\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 3 — upper-inner-right (col 9, row 2) ── */\n {\n id: 6, staggerRank: 3, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 9)\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 4 — lower-inner-left (col 3, row 6) ── */\n {\n id: 1, staggerRank: 4, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 3)\", top: \"calc(var(--ctab-grid-cell) * 6)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 9)\" },\n mobileVisible: true,\n },\n /* ── Rank 5 — lower-inner-right (col 9, row 6) ── */\n {\n id: 10, staggerRank: 5, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 9)\", top: \"calc(var(--ctab-grid-cell) * 6)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 6 — mid-left (col 0, row 4) ──────── */\n {\n id: 5, staggerRank: 6, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 4)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 7 — mid-right (col 12, row 4) ────── */\n {\n id: 8, staggerRank: 7, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 4)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 8 — top-left corner (col 0, row 1) ── */\n {\n id: 4, staggerRank: 8, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 9 — top-right corner (col 12, row 1) ── */\n {\n id: 7, staggerRank: 9, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 10 — bot-left corner (col 0, row 7) ── */\n {\n id: 2, staggerRank: 10, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 7)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n /* ── Rank 11 — bot-right corner (col 12, row 7) ── */\n {\n id: 9, staggerRank: 11, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 7)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n];\n\n/* ── Compact variant data ────────────────────────────────────────\n * 7 desktop avatars within the 1280 × 680 stage (Figma node 6865-13441).\n * Desktop grid cell = 96px. Positions as col/row multiples.\n *\n * Mobile reuses the standard 6-avatar mobile layout (same positions).\n */\nexport const COMPACT_AVATAR_DATA: AvatarItem[] = [\n /* ── Rank 0 — top-centre (col ~6, row 1) ── */\n {\n id: 12, staggerRank: 0, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobileVisible: true,\n },\n /* ── Rank 1 — top-left (col 2, row 1) ───── */\n {\n id: 3, staggerRank: 1, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 2)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 2 — top-right (col 10, row 1) ─── */\n {\n id: 6, staggerRank: 2, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 10)\", top: \"calc(var(--ctab-grid-cell) * 1)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 2)\" },\n mobileVisible: true,\n },\n /* ── Rank 3 — mid-left (col 0, row 3) ────── */\n {\n id: 5, staggerRank: 3, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 3)\" },\n mobilePos: { left: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 4 — mid-right (col 12, row 3) ──── */\n {\n id: 8, staggerRank: 4, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 12)\", top: \"calc(var(--ctab-grid-cell) * 3)\" },\n mobilePos: { right: \"0\", top: \"calc(var(--ctab-grid-cell) * 8)\" },\n mobileVisible: true,\n },\n /* ── Rank 5 — bot-left (col 2, row 5) ────── */\n {\n id: 1, staggerRank: 5, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 2)\", top: \"calc(var(--ctab-grid-cell) * 5)\" },\n mobilePos: { left: \"calc(50% - var(--ctab-avatar-size) / 2)\", top: \"calc(var(--ctab-grid-cell) * 9)\" },\n mobileVisible: true,\n },\n /* ── Rank 6 — bot-right (col 10, row 5) — desktop only ─── */\n {\n id: 11, staggerRank: 6, imageUrl: PLACEHOLDER_URL,\n desktopPos: { left: \"calc(var(--ctab-grid-cell) * 10)\", top: \"calc(var(--ctab-grid-cell) * 5)\" },\n mobilePos: null,\n mobileVisible: false,\n },\n];\n\n/* ── Avatar radial entrance hooks ────────────────────────────────\n *\n * Hooks cannot be called inside a loop, so each of the 12\n * useTransform calls is explicit and always runs in the same order.\n * Index maps directly to AVATAR_DATA order (= staggerRank order).\n *\n * Y sign: + = avatar starts BELOW final position (bottom half)\n * - = avatar starts ABOVE final position (top half)\n * 0 = avatar is on the horizontal mid-line\n *\n * X sign: + = avatar starts to the RIGHT (right half)\n * - = avatar starts to the LEFT (left half)\n * 0 = avatar is on the vertical mid-line\n *\n * rank 0 (col 6, row 1) top-centre → X=0, Y=-near\n * rank 1 (col 6, row 7) bot-centre → X=0, Y=+near\n * rank 2 (col 3, row 2) upper-inner-left → X=-mid, Y=-mid\n * rank 3 (col 9, row 2) upper-inner-right → X=+mid, Y=-mid\n * rank 4 (col 3, row 6) lower-inner-left → X=-mid, Y=+mid\n * rank 5 (col 9, row 6) lower-inner-right → X=+mid, Y=+mid\n * rank 6 (col 0, row 4) mid-left → X=-far, Y=0\n * rank 7 (col 12, row 4) mid-right → X=+far, Y=0\n * rank 8 (col 0, row 1) top-left corner → X=-edge, Y=-edge\n * rank 9 (col 12, row 1) top-right corner → X=+edge, Y=-edge\n * rank 10 (col 0, row 7) bot-left corner → X=-edge, Y=+edge\n * rank 11 (col 12, row 7) bot-right corner → X=+edge, Y=+edge\n */\nfunction useAvatarYValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const y0 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]); // top-centre\n const y1 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.near, 0]); // bot-centre\n const y2 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // upper-inner-left\n const y3 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // upper-inner-right\n const y4 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // lower-inner-left\n const y5 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // lower-inner-right\n const y6 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-left (no Y)\n const y7 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-right (no Y)\n const y8 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // top-left corner\n const y9 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // top-right corner\n const y10 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // bot-left corner\n const y11 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // bot-right corner\n return [y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11];\n}\n\nfunction useAvatarXValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const x0 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // top-centre (no X)\n const x1 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // bot-centre (no X)\n const x2 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // upper-inner-left\n const x3 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // upper-inner-right\n const x4 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // lower-inner-left\n const x5 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // lower-inner-right\n const x6 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]); // mid-left\n const x7 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]); // mid-right\n const x8 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // top-left corner\n const x9 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // top-right corner\n const x10 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.edge, 0]); // bot-left corner\n const x11 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.edge, 0]); // bot-right corner\n return [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11];\n}\n\n/* ── Compact variant parallax hooks (7 avatars) ──────────────────\n *\n * rank 0 (top-centre): X=0, Y=-near\n * rank 1 (top-left): X=-mid, Y=-mid\n * rank 2 (top-right): X=+mid, Y=-mid\n * rank 3 (mid-left): X=-far, Y=0\n * rank 4 (mid-right): X=+far, Y=0\n * rank 5 (bot-left): X=-mid, Y=+mid\n * rank 6 (bot-right): X=+mid, Y=+mid\n */\nfunction useCompactAvatarYValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const y0 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.near, 0]); // top-centre\n const y1 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // top-left\n const y2 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // top-right\n const y3 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-left (no Y)\n const y4 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // mid-right (no Y)\n const y5 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // bot-left\n const y6 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // bot-right\n return [y0, y1, y2, y3, y4, y5, y6];\n}\n\nfunction useCompactAvatarXValues(smooth: MotionValue<number>): MotionValue<number>[] {\n const x0 = useTransform(smooth, [0, LOCK_AT], [0, 0]); // top-centre (no X)\n const x1 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // top-left\n const x2 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // top-right\n const x3 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.far, 0]); // mid-left\n const x4 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.far, 0]); // mid-right\n const x5 = useTransform(smooth, [0, LOCK_AT], [-ENTRANCE.mid, 0]); // bot-left\n const x6 = useTransform(smooth, [0, LOCK_AT], [ENTRANCE.mid, 0]); // bot-right\n return [x0, x1, x2, x3, x4, x5, x6];\n}\n\n/* ── CTABanner ────────────────────────────────────────────────── */\n\nexport const CTABanner = ({\n headline = \"Short section title goes here\",\n ctaLabel = \"Open account\",\n ctaHref = \"#\",\n avatars,\n variant = \"standard\",\n className,\n ...props\n}: CTABannerProps) => {\n const resolvedAvatars = avatars ?? (variant === \"compact\" ? COMPACT_AVATAR_DATA : AVATAR_DATA);\n const sectionRef = useRef<HTMLElement>(null);\n\n /* Track scroll progress as section crosses the viewport.\n * offset: \"start end\" = section top reaches viewport bottom → progress 0\n * offset: \"end start\" = section bottom reaches viewport top → progress 1\n * The spring smooths the raw scroll value into the organic\n * \"butter\" feel that matches the video reference. */\n const { scrollYProgress } = useScroll({\n target: sectionRef,\n offset: [\"start end\", \"end start\"],\n });\n\n const smooth = useSpring(scrollYProgress, SPRING);\n\n /* ── Grid: fade in as section enters ── */\n const gridOpacity = useTransform(smooth, [0, 0.3], [0, 1]);\n\n /* ── Hero: slight upward rise + fade ── */\n const heroY = useTransform(smooth, [0, LOCK_AT], [32, 0]);\n const heroOpacity = useTransform(smooth, [0, 0.3], [0, 1]);\n\n /* ── Avatar fade: all avatars share one opacity track ── */\n const avatarOpacity = useTransform(smooth, [0, 0.25], [0, 1]);\n\n /* ── Avatar blur: clears from blurStart → 0 as section enters ──\n * useMotionTemplate builds a valid CSS filter string so Framer\n * Motion can interpolate it at 60fps without touching the DOM\n * style attribute directly. */\n const blurPx = useTransform(smooth, [0, 0.3, 0.7, 1], [ENTRANCE.blurStart, 0, 0, ENTRANCE.blurStart]);\n const avatarFilter = useMotionTemplate`blur(${blurPx}px)`;\n\n /* ── Per-avatar radial entrance ── */\n const standardYValues = useAvatarYValues(smooth);\n const standardXValues = useAvatarXValues(smooth);\n const compactYValues = useCompactAvatarYValues(smooth);\n const compactXValues = useCompactAvatarXValues(smooth);\n\n const avatarYValues = variant === \"compact\" ? compactYValues : standardYValues;\n const avatarXValues = variant === \"compact\" ? compactXValues : standardXValues;\n\n return (\n <section\n ref={sectionRef}\n className={[\"ctab\", variant === \"compact\" ? \"ctab--compact\" : \"\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* ── Background grid ─────────────────────────────────── */}\n <motion.div\n className=\"ctab__grid\"\n style={{ opacity: gridOpacity }}\n aria-hidden=\"true\"\n />\n\n {/* ── Content stage ───────────────────────────────────── */}\n <div className=\"ctab__inner\">\n <div className=\"ctab__stage\">\n\n {/* ── Floating avatars ─────────────────────────────────\n * Position supplied as inline CSS custom properties so the\n * CSS token layer controls all sizing/spacing.\n *\n * Framer Motion controls only `y` (scroll-driven parallax)\n * and `opacity` (scroll-driven fade). No fixed initial\n * state — the animation is tied continuously to scroll.\n */}\n {resolvedAvatars.map((avatar, index) => {\n const posStyle: Record<string, string> = {};\n if (avatar.desktopPos.left) posStyle[\"--av-d-left\"] = avatar.desktopPos.left;\n if (avatar.desktopPos.right) posStyle[\"--av-d-right\"] = avatar.desktopPos.right;\n if (avatar.desktopPos.top) posStyle[\"--av-d-top\"] = avatar.desktopPos.top;\n if (avatar.mobilePos?.left) posStyle[\"--av-m-left\"] = avatar.mobilePos.left;\n if (avatar.mobilePos?.right) posStyle[\"--av-m-right\"] = avatar.mobilePos.right;\n if (avatar.mobilePos?.top) posStyle[\"--av-m-top\"] = avatar.mobilePos.top;\n\n return (\n <motion.div\n key={avatar.id}\n className={[\n \"ctab__avatar\",\n !avatar.mobileVisible ? \"ctab__avatar--desktop-only\" : \"\",\n ].filter(Boolean).join(\" \")}\n style={{\n ...(posStyle as React.CSSProperties),\n x: avatarXValues[index],\n y: avatarYValues[index],\n opacity: avatarOpacity,\n filter: avatarFilter,\n }}\n >\n <img\n src={avatar.imageUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n />\n </motion.div>\n );\n })}\n\n {/* ── Hero — headline + CTA ──────────────────── */}\n <motion.div\n className=\"ctab__hero\"\n style={{ y: heroY, opacity: heroOpacity }}\n >\n <h2 className=\"ctab__headline\">{headline}</h2>\n <a href={ctaHref}>\n <Button colorScheme=\"black\" variant=\"primary\" label={ctaLabel} />\n </a>\n </motion.div>\n\n </div>\n </div>\n </section>\n );\n};\n\nexport default CTABanner;\n","import { useRef, useState, useEffect, useCallback } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport type { NavbarProps, NavItem, NavDropdownFeature, NavDropdownSection, LanguageItem } from \"./Navbar.types\";\nimport { resolveLanguageGridVars } from \"./languageGridVars\";\nimport { Button } from \"../../components/Button\";\nimport GLOBE_ICON from \"../../assets/icon-globe.svg\";\nimport \"./Navbar.css\";\n\n/* ── Animation config ────────────────────────────────────────── */\n\nconst EASE_OUT_EXPO = [0.16, 1, 0.3, 1] as const;\n\nconst dropdownVariants = {\n hidden: { opacity: 0, scale: 0.96, y: -8 },\n visible: { opacity: 1, scale: 1, y: 0 },\n};\n\nconst drawerVariants = {\n hidden: { y: \"-100%\" },\n visible: { y: 0 },\n};\n\nconst accordionVariants = {\n hidden: { height: 0, opacity: 0 },\n visible: { height: \"auto\", opacity: 1 },\n};\n\n/* ── Inline SVG icons ────────────────────────────────────────── */\n\nconst ChevronDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2.625 4.8125L7 9.1875L11.375 4.8125\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ArrowRightIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.625 7H11.375M11.375 7L7.875 3.5M11.375 7L7.875 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst ArrowUpRightIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M4.5 11.5L11.5 4.5M11.5 4.5H5.5M11.5 4.5V10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst BarsIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 5H17.5M2.5 10H17.5M2.5 15H17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst XMarkIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M15 5L5 15M5 5L15 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst ChevronLeftIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst GlobeIcon = ({ className }: { className?: string }) => (\n <img src={GLOBE_ICON} alt=\"\" aria-hidden=\"true\" width=\"20\" height=\"20\" className={className} />\n);\n\n/* ── Desktop Dropdown Panel ──────────────────────────────────── */\n\ninterface DropdownPanelProps {\n item: NavItem;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n}\n\nconst DropdownPanel = ({ item, onMouseEnter, onMouseLeave }: DropdownPanelProps) => {\n const { dropdown } = item;\n if (!dropdown) return null;\n\n return (\n <motion.div\n className=\"navbar__dropdown\"\n variants={dropdownVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.18, ease: EASE_OUT_EXPO }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <div className=\"navbar__dropdown-inner\">\n {/* Left: link columns */}\n <div className=\"navbar__dropdown-left\">\n {dropdown.columns.map((col, colIdx) => (\n <div key={colIdx} className=\"navbar__dropdown-col\">\n {col.sections.map((section: NavDropdownSection) => (\n <div key={section.title} className=\"navbar__dropdown-col-list\">\n <p className=\"navbar__dropdown-col-title\">{section.title}</p>\n {section.items.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className=\"navbar__dropdown-link\"\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n >\n {link.label}\n {link.external ? <ArrowUpRightIcon /> : <ArrowRightIcon />}\n </a>\n ))}\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Right: feature card */}\n {dropdown.feature && (\n <div className=\"navbar__dropdown-right\">\n <FeatureCard feature={dropdown.feature} />\n </div>\n )}\n </div>\n </motion.div>\n );\n};\n\n/* ── Feature Card (shared desktop + mobile) ──────────────────── */\n\ninterface FeatureCardProps {\n feature: NavDropdownFeature;\n mobile?: boolean;\n}\n\nconst FeatureCard = ({ feature, mobile }: FeatureCardProps) => (\n <div\n className={mobile ? \"navbar__drawer-feature\" : \"navbar__dropdown-feature\"}\n style={\n feature.backgroundImageUrl\n ? { backgroundImage: `url(${feature.backgroundImageUrl})` }\n : undefined\n }\n >\n {feature.backgroundImageUrl && (\n <img\n src={feature.backgroundImageUrl}\n alt=\"\"\n className={mobile ? \"navbar__drawer-feature-img\" : \"navbar__dropdown-feature-img\"}\n aria-hidden=\"true\"\n />\n )}\n <div className={mobile ? \"navbar__drawer-feature-overlay\" : \"navbar__dropdown-feature-overlay\"} aria-hidden=\"true\" />\n <div className={mobile ? \"navbar__drawer-feature-content\" : \"navbar__dropdown-feature-content\"}>\n <div>\n <p className={mobile ? \"navbar__drawer-feature-title\" : \"navbar__dropdown-feature-title\"}>\n {feature.title}\n </p>\n <p className={mobile ? \"navbar__drawer-feature-desc\" : \"navbar__dropdown-feature-desc\"}>\n {feature.description}\n </p>\n </div>\n <a\n href={feature.ctaHref}\n className={mobile ? \"navbar__drawer-feature-cta\" : \"navbar__dropdown-feature-cta\"}\n >\n {feature.ctaLabel}\n <ArrowRightIcon />\n </a>\n </div>\n </div>\n);\n\n/* ── Mobile Accordion Item ───────────────────────────────────── */\n\ninterface DrawerAccordionProps {\n item: NavItem;\n isOpen: boolean;\n onToggle: () => void;\n}\n\nconst DrawerAccordion = ({ item, isOpen, onToggle }: DrawerAccordionProps) => {\n const { dropdown } = item;\n\n return (\n <div className=\"navbar__drawer-item\">\n <button\n className={`navbar__drawer-trigger ${isOpen ? \"navbar__drawer-trigger--open\" : \"\"}`}\n onClick={onToggle}\n aria-expanded={isOpen}\n >\n {item.label}\n <ChevronDownIcon className=\"navbar__drawer-trigger__chevron\" />\n </button>\n\n <AnimatePresence initial={false}>\n {isOpen && dropdown && (\n <motion.div\n className=\"navbar__drawer-panel\"\n variants={accordionVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.22, ease: EASE_OUT_EXPO }}\n >\n <div className=\"navbar__drawer-panel-inner\">\n {/* Link columns — each column's sections stack vertically */}\n <div className=\"navbar__drawer-panel-cols\">\n {dropdown.columns.map((col, colIdx) => (\n <div key={colIdx} className=\"navbar__drawer-panel-col\">\n {col.sections.map((section: NavDropdownSection) => (\n <div key={section.title} className=\"navbar__drawer-col-section\">\n <p className=\"navbar__drawer-col-title\">{section.title}</p>\n <div className=\"navbar__drawer-col-links\">\n {section.items.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className=\"navbar__drawer-link\"\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n >\n {link.label}\n </a>\n ))}\n </div>\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Feature card */}\n {dropdown.feature && (\n <FeatureCard feature={dropdown.feature} mobile />\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n\n/* ── Navbar ───────────────────────────────────────────────────── */\n\nexport const Navbar = ({\n theme = \"dark\",\n logoSrc,\n logoSrcDark,\n logoHref = \"/\",\n navItems = [],\n loginLabel = \"Log in\",\n loginHref,\n ctaLabel = \"Open account\",\n ctaHref,\n languageLabel,\n onLanguageClick,\n languageItems,\n languageRows,\n activeLanguageCode,\n onLanguageSelect,\n className,\n ...props\n}: NavbarProps) => {\n const [openDropdown, setOpenDropdown] = useState<string | null>(null);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [mobileExpanded, setMobileExpanded] = useState<string | null>(null);\n const [scrolled, setScrolled] = useState(false);\n const [isDesktop, setIsDesktop] = useState(false);\n const [langDropdownOpen, setLangDropdownOpen] = useState(false);\n const [mobileLangOpen, setMobileLangOpen] = useState(false);\n\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const langHoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pillAreaRef = useRef<HTMLDivElement>(null);\n const langBtnRef = useRef<HTMLButtonElement>(null);\n\n const hasLangDropdown = Boolean(languageItems && languageItems.length > 0);\n\n const resolvedLogo = theme === \"light\" ? (logoSrcDark ?? logoSrc) : logoSrc;\n\n /* ── Dev warning: condensed pill logo goes invisible without logoSrcDark ──\n The pill background turns near-white on scroll for both themes, and\n the pill logo always renders `logoSrcDark ?? logoSrc` regardless of\n theme. Omitting logoSrcDark silently falls back to the light-coloured\n logoSrc, which is invisible against that white pill. */\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && !logoSrcDark) {\n console.warn(\n \"[Navbar] `logoSrcDark` was not provided. The condensed pill logo (shown once the page is scrolled) falls back to `logoSrc`, which is typically the light-coloured logo — it will be invisible against the pill's white/near-white scrolled background. Pass `logoSrcDark` to fix this.\",\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [logoSrcDark]);\n\n /* ── Scroll detection ── */\n useEffect(() => {\n const onScroll = () => setScrolled(window.scrollY > 0);\n onScroll(); // sync state with an already-scrolled page (anchor links, restored scroll, back-nav)\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n /* ── Desktop breakpoint — outer logo/actions only duplicate on ≥992px.\n Must not mark them inert on mobile, where the pill copies are display:none\n and the outer logo remains the sole visible home control. ── */\n useEffect(() => {\n const mq = window.matchMedia(\"(min-width: 992px)\");\n const onChange = () => setIsDesktop(mq.matches);\n onChange();\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, []);\n\n /* ── Close on Escape ── */\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpenDropdown(null);\n setMobileOpen(false);\n setMobileLangOpen(false);\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, []);\n\n /* ── Reset language panel when drawer closes ── */\n useEffect(() => {\n if (!mobileOpen) setMobileLangOpen(false);\n }, [mobileOpen]);\n\n /* ── Body scroll lock when drawer is open ── */\n useEffect(() => {\n document.body.style.overflow = mobileOpen ? \"hidden\" : \"\";\n return () => { document.body.style.overflow = \"\"; };\n }, [mobileOpen]);\n\n /* ── Close dropdown on outside click ── */\n useEffect(() => {\n if (!openDropdown) return;\n const onPointerDown = (e: PointerEvent) => {\n if (pillAreaRef.current && !pillAreaRef.current.contains(e.target as Node)) {\n setOpenDropdown(null);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown);\n }, [openDropdown]);\n\n /* ── Hover handlers with debounce ── */\n const clearHoverTimeout = useCallback(() => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n }, []);\n\n /* ── Language dropdown hover handlers ── */\n const clearLangHoverTimeout = useCallback(() => {\n if (langHoverTimeoutRef.current) {\n clearTimeout(langHoverTimeoutRef.current);\n langHoverTimeoutRef.current = null;\n }\n }, []);\n\n const handleLangEnter = useCallback(() => {\n clearLangHoverTimeout();\n setLangDropdownOpen(true);\n }, [clearLangHoverTimeout]);\n\n const handleLangLeave = useCallback(() => {\n clearLangHoverTimeout();\n langHoverTimeoutRef.current = setTimeout(() => setLangDropdownOpen(false), 150);\n }, [clearLangHoverTimeout]);\n\n const handleLangSelect = useCallback((code: string) => {\n setLangDropdownOpen(false);\n setMobileLangOpen(false);\n onLanguageSelect?.(code);\n }, [onLanguageSelect]);\n\n const handleNavEnter = useCallback((label: string) => {\n clearHoverTimeout();\n setOpenDropdown(label);\n }, [clearHoverTimeout]);\n\n const handleNavLeave = useCallback(() => {\n clearHoverTimeout();\n hoverTimeoutRef.current = setTimeout(() => setOpenDropdown(null), 120);\n }, [clearHoverTimeout]);\n\n const activeDropdownItem = navItems.find((item) => item.label === openDropdown);\n\n /* Inactive desktop copies stay visually transitioned but must leave the\n tab order / a11y tree. Pill copies are inert at top-of-page; outer logo\n and actions are inert once scrolled (desktop only). */\n const pillCopyInert = !scrolled;\n const outerCopyInert = scrolled && isDesktop;\n\n /* ── Render ── */\n return (\n <nav\n className={[\"navbar\", `navbar--${theme}`, scrolled && \"navbar--scrolled\", mobileOpen && \"navbar--menu-open\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"navbar__bar\">\n\n {/* Logo */}\n <a\n href={logoHref}\n className=\"navbar__logo\"\n aria-label=\"Home\"\n inert={outerCopyInert || undefined}\n >\n <img src={resolvedLogo} alt=\"Logo\" />\n </a>\n\n {/* ── Desktop pill (full-width centering layer) ── */}\n <div className=\"navbar__nav-center\" ref={pillAreaRef}>\n <div className=\"navbar__pill\">\n\n {/* Logo — hidden by default, slides in when scrolled (desktop) */}\n <a\n href={logoHref}\n className=\"navbar__pill-logo\"\n aria-label=\"Home\"\n inert={pillCopyInert || undefined}\n >\n <img src={logoSrcDark ?? logoSrc} alt=\"Logo\" />\n </a>\n\n {/* Nav items + language switcher */}\n <div className=\"navbar__nav-group\">\n {navItems.map((item) => {\n if (item.external) {\n return (\n <a\n key={item.label}\n href={item.href}\n className=\"navbar__nav-item\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.label}\n <ArrowUpRightIcon />\n </a>\n );\n }\n\n if (item.dropdown) {\n return (\n <button\n key={item.label}\n className={[\n \"navbar__nav-item\",\n openDropdown === item.label ? \"navbar__nav-item--open\" : \"\",\n ].filter(Boolean).join(\" \")}\n onMouseEnter={() => handleNavEnter(item.label)}\n onMouseLeave={handleNavLeave}\n aria-expanded={openDropdown === item.label}\n aria-haspopup=\"true\"\n >\n {item.label}\n <ChevronDownIcon className=\"navbar__nav-item__chevron\" />\n </button>\n );\n }\n\n return (\n <a key={item.label} href={item.href} className=\"navbar__nav-item\">\n {item.label}\n </a>\n );\n })}\n\n {/* Language switcher — inside nav-group so spacing matches nav items */}\n {languageLabel && (\n <div\n className=\"navbar__lang-wrapper\"\n onMouseEnter={hasLangDropdown ? handleLangEnter : undefined}\n onMouseLeave={hasLangDropdown ? handleLangLeave : undefined}\n >\n <button\n ref={langBtnRef}\n className={[\n \"navbar__nav-item\",\n \"navbar__lang-btn\",\n hasLangDropdown && langDropdownOpen ? \"navbar__nav-item--open\" : \"\",\n ].filter(Boolean).join(\" \")}\n onClick={hasLangDropdown ? () => setLangDropdownOpen((o) => !o) : onLanguageClick}\n aria-haspopup={hasLangDropdown ? \"true\" : undefined}\n aria-expanded={hasLangDropdown ? langDropdownOpen : undefined}\n >\n <GlobeIcon className=\"navbar__lang-globe\" />\n {languageLabel}\n </button>\n </div>\n )}\n </div>\n\n {/* CTA buttons — hidden by default, slides in when scrolled (desktop) */}\n <div\n className=\"navbar__pill-actions\"\n inert={pillCopyInert || undefined}\n >\n {loginHref && (\n <a href={loginHref}>\n <Button colorScheme=\"black\" variant=\"secondary\" label={loginLabel} />\n </a>\n )}\n {ctaHref && (\n <a href={ctaHref}>\n <Button colorScheme=\"coral\" variant=\"primary\" label={ctaLabel} />\n </a>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Desktop dropdown — child of navbar__bar (position:relative,\n full viewport width), so left:50% + translateX(-50%)\n centres relative to the screen ── */}\n <AnimatePresence>\n {openDropdown && activeDropdownItem?.dropdown && (\n <DropdownPanel\n key=\"dropdown\"\n item={activeDropdownItem}\n onMouseEnter={clearHoverTimeout}\n onMouseLeave={handleNavLeave}\n />\n )}\n </AnimatePresence>\n\n {/* ── Desktop language dropdown — same positioning as nav dropdown,\n child of navbar__bar so it centres relative to the screen ── */}\n <AnimatePresence>\n {hasLangDropdown && langDropdownOpen && (\n <motion.div\n className=\"navbar__lang-dropdown\"\n variants={dropdownVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.18, ease: EASE_OUT_EXPO }}\n onMouseEnter={clearLangHoverTimeout}\n onMouseLeave={handleLangLeave}\n >\n <div\n className=\"navbar__lang-dropdown-grid\"\n style={\n resolveLanguageGridVars(\n languageItems!.length,\n languageRows,\n ) as React.CSSProperties\n }\n >\n {languageItems!.map((lang) => (\n <button\n key={lang.code}\n className={[\n \"navbar__lang-dropdown-item\",\n lang.code === activeLanguageCode\n ? \"navbar__lang-dropdown-item--active\"\n : \"\",\n ].filter(Boolean).join(\" \")}\n onClick={() => handleLangSelect(lang.code)}\n >\n {lang.label}\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {/* ── Desktop CTA buttons ── */}\n <div\n className=\"navbar__actions\"\n inert={outerCopyInert || undefined}\n >\n {loginHref && (\n <a href={loginHref} className=\"navbar__actions-login\">\n <Button\n colorScheme={theme === \"dark\" ? \"white\" : \"black\"}\n variant=\"secondary\"\n label={loginLabel}\n />\n </a>\n )}\n {ctaHref && (\n <a href={ctaHref}>\n <Button colorScheme=\"coral\" variant=\"primary\" label={ctaLabel} />\n </a>\n )}\n </div>\n\n {/* ── Mobile: Login + Hamburger ── */}\n <div className=\"navbar__mobile-actions\">\n {loginHref && (\n <a href={loginHref}>\n <Button\n colorScheme={scrolled || theme === \"light\" ? \"black\" : \"white\"}\n variant=\"secondary\"\n label={loginLabel}\n />\n </a>\n )}\n <button\n className=\"navbar__mobile-trigger\"\n onClick={() => setMobileOpen((o) => !o)}\n aria-label={mobileOpen ? \"Close navigation menu\" : \"Open navigation menu\"}\n >\n {mobileOpen ? <XMarkIcon /> : <BarsIcon />}\n </button>\n </div>\n\n </div>\n\n {/* ── Mobile drawer ── */}\n {/* Clip container: prevents the drawer from showing above the bar\n during open/close animation */}\n <div className=\"navbar__drawer-clip\">\n <AnimatePresence>\n {mobileOpen && (\n <motion.div\n className=\"navbar__drawer\"\n variants={drawerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n exit=\"hidden\"\n transition={{ duration: 0.3, ease: EASE_OUT_EXPO }}\n aria-modal=\"true\"\n role=\"dialog\"\n aria-label=\"Navigation menu\"\n >\n {/* Drawer nav */}\n <nav className=\"navbar__drawer-nav\">\n {navItems.map((item) => {\n if (item.dropdown) {\n return (\n <DrawerAccordion\n key={item.label}\n item={item}\n isOpen={mobileExpanded === item.label}\n onToggle={() =>\n setMobileExpanded((prev) =>\n prev === item.label ? null : item.label\n )\n }\n />\n );\n }\n\n return (\n <a\n key={item.label}\n href={item.href}\n className=\"navbar__drawer-single\"\n target={item.external ? \"_blank\" : undefined}\n rel={item.external ? \"noopener noreferrer\" : undefined}\n >\n {item.label}\n {item.external && <ArrowUpRightIcon />}\n </a>\n );\n })}\n\n {/* Language — simple button (no dropdown items) */}\n {languageLabel && !hasLangDropdown && (\n <button className=\"navbar__drawer-lang\" onClick={onLanguageClick}>\n <GlobeIcon className=\"navbar__lang-globe\" />\n {languageLabel}\n </button>\n )}\n {/* Language — opens full-screen language panel */}\n {languageLabel && hasLangDropdown && (\n <button\n className=\"navbar__drawer-lang\"\n onClick={() => setMobileLangOpen(true)}\n >\n <GlobeIcon className=\"navbar__lang-globe\" />\n {languageLabel}\n </button>\n )}\n </nav>\n\n {/* Drawer footer CTAs — hidden when language panel is open */}\n {!mobileLangOpen && (\n <div className=\"navbar__drawer-footer\">\n {loginHref && (\n <a href={loginHref} style={{ display: \"block\" }}>\n <Button\n colorScheme=\"black\"\n variant=\"secondary\"\n label={loginLabel}\n fullWidth\n />\n </a>\n )}\n {ctaHref && (\n <a href={ctaHref} style={{ display: \"block\" }}>\n <Button\n colorScheme=\"coral\"\n variant=\"primary\"\n label={ctaLabel}\n fullWidth\n />\n </a>\n )}\n </div>\n )}\n\n {/* ── Mobile language full-screen panel ── */}\n <AnimatePresence>\n {hasLangDropdown && mobileLangOpen && (\n <motion.div\n className=\"navbar__drawer-lang-panel\"\n initial={{ y: \"100%\" }}\n animate={{ y: 0 }}\n exit={{ y: \"100%\" }}\n transition={{ duration: 0.25, ease: EASE_OUT_EXPO }}\n >\n <button\n className=\"navbar__drawer-lang-back\"\n onClick={() => setMobileLangOpen(false)}\n aria-label=\"Back to menu\"\n >\n <ChevronLeftIcon />\n </button>\n\n <div className=\"navbar__drawer-lang-grid\">\n {languageItems!.map((lang) => (\n <button\n key={lang.code}\n className={[\n \"navbar__drawer-lang-item\",\n lang.code === activeLanguageCode\n ? \"navbar__drawer-lang-item--active\"\n : \"\",\n ].filter(Boolean).join(\" \")}\n onClick={() => handleLangSelect(lang.code)}\n >\n {lang.label}\n </button>\n ))}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </nav>\n );\n};\n\nexport default Navbar;\n","/**\n * Resolves CSS custom properties for the desktop language dropdown grid.\n *\n * - Default (no `languageRows`): 3 columns, rows = ceil(n / 3).\n * - With `languageRows` ≥ 1: rows fixed, columns = ceil(n / languageRows).\n */\nexport function resolveLanguageGridVars(\n itemCount: number,\n languageRows?: number,\n): { \"--lang-rows\": number; \"--lang-cols\"?: number } {\n if (\n typeof languageRows === \"number\" &&\n Number.isFinite(languageRows) &&\n languageRows >= 1\n ) {\n const rows = Math.floor(languageRows);\n return {\n \"--lang-rows\": rows,\n \"--lang-cols\": Math.ceil(itemCount / rows),\n };\n }\n return { \"--lang-rows\": Math.ceil(itemCount / 3) };\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport {\n motion,\n useScroll,\n useSpring,\n useTransform,\n useMotionTemplate,\n} from \"framer-motion\";\nimport type { DayNightTransitionProps } from \"./DayNightTransition.types\";\nimport {\n webflowV2DayClipPercent,\n webflowV2DayWordOpacity,\n webflowV2DescriptionColor,\n webflowV2NightWordOpacity,\n webflowV2TitleColor,\n type WebflowDayNightV2Media,\n} from \"./webflowDayNightV2Ix\";\nimport \"./DayNightTransition.css\";\n\n/* ── Spring config (default preset only) ──────────────────────── */\nconst SPRING = { stiffness: 80, damping: 30, restDelta: 0.001 } as const;\n\nconst FADE_START = 0.35;\nconst FADE_END = 0.65;\n\n/** Webflow V2 desktop (>991px): dual headline/description crossfade on section `scrollYProgress`. */\nconst V2_TEXT_SCROLL_CROSSFADE_DESKTOP_START = 0.49;\nconst V2_TEXT_SCROLL_CROSSFADE_DESKTOP_END = 0.52;\n\n/** Webflow V2 mobile (≤991px): same crossfade, separate IX-aligned band. */\nconst V2_TEXT_SCROLL_CROSSFADE_MOBILE_START = 0.58;\nconst V2_TEXT_SCROLL_CROSSFADE_MOBILE_END = 0.61;\n\nconst TEXT_CHANNEL_DAY = 0;\nconst TEXT_CHANNEL_NIGHT = 255;\n\n/** Piecewise linear between (t0,v0) and (t1,v1); clamps outside [t0,t1]. */\nconst seg = (t: number, t0: number, t1: number, v0: number, v1: number) => {\n if (t <= t0) return v0;\n if (t >= t1) return v1;\n return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));\n};\n\n/* ── DayNightTransition ───────────────────────────────────────── */\n\nexport const DayNightTransition = ({\n dayImageUrl,\n nightImageUrl,\n dayHeadline = \"Medium length section title goes here\",\n nightHeadline = \"Medium length section title goes here\",\n dayDescription = \"Description goes here. Description goes here. Description goes here.\",\n nightDescription = \"Description goes here. Description goes here. Description goes here.\",\n ctaLabel = \"Get started\",\n ctaHref = \"#\",\n hideCta = false,\n headlineLevel = \"h2\",\n descriptionLevel = \"body-md\",\n inlineDayNightHeadline,\n scrollPreset = \"default\",\n className,\n ...props\n}: DayNightTransitionProps) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const dayWordRef = useRef<HTMLSpanElement>(null);\n\n const [nightMarginStart, setNightMarginStart] = useState(\"0px\");\n const [nightMarginEnd, setNightMarginEnd] = useState(\"0px\");\n\n const [ixMedia, setIxMedia] = useState<WebflowDayNightV2Media>(\"desktop\");\n\n const webflowV2 = scrollPreset === \"webflow-day-night-v2\";\n\n useEffect(() => {\n const mq = window.matchMedia(\"(max-width: 991px)\");\n const sync = () => setIxMedia(mq.matches ? \"mobile\" : \"desktop\");\n sync();\n mq.addEventListener(\"change\", sync);\n return () => mq.removeEventListener(\"change\", sync);\n }, []);\n\n const MotionHeadline = headlineLevel === \"h1\" ? motion.h1 : motion.h2;\n\n useLayoutEffect(() => {\n if (!inlineDayNightHeadline) return;\n\n const syncNightPull = () => {\n const dayEl = dayWordRef.current;\n if (!dayEl) return;\n const w = dayEl.offsetWidth;\n const doc = document.documentElement;\n const rtl =\n doc.getAttribute(\"dir\") === \"rtl\" ||\n doc.lang.toLowerCase().startsWith(\"ar\");\n if (rtl) {\n setNightMarginStart(\"0px\");\n setNightMarginEnd(w ? `-${w}px` : \"0px\");\n } else {\n setNightMarginStart(w ? `-${w}px` : \"0px\");\n setNightMarginEnd(\"0px\");\n }\n };\n\n syncNightPull();\n const ro = new ResizeObserver(syncNightPull);\n if (dayWordRef.current) ro.observe(dayWordRef.current);\n window.addEventListener(\"resize\", syncNightPull);\n return () => {\n ro.disconnect();\n window.removeEventListener(\"resize\", syncNightPull);\n };\n }, [\n inlineDayNightHeadline,\n inlineDayNightHeadline?.dayWord,\n inlineDayNightHeadline?.nightWord,\n inlineDayNightHeadline?.prefix,\n ]);\n\n const { scrollYProgress } = useScroll({\n target: wrapperRef,\n offset: [\"start end\", \"end start\"],\n });\n\n /* Webflow IX uses raw scroll progress (smoothing:50 is mild; spring would skew keyframes). */\n const smooth = useSpring(scrollYProgress, SPRING);\n const progress = webflowV2 ? scrollYProgress : smooth;\n\n const nightOpacity = useTransform(progress, [FADE_START, FADE_END], [0, 1]);\n const channel = useTransform(progress, [FADE_START, FADE_END], [TEXT_CHANNEL_DAY, TEXT_CHANNEL_NIGHT]);\n const textColor = useMotionTemplate`rgb(${channel}, ${channel}, ${channel})`;\n\n /**\n * Dual headline / description crossfade.\n * - Default: [FADE_START, FADE_END] with the night image opacity.\n * - Webflow V2: desktop vs mobile `scrollYProgress` bands (see `V2_TEXT_SCROLL_CROSSFADE_*`).\n */\n const dayOpacity = useTransform(progress, (t) => {\n if (webflowV2) {\n return ixMedia === \"mobile\"\n ? seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_START,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_END,\n 1,\n 0,\n )\n : seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_START,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_END,\n 1,\n 0,\n );\n }\n return seg(t, FADE_START, FADE_END, 1, 0);\n });\n const nightOpacity2 = useTransform(progress, (t) => {\n if (webflowV2) {\n return ixMedia === \"mobile\"\n ? seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_START,\n V2_TEXT_SCROLL_CROSSFADE_MOBILE_END,\n 0,\n 1,\n )\n : seg(\n t,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_START,\n V2_TEXT_SCROLL_CROSSFADE_DESKTOP_END,\n 0,\n 1,\n );\n }\n return seg(t, FADE_START, FADE_END, 0, 1);\n });\n\n const v2DescColor = useTransform(progress, (t) => webflowV2DescriptionColor(t, ixMedia));\n const v2TitleColor = useTransform(progress, (t) => webflowV2TitleColor(t, ixMedia));\n const v2DayWordOp = useTransform(progress, (t) => webflowV2DayWordOpacity(t, ixMedia));\n const v2NightWordOp = useTransform(progress, (t) => webflowV2NightWordOpacity(t, ixMedia));\n /**\n * IX mobile: `STYLE_SIZE` uses **%** on `.trade-day-night_background-day` (parent = 200vh wrapper).\n * Desktop: fixed `100vh` like `.is-alternative` in Webflow CSS.\n */\n const v2DayHeight = useTransform(progress, (t) =>\n ixMedia === \"mobile\"\n ? `${webflowV2DayClipPercent(t, ixMedia)}%`\n : \"100vh\",\n );\n\n const hasDescription = Boolean(dayDescription || nightDescription);\n\n const useInlineHeadline = Boolean(inlineDayNightHeadline);\n\n const rootClass = [\n \"dnt\",\n headlineLevel === \"h1\" && \"dnt--headline-h1\",\n descriptionLevel === \"body-lg\" && \"dnt--desc-body-lg\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={wrapperRef}\n className={rootClass}\n {...props}\n >\n {webflowV2 && (\n <div className=\"dnt__v2-background-wrapper\" aria-hidden=\"true\">\n {/*\n Webflow DOM order (both layers, both images):\n 1) trade-day-night_background-day\n 2) trade-day-night_background-night\n */}\n <motion.div\n className=\"dnt__v2-bg-day trade-day-night_background-day is-alternative\"\n style={{\n backgroundImage: `url(${dayImageUrl})`,\n height: v2DayHeight,\n }}\n />\n <div\n className=\"dnt__v2-bg-night trade-day-night_background-night is-alternative\"\n style={{ backgroundImage: `url(${nightImageUrl})` }}\n />\n </div>\n )}\n\n <div className={webflowV2 ? \"dnt__sticky dnt__sticky--webflow-v2\" : \"dnt__sticky\"}>\n\n {!webflowV2 && (\n <>\n <img\n className=\"dnt__bg dnt__bg--day\"\n src={dayImageUrl}\n alt=\"\"\n loading=\"eager\"\n draggable={false}\n />\n <motion.img\n className=\"dnt__bg dnt__bg--night\"\n src={nightImageUrl}\n alt=\"\"\n loading=\"eager\"\n draggable={false}\n style={{ opacity: nightOpacity }}\n />\n </>\n )}\n\n <div className=\"dnt__content\">\n <div className=\"dnt__inner\">\n {webflowV2 ? (\n <div className=\"dnt__text-wrap\">\n {useInlineHeadline && inlineDayNightHeadline ? (\n <MotionHeadline\n className=\"dnt__headline dnt__headline--inline-day-night\"\n style={{ color: v2TitleColor }}\n aria-label={`${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.dayWord} / ${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.nightWord}`}\n >\n <span className=\"dnt__headline-prefix\">\n {inlineDayNightHeadline.prefix}\n </span>\n <span className=\"dnt__headline-pair\">\n <motion.span\n ref={dayWordRef}\n className=\"dnt__headline-wday\"\n style={{ opacity: v2DayWordOp }}\n >\n {inlineDayNightHeadline.dayWord}\n </motion.span>\n <motion.span\n className=\"dnt__headline-wnight\"\n style={{\n opacity: v2NightWordOp,\n marginInlineStart: nightMarginStart,\n marginInlineEnd: nightMarginEnd,\n }}\n >\n {inlineDayNightHeadline.nightWord}\n </motion.span>\n </span>\n </MotionHeadline>\n ) : (\n <div className=\"dnt__crossfade-wrap\">\n <MotionHeadline\n className=\"dnt__headline\"\n style={{ color: v2TitleColor, opacity: dayOpacity }}\n >\n {dayHeadline}\n </MotionHeadline>\n <MotionHeadline\n className=\"dnt__headline\"\n aria-hidden=\"true\"\n style={{ color: v2TitleColor, opacity: nightOpacity2 }}\n >\n {nightHeadline}\n </MotionHeadline>\n </div>\n )}\n\n {hasDescription && (\n <div className=\"dnt__crossfade-wrap\">\n <motion.p\n className=\"dnt__description\"\n style={{\n color: v2DescColor,\n opacity: dayOpacity,\n }}\n >\n {dayDescription ?? \"\"}\n </motion.p>\n <motion.p\n className=\"dnt__description\"\n aria-hidden=\"true\"\n style={{\n color: v2DescColor,\n opacity: nightOpacity2,\n }}\n >\n {nightDescription ?? \"\"}\n </motion.p>\n </div>\n )}\n\n {!hideCta && (\n <a href={ctaHref} className=\"dnt__btn\">\n {ctaLabel}\n </a>\n )}\n </div>\n ) : (\n <motion.div\n className=\"dnt__text-wrap\"\n style={{ color: textColor }}\n >\n {useInlineHeadline && inlineDayNightHeadline ? (\n <MotionHeadline\n className=\"dnt__headline dnt__headline--inline-day-night\"\n aria-label={`${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.dayWord} / ${inlineDayNightHeadline.prefix}${inlineDayNightHeadline.nightWord}`}\n >\n <span className=\"dnt__headline-prefix\">\n {inlineDayNightHeadline.prefix}\n </span>\n <span className=\"dnt__headline-pair\">\n <motion.span\n ref={dayWordRef}\n className=\"dnt__headline-wday\"\n style={{ opacity: dayOpacity }}\n >\n {inlineDayNightHeadline.dayWord}\n </motion.span>\n <motion.span\n className=\"dnt__headline-wnight\"\n style={{\n opacity: nightOpacity2,\n marginInlineStart: nightMarginStart,\n marginInlineEnd: nightMarginEnd,\n }}\n >\n {inlineDayNightHeadline.nightWord}\n </motion.span>\n </span>\n </MotionHeadline>\n ) : (\n <div className=\"dnt__crossfade-wrap\">\n <MotionHeadline\n className=\"dnt__headline\"\n style={{ opacity: dayOpacity }}\n >\n {dayHeadline}\n </MotionHeadline>\n <MotionHeadline\n className=\"dnt__headline\"\n aria-hidden=\"true\"\n style={{ opacity: nightOpacity2 }}\n >\n {nightHeadline}\n </MotionHeadline>\n </div>\n )}\n\n {hasDescription && (\n <div className=\"dnt__crossfade-wrap\">\n <motion.p\n className=\"dnt__description\"\n style={{ opacity: dayOpacity }}\n >\n {dayDescription ?? \"\"}\n </motion.p>\n <motion.p\n className=\"dnt__description\"\n aria-hidden=\"true\"\n style={{ opacity: nightOpacity2 }}\n >\n {nightDescription ?? \"\"}\n </motion.p>\n </div>\n )}\n\n {!hideCta && (\n <a href={ctaHref} className=\"dnt__btn\">\n {ctaLabel}\n </a>\n )}\n </motion.div>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n};\n\nexport default DayNightTransition;\n","/**\n * Scroll mapping reverse-engineered from Webflow IX2 in\n * `DayNightTransitionV2/js/webflow.js` (actionLists `a` = mobile, `a-2` = desktop).\n * `t` is continuous scroll progress 0 → 1 on the 200vh driver (SCROLL_PROGRESS).\n */\n\nexport type WebflowDayNightV2Media = \"desktop\" | \"mobile\";\n\n/** Description swatch from IX (STYLE_TEXT_COLOR r/g/b). */\nconst DESC_SWATCH = { r: 24, g: 28, b: 37 } as const;\n\n/** Webflow `body { color: #333 }` before IX touches description (mobile). */\nconst BODY_TEXT = { r: 51, g: 51, b: 51 } as const;\n\nconst rgb = (r: number, g: number, b: number) => `rgb(${r},${g},${b})`;\n\nconst lerp = (a: number, b: number, u: number) => a + (b - a) * u;\n\n/** Piecewise linear between (t0,v0) and (t1,v1); clamps outside [t0,t1]. */\nconst seg = (t: number, t0: number, t1: number, v0: number, v1: number) => {\n if (t <= t0) return v0;\n if (t >= t1) return v1;\n return lerp(v0, v1, (t - t0) / (t1 - t0));\n};\n\nexport function webflowV2DescriptionColor(t: number, media: WebflowDayNightV2Media): string {\n if (media === \"desktop\") {\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n const dark = rgb(DESC_SWATCH.r, DESC_SWATCH.g, DESC_SWATCH.b);\n const white = rgb(255, 255, 255);\n /* IX kf 49 → swatch, kf 50 → white; before kf 49 inherits `body` #333. */\n if (t < 0.49) return body;\n if (t < 0.5) return dark;\n return white;\n }\n /* mobile: default body #333 until kf 58 → IX swatch, kf 59 → white. */\n const white = rgb(255, 255, 255);\n const dark = rgb(DESC_SWATCH.r, DESC_SWATCH.g, DESC_SWATCH.b);\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n if (t < 0.58) return body;\n if (t < 0.59) return dark;\n return white;\n}\n\n/** Title / prefix colour on `.trade-day-night_title.new-heading-style-h1`. */\nexport function webflowV2TitleColor(t: number, media: WebflowDayNightV2Media): string {\n if (media === \"desktop\") {\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n const black = rgb(0, 0, 0);\n const white = rgb(255, 255, 255);\n /* Title first touched at IX kf 51 (#000); before that inherits `body` #333. */\n if (t < 0.51) return body;\n if (t >= 0.52) return white;\n return seg(t, 0.51, 0.52, black, white);\n }\n const dark = rgb(DESC_SWATCH.r, DESC_SWATCH.g, DESC_SWATCH.b);\n const white = rgb(255, 255, 255);\n const body = rgb(BODY_TEXT.r, BODY_TEXT.g, BODY_TEXT.b);\n /* IX kf 60 → dark title, kf 61 → white; before IX, title inherits `body` #333. */\n if (t < 0.6) return body;\n if (t >= 0.61) return white;\n const u = (t - 0.6) / 0.01;\n return rgb(\n lerp(DESC_SWATCH.r, 255, u),\n lerp(DESC_SWATCH.g, 255, u),\n lerp(DESC_SWATCH.b, 255, u),\n );\n}\n\nexport function webflowV2DayWordOpacity(t: number, media: WebflowDayNightV2Media): number {\n if (media === \"desktop\") {\n if (t < 0.51) return 1;\n if (t >= 0.52) return 0;\n return seg(t, 0.51, 0.52, 1, 0);\n }\n if (t < 0.6) return 1;\n if (t >= 0.61) return 0;\n return seg(t, 0.6, 0.61, 1, 0);\n}\n\nexport function webflowV2NightWordOpacity(t: number, media: WebflowDayNightV2Media): number {\n if (media === \"desktop\") {\n if (t < 0.51) return 0;\n if (t >= 0.52) return 1;\n return seg(t, 0.51, 0.52, 0, 1);\n }\n if (t < 0.6) return 0;\n if (t >= 0.61) return 1;\n return seg(t, 0.6, 0.61, 0, 1);\n}\n\n/** Scroll progress (0–1 on the 200vh driver) where mobile day-layer height finishes (IX kf 65). */\nexport const WEBFLOW_V2_DAY_CLIP_SCROLL_END = 0.65;\n\n/**\n * Mobile only: IX2 `STYLE_SIZE` height **%** on `.trade-day-night_background-day.is-alternative`\n * from keyframe **0 → 65** (parent height = `.trade-day-night_background-wrapper` / 200vh track).\n * Returns **0–100** for use as `${value}%` in Framer.\n */\nexport function webflowV2DayClipPercent(t: number, media: WebflowDayNightV2Media): number {\n if (media === \"desktop\") return 100;\n return seg(t, 0, WEBFLOW_V2_DAY_CLIP_SCROLL_END, 100, 0);\n}\n","import type { DayNightTransitionProps } from \"./DayNightTransition.types\";\n\n/**\n * **DayNightTransitionV2** Storybook preset: same headlines, body copy, CTA, and\n * typography defaults (h2 + body-md) as the **Default** story; Webflow IX2 scroll\n * timing via `scrollPreset: \"webflow-day-night-v2\"` plus `dnt--layout-v2` /\n * `dnt--webflow-v2` for layout and backgrounds.\n */\nexport const dayNightTransitionV2Preset: Pick<\n DayNightTransitionProps,\n | \"className\"\n | \"dayImageUrl\"\n | \"nightImageUrl\"\n | \"dayHeadline\"\n | \"nightHeadline\"\n | \"dayDescription\"\n | \"nightDescription\"\n | \"ctaLabel\"\n | \"ctaHref\"\n | \"scrollPreset\"\n> = {\n className: \"dnt--layout-v2 dnt--webflow-v2\",\n scrollPreset: \"webflow-day-night-v2\",\n dayImageUrl:\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86cd8f_trade_day.webp\",\n nightImageUrl:\n \"https://cdn.prod.website-files.com/66585fe0e1dc7e70cc75d440/6757df573bf331c84b6c69fe_trade_night.webp\",\n dayHeadline: \"Section title light\\n\",\n nightHeadline: \"Section title dark\\n\",\n dayDescription:\n \"This section is designed to give your visitors a quick overview of why your solution is the right choice. Use this space to provide high-level context.\\n\",\n nightDescription:\n \"This section is designed to give your visitors a quick overview of why your solution is the right choice. Use this space to provide high-level context.\",\n ctaLabel: \"Open account\",\n ctaHref: \"#\",\n};\n","import { useRef } from \"react\";\nimport {\n motion,\n useScroll,\n useVelocity,\n useAnimationFrame,\n useMotionValue,\n} from \"framer-motion\";\nimport type { LogoMarqueeProps, LogoItem } from \"./LogoMarquee.types\";\nimport \"./LogoMarquee.css\";\n\n/* ── Modular wrap ─────────────────────────────────────────────────\n * Keeps `v` cycling within [min, max).\n * JS % operator returns negative results for negative numbers, so\n * we normalise with the double-mod pattern.\n *\n * Example (cycleH = 1500):\n * modWrap(-1500, 0, -1501) → -1\n * modWrap(-1500, 0, 1) → -1499 (seamless cross-boundary)\n */\nfunction modWrap(min: number, max: number, v: number): number {\n const range = max - min;\n return ((((v - min) % range) + range) % range) + min;\n}\n\n/* ── Speed constants ──────────────────────────────────────────────\n * VELOCITY_FACTOR scales raw scroll px/s → column marquee px/s.\n * MAX_SCROLL_V clamps very fast flicks so the marquee stays\n * readable instead of blurring past.\n * DEADZONE minimum scroll velocity (px/s) needed to move\n * the columns — prevents micro-drift from inertia.\n */\nconst VELOCITY_FACTOR = 0.4;\nconst MAX_SCROLL_V = 2500;\nconst DEADZONE = 2;\n\n/* ── Placeholder image ────────────────────────────────────────── */\n\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\n/* ── Logo data ────────────────────────────────────────────────── */\n\nexport const COL_ONE_LOGOS: LogoItem[] = [\n { name: \"Logo 1\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 2\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 3\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 4\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 5\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 6\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 7\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 8\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 9\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 10\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 11\", url: PLACEHOLDER_IMAGE },\n];\n\nexport const COL_TWO_LOGOS: LogoItem[] = [\n { name: \"Logo 1\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 2\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 3\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 4\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 5\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 6\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 7\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 8\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 9\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 10\", url: PLACEHOLDER_IMAGE },\n { name: \"Logo 11\", url: PLACEHOLDER_IMAGE },\n];\n\nexport const TEXT_CONTENT = {\n headline: \"Section title goes here\",\n body: \"Explain how this specific feature helps your user.\",\n disclaimer: \"*Add any relevant disclaimers or legal copy here.\",\n ctaLabel: \"Learn more\",\n ctaHref: \"#\",\n};\n\n/* ── LogoMarquee ──────────────────────────────────────────────── */\n\nexport const LogoMarquee = ({\n headline = TEXT_CONTENT.headline,\n body = TEXT_CONTENT.body,\n disclaimer = TEXT_CONTENT.disclaimer,\n ctaLabel = TEXT_CONTENT.ctaLabel,\n ctaHref = TEXT_CONTENT.ctaHref,\n col1Logos = COL_ONE_LOGOS,\n col2Logos = COL_TWO_LOGOS,\n className,\n ...props\n}: LogoMarqueeProps) => {\n /* ── Scroll velocity source ─────────────────────────────────────\n * useScroll() (no args) tracks the global window scroll.\n * useVelocity() derives the rate of change in px/s.\n * When the user isn't scrolling, velocity → 0 and the columns\n * freeze immediately — no spring lag, no easing drift.\n */\n const { scrollY } = useScroll();\n const scrollVelocity = useVelocity(scrollY);\n\n /* ── Column Y positions ─────────────────────────────────────────\n * useMotionValue gives Framer Motion a mutable number it can\n * directly wire to the DOM transform without React re-renders.\n */\n const col1Y = useMotionValue(0);\n const col2Y = useMotionValue(0);\n\n /* Refs to measure each column's rendered height so modWrap can\n * calculate the exact single-cycle length at runtime. */\n const col1Ref = useRef<HTMLDivElement>(null);\n const col2Ref = useRef<HTMLDivElement>(null);\n\n /* ── Per-frame marquee update ───────────────────────────────────\n * useAnimationFrame runs every rAF tick.\n * `delta` is ms since the previous frame (~16 at 60 fps).\n *\n * step = scrollVelocity (px/s) × VELOCITY_FACTOR × (delta / 1000s)\n *\n * Col 1 subtracts step → scrolls UP when scrolling down.\n * Col 2 adds step → scrolls DOWN when scrolling down.\n * Opposite on scroll-up — naturally reversed.\n *\n * modWrap(-cycleH, 0, newPos) keeps the position looping within\n * one cycle so the column never runs out of cards.\n */\n useAnimationFrame((_, delta) => {\n const raw = scrollVelocity.get();\n\n // Frozen while not scrolling\n if (Math.abs(raw) < DEADZONE) return;\n\n const clamped = Math.sign(raw) * Math.min(Math.abs(raw), MAX_SCROLL_V);\n const step = clamped * VELOCITY_FACTOR * (delta / 1000);\n\n // Single-cycle height = half of total track (2× duplication)\n const cycleH1 = (col1Ref.current?.offsetHeight ?? 2000) / 2;\n const cycleH2 = (col2Ref.current?.offsetHeight ?? 2000) / 2;\n\n col1Y.set(modWrap(-cycleH1, 0, col1Y.get() - step)); // UP\n col2Y.set(modWrap(-cycleH2, 0, col2Y.get() + step)); // DOWN (opposite)\n });\n\n /* 2× duplication creates a seamless loop:\n * offsetHeight / 2 = one cycle → wrapping at that boundary\n * always reveals identical content (the other copy). */\n const track1 = [...col1Logos, ...col1Logos];\n const track2 = [...col2Logos, ...col2Logos];\n\n return (\n <section\n className={[\"lm\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"lm__inner\">\n\n {/* ── Media — two opposing marquee columns ──────── */}\n <div className=\"lm__media\">\n <div className=\"lm__carousel\">\n\n {/* Top gradient fade */}\n <div className=\"lm__fade lm__fade--top\" aria-hidden=\"true\" />\n\n {/* Column 1 — scrolls UP when page scrolls DOWN */}\n <motion.div\n ref={col1Ref}\n className=\"lm__col\"\n style={{ y: col1Y }}\n >\n {track1.map((logo, i) => (\n <div key={`c1-${i}`} className=\"lm__card\">\n <div className=\"lm__card-img-wrap\">\n <img\n src={logo.url}\n alt={logo.name}\n loading=\"lazy\"\n draggable={false}\n />\n </div>\n </div>\n ))}\n </motion.div>\n\n {/* Column 2 — scrolls DOWN when page scrolls DOWN */}\n <motion.div\n ref={col2Ref}\n className=\"lm__col\"\n style={{ y: col2Y }}\n >\n {track2.map((logo, i) => (\n <div key={`c2-${i}`} className=\"lm__card\">\n <div className=\"lm__card-img-wrap\">\n <img\n src={logo.url}\n alt={logo.name}\n loading=\"lazy\"\n draggable={false}\n />\n </div>\n </div>\n ))}\n </motion.div>\n\n {/* Bottom gradient fade */}\n <div className=\"lm__fade lm__fade--bottom\" aria-hidden=\"true\" />\n\n </div>\n </div>\n\n {/* ── Text content ────────────────────────────── */}\n <div className=\"lm__content\">\n <h2 className=\"lm__headline\">{headline}</h2>\n\n <div className=\"lm__text-group\">\n <p className=\"lm__body\">{body}</p>\n <p className=\"lm__disclaimer\">{disclaimer}</p>\n </div>\n\n <a href={ctaHref} className=\"lm__link\">\n {ctaLabel}\n <span className=\"lm__link-icon\" aria-hidden=\"true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </span>\n </a>\n </div>\n\n </div>\n </section>\n );\n};\n\nexport default LogoMarquee;\n","import type { DownloadBadgeProps } from \"./DownloadBadge.types\";\nimport \"./DownloadBadge.css\";\n\n/* ── Light badge assets ─────────────────────────────────────── */\nimport googlePlayLight from \"../../assets/appstore-googleplay-light.svg\";\nimport appStoreLight from \"../../assets/appstore-appstore-light.svg\";\nimport appGalleryLight from \"../../assets/appstore-appgallery-light.svg\";\nimport windowsLight from \"../../assets/appstore-windows-light.svg\";\nimport macOSLight from \"../../assets/appstore-macos-light.svg\";\nimport linuxLight from \"../../assets/appstore-linux-light.svg\";\nimport browserLight from \"../../assets/appstore-browser-light.svg\";\n\n/* ── Dark badge assets ──────────────────────────────────────── */\nimport googlePlayDark from \"../../assets/appstore-googleplay-dark.svg\";\nimport appStoreDark from \"../../assets/appstore-appstore-dark.svg\";\nimport appGalleryDark from \"../../assets/appstore-appgallery-dark.svg\";\nimport windowsDark from \"../../assets/appstore-windows-dark.svg\";\nimport macOSDark from \"../../assets/appstore-macos-dark.svg\";\nimport linuxDark from \"../../assets/appstore-linux-dark.svg\";\nimport browserDark from \"../../assets/appstore-browser-dark.svg\";\n\n/* ── Asset map ──────────────────────────────────────────────── */\n\nconst BADGE_ASSETS = {\n light: {\n googleplay: { src: googlePlayLight, alt: \"Get it on Google Play\" },\n appstore: { src: appStoreLight, alt: \"Download on the App Store\" },\n appgallery: { src: appGalleryLight, alt: \"Explore it on AppGallery\" },\n windows: { src: windowsLight, alt: \"Download for Windows\" },\n macos: { src: macOSLight, alt: \"Download on the Mac App Store\" },\n linux: { src: linuxLight, alt: \"Installation on Linux\" },\n web: { src: browserLight, alt: \"Trade on Web browser\" },\n },\n dark: {\n googleplay: { src: googlePlayDark, alt: \"Get it on Google Play\" },\n appstore: { src: appStoreDark, alt: \"Download on the App Store\" },\n appgallery: { src: appGalleryDark, alt: \"Explore it on AppGallery\" },\n windows: { src: windowsDark, alt: \"Download for Windows\" },\n macos: { src: macOSDark, alt: \"Download on the Mac App Store\" },\n linux: { src: linuxDark, alt: \"Installation on Linux\" },\n web: { src: browserDark, alt: \"Trade on Web browser\" },\n },\n} as const;\n\n/* ── Component ──────────────────────────────────────────────── */\n\nexport const DownloadBadge = ({\n platform,\n colorScheme = \"light\",\n href,\n className,\n ...props\n}: DownloadBadgeProps) => {\n const { src, alt } = BADGE_ASSETS[colorScheme][platform];\n\n return (\n <a\n className={[\n \"download-badge\",\n `download-badge--${colorScheme}`,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n href={href ?? \"#\"}\n aria-label={alt}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...props}\n >\n <img className=\"download-badge__img\" src={src} alt={alt} />\n </a>\n );\n};\n","import type { StepsProps } from \"./Steps.types\";\nimport \"./Steps.css\";\n\nexport const Steps = ({\n title,\n steps,\n image,\n imageAlt = \"\",\n imagePosition = \"left\",\n embedded = false,\n titleId,\n}: StepsProps) => {\n const containerClass = [\n \"steps__container\",\n imagePosition === \"right\" ? \"steps__container--image-right\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n const wrapperClass = [\"steps\", embedded ? \"steps--embedded\" : \"\"].filter(Boolean).join(\" \");\n // Embedded usage (e.g. inside FeatureBlogPage's article body) drops the\n // standalone page-section shell, so it should not also introduce a\n // nested <section> landmark — a plain <div> keeps the surrounding\n // document outline flat, matching how sibling content blocks render.\n const Wrapper: \"section\" | \"div\" = embedded ? \"div\" : \"section\";\n\n return (\n <Wrapper className={wrapperClass}>\n <div className={containerClass}>\n {/* ── Image column ── */}\n {image && (\n <div className=\"steps__image-wrapper\">\n <img\n src={image}\n alt={imageAlt}\n className=\"steps__image\"\n />\n </div>\n )}\n\n {/* ── Content column ── */}\n <div className=\"steps__content\">\n <h2 className=\"steps__title\" id={titleId}>{title}</h2>\n\n <ol className=\"steps__list\">\n {steps.map((step, index) => (\n <li key={index} className=\"steps__item\">\n <div className=\"steps__item-inner\">\n <span className=\"steps__number\" aria-hidden=\"true\">\n {index + 1}\n </span>\n\n <div className=\"steps__item-body\">\n <h3 className=\"steps__item-title\">\n {step.title}\n </h3>\n <p className=\"steps__item-description\">\n {step.description}\n </p>\n </div>\n </div>\n </li>\n ))}\n </ol>\n </div>\n </div>\n </Wrapper>\n );\n};\n","import { DownloadBadge } from \"../../components/DownloadBadge\";\nimport type { DownloadBannerProps } from \"./DownloadBanner.types\";\nimport \"./DownloadBanner.css\";\n\nexport const DownloadBanner = ({\n style = \"light-2\",\n qrCodeImage,\n qrCodeAlt = \"QR code to download the app\",\n qrTitle = \"Scan to download\",\n qrSubtitle = \"Android & iOS\",\n mobileTitle = \"Available on\",\n showAppStore = true,\n showGooglePlay = true,\n showAppGallery = true,\n showWindows = true,\n showMacOS = true,\n showLinux = true,\n showWeb = true,\n appStoreHref,\n googlePlayHref,\n appGalleryHref,\n windowsHref,\n macOSHref,\n linuxHref,\n webHref,\n disclaimer,\n}: DownloadBannerProps) => {\n const colorScheme = style === \"dark\" ? \"dark\" : \"light\";\n\n return (\n <section className={`db-section db-section--${style}`}>\n <div className=\"db-container\">\n <div className=\"db-card\">\n {/* ── QR block (desktop) / heading (mobile) ── */}\n <div className=\"db-qr-block\">\n {qrCodeImage && (\n <img\n className=\"db-qr-image\"\n src={qrCodeImage}\n alt={qrCodeAlt}\n />\n )}\n <div className=\"db-qr-text\">\n {/* Desktop: two-line QR label */}\n <span className=\"db-qr-text__title db-qr-text__title--desktop\">\n {qrTitle}\n </span>\n <h2 className=\"db-qr-text__subtitle db-qr-text__subtitle--desktop\">\n {qrSubtitle}\n </h2>\n {/* Mobile: single heading */}\n <span className=\"db-qr-text__title db-qr-text__title--mobile\">\n {mobileTitle}\n </span>\n {disclaimer && (\n <span className=\"db-disclaimer\">{disclaimer}</span>\n )}\n </div>\n </div>\n\n {/* ── Badge grid ── */}\n <div className=\"db-badges\">\n {showGooglePlay && (\n <DownloadBadge platform=\"googleplay\" colorScheme={colorScheme} href={googlePlayHref} />\n )}\n {showAppGallery && (\n <DownloadBadge platform=\"appgallery\" colorScheme={colorScheme} href={appGalleryHref} />\n )}\n {showMacOS && (\n <DownloadBadge platform=\"macos\" colorScheme={colorScheme} href={macOSHref} />\n )}\n {showWindows && (\n <DownloadBadge platform=\"windows\" colorScheme={colorScheme} href={windowsHref} />\n )}\n {showLinux && (\n <DownloadBadge platform=\"linux\" colorScheme={colorScheme} href={linuxHref} />\n )}\n {showAppStore && (\n <DownloadBadge platform=\"appstore\" colorScheme={colorScheme} href={appStoreHref} />\n )}\n {showWeb && (\n <DownloadBadge platform=\"web\" colorScheme={colorScheme} href={webHref} />\n )}\n </div>\n </div>\n </div>\n </section>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { gsap } from \"gsap\";\nimport { ScrollTrigger } from \"gsap/ScrollTrigger\";\nimport type { TextScrollProps } from \"./TextScroll.types\";\nimport \"./TextScroll.css\";\n\ngsap.registerPlugin(ScrollTrigger);\n\nexport const TextScroll = ({ text, className }: TextScrollProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const wordsRef = useRef<HTMLSpanElement[]>([]);\n\n /* Split the text string into individual word <span> elements.\n We do this in render so SSR / hydration is consistent. */\n const words = text.split(/\\s+/).filter(Boolean);\n\n useEffect(() => {\n const section = sectionRef.current;\n const wordEls = wordsRef.current.filter(Boolean);\n if (!section || wordEls.length === 0) return;\n\n const isMobile = window.matchMedia(\"(max-width: 767px)\").matches;\n const startValue = isMobile ? \"top 35%\" : \"top center\";\n const endValue = isMobile ? \"bottom 90%\" : \"bottom center\";\n\n /* Defer setup by one frame so the first paint renders words at\n full opacity (no flash of invisible content). After the frame,\n dim them and attach ScrollTrigger. */\n const rafId = requestAnimationFrame(() => {\n gsap.set(wordEls, { opacity: 0.2 });\n\n const tl = gsap.timeline({\n scrollTrigger: {\n trigger: section,\n start: startValue,\n end: endValue,\n scrub: 2,\n },\n });\n\n tl.to(wordEls, {\n opacity: 1,\n stagger: 0.1,\n ease: \"none\",\n });\n\n /* Store cleanup on the section element so the return fn can reach it */\n (section as HTMLElement & { _tl?: gsap.core.Timeline })._tl = tl;\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n const tl = (section as HTMLElement & { _tl?: gsap.core.Timeline })._tl;\n if (tl) {\n tl.scrollTrigger?.kill();\n tl.kill();\n }\n gsap.set(wordEls, { clearProps: \"opacity\" });\n };\n }, [text]);\n\n return (\n <section\n ref={sectionRef}\n className={[\"ts\", className].filter(Boolean).join(\" \")}\n >\n <div className=\"ts__inner\">\n <p className=\"ts__text\" aria-label={text}>\n {words.map((word, i) => (\n <span\n key={i}\n ref={(el) => {\n if (el) wordsRef.current[i] = el;\n }}\n className=\"ts__word\"\n aria-hidden=\"true\"\n >\n {word}\n {i < words.length - 1 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n </section>\n );\n};\n\nexport default TextScroll;\n","import { useEffect, useRef } from \"react\";\nimport type { StickyMarketCardItem, StickyMarketCardsProps } from \"./StickyMarketCards.types\";\nimport \"./StickyMarketCards.css\";\n\n/* ── Shared design-system placeholder image ────────────────── */\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\nexport const StickyMarketCards = ({\n sectionTitle,\n sectionDescription,\n items,\n className,\n ...props\n}: StickyMarketCardsProps) => {\n /* outer sticky wrappers — used for measuring overlap */\n const cardRefs = useRef<(HTMLElement | null)[]>([]);\n /* inner card elements — receive transform + filter on scroll */\n const cardInnerRefs = useRef<(HTMLElement | null)[]>([]);\n\n /* ── Scroll-driven scale + brightness ─────── */\n /*\n * Transform is applied to the INNER card element (not the sticky wrapper)\n * so that the layout position of the sticky wrapper is unchanged while\n * the visual card scales and dims as the next card overlaps it.\n * Max scale-down: 5% (scale = 0.95)\n * Max brightness reduction: 40% (brightness = 0.6)\n */\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let rafId = 0;\n\n const update = () => {\n const wrappers = cardRefs.current.filter(Boolean) as HTMLElement[];\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n const n = wrappers.length;\n\n wrappers.forEach((wrapper, i) => {\n const inner = inners[i];\n if (!inner) return;\n\n /* Last card is always full scale + full brightness */\n if (i === n - 1) {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n return;\n }\n\n const nextWrapper = wrappers[i + 1];\n if (!nextWrapper) return;\n\n const currentRect = wrapper.getBoundingClientRect();\n const nextRect = nextWrapper.getBoundingClientRect();\n const overlap = currentRect.bottom - nextRect.top;\n\n if (overlap > 0) {\n const progress = Math.min(overlap / currentRect.height, 1);\n inner.style.transform = `scale(${(1 - progress * 0.05).toFixed(4)})`;\n inner.style.filter = `brightness(${(1 - progress * 0.4).toFixed(4)})`;\n } else {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n }\n });\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n update();\n\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n /* ── Sync card heights ────────────────────── */\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const syncHeights = () => {\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n if (!inners.length) return;\n\n /* 1. Clear explicit heights to get natural CSS height */\n inners.forEach((inner) => {\n inner.style.minHeight = \"\";\n });\n\n /* 2. Measure the tallest card */\n let maxH = 0;\n inners.forEach((inner) => {\n const h = inner.getBoundingClientRect().height;\n if (h > maxH) maxH = h;\n });\n\n /* 3. Apply max height to all cards */\n inners.forEach((inner) => {\n inner.style.minHeight = `${maxH}px`;\n });\n };\n\n /* Initial sync */\n syncHeights();\n\n /* Sync on resize */\n window.addEventListener(\"resize\", syncHeights);\n\n /* Sync after custom fonts load to prevent layout shift */\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(syncHeights);\n }\n\n return () => {\n window.removeEventListener(\"resize\", syncHeights);\n };\n }, [items.length]);\n\n const n = items.length;\n const maxStack = 4;\n const baseIndex = Math.max(0, n - maxStack);\n\n return (\n <section\n className={[\"smc\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"smc__inner\">\n <div className=\"smc__header-wrap\">\n <h2 className=\"smc__header\">{sectionTitle}</h2>\n {sectionDescription && (\n <p className=\"smc__description\">{sectionDescription}</p>\n )}\n </div>\n\n <div className=\"smc__track\">\n {items.map((item, i) => {\n const theme = item.theme ?? \"dark\";\n const offsetMultiplier = Math.max(0, i - baseIndex);\n\n return (\n <div\n key={i}\n ref={(el) => { cardRefs.current[i] = el; }}\n className=\"smc__card\"\n style={{\n [\"--smc-card-index\" as string]: String(offsetMultiplier),\n zIndex: i + 1,\n }}\n >\n <div\n ref={(el) => { cardInnerRefs.current[i] = el; }}\n className={[\n \"smc__card-inner\",\n `smc__card-inner--${theme}`,\n ].join(\" \")}\n >\n {/* Background image with semi-transparent overlay */}\n <div className=\"smc__card-bg\">\n <img\n src={item.imageUrl ?? PLACEHOLDER_IMAGE}\n alt=\"\"\n aria-hidden=\"true\"\n loading={i === 0 ? \"eager\" : \"lazy\"}\n />\n <div\n className={[\n \"smc__card-overlay\",\n `smc__card-overlay--${theme}`,\n ].join(\" \")}\n />\n </div>\n\n <div className=\"smc__card-content\">\n <div className=\"smc__card-title-wrap\">\n <h3 className=\"smc__card-title\">{item.title}</h3>\n </div>\n <div className=\"smc__card-desc-wrap\">\n <p className=\"smc__card-desc\">{item.description}</p>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </section>\n );\n};\n\nexport default StickyMarketCards;\n","import { useEffect, useRef, useState } from \"react\";\nimport { DotLottieInView, isLottieSrc } from \"../../components/DotLottieInView\";\nimport type {\n StickyMarketCardsLottieItem,\n StickyMarketCardsLottieProps,\n} from \"./StickyMarketCardsLottie.types\";\nimport \"./StickyMarketCardsLottie.css\";\n\nfunction safeHref(value?: string): string | null {\n if (!value) return null;\n if (value.startsWith(\"/\") && !value.startsWith(\"//\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction safeLottieSrc(value?: string): string | null {\n const href = safeHref(value);\n if (!href || !isLottieSrc(href)) return null;\n return href;\n}\n\nfunction PlaybackGlyph({ playing }: { playing: boolean }) {\n return (\n <svg className=\"smcl__control-icon\" viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n <circle className=\"smcl__control-disc\" cx=\"32\" cy=\"32\" r=\"32\" />\n {playing ? (\n <>\n <rect className=\"smcl__control-glyph\" x=\"23\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n <rect className=\"smcl__control-glyph\" x=\"35\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n </>\n ) : (\n <path\n className=\"smcl__control-glyph\"\n d=\"M26.5058 19.9527L42.7058 29.8527C43.4933 30.359 43.9996 31.259 43.9996 32.159C43.9996 33.1152 43.4933 34.0152 42.7058 34.4652L26.5058 44.3652C25.6621 44.8715 24.5933 44.9277 23.7496 44.4215C22.9058 43.9715 22.3996 43.0715 22.3996 42.059V22.259C22.3996 21.3027 22.9058 20.4027 23.7496 19.9527C24.5933 19.4465 25.6621 19.4465 26.5058 19.9527Z\"\n />\n )}\n </svg>\n );\n}\n\ninterface LottiePanelProps {\n item: StickyMarketCardsLottieItem;\n index: number;\n playing: boolean;\n onToggle: () => void;\n}\n\nfunction LottiePanel({ item, index, playing, onToggle }: LottiePanelProps) {\n const src = safeLottieSrc(item.lottieSrc);\n const posterSrc = safeHref(item.lottiePosterUrl);\n const controlId = `smcl-lottie-${index}-${item.title}`\n .replace(/[^a-zA-Z0-9_-]/g, \"-\")\n .slice(0, 80);\n\n return (\n <div className=\"smcl__lottie\">\n <div id={controlId} className=\"smcl__lottie-media\" aria-hidden=\"true\">\n {src ? (\n <DotLottieInView\n src={src}\n enabled={playing}\n loop\n className=\"smcl__lottie-player\"\n style={{ alignItems: \"stretch\", justifyContent: \"stretch\" }}\n poster={\n posterSrc ? (\n <img src={posterSrc} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n ) : undefined\n }\n />\n ) : null}\n </div>\n {posterSrc && !playing ? (\n <img\n className=\"smcl__lottie-poster\"\n src={posterSrc}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : null}\n {src ? (\n <button\n type=\"button\"\n className={`smcl__playback-toggle${playing ? \" smcl__playback-toggle--playing\" : \"\"}`}\n aria-controls={controlId}\n aria-pressed={playing}\n aria-label={`${playing ? \"Pause\" : \"Play\"} ${item.title} animation`}\n onClick={onToggle}\n >\n <PlaybackGlyph playing={playing} />\n </button>\n ) : null}\n </div>\n );\n}\n\nexport const StickyMarketCardsLottie = ({\n sectionTitle,\n sectionDescription,\n items,\n className,\n ...props\n}: StickyMarketCardsLottieProps) => {\n const cardRefs = useRef<(HTMLElement | null)[]>([]);\n const cardInnerRefs = useRef<(HTMLElement | null)[]>([]);\n const [playing, setPlaying] = useState<Record<number, boolean>>({});\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let rafId = 0;\n\n const update = () => {\n const wrappers = cardRefs.current.filter(Boolean) as HTMLElement[];\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n const n = wrappers.length;\n\n wrappers.forEach((wrapper, i) => {\n const inner = inners[i];\n if (!inner) return;\n\n if (i === n - 1) {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n return;\n }\n\n const nextWrapper = wrappers[i + 1];\n if (!nextWrapper) return;\n\n const currentRect = wrapper.getBoundingClientRect();\n const nextRect = nextWrapper.getBoundingClientRect();\n const overlap = currentRect.bottom - nextRect.top;\n\n if (overlap > 0) {\n const progress = Math.min(overlap / currentRect.height, 1);\n inner.style.transform = `scale(${(1 - progress * 0.05).toFixed(4)})`;\n inner.style.filter = `brightness(${(1 - progress * 0.4).toFixed(4)})`;\n } else {\n inner.style.transform = \"scale(1)\";\n inner.style.filter = \"brightness(1)\";\n }\n });\n };\n\n const onScroll = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(update);\n };\n\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n update();\n\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n cancelAnimationFrame(rafId);\n };\n }, [items.length]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const syncHeights = () => {\n const inners = cardInnerRefs.current.filter(Boolean) as HTMLElement[];\n if (!inners.length) return;\n\n inners.forEach((inner) => {\n inner.style.minHeight = \"\";\n });\n\n let maxH = 0;\n inners.forEach((inner) => {\n const h = inner.getBoundingClientRect().height;\n if (h > maxH) maxH = h;\n });\n\n inners.forEach((inner) => {\n inner.style.minHeight = `${maxH}px`;\n });\n };\n\n syncHeights();\n window.addEventListener(\"resize\", syncHeights);\n\n if (document.fonts && document.fonts.ready) {\n document.fonts.ready.then(syncHeights);\n }\n\n return () => {\n window.removeEventListener(\"resize\", syncHeights);\n };\n }, [items.length]);\n\n const n = items.length;\n const maxStack = 4;\n const baseIndex = Math.max(0, n - maxStack);\n\n return (\n <section\n className={[\"smcl\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"smcl__inner\">\n <div className=\"smcl__header-wrap\">\n <h2 className=\"smcl__header\">{sectionTitle}</h2>\n {sectionDescription && (\n <p className=\"smcl__description\">{sectionDescription}</p>\n )}\n </div>\n\n <div className=\"smcl__track\">\n {items.map((item, i) => {\n const theme = item.theme ?? \"dark\";\n const offsetMultiplier = Math.max(0, i - baseIndex);\n\n return (\n <div\n key={i}\n ref={(el) => {\n cardRefs.current[i] = el;\n }}\n className=\"smcl__card\"\n style={{\n [\"--smcl-card-index\" as string]: String(offsetMultiplier),\n zIndex: i + 1,\n }}\n >\n <div\n ref={(el) => {\n cardInnerRefs.current[i] = el;\n }}\n className={[\n \"smcl__card-inner\",\n `smcl__card-inner--${theme}`,\n ].join(\" \")}\n >\n <div className=\"smcl__card-content\">\n <LottiePanel\n item={item}\n index={i}\n playing={Boolean(playing[i])}\n onToggle={() =>\n setPlaying((prev) => ({\n ...prev,\n [i]: !prev[i],\n }))\n }\n />\n <div className=\"smcl__card-text\">\n <h3 className=\"smcl__card-title\">{item.title}</h3>\n <p className=\"smcl__card-desc\">{item.description}</p>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </section>\n );\n};\n\nexport default StickyMarketCardsLottie;\n","import { useState, useMemo } from \"react\";\nimport type { TableProps } from \"./Table.types\";\nimport { SearchField } from \"../../components/SearchField\";\nimport { Pagination } from \"../../components/Pagination\";\nimport \"./Table.css\";\n\nconst InfoIcon = ({ className }: { className?: string }) => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\" className={className}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 16V12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"8\" r=\"1\" fill=\"currentColor\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n);\n\nexport const Table = ({\n sectionTitle,\n columns,\n rows,\n mainColumnKey,\n pageSize = 10,\n searchPlaceholder = \"Search\",\n infoText,\n className,\n ...props\n}: TableProps) => {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n const [tooltip, setTooltip] = useState({ visible: false, heading: \"\", description: \"\", x: 0, y: 0, arrowOffset: 0 });\n\n const mainKey =\n mainColumnKey ??\n columns.find((c) => c.width === \"main\")?.key ??\n columns[0]?.key;\n\n /* ── Filter ── */\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return rows;\n return rows.filter((row) =>\n Object.values(row).some((v) => v.toLowerCase().includes(q))\n );\n }, [rows, search]);\n\n /* ── Pagination ── */\n const totalPages = Math.max(1, Math.ceil(filtered.length / pageSize));\n const currentPage = Math.min(page, totalPages);\n const startIdx = (currentPage - 1) * pageSize;\n const endIdx = Math.min(startIdx + pageSize, filtered.length);\n const visible = filtered.slice(startIdx, endIdx);\n\n const handleSearch = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n setPage(1);\n };\n\n const handleClear = () => {\n setSearch(\"\");\n setPage(1);\n };\n\n return (\n <section className={[\"tbl-section\", className].filter(Boolean).join(\" \")} {...props}>\n {sectionTitle && (\n <div className=\"tbl-section__header\">\n <h2 className=\"tbl-section__title\">{sectionTitle}</h2>\n </div>\n )}\n <div className=\"tbl-section__content\">\n <div className=\"tbl\">\n {/* ── Search + summary bar ── */}\n <div className=\"tbl__topbar\">\n <div className=\"tbl__search-wrap\">\n <SearchField\n placeholder={searchPlaceholder}\n value={search}\n onChange={handleSearch}\n onClear={handleClear}\n variant=\"fill\"\n aria-label={searchPlaceholder}\n />\n </div>\n <div className=\"tbl__summary\">\n {filtered.length > 0\n ? <>Showing {startIdx + 1}- {endIdx} of {filtered.length}</>\n : \"No results\"\n }\n </div>\n </div>\n\n {/* ── Scrollable table area ── */}\n <div className=\"tbl__scroll-wrapper\">\n <table className=\"tbl__table\">\n <thead>\n <tr className=\"tbl__tr\">\n {columns.map((col, colIdx) => {\n const isFirst = colIdx === 0;\n const isLast = colIdx === columns.length - 1;\n const isMain = col.width === \"main\" || col.key === mainKey;\n return (\n <th\n key={col.key}\n className={[\n \"tbl__th\",\n isMain ? \"tbl__th--main\" : \"\",\n col.width === \"big\" ? \"tbl__th--big\" : \"\",\n ].filter(Boolean).join(\" \")}\n >\n <div \n className=\"tbl__th-inner\"\n onMouseEnter={(e) => {\n if (!col.tooltip) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const targetX = rect.left + rect.width / 2;\n const targetY = rect.top;\n \n // Tooltip width is 13rem (208px). Half is 104px.\n const tooltipHalfWidth = 104;\n const margin = 16;\n \n // Clamp the tooltip box so it doesn't overflow screen edges\n const clampedX = Math.max(\n margin + tooltipHalfWidth,\n Math.min(window.innerWidth - margin - tooltipHalfWidth, targetX)\n );\n \n // Offset the arrow so it still points to the exact center of the header\n const arrowOffset = targetX - clampedX;\n\n setTooltip({\n visible: true,\n heading: col.tooltip.heading,\n description: col.tooltip.description,\n x: clampedX,\n y: targetY,\n arrowOffset\n });\n }}\n onMouseLeave={() => {\n if (col.tooltip) {\n setTooltip(prev => ({ ...prev, visible: false }));\n }\n }}\n >\n <span className={[\"tbl__col-label\", col.tooltip ? \"tbl__col-label--dashed\" : \"\"].filter(Boolean).join(\" \")}>\n {Array.isArray(col.header)\n ? col.header.map((line, li) => (\n <span key={li}>\n {line}\n {li < (col.header as string[]).length - 1 && <br />}\n </span>\n ))\n : col.header\n }\n </span>\n </div>\n </th>\n );\n })}\n </tr>\n </thead>\n\n <tbody className=\"tbl__tbody\">\n {visible.length > 0 ? (\n visible.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"tbl__tr\">\n {columns.map((col) => {\n const isMain = col.width === \"main\" || col.key === mainKey;\n const iconUrl = row[`${col.key}_iconUrl`];\n return (\n <td\n key={col.key}\n className={[\n \"tbl__td\",\n isMain ? \"tbl__td--main\" : \"\",\n col.width === \"big\" ? \"tbl__td--big\" : \"\",\n ].filter(Boolean).join(\" \")}\n >\n {isMain ? (\n <div className=\"tbl__cell-inner\">\n {iconUrl && (\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n className=\"tbl__cell-icon\"\n loading=\"lazy\"\n width=\"24\"\n height=\"24\"\n />\n )}\n <span className=\"tbl__cell-text tbl__cell-text--bold\">{row[col.key] ?? \"\"}</span>\n </div>\n ) : (\n <span className=\"tbl__cell-text\">{row[col.key] ?? \"\"}</span>\n )}\n </td>\n );\n })}\n </tr>\n ))\n ) : (\n <tr className=\"tbl__tr\">\n <td colSpan={columns.length} className=\"tbl__empty-cell\">\n No results found for \"{search}\"\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── Footer: Pagination ── */}\n {totalPages > 1 && (\n <div className=\"tbl__footer\">\n <div className=\"tbl__pagination-wrap\">\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={setPage}\n />\n </div>\n </div>\n )}\n </div>\n \n {/* ── Message Box (Out of table, bottom center) ── */}\n {infoText && (\n <div className=\"tbl-section__info-box\">\n <InfoIcon className=\"tbl-section__info-icon\" />\n <p className=\"tbl-section__info-text\">{infoText}</p>\n </div>\n )}\n </div>\n\n {/* ── Global Tooltip Portal ── */}\n <div \n className={[\"tbl__global-hint\", tooltip.visible ? \"tbl__global-hint--visible\" : \"\"].filter(Boolean).join(\" \")}\n style={{ left: tooltip.x, top: tooltip.y - 8 }}\n >\n <div className=\"tbl__global-hint-desc\">{tooltip.description}</div>\n <div \n className=\"tbl__global-hint-arrow\" \n style={{ transform: `translateX(calc(-50% + ${tooltip.arrowOffset}px))` }}\n />\n </div>\n </section>\n );\n};\n\nexport default Table;\n","import type { DynamicTableColumnDef, DynamicTableProps, DynamicTableRowData } from \"./DynamicTable.types\";\nimport \"./DynamicTable.css\";\n\nconst VARIANT_COLUMN_COUNT = {\n \"Three columns\": 3,\n \"Four columns\": 4,\n} as const;\n\nconst VARIANT_CLASS = {\n \"Three columns\": \"dtbl--three-columns\",\n \"Four columns\": \"dtbl--four-columns\",\n} as const;\n\nconst toLines = (value: string | string[] | undefined): string[] => {\n if (value == null) return [];\n const parts = Array.isArray(value) ? value : [value];\n return parts.flatMap((part) => part.split(\"\\n\")).filter((line) => line.length > 0);\n};\n\nconst renderLines = (value: string | string[] | undefined) => {\n const lines = toLines(value);\n if (lines.length === 0) return null;\n\n return lines.map((line, index) => (\n <span key={index} className=\"dtbl__cell-line\">\n {line}\n </span>\n ));\n};\n\nconst renderHeader = (col: DynamicTableColumnDef) => (\n <span className=\"dtbl__cell\">\n {renderLines(col.header)}\n </span>\n);\n\nconst renderCell = (row: DynamicTableRowData, col: DynamicTableColumnDef) => (\n <span className=\"dtbl__cell\">\n {renderLines(row[col.key])}\n </span>\n);\n\nexport const DynamicTable = ({\n sectionTitle,\n variant = \"Three columns\",\n columns,\n rows,\n className,\n ...props\n}: DynamicTableProps) => {\n const columnCount = VARIANT_COLUMN_COUNT[variant];\n const visibleColumns = columns.slice(0, columnCount);\n const labelColumn = visibleColumns[0];\n const valueColumns = visibleColumns.slice(1);\n\n return (\n <section\n className={[\"dtbl-section\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {sectionTitle && (\n <div className=\"dtbl-section__header\">\n <h2 className=\"dtbl-section__title\">{sectionTitle}</h2>\n </div>\n )}\n\n <div className=\"dtbl-section__content\">\n <div className={[\"dtbl\", VARIANT_CLASS[variant]].join(\" \")}>\n <div className=\"dtbl__scroll-wrapper\">\n <table className=\"dtbl__table\">\n <thead>\n <tr className=\"dtbl__tr\">\n {visibleColumns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n className=\"dtbl__th\"\n >\n {renderHeader(col)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"dtbl__tr\">\n {labelColumn && (\n <th scope=\"row\" className=\"dtbl__th-row\">\n {renderCell(row, labelColumn)}\n </th>\n )}\n {valueColumns.map((col) => (\n <td key={col.key} className=\"dtbl__td\">\n {renderCell(row, col)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default DynamicTable;\n","import { useState } from \"react\";\nimport { Link } from \"../../components/Link\";\nimport { Button } from \"../../components/Button\";\nimport type { PersonItem, AvatarGridProps } from \"./Leaders.types\";\nimport \"./Leaders.css\";\n\nconst ChevronDownIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst ChevronUpIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12 10L8 6L4 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/* ── Card content — shared between both grid sections ─────── */\nconst CardContent = ({ item }: { item: PersonItem }) => (\n <>\n <div className=\"avatar-grid__image-wrapper\">\n <img\n src={item.imageUrl}\n alt={item.name}\n className=\"avatar-grid__image\"\n loading=\"lazy\"\n />\n </div>\n <div className=\"avatar-grid__content\">\n <h3 className=\"avatar-grid__name\">{item.name}</h3>\n <p className=\"avatar-grid__role\">{item.role}</p>\n </div>\n {item.linkUrl && (\n <Link\n href={item.linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n icon={item.linkIcon}\n label={item.linkLabel ?? \"Profile\"}\n colorScheme=\"black\"\n showChevron={false}\n className=\"avatar-grid__link\"\n />\n )}\n </>\n);\n\nexport const AvatarGrid = ({\n title,\n description,\n items,\n initialVisibleCount = 4,\n expandText = \"View all\",\n collapseText = \"View less\",\n className,\n ...props\n}: AvatarGridProps) => {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const hasMore = items.length > initialVisibleCount;\n const visibleItems = items.slice(0, initialVisibleCount);\n const extraItems = items.slice(initialVisibleCount);\n\n return (\n <section className={[\"avatar-grid\", className].filter(Boolean).join(\" \")} {...props}>\n <div className=\"avatar-grid__container\">\n {(title || description) && (\n <div className=\"avatar-grid__header\">\n {title && <h2 className=\"avatar-grid__title\">{title}</h2>}\n {description && <p className=\"avatar-grid__description\">{description}</p>}\n </div>\n )}\n\n <div className=\"avatar-grid__grid-wrapper\">\n {/* ── Always-visible first N cards ── */}\n <div className=\"avatar-grid__grid\">\n {visibleItems.map((item, i) => (\n <div key={i} className=\"avatar-grid__card\">\n <CardContent item={item} />\n </div>\n ))}\n </div>\n\n {/* ── Animated extra cards ── */}\n {hasMore && (\n <div\n className={[\n \"avatar-grid__extra-cards\",\n isExpanded ? \"avatar-grid__extra-cards--open\" : \"\",\n ].join(\" \")}\n aria-hidden={!isExpanded}\n >\n <div className=\"avatar-grid__extra-grid\">\n {extraItems.map((item, i) => (\n <div\n key={i}\n className={[\n \"avatar-grid__card\",\n \"avatar-grid__extra-card\",\n isExpanded ? \"avatar-grid__extra-card--visible\" : \"\",\n ].join(\" \")}\n style={{\n transitionDelay: isExpanded\n ? `${i * 70 + 120}ms`\n : \"0ms\",\n }}\n >\n <CardContent item={item} />\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {hasMore && (\n <div className=\"avatar-grid__actions\">\n <Button\n variant=\"secondary\"\n colorScheme=\"black\"\n onClick={() => setIsExpanded(!isExpanded)}\n iconPosition=\"icon-right\"\n icon={isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n fullWidth\n >\n {isExpanded ? collapseText : expandText}\n </Button>\n </div>\n )}\n </div>\n </section>\n );\n};\n\n/** @deprecated Use AvatarGrid instead */\nexport const PeopleGrid = AvatarGrid;\n/** @deprecated Use AvatarGrid instead */\nexport const Leaders = AvatarGrid;\n\nexport default AvatarGrid;\n","import type { ImageBannerProps } from \"./ImageBanner.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./ImageBanner.css\";\n\nconst DEFAULT_CHIPS = [\n \"Dynamic ads\",\n \"AI insights\",\n \"Performance tracking\",\n \"Events\",\n];\n\n/** Reference collage for chips variants (1920×1440). Banner height follows this asset’s ratio. */\nexport const IMAGE_BANNER_CHIPS_DEFAULT_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69a13cf79748b347527dc74d_tier-cover.webp\";\n\n/** Checkmark glyph matching the partners_tag icon on deriv.com/partners. */\nconst ChipCheckIcon = () => (\n <svg\n className=\"image-banner__chip-icon\"\n width=\"11\"\n height=\"12\"\n viewBox=\"0 0 11 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M10.5156 5.98438C10.8203 6.26562 10.8203 6.75781 10.5156 7.03906L4.51562 13.0391C4.23438 13.3438 3.74219 13.3438 3.46094 13.0391L0.460938 10.0391C0.15625 9.75781 0.15625 9.26562 0.460938 8.98438C0.742188 8.67969 1.23438 8.67969 1.51562 8.98438L4 11.4453L9.46094 5.98438C9.74219 5.67969 10.2344 5.67969 10.5156 5.98438Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.88\"\n />\n </svg>\n);\n\nexport const ImageBanner = ({\n variant = \"split-left\",\n title = \"Join our global community\",\n description = \"Connect with traders around the world to exchange insights, explore portfolios, and gain valuable expertise.\",\n ctaLabel = \"Trader's Hub\",\n ctaHref,\n onCtaClick,\n chips = DEFAULT_CHIPS,\n imageUrl,\n imageAlt = \"\",\n className,\n ...props\n}: ImageBannerProps) => {\n const isFullBg = variant === \"full-bg-left\" || variant === \"full-bg-right\";\n const isChips = variant === \"chips-left\" || variant === \"chips-right\";\n const showCta = !isChips && Boolean(ctaLabel);\n const visibleChips = isChips ? chips.filter((label) => label.trim().length > 0) : [];\n const resolvedImageUrl =\n imageUrl ?? (isChips ? IMAGE_BANNER_CHIPS_DEFAULT_IMAGE : undefined);\n\n return (\n <section\n className={[\n \"image-banner\",\n isChips ? \"image-banner--chips\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n <div\n className={[\n \"image-banner__inner\",\n `image-banner__inner--${variant}`,\n ].join(\" \")}\n >\n {/* ── Full-bg: image as CSS background ── */}\n {isFullBg && resolvedImageUrl && (\n <div className=\"image-banner__bg-image-wrapper\">\n <img\n src={resolvedImageUrl}\n alt={imageAlt}\n className=\"image-banner__bg-image\"\n loading=\"lazy\"\n />\n <div className=\"image-banner__bg-overlay\" aria-hidden=\"true\" />\n </div>\n )}\n\n {/* ── Text + CTA / chips ── */}\n <div className=\"image-banner__content\">\n <h2 className=\"image-banner__title\">{title}</h2>\n\n {description && (\n <p className=\"image-banner__description\">{description}</p>\n )}\n\n {visibleChips.length > 0 && (\n <ul className=\"image-banner__chips\" aria-label=\"Features\">\n {visibleChips.map((label) => (\n <li key={label} className=\"image-banner__chip\">\n <ChipCheckIcon />\n <span className=\"image-banner__chip-label\">{label}</span>\n </li>\n ))}\n </ul>\n )}\n\n {showCta && (\n <div className=\"image-banner__actions\">\n <Link\n colorScheme=\"coral\"\n label={ctaLabel}\n href={ctaHref}\n onClick={onCtaClick}\n showChevron\n className=\"image-banner__cta-link\"\n />\n </div>\n )}\n </div>\n\n {/* ── Split / chips: image in side panel ── */}\n {!isFullBg && resolvedImageUrl && (\n <div className=\"image-banner__image-wrapper\">\n <img\n src={resolvedImageUrl}\n alt={imageAlt}\n className=\"image-banner__image\"\n loading=\"lazy\"\n />\n {isChips && (\n <div\n className=\"image-banner__image-fade\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default ImageBanner;\n","import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { TestimonialItem, TestimonialProps } from \"./Testimonial.types\";\nimport quoteLeft from \"../../assets/quote-left.webp\";\nimport quoteRight from \"../../assets/quote-right.webp\";\nimport trustpilotBadge from \"../../assets/trustpilot-rating-badge.png\";\nimport \"./Testimonial.css\";\n\n/* ── Star rating icon (Trustpilot variant) ────────────────────────\n * Renders a single \"star cell\" with a partial fill (0–1) so half-star\n * ratings (e.g. 4.5) render correctly. Geometry (flush square corners,\n * the asymmetric star-with-notch glyph) and colors are traced from\n * Trustpilot's own rating-widget SVGs (cdn.trustpilot.net/brand-assets),\n * not approximated — same source as the footer wordmark's star glyph.\n */\nconst StarCell = ({ fill }: { fill: number }) => {\n const clipId = useId();\n const clamped = Math.max(0, Math.min(1, fill));\n\n return (\n <svg\n className=\"testimonial__tp-star\"\n viewBox=\"0 0 96 96\"\n width=\"20\"\n height=\"20\"\n aria-hidden=\"true\"\n >\n <rect width=\"96\" height=\"96\" className=\"testimonial__tp-star-bg\" />\n <clipPath id={clipId}>\n <rect width={96 * clamped} height=\"96\" />\n </clipPath>\n <rect\n width=\"96\"\n height=\"96\"\n className=\"testimonial__tp-star-fill\"\n clipPath={`url(#${clipId})`}\n />\n <path\n d=\"M48,64.7L62.6,61l6.1,18.8L48,64.7z M81.6,40.4H55.9L48,16.2l-7.9,24.2H14.4l20.8,15l-7.9,24.2 l20.8-15l12.8-9.2L81.6,40.4L81.6,40.4L81.6,40.4L81.6,40.4z\"\n className=\"testimonial__tp-star-glyph\"\n />\n </svg>\n );\n};\n\n/* ── Star row — builds N star cells from a numeric rating (0–5) ── */\nconst StarRow = ({ rating, size = \"sm\" }: { rating: number; size?: \"sm\" | \"md\" | \"lg\" }) => {\n const stars = [0, 1, 2, 3, 4].map((i) => Math.max(0, Math.min(1, rating - i)));\n return (\n <span\n className={[\"testimonial__tp-stars\", `testimonial__tp-stars--${size}`].join(\" \")}\n role=\"img\"\n aria-label={`Rated ${rating} out of 5 stars`}\n >\n {stars.map((fill, i) => (\n <StarCell key={i} fill={fill} />\n ))}\n </span>\n );\n};\n\nconst ArrowIcon = ({ direction }: { direction: \"prev\" | \"next\" }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n {direction === \"prev\" ? (\n <path d=\"M10 3.5 5.5 8l4.5 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n ) : (\n <path d=\"M6 3.5 10.5 8 6 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n )}\n </svg>\n);\n\n/* ── Trustpilot variant ────────────────────────────────────────── */\n\nconst SCROLL_EPS = 4;\n\nfunction readScrollState(el: HTMLDivElement | null) {\n if (!el) return { canPrev: false, canNext: false };\n const { scrollLeft, scrollWidth, clientWidth } = el;\n const maxScroll = scrollWidth - clientWidth;\n return {\n canPrev: scrollLeft > SCROLL_EPS,\n canNext: scrollLeft < maxScroll - SCROLL_EPS,\n };\n}\n\nconst TrustpilotTestimonial = ({\n title,\n items,\n className,\n trustpilotUrl = \"https://www.trustpilot.com/review/deriv.com?utm_medium=trustbox&utm_source=Mini\",\n trustpilotScore = 4.5,\n ...props\n}: TestimonialProps) => {\n const trackRef = useRef<HTMLDivElement>(null);\n const [canPrev, setCanPrev] = useState(false);\n const [canNext, setCanNext] = useState(true);\n\n const syncScrollState = useCallback(() => {\n const next = readScrollState(trackRef.current);\n setCanPrev(next.canPrev);\n setCanNext(next.canNext);\n }, []);\n\n useEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n syncScrollState();\n const ro = new ResizeObserver(() => syncScrollState());\n ro.observe(el);\n return () => ro.disconnect();\n }, [syncScrollState]);\n\n const scrollByCard = (direction: -1 | 1) => {\n const el = trackRef.current;\n if (!el) return;\n const card = el.querySelector<HTMLElement>(\".testimonial__tp-card-wrap\");\n const gap = Number.parseFloat(getComputedStyle(el).columnGap || \"0\") || 0;\n const delta = card?.offsetWidth ?? el.clientWidth * 0.85;\n el.scrollBy({ left: direction * (delta + gap), behavior: \"smooth\" });\n window.requestAnimationFrame(() => window.setTimeout(syncScrollState, 320));\n };\n\n return (\n <section\n className={[\"testimonial\", \"testimonial--trustpilot\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n {/* Title sits in the normal padded/centered content column. */}\n <div className=\"testimonial__tp-head\">\n {title && (\n <h2 className=\"testimonial__title testimonial__title--trustpilot\">{title}</h2>\n )}\n </div>\n\n {/* Full-bleed row: spans the entire viewport (not the 1280px content\n * column) so scrolling reveals cards flush with — and past — the\n * browser edge, matching deriv.com's homepage carousel. The card\n * track (not this wrapper) carries the matching inline gutter, so\n * the resting position still lines up with the title/footer above\n * and below, but that gutter scrolls away with the content. */}\n <div className=\"testimonial__tp-bleed\">\n <div\n ref={trackRef}\n className=\"testimonial__tp-carousel\"\n tabIndex={0}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"Customer reviews on Trustpilot\"\n onScroll={syncScrollState}\n >\n <div className=\"testimonial__tp-track\">\n {items.map((item, i) => (\n <div key={i} className=\"testimonial__tp-card-wrap\">\n <a\n href={item.reviewUrl ?? trustpilotUrl}\n className=\"testimonial__tp-card\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <StarRow rating={item.rating ?? 5} size=\"sm\" />\n <p className=\"testimonial__tp-quote\">{item.quote}</p>\n <p className=\"testimonial__tp-author\">{item.authorName}</p>\n </a>\n </div>\n ))}\n </div>\n </div>\n </div>\n\n {/* Footer returns to the normal padded/centered content column. */}\n <div className=\"testimonial__tp-foot\">\n <div className=\"testimonial__tp-footer\">\n {/* This wrapper grows to fill the space next to the nav buttons\n * and centers the badge within it, so the badge sits centered\n * in the row rather than pinned to the far left — matching\n * deriv.com's homepage footer layout. */}\n <div className=\"testimonial__tp-trust\">\n <a\n href={trustpilotUrl}\n className=\"testimonial__tp-badge\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Deriv on Trustpilot — rated ${trustpilotScore} out of 5`}\n >\n <img\n src={trustpilotBadge}\n alt=\"\"\n className=\"testimonial__tp-badge-img\"\n />\n </a>\n </div>\n\n {/* Both buttons always mount in their fixed slots, so the\n * nav's footprint (and therefore the centered badge beside\n * it) never shifts as canPrev/canNext toggle while\n * scrolling. At either end, the inactive direction stays\n * visible but muted (native `disabled`, dimmed via CSS)\n * rather than hidden — showing both directions up front\n * makes it clear from the first render that this is a\n * carousel, instead of the \"next\" arrow appearing to come\n * from nowhere once the first one is scrolled away.\n * `disabled` already removes the button from the tab\n * order and blocks activation, so no extra tabIndex is\n * needed; leaving `aria-hidden` off keeps it announced to\n * assistive tech as present-but-unavailable rather than\n * disappearing from the accessibility tree. */}\n {items.length > 1 && (canPrev || canNext) && (\n <div className=\"testimonial__tp-nav\">\n <button\n type=\"button\"\n className=\"testimonial__tp-nav-btn\"\n aria-label=\"Show previous testimonials\"\n disabled={!canPrev}\n onClick={() => scrollByCard(-1)}\n >\n <ArrowIcon direction=\"prev\" />\n </button>\n <button\n type=\"button\"\n className=\"testimonial__tp-nav-btn\"\n aria-label=\"Show next testimonials\"\n disabled={!canNext}\n onClick={() => scrollByCard(1)}\n >\n <ArrowIcon direction=\"next\" />\n </button>\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\n/* ── Default variant ──────────────────────────────────────────────\n * Single-slide auto-advancing quote carousel with dot pagination.\n */\n\ntype Phase = \"idle\" | \"exiting\";\n\nconst DefaultTestimonial = ({\n title,\n items,\n className,\n ...props\n}: TestimonialProps) => {\n const [activeIndex, setActiveIndex] = useState(0);\n const [phase, setPhase] = useState<Phase>(\"idle\");\n const pendingIndex = useRef<number | null>(null);\n const autoRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const goTo = (next: number) => {\n if (next === activeIndex || phase !== \"idle\") return;\n pendingIndex.current = next;\n setPhase(\"exiting\");\n };\n\n /* After exit transition (200ms), switch to the new slide */\n useEffect(() => {\n if (phase === \"exiting\") {\n const t = setTimeout(() => {\n setActiveIndex(pendingIndex.current ?? activeIndex);\n setPhase(\"idle\");\n }, 200);\n return () => clearTimeout(t);\n }\n }, [phase, activeIndex]);\n\n /* Auto-advance every 5 s; resets on manual navigation */\n useEffect(() => {\n if (items.length <= 1) return;\n autoRef.current = setTimeout(() => {\n const next = (activeIndex + 1) % items.length;\n pendingIndex.current = next;\n setPhase(\"exiting\");\n }, 5000);\n return () => {\n if (autoRef.current) clearTimeout(autoRef.current);\n };\n }, [activeIndex, items.length]);\n\n return (\n <section\n className={[\"testimonial\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"testimonial__container\">\n {title && <h2 className=\"testimonial__title\">{title}</h2>}\n\n <div className=\"testimonial__carousel\">\n {/* ── All slides stacked — container height = tallest card ── */}\n <div className=\"testimonial__slides\">\n {items.map((item: TestimonialItem, i) => {\n const isActive = i === activeIndex;\n const isExiting = isActive && phase === \"exiting\";\n\n const slideClass = [\n \"testimonial__slide\",\n isActive && !isExiting ? \"testimonial__slide--active\" : \"\",\n isExiting ? \"testimonial__slide--exiting\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n key={i}\n className={slideClass}\n role=\"region\"\n aria-label={`Testimonial ${i + 1} of ${items.length}`}\n aria-hidden={!isActive}\n >\n <div className=\"testimonial__card\">\n {/* Opening quote mark */}\n <span className=\"testimonial__quotemark testimonial__quotemark--open\" aria-hidden=\"true\">\n <img src={quoteLeft} alt=\"\" className=\"testimonial__quotemark-img\" />\n </span>\n\n {/* Quote */}\n <p className=\"testimonial__quote\">{item.quote}</p>\n\n {/* Author */}\n <div className=\"testimonial__author\">\n {item.avatarUrl && (\n <img\n src={item.avatarUrl}\n alt={item.authorName}\n className=\"testimonial__author-avatar\"\n loading=\"lazy\"\n />\n )}\n <p className=\"testimonial__author-name\">\n {item.authorName}\n </p>\n {item.authorLocation && (\n <p className=\"testimonial__author-location\">\n {item.authorLocation}\n </p>\n )}\n </div>\n\n {/* Closing quote mark */}\n <span className=\"testimonial__quotemark testimonial__quotemark--close\" aria-hidden=\"true\">\n <img src={quoteRight} alt=\"\" className=\"testimonial__quotemark-img\" />\n </span>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* ── Dot pagination ── */}\n {items.length > 1 && (\n <div\n className=\"testimonial__dots\"\n role=\"tablist\"\n aria-label=\"Testimonial navigation\"\n >\n {items.map((_, i) => (\n <button\n key={i}\n role=\"tab\"\n aria-selected={i === activeIndex}\n aria-label={`Go to testimonial ${i + 1}`}\n className={[\n \"testimonial__dot\",\n i === activeIndex\n ? \"testimonial__dot--active\"\n : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => {\n if (autoRef.current) clearTimeout(autoRef.current);\n goTo(i);\n }}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\n/* ── Public component — dispatches to the selected variant ───────\n * Kept hook-free so switching `variant` never risks a rules-of-hooks\n * violation; each variant owns its own state/effects internally.\n */\nexport const Testimonial = (props: TestimonialProps) => {\n if (!props.items || props.items.length === 0) return null;\n\n if (props.variant === \"trustpilot\") {\n return <TrustpilotTestimonial {...props} />;\n }\n\n return <DefaultTestimonial {...props} />;\n};\n","import type { ArticleHeroProps, ArticleHeroArticle, ArticleHeroColumn } from \"./ArticleHero.types\";\nimport { Card } from \"../../components/Card\";\nimport { Tag } from \"../../components/Tag\";\nimport \"./ArticleHero.css\";\n\nconst ArticleCard = ({ article, showThumbnail = false }: { article: ArticleHeroArticle; showThumbnail?: boolean }) => (\n <div className=\"bh-listItem\">\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!showThumbnail || !article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n);\n\nconst ColumnSection = ({ column, showThumbnails = false }: { column: ArticleHeroColumn; showThumbnails?: boolean }) => (\n <div className=\"bh-column\">\n {column.label && (\n <div className=\"bh-columnHeader\">\n <span className=\"bh-columnLabel\">{column.label}</span>\n <span className=\"bh-columnLine\" />\n </div>\n )}\n <div className=\"bh-columnList\">\n {column.articles.map((article, i) => (\n <ArticleCard article={article} key={i} showThumbnail={showThumbnails} />\n ))}\n </div>\n </div>\n);\n\nexport const ArticleHero = ({\n featured,\n featuredFooter = [],\n leftColumn,\n rightColumn,\n className,\n}: ArticleHeroProps) => {\n return (\n <section className={[\"bh-root\", className ?? \"\"].filter(Boolean).join(\" \")}>\n {/* ── Desktop layout ────────────────────────────── */}\n <div className=\"bh-desktop\">\n <div className=\"bh-desktopHeader\">\n <div className=\"bh-headerLeft\">\n {leftColumn.label && (\n <div className=\"bh-columnHeader\">\n <span className=\"bh-columnLabel\">{leftColumn.label}</span>\n <span className=\"bh-columnLine\" />\n </div>\n )}\n </div>\n <div className=\"bh-headerRight\">\n {rightColumn.label && (\n <div className=\"bh-columnHeader\">\n <span className=\"bh-columnLabel\">{rightColumn.label}</span>\n <span className=\"bh-columnLine\" />\n </div>\n )}\n </div>\n </div>\n <div className=\"bh-desktopBody\">\n <div className=\"bh-sidebar bh-sidebarLeft\">\n <ColumnSection column={{ ...leftColumn, label: undefined }} showThumbnails />\n </div>\n <span className=\"bh-divider\" />\n <div className=\"bh-center\">\n <div className=\"bh-featured\">\n <div className=\"bh-featuredInfo\">\n <h2 className=\"bh-featuredTitle\">{featured.title}</h2>\n {featured.summary && <p className=\"bh-featuredSummary\">{featured.summary}</p>}\n {featured.tags && featured.tags.length > 0 && (\n <div className=\"bh-featuredTags\">\n {featured.tags.map((tag, i) => (\n <span className=\"bh-tagItem\" key={i}>\n {i > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n {featured.thumbnail && (\n <div className=\"bh-featuredImage\">\n <img alt={featured.thumbnailAlt ?? \"\"} className=\"bh-featuredImg\" src={featured.thumbnail} />\n </div>\n )}\n </div>\n {featuredFooter.length > 0 && (\n <div className=\"bh-featuredFooter\">\n {featuredFooter.map((article, i) => (\n <div className=\"bh-footerItem\" key={i}>\n {i > 0 && <span className=\"bh-footerDivider\" />}\n <div className=\"bh-footerContent\">\n <p className=\"bh-footerTitle\">{article.title}</p>\n {article.tags && article.tags.length > 0 && (\n <div className=\"bh-listItemTags\">\n {article.tags.map((tag, j) => (\n <span className=\"bh-tagItem\" key={j}>\n {j > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n <span className=\"bh-divider\" />\n <div className=\"bh-sidebar bh-sidebarRight\">\n <ColumnSection column={{ ...rightColumn, label: undefined }} />\n </div>\n </div>\n </div>\n\n {/* ── Mobile layout ─────────────────────────────── */}\n <div className=\"bh-mobile\">\n <div className=\"bh-mobileFeatured\">\n <span className=\"bh-mobileLabel\">{leftColumn.label ?? \"Trending stories\"}</span>\n <div className=\"bh-featuredInfo\">\n <h2 className=\"bh-featuredTitle\">{featured.title}</h2>\n {featured.summary && <p className=\"bh-featuredSummary\">{featured.summary}</p>}\n {featured.tags && featured.tags.length > 0 && (\n <div className=\"bh-featuredTags\">\n {featured.tags.map((tag, i) => (\n <span className=\"bh-tagItem\" key={i}>\n {i > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n {featured.thumbnail && (\n <div className=\"bh-mobileFeaturedImage\">\n <img alt={featured.thumbnailAlt ?? \"\"} className=\"bh-featuredImg\" src={featured.thumbnail} />\n </div>\n )}\n {featuredFooter.length > 0 && (\n <div className=\"bh-featuredFooter\">\n {featuredFooter.map((article, i) => (\n <div className=\"bh-footerItem\" key={i}>\n {i > 0 && <span className=\"bh-footerDivider\" />}\n <div className=\"bh-footerContent\">\n <p className=\"bh-footerTitle\">{article.title}</p>\n {article.tags && article.tags.length > 0 && (\n <div className=\"bh-listItemTags\">\n {article.tags.map((tag, j) => (\n <span className=\"bh-tagItem\" key={j}>\n {j > 0 && <span aria-hidden=\"true\" className=\"bh-tagDot\">·</span>}\n <Tag label={tag} size=\"md\" variant=\"custom\" />\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n <div className=\"bh-mobileSection\">\n <ColumnSection column={{ ...leftColumn, label: undefined }} showThumbnails />\n </div>\n <div className=\"bh-mobileSection\">\n <ColumnSection column={rightColumn} />\n </div>\n </div>\n </section>\n );\n};\n\nexport default ArticleHero;\n","import type { ArticleSectionProps } from \"./ArticleSection.types\";\nimport { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport \"./ArticleSection.css\";\n\nexport const ArticleSection = ({\n variant = \"featured\",\n sectionTitle,\n linkText = \"View all articles\",\n onLinkClick,\n featured,\n articles,\n className,\n}: ArticleSectionProps) => {\n const isShowcase = variant === \"showcase\";\n const isGrid = variant === \"grid\";\n const rootClass = [\"as-root\", isShowcase ? \"as-showcase\" : \"\", isGrid ? \"as-grid-variant\" : \"\", className ?? \"\"].filter(Boolean).join(\" \");\n\n const midpoint = Math.ceil(articles.length / 2);\n const col2 = articles.slice(0, midpoint);\n const col3 = articles.slice(midpoint);\n\n return (\n <section className={rootClass}>\n {/* ── Header ─────────────────────────────────────── */}\n <div className=\"as-header\">\n <h2 className=\"as-title\">{sectionTitle}</h2>\n {linkText && (\n <Link colorScheme=\"coral\" label={linkText} onClick={onLinkClick} />\n )}\n </div>\n\n {/* ── Desktop layout ──────────────────────────────── */}\n <div className=\"as-desktop\">\n {!isShowcase && !isGrid && featured && (\n <>\n <div className=\"as-featuredRow\">\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail={featured.thumbnail ?? \"\"}\n thumbnailAlt={featured.thumbnailAlt}\n hideThumbnail={!featured.thumbnail}\n title={featured.title}\n summary={featured.summary ?? \"\"}\n tags={(featured.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n <div className=\"as-grid\">\n {articles.map((article, i) => (\n <div className=\"as-gridItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n </>\n )}\n {isGrid && (\n <div className=\"as-grid\">\n {articles.map((article, i) => (\n <div className=\"as-gridItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary={article.summary ?? \"\"}\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n )}\n {isShowcase && (\n <div className=\"as-showcaseGrid\">\n <div className=\"as-showcaseFeatured\">\n {featured && (\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={featured.thumbnail ?? \"\"}\n thumbnailAlt={featured.thumbnailAlt}\n hideThumbnail={!featured.thumbnail}\n title={featured.title}\n summary={featured.summary ?? \"\"}\n tags={(featured.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n )}\n </div>\n <div className=\"as-showcaseCol\">\n {col2.map((article, i) => (\n <div className=\"as-showcaseItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal-reverse\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n <div className=\"as-showcaseCol\">\n {col3.map((article, i) => (\n <div className=\"as-showcaseItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"horizontal-reverse\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* ── Mobile layout ───────────────────────────────── */}\n <div className={isGrid ? \"as-mobile-grid\" : \"as-mobile\"}>\n {!isGrid && featured && (\n <div className=\"as-mobileFeatured\">\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={featured.thumbnail ?? \"\"}\n thumbnailAlt={featured.thumbnailAlt}\n hideThumbnail={!featured.thumbnail}\n title={featured.title}\n summary={featured.summary ?? \"\"}\n tags={(featured.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n )}\n {!isGrid && (\n <div className=\"as-mobileList\">\n {articles.map((article, i) => (\n <div className=\"as-mobileListItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout={isShowcase ? \"horizontal-reverse\" : \"horizontal\"}\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!isShowcase || !article.thumbnail}\n title={article.title}\n summary=\"\"\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n )}\n {isGrid && (\n <div className=\"as-mobileScroll\">\n {articles.map((article, i) => (\n <div className=\"as-mobileScrollItem\" key={i}>\n <Card\n variant=\"thumbnail\"\n type=\"article\"\n layout=\"vertical\"\n thumbnail={article.thumbnail ?? \"\"}\n thumbnailAlt={article.thumbnailAlt}\n hideThumbnail={!article.thumbnail}\n title={article.title}\n summary={article.summary ?? \"\"}\n tags={(article.tags ?? []).map((t) => ({ label: t }))}\n showCopyLink={false}\n hideAvatar\n />\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default ArticleSection;\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { CoralBannerProps, CoralBannerSlide } from \"./CoralBanner.types\";\nimport { Button } from \"../../components/Button\";\nimport \"./CoralBanner.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ── */\n\nconst DEFAULT_SLIDES: CoralBannerSlide[] = [\n {\n title: \"Section title goes here\",\n description: \"Explain how this specific feature helps your user.\",\n primaryButton: { label: \"Get started\", href: \"#\" },\n },\n];\n\n/**\n * Real deriv.com copy, exported for consumers who want to reproduce the\n * exact reference banner (deriv.com homepage / deriv.com/markets/forex footer promo).\n */\nexport const CORAL_BANNER_DERIV_SLIDES: CoralBannerSlide[] = [\n {\n id: \"ai-insights\",\n title: \"Analyse markets with AI-powered insights\",\n primaryButton: { label: \"Explore TradersView\", href: \"#\" },\n },\n {\n id: \"join-traders\",\n title: \"Join 3M+\\nglobal traders\",\n description:\n \"Open an account in minutes and start trading the world's markets — forex, stocks, indices, and more.\",\n primaryButton: { label: \"Trade now\", href: \"#\" },\n },\n];\n\n/* ── Arrow icons — exact paths from the reference slider ────────── */\n\nconst LeftArrowIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M3.31066 8.75001L9.03033 14.4697L7.96967 15.5303L0.439339 8.00001L7.96967 0.469676L9.03033 1.53034L3.31066 7.25001L15.5 7.25L15.5 8.75L3.31066 8.75001Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst RightArrowIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M12.6893 7.25L6.96967 1.53033L8.03033 0.469666L15.5607 8L8.03033 15.5303L6.96967 14.4697L12.6893 8.75H0.5V7.25H12.6893Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/* ── Helpers ──────────────────────────────────────────────────── */\n\n/** Splits on \"\\n\" so a title can force a manual line break (e.g. \"Join 3M+\\nglobal traders\") */\nconst renderTitleLines = (title: string) => {\n const lines = title.split(\"\\n\");\n return lines.map((line, i) => (\n <span key={i}>\n {line}\n {i < lines.length - 1 && <br />}\n </span>\n ));\n};\n\nconst ButtonBlock = ({\n primaryButton,\n secondaryButton,\n}: Pick<CoralBannerSlide, \"primaryButton\" | \"secondaryButton\">) => {\n if (!primaryButton && !secondaryButton) return null;\n return (\n <div className=\"crb__buttons\">\n {primaryButton &&\n (primaryButton.href ? (\n <a href={primaryButton.href}>\n <Button\n colorScheme=\"black\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"black\"\n variant=\"primary\"\n label={primaryButton.label}\n onClick={primaryButton.onClick}\n />\n ))}\n {secondaryButton &&\n (secondaryButton.href ? (\n <a href={secondaryButton.href}>\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n </a>\n ) : (\n <Button\n colorScheme=\"white\"\n variant=\"secondary\"\n label={secondaryButton.label}\n onClick={secondaryButton.onClick}\n />\n ))}\n </div>\n );\n};\n\nconst SlideContent = ({ slide }: { slide: CoralBannerSlide }) => (\n <div className=\"crb__grid\">\n <div className=\"crb__content\">\n <h3 className=\"crb__title\">{renderTitleLines(slide.title)}</h3>\n {slide.description && <p className=\"crb__description\">{slide.description}</p>}\n <ButtonBlock\n primaryButton={slide.primaryButton}\n secondaryButton={slide.secondaryButton}\n />\n </div>\n {/* Reserved right-hand column — matches the reference grid (2.15fr / 1fr); empty by default */}\n <div className=\"crb__spacer\" aria-hidden=\"true\" />\n </div>\n);\n\n/* ── CoralBanner ──────────────────────────────────────────────── */\n\nexport const CoralBanner = ({\n variant = \"static\",\n slides,\n autoplay = true,\n autoplayDelay = 2000,\n transitionDuration = 330,\n infinite = true,\n showArrows = true,\n showDots = true,\n className,\n ...props\n}: CoralBannerProps) => {\n const resolvedSlides = slides && slides.length > 0 ? slides : DEFAULT_SLIDES;\n const count = resolvedSlides.length;\n const isCarousel = variant === \"carousel\" && count > 1;\n\n const [activeIndex, setActiveIndex] = useState(0);\n const autoplayTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dragState = useRef<{ startX: number } | null>(null);\n\n const goTo = useCallback(\n (index: number) => {\n if (count <= 1) return;\n const next = infinite\n ? ((index % count) + count) % count\n : Math.max(0, Math.min(index, count - 1));\n setActiveIndex(next);\n },\n [count, infinite],\n );\n\n const goNext = useCallback(() => goTo(activeIndex + 1), [activeIndex, goTo]);\n const goPrev = useCallback(() => goTo(activeIndex - 1), [activeIndex, goTo]);\n\n const resetAutoplay = () => {\n if (autoplayTimer.current) clearTimeout(autoplayTimer.current);\n };\n\n /* Auto-advance — mirrors the reference `data-autoplay=\"true\" data-delay=\"2000\"`.\n * Resets on manual navigation (arrow / dot / swipe) via resetAutoplay(). */\n useEffect(() => {\n if (!isCarousel || !autoplay) return;\n autoplayTimer.current = setTimeout(() => {\n goTo(activeIndex + 1);\n }, autoplayDelay);\n return () => resetAutoplay();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isCarousel, autoplay, autoplayDelay, activeIndex]);\n\n /* Swipe — reference slider ships with `data-disable-swipe=\"false\"` */\n const handlePointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!isCarousel) return;\n dragState.current = { startX: e.clientX };\n };\n const handlePointerUp = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!isCarousel || !dragState.current) return;\n const delta = e.clientX - dragState.current.startX;\n dragState.current = null;\n const SWIPE_THRESHOLD = 40;\n if (delta > SWIPE_THRESHOLD) {\n resetAutoplay();\n goPrev();\n } else if (delta < -SWIPE_THRESHOLD) {\n resetAutoplay();\n goNext();\n }\n };\n\n const rootClass = [\n \"crb\",\n isCarousel ? \"crb--carousel\" : \"crb--static\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n /* ── Static ── */\n if (!isCarousel) {\n return (\n <section className={rootClass} {...props}>\n <div className=\"crb__inner\">\n <div className=\"crb__stage\">\n <SlideContent slide={resolvedSlides[0]} />\n </div>\n </div>\n </section>\n );\n }\n\n /* ── Carousel ──\n * `.crb__stage` carries the vertical padding and is the positioning\n * context for the dots/arrows (zero horizontal padding of its own —\n * `.crb__inner` owns that), so `left: 0` / `right: 0` line up exactly\n * with the text column edges, matching the reference banner. */\n return (\n <section className={rootClass} {...props}>\n <div className=\"crb__inner\">\n <div className=\"crb__stage\">\n <div\n className=\"crb__viewport\"\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n >\n <div\n className=\"crb__track\"\n style={{\n transform: `translateX(-${activeIndex * 100}%)`,\n transitionDuration: `${transitionDuration}ms`,\n }}\n >\n {resolvedSlides.map((slide, i) => (\n <div\n key={slide.id ?? i}\n className=\"crb__slide\"\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={`${i + 1} of ${count}`}\n aria-hidden={i !== activeIndex}\n >\n <SlideContent slide={slide} />\n </div>\n ))}\n </div>\n </div>\n\n {showDots && (\n <div className=\"crb__dots\" role=\"tablist\" aria-label=\"Banner slide navigation\">\n {resolvedSlides.map((_, i) => (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === activeIndex}\n aria-label={`Go to slide ${i + 1} of ${count}`}\n className={[\n \"crb__dot\",\n i === activeIndex ? \"crb__dot--active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => {\n resetAutoplay();\n goTo(i);\n }}\n />\n ))}\n </div>\n )}\n\n {showArrows && (\n <div className=\"crb__arrows\">\n <button\n type=\"button\"\n className=\"crb__arrow crb__arrow--prev\"\n aria-label=\"Previous slide\"\n onClick={() => {\n resetAutoplay();\n goPrev();\n }}\n >\n <LeftArrowIcon />\n </button>\n <button\n type=\"button\"\n className=\"crb__arrow crb__arrow--next\"\n aria-label=\"Next slide\"\n onClick={() => {\n resetAutoplay();\n goNext();\n }}\n >\n <RightArrowIcon />\n </button>\n </div>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default CoralBanner;\n","import type { CSSProperties } from \"react\";\nimport type { AwardItem, FeatureAwardsProps } from \"./FeatureAwards.types\";\nimport leafLeft from \"../../assets/award-leaf-left.png\";\nimport leafRight from \"../../assets/award-leaf-right.png\";\nimport \"./FeatureAwards.css\";\n\n/* ── Default copy ─────────────────────────────────────────────\n * Every string below is only a starting point — `title` and each\n * award's `title`/`subtitle` are plain props, so an AI agent or\n * developer can replace any of this copy without touching this\n * file. See `schema.ts` / `fingerprint.json` for the machine-\n * readable content contract consumed by AI editing tools.\n */\nexport const FEATURE_AWARDS_TEXT_CONTENT = {\n title: \"Our awards\",\n};\n\nexport const DEFAULT_AWARDS: AwardItem[] = [\n { title: \"Best Trade Execution Award (MEA)\", subtitle: \"Ultimate Fintech 2026\" },\n { title: \"Best Trading Experience - Global\", subtitle: \"UF Awards 2025\" },\n { title: \"Best CFD Broker - LATAM\", subtitle: \"UF Awards 2025\" },\n { title: \"Most Innovative Broker - MEA\", subtitle: \"UF Awards 2025\" },\n { title: \"Most Transparent Broker - Global\", subtitle: \"Global Forex Awards 2025\" },\n { title: \"Best Broker - Africa\", subtitle: \"Global Forex Awards 2025\" },\n { title: \"Best Trading Platform - MENA\", subtitle: \"Global Forex Awards 2025\" },\n { title: \"Most Innovative Online Trading Platform\", subtitle: \"Forex Expo Dubai 2025\" },\n { title: \"Chief Risk & Compliance Officer of the Year\", subtitle: \"Forex Expo Dubai 2025\" },\n { title: \"Best Broker - APAC\", subtitle: \"UF Awards 2025\" },\n { title: \"Best Trading Conditions - Global\", subtitle: \"Finance Magnates 2025\" },\n { title: \"Most Trusted Broker - Middle East\", subtitle: \"Finance Magnates 2025\" },\n { title: \"Affiliate Program of the Year\", subtitle: \"Forex Expo Dubai 2024\" },\n { title: \"Best Customer Service - Global\", subtitle: \"Global Forex Awards 2024\" },\n { title: \"Most Trusted Broker - Africa\", subtitle: \"Finance Magnates 2024\" },\n { title: \"Best LATAM Region Broker\", subtitle: \"ADVFN Awards 2024\" },\n { title: \"Broker of the Year - Global\", subtitle: \"Finance Magnates 2024\" },\n];\n\n/* ── Decorative laurel branch ─────────────────────────────────\n * Purely visual bracket flanking each award's text. Two distinct\n * source images (already mirror images of each other) are used\n * rather than a single icon flipped with CSS, matching the\n * hand-drawn leaf artwork provided for this component.\n */\nconst LaurelIcon = ({ side }: { side: \"left\" | \"right\" }) => (\n <img\n className={`fa__leaf fa__leaf--${side}`}\n src={side === \"left\" ? leafLeft : leafRight}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n draggable={false}\n />\n);\n\n/* ── Single award badge — icon / title+subtitle / icon ────────── */\nconst AwardBadge = ({ award }: { award: AwardItem }) => (\n <div className=\"fa__item\" role=\"listitem\">\n <LaurelIcon side=\"left\" />\n <div className=\"fa__item-text\">\n <p className=\"fa__item-title\">{award.title}</p>\n <p className=\"fa__item-subtitle\">{award.subtitle}</p>\n </div>\n <LaurelIcon side=\"right\" />\n </div>\n);\n\n/* ── FeatureAwards ─────────────────────────────────────────────\n * Single variant. Desktop/tablet (≥768px): a centered, wrapping\n * row of award badges — the final, partially-filled row stays\n * centered rather than left-aligned.\n *\n * Mobile (<768px): the same badges laid out in a single horizontal\n * row that always auto-scrolls continuously (seamless CSS-looped\n * marquee — no on/off variant). The list is duplicated once so the\n * loop never shows a seam; the duplicate copy is `aria-hidden` so\n * screen readers only announce each award once. Hovering/focusing\n * pauses the scroll, and `prefers-reduced-motion` disables the\n * animation in favor of a manually swipeable strip.\n *\n * `autoScrollDuration` is exposed so the loop speed can be tuned\n * later without touching the component.\n */\nexport const FeatureAwards = ({\n title = FEATURE_AWARDS_TEXT_CONTENT.title,\n awards = DEFAULT_AWARDS,\n autoScrollDuration = 32,\n className,\n ...props\n}: FeatureAwardsProps) => {\n if (!awards || awards.length === 0) return null;\n\n const trackStyle = {\n \"--fa-duration\": `${autoScrollDuration}s`,\n } as CSSProperties;\n\n return (\n <section\n className={[\"fa\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"fa__inner\">\n {title && <h2 className=\"fa__title\">{title}</h2>}\n\n {/* ── Tablet / desktop — centered wrapping grid ── */}\n <div className=\"fa__grid\" role=\"list\">\n {awards.map((award, i) => (\n <AwardBadge key={`g-${i}`} award={award} />\n ))}\n </div>\n\n {/* ── Mobile — horizontal auto-scroll marquee ── */}\n <div className=\"fa__scroller\">\n <div className=\"fa__track fa__track--auto\" style={trackStyle}>\n <div className=\"fa__track-group\" role=\"list\">\n {awards.map((award, i) => (\n <AwardBadge key={`m-${i}`} award={award} />\n ))}\n </div>\n\n {/* Duplicate copy powers the seamless loop; hidden from AT */}\n <div\n className=\"fa__track-group\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\n {awards.map((award, i) => (\n <AwardBadge key={`m-dup-${i}`} award={award} />\n ))}\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureAwards;\n","import type { FeatureBlogPost, FeatureBlogProps } from \"./FeatureBlog.types\";\nimport { Card } from \"../../components/Card\";\nimport { Link } from \"../../components/Link\";\nimport \"./FeatureBlog.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\n/* ── Default copy ─────────────────────────────────────────────\n * Starting-point content only — every string is a plain prop, so\n * an AI agent or developer can fully replace it. See `schema.ts` /\n * `fingerprint.json` for the machine-readable content contract.\n */\nexport const FEATURE_BLOG_TEXT_CONTENT = {\n title: \"Deriv press releases\",\n linkText: \"See all press releases\",\n};\n\n/* ── Single post card ──────────────────────────────────────────\n * Built on top of the shared `Card` (variant=\"thumbnail\", type=\n * \"article\", layout=\"vertical\") — image on top, title + summary\n * below, date/category tags in the meta row. Wrapped in an anchor\n * when `href` is supplied so the whole card is clickable.\n */\nconst PostCard = ({ post, index }: { post: FeatureBlogPost; index: number }) => {\n const tags = [post.date, post.category]\n .filter((value): value is string => Boolean(value))\n .map((label) => ({ label }));\n\n const card = (\n <Card\n hideAvatar\n layout=\"vertical\"\n showCopyLink={false}\n summary={post.summary}\n tags={tags}\n thumbnail={post.thumbnail}\n thumbnailAlt={post.thumbnailAlt}\n title={post.title}\n type=\"article\"\n variant=\"thumbnail\"\n />\n );\n\n if (post.href) {\n return (\n <a\n className=\"fb-cardLink\"\n href={post.href}\n key={`${post.title}-${index}`}\n rel={externalLinkRel(post.href)}\n >\n {card}\n </a>\n );\n }\n\n if (post.onClick) {\n return (\n <button\n className=\"fb-cardLink fb-cardButton\"\n key={`${post.title}-${index}`}\n onClick={post.onClick}\n type=\"button\"\n >\n {card}\n </button>\n );\n }\n\n return <div key={`${post.title}-${index}`}>{card}</div>;\n};\n\n/* ── FeatureBlog ───────────────────────────────────────────────\n * Centred H2 heading above a responsive grid of press-release /\n * blog-post cards (1 column mobile, 2 tablet, 3 desktop), with an\n * optional centred \"See all\" link below the grid.\n *\n * Modeled after the \"Deriv press releases\" section on\n * deriv.com/newsroom.\n */\nexport const FeatureBlog = ({\n title = FEATURE_BLOG_TEXT_CONTENT.title,\n posts,\n showLink = true,\n linkText = FEATURE_BLOG_TEXT_CONTENT.linkText,\n linkHref,\n onLinkClick,\n className,\n ...props\n}: FeatureBlogProps) => {\n if (!posts || posts.length === 0) return null;\n\n return (\n <section className={[\"fb-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"fb-container\">\n {title && <h2 className=\"fb-title\">{title}</h2>}\n\n <div className=\"fb-grid\">\n {posts.map((post, index) => (\n <PostCard index={index} key={`${post.title}-${index}`} post={post} />\n ))}\n </div>\n\n {showLink && (\n <div className=\"fb-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={linkHref}\n label={linkText}\n rel={externalLinkRel(linkHref)}\n onClick={onLinkClick}\n />\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default FeatureBlog;\n","import { useMemo, useState, type ChangeEvent } from \"react\";\nimport type { FeatureBlogCategoryPost, FeatureBlogCategoriesProps } from \"./FeatureBlogCategories.types\";\nimport { Card } from \"../../components/Card\";\nimport { SearchField } from \"../../components/SearchField\";\nimport { Tabs } from \"../../components/Tabs\";\nimport \"./FeatureBlogCategories.css\";\n\nconst isExternalUrl = (href: string | undefined) => Boolean(href && /^https?:\\/\\//i.test(href));\n\n/* ── Default copy ─────────────────────────────────────────────\n * Starting-point content only — every string is a plain prop, so\n * an AI agent, CMS, or developer can fully replace it. See\n * `schema.ts` / `fingerprint.json` for the machine-readable\n * content contract.\n */\nexport const FEATURE_BLOG_CATEGORIES_TEXT_CONTENT = {\n title: \"Deriv press releases\",\n allCategoryId: \"all\",\n allCategoryLabel: \"View all\",\n searchPlaceholder: \"Search\",\n emptyStateText: \"Sorry, we couldn't find any results matching.\",\n};\n\n/* ── Single post card ──────────────────────────────────────────\n * Built on top of the shared `Card` (variant=\"thumbnail\", type=\n * \"article\", layout=\"vertical\"). Internal hrefs (relative paths)\n * navigate as a normal same-tab inner-page link; absolute\n * `http(s)://` hrefs are treated as external and always open in a\n * new tab.\n */\nconst PostCard = ({\n post,\n categoryLabel,\n}: {\n post: FeatureBlogCategoryPost;\n categoryLabel?: string;\n}) => {\n const tags = [post.date, categoryLabel]\n .filter((value): value is string => Boolean(value))\n .map((label) => ({ label }));\n\n const card = (\n <Card\n hideAvatar\n layout=\"vertical\"\n showCopyLink={false}\n summary={post.summary}\n tags={tags}\n thumbnail={post.thumbnail}\n thumbnailAlt={post.thumbnailAlt}\n title={post.title}\n type=\"article\"\n variant=\"thumbnail\"\n />\n );\n\n if (post.href) {\n const external = isExternalUrl(post.href);\n return (\n <a\n className=\"fbc-cardLink\"\n href={post.href}\n rel={external ? \"noopener noreferrer\" : undefined}\n target={external ? \"_blank\" : undefined}\n >\n {card}\n </a>\n );\n }\n\n if (post.onClick) {\n return (\n <button className=\"fbc-cardLink fbc-cardButton\" onClick={post.onClick} type=\"button\">\n {card}\n </button>\n );\n }\n\n return <div>{card}</div>;\n};\n\n/* ── FeatureBlogCategories ────────────────────────────────────\n * Centred H2 heading, a search field, and a row of category tabs\n * above a responsive grid of post cards (1 column mobile, 2\n * tablet, 3 desktop). Tabs and posts are CMS-managed data — the\n * \"all\" tab is always prepended automatically. Filtering by tab\n * and search query happens client-side.\n *\n * Modeled after deriv.com/newsroom/press-releases and\n * deriv.com/newsroom/deriv-in-the-news.\n */\nexport const FeatureBlogCategories = ({\n title = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.title,\n categories,\n allCategoryId = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.allCategoryId,\n allCategoryLabel = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.allCategoryLabel,\n activeCategoryId,\n defaultActiveCategoryId,\n onCategoryChange,\n posts,\n searchPlaceholder = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.searchPlaceholder,\n searchAriaLabel,\n onSearchChange,\n emptyStateText = FEATURE_BLOG_CATEGORIES_TEXT_CONTENT.emptyStateText,\n className,\n ...props\n}: FeatureBlogCategoriesProps) => {\n const [search, setSearch] = useState(\"\");\n const [internalActiveId, setInternalActiveId] = useState(defaultActiveCategoryId ?? allCategoryId);\n\n const isControlled = activeCategoryId !== undefined;\n const activeId = isControlled ? activeCategoryId : internalActiveId;\n\n const tabs = useMemo(\n () => [{ id: allCategoryId, label: allCategoryLabel }, ...categories],\n [allCategoryId, allCategoryLabel, categories],\n );\n\n const categoryLabelById = useMemo(() => {\n const map = new Map<string, string>();\n categories.forEach((category) => map.set(category.id, category.label));\n return map;\n }, [categories]);\n\n const filteredPosts = useMemo(() => {\n const query = search.trim().toLowerCase();\n return posts.filter((post) => {\n const matchesCategory = activeId === allCategoryId || post.category === activeId;\n if (!matchesCategory) return false;\n if (!query) return true;\n return (\n post.title.toLowerCase().includes(query) ||\n post.summary.toLowerCase().includes(query)\n );\n });\n }, [posts, activeId, allCategoryId, search]);\n\n const handleTabChange = (id: string) => {\n if (!isControlled) setInternalActiveId(id);\n onCategoryChange?.(id);\n };\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n onSearchChange?.(e.target.value);\n };\n\n const handleSearchClear = () => {\n setSearch(\"\");\n onSearchChange?.(\"\");\n };\n\n return (\n <section className={[\"fbc-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"fbc-container\">\n {title && <h2 className=\"fbc-title\">{title}</h2>}\n\n <div className=\"fbc-searchWrap\">\n <SearchField\n aria-label={searchAriaLabel ?? searchPlaceholder}\n onChange={handleSearchChange}\n onClear={handleSearchClear}\n placeholder={searchPlaceholder}\n value={search}\n variant=\"outline\"\n />\n </div>\n\n <div className=\"fbc-tabsWrap\">\n <Tabs activeId={activeId ?? allCategoryId} items={tabs} onChange={handleTabChange} />\n </div>\n\n {filteredPosts.length > 0 ? (\n <div className=\"fbc-grid\">\n {filteredPosts.map((post, index) => (\n <PostCard\n categoryLabel={post.categoryLabel ?? categoryLabelById.get(post.category)}\n key={`${post.title}-${index}`}\n post={post}\n />\n ))}\n </div>\n ) : (\n <p className=\"fbc-emptyState\">{emptyStateText}</p>\n )}\n </div>\n </section>\n );\n};\n\nexport default FeatureBlogCategories;\n","import type { HelpCentreCategoriesProps, HelpCentreCategoryItem } from \"./HelpCentreCategories.types\";\nimport \"./HelpCentreCategories.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst CategoryTileContent = ({ category }: { category: HelpCentreCategoryItem }) => (\n <>\n {category.icon && (\n <span className=\"hcc-tile-icon\">\n {typeof category.icon === \"string\" ? (\n <img\n alt={category.iconAlt ?? \"\"}\n className=\"hcc-tile-iconImage\"\n decoding=\"async\"\n height={48}\n loading=\"lazy\"\n src={category.icon}\n width={48}\n />\n ) : (\n category.icon\n )}\n </span>\n )}\n\n <span className=\"hcc-tile-title\">{category.title}</span>\n </>\n);\n\nconst CategoryTile = ({ category }: { category: HelpCentreCategoryItem }) => {\n if (category.href) {\n return (\n <a\n className=\"hcc-tile\"\n href={category.href}\n onClick={category.onClick}\n rel={externalLinkRel(category.href)}\n >\n <CategoryTileContent category={category} />\n </a>\n );\n }\n\n return (\n <button className=\"hcc-tile\" onClick={category.onClick} type=\"button\">\n <CategoryTileContent category={category} />\n </button>\n );\n};\n\n/**\n * Caps the grid at 3 columns (desktop). With fewer categories than that, the\n * grid uses exactly that many columns instead of stretching/leaving a sparse\n * trailing row — with 3 or more it always wraps to a 3-column desktop grid\n * (2-column tablet, 1-column mobile), no matter how many extra rows that adds.\n */\nconst getColumnCount = (categoryCount: number) => Math.max(1, Math.min(categoryCount, 3));\n\nexport const HelpCentreCategories = ({\n sectionTitle,\n sectionDescription,\n categories,\n}: HelpCentreCategoriesProps) => {\n const columnCount = getColumnCount(categories.length);\n\n return (\n <section className=\"hcc-section\">\n <div className=\"hcc-container\">\n {(sectionTitle || sectionDescription) && (\n <div className=\"hcc-header\">\n {sectionTitle && <h2 className=\"hcc-sectionTitle\">{sectionTitle}</h2>}\n\n {sectionDescription && (\n <p className=\"hcc-sectionDescription\">{sectionDescription}</p>\n )}\n </div>\n )}\n\n <div className={`hcc-grid hcc-grid--${columnCount}`} role=\"list\">\n {categories.map((category, index) => (\n <div className=\"hcc-gridItem\" key={category.id ?? `${category.title}-${index}`} role=\"listitem\">\n <CategoryTile category={category} />\n </div>\n ))}\n </div>\n </div>\n </section>\n );\n};\n","import { useMemo, useState, type ChangeEvent } from \"react\";\nimport type { HelpCentreSubCategoriesProps, HelpCentreSubCategoryItem } from \"./HelpCentreSubCategories.types\";\nimport { SearchField } from \"../../components/SearchField\";\nimport \"./HelpCentreSubCategories.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst QuestionCard = ({ item }: { item: HelpCentreSubCategoryItem }) => {\n if (item.href) {\n return (\n <a className=\"hcsc-card\" href={item.href} onClick={item.onClick} rel={externalLinkRel(item.href)}>\n <span className=\"hcsc-card-text\">{item.question}</span>\n </a>\n );\n }\n\n return (\n <button className=\"hcsc-card\" onClick={item.onClick} type=\"button\">\n <span className=\"hcsc-card-text\">{item.question}</span>\n </button>\n );\n};\n\nexport const HelpCentreSubCategories = ({\n title,\n searchPlaceholder = \"Search\",\n searchAriaLabel,\n items,\n noResultsText = 'No results found for \"{query}\"',\n onSearchChange,\n}: HelpCentreSubCategoriesProps) => {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return items;\n return items.filter((item) => item.question.toLowerCase().includes(q));\n }, [items, search]);\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n onSearchChange?.(e.target.value);\n };\n\n const handleClear = () => {\n setSearch(\"\");\n onSearchChange?.(\"\");\n };\n\n return (\n <section className=\"hcsc-section\">\n <div className=\"hcsc-container\">\n <h1 className=\"hcsc-title\">{title}</h1>\n\n <div className=\"hcsc-searchWrap\">\n <SearchField\n aria-label={searchAriaLabel ?? searchPlaceholder}\n onChange={handleSearchChange}\n onClear={handleClear}\n placeholder={searchPlaceholder}\n value={search}\n variant=\"outline\"\n />\n </div>\n\n {filtered.length > 0 ? (\n <div className=\"hcsc-grid\" role=\"list\">\n {filtered.map((item, index) => (\n <div className=\"hcsc-gridItem\" key={item.id ?? `${item.question}-${index}`} role=\"listitem\">\n <QuestionCard item={item} />\n </div>\n ))}\n </div>\n ) : (\n <p className=\"hcsc-noResults\">{noResultsText.replace(\"{query}\", search)}</p>\n )}\n </div>\n </section>\n );\n};\n\nexport default HelpCentreSubCategories;\n","import { useMemo, useState, type ChangeEvent } from \"react\";\nimport type { HelpCenterContentBlock, HelpCenterPageProps, HelpCenterQuestionItem } from \"./HelpCenterPage.types\";\nimport { SearchField } from \"../../components/SearchField\";\nimport { BottomSheet } from \"../../components/BottomSheet\";\nimport \"./HelpCenterPage.css\";\n\nconst externalLinkRel = (href: string | undefined) =>\n href && /^https?:\\/\\//i.test(href) ? \"noopener noreferrer\" : undefined;\n\nconst ChevronDownIcon = () => (\n <svg aria-hidden=\"true\" fill=\"none\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.5\" />\n </svg>\n);\n\nconst renderBlock = (block: HelpCenterContentBlock, index: number) => {\n if (block.type === \"heading\") {\n const HeadingTag = block.level === 3 ? \"h3\" : \"h2\";\n return (\n <HeadingTag className=\"hcp-blockHeading\" key={index}>\n {block.text}\n </HeadingTag>\n );\n }\n\n if (block.type === \"list\") {\n const ListTag = block.ordered ? \"ol\" : \"ul\";\n return (\n <ListTag className=\"hcp-blockList\" key={index}>\n {(block.items ?? []).map((item, i) => (\n <li className=\"hcp-blockListItem\" key={i}>\n {item}\n </li>\n ))}\n </ListTag>\n );\n }\n\n return (\n <p className=\"hcp-blockParagraph\" key={index}>\n {block.text}\n </p>\n );\n};\n\nconst QuestionRow = ({\n item,\n isActive,\n onSelect,\n}: {\n item: HelpCenterQuestionItem;\n isActive: boolean;\n onSelect: (item: HelpCenterQuestionItem) => void;\n}) => {\n const rowClass = [\"hcp-row\", isActive ? \"hcp-row--active\" : \"\"].filter(Boolean).join(\" \");\n\n if (item.href) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n className={rowClass}\n href={item.href}\n onClick={() => {\n item.onClick?.();\n onSelect(item);\n }}\n rel={externalLinkRel(item.href)}\n >\n <span className=\"hcp-rowText\">{item.question}</span>\n </a>\n );\n }\n\n return (\n <button\n aria-current={isActive ? \"page\" : undefined}\n className={rowClass}\n onClick={() => {\n item.onClick?.();\n onSelect(item);\n }}\n type=\"button\"\n >\n <span className=\"hcp-rowText\">{item.question}</span>\n </button>\n );\n};\n\nexport const HelpCenterPage = ({\n categoryTitle,\n questions,\n activeQuestionId,\n defaultActiveQuestionId,\n onQuestionSelect,\n contentTitle,\n content,\n searchPlaceholder = \"Search\",\n searchAriaLabel,\n onSearchChange,\n searchNoResultsText = 'No results found for \"{query}\"',\n articlesSheetTitle = \"Articles in this section\",\n className,\n}: HelpCenterPageProps) => {\n const [search, setSearch] = useState(\"\");\n const [internalActiveId, setInternalActiveId] = useState(defaultActiveQuestionId ?? questions[0]?.id);\n const [sheetOpen, setSheetOpen] = useState(false);\n\n const isControlled = activeQuestionId !== undefined;\n const activeId = isControlled ? activeQuestionId : internalActiveId;\n const activeItem = questions.find((item) => item.id === activeId);\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return questions;\n return questions.filter((item) => item.question.toLowerCase().includes(q));\n }, [questions, search]);\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n onSearchChange?.(e.target.value);\n };\n\n const handleClear = () => {\n setSearch(\"\");\n onSearchChange?.(\"\");\n };\n\n const handleSelect = (item: HelpCenterQuestionItem) => {\n if (!isControlled) setInternalActiveId(item.id);\n onQuestionSelect?.(item.id);\n setSheetOpen(false);\n };\n\n // Per-question `content` (self-contained/SPA mode) overrides the page-level\n // `contentTitle`/`content` props; otherwise those props are the source of\n // truth (real multi-page apps update them whenever `onQuestionSelect` fires).\n const resolvedTitle = activeItem?.content ? activeItem.contentTitle ?? contentTitle : contentTitle;\n const resolvedContent = activeItem?.content ?? content;\n\n const rootClass = [\"hcp-section\", className ?? \"\"].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass}>\n <div className=\"hcp-container\">\n <div className=\"hcp-searchWrap\">\n <SearchField\n aria-label={searchAriaLabel ?? searchPlaceholder}\n onChange={handleSearchChange}\n onClear={handleClear}\n placeholder={searchPlaceholder}\n value={search}\n variant=\"outline\"\n />\n </div>\n\n <div className=\"hcp-body\">\n {/* ── Sidebar question table (tablet/desktop) ─────── */}\n <aside className=\"hcp-sidebar\">\n <div className=\"hcp-sidebarCard\">\n <h2 className=\"hcp-sidebarTitle\">{categoryTitle}</h2>\n\n {filtered.length > 0 ? (\n <div className=\"hcp-list\" role=\"list\">\n {filtered.map((item) => (\n <div className=\"hcp-listItem\" key={item.id} role=\"listitem\">\n <QuestionRow isActive={item.id === activeId} item={item} onSelect={handleSelect} />\n </div>\n ))}\n </div>\n ) : (\n <p className=\"hcp-noResults\">{searchNoResultsText.replace(\"{query}\", search)}</p>\n )}\n </div>\n </aside>\n\n {/* ── Category dropdown trigger (mobile) ──────────── */}\n <button\n aria-expanded={sheetOpen}\n className=\"hcp-mobileToggle\"\n onClick={() => setSheetOpen(true)}\n type=\"button\"\n >\n <span className=\"hcp-mobileToggleLabel\">{categoryTitle}</span>\n <span className=\"hcp-mobileToggleChevron\">\n <ChevronDownIcon />\n </span>\n </button>\n\n {/* ── Main content column (CMS answer body) ───────── */}\n <div className=\"hcp-content\">\n <h1 className=\"hcp-contentTitle\">{resolvedTitle}</h1>\n <div className=\"hcp-contentBody\">{resolvedContent.map(renderBlock)}</div>\n </div>\n </div>\n </div>\n\n {/* ── \"Articles in this section\" sheet (mobile) ───────────── */}\n <BottomSheet onClose={() => setSheetOpen(false)} open={sheetOpen} title={articlesSheetTitle}>\n {filtered.length > 0 ? (\n <div className=\"hcp-sheetList\" role=\"list\">\n {filtered.map((item) => (\n <div className=\"hcp-sheetItem\" key={item.id} role=\"listitem\">\n <QuestionRow isActive={item.id === activeId} item={item} onSelect={handleSelect} />\n </div>\n ))}\n </div>\n ) : (\n <p className=\"hcp-noResults\">{searchNoResultsText.replace(\"{query}\", search)}</p>\n )}\n </BottomSheet>\n </section>\n );\n};\n\nexport default HelpCenterPage;\n","import { useEffect, useMemo, useState } from \"react\";\nimport type {\n FeatureBlogContentBlock,\n FeatureBlogPageProps,\n FeatureBlogSharePlatform,\n} from \"./FeatureBlogPage.types\";\nimport { Tag } from \"../../components/Tag\";\nimport { Steps } from \"../Steps\";\nimport shareLinkIcon from \"../../assets/share-link.png\";\nimport shareFacebookIcon from \"../../assets/share-facebook.png\";\nimport shareXIcon from \"../../assets/share-x.png\";\nimport shareTelegramIcon from \"../../assets/share-telegram.png\";\nimport shareLinkedInIcon from \"../../assets/share-linkedin.png\";\nimport \"./FeatureBlogPage.css\";\n\n/* ── Icons ─────────────────────────────────────────────────────\n * Share icons are bundled flat brand-mark artwork (matching the\n * reference site's monochrome icon row) rather than hand-drawn SVGs,\n * so they render pixel-for-pixel the same everywhere. The chevron and\n * \"copied\" checkmark are the only inline SVGs — small UI glyphs, not\n * brand marks, sized via the button they sit in and coloured via\n * `currentColor`.\n */\n\nconst ChevronDownIcon = () => (\n <svg aria-hidden=\"true\" fill=\"none\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6l4 4 4-4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.5\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg aria-hidden=\"true\" fill=\"none\" height=\"18\" viewBox=\"0 0 16 16\" width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.5 8.5l3 3 6-7\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"1.6\" />\n </svg>\n);\n\nconst SHARE_ICONS: Record<FeatureBlogSharePlatform, { src: string; alt: string }> = {\n facebook: { src: shareFacebookIcon, alt: \"Facebook\" },\n twitter: { src: shareXIcon, alt: \"X\" },\n linkedin: { src: shareLinkedInIcon, alt: \"LinkedIn\" },\n telegram: { src: shareTelegramIcon, alt: \"Telegram\" },\n};\n\nconst LABELS: Record<FeatureBlogSharePlatform, string> = {\n facebook: \"Share on Facebook\",\n twitter: \"Share on X\",\n linkedin: \"Share on LinkedIn\",\n telegram: \"Share on Telegram\",\n};\n\n/* ── Helpers ───────────────────────────────────────────────────── */\n\nconst slugify = (text: string): string =>\n text\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\nfunction shareHref(platform: FeatureBlogSharePlatform, url: string, text: string): string {\n const encodedUrl = encodeURIComponent(url);\n const encodedText = encodeURIComponent(text);\n switch (platform) {\n case \"facebook\":\n return `https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`;\n case \"twitter\":\n return `https://twitter.com/intent/tweet?url=${encodedUrl}&text=${encodedText}`;\n case \"linkedin\":\n return `https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`;\n case \"telegram\":\n return `https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`;\n }\n}\n\n/* ── Table of contents card ────────────────────────────────────── */\n\nconst TocCard = ({\n tocTitle,\n headings,\n activeId,\n defaultOpen,\n onNavigate,\n idSuffix,\n collapsible,\n}: {\n tocTitle: string;\n headings: { id: string; text: string }[];\n activeId: string | null;\n defaultOpen: boolean;\n onNavigate: (id: string) => void;\n idSuffix: string;\n /** Mobile renders a real disclosure (chevron toggle); desktop is always expanded, matching the reference site. */\n collapsible: boolean;\n}) => {\n const [open, setOpen] = useState(defaultOpen);\n const panelId = `fbp-toc-panel-${idSuffix}`;\n const isOpen = collapsible ? open : true;\n\n const list = (\n <ol className=\"fbp-tocList\" id={panelId}>\n {headings.map((heading) => (\n <li className=\"fbp-tocItem\" key={heading.id}>\n <a\n aria-current={activeId === heading.id ? \"location\" : undefined}\n className={[\"fbp-tocLink\", activeId === heading.id ? \"fbp-tocLink--active\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n href={`#${heading.id}`}\n onClick={(e) => {\n e.preventDefault();\n onNavigate(heading.id);\n }}\n >\n {heading.text}\n </a>\n </li>\n ))}\n </ol>\n );\n\n return (\n <div className=\"fbp-tocCard\">\n {collapsible ? (\n <button\n aria-controls={panelId}\n aria-expanded={isOpen}\n className=\"fbp-tocHeader fbp-tocHeader--button\"\n onClick={() => setOpen((prev) => !prev)}\n type=\"button\"\n >\n <span className=\"fbp-tocTitle\">{tocTitle}</span>\n <span className={[\"fbp-tocChevron\", isOpen ? \"fbp-tocChevron--open\" : \"\"].filter(Boolean).join(\" \")}>\n <ChevronDownIcon />\n </span>\n </button>\n ) : (\n <div className=\"fbp-tocHeader\">\n <span className=\"fbp-tocTitle\">{tocTitle}</span>\n </div>\n )}\n {isOpen && list}\n </div>\n );\n};\n\n/* ── Share row ─────────────────────────────────────────────────── */\n\nconst ShareRow = ({\n shareTitle,\n shareUrl,\n shareText,\n platforms,\n onShare,\n copiedLabel,\n}: {\n shareTitle: string;\n shareUrl: string;\n shareText: string;\n platforms: FeatureBlogSharePlatform[];\n onShare?: (platform: FeatureBlogSharePlatform | \"copy\") => void;\n copiedLabel: string;\n}) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async () => {\n onShare?.(\"copy\");\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(shareUrl);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2000);\n }\n } catch {\n /* Clipboard access denied by the browser/user — fail silently. */\n }\n };\n\n return (\n <div className=\"fbp-shareCard\">\n <span className=\"fbp-shareTitle\">{shareTitle}</span>\n <div className=\"fbp-shareIcons\">\n <button\n aria-label={copied ? copiedLabel : \"Copy link\"}\n className=\"fbp-shareIcon\"\n onClick={handleCopy}\n type=\"button\"\n >\n {copied ? <CheckIcon /> : <img alt=\"\" className=\"fbp-shareIconImg\" src={shareLinkIcon} />}\n </button>\n {platforms.map((platform) => {\n const icon = SHARE_ICONS[platform];\n return (\n <a\n aria-label={LABELS[platform]}\n className=\"fbp-shareIcon\"\n href={shareHref(platform, shareUrl, shareText)}\n key={platform}\n onClick={() => onShare?.(platform)}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n <img alt=\"\" className=\"fbp-shareIconImg\" src={icon.src} />\n </a>\n );\n })}\n </div>\n </div>\n );\n};\n\n/* ── Content block renderer ───────────────────────────────────── */\n\nconst renderBlock = (block: FeatureBlogContentBlock, index: number, headingIds: Map<number, string>) => {\n if (block.type === \"heading\") {\n const level = block.level ?? 2;\n const HeadingTag = level === 3 ? \"h3\" : \"h2\";\n const headingClass = level === 3 ? \"fbp-blockHeading fbp-blockHeading--h3\" : \"fbp-blockHeading\";\n return (\n <HeadingTag className={headingClass} id={headingIds.get(index)} key={index}>\n {block.text}\n </HeadingTag>\n );\n }\n\n if (block.type === \"list\") {\n const ListTag = block.ordered ? \"ol\" : \"ul\";\n return (\n <ListTag className=\"fbp-blockList\" key={index}>\n {(block.items ?? []).map((item, i) => (\n <li className=\"fbp-blockListItem\" key={i}>\n {item}\n </li>\n ))}\n </ListTag>\n );\n }\n\n if (block.type === \"quote\") {\n return (\n <blockquote className=\"fbp-blockQuote\" key={index}>\n <p className=\"fbp-blockQuoteText\">{block.text}</p>\n {block.cite && <cite className=\"fbp-blockQuoteCite\">{block.cite}</cite>}\n </blockquote>\n );\n }\n\n if (block.type === \"image\") {\n return (\n <figure className=\"fbp-blockImageWrap\" key={index}>\n <img alt={block.imageAlt ?? \"\"} className=\"fbp-blockImage\" src={block.image} />\n {block.caption && <figcaption className=\"fbp-blockCaption\">{block.caption}</figcaption>}\n </figure>\n );\n }\n\n if (block.type === \"steps\") {\n return (\n <div className=\"fbp-blockSteps\" key={index}>\n <Steps embedded steps={block.steps ?? []} title={block.text ?? \"\"} titleId={headingIds.get(index)} />\n </div>\n );\n }\n\n return (\n <p className=\"fbp-blockParagraph\" key={index}>\n {block.text}\n </p>\n );\n};\n\n/* ── FeatureBlogPage ───────────────────────────────────────────\n * A full blog-article page: category tag, title, author/date meta,\n * hero image, and a rich-content body. A \"Contents\" (table of\n * contents) + \"Share article\" sidebar sits beside the\n * title/hero/content column and stays sticky while scrolling on\n * desktop. On mobile the sidebar collapses into an expandable\n * \"Contents\" card above the title and a horizontal share-icon row\n * below the hero image, so both stay reachable without a persistent\n * floating widget.\n *\n * Breadcrumb navigation is intentionally not part of this template —\n * it is composed separately above it by the consuming page.\n *\n * Modeled after deriv.com/newsroom/updates/deriv-derived-indices-on-tradingview.\n */\nexport const FeatureBlogPage = ({\n category,\n title,\n publishDate,\n author,\n heroImage,\n heroImageAlt,\n content,\n tocTitle = \"Contents\",\n tocDefaultOpen = true,\n hideToc = false,\n shareTitle = \"Share article\",\n shareUrl,\n shareText,\n sharePlatforms = [\"facebook\", \"twitter\", \"telegram\", \"linkedin\"],\n hideShare = false,\n onShare,\n copiedLabel = \"Copied!\",\n className,\n}: FeatureBlogPageProps) => {\n const headingIds = useMemo(() => {\n const seen = new Map<string, number>();\n const ids = new Map<number, string>();\n content.forEach((block, i) => {\n if (block.type !== \"heading\" && block.type !== \"steps\") return;\n const base = block.id ?? (slugify(block.text ?? \"\") || `section-${i}`);\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n ids.set(i, count === 0 ? base : `${base}-${count}`);\n });\n return ids;\n }, [content]);\n\n const headings = useMemo(\n () =>\n content\n .map((block, i) => ({ block, i }))\n .filter(\n ({ block }) =>\n block.type === \"steps\" || (block.type === \"heading\" && (block.level ?? 2) === 2),\n )\n .map(({ block, i }) => ({ id: headingIds.get(i) as string, text: block.text ?? \"\" })),\n [content, headingIds],\n );\n\n // No section is \"active\" until the reader actually scrolls into one —\n // matches the reference site, which shows a plain (non-highlighted)\n // list on first load.\n const [activeId, setActiveId] = useState<string | null>(null);\n\n useEffect(() => {\n if (typeof IntersectionObserver === \"undefined\" || headings.length === 0) return;\n\n const elements = headings\n .map((heading) => document.getElementById(heading.id))\n .filter((el): el is HTMLElement => el !== null);\n if (elements.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries.filter((entry) => entry.isIntersecting);\n if (visible.length === 0) return;\n const topMost = visible.reduce((a, b) =>\n a.boundingClientRect.top < b.boundingClientRect.top ? a : b,\n );\n setActiveId(topMost.target.id);\n },\n { rootMargin: \"-112px 0px -70% 0px\", threshold: 0 },\n );\n\n elements.forEach((el) => observer.observe(el));\n return () => observer.disconnect();\n }, [headings]);\n\n const handleNavigate = (id: string) => {\n setActiveId(id);\n const el = document.getElementById(id);\n if (!el) return;\n const prefersReducedMotion =\n typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n el.scrollIntoView({ behavior: prefersReducedMotion ? \"auto\" : \"smooth\", block: \"start\" });\n };\n\n const showToc = !hideToc && headings.length > 0;\n const showShare = !hideShare && Boolean(shareUrl);\n const resolvedShareText = shareText ?? title;\n\n return (\n <section className={[\"fbp-section\", className ?? \"\"].filter(Boolean).join(\" \")}>\n <div className=\"fbp-container\">\n {/* ── Mobile/tablet \"Contents\" card — sits above the title ── */}\n {showToc && (\n <div className=\"fbp-tocMobileWrap\">\n <TocCard\n activeId={activeId}\n collapsible\n defaultOpen={tocDefaultOpen}\n headings={headings}\n idSuffix=\"mobile\"\n onNavigate={handleNavigate}\n tocTitle={tocTitle}\n />\n </div>\n )}\n\n <div className=\"fbp-body\">\n <div className=\"fbp-main\">\n <header className=\"fbp-header\">\n {category && <Tag label={category} size=\"md\" variant=\"fill\" />}\n <h1 className=\"fbp-title\">{title}</h1>\n {(publishDate || author) && (\n <div className=\"fbp-meta\">\n {author && (\n <span className=\"fbp-metaAuthor\">\n {author.avatar && (\n <img\n alt={author.avatarAlt ?? \"\"}\n className=\"fbp-avatar\"\n src={author.avatar}\n />\n )}\n <span className=\"fbp-authorName\">{author.name}</span>\n </span>\n )}\n {publishDate && <span className=\"fbp-dateChip\">{publishDate}</span>}\n </div>\n )}\n </header>\n\n {heroImage && (\n <div className=\"fbp-heroImageWrap\">\n <img alt={heroImageAlt ?? \"\"} className=\"fbp-heroImage\" src={heroImage} />\n </div>\n )}\n\n <div className=\"fbp-content\">\n {content.map((block, index) => renderBlock(block, index, headingIds))}\n </div>\n\n {/* ── Mobile/tablet share row — at the end of the article body ── */}\n {showShare && (\n <div className=\"fbp-shareMobileWrap\">\n <ShareRow\n copiedLabel={copiedLabel}\n onShare={onShare}\n platforms={sharePlatforms}\n shareText={resolvedShareText}\n shareTitle={shareTitle}\n shareUrl={shareUrl as string}\n />\n </div>\n )}\n </div>\n\n {(showToc || showShare) && (\n <aside className=\"fbp-sidebar\">\n <div className=\"fbp-sidebarSticky\">\n {showToc && (\n <TocCard\n activeId={activeId}\n collapsible={false}\n defaultOpen={tocDefaultOpen}\n headings={headings}\n idSuffix=\"desktop\"\n onNavigate={handleNavigate}\n tocTitle={tocTitle}\n />\n )}\n {showShare && (\n <ShareRow\n copiedLabel={copiedLabel}\n onShare={onShare}\n platforms={sharePlatforms}\n shareText={resolvedShareText}\n shareTitle={shareTitle}\n shareUrl={shareUrl as string}\n />\n )}\n </div>\n </aside>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureBlogPage;\n","import { useRef } from \"react\";\nimport { motion, useScroll, useSpring, useTransform, useReducedMotion } from \"framer-motion\";\nimport type { ParallaxBannerCultureCard, ParallaxBannerProps } from \"./ParallaxBanner.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./ParallaxBanner.css\";\n\nexport const PARALLAX_BANNER_TEXT_CONTENT = {\n title: \"Our culture\",\n description:\n \"We combine human values with AI precision. Collaboration, integrity, and continuous learning guide every project.\",\n ctaLabel: \"Culture at Deriv\",\n};\n\nexport const DEFAULT_CULTURE_CARDS: ParallaxBannerCultureCard[] = [\n {\n title: \"Customer focus\",\n description:\n \"We obsess over customers, prioritising measurable user value and using AI to surface insights and tailor experiences, always keeping human judgment central.\",\n },\n {\n title: \"Integrity\",\n description:\n \"We act with candour and accountability. We make clear trade-offs, give honest feedback, and design our AI and data use with ethics and transparency to build trust.\",\n },\n {\n title: \"Teamwork\",\n description:\n \"We move together in cross-functional teams. We share credit, solve problems collaboratively, and welcome diverse perspectives to deliver better outcomes.\",\n },\n {\n title: \"Competence\",\n description:\n \"We hold high standards and keep learning. We pair deep expertise with pragmatic delivery from prototype to production, and we use AI thoughtfully to amplify judgment and scale impact.\",\n },\n];\n\nconst PLACEHOLDER_IMAGE =\n \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/69b9309379ac08e59ca8210a_1f3f555da9a5cbb13a6fe1bf0d5fe1b6_placeholder-image.webp\";\n\n/* How far (in px) the photo travels as the banner crosses the viewport.\n * Kept small so the effect reads as a gentle depth cue, not a slide-in. */\nconst PARALLAX_PX = 36;\n\n/* Spring smoothing so the photo lags the scroll position slightly instead of\n * being mechanically locked to it — this is what gives the \"overscroll\"\n * softness seen on careers.deriv.com rather than a stiff 1:1 translate. */\nconst PARALLAX_SPRING = { stiffness: 90, damping: 26, restDelta: 0.001 } as const;\n\nexport const ParallaxBanner = ({\n variant = \"default\",\n title = PARALLAX_BANNER_TEXT_CONTENT.title,\n description = PARALLAX_BANNER_TEXT_CONTENT.description,\n ctaLabel = PARALLAX_BANNER_TEXT_CONTENT.ctaLabel,\n ctaHref,\n onCtaClick,\n imageUrl = PLACEHOLDER_IMAGE,\n imageAlt = \"\",\n cards = DEFAULT_CULTURE_CARDS,\n enableParallax = true,\n className,\n ...props\n}: ParallaxBannerProps) => {\n const sectionRef = useRef<HTMLElement>(null);\n const prefersReducedMotion = useReducedMotion();\n const parallaxActive = enableParallax && !prefersReducedMotion;\n const showCards = variant !== \"banner-only\" && cards.length > 0;\n\n /* Track scroll progress as the section crosses the viewport, exactly like\n * the entering/leaving overscroll parallax on careers.deriv.com. */\n const { scrollYProgress } = useScroll({\n target: sectionRef,\n offset: [\"start end\", \"end start\"],\n });\n const smoothProgress = useSpring(scrollYProgress, PARALLAX_SPRING);\n const parallaxY = useTransform(smoothProgress, [0, 1], [-PARALLAX_PX, PARALLAX_PX]);\n\n return (\n <section\n ref={sectionRef}\n className={[\n \"parallax-banner\",\n variant === \"banner-only\" ? \"parallax-banner--banner-only\" : \"\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n <div className=\"parallax-banner__inner\">\n <div className=\"parallax-banner__card\">\n <div className=\"parallax-banner__content\">\n <h2 className=\"parallax-banner__title\">{title}</h2>\n\n {description && (\n <p className=\"parallax-banner__description\">{description}</p>\n )}\n\n {ctaLabel && (\n <div className=\"parallax-banner__actions\">\n <Link\n colorScheme=\"white\"\n label={ctaLabel}\n href={ctaHref}\n onClick={onCtaClick}\n showChevron\n className=\"parallax-banner__cta-link\"\n />\n </div>\n )}\n </div>\n\n {imageUrl && (\n <div className=\"parallax-banner__image-wrapper\">\n <motion.img\n src={imageUrl}\n alt={imageAlt}\n className=\"parallax-banner__image\"\n loading=\"lazy\"\n style={parallaxActive ? { y: parallaxY } : undefined}\n />\n </div>\n )}\n </div>\n\n {showCards && (\n <div className=\"parallax-banner__cards\" role=\"list\">\n {cards.map((card, index) => (\n <div\n className=\"parallax-banner__card-item\"\n role=\"listitem\"\n key={`${card.title}-${index}`}\n >\n <h3 className=\"parallax-banner__card-title\">{card.title}</h3>\n <p className=\"parallax-banner__card-description\">\n {card.description}\n </p>\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default ParallaxBanner;\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { Button } from \"../../components/Button\";\nimport { TextField } from \"../../components/TextField\";\nimport { SearchField } from \"../../components/SearchField\";\nimport type {\n TradingCalculatorProps,\n TradingCalculatorResults,\n TradingSymbolSpec,\n} from \"./TradingCalculator.types\";\nimport \"./TradingCalculator.css\";\n\nexport const DEFAULT_SYMBOLS_ENDPOINT =\n \"https://deriv-static-pricingfeedv2.firebaseio.com/n8n/row/prod/dynamic_trading_specs.json\";\nexport const DEFAULT_EXCHANGE_RATE_WS_URL = \"wss://ws.derivws.com/websockets/v3?app_id=1089\";\n\nconst USD = \"USD\";\nconst RATES_CACHE_TTL_MS = 30_000;\n\n/* ── Formatting helpers ───────────────────────────────────────── */\n\nconst moneyFormatter = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n});\nconst integerFormatter = new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 0 });\n\nconst formatMoney = (value: number | null): string =>\n value === null || Number.isNaN(value) ? \"N/A\" : `$ ${moneyFormatter.format(value)}`;\n\nconst formatInteger = (value: number): string =>\n Number.isNaN(value) ? \"N/A\" : `$ ${integerFormatter.format(Math.round(value))}`;\n\n/* ── Calculation ──────────────────────────────────────────────── */\n\nfunction computeResults(\n symbol: TradingSymbolSpec,\n volumeInLots: number,\n assetPrice: number,\n rates: Record<string, number> | null,\n): TradingCalculatorResults {\n const rateFor = (currency: string): number => {\n if (currency === USD) return 1;\n const rate = rates?.[currency];\n return rate ? 1 / rate : NaN;\n };\n\n const convertedRateProfit = rateFor(symbol.profit_currency);\n const convertedRateMargin = rateFor(symbol.base_currency);\n\n const tradeVolume =\n symbol.market === \"forex\"\n ? volumeInLots * symbol.contract_size * convertedRateMargin\n : volumeInLots * symbol.contract_size * convertedRateProfit * assetPrice;\n\n const marginRequired = tradeVolume / symbol.effective_leverage;\n\n const swapMode = symbol.swap_mode.trim().toLowerCase();\n let swapChargeLong: number | null = null;\n let swapChargeShort: number | null = null;\n\n if (swapMode === \"in points\") {\n swapChargeLong =\n volumeInLots * symbol.contract_size * symbol.point_size * symbol.swap_rate_long * convertedRateProfit;\n swapChargeShort =\n volumeInLots * symbol.contract_size * symbol.point_size * symbol.swap_rate_short * convertedRateProfit;\n } else if (swapMode === \"in percentage terms, using end of gmt day price\") {\n swapChargeLong =\n ((volumeInLots * symbol.contract_size * assetPrice * (symbol.swap_rate_long / 100)) / 360) *\n convertedRateProfit;\n swapChargeShort =\n ((volumeInLots * symbol.contract_size * assetPrice * (symbol.swap_rate_short / 100)) / 360) *\n convertedRateProfit;\n }\n\n const pipValue = symbol.pip_size * volumeInLots * symbol.contract_size * convertedRateProfit;\n\n return { marginRequired, tradeVolume, pipValue, swapChargeLong, swapChargeShort };\n}\n\n/* ── Live exchange-rate hook ──────────────────────────────────────\n * Lazily opens a single WebSocket connection to Deriv's public API on the\n * first calculation that actually needs currency conversion, reuses it for\n * subsequent calculations, and caches each base currency's rates for 30s so\n * rapid re-calculates of the same instrument don't re-hit the network.\n */\nfunction useExchangeRates(wsUrl: string | null | undefined) {\n const socketRef = useRef<WebSocket | null>(null);\n const reqIdRef = useRef(1);\n const pendingRef = useRef(\n new Map<number, { resolve: (rates: Record<string, number>) => void; reject: (error: Error) => void }>(),\n );\n const cacheRef = useRef(new Map<string, { rates: Record<string, number>; fetchedAt: number }>());\n\n useEffect(() => {\n const pending = pendingRef.current;\n return () => {\n socketRef.current?.close();\n socketRef.current = null;\n pending.forEach((entry) => entry.reject(new Error(\"Component unmounted\")));\n pending.clear();\n };\n }, [wsUrl]);\n\n const getRates = useCallback(\n (baseCurrency: string): Promise<Record<string, number>> => {\n if (!wsUrl) return Promise.reject(new Error(\"Live exchange rate conversion is disabled\"));\n\n const cached = cacheRef.current.get(baseCurrency);\n if (cached && Date.now() - cached.fetchedAt < RATES_CACHE_TTL_MS) {\n return Promise.resolve(cached.rates);\n }\n\n return new Promise((resolve, reject) => {\n const sendRequest = (socket: WebSocket) => {\n const reqId = reqIdRef.current++;\n pendingRef.current.set(reqId, {\n resolve: (rates) => {\n cacheRef.current.set(baseCurrency, { rates, fetchedAt: Date.now() });\n resolve(rates);\n },\n reject,\n });\n socket.send(JSON.stringify({ exchange_rates: 1, base_currency: baseCurrency, req_id: reqId }));\n };\n\n const existing = socketRef.current;\n const needsNewSocket = !existing || existing.readyState === WebSocket.CLOSED || existing.readyState === WebSocket.CLOSING;\n\n if (needsNewSocket || !existing) {\n const socket = new WebSocket(wsUrl);\n socketRef.current = socket;\n\n socket.onmessage = (event) => {\n let data: { req_id?: number; exchange_rates?: { rates?: Record<string, number> }; error?: { message?: string } };\n try {\n data = JSON.parse(event.data as string);\n } catch {\n return;\n }\n if (data.req_id == null) return;\n const entry = pendingRef.current.get(data.req_id);\n if (!entry) return;\n pendingRef.current.delete(data.req_id);\n if (data.error) {\n entry.reject(new Error(data.error.message ?? \"Exchange rate request failed\"));\n } else {\n entry.resolve(data.exchange_rates?.rates ?? {});\n }\n };\n\n socket.onerror = () => {\n pendingRef.current.forEach((entry) => entry.reject(new Error(\"Exchange rate connection failed\")));\n pendingRef.current.clear();\n };\n\n socket.onopen = () => sendRequest(socket);\n } else if (existing.readyState === WebSocket.OPEN) {\n sendRequest(existing);\n } else {\n const previousOnOpen = existing.onopen;\n existing.onopen = (event) => {\n if (typeof previousOnOpen === \"function\") previousOnOpen.call(existing, event);\n sendRequest(existing);\n };\n }\n });\n },\n [wsUrl],\n );\n\n return getRates;\n}\n\n/* ── Symbol data hook ─────────────────────────────────────────────\n * Uses `symbolsProp` verbatim when supplied (tests / Storybook / SSR-safe\n * override); otherwise fetches Deriv's public specs feed once on mount.\n */\ntype SymbolsState =\n | { status: \"loading\" }\n | { status: \"ready\"; data: TradingSymbolSpec[] }\n | { status: \"error\"; message: string };\n\nfunction useSymbols(symbolsProp: TradingSymbolSpec[] | undefined, endpoint: string): [SymbolsState, () => void] {\n const [state, setState] = useState<SymbolsState>(\n symbolsProp ? { status: \"ready\", data: symbolsProp } : { status: \"loading\" },\n );\n const [retryToken, setRetryToken] = useState(0);\n\n useEffect(() => {\n if (symbolsProp) {\n setState({ status: \"ready\", data: symbolsProp });\n return;\n }\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n setState({ status: \"loading\" });\n\n fetch(endpoint)\n .then((response) => {\n if (!response.ok) throw new Error(`Request failed with status ${response.status}`);\n return response.json();\n })\n .then((data: TradingSymbolSpec[]) => {\n if (cancelled) return;\n setState({ status: \"ready\", data });\n })\n .catch((error: Error) => {\n if (cancelled) return;\n setState({ status: \"error\", message: error.message || \"Unable to load symbols\" });\n });\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [symbolsProp, endpoint, retryToken]);\n\n const retry = useCallback(() => setRetryToken((n) => n + 1), []);\n return [state, retry];\n}\n\n/* ── Icons ────────────────────────────────────────────────────── */\n/* Icons not covered by a shared component live here. */\n\nconst ErrorIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n);\n\nconst ChevronIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/* ── Symbol combobox ──────────────────────────────────────────── */\n\ninterface SymbolComboboxProps {\n symbolsState: SymbolsState;\n onRetry: () => void;\n selected: TradingSymbolSpec | null;\n onSelect: (symbol: TradingSymbolSpec) => void;\n error?: string;\n inputId: string;\n}\n\n/**\n * Groups are kept in first-seen order from `symbols` (i.e. the order the\n * source feed lists them in) rather than alphabetically — this mirrors the\n * reference page's own grouping (`array.reduce(...)` into a plain object,\n * then `Object.entries`, which preserves insertion order), so the dropdown's\n * sector order matches deriv.com/trading-calculators exactly. Symbols within\n * each group are still sorted alphabetically, same as the reference.\n */\nfunction groupByAssetClass(symbols: TradingSymbolSpec[]): [string, TradingSymbolSpec[]][] {\n const groups = new Map<string, TradingSymbolSpec[]>();\n for (const item of symbols) {\n const list = groups.get(item.asset_class) ?? [];\n list.push(item);\n groups.set(item.asset_class, list);\n }\n for (const list of groups.values()) {\n list.sort((a, b) => a.symbol.localeCompare(b.symbol));\n }\n return [...groups.entries()];\n}\n\nconst SymbolCombobox = ({ symbolsState, onRetry, selected, onSelect, error, inputId }: SymbolComboboxProps) => {\n const [query, setQuery] = useState(\"\");\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const listboxId = useId();\n\n const isLoading = symbolsState.status === \"loading\";\n const isError = symbolsState.status === \"error\";\n const allSymbols = symbolsState.status === \"ready\" ? symbolsState.data : [];\n\n const filtered = useMemo(() => {\n const term = query.trim().toLowerCase();\n if (!term) return allSymbols;\n return allSymbols.filter(\n (item) =>\n item.symbol.toLowerCase().includes(term) ||\n item.description.toLowerCase().includes(term) ||\n item.asset_class.toLowerCase().includes(term),\n );\n }, [allSymbols, query]);\n\n const grouped = useMemo(() => groupByAssetClass(filtered), [filtered]);\n const flatOptions = useMemo(() => grouped.flatMap(([, items]) => items), [grouped]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handlePointerDown);\n return () => document.removeEventListener(\"mousedown\", handlePointerDown);\n }, [isOpen]);\n\n const displayValue = isOpen ? query : selected ? `${selected.symbol} — ${selected.description}` : query;\n\n const commit = (item: TradingSymbolSpec) => {\n onSelect(item);\n setQuery(\"\");\n setIsOpen(false);\n setActiveIndex(-1);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex((i) => Math.min(i + 1, flatOptions.length - 1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveIndex((i) => Math.max(i - 1, 0));\n } else if (event.key === \"Enter\") {\n if (isOpen && activeIndex >= 0 && flatOptions[activeIndex]) {\n event.preventDefault();\n commit(flatOptions[activeIndex]);\n }\n } else if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n return (\n <div className=\"tcalc-field\" ref={wrapperRef}>\n <SearchField\n id={inputId}\n label={\n <>\n Symbols <span className=\"tcalc-required\">*</span>\n </>\n }\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n isOpen && activeIndex >= 0 ? `${listboxId}-${activeIndex}` : undefined\n }\n aria-invalid={Boolean(error)}\n status={error ? \"fail\" : \"neutral\"}\n showSearchIcon={false}\n autoComplete=\"off\"\n disabled={isLoading || isError}\n hideClearButton\n trailingSlot={<ChevronIcon />}\n placeholder={isLoading ? \"Loading symbols…\" : isError ? \"Symbols unavailable\" : \"Search symbol, e.g. EURUSD\"}\n value={displayValue}\n onFocus={() => setIsOpen(true)}\n onChange={(event) => {\n setQuery(event.target.value);\n setIsOpen(true);\n setActiveIndex(-1);\n }}\n onKeyDown={handleKeyDown}\n />\n\n {isOpen && !isLoading && !isError && (\n <div className=\"tcalc-dropdown\" id={listboxId} role=\"listbox\">\n {grouped.length === 0 && <p className=\"tcalc-dropdownEmpty\">No symbols match \"{query}\"</p>}\n {grouped.map(([assetClass, items]) => (\n <div className=\"tcalc-dropdownGroup\" key={assetClass}>\n <p className=\"tcalc-dropdownGroupTitle\">{assetClass}</p>\n {items.map((item) => {\n const flatIndex = flatOptions.indexOf(item);\n return (\n <div\n className={[\n \"tcalc-dropdownOption\",\n flatIndex === activeIndex ? \"tcalc-dropdownOption--active\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n id={`${listboxId}-${flatIndex}`}\n key={item.symbol}\n role=\"option\"\n aria-selected={selected?.symbol === item.symbol}\n onMouseDown={(event) => {\n event.preventDefault();\n commit(item);\n }}\n onMouseEnter={() => setActiveIndex(flatIndex)}\n >\n <span className=\"tcalc-dropdownSymbol\">{item.symbol}</span>\n <span className=\"tcalc-dropdownDesc\">{item.description}</span>\n </div>\n );\n })}\n </div>\n ))}\n </div>\n )}\n\n {isError && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> Unable to load symbols.{\" \"}\n <button type=\"button\" className=\"tcalc-retryLink\" onClick={onRetry}>\n Retry\n </button>\n </p>\n )}\n {!isError && error && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> {error}\n </p>\n )}\n </div>\n );\n};\n\n/* ── Meta / info rows ─────────────────────────────────────────── */\n\nconst InfoRow = ({\n label,\n value,\n separator = \"=\",\n}: {\n label: string;\n value: string;\n separator?: \"=\" | \":\";\n}) => (\n <p className=\"tcalc-infoRow\">\n <span className=\"tcalc-infoLabel\">{label}</span>\n {separator === \"=\" ? \" = \" : \": \"}\n <span className=\"tcalc-infoValue\">{value}</span>\n </p>\n);\n\nconst ResultBox = ({ label, value }: { label: string; value: string }) => (\n <div className=\"tcalc-resultBox\">\n <p className=\"tcalc-resultLabel\">{label}</p>\n <p className=\"tcalc-resultValue\">{value}</p>\n </div>\n);\n\n/* ── TradingCalculator ────────────────────────────────────────────\n * A two-panel \"Calculator\" / \"Results\" trading calculator (margin, pip\n * value, swap charges), modeled after deriv.com/trading-calculators.\n *\n * Fully wired to the same live data sources as the reference page:\n * - instrument specs (contract size, leverage, swap rates, live price) from\n * Deriv's public `dynamic_trading_specs.json` feed, fetched on mount;\n * - USD exchange rates from Deriv's public WebSocket API, fetched on demand\n * only for instruments whose base/profit currency isn't already USD.\n *\n * These sources power all four `variant`s identically — deriv.com's own\n * margin/pip/swap calculator pages are three thin views over the same\n * instrument feed and exchange-rate API, they just each surface a different\n * subset of the shared \"Results\" panel. See `symbols` / `symbolsEndpoint` /\n * `exchangeRateWsUrl` in `TradingCalculator.types.ts` to override either data\n * source, and `variant` to pick which page's results panel to render.\n */\nexport const TradingCalculator = ({\n variant = \"main\",\n symbols: symbolsProp,\n symbolsEndpoint = DEFAULT_SYMBOLS_ENDPOINT,\n exchangeRateWsUrl = DEFAULT_EXCHANGE_RATE_WS_URL,\n defaultSymbol,\n className,\n ...props\n}: TradingCalculatorProps) => {\n const showMargin = variant === \"main\" || variant === \"margin\";\n const showPip = variant === \"main\" || variant === \"pip\";\n const showSwap = variant === \"main\" || variant === \"swap\";\n const showTradeVolume = variant === \"main\";\n const [symbolsState, retrySymbols] = useSymbols(symbolsProp, symbolsEndpoint);\n const getRates = useExchangeRates(exchangeRateWsUrl);\n\n const [selectedSymbol, setSelectedSymbol] = useState<TradingSymbolSpec | null>(null);\n const [volumeInLots, setVolumeInLots] = useState(\"\");\n const [assetPrice, setAssetPrice] = useState(\"\");\n const [errors, setErrors] = useState<{ symbol?: string; volume?: string; price?: string }>({});\n const [results, setResults] = useState<TradingCalculatorResults | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n const [calcError, setCalcError] = useState<string | null>(null);\n const didPreselect = useRef(false);\n\n useEffect(() => {\n if (didPreselect.current || !defaultSymbol || symbolsState.status !== \"ready\") return;\n const match = symbolsState.data.find((item) => item.symbol === defaultSymbol);\n if (match) {\n didPreselect.current = true;\n setSelectedSymbol(match);\n setAssetPrice(String(match.ask_last));\n }\n }, [defaultSymbol, symbolsState]);\n\n const handleSelectSymbol = (symbol: TradingSymbolSpec) => {\n setSelectedSymbol(symbol);\n setAssetPrice(String(symbol.ask_last));\n setVolumeInLots(\"\");\n setResults(null);\n setCalcError(null);\n setErrors((prev) => ({ ...prev, symbol: undefined }));\n };\n\n const handleReset = () => {\n setSelectedSymbol(null);\n setVolumeInLots(\"\");\n setAssetPrice(\"\");\n setResults(null);\n setErrors({});\n setCalcError(null);\n };\n\n const handleCalculate = async () => {\n const volume = Number.parseFloat(volumeInLots);\n const price = Number.parseFloat(assetPrice);\n const nextErrors: typeof errors = {};\n\n if (!selectedSymbol) nextErrors.symbol = \"Select a symbol to continue.\";\n if (!volumeInLots || Number.isNaN(volume)) {\n nextErrors.volume = \"Enter a valid volume in lots.\";\n } else if (volume <= 0) {\n nextErrors.volume = \"Volume must be greater than 0.\";\n } else if (selectedSymbol && (volume < selectedSymbol.volume_min || volume > selectedSymbol.volume_limit)) {\n nextErrors.volume = `Volume must be between ${selectedSymbol.volume_min} and ${selectedSymbol.volume_limit} lots.`;\n }\n if (!assetPrice || Number.isNaN(price) || price <= 0) nextErrors.price = \"Enter a valid asset price.\";\n\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0 || !selectedSymbol) return;\n\n setCalcError(null);\n setIsCalculating(true);\n try {\n const needsConversion = selectedSymbol.profit_currency !== USD || selectedSymbol.base_currency !== USD;\n const rates = needsConversion ? await getRates(USD) : null;\n setResults(computeResults(selectedSymbol, volume, price, rates));\n } catch (error) {\n setCalcError(\n error instanceof Error\n ? `Unable to fetch live exchange rates (${error.message}). Please try again.`\n : \"Unable to fetch live exchange rates. Please try again.\",\n );\n } finally {\n setIsCalculating(false);\n }\n };\n\n const symbolInputId = useId();\n const volumeInputId = useId();\n const priceInputId = useId();\n\n return (\n <section className={[\"tcalc-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"tcalc-container\">\n <div className=\"tcalc-card\">\n {/* ── Calculator column ── */}\n <div className=\"tcalc-column\">\n <h3 className=\"tcalc-panelTitle\">Calculator</h3>\n\n <SymbolCombobox\n symbolsState={symbolsState}\n onRetry={retrySymbols}\n selected={selectedSymbol}\n onSelect={handleSelectSymbol}\n error={errors.symbol}\n inputId={symbolInputId}\n />\n\n <div className=\"tcalc-infoGrid\">\n <InfoRow label=\"Contract size\" value={selectedSymbol ? integerFormatter.format(selectedSymbol.contract_size) : \"-\"} />\n <InfoRow label=\"Pip size\" value={selectedSymbol ? String(selectedSymbol.pip_size) : \"-\"} />\n <InfoRow\n label=\"Effective Leverage\"\n value={selectedSymbol ? `1 : ${Math.round((selectedSymbol.effective_leverage + Number.EPSILON) * 100) / 100}` : \"-\"}\n />\n <InfoRow label=\"Point size\" value={selectedSymbol ? String(selectedSymbol.point_size) : \"-\"} />\n </div>\n\n <div className=\"tcalc-field\">\n <TextField\n id={volumeInputId}\n className=\"tcalc-numberField\"\n label={\n <>\n Volume in Lots <span className=\"tcalc-required\">*</span>\n </>\n }\n status={errors.volume ? \"fail\" : \"neutral\"}\n type=\"number\"\n inputMode=\"decimal\"\n min={0}\n step=\"any\"\n aria-invalid={Boolean(errors.volume)}\n value={volumeInLots}\n onChange={(event) => {\n const value = event.target.value;\n setVolumeInLots(value);\n const parsed = Number.parseFloat(value);\n const isNegative = value !== \"\" && !Number.isNaN(parsed) && parsed <= 0;\n setErrors((prev) => ({\n ...prev,\n volume: isNegative ? \"Volume must be greater than 0.\" : undefined,\n }));\n }}\n />\n {errors.volume && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> {errors.volume}\n </p>\n )}\n </div>\n\n <div className=\"tcalc-field\">\n <TextField\n id={priceInputId}\n className=\"tcalc-numberField\"\n label={\n <>\n Asset price <span className=\"tcalc-required\">*</span>\n </>\n }\n status={errors.price ? \"fail\" : \"neutral\"}\n type=\"number\"\n inputMode=\"decimal\"\n min={0}\n step=\"any\"\n aria-invalid={Boolean(errors.price)}\n value={assetPrice}\n onChange={(event) => {\n setAssetPrice(event.target.value);\n setErrors((prev) => ({ ...prev, price: undefined }));\n }}\n />\n {errors.price && (\n <p className=\"tcalc-fieldError\">\n <ErrorIcon /> {errors.price}\n </p>\n )}\n </div>\n\n <div className=\"tcalc-actions\">\n <Button\n type=\"button\"\n colorScheme=\"coral\"\n variant=\"primary\"\n label={isCalculating ? \"Calculating…\" : \"Calculate\"}\n onClick={handleCalculate}\n disabled={isCalculating}\n fullWidth\n />\n <Button\n type=\"button\"\n colorScheme=\"black\"\n variant=\"secondary\"\n label=\"Reset\"\n onClick={handleReset}\n fullWidth\n />\n </div>\n </div>\n\n {/* ── Results column ──\n * \"main\" renders every result in one combined panel;\n * \"margin\"/\"pip\"/\"swap\" each render only their own\n * result(s), mirroring the corresponding single-purpose\n * deriv.com/trading-calculators page. */}\n <div className=\"tcalc-column tcalc-column--results\">\n <h3 className=\"tcalc-panelTitle\">Results</h3>\n\n {showMargin && (\n <ResultBox label=\"Margin Required\" value={results ? formatMoney(results.marginRequired) : \"$\"} />\n )}\n\n {showTradeVolume && showPip && (\n <div className=\"tcalc-resultRow\">\n <ResultBox label=\"Trade Volume\" value={results ? formatInteger(results.tradeVolume) : \"$\"} />\n <ResultBox label=\"Pip value\" value={results ? formatMoney(results.pipValue) : \"$\"} />\n </div>\n )}\n\n {!showTradeVolume && showPip && (\n <ResultBox label=\"Pip value\" value={results ? formatMoney(results.pipValue) : \"$\"} />\n )}\n\n {showSwap && (\n <div className=\"tcalc-resultRow\">\n <ResultBox label=\"Swap Charge Long\" value={results ? formatMoney(results.swapChargeLong) : \"$\"} />\n <ResultBox label=\"Swap Charge Short\" value={results ? formatMoney(results.swapChargeShort) : \"$\"} />\n </div>\n )}\n\n {calcError && (\n <p className=\"tcalc-fieldError tcalc-calcError\">\n <ErrorIcon /> {calcError}\n </p>\n )}\n\n {showSwap && (\n <>\n <div className=\"tcalc-infoGrid\">\n <InfoRow label=\"Swap long rate\" value={selectedSymbol ? String(selectedSymbol.swap_rate_long) : \"-\"} />\n <InfoRow label=\"Swap short rate\" value={selectedSymbol ? String(selectedSymbol.swap_rate_short) : \"-\"} />\n </div>\n\n <InfoRow separator=\":\" label=\"Swap calculation type\" value={selectedSymbol ? selectedSymbol.swap_mode : \"-\"} />\n <InfoRow separator=\":\" label=\"Three-day swap\" value={selectedSymbol ? selectedSymbol.three_day_swap || \"No\" : \"-\"} />\n <InfoRow separator=\":\" label=\"Weekend swaps\" value={selectedSymbol ? String(selectedSymbol.weekend_swaps ?? \"-\") : \"-\"} />\n </>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default TradingCalculator;\n","import { Fragment, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { Tabs } from \"../../components/Tabs\";\nimport type {\n CalculationToken,\n FormulaBlock,\n SwapCalculationMode,\n TradingCalculatorHowToProps,\n TradingCalculatorHowToVariant,\n} from \"./TradingCalculatorHowTo.types\";\nimport \"./TradingCalculatorHowTo.css\";\n\ninterface HowToContent {\n title: string;\n description: string;\n formulaHeading: string;\n formulaBlocks: FormulaBlock[];\n exampleHeading: string;\n exampleIntro: string;\n exampleLead?: string;\n calculations: CalculationToken[][];\n resultText: string;\n note: string;\n}\n\n/* ── Canonical content ────────────────────────────────────────────\n * Mirrors deriv.com/trading-calculators' three \"How to calculate…\"\n * explainer sections word-for-word. `title`/`description` are overridable\n * props (see `TradingCalculatorHowToProps`); the formula/example content\n * itself is fixed per `variant` — like `TradingCalculator`'s own panel\n * labels, this is reference copy, not per-instance CMS content.\n */\n\nconst MARGIN_CONTENT: HowToContent = {\n title: \"How to calculate margin requirements\",\n description:\n \"Use this formula to calculate how much margin is required based on your lot size, leverage ratio, and the current market price.\",\n formulaHeading: \"Formula\",\n formulaBlocks: [\n { type: \"text\", content: \"Required margin = Volume ÷ Effective leverage*\" },\n { type: \"footnote\", content: \"* Use the denominator of the Effective leverage ratio, 1 : XXXX.\" },\n { type: \"text\", content: \"Volume is calculated based on the following formula:\" },\n {\n type: \"bullets\",\n items: [\n { term: \"Forex\", content: \"Lots x Contract size x BSE/USD*\" },\n { term: \"Other\", content: \"Lots x Contract size x Execution price x QTE/USD**\" },\n ],\n },\n {\n type: \"footnote\",\n content:\n '*BSE/USD is the conversion rate from the base currency (BSE), referred to as the \"Margin Currency\" in MT5, to USD.',\n },\n {\n type: \"footnote\",\n content:\n '**QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleHeading: \"Example\",\n exampleIntro:\n \"You are trading 0.25 lots of EUR/GBP with leverage of 1:1000. The EUR to USD conversion rate is 1.10634.\",\n calculations: [\n [\n { text: \"0.25\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"100,000\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"1.10634\", label: \"EUR to USD\" },\n { text: \"=\" },\n { text: \"27,658.5\", label: \"Volume\" },\n ],\n [\n { text: \"27,658.5\", label: \"Volume\" },\n { text: \"÷\" },\n { text: \"1,000\", label: \"Leverage\" },\n { text: \"=\" },\n { text: \"27.66\", label: \"Required margin\" },\n ],\n ],\n resultText: \"The margin required is USD 27.66 to open the above position.\",\n note: \"Note: These are approximate values only and will differ depending on the leverage that is set for your account and the asset you want to trade.\",\n};\n\nconst PIP_CONTENT: HowToContent = {\n title: \"How to calculate pip values\",\n description: \"Calculate how much each pip equals in dollar terms for your position size and trading instrument.\",\n formulaHeading: \"Formula\",\n formulaBlocks: [\n { type: \"text\", content: \"Pip value USD: Pip size* x Lots x Contract size x QTE/USD*\" },\n {\n type: \"footnote\",\n content:\n '*QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleHeading: \"Example\",\n exampleIntro: \"You are trading 0.25 lots of EUR/GBP, with a GBP to USD conversion rate of 1.31386.\",\n exampleLead: \"The calculation would be:\",\n calculations: [\n [\n { text: \"0.0001\", label: \"Pip size\" },\n { text: \"x\" },\n { text: \"0.25\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"100,000\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"1.31386\", label: \"GBP to USD\" },\n { text: \"=\" },\n { text: \"3.28 USD per pip\", label: \"Pip value\" },\n ],\n ],\n resultText:\n \"This means that for every pip movement of EUR/GBP, your profit or loss (PnL) will change by USD 3.28.\",\n note: \"Note: These values are approximate and may vary based on the leverage set for your account and the specific asset being traded.\",\n};\n\nconst SWAP_POINTS_CONTENT: HowToContent = {\n title: \"How to calculate swap fees\",\n description: \"Use this formula to work out how much you'll pay or receive in swap fees when holding trades overnight.\",\n formulaHeading: \"Formula\",\n formulaBlocks: [\n { type: \"text\", content: \"Swap = Lots x Contract size x Point size* x Swap rate x QTE/USD**\" },\n {\n type: \"footnote\",\n content:\n \"*Point size = 10⁻digits (digits can be found in the instrument specification table in your trading terminal)\",\n },\n {\n type: \"footnote\",\n content:\n '**QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleHeading: \"Example\",\n exampleIntro:\n \"You hold a short position of 0.2 lots of AUD/JPY overnight that has a point size of 0.001 and a short swap rate of -12.92. The JPY to USD conversion rate is 0.00681.\",\n calculations: [\n [\n { text: \"0.2\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"100,000\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"0.001\", label: \"Point size\" },\n { text: \"x\" },\n { text: \"-12.92\", label: \"Swap rate\" },\n { text: \"x\" },\n { text: \"0.00681\", label: \"JPY to USD\" },\n { text: \"=\" },\n { text: \"-1.76 USD\", label: \"Swap\" },\n ],\n ],\n resultText: \"This means the swap charge is USD 1.76 to keep the position open overnight.\",\n note: \"Note: These are approximate values only and will differ depending on the leverage that is set for your account and the asset you want to trade.\",\n};\n\nconst SWAP_PERCENTAGE_CONTENT: HowToContent = {\n ...SWAP_POINTS_CONTENT,\n formulaBlocks: [\n { type: \"text\", content: \"Swap = (Lots x Contract size x Rollover price*) x (Swap rate ÷ 100) ÷ 360 x QTE/USD**\" },\n {\n type: \"footnote\",\n content:\n \"*Rollover price = The last price of the day before the swap is processed, typically at 20:59 or 21:59 GMT.\",\n },\n {\n type: \"footnote\",\n content:\n '**QTE/USD is the conversion rate from the quote currency (QTE), referred to as the \"Profit Currency\" in MT5, to USD.',\n },\n ],\n exampleIntro:\n \"You hold a long position of 0.2 lots of France 40 overnight, with a long swap rate of -5.46 and the rollover price is 7,654. The EUR to USD conversion rate is 1.10722.\",\n calculations: [\n [\n { text: \"[0.2\", label: \"Lots\" },\n { text: \"x\" },\n { text: \"1\", label: \"Contract size\" },\n { text: \"x\" },\n { text: \"7,654]\", label: \"Rollover price\" },\n { text: \"x\" },\n { text: \"(-5.46 ÷ 100)\", label: \"Swap rate\" },\n { text: \"÷ 360\" },\n { text: \"x\" },\n { text: \"1.10722\", label: \"EUR to USD\" },\n { text: \"=\" },\n { text: \"-0.26 USD\", label: \"Swap\" },\n ],\n ],\n resultText: \"This means the swap charge is USD -0.26 to keep the position open overnight.\",\n};\n\nconst SWAP_TABS: { id: SwapCalculationMode; label: string }[] = [\n { id: \"points\", label: \"Swap calculation (In points)\" },\n { id: \"percentage\", label: \"Swap calculation (In percentage)\" },\n];\n\n/** Which formula `variant`'s swap tab switch should start on. Non-swap variants ignore this. */\nconst swapModeForVariant = (variant: TradingCalculatorHowToVariant): SwapCalculationMode =>\n variant === \"swap-percentage\" ? \"percentage\" : \"points\";\n\n/* `useLayoutEffect` warns during SSR; fall back to `useEffect` there. Only\n * matters for the initial server-rendered markup — the shrink-to-fit effect\n * itself is inherently client-only (it measures real DOM boxes). */\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/* ── Formula column ───────────────────────────────────────────── */\n\nconst FormulaBlockView = ({ block }: { block: FormulaBlock }) => {\n if (block.type === \"footnote\") {\n return <p className=\"tchow-footnote\">{block.content}</p>;\n }\n if (block.type === \"bullets\") {\n return (\n <ul className=\"tchow-bullets\">\n {block.items.map((item) => (\n <li className=\"tchow-bulletItem\" key={item.term}>\n <strong>{item.term}:</strong> {item.content}\n </li>\n ))}\n </ul>\n );\n }\n return <p className=\"tchow-text\">{block.content}</p>;\n};\n\n/* A short vertical connector pointing straight down from a value to its\n * caption underneath, replacing a plain dot so the top-to-bottom link\n * reads as directional rather than decorative. */\nconst ConnectorArrow = () => (\n <svg width=\"8\" height=\"11\" viewBox=\"0 0 8 11\" fill=\"none\" aria-hidden=\"true\" className=\"tchow-stripArrow\">\n <path d=\"M4 0V7.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <path d=\"M1.4 5.6L4 8.6L6.6 5.6\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n/* ── Calculation strip ─────────────────────────────────────────\n * A single CSS Grid with `grid-auto-flow: column` and two explicit rows —\n * each token contributes a (value, caption) pair consecutively in the DOM,\n * so the grid auto-places them into the same column, guaranteeing the\n * connector arrow + label always lines up under its value with no manual\n * column bookkeeping.\n *\n * The strip must always render on one line — no wrapping, no horizontal\n * scrollbar — on every viewport, shrinking instead once it no longer fits.\n * `.tchow-strip` is sized to its own natural (unscaled) content width via\n * `display: inline-grid`, then a `ResizeObserver` compares that natural\n * width against the available width in `.tchow-stripWrap` and applies a\n * `transform: scale(...)` factor (≤ 1) so the whole box — background,\n * padding, text — shrinks uniformly and never overflows. The wrapper's\n * height is set to match the scaled box so it never leaves extra blank\n * space (a CSS `transform` never changes layout size, only paint size).\n */\nconst CalculationStrip = ({ tokens }: { tokens: CalculationToken[] }) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const stripRef = useRef<HTMLDivElement>(null);\n const [fit, setFit] = useState({ scale: 1, naturalHeight: 0 });\n\n useIsomorphicLayoutEffect(() => {\n const wrapper = wrapperRef.current;\n const strip = stripRef.current;\n if (!wrapper || !strip) return;\n\n const recompute = () => {\n const available = wrapper.clientWidth;\n const naturalWidth = strip.scrollWidth;\n const naturalHeight = strip.scrollHeight;\n if (!available || !naturalWidth) return;\n setFit({ scale: Math.min(1, available / naturalWidth), naturalHeight });\n };\n\n recompute();\n\n const observer = new ResizeObserver(recompute);\n observer.observe(wrapper);\n observer.observe(strip);\n\n // Web fonts finishing an async load after first paint can change the\n // strip's natural width; re-measure once they're ready too.\n if (typeof document !== \"undefined\" && document.fonts?.ready) {\n document.fonts.ready.then(recompute).catch(() => {});\n }\n\n return () => observer.disconnect();\n }, [tokens]);\n\n const isShrunk = fit.scale < 1;\n\n return (\n <div\n className=\"tchow-stripWrap\"\n ref={wrapperRef}\n style={isShrunk ? { height: fit.naturalHeight * fit.scale } : undefined}\n >\n <div\n className=\"tchow-strip\"\n ref={stripRef}\n style={isShrunk ? { transform: `scale(${fit.scale})` } : undefined}\n role=\"img\"\n aria-label={tokens.map((token) => token.text).join(\" \")}\n >\n {tokens.map((token, i) => (\n <Fragment key={i}>\n <span\n className={[\"tchow-stripValue\", token.label ? \"tchow-stripValue--labeled\" : \"\"]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <span\n className={[\n \"tchow-stripValueText\",\n token.label ? \"tchow-stripValueText--labeled\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {token.text}\n </span>\n </span>\n <span className=\"tchow-stripCaption\" aria-hidden=\"true\">\n {token.label && (\n <>\n <ConnectorArrow />\n <span\n className={[\n \"tchow-stripLabel\",\n i === 0 || i === tokens.length - 1 ? \"tchow-stripLabel--edge\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n <span className=\"tchow-stripLabelText\">{token.label}</span>\n </span>\n </>\n )}\n </span>\n </Fragment>\n ))}\n </div>\n </div>\n );\n};\n\n/* ── TradingCalculatorHowTo ───────────────────────────────────────\n * A \"How to calculate…\" explainer section: a centered title/description,\n * an optional interactive tab switch (swap only), and a two-column\n * \"Formula\" / \"Example\" card — modeled after the explainer sections on\n * deriv.com's margin/pip/swap calculator pages.\n *\n * Pairs naturally above or below `TradingCalculator` on the same page —\n * `TradingCalculator` is the live tool, this is the worked-example copy\n * explaining how its numbers are derived.\n */\nexport const TradingCalculatorHowTo = ({\n variant = \"margin\",\n title,\n description,\n className,\n ...props\n}: TradingCalculatorHowToProps) => {\n const isSwap = variant === \"swap-points\" || variant === \"swap-percentage\";\n const [swapTab, setSwapTab] = useState<SwapCalculationMode>(() => swapModeForVariant(variant));\n\n // Keep the tab switch in sync if a consumer changes `variant` after mount\n // (e.g. a Storybook control) — the tabs still stay independently\n // clickable afterwards, this only resets which one starts active.\n useEffect(() => {\n setSwapTab(swapModeForVariant(variant));\n }, [variant]);\n\n const content: HowToContent =\n variant === \"pip\"\n ? PIP_CONTENT\n : isSwap\n ? swapTab === \"percentage\"\n ? SWAP_PERCENTAGE_CONTENT\n : SWAP_POINTS_CONTENT\n : MARGIN_CONTENT;\n\n const heading = title ?? content.title;\n const desc = description ?? content.description;\n\n return (\n <section className={[\"tchow-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"tchow-container\">\n <div className=\"tchow-intro\">\n <h2 className=\"tchow-title\">{heading}</h2>\n {desc && <p className=\"tchow-description\">{desc}</p>}\n </div>\n\n {isSwap && (\n <Tabs\n className=\"tchow-tabs\"\n items={SWAP_TABS}\n activeId={swapTab}\n onChange={(id) => setSwapTab(id as SwapCalculationMode)}\n />\n )}\n\n <div className=\"tchow-card\">\n <div className=\"tchow-column\">\n <h3 className=\"tchow-columnTitle\">{content.formulaHeading}</h3>\n {content.formulaBlocks.map((block, i) => (\n <FormulaBlockView block={block} key={i} />\n ))}\n </div>\n\n <div className=\"tchow-column\">\n <h3 className=\"tchow-columnTitle\">{content.exampleHeading}</h3>\n <p className=\"tchow-text\">{content.exampleIntro}</p>\n {content.exampleLead && <p className=\"tchow-text\">{content.exampleLead}</p>}\n\n {content.calculations.map((strip, i) => (\n <CalculationStrip key={i} tokens={strip} />\n ))}\n\n <p className=\"tchow-text\">{content.resultText}</p>\n <p className=\"tchow-note\">{content.note}</p>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default TradingCalculatorHowTo;\n","import {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n} from \"react\";\nimport { Button } from \"../../components/Button\";\nimport { TextField } from \"../../components/TextField\";\nimport {\n convertAmounts,\n currenciesForSide,\n formatPct,\n formatPrice,\n useCryptoMarketData,\n type MarketRow,\n type TradeSide,\n} from \"../cryptoMarketData\";\nimport type { CryptoTradeConverterProps } from \"./CryptoTradeConverter.types\";\nimport \"./CryptoTradeConverter.css\";\n\nexport const DEFAULT_TRADE_HREF = \"https://deriv.exchange\";\n\nfunction matchPair(rows: MarketRow[], defaultPair?: string): MarketRow | null {\n if (!rows.length) return null;\n if (!defaultPair) {\n return (\n rows.find((r) => r.base === \"BTC\" && r.quote === \"USDT\") ??\n rows.find((r) => r.quote === \"USDT\") ??\n rows[0] ??\n null\n );\n }\n const needle = defaultPair.trim().toLowerCase();\n return (\n rows.find((r) => r.id === needle) ??\n rows.find((r) => r.name.toLowerCase() === needle) ??\n rows.find((r) => r.name.replace(\"/\", \"\").toLowerCase() === needle.replace(\"/\", \"\")) ??\n rows[0] ??\n null\n );\n}\n\nfunction CoinAvatar({ base, icon, label }: { base: string; icon: string; label: string }) {\n const [failed, setFailed] = useState(false);\n if (failed) {\n return (\n <span className=\"ctc-avatar ctc-avatar--fallback\" aria-hidden=\"true\">\n {base.slice(0, 3)}\n </span>\n );\n }\n return (\n <img\n className=\"ctc-avatar\"\n src={icon}\n alt=\"\"\n width={32}\n height={32}\n loading=\"lazy\"\n decoding=\"async\"\n onError={() => setFailed(true)}\n data-label={label}\n />\n );\n}\n\nexport const CryptoTradeConverter = ({\n variant: _variant = \"default\",\n market: _market = \"spot\",\n defaultPair,\n tradeHref = DEFAULT_TRADE_HREF,\n apiOrigin,\n className,\n}: CryptoTradeConverterProps) => {\n const reactId = useId().replace(/:/g, \"\");\n const listboxId = `ctc-listbox-${reactId}`;\n const payId = `ctc-pay-${reactId}`;\n const receiveId = `ctc-receive-${reactId}`;\n const statusId = `ctc-status-${reactId}`;\n\n const snapshot = useCryptoMarketData({ kind: \"spot\", kline: false, apiOrigin });\n const rows = useMemo(() => [...snapshot.rows.values()], [snapshot.rows]);\n\n const [side, setSide] = useState<TradeSide>(\"buy\");\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [pay, setPay] = useState(\"\");\n const [receive, setReceive] = useState(\"\");\n const [edited, setEdited] = useState<\"pay\" | \"receive\">(\"pay\");\n const [pickerOpen, setPickerOpen] = useState(false);\n const [activeOption, setActiveOption] = useState(0);\n\n const rootRef = useRef<HTMLElement>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n\n const selected =\n (selectedId ? rows.find((r) => r.id === selectedId) : null) ?? matchPair(rows, defaultPair);\n\n useEffect(() => {\n if (!selectedId && selected) setSelectedId(selected.id);\n }, [selected, selectedId]);\n\n const conversion = useMemo(\n () =>\n convertAmounts({\n side,\n price: selected?.last ?? null,\n payInput: pay,\n receiveInput: receive,\n edited,\n }),\n [side, selected?.last, pay, receive, edited],\n );\n\n useEffect(() => {\n if (edited === \"pay\") setReceive(conversion.receive);\n else setPay(conversion.pay);\n }, [conversion.pay, conversion.receive, edited]);\n\n const labels = currenciesForSide(side, selected?.base ?? \"—\", selected?.quote ?? \"—\");\n\n const closePicker = useCallback(() => {\n setPickerOpen(false);\n buttonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!pickerOpen) return;\n const onDoc = (event: MouseEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setPickerOpen(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n closePicker();\n }\n };\n document.addEventListener(\"mousedown\", onDoc);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDoc);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [pickerOpen, closePicker]);\n\n const sortedRows = useMemo(\n () => [...rows].sort((a, b) => a.name.localeCompare(b.name)),\n [rows],\n );\n\n const onPickerKeyDown = (event: ReactKeyboardEvent) => {\n if (!sortedRows.length) return;\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setActiveOption((i) => (i + 1) % sortedRows.length);\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActiveOption((i) => (i - 1 + sortedRows.length) % sortedRows.length);\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setActiveOption(0);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setActiveOption(sortedRows.length - 1);\n } else if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n const row = sortedRows[activeOption];\n if (row) {\n setSelectedId(row.id);\n closePicker();\n }\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n closePicker();\n }\n };\n\n useEffect(() => {\n if (!pickerOpen) return;\n listRef.current?.querySelectorAll<HTMLElement>('[role=\"option\"]')[activeOption]?.scrollIntoView({\n block: \"nearest\",\n });\n }, [activeOption, pickerOpen]);\n\n const statusTone =\n snapshot.status === \"live\"\n ? \"live\"\n : snapshot.status === \"reconnecting\" || snapshot.status === \"stale\"\n ? \"warn\"\n : snapshot.status === \"error\" || snapshot.status === \"unsupported\"\n ? \"error\"\n : \"muted\";\n\n const priceReady = selected?.last != null && Number.isFinite(selected.last) && selected.last > 0;\n const ctaDisabled =\n !priceReady ||\n snapshot.status === \"unsupported\" ||\n snapshot.status === \"error\" ||\n !conversion.valid;\n\n const changeClass =\n selected?.change24hPct == null\n ? \"\"\n : selected.change24hPct >= 0\n ? \"ctc-change--up\"\n : \"ctc-change--down\";\n\n return (\n <section\n ref={rootRef}\n className={[\"ctc-section\", className].filter(Boolean).join(\" \")}\n data-variant={_variant}\n data-market={_market}\n aria-labelledby={`ctc-heading-${reactId}`}\n >\n <div className=\"ctc-container\">\n <header className=\"ctc-header\">\n <h2 id={`ctc-heading-${reactId}`} className=\"ctc-title\">\n Buy and sell in seconds\n </h2>\n <p className=\"ctc-subtitle\">\n Choose your asset, enter an amount, and confirm. Your crypto lands in your account\n instantly, ready to trade, hold, or withdraw whenever you want.\n </p>\n </header>\n\n <div className=\"ctc-card\">\n <div className={`ctc-status ctc-status--${statusTone}`} id={statusId} role=\"status\" aria-live=\"polite\">\n <span className=\"ctc-status-dot\" aria-hidden=\"true\" />\n <span>\n {snapshot.status === \"idle\" || snapshot.status === \"connecting\"\n ? \"Connecting to live prices…\"\n : snapshot.statusMessage ||\n (priceReady ? \"Live prices\" : \"Waiting for live price…\")}\n </span>\n </div>\n\n <div className=\"ctc-seg\" role=\"group\" aria-label=\"Trade side\">\n <button\n type=\"button\"\n className={side === \"buy\" ? \"ctc-seg__btn is-active is-buy\" : \"ctc-seg__btn is-buy\"}\n aria-pressed={side === \"buy\"}\n onClick={() => setSide(\"buy\")}\n >\n Buy\n </button>\n <button\n type=\"button\"\n className={side === \"sell\" ? \"ctc-seg__btn is-active is-sell\" : \"ctc-seg__btn is-sell\"}\n aria-pressed={side === \"sell\"}\n onClick={() => setSide(\"sell\")}\n >\n Sell\n </button>\n </div>\n\n <div className=\"ctc-pair\">\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"ctc-pair__button\"\n aria-haspopup=\"listbox\"\n aria-expanded={pickerOpen}\n aria-controls={listboxId}\n aria-describedby={statusId}\n disabled={!sortedRows.length}\n onClick={() => {\n if (!sortedRows.length) return;\n setPickerOpen((open) => !open);\n if (selected) {\n const idx = sortedRows.findIndex((r) => r.id === selected.id);\n setActiveOption(idx >= 0 ? idx : 0);\n }\n }}\n onKeyDown={(event) => {\n if ((event.key === \"ArrowDown\" || event.key === \"Enter\") && !pickerOpen) {\n event.preventDefault();\n setPickerOpen(true);\n }\n }}\n >\n {selected ? (\n <>\n <CoinAvatar base={selected.base} icon={selected.icon} label={selected.name} />\n <span className=\"ctc-pair__meta\">\n <span className=\"ctc-pair__name\">{selected.name}</span>\n <span className=\"ctc-pair__price\">\n {formatPrice(selected.last, selected.pricePrecision)}{\" \"}\n <span className={[\"ctc-change\", changeClass].filter(Boolean).join(\" \")}>\n {formatPct(selected.change24hPct)} (24h)\n </span>\n </span>\n </span>\n </>\n ) : (\n <span className=\"ctc-pair__meta\">\n <span className=\"ctc-pair__name\">Select a market</span>\n <span className=\"ctc-pair__price\">—</span>\n </span>\n )}\n <span className=\"ctc-pair__chevron\" aria-hidden=\"true\">\n ▾\n </span>\n </button>\n\n {pickerOpen ? (\n <ul\n ref={listRef}\n id={listboxId}\n className=\"ctc-listbox\"\n role=\"listbox\"\n aria-label=\"Market pairs\"\n tabIndex={-1}\n onKeyDown={onPickerKeyDown}\n >\n {sortedRows.map((row, index) => {\n const selectedOption = selected?.id === row.id;\n const active = index === activeOption;\n const rowChange =\n row.change24hPct == null\n ? \"\"\n : row.change24hPct >= 0\n ? \"ctc-change--up\"\n : \"ctc-change--down\";\n return (\n <li\n key={row.id}\n id={`${listboxId}-opt-${index}`}\n role=\"option\"\n aria-selected={selectedOption}\n className={[\n \"ctc-option\",\n active ? \"is-active\" : \"\",\n selectedOption ? \"is-selected\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onMouseEnter={() => setActiveOption(index)}\n onClick={() => {\n setSelectedId(row.id);\n closePicker();\n }}\n >\n <CoinAvatar base={row.base} icon={row.icon} label={row.name} />\n <span className=\"ctc-option__text\">\n <span className=\"ctc-option__name\">{row.name}</span>\n <span className=\"ctc-option__sub\">{row.longName}</span>\n </span>\n <span className=\"ctc-option__stats\">\n <span>{formatPrice(row.last, row.pricePrecision)}</span>\n <span className={[\"ctc-change\", rowChange].filter(Boolean).join(\" \")}>\n {formatPct(row.change24hPct)}\n </span>\n </span>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n\n <div className=\"ctc-fields\">\n <TextField\n id={payId}\n label={`You pay (${labels.pay})`}\n inputMode=\"decimal\"\n autoComplete=\"off\"\n placeholder=\"0.00\"\n value={edited === \"pay\" ? pay : conversion.pay}\n status={conversion.error ? \"fail\" : \"neutral\"}\n aria-invalid={Boolean(conversion.error)}\n aria-describedby={statusId}\n onChange={(event) => {\n setEdited(\"pay\");\n setPay(event.target.value);\n }}\n />\n <TextField\n id={receiveId}\n label={`You receive (${labels.receive})`}\n inputMode=\"decimal\"\n autoComplete=\"off\"\n placeholder=\"0.00\"\n value={edited === \"receive\" ? receive : conversion.receive}\n status={conversion.error ? \"fail\" : \"neutral\"}\n aria-invalid={Boolean(conversion.error)}\n aria-describedby={\n priceReady && selected\n ? `ctc-rate-${reactId}`\n : statusId\n }\n onChange={(event) => {\n setEdited(\"receive\");\n setReceive(event.target.value);\n }}\n />\n </div>\n\n {priceReady && selected ? (\n <p id={`ctc-rate-${reactId}`} className=\"ctc-rate\">\n Estimate at 1 {selected.base} = {formatPrice(selected.last, selected.pricePrecision)}{\" \"}\n {selected.quote}. Fees and spread excluded.\n </p>\n ) : (\n <p className=\"ctc-rate\" role=\"status\">\n {snapshot.status === \"unsupported\"\n ? \"Please use a current browser to view live prices.\"\n : conversion.error || \"Waiting for a live market price…\"}\n </p>\n )}\n\n {conversion.error ? (\n <p className=\"ctc-error\" role=\"alert\">\n {conversion.error}\n </p>\n ) : null}\n\n <div className=\"ctc-cta\">\n {ctaDisabled ? (\n <Button\n type=\"button\"\n colorScheme=\"coral\"\n variant=\"primary\"\n fullWidth\n label={side === \"buy\" ? \"Buy\" : \"Sell\"}\n disabled\n aria-disabled=\"true\"\n />\n ) : (\n <a className=\"ctc-cta-link\" href={tradeHref} rel=\"noopener noreferrer\">\n <Button\n type=\"button\"\n colorScheme=\"coral\"\n variant=\"primary\"\n fullWidth\n label={side === \"buy\" ? \"Buy\" : \"Sell\"}\n tabIndex={-1}\n />\n </a>\n )}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default CryptoTradeConverter;\n","/**\n * HTTPS/WSS origin allowlist for Deriv Crypto Exchange public market data.\n * WebSocket URLs must come from validated REST metadata and still match this list.\n */\n\nexport const DEFAULT_API_ORIGIN = \"https://deriv.exchange\";\n\nconst ALLOWED_HTTPS_ORIGINS = new Set([\n \"https://deriv.exchange\",\n \"https://www.deriv.exchange\",\n]);\n\nconst ALLOWED_WSS_ORIGINS = new Set([\n \"wss://ws.deriv.exchange\",\n \"wss://futuresws.deriv.exchange\",\n]);\n\n/** Coin / asset icon hosts used by the public exchange metadata. */\nconst ALLOWED_ICON_HTTPS_ORIGINS = new Set([\n \"https://cdn.jsdelivr.net\",\n \"https://d20bat4c5k8cil.cloudfront.net\",\n \"https://d1bv9t3fnouri2.cloudfront.net\",\n \"https://saas-futures.oss-cn-hongkong.aliyuncs.com\",\n]);\n\nfunction parseOrigin(url: string): URL | null {\n try {\n return new URL(url);\n } catch {\n return null;\n }\n}\n\nexport function isAllowedApiOrigin(origin: string): boolean {\n const parsed = parseOrigin(origin);\n if (!parsed) return false;\n if (parsed.protocol !== \"https:\") return false;\n if (parsed.username || parsed.password) return false;\n if (parsed.pathname !== \"/\" && parsed.pathname !== \"\") return false;\n if (parsed.search || parsed.hash) return false;\n return ALLOWED_HTTPS_ORIGINS.has(`${parsed.protocol}//${parsed.host}`);\n}\n\nexport function resolveApiOrigin(candidate?: string | null): string {\n const origin = (candidate ?? DEFAULT_API_ORIGIN).trim().replace(/\\/$/, \"\");\n if (!isAllowedApiOrigin(origin)) {\n throw new Error(\"apiOrigin is not an allowlisted HTTPS origin\");\n }\n return origin;\n}\n\nexport function isAllowedWsUrl(wsUrl: string): boolean {\n const parsed = parseOrigin(wsUrl);\n if (!parsed) return false;\n if (parsed.protocol !== \"wss:\") return false;\n if (parsed.username || parsed.password) return false;\n return ALLOWED_WSS_ORIGINS.has(`${parsed.protocol}//${parsed.host}`);\n}\n\nexport function isAllowedIconUrl(url: string): boolean {\n const parsed = parseOrigin(url);\n if (!parsed) return false;\n if (parsed.protocol !== \"https:\") return false;\n if (parsed.username || parsed.password) return false;\n return ALLOWED_ICON_HTTPS_ORIGINS.has(`${parsed.protocol}//${parsed.host}`);\n}\n\nexport function coinIconUrl(base: string): string {\n const symbol = String(base || \"\")\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"\");\n return `https://cdn.jsdelivr.net/npm/cryptocurrency-icons@0.18.1/svg/color/${encodeURIComponent(symbol || \"generic\")}.svg`;\n}\n","/** Lightweight runtime schemas for public exchange REST/WS payloads. */\n\nimport type { CoinInfo, DiscoveredMarkets, MarketKind, MarketMeta } from \"./types.ts\";\nimport { coinIconUrl, isAllowedWsUrl } from \"./origins.ts\";\n\nconst FALLBACK_LONG_NAMES: Record<string, string> = {\n BTC: \"Bitcoin\",\n ETH: \"Ethereum\",\n BNB: \"BNB\",\n SOL: \"Solana\",\n LTC: \"Litecoin\",\n LINK: \"Chainlink\",\n AVAX: \"Avalanche\",\n XRP: \"XRP\",\n DOT: \"Polkadot\",\n TRX: \"TRON\",\n ADA: \"Cardano\",\n DOGE: \"Dogecoin\",\n USDT: \"USDT\",\n USDC: \"USDC\",\n POL: \"Polygon\",\n WBTC: \"Wrapped BTC\",\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function asFiniteNumber(value: unknown): number | null {\n const n = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n return Number.isFinite(n) ? n : null;\n}\n\nfunction stripTrailingDigits(value: string): string {\n return value.replace(/\\d+$/, \"\");\n}\n\nfunction requireSuccessCode(payload: Record<string, unknown>, label: string): void {\n if (String(payload.code) !== \"0\") {\n throw new Error(`${label} failed: ${String(payload.code)} ${String(payload.msg ?? \"\")}`.trim());\n }\n}\n\nexport function parseCoinList(raw: unknown): Record<string, CoinInfo> {\n const out: Record<string, CoinInfo> = {};\n if (!isRecord(raw)) return out;\n for (const entry of Object.values(raw)) {\n if (!isRecord(entry)) continue;\n const showName = String(entry.showName ?? \"\")\n .trim()\n .toUpperCase();\n if (!showName) continue;\n out[showName] = {\n icon: coinIconUrl(showName),\n longName: String(entry.longName ?? entry.showName ?? showName),\n };\n }\n return out;\n}\n\nexport function parseSpotMarketMeta(marketPayload: unknown): Record<string, MarketMeta> {\n if (!isRecord(marketPayload)) throw new Error(\"spot market payload is not an object\");\n const nested = isRecord(marketPayload.market) ? marketPayload.market : {};\n const out: Record<string, MarketMeta> = {};\n\n for (const [quoteKey, quoteBucket] of Object.entries(nested)) {\n if (!isRecord(quoteBucket)) continue;\n for (const pair of Object.values(quoteBucket)) {\n if (!isRecord(pair)) continue;\n if (pair.isShow === 0 || pair.isShow === \"0\") continue;\n const id = String(pair.symbol ?? \"\")\n .trim()\n .toLowerCase();\n if (!id) continue;\n const showName = String(pair.showName ?? \"\").trim();\n const nameParts = String(pair.name ?? \"\").split(\"/\");\n const display =\n showName ||\n `${stripTrailingDigits(nameParts[0] ?? \"\")}/${stripTrailingDigits(nameParts[1] ?? quoteKey)}`;\n const [baseRaw, quoteRaw] = display.split(\"/\");\n const base = (baseRaw ?? \"\").trim();\n const quote = (quoteRaw ?? stripTrailingDigits(quoteKey)).trim().toUpperCase();\n if (!base || !quote) continue;\n out[id] = {\n id,\n name: `${base}/${quote}`,\n base,\n quote,\n pricePrecision: asFiniteNumber(pair.price) ?? 6,\n };\n }\n }\n return out;\n}\n\nexport function parseFuturesContractMeta(contractList: unknown): Record<string, MarketMeta> {\n if (!Array.isArray(contractList)) throw new Error(\"futures contractList is not an array\");\n const out: Record<string, MarketMeta> = {};\n for (const entry of contractList) {\n if (!isRecord(entry)) continue;\n const symbol = String(entry.symbol ?? \"\").trim();\n if (!symbol) continue;\n const [base, quoteRaw] = symbol.split(\"-\");\n const quote = (quoteRaw ?? \"\").toUpperCase();\n if (!base || !quote) continue;\n const id = symbol.replace(/-/g, \"\").toLowerCase();\n const precision =\n isRecord(entry.coinResultVo) && asFiniteNumber(entry.coinResultVo.symbolPricePrecision) != null\n ? (asFiniteNumber(entry.coinResultVo.symbolPricePrecision) as number)\n : 6;\n out[id] = {\n id,\n name: `${base}/${quote}`,\n base,\n quote,\n pricePrecision: precision,\n };\n }\n return out;\n}\n\nexport function parseSpotPublicInfo(payload: unknown, kind: MarketKind = \"spot\"): DiscoveredMarkets {\n if (!isRecord(payload)) throw new Error(\"spot public_info_market response is not an object\");\n requireSuccessCode(payload, \"public_info_market\");\n if (!isRecord(payload.data) || !isRecord(payload.data.market)) {\n throw new Error(\"spot public_info_market missing data.market\");\n }\n const market = payload.data.market;\n const wsUrl = String(market.wsUrl ?? \"\");\n if (!isAllowedWsUrl(wsUrl)) {\n throw new Error(\"spot wsUrl is missing or not allowlisted\");\n }\n return {\n kind,\n wsUrl,\n meta: parseSpotMarketMeta(market),\n coins: parseCoinList(market.coinList),\n };\n}\n\nexport function parseFuturesPublicInfo(payload: unknown, kind: MarketKind = \"futures\"): DiscoveredMarkets {\n if (!isRecord(payload)) throw new Error(\"futures public_info response is not an object\");\n requireSuccessCode(payload, \"futures public_info\");\n if (!isRecord(payload.data)) throw new Error(\"futures public_info missing data\");\n const wsUrl = String(payload.data.wsUrl ?? \"\");\n if (!isAllowedWsUrl(wsUrl)) {\n throw new Error(\"futures wsUrl is missing or not allowlisted\");\n }\n return {\n kind,\n wsUrl,\n meta: parseFuturesContractMeta(payload.data.contractList),\n coins: parseCoinList(payload.data.coinList),\n };\n}\n\nexport function enrichRowIdentity(\n meta: MarketMeta,\n coins: Record<string, CoinInfo>,\n): Pick<import(\"./types\").MarketRow, \"longName\" | \"icon\"> {\n const coin = coins[meta.base.toUpperCase()];\n return {\n longName: coin?.longName || FALLBACK_LONG_NAMES[meta.base.toUpperCase()] || meta.base,\n icon: coin?.icon || coinIconUrl(meta.base),\n };\n}\n\nexport function pctChange(current: number, previous: number): number | null {\n if (!Number.isFinite(current) || !Number.isFinite(previous) || previous === 0) return null;\n return ((current - previous) / previous) * 100;\n}\n\nexport function parseTickerTick(tick: unknown): {\n close: number | null;\n rosePct: number | null;\n vol: number | null;\n} {\n if (!isRecord(tick)) return { close: null, rosePct: null, vol: null };\n const rose = asFiniteNumber(tick.rose);\n return {\n close: asFiniteNumber(tick.close),\n rosePct: rose == null ? null : rose * 100,\n vol: asFiniteNumber(tick.vol),\n };\n}\n\nexport function parseKlineBars(payload: unknown): Array<{ t: number; close: number }> {\n if (!isRecord(payload)) return [];\n const raw = Array.isArray(payload.data) ? payload.data : payload.tick ? [payload.tick] : [];\n const bars: Array<{ t: number; close: number }> = [];\n for (const item of raw) {\n if (!isRecord(item)) continue;\n let t = asFiniteNumber(item.id);\n const close = asFiniteNumber(item.close);\n if (t == null || close == null) continue;\n if (t > 1e12) t /= 1000;\n bars.push({ t, close });\n }\n return bars;\n}\n\nexport function channelSymbol(channel: string, kind: \"ticker\" | \"kline\"): string | null {\n const re =\n kind === \"ticker\" ? /^market_(.+)_ticker$/ : /^market_(.+)_kline_/;\n const match = re.exec(channel);\n return match?.[1] ?? null;\n}\n\nexport function resolveMetaId(\n key: string,\n meta: Record<string, MarketMeta>,\n): { id: string; meta: MarketMeta } | null {\n if (meta[key]) return { id: key, meta: meta[key] };\n const tail = String(key).split(\"_\").pop() ?? \"\";\n if (tail && meta[tail]) return { id: tail, meta: meta[tail] };\n return null;\n}\n","/** REST discovery for spot/futures public market metadata. */\n\nimport { resolveApiOrigin } from \"./origins.ts\";\nimport { parseFuturesPublicInfo, parseSpotPublicInfo } from \"./schemas.ts\";\nimport type { DiscoveredMarkets, MarketKind } from \"./types.ts\";\n\nexport const SPOT_PUBLIC_INFO_PATH = \"/fe-ex-api/common/public_info_market\";\nexport const FUTURES_PUBLIC_INFO_PATH = \"/fe-co-api/common/public_info\";\n\nfunction uaTime(): string {\n return new Date().toISOString().slice(0, 19).replace(\"T\", \" \");\n}\n\nexport async function fetchJson(\n url: string,\n init: RequestInit,\n options: { fetchImpl?: typeof fetch; timeoutMs?: number } = {},\n): Promise<unknown> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const timeoutMs = options.timeoutMs ?? 15_000;\n const controller = new AbortController();\n const external = init.signal;\n const onAbort = () => controller.abort();\n if (external) {\n if (external.aborted) controller.abort();\n else external.addEventListener(\"abort\", onAbort, { once: true });\n }\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetchImpl(url, {\n ...init,\n credentials: \"omit\",\n signal: controller.signal,\n });\n if (!response.ok) {\n throw new Error(`Market API returned HTTP ${response.status}`);\n }\n return await response.json();\n } finally {\n clearTimeout(timer);\n external?.removeEventListener(\"abort\", onAbort);\n }\n}\n\nexport async function discoverMarkets(\n kind: MarketKind,\n options: {\n apiOrigin?: string;\n fetchImpl?: typeof fetch;\n timeoutMs?: number;\n signal?: AbortSignal;\n } = {},\n): Promise<DiscoveredMarkets> {\n const origin = resolveApiOrigin(options.apiOrigin);\n\n if (kind === \"futures\") {\n const payload = await fetchJson(\n `${origin}${FUTURES_PUBLIC_INFO_PATH}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"exchange-client\": \"pc\",\n \"futures-version\": \"101\",\n \"exchange-language\": \"en_US\",\n },\n body: JSON.stringify({ uaTime: uaTime() }),\n signal: options.signal,\n },\n { fetchImpl: options.fetchImpl, timeoutMs: options.timeoutMs },\n );\n return parseFuturesPublicInfo(payload, \"futures\");\n }\n\n const payload = await fetchJson(\n `${origin}${SPOT_PUBLIC_INFO_PATH}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n signal: options.signal,\n },\n { fetchImpl: options.fetchImpl, timeoutMs: options.timeoutMs },\n );\n return parseSpotPublicInfo(payload, \"spot\");\n}\n\nexport function browserSupportsMarketStreaming(): boolean {\n return (\n typeof WebSocket !== \"undefined\" &&\n typeof DecompressionStream !== \"undefined\" &&\n typeof TextDecoder !== \"undefined\"\n );\n}\n","/** Buy/sell conversion helpers for CryptoTradeConverter. */\n\nexport type TradeSide = \"buy\" | \"sell\";\n\nexport function convertAmounts(options: {\n side: TradeSide;\n price: number | null;\n payInput: string;\n receiveInput: string;\n edited: \"pay\" | \"receive\";\n}): { pay: string; receive: string; valid: boolean; error: string | null } {\n const price = options.price;\n if (price == null || !Number.isFinite(price) || price <= 0) {\n return { pay: options.payInput, receive: options.receiveInput, valid: false, error: \"Waiting for a live price\" };\n }\n\n const source = options.edited === \"pay\" ? options.payInput : options.receiveInput;\n const trimmed = source.trim();\n if (!trimmed) {\n return { pay: options.edited === \"pay\" ? \"\" : options.payInput, receive: options.edited === \"receive\" ? \"\" : options.receiveInput, valid: false, error: null };\n }\n\n const amount = Number(trimmed.replace(/,/g, \"\"));\n if (!Number.isFinite(amount) || amount < 0) {\n return {\n pay: options.payInput,\n receive: options.receiveInput,\n valid: false,\n error: \"Enter a valid amount\",\n };\n }\n\n if (options.side === \"buy\") {\n // Pay quote → receive base\n if (options.edited === \"pay\") {\n const receive = amount / price;\n return { pay: trimmed, receive: formatAmount(receive), valid: amount > 0, error: null };\n }\n const pay = amount * price;\n return { pay: formatAmount(pay), receive: trimmed, valid: amount > 0, error: null };\n }\n\n // Sell: pay base → receive quote\n if (options.edited === \"pay\") {\n const receive = amount * price;\n return { pay: trimmed, receive: formatAmount(receive), valid: amount > 0, error: null };\n }\n const pay = amount / price;\n return { pay: formatAmount(pay), receive: trimmed, valid: amount > 0, error: null };\n}\n\nexport function formatAmount(value: number, maxFractionDigits = 8): string {\n if (!Number.isFinite(value)) return \"\";\n if (value === 0) return \"0\";\n const fixed = value.toFixed(maxFractionDigits).replace(/\\.?0+$/, \"\");\n return fixed;\n}\n\nexport function formatPrice(value: number | null, precision = 2): string {\n if (value == null || !Number.isFinite(value)) return \"—\";\n const digits = Math.max(0, Math.min(Number.isFinite(precision) ? precision : 2, 8));\n return value.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: digits,\n });\n}\n\nexport function formatPct(value: number | null): string {\n if (value == null || !Number.isFinite(value)) return \"—\";\n const sign = value >= 0 ? \"+\" : \"\";\n return `${sign}${value.toFixed(2)}%`;\n}\n\nexport function currenciesForSide(\n side: TradeSide,\n base: string,\n quote: string,\n): { pay: string; receive: string } {\n return side === \"buy\" ? { pay: quote, receive: base } : { pay: base, receive: quote };\n}\n","/**\n * Public market WebSocket feed (ticker + optional hourly klines).\n * wsUrl must already be allowlisted via REST discovery validation.\n */\n\nimport {\n asFiniteNumber,\n channelSymbol,\n enrichRowIdentity,\n isRecord,\n parseKlineBars,\n parseTickerTick,\n pctChange,\n resolveMetaId,\n} from \"./schemas.ts\";\nimport { isAllowedWsUrl } from \"./origins.ts\";\nimport type { CoinInfo, ConnectionStatus, DiscoveredMarkets, MarketMeta, MarketRow } from \"./types.ts\";\n\nconst KLINE_PAGE_SIZE = 169;\nconst STALE_CHECK_MS = 5_000;\n\nexport interface FeedHandlers {\n onRow: (row: MarketRow) => void;\n onStatus: (status: ConnectionStatus, message: string) => void;\n}\n\nexport interface MarketFeed {\n enableHistory: () => void;\n close: () => void;\n}\n\nasync function decodeMessage(data: unknown): Promise<unknown> {\n if (typeof data === \"string\") return JSON.parse(data);\n if (data instanceof ArrayBuffer) {\n const bytes = new Uint8Array(data);\n if (bytes[0] === 31 && bytes[1] === 139) {\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream(\"gzip\"));\n return JSON.parse(await new Response(stream).text());\n }\n return JSON.parse(new TextDecoder().decode(bytes));\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n const buffer = await data.arrayBuffer();\n return decodeMessage(buffer);\n }\n throw new Error(\"Unsupported WebSocket message type\");\n}\n\nfunction emptyRow(meta: MarketMeta, coins: Record<string, CoinInfo>): MarketRow {\n const identity = enrichRowIdentity(meta, coins);\n return {\n ...meta,\n ...identity,\n last: null,\n change1hPct: null,\n change24hPct: null,\n change7dPct: null,\n spark7d: [],\n volume24h: null,\n updatedAt: null,\n };\n}\n\nfunction applyBars(row: MarketRow): void {\n const closes = (row as MarketRow & { _bars?: Array<{ t: number; close: number }> })._bars?.map(\n (b) => b.close,\n );\n if (!closes?.length) return;\n row.spark7d = closes;\n const last = row.last ?? closes[closes.length - 1]!;\n row.change1hPct = closes.length >= 2 ? pctChange(last, closes[closes.length - 2]!) : null;\n row.change7dPct = closes.length >= KLINE_PAGE_SIZE ? pctChange(last, closes[0]!) : null;\n if (row.change24hPct == null) {\n row.change24hPct = closes.length >= 25 ? pctChange(last, closes[closes.length - 25]!) : null;\n }\n if (row.last == null) row.last = closes[closes.length - 1]!;\n}\n\nfunction secureJitterMs(max = 500): number {\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n const buf = new Uint32Array(1);\n crypto.getRandomValues(buf);\n return buf[0]! % (max + 1);\n }\n return 0;\n}\n\nexport function createMarketFeed(\n discovered: DiscoveredMarkets,\n handlers: FeedHandlers,\n options: {\n kline?: boolean;\n WebSocketImpl?: typeof WebSocket;\n staleAfterMs?: number;\n } = {},\n): MarketFeed {\n if (!isAllowedWsUrl(discovered.wsUrl)) {\n handlers.onStatus(\"error\", \"WebSocket URL is not allowlisted\");\n return { enableHistory() {}, close() {} };\n }\n\n const WebSocketImpl = options.WebSocketImpl ?? WebSocket;\n const staleAfterMs = options.staleAfterMs ?? 45_000;\n const meta = discovered.meta;\n const coins = discovered.coins;\n const rows = new Map<string, MarketRow & { _bars?: Array<{ t: number; close: number }> }>();\n\n let klineEnabled = options.kline !== false;\n let closed = false;\n let socket: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let staleTimer: ReturnType<typeof setInterval> | null = null;\n let lastMessageAt = Date.now();\n let attempt = 0;\n const tickerSubscribed = new Set<string>();\n const klineSubscribed = new Set<string>();\n\n const ensureRow = (id: string, marketMeta: MarketMeta) => {\n let row = rows.get(id);\n if (!row) {\n row = emptyRow(marketMeta, coins);\n rows.set(id, row);\n }\n return row;\n };\n\n const send = (payload: unknown) => {\n if (socket?.readyState === WebSocketImpl.OPEN) {\n socket.send(JSON.stringify(payload));\n }\n };\n\n const subscribeTicker = (id: string) => {\n if (tickerSubscribed.has(id)) return;\n tickerSubscribed.add(id);\n send({ event: \"sub\", params: { channel: `market_${id}_ticker`, cb_id: id } });\n };\n\n const subscribeKline = (id: string) => {\n if (!klineEnabled || klineSubscribed.has(id)) return;\n klineSubscribed.add(id);\n const channel = `market_${id}_kline_60min`;\n send({\n event: \"req\",\n params: {\n channel,\n cb_id: id,\n endIdx: Math.floor(Date.now() / 1000),\n pageSize: KLINE_PAGE_SIZE,\n },\n });\n send({ event: \"sub\", params: { channel, cb_id: id } });\n };\n\n const emitRow = (row: MarketRow) => {\n row.updatedAt = Date.now();\n handlers.onRow({ ...row, spark7d: [...row.spark7d] });\n };\n\n const applyTick = (id: string, marketMeta: MarketMeta, tick: unknown) => {\n const row = ensureRow(id, marketMeta);\n const parsed = parseTickerTick(tick);\n if (parsed.close != null) row.last = parsed.close;\n if (parsed.rosePct != null) row.change24hPct = parsed.rosePct;\n if (parsed.vol != null) row.volume24h = parsed.vol;\n applyBars(row);\n emitRow(row);\n };\n\n const applyKline = (id: string, marketMeta: MarketMeta, payload: unknown) => {\n const row = ensureRow(id, marketMeta);\n const incoming = parseKlineBars(payload);\n if (!incoming.length) return;\n const map = new Map((row._bars ?? []).map((b) => [b.t, b]));\n for (const bar of incoming) map.set(bar.t, bar);\n row._bars = [...map.values()].sort((a, b) => a.t - b.t).slice(-KLINE_PAGE_SIZE);\n applyBars(row);\n emitRow(row);\n };\n\n const connect = () => {\n if (closed) return;\n handlers.onStatus(attempt === 0 ? \"connecting\" : \"reconnecting\", attempt === 0 ? \"Connecting…\" : \"Reconnecting… · prices may be stale\");\n const ws = new WebSocketImpl(discovered.wsUrl, [\"klineZone_UTC+00\"]);\n socket = ws;\n lastMessageAt = Date.now();\n if (\"binaryType\" in ws) ws.binaryType = \"arraybuffer\";\n\n staleTimer = setInterval(() => {\n if (Date.now() - lastMessageAt > staleAfterMs) {\n handlers.onStatus(\"stale\", \"Price feed is stale\");\n try {\n ws.close();\n } catch {\n /* ignore */\n }\n }\n }, STALE_CHECK_MS);\n\n ws.onopen = () => {\n handlers.onStatus(\"live\", \"Live\");\n send({\n event: \"req\",\n params: { channel: \"timezone\", priceChangeType: \"klineZone\", klineZone: \"UTC+00\" },\n });\n send({ event: \"req\", params: { channel: \"review\" } });\n };\n\n ws.onmessage = async (event) => {\n lastMessageAt = Date.now();\n let payload: unknown;\n try {\n payload = await decodeMessage(event.data);\n if (closed || socket !== ws) return;\n attempt = 0;\n } catch {\n return;\n }\n\n if (!isRecord(payload)) return;\n\n if (payload.ping != null) {\n send({ pong: payload.ping });\n return;\n }\n\n if (payload.channel === \"review\" && isRecord(payload.data)) {\n for (const [key, tick] of Object.entries(payload.data)) {\n const resolved = resolveMetaId(key, meta);\n if (!resolved) continue;\n applyTick(resolved.id, resolved.meta, tick);\n subscribeTicker(resolved.id);\n subscribeKline(resolved.id);\n }\n return;\n }\n\n const channel = String(payload.channel ?? \"\");\n if (channel.includes(\"_kline_\")) {\n const symbol = channelSymbol(channel, \"kline\");\n const resolved = symbol ? resolveMetaId(symbol, meta) : null;\n if (resolved) applyKline(resolved.id, resolved.meta, payload);\n return;\n }\n\n if (channel.includes(\"_ticker\") && payload.tick) {\n const symbol = channelSymbol(channel, \"ticker\");\n const resolved = symbol ? resolveMetaId(symbol, meta) : null;\n if (resolved) applyTick(resolved.id, resolved.meta, payload.tick);\n }\n };\n\n ws.onclose = () => {\n if (staleTimer) clearInterval(staleTimer);\n staleTimer = null;\n tickerSubscribed.clear();\n klineSubscribed.clear();\n if (closed) return;\n handlers.onStatus(\"reconnecting\", \"Reconnecting… · prices may be stale\");\n const delay = Math.min(30_000, 1500 * 2 ** attempt) + secureJitterMs(500);\n attempt += 1;\n reconnectTimer = setTimeout(connect, delay);\n };\n\n ws.onerror = () => {\n /* onclose handles reconnect */\n };\n };\n\n connect();\n\n return {\n enableHistory() {\n klineEnabled = true;\n for (const id of tickerSubscribed) subscribeKline(id);\n },\n close() {\n closed = true;\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (staleTimer) clearInterval(staleTimer);\n try {\n socket?.close();\n } catch {\n /* ignore */\n }\n socket = null;\n },\n };\n}\n\n/** Exported for unit tests — backoff without Math.random. */\nexport function reconnectDelayMs(attempt: number): number {\n return Math.min(30_000, 1500 * 2 ** Math.max(0, attempt)) + secureJitterMs(500);\n}\n\nexport function isFinitePrice(value: unknown): value is number {\n const n = asFiniteNumber(value);\n return n != null && n > 0;\n}\n","/**\n * Process-wide market-data client with subscription deduplication.\n * Multiple React mounts share one REST discovery + one WebSocket per market kind.\n */\n\nimport { DEFAULT_API_ORIGIN, resolveApiOrigin } from \"./origins.ts\";\nimport { browserSupportsMarketStreaming, discoverMarkets } from \"./rest.ts\";\nimport { enrichRowIdentity } from \"./schemas.ts\";\nimport { createMarketFeed, type MarketFeed } from \"./websocket.ts\";\nimport type {\n ConnectionStatus,\n DiscoveredMarkets,\n MarketDataClientOptions,\n MarketKind,\n MarketListener,\n MarketRow,\n MarketSnapshot,\n SubscribeOptions,\n} from \"./types.ts\";\n\ninterface KindState {\n discovery: Promise<DiscoveredMarkets> | null;\n discovered: DiscoveredMarkets | null;\n feed: MarketFeed | null;\n rows: Map<string, MarketRow>;\n status: ConnectionStatus;\n statusMessage: string;\n error: string | null;\n lastMessageAt: number | null;\n refCount: number;\n klineWanted: boolean;\n listeners: Set<MarketListener>;\n abort: AbortController | null;\n}\n\nfunction createEmptyKind(): KindState {\n return {\n discovery: null,\n discovered: null,\n feed: null,\n rows: new Map(),\n status: \"idle\",\n statusMessage: \"\",\n error: null,\n lastMessageAt: null,\n refCount: 0,\n klineWanted: false,\n listeners: new Set(),\n abort: null,\n };\n}\n\nfunction quotesFromRows(rows: Map<string, MarketRow>): string[] {\n const preferred = [\"USDT\", \"USDC\", \"BTC\", \"ETH\"];\n const set = new Set<string>();\n for (const row of rows.values()) {\n if (row.quote) set.add(row.quote.toUpperCase());\n }\n return [...set].sort((a, b) => {\n const ai = preferred.indexOf(a);\n const bi = preferred.indexOf(b);\n return (ai === -1 ? 99 : ai) - (bi === -1 ? 99 : bi) || a.localeCompare(b);\n });\n}\n\nexport class MarketDataClient {\n private readonly apiOrigin: string;\n private readonly fetchImpl?: typeof fetch;\n private readonly WebSocketImpl?: typeof WebSocket;\n private readonly requestTimeoutMs: number;\n private readonly staleAfterMs: number;\n private readonly enableKlineByDefault: boolean;\n private readonly kinds = new Map<MarketKind, KindState>([\n [\"spot\", createEmptyKind()],\n [\"futures\", createEmptyKind()],\n ]);\n private pageHideBound = false;\n\n constructor(options: MarketDataClientOptions = {}) {\n this.apiOrigin = resolveApiOrigin(options.apiOrigin ?? DEFAULT_API_ORIGIN);\n this.fetchImpl = options.fetchImpl;\n this.WebSocketImpl = options.WebSocketImpl;\n this.requestTimeoutMs = options.requestTimeoutMs ?? 15_000;\n this.staleAfterMs = options.staleAfterMs ?? 45_000;\n this.enableKlineByDefault = options.enableKlineByDefault ?? true;\n }\n\n getOrigin(): string {\n return this.apiOrigin;\n }\n\n getSnapshot(kind: MarketKind): MarketSnapshot {\n const state = this.kinds.get(kind)!;\n return {\n kind,\n status: state.status,\n statusMessage: state.statusMessage,\n rows: new Map(state.rows),\n quotes: quotesFromRows(state.rows),\n stale: state.status === \"stale\" || state.status === \"reconnecting\",\n lastMessageAt: state.lastMessageAt,\n error: state.error,\n };\n }\n\n subscribe(options: SubscribeOptions, listener: MarketListener): () => void {\n if (typeof window === \"undefined\" && !this.WebSocketImpl) {\n listener({\n kind: options.kind,\n status: \"idle\",\n statusMessage: \"\",\n rows: new Map(),\n quotes: [],\n stale: false,\n lastMessageAt: null,\n error: null,\n });\n return () => undefined;\n }\n\n if (!browserSupportsMarketStreaming() && !this.WebSocketImpl) {\n listener({\n kind: options.kind,\n status: \"unsupported\",\n statusMessage: \"Please use a current browser to view market prices.\",\n rows: new Map(),\n quotes: [],\n stale: false,\n lastMessageAt: null,\n error: \"unsupported-browser\",\n });\n return () => undefined;\n }\n\n this.bindPageHide();\n const state = this.kinds.get(options.kind)!;\n state.listeners.add(listener);\n state.refCount += 1;\n if (options.kline ?? this.enableKlineByDefault) {\n state.klineWanted = true;\n state.feed?.enableHistory();\n }\n\n listener(this.getSnapshot(options.kind));\n void this.ensureFeed(options.kind);\n\n return () => {\n state.listeners.delete(listener);\n state.refCount = Math.max(0, state.refCount - 1);\n if (state.refCount === 0) {\n this.teardownKind(options.kind);\n }\n };\n }\n\n /** Test helper — force a clean slate between suites. */\n resetForTests(): void {\n for (const kind of [\"spot\", \"futures\"] as MarketKind[]) {\n this.teardownKind(kind);\n }\n }\n\n private bindPageHide() {\n if (this.pageHideBound || typeof window === \"undefined\") return;\n this.pageHideBound = true;\n const onHide = () => {\n for (const kind of [\"spot\", \"futures\"] as MarketKind[]) {\n this.teardownKind(kind);\n }\n };\n window.addEventListener(\"pagehide\", onHide);\n }\n\n private emit(kind: MarketKind) {\n const snapshot = this.getSnapshot(kind);\n const state = this.kinds.get(kind)!;\n for (const listener of [...state.listeners]) listener(snapshot);\n }\n\n private async ensureFeed(kind: MarketKind) {\n const state = this.kinds.get(kind)!;\n if (state.feed || state.discovery) {\n if (state.discovered && !state.feed && state.refCount > 0) {\n this.startFeed(kind, state.discovered);\n }\n return;\n }\n\n state.status = \"connecting\";\n state.statusMessage = \"Connecting to live prices…\";\n state.error = null;\n this.emit(kind);\n\n const abort = new AbortController();\n state.abort = abort;\n state.discovery = discoverMarkets(kind, {\n apiOrigin: this.apiOrigin,\n fetchImpl: this.fetchImpl,\n timeoutMs: this.requestTimeoutMs,\n signal: abort.signal,\n })\n .then((discovered) => {\n if (abort.signal.aborted || state.refCount === 0) return discovered;\n state.discovered = discovered;\n for (const [id, meta] of Object.entries(discovered.meta)) {\n if (!state.rows.has(id)) {\n const identity = enrichRowIdentity(meta, discovered.coins);\n state.rows.set(id, {\n ...meta,\n ...identity,\n last: null,\n change1hPct: null,\n change24hPct: null,\n change7dPct: null,\n spark7d: [],\n volume24h: null,\n updatedAt: null,\n });\n }\n }\n this.startFeed(kind, discovered);\n this.emit(kind);\n return discovered;\n })\n .catch((error: Error) => {\n if (abort.signal.aborted || state.refCount === 0) return null as unknown as DiscoveredMarkets;\n state.status = \"error\";\n state.statusMessage = \"Live prices unavailable.\";\n state.error = error.message || \"Unable to load market data\";\n this.emit(kind);\n // Bounded retry while subscribers remain.\n const retry = () => {\n if (state.refCount > 0 && !state.feed) {\n state.discovery = null;\n void this.ensureFeed(kind);\n }\n };\n if (typeof window !== \"undefined\") {\n window.setTimeout(retry, 5_000);\n } else {\n setTimeout(retry, 5_000);\n }\n throw error;\n })\n .finally(() => {\n if (state.discovery) {\n // keep resolved discovery for dedupe; clear only on teardown\n }\n });\n\n try {\n await state.discovery;\n } catch {\n /* status already emitted */\n }\n }\n\n private startFeed(kind: MarketKind, discovered: DiscoveredMarkets) {\n const state = this.kinds.get(kind)!;\n if (state.feed || state.refCount === 0) return;\n\n state.feed = createMarketFeed(\n discovered,\n {\n onRow: (row) => {\n state.rows.set(row.id, row);\n state.lastMessageAt = Date.now();\n if (state.status !== \"live\") {\n state.status = \"live\";\n state.statusMessage = \"Live\";\n state.error = null;\n }\n this.emit(kind);\n },\n onStatus: (status, message) => {\n state.status = status;\n state.statusMessage = message;\n if (status === \"error\") state.error = message;\n this.emit(kind);\n },\n },\n {\n kline: state.klineWanted,\n WebSocketImpl: this.WebSocketImpl,\n staleAfterMs: this.staleAfterMs,\n },\n );\n }\n\n private teardownKind(kind: MarketKind) {\n const state = this.kinds.get(kind)!;\n state.abort?.abort();\n state.abort = null;\n state.feed?.close();\n state.feed = null;\n state.discovery = null;\n state.discovered = null;\n state.rows.clear();\n state.status = \"idle\";\n state.statusMessage = \"\";\n state.error = null;\n state.lastMessageAt = null;\n state.klineWanted = false;\n state.refCount = 0;\n // Keep listeners only if still subscribed — callers remove themselves first.\n if (state.listeners.size === 0) {\n /* fully idle */\n }\n }\n}\n\nlet sharedClient: MarketDataClient | null = null;\nlet sharedOrigin: string | null = null;\n\n/** Shared singleton keyed by allowlisted apiOrigin. */\nexport function getSharedMarketDataClient(apiOrigin?: string): MarketDataClient {\n const origin = resolveApiOrigin(apiOrigin ?? DEFAULT_API_ORIGIN);\n if (!sharedClient || sharedOrigin !== origin) {\n sharedClient?.resetForTests();\n sharedClient = new MarketDataClient({ apiOrigin: origin });\n sharedOrigin = origin;\n }\n return sharedClient;\n}\n\n/** Test-only: replace the shared client. */\nexport function __setSharedMarketDataClientForTests(client: MarketDataClient | null): void {\n sharedClient = client;\n sharedOrigin = client?.getOrigin() ?? null;\n}\n","import { useEffect, useState } from \"react\";\nimport { getSharedMarketDataClient } from \"./MarketDataClient.ts\";\nimport type { MarketKind, MarketSnapshot, SubscribeOptions } from \"./types.ts\";\n\nconst EMPTY: MarketSnapshot = {\n kind: \"spot\",\n status: \"idle\",\n statusMessage: \"\",\n rows: new Map(),\n quotes: [],\n stale: false,\n lastMessageAt: null,\n error: null,\n};\n\nexport function useCryptoMarketData(\n options: SubscribeOptions & { apiOrigin?: string; enabled?: boolean },\n): MarketSnapshot {\n const { kind, kline, apiOrigin, enabled = true } = options;\n const [snapshot, setSnapshot] = useState<MarketSnapshot>({ ...EMPTY, kind });\n\n useEffect(() => {\n if (!enabled || typeof window === \"undefined\") return;\n const client = getSharedMarketDataClient(apiOrigin);\n return client.subscribe({ kind, kline }, setSnapshot);\n }, [kind, kline, apiOrigin, enabled]);\n\n return snapshot;\n}\n\nexport function useMarketRows(\n kind: MarketKind,\n quote: string | undefined,\n options: { apiOrigin?: string; kline?: boolean; enabled?: boolean } = {},\n): { snapshot: MarketSnapshot; rows: import(\"./types\").MarketRow[] } {\n const snapshot = useCryptoMarketData({\n kind,\n kline: options.kline,\n apiOrigin: options.apiOrigin,\n enabled: options.enabled,\n });\n const q = (quote ?? \"\").toUpperCase();\n const rows = [...snapshot.rows.values()].filter((row) =>\n q ? row.quote.toUpperCase() === q : true,\n );\n return { snapshot, rows };\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport {\n formatPct,\n formatPrice,\n useCryptoMarketData,\n type MarketKind,\n type MarketRow,\n} from \"../cryptoMarketData\";\nimport type { CryptoMarketsTableProps } from \"./CryptoMarketsTable.types\";\nimport \"./CryptoMarketsTable.css\";\n\ntype SortKey = \"name\" | \"last\" | \"change1hPct\" | \"change24hPct\" | \"change7dPct\";\ntype SortDir = \"asc\" | \"desc\";\n\nfunction CoinAvatar({ base, icon }: { base: string; icon: string }) {\n const [failed, setFailed] = useState(false);\n if (failed) {\n return (\n <span className=\"cmt-avatar cmt-avatar--fallback\" aria-hidden=\"true\">\n {base.slice(0, 3)}\n </span>\n );\n }\n return (\n <img\n className=\"cmt-avatar\"\n src={icon}\n alt=\"\"\n width={34}\n height={34}\n loading=\"lazy\"\n decoding=\"async\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nfunction Sparkline({\n values,\n up,\n label,\n reducedMotion,\n}: {\n values: number[];\n up: boolean;\n label: string;\n reducedMotion: boolean;\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const points = values.map(Number).filter(Number.isFinite);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const dpr = window.devicePixelRatio || 1;\n const width = canvas.clientWidth || 130;\n const height = canvas.clientHeight || 40;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n\n if (points.length < 2) return;\n\n const min = Math.min(...points);\n const range = Math.max(...points) - min || 1;\n const xAt = (i: number) => 3 + ((width - 6) * i) / (points.length - 1);\n const yAt = (v: number) => height - 3 - ((v - min) / range) * (height - 6);\n const stroke = up\n ? getComputedStyle(canvas).getPropertyValue(\"--cmt-rise\").trim() || \"#16c784\"\n : getComputedStyle(canvas).getPropertyValue(\"--cmt-fall\").trim() || \"#ea3943\";\n\n if (!reducedMotion) {\n ctx.beginPath();\n ctx.moveTo(xAt(0), yAt(points[0]!));\n points.forEach((v, i) => ctx.lineTo(xAt(i), yAt(v)));\n ctx.lineTo(xAt(points.length - 1), height);\n ctx.lineTo(xAt(0), height);\n ctx.closePath();\n const gradient = ctx.createLinearGradient(0, 0, 0, height);\n gradient.addColorStop(0, `${stroke}33`);\n gradient.addColorStop(1, `${stroke}00`);\n ctx.fillStyle = gradient;\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.moveTo(xAt(0), yAt(points[0]!));\n points.forEach((v, i) => ctx.lineTo(xAt(i), yAt(v)));\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = stroke;\n ctx.stroke();\n }, [values, up, reducedMotion]);\n\n return (\n <canvas\n ref={canvasRef}\n className=\"cmt-sparkline\"\n role=\"img\"\n aria-label={label}\n />\n );\n}\n\nfunction sortRows(rows: MarketRow[], key: SortKey, dir: SortDir): MarketRow[] {\n return [...rows].sort((a, b) => {\n if (key === \"name\") {\n const cmp = (a.name || \"\").localeCompare(b.name || \"\");\n return dir === \"asc\" ? cmp : -cmp;\n }\n const av = a[key];\n const bv = b[key];\n const aMissing = av == null || !Number.isFinite(Number(av));\n const bMissing = bv == null || !Number.isFinite(Number(bv));\n if (aMissing && bMissing) return 0;\n if (aMissing) return 1;\n if (bMissing) return -1;\n const cmp = Number(av) - Number(bv);\n return dir === \"asc\" ? cmp : -cmp;\n });\n}\n\nfunction ChangeCell({ value }: { value: number | null }) {\n if (value == null || !Number.isFinite(value)) {\n return <span className=\"cmt-muted\">—</span>;\n }\n const tone = value >= 0 ? \"cmt-change--up\" : \"cmt-change--down\";\n return <span className={[\"cmt-change\", tone].join(\" \")}>{formatPct(value)}</span>;\n}\n\nexport const CryptoMarketsTable = ({\n variant: _variant = \"default\",\n initialMarket = \"spot\",\n initialQuoteCurrency = \"USDT\",\n apiOrigin,\n maxRows,\n className,\n}: CryptoMarketsTableProps) => {\n const reactId = useId().replace(/:/g, \"\");\n const [kind, setKind] = useState<MarketKind>(initialMarket);\n const [quote, setQuote] = useState(initialQuoteCurrency.toUpperCase());\n const [sortKey, setSortKey] = useState<SortKey>(\"last\");\n const [sortDir, setSortDir] = useState<SortDir>(\"desc\");\n const [reducedMotion, setReducedMotion] = useState(false);\n const scrollRef = useRef<HTMLDivElement>(null);\n const [scrolled, setScrolled] = useState(false);\n\n const snapshot = useCryptoMarketData({ kind, kline: true, apiOrigin });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const mq = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const update = () => setReducedMotion(mq.matches);\n update();\n mq.addEventListener?.(\"change\", update);\n return () => mq.removeEventListener?.(\"change\", update);\n }, []);\n\n useEffect(() => {\n const node = scrollRef.current;\n if (!node) return;\n const onScroll = () => setScrolled(node.scrollLeft > 0);\n onScroll();\n node.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => node.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n useEffect(() => {\n if (snapshot.quotes.length && !snapshot.quotes.includes(quote)) {\n setQuote(snapshot.quotes[0]!);\n }\n }, [snapshot.quotes, quote]);\n\n const filtered = useMemo(() => {\n const rows = [...snapshot.rows.values()].filter(\n (row) => row.quote.toUpperCase() === quote.toUpperCase(),\n );\n const sorted = sortRows(rows, sortKey, sortDir);\n return typeof maxRows === \"number\" && maxRows > 0 ? sorted.slice(0, maxRows) : sorted;\n }, [snapshot.rows, quote, sortKey, sortDir, maxRows]);\n\n const onSort = (key: SortKey) => {\n if (key === sortKey) {\n setSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\n } else {\n setSortKey(key);\n setSortDir(key === \"name\" ? \"asc\" : \"desc\");\n }\n };\n\n const statusTone =\n snapshot.status === \"live\"\n ? \"live\"\n : snapshot.status === \"reconnecting\" || snapshot.status === \"stale\"\n ? \"warn\"\n : snapshot.status === \"error\" || snapshot.status === \"unsupported\"\n ? \"error\"\n : \"muted\";\n\n const emptyMessage =\n snapshot.status === \"unsupported\"\n ? \"Please use a current browser to view market prices.\"\n : snapshot.status === \"error\"\n ? \"Unable to load market data. Retrying…\"\n : snapshot.status === \"connecting\" || snapshot.status === \"idle\"\n ? \"Loading market data…\"\n : `No ${quote} pairs on ${kind} yet…`;\n\n return (\n <section\n className={[\"cmt-section\", className].filter(Boolean).join(\" \")}\n data-variant={_variant}\n aria-labelledby={`cmt-heading-${reactId}`}\n >\n <div className=\"cmt-container\">\n <header className=\"cmt-header\">\n <h2 id={`cmt-heading-${reactId}`} className=\"cmt-title\">\n Explore the markets\n </h2>\n <p className={`cmt-status cmt-status--${statusTone}`} role=\"status\" aria-live=\"polite\">\n <span className=\"cmt-status-dot\" aria-hidden=\"true\" />\n <span>\n {snapshot.status === \"live\"\n ? \"Live\"\n : snapshot.statusMessage || \"Connecting…\"}\n </span>\n </p>\n </header>\n\n <div className=\"cmt-card\">\n <div className=\"cmt-toolbar\">\n <div className=\"cmt-seg\" role=\"group\" aria-label=\"Market type\">\n {([\"spot\", \"futures\"] as MarketKind[]).map((value) => (\n <button\n key={value}\n type=\"button\"\n className={kind === value ? \"cmt-seg__btn is-active\" : \"cmt-seg__btn\"}\n aria-pressed={kind === value}\n onClick={() => setKind(value)}\n >\n {value === \"spot\" ? \"Spot\" : \"Futures\"}\n </button>\n ))}\n </div>\n <div className=\"cmt-tabs\" role=\"tablist\" aria-label=\"Quote currency\">\n {snapshot.quotes.map((q) => (\n <button\n key={q}\n type=\"button\"\n role=\"tab\"\n aria-selected={q === quote}\n className={q === quote ? \"cmt-tab is-active\" : \"cmt-tab\"}\n onClick={() => setQuote(q)}\n >\n {q}\n </button>\n ))}\n </div>\n </div>\n\n <div\n ref={scrollRef}\n className={[\"cmt-scroll\", scrolled ? \"is-scrolled\" : \"\"].filter(Boolean).join(\" \")}\n tabIndex={0}\n role=\"region\"\n aria-label=\"Market prices. Scroll horizontally to see all columns.\"\n >\n <table className=\"cmt-table\">\n <thead>\n <tr>\n {(\n [\n [\"name\", \"Name\"],\n [\"last\", \"Price\"],\n [\"change1hPct\", \"1h %\"],\n [\"change24hPct\", \"24h %\"],\n [\"change7dPct\", \"7d chart\"],\n ] as Array<[SortKey, string]>\n ).map(([key, label]) => {\n const active = sortKey === key;\n return (\n <th\n key={key}\n scope=\"col\"\n aria-sort={\n active\n ? sortDir === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n >\n <button\n type=\"button\"\n className={active ? \"cmt-sort is-active\" : \"cmt-sort\"}\n onClick={() => onSort(key)}\n >\n {label}\n <span className=\"cmt-sort-ar\" aria-hidden=\"true\">\n {active ? (sortDir === \"asc\" ? \"▲\" : \"▼\") : \"\"}\n </span>\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {!filtered.length ? (\n <tr>\n <td colSpan={5} className=\"cmt-empty\">\n {emptyMessage}\n </td>\n </tr>\n ) : (\n filtered.map((row) => (\n <tr key={row.id}>\n <td>\n <div className=\"cmt-coin\">\n <CoinAvatar base={row.base} icon={row.icon} />\n <div className=\"cmt-coin__text\">\n <span className=\"cmt-pair\">\n {row.base}\n <span className=\"cmt-quote\">/{row.quote}</span>\n </span>\n <span className=\"cmt-long\">{row.longName}</span>\n </div>\n </div>\n </td>\n <td className=\"cmt-price\">\n {formatPrice(row.last, row.pricePrecision)}\n </td>\n <td>\n <ChangeCell value={row.change1hPct} />\n </td>\n <td>\n <ChangeCell value={row.change24hPct} />\n </td>\n <td className=\"cmt-spark-cell\">\n <Sparkline\n values={row.spark7d}\n up={(row.change7dPct ?? 0) >= 0}\n label={`${row.name} available hourly price history, up to 7 days`}\n reducedMotion={reducedMotion}\n />\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default CryptoMarketsTable;\n","import { useMemo, useState } from \"react\";\nimport type { FeatureOffice, FeatureOfficesProps } from \"./FeatureOffices.types\";\nimport { Link } from \"../../components/Link\";\nimport { Tabs } from \"../../components/Tabs\";\nimport \"./FeatureOffices.css\";\n\nconst isExternalUrl = (href: string | undefined) => Boolean(href && /^https?:\\/\\//i.test(href));\n\n/* ── Default copy ─────────────────────────────────────────────\n * Starting-point content only — every string is a plain prop, so\n * an AI agent, CMS, or developer can fully replace it. See\n * `schema.ts` / `fingerprint.json` for the machine-readable\n * content contract.\n */\nexport const FEATURE_OFFICES_TEXT_CONTENT = {\n title: \"Our offices\",\n linkText: \"See location\",\n};\n\n/* ── Single office card ────────────────────────────────────────\n * Flag emoji, city/country heading, multi-line address, and an\n * optional \"See location\" link. Absolute `http(s)://` hrefs open\n * in a new tab; relative/internal hrefs navigate same-tab.\n */\nconst OfficeCard = ({ office, linkText }: { office: FeatureOffice; linkText: string }) => {\n const label = office.linkText ?? linkText;\n const external = isExternalUrl(office.href);\n\n return (\n <div className=\"fo-card\">\n <img\n alt={office.flagAlt ?? office.country}\n className=\"fo-flag\"\n height={24}\n loading=\"lazy\"\n src={office.flagImage}\n width={32}\n />\n\n <h3 className=\"fo-cardTitle\">\n {office.city}, {office.country}\n </h3>\n\n <p className=\"fo-address\">\n {office.address.split(\"\\n\").map((line, i) => (\n <span key={i}>\n {line}\n {i < office.address.split(\"\\n\").length - 1 && <br />}\n </span>\n ))}\n </p>\n\n {office.href && (\n <div className=\"fo-linkWrap\">\n <Link\n colorScheme=\"coral\"\n href={office.href}\n label={label}\n rel={external ? \"noopener noreferrer\" : undefined}\n target={external ? \"_blank\" : undefined}\n />\n </div>\n )}\n </div>\n );\n};\n\n/* ── FeatureOffices ────────────────────────────────────────────\n * Centred H2 heading and a row of region tabs above a responsive\n * grid of office cards. Regions and offices are CMS-managed data;\n * filtering by region happens client-side. Modeled after\n * deriv.com/contact-us (\"Our offices\").\n */\nexport const FeatureOffices = ({\n title = FEATURE_OFFICES_TEXT_CONTENT.title,\n regions,\n activeRegionId,\n defaultActiveRegionId,\n onRegionChange,\n offices,\n linkText = FEATURE_OFFICES_TEXT_CONTENT.linkText,\n className,\n ...props\n}: FeatureOfficesProps) => {\n const [internalActiveId, setInternalActiveId] = useState(\n defaultActiveRegionId ?? regions[0]?.id,\n );\n\n const isControlled = activeRegionId !== undefined;\n const activeId = isControlled ? activeRegionId : internalActiveId;\n\n const filteredOffices = useMemo(\n () => offices.filter((office) => office.region === activeId),\n [offices, activeId],\n );\n\n const handleTabChange = (id: string) => {\n if (!isControlled) setInternalActiveId(id);\n onRegionChange?.(id);\n };\n\n return (\n <section className={[\"fo-section\", className ?? \"\"].filter(Boolean).join(\" \")} {...props}>\n <div className=\"fo-container\">\n {title && <h2 className=\"fo-title\">{title}</h2>}\n\n <div className=\"fo-tabsWrap\">\n <Tabs activeId={activeId ?? \"\"} items={regions} onChange={handleTabChange} />\n </div>\n\n <div className=\"fo-grid\">\n {filteredOffices.map((office, index) => (\n <OfficeCard key={`${office.city}-${index}`} linkText={linkText} office={office} />\n ))}\n </div>\n </div>\n </section>\n );\n};\n\nexport default FeatureOffices;\n","import { Link } from \"../../components/Link\";\nimport type { TierAccent, TierItem, TiersProps } from \"./Tiers.types\";\nimport \"./Tiers.css\";\n\nconst DEFAULT_ACCENTS: TierAccent[] = [\"bronze\", \"silver\", \"gold\", \"platinum\"];\n\nconst resolveAccent = (tier: TierItem, index: number): TierAccent =>\n tier.accent ?? DEFAULT_ACCENTS[index] ?? \"bronze\";\n\n/**\n * Partnership-tier comparison section — centred header, a responsive\n * track of medal tiers (with desktop connector lines), and an optional CTA.\n * Modeled after the \"Growing rewards as you scale\" block on\n * https://deriv.com/partners.\n *\n * Mobile (<768px): single column; each tier is a white outer card with\n * the medal, a horizontal name/status row, a slate benefit panel, and an\n * optional requirement. Desktop (≥992px): four equal columns with metallic\n * connector lines through the medals.\n */\nexport const Tiers = ({\n title,\n description,\n tiers,\n showLink = false,\n linkText = \"Learn more about partner tiers\",\n linkHref,\n onLinkClick,\n}: TiersProps) => {\n return (\n <section className=\"tiers\">\n <div className=\"tiers__container\">\n <header className=\"tiers__header\">\n <h2 className=\"tiers__title\">{title}</h2>\n {description && <p className=\"tiers__description\">{description}</p>}\n </header>\n\n <ol className=\"tiers__list\">\n {tiers.map((tier, index) => {\n const accent = resolveAccent(tier, index);\n\n return (\n <li\n key={tier.name}\n className={`tiers__item tiers__item--${accent}`}\n >\n <div className=\"tiers__shell\">\n <div className=\"tiers__icon-row\">\n <span\n className=\"tiers__line tiers__line--left\"\n aria-hidden=\"true\"\n />\n <div className=\"tiers__icon-wrap\">\n <img\n src={tier.icon}\n alt={tier.iconAlt ?? tier.name}\n className=\"tiers__icon\"\n width={64}\n height={64}\n loading=\"lazy\"\n />\n </div>\n <span\n className=\"tiers__line tiers__line--right\"\n aria-hidden=\"true\"\n />\n </div>\n\n <div className=\"tiers__heading\">\n <h3 className=\"tiers__name\">{tier.name}</h3>\n <p className=\"tiers__status\">{tier.status}</p>\n </div>\n\n <div className=\"tiers__card\">\n <p className=\"tiers__card-title\">{tier.title}</p>\n <p className=\"tiers__card-description\">\n {tier.description}\n </p>\n </div>\n\n {tier.requirement && (\n <p className=\"tiers__requirement\">\n {tier.requirement}\n </p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n\n {showLink && (\n <div className=\"tiers__footer\">\n <Link\n colorScheme=\"coral\"\n label={linkText}\n href={linkHref}\n onClick={onLinkClick}\n />\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default Tiers;\n","import type { PartnersPayoutProps } from \"./PartnersPayout.types\";\nimport \"./PartnersPayout.css\";\n\n/**\n * Dark partner-payout section with a responsive metric grid and globe image,\n * modeled after the \"Top partner payouts\" section on deriv.com/partners.\n */\nexport const PartnersPayout = ({\n title,\n period,\n payouts,\n imageUrl,\n imageAlt = \"\",\n className,\n ...props\n}: PartnersPayoutProps) => (\n <section\n className={[\"partners-payout\", className].filter(Boolean).join(\" \")}\n {...props}\n >\n <div className=\"partners-payout__container\">\n <div className=\"partners-payout__content\">\n <header className=\"partners-payout__header\">\n <h2 className=\"partners-payout__title\">{title}</h2>\n <p className=\"partners-payout__period\">{period}</p>\n </header>\n\n <ul className=\"partners-payout__grid\">\n {payouts.map((payout, index) => (\n <li\n className=\"partners-payout__item\"\n key={`${payout.region}-${index}`}\n >\n <span className=\"partners-payout__region\">{payout.region}</span>\n <span className=\"partners-payout__amount\">{payout.amount}</span>\n </li>\n ))}\n </ul>\n </div>\n\n <img\n className=\"partners-payout__image\"\n src={imageUrl}\n alt={imageAlt}\n loading=\"lazy\"\n />\n </div>\n </section>\n);\n\nexport default PartnersPayout;\n","import { Button } from \"../../components/Button\";\nimport type { MasterPartnerProps } from \"./MasterPartner.types\";\nimport \"./MasterPartner.css\";\n\n/**\n * \"Master Partner programme\" section — headline and intro copy beside a\n * foreground image, a desktop-only coral CTA placed after the copy and\n * before the numbered steps, and a full-width row of numbered \"how it\n * works\" steps underneath. Modeled after the \"Master Partner programme\"\n * block on https://deriv.com/partners.\n *\n * Mobile/tablet (<992px): single column (content, then image), steps stack\n * to 1-2 columns, and the CTA button is hidden.\n * Desktop (≥992px): content and image sit side by side, the CTA button\n * becomes visible right after the copy, and steps lay out in a single row.\n */\nexport const MasterPartner = ({\n title,\n description,\n note,\n closingText,\n ctaLabel,\n ctaHref,\n onCtaClick,\n image,\n imageAlt = \"\",\n steps,\n}: MasterPartnerProps) => {\n const ctaButton = <Button colorScheme=\"coral\" variant=\"primary\" label={ctaLabel} onClick={onCtaClick} />;\n\n return (\n <section className=\"master-partner\">\n <div className=\"master-partner__container\">\n <div className=\"master-partner__top\">\n <div className=\"master-partner__content\">\n <h2 className=\"master-partner__title\">{title}</h2>\n\n <div className=\"master-partner__copy\">\n <p className=\"master-partner__paragraph\">{description}</p>\n {note && (\n <p className=\"master-partner__paragraph\">\n <strong>{note.label}</strong> {note.text}\n </p>\n )}\n {closingText && (\n <p className=\"master-partner__paragraph\">{closingText}</p>\n )}\n </div>\n\n {ctaLabel && (\n <div className=\"master-partner__cta\">\n {ctaHref ? <a href={ctaHref}>{ctaButton}</a> : ctaButton}\n </div>\n )}\n </div>\n\n <div className=\"master-partner__image-wrapper\">\n <img\n className=\"master-partner__image\"\n src={image}\n alt={imageAlt}\n loading=\"lazy\"\n />\n </div>\n </div>\n\n <ol className=\"master-partner__steps\">\n {steps.map((step, index) => (\n <li className=\"master-partner__step\" key={index}>\n <img\n className=\"master-partner__step-icon\"\n src={step.icon}\n alt={step.iconAlt ?? \"\"}\n aria-hidden=\"true\"\n width={32}\n height={32}\n loading=\"lazy\"\n />\n <p className=\"master-partner__step-description\">{step.description}</p>\n </li>\n ))}\n </ol>\n </div>\n </section>\n );\n};\n\nexport default MasterPartner;\n","import type { ResourceBannerLink, ResourceBannerProps } from \"./ResourceBanner.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./ResourceBanner.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ──\n * `title` / `description` are inlined as literals in the destructuring\n * below rather than referenced through a const, so the registry\n * generator can read them and `validate:registry` can verify the\n * documented defaults against the code. */\n\nconst DEFAULT_LINKS: ResourceBannerLink[] = [{ label: \"Learn more\", href: \"#\" }];\n\n/**\n * Real deriv.com copy, exported for consumers who want to reproduce the\n * exact reference section (deriv.com/fraud-prevention → `.section_fraud_resources`).\n *\n * Opt-in only — the component's defaults and the Storybook stories both use\n * generic placeholder copy (design-system Rule 6). Import this when you want\n * the reference content specifically; don't treat it as the template's content.\n */\nexport const RESOURCE_BANNER_DERIV_CONTENT = {\n title: \"Learn more about staying safe\",\n description:\n \"Read our guide on secure and responsible trading for more on protecting your account.\",\n links: [\n {\n id: \"responsible\",\n label: \"Secure and responsible trading\",\n href: \"/responsible\",\n external: true,\n },\n ] as ResourceBannerLink[],\n};\n\n/* ── External-link icon ────────────────────────────────────────\n * Stands in for the reference site's Font Awesome glyph (U+E09F,\n * \"arrow-up-right-from-square\"). Inlined as SVG because the design\n * system does not depend on an icon font. */\n\nconst ExternalLinkIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M4.5 11.5 11.5 4.5M5.5 4.5h6v6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ── ResourceBanner ───────────────────────────────────────────── */\n\nexport const ResourceBanner = ({\n title = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n links,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: ResourceBannerProps) => {\n const resolvedLinks = links && links.length > 0 ? links : DEFAULT_LINKS;\n\n const rootClass = [\"rsb\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"rsb__inner\">\n <div className=\"rsb__card\">\n <div className=\"rsb__grid\">\n <div className=\"rsb__content\">\n <HeadingTag className=\"rsb__title\">{title}</HeadingTag>\n {description && <p className=\"rsb__description\">{description}</p>}\n </div>\n\n <ul className=\"rsb__links\">\n {resolvedLinks.map((link, i) => {\n const isExternal = link.external ?? true;\n return (\n <li key={link.id ?? i} className=\"rsb__links-item\">\n <Link\n className=\"rsb__link\"\n colorScheme=\"white\"\n href={link.href}\n label={link.label}\n icon={isExternal ? <ExternalLinkIcon /> : undefined}\n iconPosition=\"right\"\n showChevron={!isExternal}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n />\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ResourceBanner;\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type Dispatch,\n type KeyboardEvent as ReactKeyboardEvent,\n type SetStateAction,\n} from \"react\";\nimport { DotLottieInView } from \"../../components/DotLottieInView\";\nimport { Tabs } from \"../../components/Tabs\";\nimport type {\n OptionsTypesAnimation,\n OptionsTypesIcon,\n OptionsTypesItem,\n OptionsTypesMetaItem,\n OptionsTypesProps,\n} from \"./OptionsTypes.types\";\nimport \"./OptionsTypes.css\";\n\nexport const OPTIONS_TYPES_PLACEHOLDER_ITEMS: OptionsTypesItem[] = [\n {\n id: \"option-type\",\n title: \"Option type\",\n description: \"Explain how this option type works and when a customer might use it.\",\n animations: [],\n markets: [{ label: \"Market\" }],\n platforms: [{ label: \"Platform\" }],\n },\n];\n\nfunction safeHref(value?: string): string | null {\n if (!value) return null;\n if (value.startsWith(\"/\") && !value.startsWith(\"//\")) return value;\n try {\n const url = new URL(value);\n return url.protocol === \"https:\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction safeLottieSrc(value: string): string | null {\n const href = safeHref(value);\n if (!href) return null;\n try {\n const pathname = href.startsWith(\"/\") ? href : new URL(href).pathname;\n return pathname.toLowerCase().endsWith(\".lottie\") ? href : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Market glyphs, traced from the icons the reference pages embed inline. They\n * are filled rather than stroked and share the source 25x24 viewBox.\n */\nconst iconPaths: Partial<Record<OptionsTypesIcon, string[]>> = {\n forex: [\n \"M9.7002 10H7.7002V8H13.2002C14.0302 8 14.7002 7.33 14.7002 6.5V5.5C14.7002 4.67 14.0302 4 13.2002 4H6.2002C4.8202 4 3.7002 5.12 3.7002 6.5V18.5C3.7002 19.33 4.3702 20 5.2002 20H6.2002C7.0302 20 7.7002 19.33 7.7002 18.5V14H9.7002C10.8002 14 11.7002 13.1 11.7002 12C11.7002 10.9 10.8002 10 9.7002 10ZM9.7002 13H7.2002C6.9202 13 6.7002 13.22 6.7002 13.5V18.5C6.7002 18.78 6.4802 19 6.2002 19H5.2002C4.9202 19 4.7002 18.78 4.7002 18.5V6.5C4.7002 5.67 5.3702 5 6.2002 5H13.2002C13.4802 5 13.7002 5.22 13.7002 5.5V6.5C13.7002 6.78 13.4802 7 13.2002 7H7.2002C6.9202 7 6.7002 7.22 6.7002 7.5V10.5C6.7002 10.78 6.9202 11 7.2002 11H9.7002C10.2502 11 10.7002 11.45 10.7002 12C10.7002 12.55 10.2502 13 9.7002 13Z\",\n \"M20.9902 9.72C20.7202 9.27 20.2402 9 19.7102 9H18.5002C17.9402 9 17.4302 9.31 17.1702 9.81L16.9202 10.3L16.6702 9.81C16.4102 9.31 15.9002 9 15.3402 9H14.1302C13.6002 9 13.1202 9.27 12.8502 9.72C12.5802 10.17 12.5602 10.72 12.8002 11.19L14.6302 14.71L13.0202 17.8C12.7802 18.27 12.7902 18.82 13.0702 19.27C13.3502 19.72 13.8202 19.99 14.3502 19.99H15.5602C16.1202 19.99 16.6302 19.68 16.8902 19.18L16.9202 19.12L16.9502 19.18C17.2102 19.68 17.7202 19.99 18.2802 19.99H19.4902C20.0202 19.99 20.5002 19.72 20.7702 19.27C21.0402 18.82 21.0602 18.27 20.8202 17.8L19.2102 14.71L21.0402 11.19C21.2802 10.72 21.2702 10.17 20.9902 9.72ZM20.1502 10.73L18.2002 14.48C18.1202 14.62 18.1202 14.8 18.2002 14.94L19.9302 18.27C20.0502 18.5 19.9602 18.69 19.9102 18.76C19.8702 18.83 19.7402 19 19.4802 19H18.2702C18.0802 19 17.9102 18.9 17.8302 18.73L17.3602 17.82C17.2702 17.65 17.1002 17.55 16.9202 17.55C16.7402 17.55 16.5602 17.65 16.4802 17.82L16.0102 18.73C15.9202 18.9 15.7502 19 15.5702 19H14.3602C14.1102 19 13.9802 18.83 13.9302 18.76C13.8902 18.69 13.8002 18.5 13.9102 18.27L15.6402 14.94C15.7202 14.8 15.7202 14.62 15.6402 14.48L13.6902 10.73C13.5702 10.51 13.6602 10.31 13.7102 10.24C13.7602 10.17 13.8802 10 14.1402 10H15.3502C15.5402 10 15.7102 10.1 15.7902 10.27L16.4902 11.61C16.6602 11.94 17.2002 11.94 17.3802 11.61L18.0802 10.27C18.1702 10.1 18.3402 10 18.5202 10H19.7302C19.9802 10 20.1102 10.17 20.1602 10.24C20.2102 10.31 20.2902 10.5 20.1802 10.73H20.1502Z\",\n ],\n \"stock-indices\": [\n \"M19 10.5H18C17.17 10.5 16.5 11.17 16.5 12V19C16.5 19.83 17.17 20.5 18 20.5H19C19.83 20.5 20.5 19.83 20.5 19V12C20.5 11.17 19.83 10.5 19 10.5ZM19.5 19C19.5 19.28 19.28 19.5 19 19.5H18C17.72 19.5 17.5 19.28 17.5 19V12C17.5 11.72 17.72 11.5 18 11.5H19C19.28 11.5 19.5 11.72 19.5 12V19Z\",\n \"M13 13.5H12C11.17 13.5 10.5 14.17 10.5 15V19C10.5 19.83 11.17 20.5 12 20.5H13C13.83 20.5 14.5 19.83 14.5 19V15C14.5 14.17 13.83 13.5 13 13.5ZM13.5 19C13.5 19.28 13.28 19.5 13 19.5H12C11.72 19.5 11.5 19.28 11.5 19V15C11.5 14.72 11.72 14.5 12 14.5H13C13.28 14.5 13.5 14.72 13.5 15V19Z\",\n \"M7 15.5H6C5.17 15.5 4.5 16.17 4.5 17V19C4.5 19.83 5.17 20.5 6 20.5H7C7.83 20.5 8.5 19.83 8.5 19V17C8.5 16.17 7.83 15.5 7 15.5ZM7.5 19C7.5 19.28 7.28 19.5 7 19.5H6C5.72 19.5 5.5 19.28 5.5 19V17C5.5 16.72 5.72 16.5 6 16.5H7C7.28 16.5 7.5 16.72 7.5 17V19Z\",\n \"M21.47 3.85C21.47 3.85 21.47 3.82 21.46 3.8C21.46 3.78 21.44 3.77 21.43 3.75C21.41 3.71 21.38 3.67 21.35 3.64C21.33 3.63 21.31 3.62 21.3 3.61C21.27 3.58 21.23 3.56 21.19 3.54C21.16 3.53 21.12 3.52 21.08 3.52C21.05 3.52 21.03 3.5 21 3.5H18C17.72 3.5 17.5 3.72 17.5 4C17.5 4.28 17.72 4.5 18 4.5H19.76C17.68 6.51 15.34 8.22 12.77 9.56C9.98996 11 7.00996 11.99 3.91996 12.51C3.64996 12.56 3.45996 12.81 3.50996 13.09C3.54996 13.33 3.75996 13.51 3.99996 13.51C4.02996 13.51 4.05996 13.51 4.07996 13.51C7.27996 12.98 10.36 11.95 13.23 10.46C15.91 9.07 18.34 7.29 20.5 5.19V7.01C20.5 7.29 20.72 7.51 21 7.51C21.28 7.51 21.5 7.29 21.5 7.01V4.01C21.5 3.96 21.49 3.91 21.47 3.87V3.85Z\",\n ],\n commodities: [\n \"M21.9703 17.33L20.1803 12.48C19.9603 11.89 19.4003 11.5 18.7703 11.5H17.3403L15.6803 6.98C15.4603 6.39 14.9003 6 14.2703 6H10.7203C10.0903 6 9.53031 6.39 9.31031 6.98L7.64031 11.5H6.21031C5.58031 11.5 5.02031 11.89 4.80031 12.48L3.01031 17.33C2.95031 17.48 2.97031 17.65 3.07031 17.79C3.16031 17.92 3.32031 18 3.48031 18H21.5003C21.6603 18 21.8203 17.92 21.9103 17.79C22.0003 17.66 22.0303 17.48 21.9703 17.33ZM10.2603 7.33C10.3303 7.13 10.5203 7 10.7303 7H14.2803C14.4903 7 14.6803 7.13 14.7503 7.33L16.2903 11.5H8.72031L10.2603 7.33ZM12.5003 16.06L11.1903 12.5H13.8103L12.5003 16.06ZM4.22031 17L5.76031 12.83C5.83031 12.63 6.02031 12.5 6.23031 12.5H9.78031C9.99031 12.5 10.1803 12.63 10.2503 12.83L11.7903 17H4.22031ZM13.2203 17L14.7603 12.83C14.8303 12.63 15.0203 12.5 15.2303 12.5H18.7803C18.9903 12.5 19.1803 12.63 19.2503 12.83L20.7903 17H13.2203Z\",\n ],\n \"derived-indices\": [\n \"M12.5 2.5C7.26 2.5 3 6.76 3 12C3 17.24 7.26 21.5 12.5 21.5C17.74 21.5 22 17.24 22 12C22 6.76 17.74 2.5 12.5 2.5ZM12.5 20.5C11.62 20.5 10.68 19.03 10.12 16.63C10.89 16.55 11.69 16.5 12.5 16.5C13.31 16.5 14.11 16.55 14.88 16.63C14.32 19.02 13.38 20.5 12.5 20.5ZM12.5 15.5C11.61 15.5 10.75 15.55 9.92 15.65C9.76 14.7 9.66 13.65 9.63 12.5H15.36C15.34 13.64 15.24 14.7 15.07 15.65C14.24 15.56 13.38 15.5 12.49 15.5H12.5ZM12.5 3.5C13.38 3.5 14.32 4.97 14.88 7.37C14.11 7.45 13.31 7.5 12.5 7.5C11.69 7.5 10.89 7.45 10.12 7.37C10.68 4.98 11.62 3.5 12.5 3.5ZM12.5 8.5C13.39 8.5 14.25 8.45 15.08 8.35C15.24 9.3 15.34 10.35 15.37 11.5H9.64C9.66 10.36 9.76 9.3 9.93 8.35C10.76 8.44 11.62 8.5 12.51 8.5H12.5ZM4.03 11.5C4.12 9.92 4.64 8.46 5.48 7.23C6.44 7.67 7.63 8 8.95 8.22C8.77 9.27 8.67 10.39 8.65 11.5H4.03ZM8.63 12.5C8.65 13.61 8.76 14.73 8.93 15.78C7.61 16 6.43 16.33 5.46 16.77C4.62 15.54 4.11 14.07 4.01 12.5H8.63ZM20.97 12.5C20.88 14.08 20.36 15.54 19.52 16.77C18.56 16.33 17.37 16 16.05 15.78C16.23 14.73 16.33 13.61 16.35 12.5H20.97ZM16.36 11.5C16.34 10.39 16.23 9.27 16.06 8.22C17.38 8 18.56 7.67 19.53 7.23C20.37 8.46 20.88 9.93 20.98 11.5H16.36ZM18.89 6.42C18.04 6.77 17.01 7.05 15.86 7.23C15.54 5.83 15.08 4.6 14.48 3.74C16.22 4.16 17.75 5.11 18.89 6.41V6.42ZM10.51 3.74C9.91 4.59 9.45 5.82 9.13 7.23C7.99 7.05 6.95 6.77 6.1 6.42C7.24 5.12 8.77 4.16 10.51 3.75V3.74ZM6.1 17.58C6.95 17.23 7.98 16.95 9.13 16.77C9.45 18.17 9.91 19.4 10.51 20.26C8.77 19.84 7.24 18.89 6.1 17.59V17.58ZM14.49 20.25C15.09 19.4 15.55 18.17 15.87 16.76C17.01 16.94 18.05 17.22 18.9 17.57C17.76 18.87 16.23 19.83 14.49 20.24V20.25Z\",\n ],\n cryptocurrencies: [\n \"M12.49 2.50977C7.26 2.50977 3 6.75977 3 11.9998C3 17.2398 7.26 21.4898 12.49 21.4898C17.72 21.4898 21.99 17.2298 21.99 11.9998C21.99 6.76977 17.73 2.50977 12.49 2.50977ZM12.49 20.4998C7.81 20.4998 4 16.6898 4 12.0098C4 7.32977 7.81 3.50977 12.49 3.50977C17.17 3.50977 20.99 7.31977 20.99 11.9998C20.99 16.6798 17.18 20.4898 12.49 20.4898V20.4998Z\",\n \"M15.05 11.9098C15.33 11.5698 15.51 11.1398 15.51 10.6698C15.51 9.76977 14.89 9.00977 14.06 8.78977V6.99977C14.06 6.71977 13.84 6.49977 13.56 6.49977C13.28 6.49977 13.06 6.71977 13.06 6.99977V8.71977H12.12V6.99977C12.12 6.71977 11.9 6.49977 11.62 6.49977C11.34 6.49977 11.12 6.71977 11.12 6.99977V8.71977C10.31 8.74977 9.67 9.39977 9.67 10.2198V14.0298C9.67 14.8398 10.32 15.4998 11.12 15.5298V16.9998C11.12 17.2798 11.34 17.4998 11.62 17.4998C11.9 17.4998 12.12 17.2798 12.12 16.9998V15.5298H13.06V16.9998C13.06 17.2798 13.28 17.4998 13.56 17.4998C13.84 17.4998 14.06 17.2798 14.06 16.9998V15.5298C15.13 15.5298 16 14.6498 16 13.5798C16 12.8698 15.62 12.2598 15.06 11.9198L15.05 11.9098ZM11.17 9.70977H13.56C14.09 9.70977 14.51 10.1398 14.51 10.6598C14.51 11.1798 14.08 11.6098 13.56 11.6098H10.67V10.1998C10.67 9.91977 10.89 9.69977 11.17 9.69977V9.70977ZM14.05 14.5198H11.17C10.89 14.5198 10.67 14.2998 10.67 14.0198V12.6098H14.05C14.58 12.6098 15 13.0398 15 13.5598C15 14.0798 14.57 14.5098 14.05 14.5098V14.5198Z\",\n ],\n};\n\nfunction MetaIcon({ icon, iconUrl }: { icon?: OptionsTypesIcon; iconUrl?: string }) {\n // A CMS-hosted glyph always wins, since it is the artwork the page ships.\n const imageSrc = safeHref(iconUrl);\n if (imageSrc) {\n return (\n <img\n className=\"ot__meta-image\"\n src={imageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n );\n }\n if (!icon) return null;\n const paths = iconPaths[icon];\n if (!paths) {\n const initials =\n icon === \"deriv-trader\" ? \"DT\" : icon === \"deriv-bot\" ? \"DB\" : \"ST\";\n return <span className=\"ot__platform-icon\" aria-hidden=\"true\">{initials}</span>;\n }\n return (\n <svg className=\"ot__meta-icon\" viewBox=\"0 0 25 24\" fill=\"none\" aria-hidden=\"true\">\n {paths.map((d) => (\n <path key={d} d={d} fill=\"currentColor\" />\n ))}\n </svg>\n );\n}\n\nfunction MetaList({ items = [] }: { items?: OptionsTypesMetaItem[] }) {\n return (\n <ul className=\"ot__meta-list\">\n {items.map((item, index) => {\n const href = safeHref(item.href);\n const content = (\n <>\n <MetaIcon icon={item.icon} iconUrl={item.iconUrl} />\n <span>{item.label}</span>\n </>\n );\n return (\n <li key={`${item.label}-${index}`}>\n {href ? <a href={href}>{content}</a> : <span>{content}</span>}\n </li>\n );\n })}\n </ul>\n );\n}\n\nfunction PlaybackGlyph({ playing }: { playing: boolean }) {\n return (\n <svg className=\"ot__control-icon\" viewBox=\"0 0 64 64\" aria-hidden=\"true\">\n <circle className=\"ot__control-disc\" cx=\"32\" cy=\"32\" r=\"32\" />\n {playing ? (\n <>\n <rect className=\"ot__control-glyph\" x=\"23\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n <rect className=\"ot__control-glyph\" x=\"35\" y=\"21\" width=\"6\" height=\"22\" rx=\"2\" />\n </>\n ) : (\n <path\n className=\"ot__control-glyph\"\n d=\"M26.5058 19.9527L42.7058 29.8527C43.4933 30.359 43.9996 31.259 43.9996 32.159C43.9996 33.1152 43.4933 34.0152 42.7058 34.4652L26.5058 44.3652C25.6621 44.8715 24.5933 44.9277 23.7496 44.4215C22.9058 43.9715 22.3996 43.0715 22.3996 42.059V22.259C22.3996 21.3027 22.9058 20.4027 23.7496 19.9527C24.5933 19.4465 25.6621 19.4465 26.5058 19.9527Z\"\n />\n )}\n </svg>\n );\n}\n\ninterface AnimationCardProps {\n animation: OptionsTypesAnimation;\n itemId: string;\n playing: boolean;\n onToggle: () => void;\n}\n\nfunction AnimationCard({\n animation,\n itemId,\n playing,\n onToggle,\n}: AnimationCardProps) {\n const src = safeLottieSrc(animation.src);\n const posterSrc = safeHref(animation.posterUrl);\n const controlId = `ot-animation-${itemId}-${animation.id ?? animation.label}`\n .replace(/[^a-zA-Z0-9_-]/g, \"-\");\n\n return (\n <div className=\"ot__animation-card\">\n {/* The artwork carries its own background and outcome label, so the\n card adds no text of its own — `label` names the control instead. */}\n <div id={controlId} className=\"ot__animation-media\" aria-hidden=\"true\">\n {src ? (\n <DotLottieInView\n src={src}\n enabled={playing}\n loop\n poster={\n posterSrc ? (\n <img src={posterSrc} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n ) : undefined\n }\n />\n ) : null}\n </div>\n {posterSrc && !playing ? (\n <img\n className=\"ot__animation-poster\"\n src={posterSrc}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : null}\n {src ? (\n <button\n type=\"button\"\n className={`ot__playback-toggle${playing ? \" ot__playback-toggle--playing\" : \"\"}`}\n aria-controls={controlId}\n aria-pressed={playing}\n aria-label={`${playing ? \"Pause\" : \"Play\"} ${animation.label} animation`}\n onClick={onToggle}\n >\n <PlaybackGlyph playing={playing} />\n </button>\n ) : null}\n </div>\n );\n}\n\ninterface OptionPanelProps {\n item: OptionsTypesItem;\n variant: \"tabs\" | \"single\";\n marketsLabel: string;\n platformsLabel: string;\n playing: Record<string, boolean>;\n setPlaying: Dispatch<SetStateAction<Record<string, boolean>>>;\n}\n\nfunction OptionPanel({\n item,\n variant,\n marketsLabel,\n platformsLabel,\n playing,\n setPlaying,\n}: OptionPanelProps) {\n const description = (\n <div className=\"ot__description\">\n <p>{item.description}</p>\n </div>\n );\n\n const animations = (\n <div className={`ot__animations ot__animations--${Math.min(item.animations.length, 2)}`}>\n {item.animations.slice(0, 2).map((animation, index) => {\n const key = `${item.id}-${animation.id ?? index}`;\n return (\n <AnimationCard\n key={key}\n animation={animation}\n itemId={item.id}\n playing={Boolean(playing[key])}\n onToggle={() =>\n setPlaying((current) => ({\n ...current,\n [key]: !current[key],\n }))\n }\n />\n );\n })}\n </div>\n );\n\n const metadata = (\n <div className=\"ot__metadata\">\n <div className=\"ot__meta-group\">\n <h4>{marketsLabel}</h4>\n <MetaList items={item.markets} />\n </div>\n <div className=\"ot__meta-group\">\n <h4>{platformsLabel}</h4>\n <MetaList items={item.platforms} />\n </div>\n </div>\n );\n\n /**\n * The reference pages choose the layout by how many animations an option\n * has, not by whether tabs are present: a lone animation sits beside its\n * copy, while a pair sits under centred copy with the availability lists\n * below. Tabbed pages always show pairs, so they always stack.\n */\n const layout =\n variant === \"single\" && item.animations.length === 1 ? \"split\" : \"stacked\";\n const optionClass = `ot__option ot__option--${variant} ot__option--${layout}`;\n\n if (layout === \"split\") {\n return (\n <div className={optionClass}>\n {animations}\n {/* Collapses to `display: contents` below the split so the stacked\n order becomes copy, media, availability. */}\n <div className=\"ot__option-side\">\n {description}\n {metadata}\n </div>\n </div>\n );\n }\n\n return (\n <div className={optionClass}>\n {description}\n {animations}\n {metadata}\n </div>\n );\n}\n\ninterface TogglePanelProps {\n item: OptionsTypesItem;\n idPrefix: string;\n marketsLabel: string;\n platformsLabel: string;\n playing: Record<string, boolean>;\n setPlaying: Dispatch<SetStateAction<Record<string, boolean>>>;\n}\n\n/**\n * One option shown as a single media well whose animation is swapped by an\n * icon switch sitting directly above the card heading.\n *\n * The reference section positions that switch absolutely and reserves room for\n * it with an empty 72px spacer. Both are avoidable: the switch is simply the\n * first thing in the copy column, which puts it above the heading on desktop\n * and between media and heading once the card stacks — the same result the\n * reference reaches the long way round.\n */\nfunction TogglePanel({\n item,\n idPrefix,\n marketsLabel,\n platformsLabel,\n playing,\n setPlaying,\n}: TogglePanelProps) {\n const animations = item.animations;\n const [activeIndex, setActiveIndex] = useState(0);\n const switchRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n /* Guard against a caller swapping the animation array out from under us. */\n const safeIndex = Math.min(activeIndex, Math.max(animations.length - 1, 0));\n\n /* Swapping the clip stops playback, so the incoming animation starts from\n its poster rather than mid-motion. */\n useEffect(() => {\n setPlaying({});\n }, [safeIndex, setPlaying]);\n\n const hasMarkets = Boolean(item.markets && item.markets.length > 0);\n const hasPlatforms = Boolean(item.platforms && item.platforms.length > 0);\n\n /* The reference switch is a pair of links with no keyboard handling at\n all. This is a real tablist: arrows wrap, Home/End jump. */\n const onSwitchKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n const last = animations.length - 1;\n let next: number | null = null;\n\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n next = safeIndex === last ? 0 : safeIndex + 1;\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n next = safeIndex === 0 ? last : safeIndex - 1;\n } else if (event.key === \"Home\") {\n next = 0;\n } else if (event.key === \"End\") {\n next = last;\n }\n\n if (next === null) return;\n event.preventDefault();\n setActiveIndex(next);\n switchRefs.current[next]?.focus();\n };\n\n return (\n <div className=\"ot__option ot__option--toggle\">\n <div className=\"ot__toggle-media\">\n {/* A panel per animation so every switch's `aria-controls`\n resolves; only the active one builds its contents. */}\n {animations.map((animation, index) => {\n const key = `${item.id}-${animation.id ?? index}`;\n const isActive = index === safeIndex;\n\n return (\n <div\n key={key}\n className=\"ot__toggle-pane\"\n id={`${idPrefix}-media-${index}`}\n role=\"tabpanel\"\n aria-labelledby={`${idPrefix}-switch-${index}`}\n hidden={!isActive}\n >\n {isActive ? (\n <AnimationCard\n animation={animation}\n itemId={item.id}\n playing={Boolean(playing[key])}\n onToggle={() =>\n setPlaying((current) => ({\n ...current,\n [key]: !current[key],\n }))\n }\n />\n ) : null}\n </div>\n );\n })}\n </div>\n\n <div className=\"ot__toggle-side\">\n {animations.length > 1 ? (\n <div\n className=\"ot__toggle-switch\"\n role=\"tablist\"\n aria-label={`${item.title} views`}\n onKeyDown={onSwitchKeyDown}\n >\n {animations.map((animation, index) => {\n const isActive = index === safeIndex;\n const iconUrl = safeHref(animation.iconUrl);\n\n return (\n <button\n key={`${item.id}-switch-${animation.id ?? index}`}\n ref={(node) => {\n switchRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"tab\"\n id={`${idPrefix}-switch-${index}`}\n aria-controls={`${idPrefix}-media-${index}`}\n aria-selected={isActive}\n aria-label={animation.label}\n tabIndex={isActive ? 0 : -1}\n className={`ot__toggle-option${\n isActive ? \" ot__toggle-option--active\" : \"\"\n }`}\n onClick={() => setActiveIndex(index)}\n >\n {iconUrl ? (\n <img\n className=\"ot__toggle-icon\"\n src={iconUrl}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n />\n ) : (\n <span className=\"ot__toggle-option-label\">\n {animation.label}\n </span>\n )}\n </button>\n );\n })}\n </div>\n ) : null}\n\n <h3 className=\"ot__toggle-title\">{item.title}</h3>\n\n <div className=\"ot__description\">\n <p>{item.description}</p>\n </div>\n\n {/* The reference section carries no availability lists, so\n these render only when a caller supplies them. */}\n {hasMarkets || hasPlatforms ? (\n <div className=\"ot__metadata\">\n {hasMarkets ? (\n <div className=\"ot__meta-group\">\n <h4>{marketsLabel}</h4>\n <MetaList items={item.markets} />\n </div>\n ) : null}\n {hasPlatforms ? (\n <div className=\"ot__meta-group\">\n <h4>{platformsLabel}</h4>\n <MetaList items={item.platforms} />\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport function OptionsTypes({\n variant = \"tabs\",\n heading = \"Section title goes here\",\n headingLevel = \"h2\",\n items = OPTIONS_TYPES_PLACEHOLDER_ITEMS,\n defaultActiveId,\n activeId,\n onChange,\n marketsLabel = \"Markets available\",\n platformsLabel = \"Trade on\",\n disclaimer,\n className,\n ...props\n}: OptionsTypesProps) {\n const usableItems = Array.isArray(items) ? items.filter((item) => item?.id) : [];\n const [internalActiveId, setInternalActiveId] = useState(\n defaultActiveId ?? usableItems[0]?.id ?? \"\",\n );\n const selectedId =\n usableItems.find((item) => item.id === activeId)?.id ??\n usableItems.find((item) => item.id === internalActiveId)?.id ??\n usableItems[0]?.id ??\n \"\";\n const [playing, setPlaying] = useState<Record<string, boolean>>({});\n const generatedId = useId().replace(/:/g, \"\");\n const tabPrefix = `options-types-${generatedId}`;\n const Heading = headingLevel;\n\n useEffect(() => {\n setPlaying({});\n }, [selectedId]);\n\n const selectItem = (id: string) => {\n if (activeId === undefined) setInternalActiveId(id);\n onChange?.(id);\n };\n\n const rootClass = [\"ot\", `ot--${variant}`, className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"ot__inner\">\n <header className=\"ot__header\">\n <Heading className=\"ot__heading\">{heading}</Heading>\n {variant === \"tabs\" && usableItems.length > 1 ? (\n <Tabs\n items={usableItems.map((item) => ({\n id: item.id,\n label: item.label ?? item.title,\n }))}\n activeId={selectedId}\n onChange={selectItem}\n idPrefix={tabPrefix}\n aria-label={`${heading} categories`}\n className=\"ot__tabs\"\n />\n ) : null}\n </header>\n\n {usableItems.length === 0 ? null : variant === \"tabs\" ? (\n <div className=\"ot__panels\">\n {usableItems.map((item, index) => {\n const isActive = item.id === selectedId;\n return (\n <div\n key={item.id}\n id={`${tabPrefix}-panel-${index}`}\n role=\"tabpanel\"\n aria-labelledby={`${tabPrefix}-tab-${index}`}\n hidden={!isActive}\n tabIndex={0}\n >\n <OptionPanel\n item={item}\n variant=\"tabs\"\n marketsLabel={marketsLabel}\n platformsLabel={platformsLabel}\n playing={playing}\n setPlaying={setPlaying}\n />\n </div>\n );\n })}\n </div>\n ) : variant === \"toggle\" ? (\n <TogglePanel\n item={usableItems[0]}\n idPrefix={tabPrefix}\n marketsLabel={marketsLabel}\n platformsLabel={platformsLabel}\n playing={playing}\n setPlaying={setPlaying}\n />\n ) : (\n <OptionPanel\n item={usableItems[0]}\n variant=\"single\"\n marketsLabel={marketsLabel}\n platformsLabel={platformsLabel}\n playing={playing}\n setPlaying={setPlaying}\n />\n )}\n\n {disclaimer ? (\n <p className=\"ot__disclaimer\">\n <svg\n className=\"ot__disclaimer-icon\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"6.4\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path\n d=\"M8 7v4.2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"8\" cy=\"4.9\" r=\"0.85\" fill=\"currentColor\" />\n </svg>\n <span>{disclaimer}</span>\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n\nexport default OptionsTypes;\n","import type { OptionsTypesMetaItem, OptionsTypesProps } from \"./OptionsTypes.types\";\n\n/**\n * Animation paths match @deriv-web-design/lottie (`/lottie/trade-clips/...`).\n * Storybook serves packages/lottie/assets at /lottie. Icon SVGs remain on Webflow.\n */\nconst WEBFLOW_ICON_CDN = \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c2b7\";\nconst LOTTIE = \"/lottie/trade-clips\";\n\nconst FOREX: OptionsTypesMetaItem = {\n label: \"Forex\",\n icon: \"forex\",\n href: \"/markets/forex\",\n};\nconst STOCK_INDICES: OptionsTypesMetaItem = {\n label: \"Stock Indices\",\n icon: \"stock-indices\",\n href: \"/markets/stock-indices\",\n};\nconst COMMODITIES: OptionsTypesMetaItem = {\n label: \"Commodities\",\n icon: \"commodities\",\n href: \"/markets/commodities\",\n};\nconst DERIVED_INDICES: OptionsTypesMetaItem = {\n label: \"Derived Indices\",\n icon: \"derived-indices\",\n href: \"/markets/derived-indices/synthetic-indices\",\n};\nconst CRYPTOCURRENCIES: OptionsTypesMetaItem = {\n label: \"Cryptocurrencies\",\n icon: \"cryptocurrencies\",\n href: \"/markets/cryptocurrencies\",\n};\nconst DERIV_TRADER: OptionsTypesMetaItem = {\n label: \"Deriv Trader\",\n icon: \"deriv-trader\",\n iconUrl: `${WEBFLOW_ICON_CDN}/68e3a18f20e4f9f6eb9109e8_6751d07ab72617a385122395_deriv%2520product-deriv%2520trader.svg`,\n href: \"/trading-platforms/deriv-trader\",\n};\nconst DERIV_BOT: OptionsTypesMetaItem = {\n label: \"Deriv Bot\",\n icon: \"deriv-bot\",\n iconUrl: `${WEBFLOW_ICON_CDN}/68e3a18f42c1592e9454466e_674992f6dd562e5f0b8e7679_deriv%2520product-deriv%2520bot.svg`,\n href: \"/trading-platforms/deriv-bot\",\n};\n\nconst DIGITAL_MARKETS = [FOREX, STOCK_INDICES, COMMODITIES, DERIVED_INDICES];\nconst TRADER_AND_BOT = [DERIV_TRADER, DERIV_BOT];\n\nexport const OPTIONS_TYPES_DIGITAL_CONTENT: OptionsTypesProps = {\n variant: \"tabs\",\n heading: \"Types of Digital Options\",\n defaultActiveId: \"rise-fall\",\n disclaimer: \"Trade types and features offered may vary by platform and device.\",\n items: [\n {\n id: \"rise-fall\",\n title: \"Rise/Fall\",\n description:\n \"Predict whether the market price will rise above or fall below the entry price at the end of your contract.\",\n animations: [\n {\n id: \"rise\",\n label: \"Rise\",\n src: `${LOTTIE}/rise.lottie`,\n },\n {\n id: \"fall\",\n label: \"Fall\",\n src: `${LOTTIE}/fall.lottie`,\n },\n ],\n markets: DIGITAL_MARKETS,\n platforms: TRADER_AND_BOT,\n },\n {\n id: \"higher-lower\",\n title: \"Higher/Lower\",\n description:\n \"Choose a target price at the start (barrier), and predict if the final price will be higher or lower than barrier.\",\n animations: [\n {\n id: \"higher\",\n label: \"Higher\",\n src: `${LOTTIE}/higher.lottie`,\n },\n {\n id: \"lower\",\n label: \"Lower\",\n src: `${LOTTIE}/lower.lottie`,\n },\n ],\n markets: DIGITAL_MARKETS,\n platforms: TRADER_AND_BOT,\n },\n {\n id: \"touch-no-touch\",\n title: \"Touch/No Touch\",\n description:\n 'Predict whether the market price will \"touch\" or not touch a target price (barrier) during the contract period.',\n animations: [\n {\n id: \"touch\",\n label: \"Touch\",\n src: `${LOTTIE}/touch.lottie`,\n },\n {\n id: \"no-touch\",\n label: \"No Touch\",\n src: `${LOTTIE}/no-touch.lottie`,\n },\n ],\n markets: DIGITAL_MARKETS,\n platforms: TRADER_AND_BOT,\n },\n ],\n};\n\nexport const OPTIONS_TYPES_ACCUMULATOR_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Accumulator Options work\",\n items: [\n {\n id: \"accumulator-options\",\n title: \"Accumulator Options\",\n description:\n \"Set a growth rate between 1–5% and see if the market price stays within a defined range from the previous spot price. Your payout grows exponentially based on the growth rate you choose. Keep in mind: higher growth rates mean narrower ranges for price movements.\",\n animations: [\n {\n id: \"accumulator\",\n label: \"Accumulator\",\n src: `${LOTTIE}/accumulator.lottie`,\n },\n ],\n markets: [DERIVED_INDICES],\n platforms: TRADER_AND_BOT,\n },\n ],\n};\n\nexport const OPTIONS_TYPES_VANILLA_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Vanilla Options work\",\n items: [\n {\n id: \"vanilla-call-put\",\n title: \"Vanilla Call/Put\",\n description:\n \"Choose a strike price and decide your position. Open a Call position if you expect the price to rise above the strike price, or a Put position if you think it will fall below it. With fixed expiry times, this provides precise price level trading.\",\n animations: [\n {\n id: \"call\",\n label: \"Call\",\n src: `${LOTTIE}/vanilla-call.lottie`,\n },\n {\n id: \"put\",\n label: \"Put\",\n src: `${LOTTIE}/vanilla-put.lottie`,\n },\n ],\n markets: [DERIVED_INDICES],\n platforms: [DERIV_TRADER],\n },\n ],\n};\n\nexport const OPTIONS_TYPES_TURBO_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Turbo Options work\",\n items: [\n {\n id: \"turbo-long-short\",\n title: \"Turbo Long/Short\",\n description:\n \"Decide whether the market price will stay above (Long) or drop below (Short) a set barrier. Your payout adjusts based on how far the price moves in your chosen direction, letting you take advantage of both rising and falling markets.\",\n animations: [\n {\n id: \"long\",\n label: \"Long\",\n src: `${LOTTIE}/turbo-long.lottie`,\n },\n {\n id: \"short\",\n label: \"Short\",\n src: `${LOTTIE}/turbo-short.lottie`,\n },\n ],\n markets: [DERIVED_INDICES],\n platforms: [DERIV_TRADER],\n },\n ],\n};\n\nexport const OPTIONS_TYPES_MULTIPLIERS_CONTENT: OptionsTypesProps = {\n variant: \"single\",\n heading: \"How do Multipliers work\",\n items: [\n {\n id: \"multipliers-up-down\",\n title: \"Multipliers Up/Down\",\n description:\n \"Select whether you expect the price to rise (Up) or fall (Down). Your multiplier will help amplify any potential gains. The more the market moves in your predicted direction, the greater your potential payout.\",\n animations: [\n {\n id: \"up\",\n label: \"Up\",\n src: `${LOTTIE}/multipliers-up.lottie`,\n },\n {\n id: \"down\",\n label: \"Down\",\n src: `${LOTTIE}/multipliers-down.lottie`,\n },\n ],\n markets: [DERIVED_INDICES, FOREX, CRYPTOCURRENCIES, COMMODITIES],\n platforms: TRADER_AND_BOT,\n },\n ],\n};\n\n/**\n * EU multipliers — `.section_multipliers_types` on\n * deriv.com/eu/trade/multipliers.\n *\n * The EU section differs from the ROW one above in three ways: the two clips\n * are two views of one idea rather than two things to show at once, so they\n * share a single well behind an Up/Down switch (`variant: \"toggle\"`); the card\n * carries its own heading; and there are no availability lists.\n */\nexport const OPTIONS_TYPES_EU_MULTIPLIERS_CONTENT: OptionsTypesProps = {\n variant: \"toggle\",\n heading: \"How do multipliers work\",\n items: [\n {\n id: \"eu-multipliers\",\n title: \"Multipliers\",\n description:\n \"Choose a multiplier (up to 30x) and predict if the market price will go up or down compared to the entry price. Your potential payout grows the further the market price moves in your predicted direction, boosted by the multiplier. Losses are limited to the initial amount you put into the contract.\",\n animations: [\n {\n id: \"up\",\n label: \"Up\",\n src: `${LOTTIE}/multipliers-up.lottie`,\n iconUrl: `${WEBFLOW_ICON_CDN}/68e4859893e33d078096e151_66585fe0e1dc7e70cc75dec1_multipliers-up-sm.svg`,\n },\n {\n id: \"down\",\n label: \"Down\",\n src: `${LOTTIE}/multipliers-down.lottie`,\n iconUrl: `${WEBFLOW_ICON_CDN}/68e4859893e33d078096e155_66585fe0e1dc7e70cc75dee8_multipliers-down-sm.svg`,\n },\n ],\n },\n ],\n};\n","import type { EntityInfoSectionLink, EntityInfoSectionProps } from \"./EntityInfoSection.types\";\nimport { Link } from \"../../components/Link\";\nimport \"./EntityInfoSection.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ──\n * `name` / `description` are inlined as literals in the destructuring below\n * rather than referenced through a const, so the registry generator can read\n * them and `validate:registry` can verify the documented defaults. */\n\nconst DEFAULT_LINKS: EntityInfoSectionLink[] = [{ label: \"View licence\", href: \"#\" }];\n\n/* ── EntityInfoSection ─────────────────────────────────────────── */\n\nexport const EntityInfoSection = ({\n name = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n bullets,\n links,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: EntityInfoSectionProps) => {\n const resolvedLinks = links && links.length > 0 ? links : DEFAULT_LINKS;\n const hasBullets = !!bullets && bullets.length > 0;\n\n const rootClass = [\"eis\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"eis__inner\">\n <div className=\"eis__content\">\n <HeadingTag className=\"eis__name\">{name}</HeadingTag>\n\n {description && <p className=\"eis__description\">{description}</p>}\n\n {hasBullets && (\n <ul className=\"eis__bullets\">\n {bullets!.map((bullet, i) => (\n <li key={i} className=\"eis__bullets-item\">\n {bullet}\n </li>\n ))}\n </ul>\n )}\n\n {resolvedLinks.length > 0 && (\n <ul className=\"eis__links\">\n {resolvedLinks.map((link, i) => {\n const isExternal = link.external ?? true;\n return (\n <li key={link.id ?? i} className=\"eis__links-item\">\n <Link\n className=\"eis__link\"\n colorScheme=\"coral\"\n href={link.href}\n label={link.label}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n />\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default EntityInfoSection;\n","import type { CountryLinkGridItem, CountryLinkGridProps } from \"./CountryLinkGrid.types\";\nimport \"./CountryLinkGrid.css\";\n\n/* ── Default content — generic placeholder (design-system Rule 6) ──\n * `title` / `description` are inlined as literals in the destructuring below\n * rather than referenced through a const, so the registry generator can read\n * them and `validate:registry` can verify the documented defaults.\n *\n * No real country list is baked in — the placeholder items are numbered\n * \"Country name\" entries and carry no flag sources. */\n\nconst DEFAULT_ITEMS: CountryLinkGridItem[] = [\n { label: \"Country name\", href: \"#\" },\n { label: \"Country name\", href: \"#\" },\n { label: \"Country name\", href: \"#\" },\n { label: \"Country name\", href: \"#\" },\n];\n\n/* ── CountryLinkGrid ───────────────────────────────────────────── */\n\nexport const CountryLinkGrid = ({\n title = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n items,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: CountryLinkGridProps) => {\n const resolvedItems = items && items.length > 0 ? items : DEFAULT_ITEMS;\n\n const rootClass = [\"clg\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"clg__inner\">\n <div className=\"clg__layout\">\n <div className=\"clg__header\">\n <HeadingTag className=\"clg__title\">{title}</HeadingTag>\n\n {description && <p className=\"clg__description\">{description}</p>}\n </div>\n\n {resolvedItems.length > 0 && (\n <ul className=\"clg__list\">\n {resolvedItems.map((item, i) => {\n const isExternal = item.external ?? true;\n return (\n <li key={item.id ?? i} className=\"clg__item\">\n {/* Plain anchor, not the shared `Link`: the whole\n row (flag + name) is the click target, there is\n no chevron, and the label must wrap. */}\n <a\n className=\"clg__link\"\n href={item.href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n {item.iconSrc && (\n <img\n className=\"clg__flag\"\n src={item.iconSrc}\n alt={item.iconAlt ?? \"\"}\n loading=\"lazy\"\n width={36}\n height={24}\n />\n )}\n <span className=\"clg__text\">{item.label}</span>\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n </section>\n );\n};\n\nexport default CountryLinkGrid;\n","import { useState } from \"react\";\nimport type { MouseEvent } from \"react\";\nimport type {\n DocumentChipsDocument,\n DocumentChipsGroup,\n DocumentChipsProps,\n} from \"./DocumentChips.types\";\nimport { Accordion } from \"../../components/Accordion\";\nimport { Link } from \"../../components/Link\";\nimport \"./DocumentChips.css\";\n\nconst DEFAULT_GROUPS: DocumentChipsGroup[] = [\n {\n id: \"group-one\",\n title: \"First group title\",\n documents: [\n {\n id: \"doc-one\",\n title: \"First document title\",\n href: \"#\",\n languageLink: { label: \"Choose language\", href: \"#\" },\n },\n {\n id: \"doc-two\",\n title: \"Second document title\",\n href: \"#\",\n languageLink: { label: \"Choose language\", href: \"#\" },\n },\n ],\n },\n {\n id: \"group-two\",\n title: \"Second group title\",\n documents: [\n { id: \"doc-three\", title: \"Third document title\", href: \"#\" },\n { id: \"doc-four\", title: \"Fourth document title\", href: \"#\" },\n ],\n },\n];\n\ninterface DocumentChipProps {\n document: DocumentChipsDocument;\n iconSrc: string;\n iconAlt: string;\n onLanguageSelect?: (\n document: DocumentChipsDocument,\n event: MouseEvent<HTMLAnchorElement>\n ) => void;\n}\n\nconst DocumentChip = ({ document, iconSrc, iconAlt, onLanguageSelect }: DocumentChipProps) => {\n const isExternal = document.external ?? true;\n const languageLink = document.languageLink;\n\n const handleLanguageClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (!onLanguageSelect) return;\n event.preventDefault();\n onLanguageSelect(document, event);\n };\n\n return (\n <li className=\"dch__doc-item\">\n <div className=\"dch__doc\">\n <a\n className=\"dch__doc-link\"\n href={document.href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n <img\n className=\"dch__doc-icon\"\n src={document.iconSrc ?? iconSrc}\n alt={iconAlt}\n loading=\"lazy\"\n aria-hidden={iconAlt ? undefined : true}\n />\n <span className=\"dch__doc-title\">{document.title}</span>\n </a>\n\n {languageLink && (\n <div className=\"dch__doc-action\">\n <Link\n className=\"dch__doc-language\"\n colorScheme=\"black\"\n label={languageLink.label ?? \"Choose language\"}\n href={languageLink.href ?? document.href}\n onClick={handleLanguageClick}\n aria-haspopup={onLanguageSelect ? \"dialog\" : undefined}\n />\n </div>\n )}\n </div>\n </li>\n );\n};\n\nconst DocumentChipList = ({\n documents,\n iconSrc,\n iconAlt,\n onLanguageSelect,\n}: {\n documents: DocumentChipsDocument[];\n iconSrc: string;\n iconAlt: string;\n onLanguageSelect?: DocumentChipsProps[\"onLanguageSelect\"];\n}) => (\n <ul className=\"dch__docs\">\n {documents.map((document, j) => (\n <DocumentChip\n key={document.id ?? j}\n document={document}\n iconSrc={iconSrc}\n iconAlt={iconAlt}\n onLanguageSelect={onLanguageSelect}\n />\n ))}\n </ul>\n);\n\nexport const DocumentChips = ({\n variant = \"accordion\",\n title = \"Section title goes here\",\n description,\n groups,\n iconSrc = \"https://media.ffycdn.net/eu/deriv/d/8d33a322464c4809a9d01119104caa0d\",\n iconAlt = \"\",\n allowMultipleOpen = false,\n onLanguageSelect,\n headingLevel: HeadingTag = \"h2\",\n className,\n ...props\n}: DocumentChipsProps) => {\n const resolvedGroups = groups && groups.length > 0 ? groups : DEFAULT_GROUPS;\n const groupKeys = resolvedGroups.map((group, i) => String(group.id ?? i));\n\n const [openKeys, setOpenKeys] = useState<string[] | undefined>(undefined);\n const resolvedOpenKeys = openKeys === undefined ? groupKeys.slice(0, 1) : openKeys;\n\n const handleToggle = (key: string, next: boolean) => {\n setOpenKeys((current) => {\n const base = current === undefined ? groupKeys.slice(0, 1) : current;\n if (!next) return base.filter((k) => k !== key);\n return allowMultipleOpen ? [...base.filter((k) => k !== key), key] : [key];\n });\n };\n\n const flatDocuments = resolvedGroups.flatMap((group) => group.documents ?? []);\n\n const rootClass = [\"dch\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"dch__inner\">\n {(title || description) && (\n <div className=\"dch__header\">\n {title && <HeadingTag className=\"dch__title\">{title}</HeadingTag>}\n {description && <p className=\"dch__description\">{description}</p>}\n </div>\n )}\n\n {variant === \"flat\" ? (\n <DocumentChipList\n documents={flatDocuments}\n iconAlt={iconAlt}\n iconSrc={iconSrc}\n onLanguageSelect={onLanguageSelect}\n />\n ) : (\n <div className=\"dch__groups\">\n {resolvedGroups.map((group, i) => {\n const key = groupKeys[i];\n return (\n <Accordion\n key={key}\n className=\"dch__group\"\n title={group.title}\n open={resolvedOpenKeys.includes(key)}\n onToggle={(next) => handleToggle(key, next)}\n showTopDivider={i > 0}\n >\n <DocumentChipList\n documents={group.documents ?? []}\n iconAlt={iconAlt}\n iconSrc={iconSrc}\n onLanguageSelect={onLanguageSelect}\n />\n </Accordion>\n );\n })}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default DocumentChips;\n","import { useCallback, useEffect, useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport type { LinkModalProps } from \"./LinkModal.types\";\nimport \"./LinkModal.css\";\n\nconst XMarkIcon = () => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M5 5l14 14M19 5L5 19\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"button:not([disabled])\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(\",\");\n\nexport const LinkModal = ({\n open,\n onClose,\n title = \"Dialog title\",\n closeLabel = \"Close\",\n children,\n headingLevel: HeadingTag = \"h2\",\n container,\n className,\n ...props\n}: LinkModalProps) => {\n const titleId = useId();\n const panelRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const getFocusable = useCallback(() => {\n const panel = panelRef.current;\n if (!panel) return [] as HTMLElement[];\n return Array.from(panel.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (el) => el.offsetParent !== null || el === document.activeElement\n );\n }, []);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n triggerRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n\n panelRef.current?.focus();\n\n return () => {\n const trigger = triggerRef.current;\n triggerRef.current = null;\n if (trigger && document.contains(trigger)) trigger.focus();\n };\n }, [open]);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onClose]);\n\n useEffect(() => {\n if (!open || typeof document === \"undefined\") return;\n\n const body = document.body;\n const previousOverflow = body.style.overflow;\n const previousPaddingRight = body.style.paddingRight;\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n const current = parseFloat(window.getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${current + scrollbarWidth}px`;\n }\n\n return () => {\n body.style.overflow = previousOverflow;\n body.style.paddingRight = previousPaddingRight;\n };\n }, [open]);\n\n const handlePanelKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Tab\") return;\n\n const focusable = getFocusable();\n if (focusable.length === 0) {\n event.preventDefault();\n panelRef.current?.focus();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement;\n\n if (event.shiftKey) {\n if (active === first || active === panelRef.current) {\n event.preventDefault();\n last.focus();\n }\n return;\n }\n\n if (active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n if (!open || typeof document === \"undefined\") return null;\n\n const rootClass = [\"lkm\", className].filter(Boolean).join(\" \");\n\n return createPortal(\n <div className={rootClass} onClick={onClose}>\n <div className=\"lkm__scrim\" aria-hidden=\"true\" />\n\n <div\n ref={panelRef}\n className=\"lkm__panel\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={handlePanelKeyDown}\n {...props}\n >\n <button\n type=\"button\"\n className=\"lkm__close\"\n onClick={onClose}\n aria-label={closeLabel}\n >\n <XMarkIcon />\n </button>\n\n <HeadingTag id={titleId} className=\"lkm__title\">\n {title}\n </HeadingTag>\n\n {children && <div className=\"lkm__body\">{children}</div>}\n </div>\n </div>,\n container ?? document.body\n );\n};\n\nexport default LinkModal;\n","import { LinkModal } from \"../../components/LinkModal\";\nimport type { LanguageSelectModalOption, LanguageSelectModalProps } from \"./LanguageSelectModal.types\";\nimport \"./LanguageSelectModal.css\";\n\nconst DEFAULT_OPTIONS: LanguageSelectModalOption[] = [\n { id: \"option-one\", label: \"First option\", href: \"#\" },\n { id: \"option-two\", label: \"Second option\", href: \"#\" },\n { id: \"option-three\", label: \"Third option\", href: \"#\" },\n { id: \"option-four\", label: \"Fourth option\", href: \"#\" },\n { id: \"option-five\", label: \"Fifth option\", href: \"#\" },\n { id: \"option-six\", label: \"Sixth option\", href: \"#\" },\n];\n\nexport const LanguageSelectModal = ({\n open,\n onClose,\n title = \"Select your language\",\n closeLabel = \"Close\",\n options,\n headingLevel = \"h2\",\n container,\n className,\n ...props\n}: LanguageSelectModalProps) => {\n const resolvedOptions = options && options.length > 0 ? options : DEFAULT_OPTIONS;\n\n return (\n <LinkModal\n open={open}\n onClose={onClose}\n title={title}\n closeLabel={closeLabel}\n headingLevel={headingLevel}\n container={container}\n className={className}\n {...props}\n >\n <ul className=\"lsm__grid\">\n {resolvedOptions.map((option, i) => {\n const isExternal = option.external ?? true;\n return (\n <li key={option.id ?? i} className=\"lsm__grid-item\">\n <a\n className=\"lsm__option\"\n href={option.href}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n {option.flagSrc && (\n <img\n className=\"lsm__flag\"\n src={option.flagSrc}\n alt={option.flagAlt ?? \"\"}\n loading=\"lazy\"\n aria-hidden={option.flagAlt ? undefined : true}\n />\n )}\n <span className=\"lsm__option-label\">{option.label}</span>\n </a>\n </li>\n );\n })}\n </ul>\n </LinkModal>\n );\n};\n\nexport default LanguageSelectModal;\n","import { useCallback, useMemo, useState } from \"react\";\nimport type { AffiliatesSliderProps } from \"./AffiliatesSlider.types\";\nimport \"./AffiliatesSlider.css\";\n\nconst ArrowIcon = () => (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M24.5547 16.9688L17.6797 23.8438C17.4453 24.0781 17.0156 24.0781 16.7812 23.8438C16.5469 23.6094 16.5469 23.1797 16.7812 22.9453L22.6016 17.125H7.875C7.52344 17.125 7.25 16.8516 7.25 16.5C7.25 16.1875 7.52344 15.875 7.875 15.875H22.6016L16.7812 10.0938C16.5469 9.85938 16.5469 9.42969 16.7812 9.19531C17.0156 8.96094 17.4453 8.96094 17.6797 9.19531L24.5547 16.0703C24.7891 16.3047 24.7891 16.7344 24.5547 16.9688Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.72\"\n />\n </svg>\n);\n\nconst TrackGradient = () => (\n <svg\n preserveAspectRatio=\"none\"\n width=\"100%\"\n height=\"49\"\n viewBox=\"0 0 408 50\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n className=\"afs__track-gradient\"\n >\n <path\n opacity=\"0.5\"\n d=\"M408 0.25L0 49.25H408V0.25Z\"\n fill=\"url(#afs-track-gradient)\"\n />\n <defs>\n <linearGradient\n id=\"afs-track-gradient\"\n x1=\"0\"\n y1=\"9.91566\"\n x2=\"178.34\"\n y2=\"227.916\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"var(--afs-track-gradient-start)\" />\n <stop offset=\"1\" stopColor=\"var(--afs-track-gradient-end)\" />\n </linearGradient>\n </defs>\n </svg>\n);\n\nconst buildDefaultTicks = (min: number, max: number) => {\n const span = max - min;\n return [0, 0.25, 0.5, 0.75, 1].map((ratio) => Math.round(min + span * ratio));\n};\n\nconst formatIncome = (value: number) =>\n new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 0 }).format(value);\n\nexport const AffiliatesSlider = ({\n title = \"Section title goes here\",\n description = \"Explain how this specific feature helps your user.\",\n min = 10,\n max = 50,\n step = 1,\n defaultValue = 10,\n value,\n onValueChange,\n referralsLabel = \"total referrals (Min deposit amount of $100 each)\",\n incomeLabel = \"your potential income per month\",\n incomePerReferral = 100,\n currencySymbol = \"$\",\n tickValues,\n disclaimer = \"This calculator provides estimates only and may not reflect actual earnings.\",\n disclaimerIconSrc = \"https://cdn.prod.website-files.com/68da5c86c91c54f39c86c28a/68da5c86c91c54f39c86cdaf_icon.svg\",\n disclaimerIconAlt = \"\",\n sliderLabel = \"Number of referrals\",\n className,\n ...props\n}: AffiliatesSliderProps) => {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const currentValue = value ?? internalValue;\n\n const handleChange = useCallback(\n (next: number) => {\n if (value === undefined) setInternalValue(next);\n onValueChange?.(next);\n },\n [onValueChange, value]\n );\n\n const ticks = useMemo(\n () => tickValues ?? buildDefaultTicks(min, max),\n [max, min, tickValues]\n );\n\n const fillPercent = ((currentValue - min) / (max - min)) * 100;\n const income = currentValue * incomePerReferral;\n\n const rootClass = [\"afs\", className].filter(Boolean).join(\" \");\n\n return (\n <section className={rootClass} {...props}>\n <div className=\"afs__inner\">\n <div className=\"afs__header\">\n {title && <h2 className=\"afs__title\">{title}</h2>}\n {description && <p className=\"afs__description\">{description}</p>}\n </div>\n\n <div className=\"afs__form\">\n <div className=\"afs__controls\">\n <div className=\"afs__referrals\">\n <div className=\"afs__metric\">{currentValue}</div>\n <p className=\"afs__metric-label\">{referralsLabel}</p>\n </div>\n\n <div className=\"afs__arrow\" aria-hidden=\"true\">\n <ArrowIcon />\n </div>\n\n <div className=\"afs__slider-block\">\n <TrackGradient />\n\n <div className=\"afs__track-wrap\">\n <div className=\"afs__track\">\n <div\n className=\"afs__fill\"\n style={{ width: `${fillPercent}%` }}\n />\n <div\n className=\"afs__handle\"\n style={{ left: `${fillPercent}%` }}\n aria-hidden=\"true\"\n />\n <input\n type=\"range\"\n className=\"afs__input\"\n min={min}\n max={max}\n step={step}\n value={currentValue}\n aria-label={sliderLabel}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={currentValue}\n onChange={(event) =>\n handleChange(Number(event.target.value))\n }\n />\n </div>\n </div>\n\n <div className=\"afs__ticks\">\n {ticks.map((tick) => (\n <span key={tick} className=\"afs__tick\">\n {tick}\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"afs__income\">\n <div className=\"afs__income-value\">\n <span className=\"afs__metric\">{currencySymbol}</span>\n <span className=\"afs__metric\">{formatIncome(income)}</span>\n </div>\n <p className=\"afs__metric-label afs__metric-label--right\">\n {incomeLabel}\n </p>\n </div>\n </div>\n </div>\n\n {disclaimer && (\n <div className=\"afs__disclaimer\">\n {disclaimerIconSrc && (\n <img\n className=\"afs__disclaimer-icon\"\n src={disclaimerIconSrc}\n alt={disclaimerIconAlt}\n loading=\"lazy\"\n aria-hidden={disclaimerIconAlt ? undefined : true}\n />\n )}\n <p className=\"afs__disclaimer-text\">{disclaimer}</p>\n </div>\n )}\n </div>\n </section>\n );\n};\n\nexport default AffiliatesSlider;\n"],"mappings":";AA6BQ,cAIA,YAJA;AA1BD,IAAM,SAAS,CAAC;AAAA,EACnB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAmB;AACf,QAAM,aAAa,iBAAiB;AAEpC,QAAM,aAAa;AAAA,IACf;AAAA,IACA,GAAG,WAAW,IAAI,OAAO;AAAA,IACzB,aAAa,aAAa;AAAA,IAC1B,YAAY,cAAc;AAAA,IAC1B,aAAa;AAAA,EACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,QAAM,WAAW,OACb,oBAAC,UAAK,WAAU,QAAQ,gBAAK,IAC7B;AAEJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,MACX;AAAA,MACA,cAAY,cAAc,QAAQ,QAAQ;AAAA,MACzC,GAAG;AAAA,MAEH;AAAA,yBAAiB,eAAe;AAAA,QAEhC,CAAC,cACE,oBAAC,UAAK,WAAU,SAAS,mBAAS,UAAS;AAAA,QAG9C,iBAAiB,eAAe;AAAA,QAEhC,iBAAiB,gBAAgB;AAAA,QAEjC,iBACG,oBAAC,UAAK,WAAU,aAAY,eAAY,QAAO;AAAA;AAAA;AAAA,EAEvD;AAER;;;ACjDQ,gBAAAA,MAqCA,QAAAC,aArCA;AAFR,IAAM,cAAc,MAChB,gBAAAD,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG,0BAAAA,KAAC,UAAK,GAAE,uBAAsB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GACvH;AAGG,IAAM,OAAO,CAAC;AAAA,EACjB,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAiB;AACb,QAAM,UAAU,CAAC,CAAC;AAElB,QAAM,aAAa;AAAA,IACf;AAAA,IACA;AAAA,IACA,UAAU,aAAa;AAAA,IACvB,WAAW,aAAa;AAAA,IACxB,aAAa;AAAA,EACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,QAAM,cAAc,CAAC,MAA2C;AAC5D,QAAI,UAAU;AACV,QAAE,eAAe;AACjB;AAAA,IACJ;AACA,cAAU,CAAC;AAAA,EACf;AAEA,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,MACX,iBAAe,YAAY;AAAA,MAC3B,UAAU,WAAW,KAAK;AAAA,MAC1B,SAAS;AAAA,MACR,GAAG;AAAA,MAEH;AAAA,mBAAW,iBAAiB,UAAU,gBAAAD,KAAC,UAAK,WAAU,QAAQ,gBAAK;AAAA,QAEpE,gBAAAA,KAAC,UAAK,WAAU,SAAS,mBAAS,UAAS;AAAA,QAE1C,WAAW,iBAAiB,WAAW,gBAAAA,KAAC,UAAK,WAAU,QAAQ,gBAAK;AAAA,QAEpE,CAAC,WAAW,eACT,gBAAAA,KAAC,UAAK,WAAU,WAAU,eAAY,QAClC,0BAAAA,KAAC,eAAY,GACjB;AAAA;AAAA;AAAA,EAER;AAER;;;ACrCQ,SAMa,OAAAE,MANb,QAAAC,aAAA;AAtBD,IAAM,OAAO,CAAC;AAAA,EACjB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAiB;AACb,QAAM,aAAa;AAAA,IACf;AAAA,IACA;AAAA,IACA,WAAW,aAAa;AAAA,IACxB,aAAa;AAAA,EACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,MACX;AAAA,MACA,gBAAc;AAAA,MACb,GAAG;AAAA,MAEH;AAAA,gBAAQ,gBAAAD,KAAC,UAAK,WAAU,QAAQ,gBAAK;AAAA,QACtC,gBAAAA,KAAC,UAAK,WAAU,SAAS,mBAAS,UAAS;AAAA,QAC1C,OAAO,gBAAAA,KAAC,UAAK,WAAU,OAAO,eAAI;AAAA,QAClC,iBACG,gBAAAA,KAAC,UAAK,WAAU,aAAY,eAAY,QAAO;AAAA;AAAA;AAAA,EAEvD;AAER;;;ACfQ,SACa,OAAAE,MADb,QAAAC,aAAA;AArBD,IAAM,MAAM,CAAC;AAAA,EAChB,OAAO;AAAA,EACP,UAAU;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAgB;AACZ,QAAM,aAAa;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,SACI,gBAAAA,MAAC,UAAK,WAAW,YAAa,GAAG,OAC5B;AAAA,YAAQ,gBAAAD,KAAC,UAAK,WAAU,QAAQ,gBAAK;AAAA,IACtC,gBAAAA,KAAC,UAAK,WAAU,SAAS,mBAAS,UAAS;AAAA,KAC/C;AAER;;;AC7BA,SAAS,gBAAgB;AAMjB,gBAAAE,MAmCI,QAAAC,aAnCJ;AAFR,IAAMC,eAAc,MAChB,gBAAAF,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG,0BAAAA,KAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAChH;AAGG,IAAM,YAAY,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB;AACJ,MAAsB;AAClB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,WAAW;AAC5D,QAAM,eAAe,SAAS;AAC9B,QAAM,SAAS,eAAe,OAAO;AAErC,QAAM,eAAe,MAAM;AACvB,UAAM,OAAO,CAAC;AACd,QAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,eAAW,IAAI;AAAA,EACnB;AAEA,QAAM,aAAa,CAAC,aAAa,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1E,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,MACX,OAAO;AAAA,QACH,WAAW,iBAAiB,6CAA6C;AAAA,QACzE,cAAc,oBAAoB,6CAA6C;AAAA,MACnF;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,SAAS;AAAA,YACT,iBAAe;AAAA,YAEf;AAAA,8BAAAD,KAAC,UAAK,WAAU,4BACZ,0BAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAM,GAC9C;AAAA,cACA,gBAAAA,KAAC,UAAK,WAAW,CAAC,sBAAsB,SAAS,gCAAgC,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACzG,0BAAAA,KAACE,cAAA,EAAY,GACjB;AAAA,cACC,iBACG,gBAAAF,KAAC,UAAK,WAAU,yBAAwB,eAAY,QAAO;AAAA;AAAA;AAAA,QAEnE;AAAA,QAEA,gBAAAA,KAAC,SAAI,WAAW,CAAC,2BAA2B,SAAS,kCAAkC,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC/G,0BAAAA,KAAC,SAAI,WAAU,yBACX,0BAAAA,KAAC,SAAI,WAAU,mBAAmB,UAAS,GAC/C,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AChEA,SAAS,kBAAkB;AAKvB,SAsCQ,UArCJ,OAAAG,MADJ,QAAAC,aAAA;AADJ,IAAM,cAAc,MAChB,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG;AAAA,kBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACpE,gBAAAA,KAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,GAClH;AAGJ,IAAM,WAAW,MACb,gBAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG;AAAA,kBAAAD,KAAC,UAAK,GAAE,2BAA0B,QAAO,gBAAe,aAAY,OAAM,gBAAe,SAAQ;AAAA,EACjG,gBAAAA,KAAC,UAAK,GAAE,YAAW,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,EACjF,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,QAAO,GAAE,QAAO,MAAK,gBAAe;AAAA,GAC1D;AAGG,IAAM,YAAY;AAAA,EACrB,CACI;AAAA,IACI,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACP,GACA,QACC;AACD,UAAM,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,aAAa;AAAA,MACrB,aAAa;AAAA,IACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,UAAM,QACF,gBAAAC,MAAA,YACI;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UACV;AAAA,UACC,GAAG;AAAA;AAAA,MACR;AAAA,MAEC,WAAW,aACR,gBAAAA,KAAC,UAAK,WAAU,wBACZ,0BAAAA,KAAC,eAAY,GACjB;AAAA,MAEH,WAAW,UACR,gBAAAA,KAAC,UAAK,WAAU,qBACZ,0BAAAA,KAAC,YAAS,GACd;AAAA,OAER;AAGJ,WACI,gBAAAC,MAAC,SAAI,WAAW,cAAc,iBAAe,YAAY,QACpD;AAAA,eACG,gBAAAD,KAAC,WAAM,WAAU,YAAW,SAAS,IAChC,iBACL;AAAA,MAEH,QAAQ,gBAAAA,KAAC,SAAI,WAAU,UAAU,iBAAM,IAAS;AAAA,OACrD;AAAA,EAER;AACJ;AAEA,UAAU,cAAc;;;AC9ExB,SAAS,cAAAE,aAAY,QAAQ,YAAAC,WAAU,mBAAqC;AAOxE,SA2GQ,YAAAC,WA1GJ,OAAAC,MADJ,QAAAC,aAAA;AADJ,IAAM,aAAa,MACf,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG;AAAA,kBAAAD,KAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,KAAI,QAAO,gBAAe,aAAY,QAAO;AAAA,EACzE,gBAAAA,KAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,QAAO,eAAc,SAAQ;AAAA,GAC5F;AAGJ,IAAM,YAAY,MACd,gBAAAC,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG;AAAA,kBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,QAAO;AAAA,EACrE,gBAAAA,KAAC,UAAK,GAAE,sBAAqB,QAAO,gBAAe,aAAY,QAAO,eAAc,SAAQ;AAAA,GAChG;AAGJ,IAAME,eAAc,MAChB,gBAAAD,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG;AAAA,kBAAAD,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,QAAO,gBAAe,aAAY,OAAM;AAAA,EACpE,gBAAAA,KAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,GAClH;AAGJ,IAAMG,YAAW,MACb,gBAAAF,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG;AAAA,kBAAAD,KAAC,UAAK,GAAE,2BAA0B,QAAO,gBAAe,aAAY,OAAM,gBAAe,SAAQ;AAAA,EACjG,gBAAAA,KAAC,UAAK,GAAE,YAAW,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,EACjF,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,QAAO,GAAE,QAAO,MAAK,gBAAe;AAAA,GAC1D;AAKG,IAAM,cAAcI;AAAA,EACvB,CACI;AAAA,IACI,UAAU;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACP,GACA,QACC;AACD,UAAM,WAAW,OAAyB,IAAI;AAG9C,UAAM,SAAS;AAAA,MACX,CAAC,SAAkC;AAC/B,QAAC,SAA6D,UAAU;AACxE,YAAI,OAAO,QAAQ,YAAY;AAC3B,cAAI,IAAI;AAAA,QACZ,WAAW,KAAK;AACZ,UAAC,IAAwD,UAAU;AAAA,QACvE;AAAA,MACJ;AAAA,MACA,CAAC,GAAG;AAAA,IACR;AAGA,UAAM,eAAe,UAAU;AAC/B,UAAM,CAAC,kBAAkB,mBAAmB,IAAIC;AAAA,MAC5C,QAAQ,YAAY;AAAA,IACxB;AACA,UAAM,WAAW,eAAe,QAAQ,KAAK,IAAI;AAEjD,UAAM,eAAe,CAAC,MAAqC;AACvD,UAAI,CAAC,cAAc;AACf,4BAAoB,QAAQ,EAAE,OAAO,KAAK,CAAC;AAAA,MAC/C;AACA,iBAAW,CAAC;AAAA,IAChB;AAEA,UAAM,cAAc,MAAM;AACtB,UAAI,CAAC,gBAAgB,SAAS,SAAS;AACnC,iBAAS,QAAQ,QAAQ;AACzB,4BAAoB,KAAK;AAAA,MAC7B;AACA,gBAAU;AACV,eAAS,SAAS,MAAM;AAAA,IAC5B;AAIA,UAAM,eAAe,WAAW,UAAU,CAAC;AAE3C,UAAM,kBAAkB,WAAW,aAAa,YAAY,CAAC;AAE7D,UAAM,kBAAkB,YAAY,CAAC,YAAY,CAAC;AAElD,UAAM,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,aAAa;AAAA,MACrB,aAAa;AAAA,IACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,UAAM,QACF,gBAAAJ,MAAAF,WAAA,EAEK;AAAA,wBACG,gBAAAC,KAAC,UAAK,WAAU,YACZ,0BAAAA,KAAC,cAAW,GAChB;AAAA,MAGJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL;AAAA,UACA,WAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACT,GAAG;AAAA;AAAA,MACR;AAAA,MAGC,mBACG,gBAAAA,KAAC,UAAK,WAAU,wBACZ,0BAAAA,KAACE,cAAA,EAAY,GACjB;AAAA,MAEH,gBACG,gBAAAF,KAAC,UAAK,WAAU,qBACZ,0BAAAA,KAACG,WAAA,EAAS,GACd;AAAA,MAIH,mBACG,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS;AAAA,UACT,cAAW;AAAA,UACX,UAAU;AAAA,UAEV,0BAAAA,KAAC,aAAU;AAAA;AAAA,MACf;AAAA,MAIH,gBAAgB,gBAAAA,KAAC,UAAK,WAAU,eAAe,wBAAa;AAAA,OACjE;AAGJ,WACI,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,QACX,iBAAe,YAAY;AAAA,QAE1B;AAAA,mBACG,gBAAAD,KAAC,WAAM,WAAU,YAAW,SAAS,IAChC,iBACL;AAAA,UAEH,QAAQ,gBAAAA,KAAC,SAAI,WAAU,UAAU,iBAAM,IAAS;AAAA;AAAA;AAAA,IACrD;AAAA,EAER;AACJ;AAEA,YAAY,cAAc;;;ACnL1B,SAAS,YAAAM,iBAAgB;;;ACAzB,SAAS,WAAW,aAAa;AACjC,SAAS,oBAAoB;AAarB,gBAAAC,MAoDY,QAAAC,aApDZ;AATR,IAAM,YAAY,MACd,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAClB;AAAA;AACJ;AAGG,IAAM,cAAc,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACJ,MAAwB;AACpB,QAAM,UAAU,MAAM;AAEtB,YAAU,MAAM;AACZ,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,MAAqB;AACxC,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAAA,IACpC;AACA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACtE,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,MAAI,CAAC,QAAQ,OAAO,aAAa,YAAa,QAAO;AAErD,SAAO;AAAA,IACH,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAY;AAAA,QAEZ,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,MAAK;AAAA,YACL,cAAW;AAAA,YACX,mBAAiB,QAAQ,UAAU;AAAA,YACnC,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAEjC;AAAA,+BACG,gBAAAD,KAAC,SAAI,WAAU,uBACX,0BAAAA,KAAC,SAAI,WAAU,iBAAgB,GACnC;AAAA,cAGH,cACG,gBAAAC,MAAC,SAAI,WAAU,aACX;AAAA,gCAAAD,KAAC,SAAI,WAAU,oBAAmB;AAAA,gBACjC,SACG,gBAAAA,KAAC,OAAE,IAAI,SAAS,WAAU,YACrB,iBACL;AAAA,gBAEJ,gBAAAA,KAAC,SAAI,WAAU,sBACX,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS;AAAA,oBACT,cAAW;AAAA,oBAEX,0BAAAA,KAAC,aAAU;AAAA;AAAA,gBACf,GACJ;AAAA,iBACJ;AAAA,cAGH,YAAY,gBAAAA,KAAC,SAAI,WAAU,WAAW,UAAS;AAAA,eAE9C,iBAAiB,oBACf,gBAAAC,MAAC,SAAI,WAAU,cACV;AAAA,iCACG,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,cAAc;AAAA,oBAEtB,wBAAc;AAAA;AAAA,gBACnB;AAAA,gBAEH,mBACG,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,gBAAgB;AAAA,oBAExB,0BAAgB;AAAA;AAAA,gBACrB;AAAA,iBAER;AAAA;AAAA;AAAA,QAER;AAAA;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,EACb;AACJ;;;ADpGQ,SAYA,YAAAE,WAZA,OAAAC,MAYA,QAAAC,aAZA;AATR,IAAM,mBAAmB,MACrB,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAGJ,SAAS,eAAe,EAAE,KAAK,GAA6B;AACxD,SACI,gBAAAC,MAAAF,WAAA,EACI;AAAA,oBAAAC,KAAC,OAAE,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,WAAU,WAChD,eAAK,OACV;AAAA,IACA,gBAAAA,KAAC,UAAK,WAAU,gBAAe,eAAY,QACvC,0BAAAA,KAAC,oBAAiB,GACtB;AAAA,KACJ;AAER;AAEO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,CAAC,WAAW,YAAY,IAAIE,UAAS,KAAK;AAIhD,QAAM,cAAc,eAAe,MAAM,SAAS;AAElD,QAAM,YAAY,CAAC,WAAW,MAAM,cAAc,gBAAgB,EAAE,EAC/D,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,MAAI,CAAC,aAAa;AACd,WACI,gBAAAF,KAAC,SAAI,cAAW,cAAa,WAAuB,GAAG,UACnD,0BAAAA,KAAC,QAAG,WAAW,WACV,gBAAM,IAAI,CAAC,MAAM,UAAU;AACxB,YAAM,SAAS,UAAU,MAAM,SAAS;AACxC,aACI,gBAAAA,KAAC,QAAe,WAAU,WACrB,mBACG,gBAAAA,KAAC,UAAK,WAAU,cAAa,gBAAa,QACrC,eAAK,OACV,IAEA,gBAAAA,KAAC,kBAAe,MAAY,KAN3B,KAQT;AAAA,IAER,CAAC,GACL,GACJ;AAAA,EAER;AAEA,QAAM,YAAc,MAAM,CAAC;AAC3B,QAAM,cAAc,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AACnD,QAAM,aAAc,MAAM,MAAM,SAAS,CAAC;AAC1C,QAAM,cAAc,MAAM,MAAM,SAAS,CAAC;AAE1C,SACI,gBAAAC,MAAAF,WAAA,EACI;AAAA,oBAAAC,KAAC,SAAI,cAAW,cAAa,WAAuB,GAAG,UACnD,0BAAAC,MAAC,QAAG,WAAW,WAEX;AAAA,sBAAAD,KAAC,QAAG,WAAU,WACV,0BAAAA,KAAC,kBAAe,MAAM,WAAW,GACrC;AAAA,MAGA,gBAAAC,MAAC,QAAG,WAAU,mBACV;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,cAAW;AAAA,YACX,iBAAc;AAAA,YACjB;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,gBAAe,eAAY,QACvC,0BAAAA,KAAC,oBAAiB,GACtB;AAAA,SACJ;AAAA,MAGC,YAAY,IAAI,CAAC,MAAM,UACpB,gBAAAA,KAAC,QAAsB,WAAU,iBAC7B,0BAAAA,KAAC,kBAAe,MAAY,KADvB,KAAK,KAAK,EAEnB,CACH;AAAA,MAGD,gBAAAA,KAAC,QAAG,WAAU,WACV,0BAAAA,KAAC,kBAAe,MAAM,YAAY,GACtC;AAAA,MAGA,gBAAAA,KAAC,QAAG,WAAU,WACV,0BAAAA,KAAC,UAAK,WAAU,cAAa,gBAAa,QACrC,sBAAY,OACjB,GACJ;AAAA,OACJ,GACJ;AAAA,IAGA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM;AAAA,QACN,SAAS,MAAM,aAAa,KAAK;AAAA,QACjC,eAAa;AAAA,QACb,YAAY;AAAA,QAEZ,0BAAAA,KAAC,QAAG,WAAU,iBAAgB,MAAK,QAC9B,sBAAY,IAAI,CAAC,MAAM,UACpB,gBAAAA,KAAC,QAA0B,WAAU,iBACjC,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YACV,SAAS,CAAC,MAAM;AACZ,mBAAK,UAAU,CAAwC;AACvD,2BAAa,KAAK;AAAA,YACtB;AAAA,YAEC,eAAK;AAAA;AAAA,QACV,KAVK,SAAS,KAAK,EAWvB,CACH,GACL;AAAA;AAAA,IACJ;AAAA,KACJ;AAER;;;AEzJA,SAAS,aAAAG,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAcpC,gBAAAC,OA6FI,QAAAC,cA7FJ;AATR,IAAM,kBAAkB,MACpB,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAGJ,IAAM,YAAY,MACd,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAGG,IAAM,eAAe,CAAC;AAAA,EACzB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,MAAyB;AACrB,QAAM,CAAC,MAAM,OAAO,IAAIE,UAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,IAAIA;AAAA,IAC5B,MAAM,OAAO,WAAW,eAAe,OAAO,WAAW,oBAAoB,EAAE;AAAA,EACnF;AACA,QAAM,aAAaC,QAAuB,IAAI;AAE9C,QAAM,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,KAAK;AACjE,QAAM,eAAe,iBAAiB,eAAe,QAAQ;AAC7D,QAAM,aAAa,mBAAmB;AAGtC,EAAAC,WAAU,MAAM;AACZ,UAAM,KAAK,OAAO,WAAW,oBAAoB;AACjD,UAAM,UAAU,CAAC,MAA2B,YAAY,EAAE,OAAO;AACjE,OAAG,iBAAiB,UAAU,OAAO;AACrC,WAAO,MAAM,GAAG,oBAAoB,UAAU,OAAO;AAAA,EACzD,GAAG,CAAC,CAAC;AAGL,EAAAA,WAAU,MAAM;AACZ,QAAI,CAAC,QAAQ,SAAU;AACvB,UAAM,qBAAqB,CAAC,MAAkB;AAC1C,UAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAAG;AACtE,gBAAQ,KAAK;AAAA,MACjB;AAAA,IACJ;AACA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC7E,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,oBAAoB;AAAA,IACtB;AAAA,IACA;AAAA,IACA,aAAa,aAAa;AAAA,IAC1B,OAAO,WAAW;AAAA,IAClB,aAAa;AAAA,EACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,QAAM,gBAAgB,CAAC,MAA8C;AACjE,QAAI,EAAE,QAAQ,SAAU,SAAQ,KAAK;AAAA,EACzC;AAEA,QAAM,eAAe,CAAC,gBAAwB;AAC1C,eAAW,WAAW;AACtB,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,aAAa,QAAQ,IAAI,CAAC,WAAW;AACvC,UAAM,WAAW,OAAO,UAAU;AAClC,WACI,gBAAAH;AAAA,MAAC;AAAA;AAAA,QAEG,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,WAAW,CAAC,WAAW,WAAW,iBAAiB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC/E,SAAS,MAAM,aAAa,OAAO,KAAK;AAAA,QAExC;AAAA,0BAAAD,MAAC,UAAK,WAAU,gBAAgB,iBAAO,OAAM;AAAA,UAC5C,YACG,gBAAAA,MAAC,UAAK,WAAU,gBACZ,0BAAAA,MAAC,aAAU,GACf;AAAA;AAAA;AAAA,MAVC,OAAO;AAAA,IAYhB;AAAA,EAER,CAAC;AAED,SACI,gBAAAC,OAAC,SAAI,KAAK,YAAY,WAAU,cAC5B;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,QACtC,WAAW;AAAA,QACV,GAAG;AAAA,QAEH;AAAA,kBAAQ,gBAAAD,MAAC,UAAK,WAAU,WAAW,gBAAK;AAAA,UACzC,gBAAAA,MAAC,UAAK,WAAU,YAAY,wBAAa;AAAA,UACxC,OAAO,gBAAAA,MAAC,UAAK,WAAU,UAAU,eAAI;AAAA,UACtC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAW,CAAC,cAAc,OAAO,gBAAgB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,cAC7E,eAAY;AAAA,cAEZ,0BAAAA,MAAC,mBAAgB;AAAA;AAAA,UACrB;AAAA;AAAA;AAAA,IACJ;AAAA,IAGC,CAAC,YAAY,QACV,gBAAAA,MAAC,QAAG,MAAK,WAAU,cAAY,OAAO,WAAU,WAC3C,sBACL;AAAA,IAIH,YACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,SAAS,MAAM,QAAQ,KAAK;AAAA,QAC5B,OAAO;AAAA,QACP,eAAa;AAAA,QACb,YAAU;AAAA,QAEV,0BAAAA,MAAC,QAAG,MAAK,WAAU,cAAY,OAAO,WAAU,0BAC3C,sBACL;AAAA;AAAA,IACJ;AAAA,KAER;AAER;;;ACxIgB,SACI,OAAAK,OADJ,QAAAC,cAAA;AA5BT,IAAM,qBAAqB,CAAC;AAAA,EAC/B,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,GAAG;AACP,MAAoB;AAChB,QAAM,YAAY,gBAAgB,UAAU,gBAAgB,WAAW,gBAAgB;AAEvF,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,UAAU,WAAW;AAAA,QACrB,aAAa;AAAA,MACjB,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACZ,GAAG;AAAA,MAGH;AAAA,wBAAgB,WAAW,SACxB,gBAAAA,OAAC,SAAI,eAAY,QAAO,WAAU,mBAC9B;AAAA,0BAAAD,MAAC,SAAI,KAAI,IAAG,WAAU,iBAAgB,KAAK,OAAO;AAAA,UAClD,gBAAAA,MAAC,SAAI,WAAU,eAAc;AAAA,WACjC;AAAA,QAIJ,gBAAAC,OAAC,SAAI,WAAU,cACX;AAAA,0BAAAD,MAAC,OAAE,WAAW,CAAC,YAAY,YAAY,gBAAgB,aAAa,EAAE,KAAK,GAAG,GACzE,iBACL;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAW,CAAC,kBAAkB,YAAY,gBAAgB,aAAa,EAAE,KAAK,GAAG,GAC/E,uBACL;AAAA,UACC,YACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,aAAa,YAAY,UAAU;AAAA,cACnC,OAAO;AAAA,cACP,SAAS;AAAA;AAAA,UACb;AAAA,WAER;AAAA,QAGC,gBAAgB,WAAW,SACxB,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA,MAAC,SAAI,KAAK,UAAU,WAAU,YAAW,KAAK,OAAO,GACzD;AAAA;AAAA;AAAA,EAER;AAER;;;AC9CQ,SAIyB,OAAAE,OAJzB,QAAAC,cAAA;AAbD,IAAM,uBAAuB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,GAAG;AACP,MAAsB;AAClB,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,kBAAkB,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtE,GAAG;AAAA,MAEH;AAAA,oBAAY,QAAQ,gBAAAD,MAAC,UAAK,WAAU,WAAW,gBAAK;AAAA,QAErD,gBAAAA,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,QAE/B,gBAAAA,MAAC,OAAE,WAAU,kBAAkB,uBAAY;AAAA,QAE1C,YACG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA;AAAA,QACb;AAAA;AAAA;AAAA,EAER;AAER;;;ACjCI,SAQI,OAAAE,OARJ,QAAAC,cAAA;AADJ,IAAM,WAAW,MACb,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACG,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IAEN;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,aAAY;AAAA;AAAA,MAChB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,QAAO;AAAA,UACP,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,aAAY;AAAA;AAAA,MAChB;AAAA;AAAA;AACJ;AAGJ,IAAM,WAAW,MACb,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACG,eAAY;AAAA,IACZ,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IAEN;AAAA,sBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,MAAK,0BAAyB,GAAE,MAAK;AAAA,MAC7D,gBAAAA,MAAC,UAAK,GAAE,0BAAyB,MAAK,uBAAsB;AAAA;AAAA;AAChE;AAKG,IAAM,uBAAuB,CAAC;AAAA,EACjC,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,OAAO,CAAC;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA,SAAS;AAAA,EACT,GAAG;AACP,MAAsB;AAClB,QAAM,UAAU,SAAS;AACzB,QAAM,eAAe,WAAW,gBAAgB,WAAW;AAC3D,QAAM,aAAa,WAAW;AAC9B,QAAM,UAAU,CAAC,YAAY,KAAK,SAAS;AAO3C,QAAM,WAAW,YACb,eACI,gBAAAA,MAAC,SAAI,WAAU,eACV,eAAK,IAAI,CAAC,KAAK,MACZ,gBAAAC,OAAC,UAAK,WAAU,cACX;AAAA,QAAI,KAAK,gBAAAD,MAAC,UAAK,eAAY,QAAO,WAAU,aAAY,kBAAC;AAAA,IAC1D,gBAAAA,MAAC,OAAI,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,MAAK,MAAK,SAAQ,UAAS;AAAA,OAFpC,CAGlC,CACH,GACL,IAEA,gBAAAA,MAAC,SAAI,WAAU,cACV,eAAK,IAAI,CAAC,KAAK,MACZ,gBAAAA,MAAC,OAAI,MAAM,IAAI,MAAc,OAAO,IAAI,OAAO,MAAK,MAAK,SAAQ,UAAvC,CAA8C,CAC3E,GACL;AAIR,QAAM,eAAe,gBACjB,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,cAAW;AAAA,MACX,WAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAK;AAAA,MAEL,0BAAAA,MAAC,YAAS;AAAA;AAAA,EACd;AAGJ,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,kBAAkB,eAAe,kBAAkB,IAAI,aAAa,eAAe,IAAI,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC3I,GAAG;AAAA,MAGH;AAAA,SAAC,iBACE,gBAAAA,OAAC,SAAI,WAAU,uBACX;AAAA,0BAAAD,MAAC,SAAI,KAAK,cAAc,WAAU,qBAAoB,KAAK,WAAW;AAAA,UACrE,WACG,gBAAAA,MAAC,UAAK,cAAW,cAAa,WAAU,iBACpC,0BAAAA,MAAC,YAAS,GACd;AAAA,UAEH,CAAC,WAAW,CAAC,cAAc,UACxB,gBAAAA,MAAC,SAAI,KAAK,WAAW,WAAU,aAAY,KAAK,QAAQ;AAAA,WAEhE;AAAA,QAIJ,gBAAAC,OAAC,SAAI,WAAU,cACV;AAAA,WAAC,gBAAgB;AAAA,UAClB,gBAAAD,MAAC,OAAE,WAAU,YAAY,iBAAM;AAAA,UAC/B,gBAAAA,MAAC,OAAE,WAAU,cAAc,mBAAQ;AAAA,UAClC,gBACI,YAAY,iBACT,gBAAAC,OAAC,SAAI,WAAU,cACV;AAAA;AAAA,YACA;AAAA,aACL,IAGJ,gBACI,gBAAAD,MAAC,SAAI,WAAU,8BAA8B,wBAAa;AAAA,WAGtE;AAAA;AAAA;AAAA,EACJ;AAER;;;AC3HY,SAMI,OAAAE,OANJ,QAAAC,cAAA;AAfL,IAAM,sBAAsB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,WAAW,CAAC;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,EACT,GAAG;AACP,MAAqB;AACjB,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,iBAAiB,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACrE,GAAG;AAAA,MAEJ;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,SAAS;AAAA,YACT,MAAM,gBAAgB,WAAW;AAAA,YACjC,UAAU,gBAAgB,IAAI;AAAA,YAE9B;AAAA,8BAAAD,MAAC,QAAG,WAAU,YAAY,iBAAM;AAAA,cAC/B,aACG,gBAAAA,MAAC,SAAI,WAAU,uBACX,0BAAAA,MAAC,SAAI,KAAK,cAAc,WAAU,qBAAoB,KAAK,WAAW,GAC1E;AAAA;AAAA;AAAA,QAER;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,kBACV,mBAAS,IAAI,CAAC,SAAS,MACpB,gBAAAA,MAAC,SAAI,WAAU,kBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAU;AAAA,YACV,eAAa;AAAA,YACb,OAAO,QAAQ;AAAA,YACf,SAAQ;AAAA,YACR,MAAM,QAAQ,OAAO,CAAC,EAAE,OAAO,QAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,YAClD,cAAc;AAAA,YACd,YAAU;AAAA;AAAA,QACd,KAZiC,CAarC,CACH,GACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AC/Ce,gBAAAE,aAAA;AAFR,IAAM,OAAO,CAAC,UAAqB;AACtC,MAAI,MAAM,YAAY,WAAW;AAC7B,WAAO,gBAAAA,MAAC,sBAAoB,GAAG,OAAO;AAAA,EAC1C;AACA,MAAI,MAAM,YAAY,aAAa;AAC/B,WAAO,gBAAAA,MAAC,wBAAsB,GAAG,OAAO;AAAA,EAC5C;AACA,MAAI,MAAM,YAAY,YAAY;AAC9B,WAAO,gBAAAA,MAAC,uBAAqB,GAAG,OAAO;AAAA,EAC3C;AACA,SAAO,gBAAAA,MAAC,wBAAsB,GAAG,OAAO;AAC5C;;;ACZQ,gBAAAC,OAoCA,QAAAC,cApCA;AAFR,IAAM,cAAc,MAChB,gBAAAD,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG,0BAAAA,MAAC,UAAK,GAAE,mBAAkB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GACnH;AAGJ,IAAM,eAAe,MACjB,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG,0BAAAA,MAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAClH;AAKJ,SAAS,aAAa,aAAqB,YAAgC;AACvE,MAAI,cAAc,GAAG;AACjB,WAAO,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC7D;AACA,MAAI,eAAe,GAAG;AAClB,WAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,kBAAkB,UAAU;AAAA,EACvD;AACA,MAAI,eAAe,aAAa,GAAG;AAC/B,WAAO,CAAC,GAAG,iBAAiB,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,UAAU;AAAA,EAC1G;AACA,SAAO,CAAC,GAAG,iBAAiB,cAAc,GAAG,aAAa,cAAc,GAAG,kBAAkB,UAAU;AAC3G;AAEO,IAAM,aAAa,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAuB;AACnB,QAAM,QAAQ,aAAa,aAAa,UAAU;AAClD,QAAM,iBAAiB,eAAe;AACtC,QAAM,iBAAiB,eAAe;AAEtC,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,cAAc,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACnE,cAAW;AAAA,MAEX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,WAAW,CAAC,aAAa,iBAAiB,sBAAsB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC5F,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,YAC3C,UAAU;AAAA,YACV,cAAW;AAAA,YAEX,0BAAAA,MAAC,UAAK,WAAU,WAAU,0BAAAA,MAAC,eAAY,GAAE;AAAA;AAAA,QAC7C;AAAA,QAEC,MAAM,IAAI,CAAC,MAAM,UAAU;AACxB,cAAI,SAAS,mBAAmB,SAAS,kBAAkB;AACvD,mBACI,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAU;AAAA,gBACV,eAAY;AAAA,gBACf;AAAA;AAAA,cAHQ,GAAG,IAAI,IAAI,KAAK;AAAA,YAKzB;AAAA,UAER;AAEA,gBAAM,aAAa,SAAS;AAC5B,iBACI,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,WAAW,CAAC,cAAc,aAAa,uBAAuB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,cAC1F,SAAS,MAAM;AAAE,oBAAI,CAAC,WAAY,cAAa,IAAI;AAAA,cAAG;AAAA,cACtD,gBAAc,aAAa,SAAS;AAAA,cACpC,cAAY,QAAQ,IAAI;AAAA,cAEvB;AAAA;AAAA,YANI;AAAA,UAOT;AAAA,QAER,CAAC;AAAA,QAED,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW,CAAC,aAAa,iBAAiB,sBAAsB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAC5F,SAAS,MAAM,aAAa,cAAc,CAAC;AAAA,YAC3C,UAAU;AAAA,YACV,cAAW;AAAA,YAEX,0BAAAA,MAAC,UAAK,WAAU,WAAU,0BAAAA,MAAC,gBAAa,GAAE;AAAA;AAAA,QAC9C;AAAA;AAAA;AAAA,EACJ;AAER;;;AC3FA,SAAS,SAAAE,QAAO,UAAAC,eAAc;AAkCV,gBAAAC,aAAA;AA7Bb,IAAM,OAAO,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAiB;AACb,QAAM,cAAcC,OAAM,EAAE,QAAQ,MAAM,EAAE;AAC5C,QAAM,SAAS,YAAY,QAAQ,WAAW;AAC9C,QAAM,UAAUC,QAAuB,IAAI;AAE3C,QAAM,iBAAiB,CAAC,UAAkB;AACtC,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,CAAC,KAAM;AACX,aAAS,KAAK,EAAE;AAChB,YAAQ,SAAS,iBAAoC,cAAc,EAAE,KAAK,GAAG,MAAM;AAAA,EACvF;AAEA,SACI,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,wBAAwB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACvE,MAAK;AAAA,MACJ,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,MAAM,MAAM;AACpB,cAAM,WAAW,KAAK,OAAO;AAC7B,eACI,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEG,OAAO,KAAK;AAAA,YACZ,UAAU;AAAA,YACV,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,YAC/B,WAAW,CAAC,UAAU;AAClB,kBAAI,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,aAAa;AACzD,sBAAM,eAAe;AACrB,gCAAgB,IAAI,KAAK,MAAM,MAAM;AAAA,cACzC,WAAW,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AAC7D,sBAAM,eAAe;AACrB,gCAAgB,IAAI,IAAI,MAAM,UAAU,MAAM,MAAM;AAAA,cACxD,WAAW,MAAM,QAAQ,QAAQ;AAC7B,sBAAM,eAAe;AACrB,+BAAe,CAAC;AAAA,cACpB,WAAW,MAAM,QAAQ,OAAO;AAC5B,sBAAM,eAAe;AACrB,+BAAe,MAAM,SAAS,CAAC;AAAA,cACnC;AAAA,YACJ;AAAA,YACA,WAAW,WAAW,eAAe;AAAA,YACrC,cAAY,KAAK;AAAA,YACjB,IAAI,GAAG,MAAM,QAAQ,CAAC;AAAA,YACtB,iBAAe,GAAG,MAAM,UAAU,CAAC;AAAA,YACnC,iBAAe;AAAA,YACf,UAAU,WAAW,IAAI;AAAA,YACzB,MAAK;AAAA;AAAA,UAzBA,KAAK;AAAA,QA0Bd;AAAA,MAER,CAAC;AAAA;AAAA,EACL;AAER;;;AClEA,SAAS,YAAAG,iBAAgB;AAkBb,SAEQ,OAAAC,OAFR,QAAAC,cAAA;AAbL,IAAM,eAAe,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA,cAAc;AAClB,MAAyB;AACrB,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAwB,IAAI;AAE9D,QAAM,eAAe,CAAC,UAAkB,CAAC,WAAoB;AACzD,iBAAa,SAAS,QAAQ,IAAI;AAAA,EACtC;AAEA,SACI,gBAAAF,MAAC,aAAQ,WAAW,CAAC,iBAAiB,kBAAkB,WAAW,EAAE,EAAE,KAAK,GAAG,GAC3E,0BAAAC,OAAC,SAAI,WAAU,4BACX;AAAA,oBAAAD,MAAC,SAAI,WAAU,yBACX,0BAAAA,MAAC,QAAG,WAAU,wBAAwB,iBAAM,GAChD;AAAA,IAEA,gBAAAA,MAAC,SAAI,WAAU,uBACV,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEG,OAAO,KAAK;AAAA,QACZ,MAAM,cAAc;AAAA,QACpB,UAAU,aAAa,KAAK;AAAA,QAC5B,gBAAgB;AAAA,QAChB,mBAAmB,QAAQ,MAAM,SAAS;AAAA,QAEzC,eAAK;AAAA;AAAA,MAPD,GAAG,KAAK,QAAQ,IAAI,KAAK;AAAA,IAQlC,CACH,GACL;AAAA,KACJ,GACJ;AAER;;;ACxBQ,gBAAAG,OAyBY,QAAAC,cAzBZ;AAPR,IAAM,kBAAkB,CAAC,SACrB,QAAQ,gBAAgB,KAAK,IAAI,IAAI,wBAAwB;AAEjE,IAAM,eAAe,CAAC,EAAE,SAAS,MAA6C;AAC1E,MAAI,CAAC,SAAS,QAAS,QAAO;AAE9B,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG,KAAI;AAAA,MACJ,WAAU;AAAA,MACV,QAAQ;AAAA,MACR,KAAK,SAAS;AAAA,MACd,OAAO;AAAA;AAAA,EACX;AAER;AAIA,IAAM,eAAe,CAAC,EAAE,MAAM,MAAM,MAAgD;AAChF,QAAM,SAAS,KAAK,YAAY;AAChC,QAAM,eAAe,KAAK,aAAa;AAEvC,SACI,gBAAAA,MAAC,SAAI,WAAU,kBACX,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,SAAS,qBAAqB;AAAA,MAClC,EAAE,KAAK,GAAG;AAAA,MAEV;AAAA,wBAAAA,OAAC,SAAI,WAAU,mBACX;AAAA,0BAAAA,OAAC,SAAI,WAAU,sBACX;AAAA,4BAAAD,MAAC,QAAG,WAAU,oBAAoB,eAAK,OAAM;AAAA,YAC7C,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,eAAK,aAAY;AAAA,YACvD,gBACG,gBAAAA,MAAC,SAAI,WAAU,uBACX,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,aAAY;AAAA,gBACZ,MAAM,KAAK;AAAA,gBACX,OAAO,KAAK,YAAY;AAAA,gBACxB,KAAK,gBAAgB,KAAK,QAAQ;AAAA,gBAClC,SAAS,KAAK;AAAA;AAAA,YAClB,GACJ;AAAA,aAER;AAAA,UAEC,KAAK,aAAa,KAAK,UAAU,SAAS,KACvC,gBAAAC,OAAC,SAAI,WAAU,6BACX;AAAA,4BAAAD,MAAC,QAAG,WAAU,+BACT,eAAK,oBAAoB,gBAC9B;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,0BACV,eAAK,UAAU,IAAI,CAAC,UAAU,MAC3B,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAW;AAAA,kBACP;AAAA,kBACA,SAAS,0BAA0B;AAAA,gBACvC,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACb,MAAM,SAAS;AAAA,gBACf,KAAK,gBAAgB,SAAS,IAAI;AAAA,gBAElC;AAAA,kCAAAD,MAAC,gBAAa,UAAoB;AAAA,kBAClC,gBAAAA,MAAC,UAAK,WAAU,yBAAyB,mBAAS,OAAM;AAAA;AAAA;AAAA,cAXnD,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,YAY/B,CACH,GACL;AAAA,aACJ;AAAA,WAER;AAAA,QAEC,KAAK,SACF,gBAAAA,MAAC,SAAI,WAAU,2BACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,KAAK,YAAY;AAAA,YACtB,WAAU;AAAA,YACV,UAAS;AAAA,YACT,SAAS,UAAU,IAAI,UAAU;AAAA,YACjC,KAAK,KAAK;AAAA;AAAA,QACd,GACJ;AAAA;AAAA;AAAA,EAER,GACJ;AAER;AAIA,IAAM,eAAe,CAAC,EAAE,KAAK,MAAiC;AAC1D,QAAM,eAAe,KAAK,aAAa;AAEvC,SACI,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAC,OAAC,SAAI,WAAU,mCACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,kBACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,0BACX;AAAA,wBAAAD,MAAC,QAAG,WAAU,oBAAoB,eAAK,OAAM;AAAA,QAC7C,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,eAAK,aAAY;AAAA,QACvD,gBACG,gBAAAA,MAAC,SAAI,WAAU,uBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,aAAY;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,OAAO,KAAK,YAAY;AAAA,YACxB,KAAK,gBAAgB,KAAK,QAAQ;AAAA,YAClC,SAAS,KAAK;AAAA;AAAA,QAClB,GACJ;AAAA,SAER;AAAA,MAEC,KAAK,aAAa,KAAK,UAAU,SAAS,KACvC,gBAAAC,OAAC,SAAI,WAAU,6BACX;AAAA,wBAAAD,MAAC,QAAG,WAAU,+BACT,eAAK,oBAAoB,gBAC9B;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,0BACV,eAAK,UAAU,IAAI,CAAC,UAAU,MAC3B,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEG,WAAU;AAAA,YACV,MAAM,SAAS;AAAA,YACf,KAAK,gBAAgB,SAAS,IAAI;AAAA,YAElC;AAAA,8BAAAD,MAAC,gBAAa,UAAoB;AAAA,cAClC,gBAAAA,MAAC,UAAK,WAAU,yBAAyB,mBAAS,OAAM;AAAA;AAAA;AAAA,UANnD,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,QAO/B,CACH,GACL;AAAA,SACJ;AAAA,OAER;AAAA,IAEC,KAAK,SACF,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,KAAK,YAAY;AAAA,QACtB,WAAU;AAAA,QACV,UAAS;AAAA,QACT,SAAQ;AAAA,QACR,KAAK,KAAK;AAAA;AAAA,IACd,GACJ;AAAA,KAER,GACJ;AAER;AAIO,IAAM,eAAe,CAAC;AAAA,EACzB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,EAClB;AACJ,MAAyB;AACrB,QAAM,gBACF,gBAAAC,OAAC,SAAI,WAAU,aACX;AAAA,oBAAAD,MAAC,QAAG,WAAU,mBAAmB,wBAAa;AAAA,IAE7C,sBACG,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,8BAAmB;AAAA,IAG5D,YACG,gBAAAA,MAAC,QAAK,aAAY,SAAQ,OAAO,UAAU,SAAS,aAAa;AAAA,KAEzE;AAGJ,MAAI,YAAY,YAAY;AACxB,WACI,gBAAAA,MAAC,aAAQ,WAAU,cACf,0BAAAC,OAAC,SAAI,WAAU,gBACV;AAAA;AAAA,MAED,gBAAAD,MAAC,SAAI,WAAU,6BACV,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA;AAAA;AAAA,QACK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,MAC/B,CACH,GACL;AAAA,OACJ,GACJ;AAAA,EAER;AAEA,MAAI,YAAY,WAAW;AACvB,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,KAAM,QAAO;AAElB,WACI,gBAAAA,MAAC,aAAQ,WAAU,cACf,0BAAAC,OAAC,SAAI,WAAU,gBACV;AAAA;AAAA,MAED,gBAAAD,MAAC,gBAAa,MAAY;AAAA,OAC9B,GACJ;AAAA,EAER;AAEA,SACI,gBAAAA,MAAC,aAAQ,WAAU,cACf,0BAAAC,OAAC,SAAI,WAAU,gBACV;AAAA;AAAA,IAED,gBAAAD,MAAC,SAAI,WAAW,oBAAoB,MAAM,WAAW,IAAI,MAAM,GAAG,IAC7D,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEG,SAAQ;AAAA,QACR,aAAa,KAAK,eAAe;AAAA,QACjC,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA;AAAA,MATb;AAAA,IAUT,CACH,GACL;AAAA,KACJ,GACJ;AAER;;;ACxPA;AAAA,EACI,eAAAE;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIG;AAmCC,gBAAAC,OAuDI,QAAAC,cAvDJ;AA3BR,IAAM,aAAyC,CAAC,SAAS,QAAQ,OAAO;AACxE,IAAM,gBAAgB;AAEtB,IAAM,gBAA4C;AAAA,EAC9C;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACV;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACV;AACJ;AAEA,SAAS,YAAY,MAAgC,OAAyC;AAC1F,SAAO,KAAK,QAAQ,WAAW,QAAQ,WAAW,MAAM;AAC5D;AAEA,IAAMC,eAAc,MAChB,gBAAAF,MAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,eAAY,QAAO,WAAU,SAC9D,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,MAAK;AAAA;AACT,GACJ;AAGJ,IAAMG,gBAAe,MACjB,gBAAAH,MAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,eAAY,QAAO,WAAU,SAC9D,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,MAAK;AAAA;AACT,GACJ;AAGJ,SAAS,UAAU;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAMG;AACC,QAAM,OAAO,YAAY,MAAM,KAAK;AACpC,QAAM,QAAQ,QAAQ,KAAK,SAAS,KAAK,aAAa,OAAO;AAC7D,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,IAAI;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA,cAAc,IAAI;AAAA,QAClB,QAAQ,qBAAqB;AAAA,MACjC,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACb,MAAK;AAAA,MACL,wBAAqB;AAAA,MACrB,cAAY,GAAG,QAAQ,CAAC,OAAO,KAAK;AAAA,MACpC,eAAa,CAAC;AAAA,MAEb;AAAA,gBACG,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,KAAK,KAAK;AAAA,YACV,KAAK,KAAK,YAAY;AAAA,YACtB,SAAQ;AAAA,YACR,UAAS;AAAA;AAAA,QACb,IACA;AAAA,QACJ,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,oBAAoB,eAAK,OAAM;AAAA,UAC7C,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,eAAK,aAAY;AAAA,UACvD,KAAK,WACF,KAAK,UACD,gBAAAA,MAAC,OAAE,WAAU,kBAAiB,MAAM,KAAK,SACpC,eAAK,UACV,IAEA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,eAAK,UAAS,IAEpD;AAAA,WACR;AAAA,QACC,KAAK,SAAS,CAAC,QACZ,gBAAAA,MAAC,SAAI,WAAU,oBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,KAAK,KAAK;AAAA,YACV,KAAK,KAAK,YAAY;AAAA,YACtB,SAAQ;AAAA,YACR,UAAS;AAAA;AAAA,QACb,GACJ,IACA;AAAA;AAAA;AAAA,EACR;AAER;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AACJ,MAAiC;AAC7B,QAAM,UAAUI,OAAM,EAAE,QAAQ,MAAM,EAAE;AACxC,QAAM,gBAAgB,OAAO,SAAS,QAAQ;AAC9C,QAAM,QAAQ,cAAc;AAC5B,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,oBAAoB,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC;AAEvF,QAAM,CAAC,aAAa,cAAc,IAAIC,UAAS,cAAc;AAC7D,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AACxD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,CAAC;AAEtC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AAE/D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAChD,QAAM,cAAcC,QAAuB,IAAI;AAC/C,QAAM,WAAWA,QAAuB,IAAI;AAC5C,QAAM,YAAYA,QAAkC,IAAI;AACxD,QAAM,gBAAgBA,QAA6C,IAAI;AAEvE,EAAAC,WAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,KAAK,OAAO,WAAW,kCAAkC;AAC/D,UAAM,SAAS,MAAM,iBAAiB,GAAG,OAAO;AAChD,WAAO;AACP,OAAG,mBAAmB,UAAU,MAAM;AACtC,WAAO,MAAM,GAAG,sBAAsB,UAAU,MAAM;AAAA,EAC1D,GAAG,CAAC,CAAC;AAIL,EAAAA,WAAU,MAAM;AACZ,UAAM,QAAQ,SAAS;AACvB,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,SAAS,CAAC,SAAU;AAEzB,UAAM,UAAU,MAAM;AAClB,YAAM,QAAQ,MAAM,cAA2B,kBAAkB;AACjE,UAAI,CAAC,MAAO;AACZ,YAAM,SAAS,OAAO,iBAAiB,KAAK;AAC5C,YAAM,MAAM,OAAO,WAAW,OAAO,aAAa,OAAO,GAAG,KAAK;AACjE,YAAM,QAAQ,MAAM,sBAAsB,EAAE;AAC5C,YAAM,OAAO,QAAQ;AACrB,gBAAU,IAAI;AAEd,YAAM,iBAAiB,OAAO,iBAAiB,QAAQ;AACvD,YAAM,YAAY,OAAO,WAAW,eAAe,kBAAkB,KAAK;AAC1E,YAAM,UAAU,OAAO,WAAW,eAAe,gBAAgB,KAAK;AACtE,YAAM,UAAU,SAAS,QAAQ,cAAc,KAAK;AACpD,YAAM,YAAY,QAAQ,cAAc,gBAAgB;AAExD,YAAM,WAAW,YACX,OAAO,WAAW,OAAO,iBAAiB,SAAS,EAAE,kBAAkB,KAAK,KAC5E;AAGN,YAAM,WAAW,UAAU,IAAI,UAAU;AACzC,YAAM,YAAY,KAAK;AAAA,QACnB;AAAA,QACA,SAAS,sBAAsB,EAAE,QAAQ,YAAY;AAAA,MACzD;AAGA,YAAM,aAAa,QAAQ,OAAO;AAClC,YAAM,YAAY,KAAK,IAAI,GAAG,aAAa,SAAS;AACpD,qBAAe,SAAS;AAMxB,YAAM,QAAQ,OAAO,IAAI,YAAY,OAAO;AAC5C,UAAI,UAAU,KAAK,IAAI,QAAQ,GAAG,KAAK,MAAM,KAAK,CAAC;AACnD,UAAI,QAAQ,KAAK,UAAU,GAAG;AAC1B,kBAAU,KAAK,IAAI,QAAQ,GAAG,CAAC;AAAA,MACnC,WAAW,QAAQ,KAAK,UAAU,GAAG;AACjC,kBAAU,KAAK,IAAI,QAAQ,GAAG,KAAK,KAAK,QAAQ,IAAI,CAAC;AAAA,MACzD;AACA,kBAAY,OAAO;AACnB,qBAAe,CAAC,YAAY,KAAK,IAAI,SAAS,OAAO,CAAC;AAAA,IAC1D;AAEA,YAAQ;AACR,UAAM,KAAK,OAAO,mBAAmB,cAAc,IAAI,eAAe,OAAO,IAAI;AACjF,QAAI,QAAQ,QAAQ;AACpB,QAAI,QAAQ,KAAK;AACjB,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,MAAM;AACT,UAAI,WAAW;AACf,aAAO,oBAAoB,UAAU,OAAO;AAAA,IAChD;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,YAAY,WAAW;AAE7B,QAAM,OAAOC;AAAA,IACT,CAAC,UAAkB;AACf,UAAI,aAAa,EAAG;AACpB,qBAAe,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,QAAQ,CAAC,CAAC;AAAA,IACzD;AAAA,IACA,CAAC,WAAW,QAAQ;AAAA,EACxB;AAEA,QAAM,SAASA,aAAY,MAAM,KAAK,cAAc,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC;AAC3E,QAAM,SAASA,aAAY,MAAM,KAAK,cAAc,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC;AAE3E,EAAAD,WAAU,MAAM;AACZ,QAAI,CAAC,YAAY,UAAU,iBAAiB,aAAa,EAAG;AAC5D,kBAAc,UAAU,WAAW,MAAM;AACrC,qBAAe,CAAC,YAAa,WAAW,WAAW,IAAI,UAAU,CAAE;AAAA,IACvE,GAAG,KAAK,IAAI,KAAM,aAAa,CAAC;AAChC,WAAO,MAAM;AACT,UAAI,cAAc,QAAS,cAAa,cAAc,OAAO;AAAA,IACjE;AAAA,EACJ,GAAG,CAAC,UAAU,eAAe,QAAQ,eAAe,WAAW,UAAU,WAAW,CAAC;AAErF,QAAM,gBAAgB,CAAC,UAA6C;AAChE,QAAI,aAAa,EAAG;AACpB,cAAU,UAAU,EAAE,QAAQ,MAAM,QAAQ;AAC5C,cAAU,IAAI;AACd,UAAM,cAAc,oBAAoB,MAAM,SAAS;AAAA,EAC3D;AAEA,QAAM,cAAc,CAAC,UAA6C;AAC9D,QAAI,CAAC,UAAU,QAAS;AACxB,UAAM,QAAQ,MAAM,UAAU,UAAU,QAAQ;AAChD,cAAU,UAAU;AACpB,cAAU,KAAK;AACf,UAAM,YAAY;AAClB,QAAI,QAAQ,UAAW,QAAO;AAAA,aACrB,QAAQ,CAAC,UAAW,QAAO;AAAA,EACxC;AAEA,QAAM,YAAY,CAAC,UAA8C;AAC7D,QAAI,MAAM,QAAQ,cAAc;AAC5B,YAAM,eAAe;AACrB,aAAO;AAAA,IACX,WAAW,MAAM,QAAQ,aAAa;AAClC,YAAM,eAAe;AACrB,aAAO;AAAA,IACX,WAAW,MAAM,QAAQ,QAAQ;AAC7B,YAAM,eAAe;AACrB,WAAK,CAAC;AAAA,IACV,WAAW,MAAM,QAAQ,OAAO;AAC5B,YAAM,eAAe;AACrB,WAAK,QAAQ;AAAA,IACjB;AAAA,EACJ;AAEA,QAAM,UAAU,cAAc;AAC9B,QAAM,UAAU,cAAc;AAC9B,QAAM,YAAY,eAAe,OAAO;AACxC,QAAM,SAAS,cAAc,YAAY,OAAO,KAAK;AAGrD,QAAM,SACF,UAAU,IACJ,IACA,eAAe,WACb,cACA,cAAc;AAE1B,QAAM,aAA4B;AAAA,IAC9B,WAAW,gBAAgB,MAAM;AAAA,IACjC,oBAAoB,gBAAgB,QAAQ,GAAG,aAAa;AAAA,EAChE;AAEA,SACI,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9D,mBAAiB;AAAA,MACjB,oBAAkB;AAAA,MAElB;AAAA,wBAAAD,MAAC,SAAI,WAAU,iBACX,0BAAAC,OAAC,YAAO,WAAU,cACd;AAAA,0BAAAD,MAAC,QAAG,IAAI,WAAW,WAAU,aACxB,iBACL;AAAA,UACC,cACG,gBAAAA,MAAC,OAAE,IAAI,QAAQ,WAAU,mBACpB,uBACL,IACA;AAAA,WACR,GACJ;AAAA,QAEA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,MAAK;AAAA,YACL,wBAAqB;AAAA,YACrB,cAAY;AAAA,YACZ,cAAc,MAAM,UAAU,IAAI;AAAA,YAClC,cAAc,MAAM,UAAU,KAAK;AAAA,YACnC,gBAAgB,MAAM,UAAU,IAAI;AAAA,YACpC,eAAe,CAAC,UAAU;AACtB,kBAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAqB,GAAG;AAC5D,0BAAU,KAAK;AAAA,cACnB;AAAA,YACJ;AAAA,YAGA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK;AAAA,kBACL,WAAU;AAAA,kBACV,UAAU;AAAA,kBACV,aAAW,YAAY,CAAC,SAAS,QAAQ;AAAA,kBACzC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,iBAAiB;AAAA,kBAEjB,0BAAAA,MAAC,SAAI,KAAK,UAAU,WAAU,aAAY,OAAO,YAC5C,wBAAc,IAAI,CAAC,MAAM,UAAU;AAChC,0BAAM,UAAU,aAAa,OAAO,IAAI,KAAK;AAC7C,0BAAM,SAAS,UAAU;AACzB,2BACI,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEG,WAAW,CAAC,mBAAmB,SAAS,cAAc,EAAE,EACnD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,wBACb,kBAAgB;AAAA,wBAChB,gBAAc,SAAS,SAAS;AAAA,wBAEhC,0BAAAA;AAAA,0BAAC;AAAA;AAAA,4BACG;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA,4BACA;AAAA;AAAA,wBACJ;AAAA;AAAA,sBAbK;AAAA,oBAcT;AAAA,kBAER,CAAC,GACL;AAAA;AAAA,cACJ;AAAA,cAEA,gBAAAC,OAAC,SAAI,WAAU,gBACV;AAAA,4BAAY,YAAY,IACrB,gBAAAD,MAAC,SAAI,WAAU,YAAW,MAAK,WAAU,cAAW,oBAC/C,gBAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,UAAU;AAC7C,wBAAM,WAAW,UAAU;AAC3B,wBAAM,UAAU,aAAa,OAAO,IAAI,KAAK;AAC7C,yBACI,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEG,MAAK;AAAA,sBACL,MAAK;AAAA,sBACL,WAAW,WAAW,sBAAsB;AAAA,sBAC5C,cAAY,cAAc,QAAQ,CAAC,OAAO,SAAS;AAAA,sBACnD,iBAAe;AAAA,sBACf,iBAAe;AAAA,sBACf,UAAU,WAAW,IAAI;AAAA,sBACzB,SAAS,MAAM,KAAK,KAAK;AAAA;AAAA,oBARpB;AAAA,kBAST;AAAA,gBAER,CAAC,GACL,IAEA,gBAAAA,MAAC,UAAK,WAAU,wBAAuB,eAAY,QAAO;AAAA,gBAG7D,cAAc,YAAY,IACvB,gBAAAC,OAAC,SAAI,WAAU,cACV;AAAA,4BACG,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,cAAW;AAAA,sBACX,SAAS;AAAA,sBAET,0BAAAA,MAACE,cAAA,EAAY;AAAA;AAAA,kBACjB,IACA;AAAA,kBACH,UACG,gBAAAF;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,cAAW;AAAA,sBACX,SAAS;AAAA,sBAET,0BAAAA,MAACG,eAAA,EAAa;AAAA;AAAA,kBAClB,IACA;AAAA,mBACR,IACA;AAAA,iBACR;AAAA,cAEC,WACG,gBAAAH,MAAC,SAAI,WAAU,gBACX,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,gBAAc;AAAA,kBACd,SAAS,MAAM,UAAU,CAAC,UAAU,CAAC,KAAK;AAAA,kBAEzC,mBAAS,mBAAmB;AAAA;AAAA,cACjC,GACJ,IACA;AAAA;AAAA;AAAA,QACR;AAAA;AAAA;AAAA,EACJ;AAER;;;ACvbA,SAAS,SAAAS,cAAa;AAyDV,SACI,OAAAC,OADJ,QAAAC,cAAA;AAjDZ,IAAM,cAAsC,CAAC,SAAS,MAAM;AAE5D,IAAM,gBAAuC;AAAA,EACzC;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,MACF,EAAE,OAAO,iBAAiB,OAAO,oBAAoB;AAAA,MACrD,EAAE,OAAO,gBAAgB,OAAO,kBAAkB;AAAA,MAClD,EAAE,OAAO,gBAAgB,OAAO,OAAO;AAAA,MACvC,EAAE,OAAO,kBAAkB,OAAO,MAAM;AAAA,IAC5C;AAAA,EACJ;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO;AAAA,IACP,MAAM;AAAA,MACF,EAAE,OAAO,iBAAiB,OAAO,oBAAoB;AAAA,MACrD,EAAE,OAAO,gBAAgB,OAAO,oBAAoB;AAAA,MACpD,EAAE,OAAO,gBAAgB,OAAO,kBAAkB;AAAA,MAClD,EAAE,OAAO,kBAAkB,OAAO,MAAM;AAAA,IAC5C;AAAA,IACA,UAAU;AAAA,EACd;AACJ;AAEA,SAAS,aAAa,MAA2B,OAAqC;AAClF,SAAO,KAAK,SAAS,YAAY,QAAQ,YAAY,MAAM;AAC/D;AAEA,SAAS,eAAe;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,GAIG;AACC,QAAM,QAAQ,aAAa,MAAM,KAAK;AACtC,QAAM,OAAO,KAAK,MAAM,SAAS,KAAK,OAAO,CAAC;AAE9C,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,oBAAoB,KAAK;AAAA,MACpC,mBAAiB;AAAA,MAEjB;AAAA,wBAAAA,OAAC,SAAI,WAAU,kBACX;AAAA,0BAAAD,MAAC,QAAG,IAAI,WAAW,WAAU,kBACxB,eAAK,OACV;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,wBAAwB,eAAK,aAAY;AAAA,WAC1D;AAAA,QAEA,gBAAAC,OAAC,SAAI,WAAU,iBACV;AAAA,eAAK,SAAS,IACX,gBAAAD,MAAC,QAAG,WAAU,WACT,eAAK,IAAI,CAAC,KAAK,aACZ,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEG,WAAW;AAAA,gBACP;AAAA,gBACA,aAAa,KAAK,SAAS,IAAI,YAAY;AAAA,cAC/C,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cAEb;AAAA,gCAAAD,MAAC,QAAG,WAAU,iBAAiB,cAAI,OAAM;AAAA,gBACzC,gBAAAA,MAAC,QAAG,WAAU,iBAAiB,cAAI,OAAM;AAAA;AAAA;AAAA,YATpC,GAAG,IAAI,KAAK,IAAI,QAAQ;AAAA,UAUjC,CACH,GACL,IACA;AAAA,UAEH,KAAK,WACF,gBAAAA,MAAC,OAAE,WAAU,qBACT,0BAAAA,MAAC,QAAI,eAAK,UAAS,GACvB,IACA;AAAA,WACR;AAAA;AAAA;AAAA,EACJ;AAER;AAEO,IAAM,kBAAkB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAA4B;AACxB,QAAM,UAAUE,OAAM,EAAE,QAAQ,MAAM,EAAE;AACxC,QAAM,gBAAgB,OAAO,SAAS,MAAM,MAAM,GAAG,CAAC,IAAI;AAC1D,QAAM,eAAe;AACrB,QAAM,YAAY,cAAc,OAAO;AACvC,QAAM,SAAS,cAAc,WAAW,OAAO,KAAK;AAEpD,SACI,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7D,mBAAiB;AAAA,MACjB,oBAAkB;AAAA,MAElB,0BAAAC,OAAC,SAAI,WAAU,gBACX;AAAA,wBAAAA,OAAC,YAAO,WAAU,aACd;AAAA,0BAAAD,MAAC,QAAG,IAAI,WAAW,WAAU,YACxB,iBACL;AAAA,UACC,cACG,gBAAAA,MAAC,OAAE,IAAI,QAAQ,WAAU,kBACpB,uBACL,IACA;AAAA,WACR;AAAA,QAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW,oBAAoB,aAAa,MAAM;AAAA,YAClD,MAAK;AAAA,YAEJ,uBAAa,IAAI,CAAC,MAAM,UACrB,gBAAAA,MAAC,SAAmC,MAAK,YACrC,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA;AAAA,gBACA,WAAW,WAAW,OAAO,IAAI,KAAK;AAAA;AAAA,YAC1C,KALM,GAAG,KAAK,KAAK,IAAI,KAAK,EAMhC,CACH;AAAA;AAAA,QACL;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AC7HgB,SACqB,OAAAG,OADrB,QAAAC,cAAA;AAXT,IAAM,mBAAmB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AACJ,MAA6B;AACzB,SACI,gBAAAD,MAAC,aAAQ,WAAU,eACf,0BAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,cACV;AAAA,sBAAgB,gBAAAD,MAAC,QAAG,WAAU,oBAAoB,wBAAa;AAAA,MAE/D,sBACG,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,8BAAmB;AAAA,MAG7D,YACG,gBAAAA,MAAC,QAAK,aAAY,SAAQ,OAAO,UAAU,SAAS,aAAa;AAAA,OAEzE;AAAA,IAEA,gBAAAA,MAAC,SAAI,WAAW,sBAAsB,MAAM,WAAW,IAAI,MAAM,GAAG,IAC/D,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEG,SAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA;AAAA,MARb;AAAA,IAST,CACH,GACL;AAAA,KACJ,GACJ;AAER;;;ACzCQ,gBAAAE,OA4B4B,QAAAC,cA5B5B;AAFR,IAAMC,aAAY,MACd,gBAAAF,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QAAO,WAAU,yBACxH,0BAAAA,MAAC,UAAK,GAAE,m0BAAk0B,MAAK,gBAAe,GACl2B;AAGG,IAAM,iBAAiB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AACpB,MAA2B;AACvB,SACI,gBAAAA,MAAC,aAAQ,WAAU,mBACf,0BAAAA,MAAC,SAAI,WAAU,8BACX,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,kBAAkB,SAAS,uCAAuC;AAAA,MACtE,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAEb;AAAA,wBAAAA,OAAC,SAAI,WAAU,4BACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,0BAA0B,iBAAM;AAAA,UAE7C,WAAW,QAAQ,SAAS,KACzB,gBAAAA,MAAC,SAAI,WAAU,gCACV,kBAAQ,IAAI,CAAC,QAAQ,MAClB,gBAAAC,OAAC,SAAY,WAAU,gCACnB;AAAA,4BAAAD,MAAC,SAAI,WAAU,iCACX,0BAAAA,MAACE,YAAA,EAAU,GACf;AAAA,YACA,gBAAAF,MAAC,OAAE,WAAU,gCAAgC,kBAAO;AAAA,eAJ9C,CAKV,CACH,GACL;AAAA,WAER;AAAA,QAEC,SACG,gBAAAA,MAAC,SAAI,WAAU,kCACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,WAAU;AAAA,YACV,KAAK;AAAA;AAAA,QACT,GACJ;AAAA;AAAA;AAAA,EAER,GACJ,GACJ;AAER;;;ACzDA,SAAS,YAAAG,iBAAgB;AAejB,SA4CJ,YAAAC,WA5CI,OAAAC,OA6CJ,QAAAC,cA7CI;AATR,IAAM,mBAAmB,MACrB,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IACZ,WAAU;AAAA,IAEV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAGJ,IAAME,mBAAkB,MACpB,gBAAAF;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IACZ,WAAU;AAAA,IAEV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAYJ,IAAM,gBAAgB,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI,gBAAAC,OAAAF,WAAA,EACA;AAAA,kBAAAE,OAAC,SAAI,WAAU,sBACV;AAAA,uBACG,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,MAAM,gBAAgB;AAAA,QACtB,WAAW,gBAAgB,OAAO,0BAA0B;AAAA,QAC5D,cAAY,gBAAgB;AAAA,QAC5B,QAAO;AAAA,QACP,KAAI;AAAA,QAEH,0BAAgB,QAAQ,gBAAAA,MAAC,SAAI,KAAK,gBAAgB,UAAU,KAAK,gBAAgB,UAAU;AAAA;AAAA,IAChG;AAAA,IAEH,iBACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM,cAAc;AAAA,QACpB,WAAW,cAAc,OAAO,0BAA0B;AAAA,QAC1D,cAAY,cAAc;AAAA,QAC1B,QAAO;AAAA,QACP,KAAI;AAAA,QAEH,wBAAc,QAAQ,gBAAAA,MAAC,SAAI,KAAK,cAAc,UAAU,KAAK,cAAc,UAAU;AAAA;AAAA,IAC1F;AAAA,IAEH,eACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM,YAAY;AAAA,QAClB,WAAW,YAAY,OAAO,0BAA0B;AAAA,QACxD,cAAY,YAAY;AAAA,QACxB,QAAO;AAAA,QACP,KAAI;AAAA,QAEH,sBAAY,QAAQ,gBAAAA,MAAC,SAAI,KAAK,YAAY,UAAU,KAAK,YAAY,UAAU;AAAA;AAAA,IACpF;AAAA,KAER;AAAA,EACC,oBACG,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,4BAAiB;AAAA,GAE1D;AAYA,IAAM,UAAU,CAAC,EAAE,OAAO,MAAM,YAAY,QAAQ,MAChD,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,WAAU;AAAA,IACV;AAAA,IACC,GAAI,aAAa,EAAE,QAAQ,UAAU,KAAK,sBAAsB,IAAI,CAAC;AAAA,IAErE;AAAA;AAAA,MACA,cAAc,gBAAAD,MAAC,oBAAiB;AAAA;AAAA;AACrC;AAKJ,IAAM,gBAAgB,CAAC,EAAE,UAAU,UAAU,KAAK,MAC9C,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,WAAU;AAAA,IACV,cAAY;AAAA,IACZ,QAAO;AAAA,IACP,KAAI;AAAA,IAEJ,0BAAAA,MAAC,SAAI,KAAK,UAAU,KAAK,UAAU,WAAU,wBAAuB;AAAA;AACxE;AAKG,IAAM,SAAS,CAAC;AAAA,EACnB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,cAAc,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAmB;AAEf,QAAM,cAAc,WAAW,KAAK;AAEpC,QAAM,CAAC,cAAc,eAAe,IAAIG,UAAsB,oBAAI,IAAI,CAAC;AAEvE,QAAM,gBAAgB,CAAC,UAAkB;AACrC,oBAAgB,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,KAAK,GAAG;AACjB,aAAK,OAAO,KAAK;AAAA,MACrB,OAAO;AACH,aAAK,IAAI,KAAK;AAAA,MAClB;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,QAAM,UAAU,WAAW,SAAS;AAEpC,SACI,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,UAAU,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACxD,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,iBAGX;AAAA,wBAAAA,OAAC,SAAI,WAAU,kBACX;AAAA,0BAAAD,MAAC,SAAI,WAAU,wBACX,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,KAAK;AAAA,cACL,WAAU;AAAA;AAAA,UACd,GACJ;AAAA,UAGC,aACG,gBAAAC,OAAC,SAAI,WAAU,yCACX;AAAA,4BAAAD,MAAC,UAAK,WAAU,wBAAwB,mBAAQ;AAAA,YAChD,gBAAAA,MAAC,SAAI,WAAU,wBACV,oBAAU,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,MAAM,KAAK;AAAA,gBACX,cAAY,KAAK;AAAA,gBACjB,QAAO;AAAA,gBACP,KAAI;AAAA,gBAEJ,0BAAAA,MAAC,SAAI,WAAU,mBAAkB,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU;AAAA;AAAA,cANpE;AAAA,YAOT,CACH,GACL;AAAA,aACJ;AAAA,UAGJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA,6BAA6B;AAAA,cACjC,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cAEZ,sBAAY,IAAI,CAAC,MAAM,MACpB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEG,MAAM,KAAK;AAAA,kBACX,WAAU;AAAA,kBACV,cAAY,KAAK;AAAA,kBACjB,QAAO;AAAA,kBACP,KAAI;AAAA,kBAEH,eAAK;AAAA;AAAA,gBAPD;AAAA,cAQT,CACH;AAAA;AAAA,UACL;AAAA,UAEC,6BAA6B,wBAC1B,gBAAAA,MAAC,SAAI,WAAU,4BACX,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,KAAK;AAAA,cACL,WAAU;AAAA;AAAA,UACd,GACJ;AAAA,WAER;AAAA,QAGC,aACG,gBAAAA,MAAC,SAAI,WAAU,sBACX,0BAAAC,OAAC,SAAI,WAAU,wCACX;AAAA,0BAAAD,MAAC,UAAK,WAAU,wBAAwB,mBAAQ;AAAA,UAChD,gBAAAA,MAAC,SAAI,WAAU,wBACV,oBAAU,MAAM,IAAI,CAAC,MAAM,MACxB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,MAAM,KAAK;AAAA,cACX,cAAY,KAAK;AAAA,cACjB,QAAO;AAAA,cACP,KAAI;AAAA,cAEJ,0BAAAA,MAAC,SAAI,WAAU,mBAAkB,KAAK,KAAK,UAAU,KAAK,KAAK,UAAU;AAAA;AAAA,YANpE;AAAA,UAOT,CACH,GACL;AAAA,WACJ,GACJ;AAAA,QAIJ,gBAAAC,OAAC,SAAI,WAAU,oCACV;AAAA,qBAAW,IAAI,CAAC,QAAQ,WACrB,gBAAAD,MAAC,SAAiB,WAAU,kBACvB,iBAAO,IAAI,CAAC,SAAS,WAClB,gBAAAC,OAAC,SAAiB,WAAU,uBACxB;AAAA,4BAAAD,MAAC,OAAE,WAAU,qBAAqB,kBAAQ,OAAM;AAAA,YAChD,gBAAAA,MAAC,QAAG,WAAU,qBACT,kBAAQ,MAAM,IAAI,CAAC,MAAM,YACtB,gBAAAA,MAAC,QACG,0BAAAA,MAAC,WAAS,GAAG,MAAM,KADd,OAET,CACH,GACL;AAAA,eARM,MASV,CACH,KAZK,MAaV,CACH;AAAA,UAGD,gBAAAC,OAAC,SAAI,WAAU,mBACV;AAAA,oCAAwB,CAAC,6BACtB,gBAAAD,MAAC,SAAI,WAAU,0BACX,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,WAAU;AAAA;AAAA,YACd,GACJ;AAAA,YAGH,WACG,gBAAAC,OAAC,SAAI,WAAU,yBACX;AAAA,8BAAAA,OAAC,SAAI,WAAU,2BACX;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACG,KAAK,QAAQ;AAAA,oBACb,KAAK,QAAQ,WAAW;AAAA,oBACxB,WAAU;AAAA;AAAA,gBACd;AAAA,gBACA,gBAAAA,MAAC,UAAK,WAAU,0BACX,kBAAQ,SAAS,YACtB;AAAA,iBACJ;AAAA,cACA,gBAAAA,MAAC,OAAE,WAAU,yBACR,kBAAQ,eAAe,wCAC5B;AAAA,eACE,QAAQ,aAAa,QAAQ,eAC3B,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAW;AAAA,oBACP;AAAA,oBACA,QAAQ,cAAc;AAAA,kBAC1B,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBAEZ;AAAA,4BAAQ,aACL,gBAAAD,MAAC,SAAI,WAAU,4BACV,kBAAQ,YACb,IAEA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACG,KAAK,QAAQ;AAAA,wBACb,KAAK,QAAQ,aAAa;AAAA,wBAC1B,WAAU;AAAA;AAAA,oBACd;AAAA,oBAEJ,gBAAAA,MAAC,UAAK,WAAU,6BACX,kBAAQ,uBAAuB,oBACpC;AAAA;AAAA;AAAA,cACJ;AAAA,cAEJ,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,iBAAiB,QAAQ;AAAA,kBACzB,eAAe,QAAQ;AAAA,kBACvB,aAAa,QAAQ;AAAA,kBACrB,kBAAkB,QAAQ;AAAA;AAAA,cAC9B;AAAA,eACJ;AAAA,YAGH,eAAe,gBAAAA,MAAC,iBAAe,GAAG,aAAa;AAAA,aACpD;AAAA,WACJ;AAAA,QAGA,gBAAAA,MAAC,SAAI,WAAU,sCACV,sBAAY,IAAI,CAAC,SAAS,QAAQ;AAC/B,gBAAM,SAAS,aAAa,IAAI,GAAG;AACnC,iBACI,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEG,WAAW;AAAA,gBACP;AAAA,gBACA,UAAU;AAAA,cACd,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cAEb;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,MAAM,cAAc,GAAG;AAAA,oBAChC,iBAAe;AAAA,oBAEf;AAAA,sCAAAD,MAAC,UAAK,WAAU,2BACX,kBAAQ,OACb;AAAA,sBACA,gBAAAA,MAAC,UAAK,WAAU,6BACZ,0BAAAA,MAACE,kBAAA,EAAgB,GACrB;AAAA;AAAA;AAAA,gBACJ;AAAA,gBACC,UACG,gBAAAF,MAAC,QAAG,WAAU,2BACT,kBAAQ,MAAM,IAAI,CAAC,MAAM,YACtB,gBAAAA,MAAC,QACG,0BAAAA,MAAC,WAAS,GAAG,MAAM,KADd,OAET,CACH,GACL;AAAA;AAAA;AAAA,YA5BC;AAAA,UA8BT;AAAA,QAER,CAAC,GACL;AAAA,QAGC,YAAY,SAAS,KAClB,gBAAAA,MAAC,SAAI,WAAU,6CACV,sBAAY,IAAI,CAAC,MAAM,MACpB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEG,MAAM,KAAK;AAAA,YACX,WAAU;AAAA,YACV,cAAY,KAAK;AAAA,YACjB,QAAO;AAAA,YACP,KAAI;AAAA,YAEH,eAAK;AAAA;AAAA,UAPD;AAAA,QAQT,CACH,GACL;AAAA,QAIH,WACG,gBAAAC,OAAC,SAAI,WAAU,2BACX;AAAA,0BAAAA,OAAC,SAAI,WAAU,gCACX;AAAA,4BAAAA,OAAC,SAAI,WAAU,2BACX;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,QAAQ;AAAA,kBACb,KAAK,QAAQ,WAAW;AAAA,kBACxB,WAAU;AAAA;AAAA,cACd;AAAA,cACA,gBAAAA,MAAC,UAAK,WAAU,0BACX,kBAAQ,SAAS,YACtB;AAAA,eACJ;AAAA,YACA,gBAAAA,MAAC,OAAE,WAAU,yBACR,kBAAQ,eAAe,wCAC5B;AAAA,aACJ;AAAA,UACA,gBAAAA,MAAC,SAAI,WAAU,kCACX,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,iBAAiB,QAAQ;AAAA,cACzB,eAAe,QAAQ;AAAA,cACvB,aAAa,QAAQ;AAAA,cACrB,kBAAkB,QAAQ;AAAA;AAAA,UAC9B,GACJ;AAAA,WACJ;AAAA,QAIH,eACG,gBAAAA,MAAC,SAAI,WAAU,4BACX,0BAAAA,MAAC,iBAAe,GAAG,aAAa,GACpC;AAAA,SAIF,eAAe,oBACb,gBAAAC,OAAC,SAAI,WAAU,uBACV;AAAA,yBACG,gBAAAD,MAAC,SAAI,WAAU,mBAAmB,uBAAY;AAAA,UAEjD,mBACG,gBAAAA,MAAC,SAAI,WAAU,wBACX,0BAAAA,MAAC,OAAE,WAAU,6BAA6B,2BAAgB,GAC9D;AAAA,WAER;AAAA,QAIH,wBACG,gBAAAA,MAAC,SAAI,WAAU,6BACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA;AAAA,QACd,GACJ;AAAA,SAER;AAAA;AAAA,EACJ;AAER;;;AClaoB,SAEI,OAAAI,OAFJ,QAAAC,cAAA;AAvCb,IAAM,yBACT;AAEJ,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,cAAc,aAAa,aAAa,aAAa,KAAK;AAGhE,IAAM,aACF;AAMG,SAAS,gBAAgB,OAAuB;AACnD,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,KAAK,CAAC;AACvD,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,OAAO,UAAU;AACvB,QAAM,UAAU,OAAO,OAAO,IAAI,OAAO,OAAO,MAAM;AACtD,SAAO,KAAK,IAAI,YAAY,QAAQ,OAAO;AAC/C;AAEA,IAAM,QAAQ,CAAC,EAAE,MAAM,MAAyB;AAC5C,QAAM,QAAQ,gBAAgB,KAAK;AACnC,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAS,OAAO,WAAW,IAAI,SAAS;AAAA,MACxC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAY;AAAA,MACZ,WAAU;AAAA,MAET,gBAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,MAAM;AAC1C,cAAM,IAAI,KAAK,YAAY;AAC3B,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AAC/C,eACI,gBAAAC,OAAC,OAAU,WAAW,aAAa,CAAC,OAEhC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACd;AAAA,UAEC,OAAO,KACJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO,YAAY;AAAA,cACnB,QAAQ;AAAA,cACR,WAAU;AAAA;AAAA,UACd;AAAA,UAEJ,gBAAAA,MAAC,UAAK,GAAG,YAAY,WAAU,+BAA8B;AAAA,aAfzD,CAgBR;AAAA,MAER,CAAC;AAAA;AAAA,EACL;AAER;AAGA,IAAM,WAAW,MACb,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACG,WAAU;AAAA,IACV,SAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,eAAY;AAAA,IACZ,WAAU;AAAA,IAEV;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,GAAE;AAAA;AAAA,MACN;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,GAAE;AAAA;AAAA,MACN;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,GAAE;AAAA;AAAA,MACN;AAAA;AAAA;AACJ;AAGG,IAAM,0BACT;AAEJ,IAAM,cAAc,CAAC,OAAwB,WACzC,OAAO,UAAU,WAAW,IAAI,KAAK,aAAa,MAAM,EAAE,OAAO,KAAK,IAAI;AAE9E,IAAM,cAAc,CAAC,OAAe,WAChC,IAAI,KAAK,aAAa,QAAQ,EAAE,uBAAuB,EAAE,CAAC,EAAE,OAAO,KAAK;AAE5E,IAAM,cAAc;AAOpB,SAAS,eAAe,UAAkB,QAAgD;AACtF,SAAO,SAAS,MAAM,WAAW,EAAE,IAAI,CAAC,MAAM,MAAM;AAChD,QAAI,SAAS,WAAW;AACpB,aACI,gBAAAA,MAAC,UAAa,WAAU,+BACnB,iBAAO,SADD,CAEX;AAAA,IAER;AACA,QAAI,SAAS,iBAAiB;AAC1B,aACI,gBAAAA,MAAC,UAAa,WAAU,+BACnB,iBAAO,eADD,CAEX;AAAA,IAER;AACA,WAAO;AAAA,EACX,CAAC;AACL;AAEA,SAAS,aAAa,UAAkB,QAAgD;AACpF,SAAO,SAAS,QAAQ,WAAW,OAAO,KAAK,EAAE,QAAQ,iBAAiB,OAAO,WAAW;AAChG;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACJ,MAA2B;AACvB,QAAM,SAAS;AAAA,IACX,OAAO,YAAY,OAAO,MAAM;AAAA,IAChC,aAAa,YAAY,aAAa,MAAM;AAAA,EAChD;AAGA,QAAM,WACF,SAAS,QAAQ,GAAG,KAAK,qDAAqD;AAClF,QAAM,WAAW,aAAa,UAAU,MAAM;AAE9C,SACI,gBAAAA,MAAC,SAAI,WAAU,iDACX,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAU;AAAA,MACV,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,cAAY,aAAa,GAAG,QAAQ;AAAA,MAEpC;AAAA,wBAAAD,MAAC,SAAM,OAAc;AAAA,QACrB,gBAAAA,MAAC,UAAK,WAAU,yBAAwB,eAAY,QAC/C,yBAAe,UAAU,MAAM,GACpC;AAAA,QACA,gBAAAA,MAAC,YAAS;AAAA;AAAA;AAAA,EACd,GACJ;AAER;;;AC/JmC,gBAAAE,OAuB3B,QAAAC,cAvB2B;AAVnC,IAAM,SAAS,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA,MAAM;AACV,MAKI,gBAAAD,MAAC,SAAI,WACA,iBAAO,QAAQ,WAAW,gBAAAA,MAAC,SAAI,KAAU,KAAU,IAAK,KAC7D;AAGJ,IAAM,YAAY,CAAC;AAAA,EACf;AAAA,EACA,eAAe;AACnB,MAGM;AACF,QAAME,OAAM,iBAAiB,IAAI,OAAO;AACxC,SAAO,gBAAAF,MAACE,MAAA,EAAI,WAAU,eAAe,iBAAM;AAC/C;AAIA,IAAM,cAAc,CAAC;AAAA,EACjB;AAAA,EACA;AACJ,MAA4D;AACxD,MAAI,CAAC,iBAAiB,CAAC,gBAAiB,QAAO;AAC/C,SACI,gBAAAD,OAAC,SAAI,WAAU,iBACV;AAAA,sBACI,cAAc,OACX,gBAAAD,MAAC,OAAE,MAAM,cAAc,MACnB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA;AAAA,IAC3B,GACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA;AAAA,IAC3B;AAAA,IAEP,oBACI,gBAAgB,OACb,gBAAAA,MAAC,OAAE,MAAM,gBAAgB,MACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,gBAAgB;AAAA,QACvB,SAAS,gBAAgB;AAAA;AAAA,IAC7B,GACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,gBAAgB;AAAA,QACvB,SAAS,gBAAgB;AAAA;AAAA,IAC7B;AAAA,KAEZ;AAER;AAIO,IAAM,OAAO,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAiB;AACb,QAAM,eAAe,SAAS,OAAO;AAGrC,QAAM,kBAAkB,aAAa,yBAAyB;AAC9D,QAAM,iBAAiB,aAAa,gBAAAA,MAAC,kBAAgB,GAAG,YAAY,IAAK;AAGzE,MAAI,YAAY,SAAS;AACrB,WACI,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,WAAW,CAAC,QAAQ,cAAc,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACtF,OACI,qBACM,EAAE,iBAAiB,OAAO,kBAAkB,IAAI,IAChD;AAAA,QAET,GAAG;AAAA,QAGJ;AAAA,0BAAAD,MAAC,SAAI,WAAU,iBAAgB,eAAY,QAAO;AAAA,UAKjD,iBACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cACV,KAAI;AAAA;AAAA,UACR;AAAA,UAIH,aACG,gBAAAA,MAAC,UAAO,KAAK,WAAW,WAAU,oBAAmB,KAAI,IAAG;AAAA,UAIhE,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAA,MAAC,SAAI,WAAU,iBACX,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAC,OAAC,SAAI,WAAU,cACX;AAAA,4BAAAA,OAAC,SAAI,WAAU,cACV;AAAA,0BACG,gBAAAD,MAAC,OAAE,WAAU,kBAAkB,oBAAS;AAAA,cAE5C,gBAAAA,MAAC,aAAU,OAAc,cAA4B;AAAA,cACpD,eACG,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,uBAAY;AAAA,eAEtD;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA;AAAA;AAAA,YACJ;AAAA,aACJ,GACJ,GACJ,GACJ;AAAA,UAEC;AAAA;AAAA;AAAA,IACL;AAAA,EAER;AAGA,MAAI,YAAY,YAAY;AACxB,WACI,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,WAAW,CAAC,QAAQ,cAAc,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACtF,OACI,qBACM,EAAE,iBAAiB,OAAO,kBAAkB,IAAI,IAChD;AAAA,QAET,GAAG;AAAA,QAEJ;AAAA,0BAAAD,MAAC,SAAI,WAAU,iBAAgB,eAAY,QAAO;AAAA,UAClD,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,4BAAAA,OAAC,SAAI,WAAU,cACV;AAAA,0BAAY,gBAAAD,MAAC,OAAE,WAAU,kBAAkB,oBAAS;AAAA,cACrD,gBAAAA,MAAC,aAAU,OAAc,cAA4B;AAAA,cACpD,eACG,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,uBAAY;AAAA,eAEtD;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA;AAAA;AAAA,YACJ;AAAA,aACJ,GACJ;AAAA,UAEC;AAAA;AAAA;AAAA,IACL;AAAA,EAER;AAGA,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,QAAQ,cAAc,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtF,OACI,qBACM,EAAE,iBAAiB,OAAO,kBAAkB,IAAI,IAChD;AAAA,MAET,GAAG;AAAA,MAEJ;AAAA,wBAAAD,MAAC,SAAI,WAAU,iBAAgB,eAAY,QAAO;AAAA,QAClD,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,0BAAAA,OAAC,SAAI,WAAU,cACV;AAAA,wBAAY,gBAAAD,MAAC,OAAE,WAAU,kBAAkB,oBAAS;AAAA,YACrD,gBAAAA,MAAC,aAAU,OAAc,cAA4B;AAAA,YACpD,eACG,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,uBAAY;AAAA,aAEtD;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG;AAAA,cACA;AAAA;AAAA,UACJ;AAAA,UAEC,gBACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cACV,KAAI;AAAA;AAAA,UACR;AAAA,UAGH,iBACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cACV,KAAI;AAAA;AAAA,UACR;AAAA,WAER,GACJ;AAAA,QAEC;AAAA;AAAA;AAAA,EACL;AAER;;;ACxPA,SAAgB,aAAAG,YAAW,UAAAC,eAAc;AAcjC,SAIgB,OAAAC,OAJhB,QAAAC,cAAA;AANR,IAAMC,eAAc,CAAC;AAAA,EACjB;AAAA,EACA;AACJ,MAA8D;AAC1D,MAAI,CAAC,iBAAiB,CAAC,gBAAiB,QAAO;AAC/C,SACI,gBAAAD,OAAC,SAAI,WAAU,mBACV;AAAA,sBACI,cAAc,OACX,gBAAAD,MAAC,OAAE,MAAM,cAAc,MACnB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA;AAAA,IAC3B,GACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA;AAAA,IAC3B;AAAA,IAEP,oBACI,gBAAgB,OACb,gBAAAA,MAAC,OAAE,MAAM,gBAAgB,MACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,gBAAgB;AAAA,QACvB,SAAS,gBAAgB;AAAA;AAAA,IAC7B,GACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,gBAAgB;AAAA,QACvB,SAAS,gBAAgB;AAAA;AAAA,IAC7B;AAAA,KAEZ;AAER;AAIA,IAAM,cAAc,CAAC,EAAE,OAAO,MAAmC;AAC7D,QAAM,gBAAgB,CAAC,UAAiD;AACpE,QAAI,MAAM,QAAQ,SAAS;AACvB,cAAQ,WAAW,MAAM,cAAc,KAAK;AAAA,IAChD;AAAA,EACJ;AAEA,SACI,gBAAAA,MAAC,SAAI,WAAU,kBACX,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACG,aAAa,QAAQ,eAAe;AAAA,MACpC,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,WAAW;AAAA,MACX,gBAAgB;AAAA;AAAA,EACpB,GACJ;AAER;AAIO,IAAM,SAAS,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACP,MAAmB;AACf,QAAM,eAAe,WAAW,OAAO;AAGvC,QAAM,aAAaG,QAAoB,IAAI;AAC3C,QAAM,UAAUA,QAAuB,IAAI;AAC3C,QAAM,WAAWA,QAAuB,IAAI;AAE5C,EAAAC,WAAU,MAAM;AACZ,QAAI,YAAY,UAAW;AAC3B,QAAI,OAAO,WAAW,kCAAkC,EAAE,QAAS;AAEnE,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,QAAQ;AACvB,UAAM,UAAU,SAAS;AACzB,QAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAS;AAErC,UAAM,WAAW;AAEjB,UAAM,WAAW,MAAM;AACnB,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,QAAQ,OAAO;AACrB,YAAM,WAAW,IAAI,KAAK,UAAU,QAAQ,KAAK;AACjD,YAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC;AACjD,YAAM,UAAU,UAAU,OAAO,WAAW;AAC5C,aAAO,MAAM,YAAY,cAAc,CAAC,MAAM;AAC9C,cAAQ,MAAM,YAAY,cAAc,MAAM;AAAA,IAClD;AAEA,UAAM,YAAY,MAAM;AACpB,UAAI,KAAqB,QAAQ;AACjC,aAAO,MAAM,OAAO,SAAS,iBAAiB;AAC1C,cAAM,EAAE,UAAU,UAAU,IAAI,iBAAiB,EAAE;AACnD,YAAI,cAAc,KAAK,WAAW,SAAS,EAAG,QAAO;AACrD,aAAK,GAAG;AAAA,MACZ;AACA,aAAO;AAAA,IACX,GAAG;AAEH,aAAS,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC/D,aAAS;AAET,WAAO,MAAM,SAAS,oBAAoB,UAAU,QAAQ;AAAA,EAChE,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,YACF,gBAAAH,OAAC,SAAI,WAAU,gBACV;AAAA,gBAAY,gBAAAD,MAAC,OAAE,WAAU,oBAAoB,oBAAS;AAAA,IACvD,gBAAAA,MAAC,QAAG,WAAU,iBAAiB,iBAAM;AAAA,IACpC,eAAe,gBAAAA,MAAC,OAAE,WAAU,uBAAuB,uBAAY;AAAA,KACpE;AAGJ,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,UAAU,cAAc,eAAe,wBAAwB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7G,GAAG;AAAA,MAGJ;AAAA,wBAAAD,MAAC,SAAI,WAAU,gBAAe,eAAY,QAAO;AAAA,QAGhD,YAAY,aAAa,cACtB,gBAAAA,MAAC,SAAI,KAAK,SAAS,WAAU,uCACxB,iBAAO,eAAe,WACnB,gBAAAA,MAAC,SAAI,KAAK,YAAY,KAAI,IAAG,IAE7B,YAER;AAAA,QAEH,YAAY,aAAa,eACtB,gBAAAA,MAAC,SAAI,KAAK,UAAU,WAAU,wCACzB,iBAAO,gBAAgB,WACpB,gBAAAA,MAAC,SAAI,KAAK,aAAa,KAAI,IAAG,IAE9B,aAER;AAAA,QAIJ,gBAAAA,MAAC,SAAI,WAAU,mBAAkB,eAAY,QAAO;AAAA,QAGpD,gBAAAA,MAAC,SAAI,WAAU,iBACX,0BAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAC,OAAC,SAAI,WAAU,gBACV;AAAA;AAAA,UACA,YAAY,iBAAiB,gBAAAD,MAAC,eAAY,QAAgB;AAAA,UAC3D,gBAAAA;AAAA,YAACE;AAAA,YAAA;AAAA,cACG;AAAA,cACA;AAAA;AAAA,UACJ;AAAA,WACJ,GACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AClMA,SAAS,aAAAG,YAAW,SAAS,UAAAC,SAAQ,YAAAC,iBAAgB;AA4K7C,SACI,OAAAC,OADJ,QAAAC,cAAA;AA9IR,IAAM,UAAU;AAChB,IAAM,mBAAmB;AACzB,IAAM,cAAc,UAAU;AAC9B,IAAM,SAAS;AACf,IAAM,aACF,aAAa,gBAAgB,MAAM,MAAM,aAC7B,gBAAgB,MAAM,MAAM;AAqB5C,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AA6B5B,IAAM,cAAc;AACpB,IAAM,SAAS;AAEf,SAAS,aAAa,MAAY,YAAmC;AACjE,UAAQ,MAAM;AAAA,IACV,KAAK;AACD,aAAO;AAAA,QACH,WAAW,GAAG,MAAM;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACJ;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,WAAW,GAAG,MAAM,oBAAoB,WAAW;AAAA,QACnD,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACJ;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,WAAW,GAAG,MAAM,eAAe,WAAW;AAAA,QAC9C,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACJ;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,QACH,WAAW,GAAG,MAAM,oBAAoB,WAAW;AAAA,QACnD,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACJ;AAAA,IACJ,KAAK;AAAA,IACL;AACI,aAAO;AAAA,QACH,WAAW,GAAG,MAAM,eAAe,WAAW;AAAA,QAC9C,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACJ;AAAA,EACR;AACJ;AAWA,SAAS,aAAa,OAAe,MAAoB;AACrD,QAAM,MAAM,QAAQ,OAAO;AAC3B,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,QAAQ,GAAI,QAAO;AACvB,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,MAAM,GAAI,QAAO;AACrB,SAAO;AACX;AAOA,IAAM,SAAS,CAAC,EAAE,OAAO,MAAM,MAC3B,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IACZ,WAAU;AAAA,IACV,WAAW;AAAA,MACP;AAAA,MACA,OAAO,2BAA2B;AAAA,IACtC,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IAEb,0BAAAC,OAAC,OAAE,SAAQ,OACP;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,GAAE;AAAA,UACF,MAAK;AAAA,UACL,QAAO;AAAA;AAAA,MACX;AAAA,OACJ;AAAA;AACJ;AAKJ,IAAM,aAAa,CAAC,EAAE,SAAS,WAAW,MACtC,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,kBAAAD,MAAC,UAAO;AAAA,EACR,gBAAAC,OAAC,SAAI,WAAU,wBACX;AAAA,oBAAAD,MAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA,IAClD,gBAAAA,MAAC,SAAI,WAAU,8BAA8B,sBAAW;AAAA,KAC5D;AAAA,EACA,gBAAAA,MAAC,UAAO,MAAI,MAAC;AAAA,GACjB;AAKG,IAAM,QAAQ,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,CAAC;AAAA,EACd,cAAc,CAAC;AAAA,EACf;AAAA,EACA,GAAG;AACP,MAAkB;AACd,QAAM,aAAaE,QAAoB,IAAI;AAC3C,QAAM,aAAaA,QAAuB,IAAI;AAC9C,QAAM,cAAcA,QAAuB,IAAI;AAC/C,QAAM,SAASA,QAAsB,IAAI;AAEzC,QAAM,IAAI,MAAM;AAChB,QAAM,YAAY,WAAW,SAAS,KAAK,YAAY,SAAS;AAChE,QAAM,YAA0B,CAAC,GAAG,YAAY,GAAG,WAAW;AAgB9D,QAAM,QAAQ,QAAQ,MAAM;AACxB,QAAI,MAAM,EAAG,QAAO,CAAC;AACrB,UAAM,SAAS,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC;AACpC,WAAO,MAAM,KAAK,EAAE,QAAQ,OAAO,GAAG,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,CAAC;AAAA,EAChE,GAAG,CAAC,OAAO,CAAC,CAAC;AA4Db,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAS,CAAC;AAClC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAgB,MAAM;AAIhD,QAAM,cAAcD,QAA2C,IAAI;AAEnE,EAAAE,WAAU,MAAM;AACZ,QAAI,KAAK,EAAG;AAEZ,QAAI,UAAyB;AAC7B,QAAI,YAAY;AAEhB,UAAM,UAAU,MAAM;AAClB,gBAAU;AACV,UAAI,UAAW;AACf,cAAQ,CAAC,SAAS;AACd,YAAI,QAAQ,GAAG;AACX,mBAAS,cAAc;AACvB,iBAAO;AAAA,QACX;AACA,cAAM,OAAO,OAAO;AAUpB,cAAM,UACF,QAAQ,IAAI,mBAAmB;AACnC,iBAAS,OAAO;AAChB,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAEA,UAAM,WAAW,CAAC,YAAoB;AAClC,UAAI,UAAW;AACf,UAAI,YAAY,KAAM,QAAO,aAAa,OAAO;AACjD,gBAAU,OAAO,WAAW,SAAS,OAAO;AAAA,IAChD;AAEA,gBAAY,UAAU;AACtB,aAAS,OAAO;AAEhB,WAAO,MAAM;AACT,kBAAY;AACZ,kBAAY,UAAU;AACtB,UAAI,YAAY,KAAM,QAAO,aAAa,OAAO;AAAA,IACrD;AAAA,EACJ,GAAG,CAAC,CAAC,CAAC;AAIN,EAAAA,WAAU,MAAM;AACZ,QAAI,UAAU,gBAAgB;AAC1B,YAAM,MAAM,sBAAsB,MAAM;AACpC,gBAAQ,CAAC;AACT,iBAAS,WAAW;AAAA,MACxB,CAAC;AACD,aAAO,UAAU;AACjB,aAAO,MAAM,qBAAqB,GAAG;AAAA,IACzC;AACA,QAAI,UAAU,aAAa;AACvB,YAAM,MAAM,sBAAsB,MAAM;AACpC,iBAAS,MAAM;AAIf,oBAAY,UAAU,OAAO;AAAA,MACjC,CAAC;AACD,aAAO,UAAU;AACjB,aAAO,MAAM,qBAAqB,GAAG;AAAA,IACzC;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAGV,EAAAA,WAAU,MAAM;AACZ,YAAQ,CAAC;AACT,aAAS,MAAM;AAAA,EACnB,GAAG,CAAC,CAAC,CAAC;AAGN,EAAAA,WAAU,MAAM;AACZ,UAAM,QAAQ,MAAM;AAChB,YAAM,UAAU,WAAW;AAC3B,UAAI,CAAC,WAAW,OAAO,aAAa,qBAAqB;AAIrD,YAAI,WAAW,QAAS,YAAW,QAAQ,MAAM,YAAY;AAC7D,YAAI,YAAY;AACZ,sBAAY,QAAQ,MAAM,YAAY;AAC1C;AAAA,MACJ;AAEA,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,WAAW,OAAO;AACxB,YAAM,cAAc,KAAK,SAAS;AAClC,YAAM,WAAW,WAAW,KAAK;AACjC,YAAM,cAAc,WAAW;AAC/B,YAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,CAAC;AAErD,YAAM,aAAa,KAAK;AAAA,QACpB;AAAA,QACA,KAAK;AAAA,UACD;AAAA,WACC,WAAW,mBACP,eAAe;AAAA,QACxB;AAAA,MACJ;AAKA,YAAM,YAAY,IAAI;AACtB,YAAM,aAAa,CAAC,uBAAuB;AAC3C,YAAM,cAAc,uBAAuB;AAE3C,UAAI,WAAW,SAAS;AACpB,mBAAW,QAAQ,MAAM,YAAY,cAAc,UAAU;AAAA,MACjE;AACA,UAAI,YAAY,SAAS;AACrB,oBAAY,QAAQ,MAAM,YAAY,cAAc,WAAW;AAAA,MACnE;AAAA,IACJ;AAEA,UAAM,WAAW,MAAM;AACnB,4BAAsB,KAAK;AAAA,IAC/B;AAEA,UAAM;AACN,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IACjD;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,UAAU,SAAS,aAAa;AAEnD,SACI,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,YAAY,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1D,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,wBAAAA,OAAC,SAAI,WAAU,oBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,UACtC,eACG,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,uBAAY;AAAA,WAE1D;AAAA,QAEA,gBAAAC,OAAC,SAAI,WAAU,qBACV;AAAA,qBAAW,SAAS,KACjB,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cAET,qBAAW,IAAI,CAAC,OAAO,MACpB,gBAAAA,MAAC,cAA2B,GAAG,SAAd,KAAK,CAAC,EAAe,CACzC;AAAA;AAAA,UACL;AAAA,UAGJ,gBAAAA,MAAC,SAAI,WAAU,kBACX,0BAAAC,OAAC,SAAI,WAAU,wBACX;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YAChB;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,eAAY;AAAA;AAAA,YAChB;AAAA,YACC,MAAM,IAAI,CAAC,MAAM,MAAM;AACpB,oBAAM,OAAO,aAAa,GAAG,IAAI;AACjC,oBAAM,SAAS,SAAS;AACxB,qBACI,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAEG,WAAW;AAAA,oBACP;AAAA,oBACA,SACM,2BACA;AAAA,kBACV,EAAE,KAAK,GAAG;AAAA,kBACV,OAAO,aAAa,MAAM,UAAU;AAAA,kBACpC,eAAa,CAAC;AAAA,kBAEd;AAAA,oCAAAD,MAAC,UAAK,WAAU,wBACX,eAAK,OACV;AAAA,oBACA,gBAAAA,MAAC,UAAK,WAAU,wBACX,eAAK,OACV;AAAA;AAAA;AAAA,gBAfK;AAAA,cAgBT;AAAA,YAER,CAAC;AAAA,aACL,GACJ;AAAA,UAEC,YAAY,SAAS,KAClB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cAET,sBAAY,IAAI,CAAC,OAAO,MACrB,gBAAAA,MAAC,cAA2B,GAAG,SAAd,KAAK,CAAC,EAAe,CACzC;AAAA;AAAA,UACL;AAAA,UAGH,aACG,gBAAAA,MAAC,SAAI,WAAU,2BACV,oBAAU,IAAI,CAAC,OAAO,MACnB,gBAAAA,MAAC,cAA2B,GAAG,SAAd,KAAK,CAAC,EAAe,CACzC,GACL;AAAA,WAER;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AC5jBA,SAAS,aAAAK,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAoFpC,SA6CgB,OAAAC,OA7ChB,QAAAC,cAAA;AApER,SAAS,WAAW,KAIlB;AACE,QAAM,QAAQ,IAAI,MAAM,sCAAsC;AAC9D,MAAI,CAAC,MAAO,QAAO,EAAE,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI;AACxD,SAAO;AAAA,IACH,QAAQ,MAAM,CAAC;AAAA,IACf,QAAQ,WAAW,MAAM,CAAC,CAAC;AAAA,IAC3B,QAAQ,MAAM,CAAC;AAAA,EACnB;AACJ;AAEA,IAAM,cAAc;AACpB,IAAMC,UAAS,CAAC,MAAc,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAEnD,SAAS,WAAW,QAAgB,QAAiB;AACjD,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,CAAC;AACxC,QAAM,SAASC,QAAsB,IAAI;AACzC,QAAM,WAAWA,QAAsB,IAAI;AAE3C,EAAAC,WAAU,MAAM;AACZ,QAAI,CAAC,OAAQ;AAEb,aAAS,UAAU;AAEnB,UAAM,OAAO,CAAC,QAAgB;AAC1B,UAAI,SAAS,YAAY,KAAM,UAAS,UAAU;AAClD,YAAM,UAAU,MAAM,SAAS;AAC/B,YAAM,WAAW,KAAK,IAAI,UAAU,aAAa,CAAC;AAClD,YAAM,QAAQH,QAAO,QAAQ;AAC7B,iBAAW,KAAK,MAAM,QAAQ,MAAM,CAAC;AACrC,UAAI,WAAW,GAAG;AACd,eAAO,UAAU,sBAAsB,IAAI;AAAA,MAC/C;AAAA,IACJ;AAEA,WAAO,UAAU,sBAAsB,IAAI;AAC3C,WAAO,MAAM;AACT,UAAI,OAAO,YAAY,KAAM,sBAAqB,OAAO,OAAO;AAAA,IACpE;AAAA,EACJ,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,SAAO;AACX;AAIA,IAAM,gBAAgB,CAAC;AAAA,EACnB;AAAA,EACA;AACJ,MAGM;AACF,QAAM,EAAE,QAAQ,QAAQ,OAAO,IAAI,WAAW,GAAG;AACjD,QAAM,QAAQ,WAAW,QAAQ,MAAM;AAKvC,QAAM,YACF,UAAU,OAAQ,CAAC,WAAW,KAAK,MAAM,IACnC,MAAM,eAAe,IACrB,OAAO,KAAK;AAEtB,SACI,gBAAAD,OAAC,UAAK,WAAU,uBACX;AAAA;AAAA,IACA;AAAA,IACA;AAAA,KACL;AAER;AAIO,IAAM,cAAc,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAwB;AACpB,QAAM,aAAaG,QAAoB,IAAI;AAC3C,QAAM,CAAC,UAAU,WAAW,IAAID,UAAS,KAAK;AAE9C,EAAAE,WAAU,MAAM;AACZ,UAAM,KAAK,WAAW;AACtB,QAAI,CAAC,GAAI;AAET,UAAM,WAAW,IAAI;AAAA,MACjB,CAAC,CAAC,KAAK,MAAM;AACT,YAAI,MAAM,gBAAgB;AACtB,sBAAY,IAAI;AAChB,mBAAS,WAAW;AAAA,QACxB;AAAA,MACJ;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,IACtB;AAEA,aAAS,QAAQ,EAAE;AACnB,WAAO,MAAM,SAAS,WAAW;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,SACI,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,gBAAgB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9D,GAAG;AAAA,MAEJ,0BAAAA,MAAC,SAAI,WAAU,uBACV,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAC,OAAC,SAAY,WAAU,sBACnB;AAAA,wBAAAD,MAAC,iBAAc,KAAK,KAAK,OAAO,QAAQ,UAAU;AAAA,QAClD,gBAAAA,MAAC,UAAK,WAAU,uBAAuB,eAAK,OAAM;AAAA,WAF5C,CAGV,CACH,GACL;AAAA;AAAA,EACJ;AAER;;;ACxIA,SAAS,aAAAM,YAAW,iBAAiB,UAAAC,SAAQ,YAAAC,kBAAgB;;;ACA7D;AAAA,EACI;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAGG;AA0Ma,gBAAAC,aAAA;AA1LpB,IAAM,kBAAkB;AAAA,EAAK,MACzB,OAAO,8BAA8B,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE;AACtF;AAwCO,SAAS,gBAAgB;AAAA,EAC5B,UAAU;AAAA,EACV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAyB;AACrB,QAAM,UAAUF,QAAuB,IAAI;AAC3C,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,KAAK;AAS1C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAA2B,IAAI;AAEjE,EAAAF,WAAU,MAAM;AACZ,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AAET,UAAM,WAAW,IAAI;AAAA,MACjB,CAAC,CAAC,KAAK,MAAM;AACT,kBAAU,MAAM,cAAc;AAAA,MAClC;AAAA,MACA,EAAE,MAAM,MAAM,YAAY,UAAU;AAAA,IACxC;AAEA,aAAS,QAAQ,EAAE;AACnB,WAAO,MAAM,SAAS,WAAW;AAAA,EACrC,GAAG,CAAC,YAAY,SAAS,CAAC;AAY1B,EAAAA,WAAU,MAAM;AACZ,QAAI,QAAS;AAeb,QAAI,CAAC,OAAQ;AACb,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,YAAY;AAChB,UAAM,SAAS,MAAM;AACjB,UAAI,CAAC,UAAW,YAAW,IAAI;AAAA,IACnC;AAEA,UAAM,SACF,OAAO,OAAO,wBAAwB,aAChC,OAAO,oBAAoB,QAAQ,EAAE,SAAS,IAAI,CAAC,IACnD;AACV,UAAM,UAAU,WAAW,OAAO,OAAO,WAAW,QAAQ,CAAC,IAAI;AAEjE,WAAO,MAAM;AACT,kBAAY;AACZ,UAAI,WAAW,QAAQ,OAAO,OAAO,uBAAuB,YAAY;AACpE,eAAO,mBAAmB,MAAM;AAAA,MACpC;AACA,UAAI,YAAY,KAAM,QAAO,aAAa,OAAO;AAAA,IACrD;AAAA,EACJ,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,EAAAA,WAAU,MAAM;AACZ,QAAI,CAAC,UAAW;AAEhB,QAAI,CAAC,WAAW,CAAC,QAAQ;AACrB,gBAAU,KAAK;AACf;AAAA,IACJ;AAoBA,UAAM,QAAQ,MAAM;AAChB,gBAAU,KAAK;AACf,gBAAU,KAAK;AAAA,IACnB;AAEA,QAAI,UAAU,UAAU;AACpB,YAAM;AACN;AAAA,IACJ;AAEA,cAAU,iBAAiB,QAAQ,KAAK;AACxC,WAAO,MAAM,UAAU,oBAAoB,QAAQ,KAAK;AAAA,EAC5D,GAAG,CAAC,WAAW,SAAS,MAAM,CAAC;AAE/B,SACI,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL;AAAA,MACA,OAAO;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,GAAG;AAAA,MACP;AAAA,MAEC,oBACG,gBAAAA,MAAC,YAAS,UAAU,UAAU,MAC1B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACI,GAAG;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,sBAAsB;AAAA;AAAA,MAC1B,GACJ,IAEC,UAAU;AAAA;AAAA,EAEnB;AAER;;;ACvNO,SAAS,YAAY,OAAwB;AAChD,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,oBAAoB,KAAK,KAAK,EAAG,QAAO;AAC5C,SAAO,2BAA2B,KAAK,KAAK,KAAK,8BAA8B,KAAK,KAAK;AAC7F;;;AFyDQ,gBAAAC,OAoTwB,QAAAC,cApTxB;AAxDD,IAAM,sBAA2C;AAAA,EACpD;AAAA,IACI,OAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAa;AAAA,IACb,UAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,OAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAa;AAAA,IACb,UAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,OAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAa;AAAA,IACb,UAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,OAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAa;AAAA,IACb,UAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,OAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAa;AAAA,IACb,UAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACI,OAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAa;AAAA,IACb,MAAa;AAAA,IACb,UAAa;AAAA,EACjB;AACJ;AAIA,IAAMC,gBAAe,MACjB,gBAAAF;AAAA,EAAC;AAAA;AAAA,IACG,WAAU;AAAA,IACV,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAaJ,IAAM,sBAAsB;AAU5B,SAAS,SAAS,MAAwC;AACtD,SAAO,OAAO,KAAK,aAAa,YAAY,KAAK,aAAa,KAAK,KAAK,WAAW;AACvF;AAEA,SAAS,iBAAiB,MAA6C;AACnE,MAAI,KAAK,UAAW,QAAO,KAAK;AAChC,QAAM,MAAM,SAAS,IAAI;AACzB,SAAO,OAAO,YAAY,GAAG,IAAI,WAAW;AAChD;AASA,IAAM,gBAAgB,CAAC,EAAE,MAAM,QAAQ,YAAY,UAAU,MAA0B;AACnF,QAAM,MAAM,SAAS,IAAI;AACzB,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,iBAAiB,IAAI,MAAM,UAAU;AACrC,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QACI,KAAK,YACD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,KAAK;AAAA,YACT,GAAI,KAAK,eACJ;AAAA,cACI,QAAQ,KAAK;AAAA,cACb,OAAO,KAAK,eAAe;AAAA,YAC/B,IACA,CAAC;AAAA,YACP,KAAI;AAAA,YACJ,eAAY;AAAA,YACZ,SAAQ;AAAA,YACR,UAAS;AAAA;AAAA,QACb,IACA;AAAA;AAAA,IAEZ;AAAA,EAER;AACA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MAIC,GAAI,KAAK,cACJ,EAAE,QAAQ,KAAK,aAAa,OAAO,KAAK,cAAc,oBAAoB,IAC1E,CAAC;AAAA,MACP,KAAK,KAAK;AAAA,MACV,SAAQ;AAAA,MACR,UAAS;AAAA;AAAA,EACb;AAER;AAIO,IAAM,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,UAAY;AAAA,EACZ;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAA0B;AACtB,QAAM,CAAC,aAAa,cAAc,IAAIG,WAAS,CAAC;AAChD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,WAAS,CAAC;AAC5D,QAAM,YAAYC,QAAsC,CAAC,CAAC;AAC1D,QAAM,iBAAiBA,QAAkC,CAAC,CAAC;AAC3D,QAAM,cAAcA,QAA8B,IAAI;AAOtD,kBAAgB,MAAM;AAClB,QAAI,MAAM,WAAW,EAAG;AAExB,UAAM,kBAAkB,MAAc;AAClC,YAAM,MAAM,YAAY;AACxB,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,MAAM,iBAAiB,GAAG,EAAE;AAClC,YAAM,KAAK,WAAW,GAAG;AACzB,aAAO,OAAO,SAAS,EAAE,IAAI,KAAK;AAAA,IACtC;AAEA,QAAI,QAAQ;AACZ,UAAM,OAAO,MAAM;AACf,cAAQ;AACR,UAAI,OAAO,WAAW,YAAa;AACnC,UAAI,CAAC,OAAO,WAAW,oBAAoB,EAAE,QAAS;AAEtD,YAAM,YAAY,gBAAgB;AAClC,YAAM,OAAO,UAAU;AACvB,UAAI,SAAS;AACb,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,cAAM,KAAK,KAAK,CAAC;AACjB,YAAI,CAAC,GAAI;AACT,YAAI,GAAG,sBAAsB,EAAE,OAAO,UAAW,UAAS;AAAA,MAC9D;AACA,YAAM,aAAa,KAAK;AAAA,QACpB,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,MACb;AACA;AAAA,QAAe,CAAC,SACZ,SAAS,aAAa,OAAO;AAAA,MACjC;AAAA,IACJ;AAEA,UAAM,WAAW,MAAM;AACnB,UAAI,UAAU,EAAG;AACjB,cAAQ,OAAO,sBAAsB,IAAI;AAAA,IAC7C;AAEA,SAAK;AACL,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,UAAM,KAAK,OAAO,WAAW,oBAAoB;AACjD,OAAG,iBAAiB,UAAU,QAAQ;AAEtC,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,SAAG,oBAAoB,UAAU,QAAQ;AACzC,UAAI,UAAU,EAAG,QAAO,qBAAqB,KAAK;AAAA,IACtD;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAkBjB,EAAAC,WAAU,MAAM;AACZ,QAAI,MAAM,WAAW,EAAG;AACxB,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,SAAS,oBAAI,IAAoB;AACvC,UAAM,WAAW,IAAI;AAAA,MACjB,CAAC,YAAY;AACT,YAAI,OAAO,WAAW,oBAAoB,EAAE,QAAS;AAErD,mBAAW,SAAS,SAAS;AACzB,gBAAM,MAAM,OAAO,MAAM,OAAO,aAAa,oBAAoB,CAAC;AAClE,cAAI,CAAC,OAAO,SAAS,GAAG,EAAG;AAC3B,iBAAO,IAAI,KAAK,MAAM,iBAAiB,MAAM,oBAAoB,CAAC;AAAA,QACtE;AAEA,YAAI,OAAO;AACX,YAAI,YAAY;AAChB,mBAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AAC/B,cAAI,QAAQ,WAAW;AACnB,wBAAY;AACZ,mBAAO;AAAA,UACX;AAAA,QACJ;AACA,YAAI,aAAa,EAAG;AACpB,6BAAqB,CAAC,SAAU,SAAS,OAAO,OAAO,IAAK;AAAA,MAChE;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAW,CAAC,GAAG,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,MAC1C;AAAA,IACJ;AAEA,eAAW,MAAM,eAAe,SAAS;AACrC,UAAI,GAAI,UAAS,QAAQ,EAAE;AAAA,IAC/B;AACA,WAAO,MAAM,SAAS,WAAW;AAAA,EACrC,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,QAAM,YAAY;AAAA,IACd;AAAA,IACA,OAAO,OAAO;AAAA,IACd;AAAA,EACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,MAAI,MAAM,WAAW,GAAG;AACpB,WACI,gBAAAL,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAA,MAAC,SAAI,WAAU,aACX,0BAAAA,MAAC,QAAG,WAAU,cAAc,kBAAO,GACvC,GACJ;AAAA,EAER;AAEA,SACI,gBAAAA,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAC,OAAC,SAAI,WAAU,aAGX;AAAA,oBAAAD,MAAC,QAAG,WAAU,cAAc,kBAAO;AAAA,IAMnC,gBAAAC,OAAC,SAAI,WAAU,cAKX;AAAA,sBAAAD,MAAC,SAAI,WAAU,iBAAgB,eAAY,QACvC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,WAAU;AAAA,UAEV,0BAAAA,MAAC,SAAI,WAAU,kBACV,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,WAAW;AAAA,gBACP;AAAA,gBACA,MAAM,cACA,2BACA;AAAA,cACV,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cAEb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG;AAAA,kBACA,QAAQ,MAAM;AAAA,kBACd,YAAY;AAAA,kBACZ,WAAW;AAAA;AAAA,cACf;AAAA;AAAA,YAfK;AAAA,UAgBT,CACH,GACL;AAAA;AAAA,MACJ,GACJ;AAAA,MAGA,gBAAAA,MAAC,SAAI,WAAU,mBACV,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEG,WAAU;AAAA,UAEV;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,KAAK,CAAC,OAAO;AACT,4BAAU,QAAQ,CAAC,IAAI;AAAA,gBAC3B;AAAA,gBACA,WAAU;AAAA,gBAET,eAAK;AAAA;AAAA,YACV;AAAA,YACA,gBAAAA,MAAC,OAAE,WAAU,iBACR,eAAK,aACV;AAAA,YACA,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,MAAM,KAAK;AAAA,gBACX,WAAU;AAAA,gBAEV;AAAA,kCAAAD,MAAC,UAAM,eAAK,WAAU;AAAA,kBACtB,gBAAAA,MAACE,eAAA,EAAa;AAAA;AAAA;AAAA,YAClB;AAAA;AAAA;AAAA,QApBK;AAAA,MAqBT,CACH,GACL;AAAA,OACJ;AAAA,IAMA,gBAAAF,MAAC,SAAI,WAAU,mBACV,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEG,WAAU;AAAA,QACV,sBAAoB;AAAA,QACpB,KAAK,CAAC,OAAO;AACT,yBAAe,QAAQ,CAAC,IAAI;AAAA,QAChC;AAAA,QAEA;AAAA,0BAAAD,MAAC,QAAG,WAAU,kBACT,eAAK,OACV;AAAA,UACA,gBAAAA,MAAC,SAAI,WAAU,oBACX,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG;AAAA,cACA,QAAQ,MAAM;AAAA,cACd,YAAY;AAAA,cACZ,WAAW;AAAA;AAAA,UACf,GACJ;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,iBACR,eAAK,aACV;AAAA,UACA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACG,MAAM,KAAK;AAAA,cACX,WAAU;AAAA,cAEV;AAAA,gCAAAD,MAAC,UAAM,eAAK,WAAU;AAAA,gBACtB,gBAAAA,MAACE,eAAA,EAAa;AAAA;AAAA;AAAA,UAClB;AAAA;AAAA;AAAA,MA3BK;AAAA,IA4BT,CACH,GACL;AAAA,KAEJ,GACJ;AAER;;;AGpZoB,SACI,OAAAI,OADJ,QAAAC,cAAA;AAtBb,IAAM,eAAe,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AACpB,MAAyB;AACrB,SACI,gBAAAD,MAAC,aAAQ,WAAU,iBACf,0BAAAA,MAAC,SAAI,WAAU,4BACX,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,kBAAkB,SAAS,qCAAqC;AAAA,MACpE,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MAEb;AAAA,wBAAAA,OAAC,SAAI,WAAU,0BACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,wBAAwB,iBAAM;AAAA,UAE3C,mBAAmB,eAChB,gBAAAA,MAAC,OAAE,WAAU,8BAA8B,uBAAY;AAAA,UAG1D,YACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,SAAS;AAAA;AAAA,UACb;AAAA,WAER;AAAA,QAEC,SACG,gBAAAA,MAAC,SAAI,WAAU,gCACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,WAAU;AAAA,YACV,KAAK;AAAA;AAAA,QACT,GACJ;AAAA;AAAA;AAAA,EAER,GACJ,GACJ;AAER;;;ACvDA,SAAS,aAAAE,YAAW,UAAAC,gBAAc;AAgIlB,gBAAAC,OAiCY,QAAAC,cAjCZ;AAzHhB,IAAM,oBACF;AAEG,IAAM,aAA+B;AAAA,EACxC;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,EACX;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,EACX;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,IACV,OAAO;AAAA,EACX;AACJ;AAaA,IAAM,YAAoC,EAAE,GAAG,MAAM,GAAG,KAAK;AAItD,IAAM,qBAAqB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAA+B;AAC3B,QAAM,WAAWC,SAAkC,CAAC,CAAC;AAarD,EAAAC,WAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,QAAQ;AAEZ,UAAM,SAAS,MAAM;AACjB,YAAM,QAAQ,SAAS,QAAQ,OAAO,OAAO;AAC7C,YAAM,IAAI,MAAM;AAEhB,YAAM,QAAQ,CAAC,MAAM,MAAM;AACvB,cAAM,WAAW,UAAU,CAAC;AAC5B,YAAI,aAAa,QAAW;AAExB,eAAK,MAAM,YAAY,gBAAgB,GAAG;AAC1C;AAAA,QACJ;AAEA,cAAM,WAAW,MAAM,IAAI,CAAC;AAC5B,YAAI,CAAC,SAAU;AAEf,cAAM,WAAW,KAAK,sBAAsB;AAC5C,cAAM,WAAW,SAAS,sBAAsB;AAUhD,cAAM,aAAa,SAAS;AAC5B,cAAM,MAAM,SAAS,MAAM,SAAS;AACpC,cAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,MAAM,UAAU,CAAC;AAE9D,cAAM,QAAQ,KAAK,IAAI,YAAY;AACnC,aAAK,MAAM,YAAY,gBAAgB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;AAAA,MACpE,CAAC;AAAA,IACL;AAEA,UAAM,WAAW,MAAM;AACnB,2BAAqB,KAAK;AAC1B,cAAQ,sBAAsB,MAAM;AAAA,IACxC;AAEA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAE7D,WAAO;AAEP,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,2BAAqB,KAAK;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,SACI,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACrD,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,cAGX;AAAA,wBAAAD,MAAC,QAAG,WAAU,eAAe,kBAAO;AAAA,QAOpC,gBAAAA,MAAC,SAAI,WAAU,cACV,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEG,KAAK,CAAC,OAAO;AAAE,uBAAS,QAAQ,CAAC,IAAI;AAAA,YAAI;AAAA,YACzC,WAAW;AAAA,cACP;AAAA,cACA,cAAc,KAAK,SAAS,OAAO;AAAA,YACvC,EAAE,KAAK,GAAG;AAAA,YACV,OAAO;AAAA,cACH,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAYZ,KAAK,gCAAgC,CAAC;AAAA,YAC1C;AAAA,YAGA;AAAA,8BAAAA,OAAC,SAAI,WAAU,qBACX;AAAA,gCAAAD,MAAC,QAAG,WAAU,mBAAmB,eAAK,OAAM;AAAA,gBAC5C,gBAAAA,MAAC,OAAE,WAAU,kBAAkB,eAAK,aAAY;AAAA,iBACpD;AAAA,cAGA,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK;AAAA,kBACV,SAAS,MAAM,IAAI,UAAU;AAAA;AAAA,cACjC,GACJ;AAAA;AAAA;AAAA,UAnCK;AAAA,QAoCT,CACH,GACL;AAAA,SAEJ;AAAA;AAAA,EACJ;AAER;;;ACrLA,SAAS,UAAAI,gBAAc;AACvB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEG;AAyWK,gBAAAC,OAqDQ,QAAAC,cArDR;AApVZ,IAAM,WAAW;AAAA,EACb,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,WAAW;AACf;AAQA,IAAM,SAAS,EAAE,WAAW,IAAI,SAAS,IAAI,WAAW,KAAM;AAQ9D,IAAM,UAAU;AAoBhB,IAAM,kBACF;AAEG,IAAM,cAA4B;AAAA;AAAA,EAErC;AAAA,IACI,IAAI;AAAA,IAAI,aAAa;AAAA,IAAG,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW,EAAE,MAAM,2CAA2C,KAAK,kCAAkC;AAAA,IACrG,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAI,aAAa;AAAA,IAAG,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAC/D,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW,EAAE,OAAO,KAAK,KAAK,kCAAkC;AAAA,IAChE,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW,EAAE,MAAM,2CAA2C,KAAK,kCAAkC;AAAA,IACrG,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAI,aAAa;AAAA,IAAG,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAChE,WAAW,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAC/D,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,oCAAoC,KAAK,kCAAkC;AAAA,IAC/F,WAAW,EAAE,OAAO,KAAK,KAAK,kCAAkC;AAAA,IAChE,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAChE,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,oCAAoC,KAAK,kCAAkC;AAAA,IAC/F,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAI,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAChE,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAI,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,oCAAoC,KAAK,kCAAkC;AAAA,IAC/F,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AACJ;AAQO,IAAM,sBAAoC;AAAA;AAAA,EAE7C;AAAA,IACI,IAAI;AAAA,IAAI,aAAa;AAAA,IAAG,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,2CAA2C,KAAK,kCAAkC;AAAA,IACtG,WAAW,EAAE,MAAM,2CAA2C,KAAK,kCAAkC;AAAA,IACrG,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAC/D,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,oCAAoC,KAAK,kCAAkC;AAAA,IAC/F,WAAW,EAAE,OAAO,KAAK,KAAK,kCAAkC;AAAA,IAChE,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAChE,WAAW,EAAE,MAAM,KAAK,KAAK,kCAAkC;AAAA,IAC/D,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,oCAAoC,KAAK,kCAAkC;AAAA,IAC/F,WAAW,EAAE,OAAO,KAAK,KAAK,kCAAkC;AAAA,IAChE,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAG,aAAa;AAAA,IAAG,UAAU;AAAA,IACjC,YAAY,EAAE,MAAM,mCAAmC,KAAK,kCAAkC;AAAA,IAC9F,WAAW,EAAE,MAAM,2CAA2C,KAAK,kCAAkC;AAAA,IACrG,eAAe;AAAA,EACnB;AAAA;AAAA,EAEA;AAAA,IACI,IAAI;AAAA,IAAI,aAAa;AAAA,IAAG,UAAU;AAAA,IAClC,YAAY,EAAE,MAAM,oCAAoC,KAAK,kCAAkC;AAAA,IAC/F,WAAW;AAAA,IACX,eAAe;AAAA,EACnB;AACJ;AA6BA,SAAS,iBAAiB,QAAoD;AAC1E,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,QAAM,MAAM,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,QAAM,MAAM,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,SAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAC5D;AAEA,SAAS,iBAAiB,QAAoD;AAC1E,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC;AAChE,QAAM,MAAM,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;AAClE,QAAM,MAAM,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,SAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAC5D;AAYA,SAAS,wBAAwB,QAAoD;AACjF,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC;AACjE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,SAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AACtC;AAEA,SAAS,wBAAwB,QAAoD;AACjF,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;AAChE,QAAM,KAAK,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC;AAC/D,SAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AACtC;AAIO,IAAM,YAAY,CAAC;AAAA,EACtB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACP,MAAsB;AAClB,QAAM,kBAAkB,YAAY,YAAY,YAAY,sBAAsB;AAClF,QAAM,aAAaC,SAAoB,IAAI;AAO3C,QAAM,EAAE,gBAAgB,IAAI,UAAU;AAAA,IAClC,QAAQ;AAAA,IACR,QAAQ,CAAC,aAAa,WAAW;AAAA,EACrC,CAAC;AAED,QAAM,SAAS,UAAU,iBAAiB,MAAM;AAGhD,QAAM,cAAc,aAAa,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AAGzD,QAAM,QAAQ,aAAa,QAAQ,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;AACxD,QAAM,cAAc,aAAa,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AAGzD,QAAM,gBAAgB,aAAa,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAM5D,QAAM,SAAS,aAAa,QAAQ,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,SAAS,WAAW,GAAG,GAAG,SAAS,SAAS,CAAC;AACpG,QAAM,eAAe,yBAAyB,MAAM;AAGpD,QAAM,kBAAkB,iBAAiB,MAAM;AAC/C,QAAM,kBAAkB,iBAAiB,MAAM;AAC/C,QAAM,iBAAiB,wBAAwB,MAAM;AACrD,QAAM,iBAAiB,wBAAwB,MAAM;AAErD,QAAM,gBAAgB,YAAY,YAAY,iBAAiB;AAC/D,QAAM,gBAAgB,YAAY,YAAY,iBAAiB;AAE/D,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,QAAQ,YAAY,YAAY,kBAAkB,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpG,GAAG;AAAA,MAGJ;AAAA,wBAAAD;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACG,WAAU;AAAA,YACV,OAAO,EAAE,SAAS,YAAY;AAAA,YAC9B,eAAY;AAAA;AAAA,QAChB;AAAA,QAGA,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAC,OAAC,SAAI,WAAU,eAUV;AAAA,0BAAgB,IAAI,CAAC,QAAQ,UAAU;AACpC,kBAAM,WAAmC,CAAC;AAC1C,gBAAI,OAAO,WAAW,KAAM,UAAS,aAAa,IAAI,OAAO,WAAW;AACxE,gBAAI,OAAO,WAAW,MAAO,UAAS,cAAc,IAAI,OAAO,WAAW;AAC1E,gBAAI,OAAO,WAAW,IAAK,UAAS,YAAY,IAAI,OAAO,WAAW;AACtE,gBAAI,OAAO,WAAW,KAAM,UAAS,aAAa,IAAI,OAAO,UAAU;AACvE,gBAAI,OAAO,WAAW,MAAO,UAAS,cAAc,IAAI,OAAO,UAAU;AACzE,gBAAI,OAAO,WAAW,IAAK,UAAS,YAAY,IAAI,OAAO,UAAU;AAErE,mBACI,gBAAAD;AAAA,cAAC,OAAO;AAAA,cAAP;AAAA,gBAEG,WAAW;AAAA,kBACP;AAAA,kBACA,CAAC,OAAO,gBAAgB,+BAA+B;AAAA,gBAC3D,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBAC1B,OAAO;AAAA,kBACH,GAAI;AAAA,kBACJ,GAAG,cAAc,KAAK;AAAA,kBACtB,GAAG,cAAc,KAAK;AAAA,kBACtB,SAAS;AAAA,kBACT,QAAQ;AAAA,gBACZ;AAAA,gBAEA,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,KAAK,OAAO;AAAA,oBACZ,KAAI;AAAA,oBACJ,SAAQ;AAAA,oBACR,WAAW;AAAA;AAAA,gBACf;AAAA;AAAA,cAlBK,OAAO;AAAA,YAmBhB;AAAA,UAER,CAAC;AAAA,UAGD,gBAAAC;AAAA,YAAC,OAAO;AAAA,YAAP;AAAA,cACG,WAAU;AAAA,cACV,OAAO,EAAE,GAAG,OAAO,SAAS,YAAY;AAAA,cAExC;AAAA,gCAAAD,MAAC,QAAG,WAAU,kBAAkB,oBAAS;AAAA,gBACzC,gBAAAA,MAAC,OAAE,MAAM,SACL,0BAAAA,MAAC,UAAO,aAAY,SAAQ,SAAQ,WAAU,OAAO,UAAU,GACnE;AAAA;AAAA;AAAA,UACJ;AAAA,WAEJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACpbA,SAAS,UAAAG,UAAQ,YAAAC,YAAU,aAAAC,aAAW,eAAAC,oBAAmB;AACzD,SAAS,UAAAC,SAAQ,uBAAuB;;;ACKjC,SAAS,wBACZ,WACA,cACiD;AACjD,MACI,OAAO,iBAAiB,YACxB,OAAO,SAAS,YAAY,KAC5B,gBAAgB,GAClB;AACE,UAAM,OAAO,KAAK,MAAM,YAAY;AACpC,WAAO;AAAA,MACH,eAAe;AAAA,MACf,eAAe,KAAK,KAAK,YAAY,IAAI;AAAA,IAC7C;AAAA,EACJ;AACA,SAAO,EAAE,eAAe,KAAK,KAAK,YAAY,CAAC,EAAE;AACrD;A;;;;;ADgBQ,gBAAAC,OA+GgC,QAAAC,cA/GhC;AA5BR,IAAM,gBAAgB,CAAC,MAAM,GAAG,KAAK,CAAC;AAEtC,IAAM,mBAAmB;AAAA,EACrB,QAAQ,EAAE,SAAS,GAAG,OAAO,MAAM,GAAG,GAAG;AAAA,EACzC,SAAS,EAAE,SAAS,GAAG,OAAO,GAAG,GAAG,EAAE;AAC1C;AAEA,IAAM,iBAAiB;AAAA,EACnB,QAAQ,EAAE,GAAG,QAAQ;AAAA,EACrB,SAAS,EAAE,GAAG,EAAE;AACpB;AAEA,IAAM,oBAAoB;AAAA,EACtB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE;AAAA,EAChC,SAAS,EAAE,QAAQ,QAAQ,SAAS,EAAE;AAC1C;AAIA,IAAMC,mBAAkB,CAAC,EAAE,UAAU,MACjC,gBAAAF;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAGJ,IAAM,iBAAiB,MACnB,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACpE,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACnB,GACJ;AAGJ,IAAM,mBAAmB,MACrB,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACpE,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACnB,GACJ;AAGJ,IAAM,WAAW,MACb,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACpE,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA;AAClB,GACJ;AAGJ,IAAMG,aAAY,MACd,gBAAAH,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACpE,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA;AAClB,GACJ;AAGJ,IAAM,kBAAkB,CAAC,EAAE,UAAU,MACjC,gBAAAA;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACnB;AAAA;AACJ;AAGJ,IAAM,YAAY,CAAC,EAAE,UAAU,MAC3B,gBAAAA,MAAC,SAAI,KAAK,oBAAY,KAAI,IAAG,eAAY,QAAO,OAAM,MAAK,QAAO,MAAK,WAAsB;AAWjG,IAAM,gBAAgB,CAAC,EAAE,MAAM,cAAc,aAAa,MAA0B;AAChF,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,CAAC,SAAU,QAAO;AAEtB,SACI,gBAAAA;AAAA,IAACI,QAAO;AAAA,IAAP;AAAA,MACG,WAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,YAAY,EAAE,UAAU,MAAM,MAAM,cAAc;AAAA,MAClD;AAAA,MACA;AAAA,MAEA,0BAAAH,OAAC,SAAI,WAAU,0BAEX;AAAA,wBAAAD,MAAC,SAAI,WAAU,yBACV,mBAAS,QAAQ,IAAI,CAAC,KAAK,WACxB,gBAAAA,MAAC,SAAiB,WAAU,wBACvB,cAAI,SAAS,IAAI,CAAC,YACf,gBAAAC,OAAC,SAAwB,WAAU,6BAC/B;AAAA,0BAAAD,MAAC,OAAE,WAAU,8BAA8B,kBAAQ,OAAM;AAAA,UACxD,QAAQ,MAAM,IAAI,CAAC,SAChB,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEG,MAAM,KAAK;AAAA,cACX,WAAU;AAAA,cACV,QAAQ,KAAK,WAAW,WAAW;AAAA,cACnC,KAAK,KAAK,WAAW,wBAAwB;AAAA,cAE5C;AAAA,qBAAK;AAAA,gBACL,KAAK,WAAW,gBAAAD,MAAC,oBAAiB,IAAK,gBAAAA,MAAC,kBAAe;AAAA;AAAA;AAAA,YAPnD,KAAK;AAAA,UAQd,CACH;AAAA,aAbK,QAAQ,KAclB,CACH,KAjBK,MAkBV,CACH,GACL;AAAA,QAGC,SAAS,WACN,gBAAAA,MAAC,SAAI,WAAU,0BACX,0BAAAA,MAAC,eAAY,SAAS,SAAS,SAAS,GAC5C;AAAA,SAER;AAAA;AAAA,EACJ;AAER;AASA,IAAM,cAAc,CAAC,EAAE,SAAS,OAAO,MACnC,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACG,WAAW,SAAS,2BAA2B;AAAA,IAC/C,OACI,QAAQ,qBACF,EAAE,iBAAiB,OAAO,QAAQ,kBAAkB,IAAI,IACxD;AAAA,IAGT;AAAA,cAAQ,sBACL,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,QAAQ;AAAA,UACb,KAAI;AAAA,UACJ,WAAW,SAAS,+BAA+B;AAAA,UACnD,eAAY;AAAA;AAAA,MAChB;AAAA,MAEJ,gBAAAA,MAAC,SAAI,WAAW,SAAS,mCAAmC,oCAAoC,eAAY,QAAO;AAAA,MACnH,gBAAAC,OAAC,SAAI,WAAW,SAAS,mCAAmC,oCACxD;AAAA,wBAAAA,OAAC,SACG;AAAA,0BAAAD,MAAC,OAAE,WAAW,SAAS,iCAAiC,kCACnD,kBAAQ,OACb;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAW,SAAS,gCAAgC,iCAClD,kBAAQ,aACb;AAAA,WACJ;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,MAAM,QAAQ;AAAA,YACd,WAAW,SAAS,+BAA+B;AAAA,YAElD;AAAA,sBAAQ;AAAA,cACT,gBAAAD,MAAC,kBAAe;AAAA;AAAA;AAAA,QACpB;AAAA,SACJ;AAAA;AAAA;AACJ;AAWJ,IAAM,kBAAkB,CAAC,EAAE,MAAM,QAAQ,SAAS,MAA4B;AAC1E,QAAM,EAAE,SAAS,IAAI;AAErB,SACI,gBAAAC,OAAC,SAAI,WAAU,uBACX;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW,0BAA0B,SAAS,iCAAiC,EAAE;AAAA,QACjF,SAAS;AAAA,QACT,iBAAe;AAAA,QAEd;AAAA,eAAK;AAAA,UACN,gBAAAD,MAACE,kBAAA,EAAgB,WAAU,mCAAkC;AAAA;AAAA;AAAA,IACjE;AAAA,IAEA,gBAAAF,MAAC,mBAAgB,SAAS,OACrB,oBAAU,YACP,gBAAAA;AAAA,MAACI,QAAO;AAAA,MAAP;AAAA,QACG,WAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,YAAY,EAAE,UAAU,MAAM,MAAM,cAAc;AAAA,QAElD,0BAAAH,OAAC,SAAI,WAAU,8BAEX;AAAA,0BAAAD,MAAC,SAAI,WAAU,6BACV,mBAAS,QAAQ,IAAI,CAAC,KAAK,WACxB,gBAAAA,MAAC,SAAiB,WAAU,4BACvB,cAAI,SAAS,IAAI,CAAC,YACf,gBAAAC,OAAC,SAAwB,WAAU,8BAC/B;AAAA,4BAAAD,MAAC,OAAE,WAAU,4BAA4B,kBAAQ,OAAM;AAAA,YACvD,gBAAAA,MAAC,SAAI,WAAU,4BACV,kBAAQ,MAAM,IAAI,CAAC,SAChB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,MAAM,KAAK;AAAA,gBACX,WAAU;AAAA,gBACV,QAAQ,KAAK,WAAW,WAAW;AAAA,gBACnC,KAAK,KAAK,WAAW,wBAAwB;AAAA,gBAE5C,eAAK;AAAA;AAAA,cAND,KAAK;AAAA,YAOd,CACH,GACL;AAAA,eAdM,QAAQ,KAelB,CACH,KAlBK,MAmBV,CACH,GACL;AAAA,UAGC,SAAS,WACN,gBAAAA,MAAC,eAAY,SAAS,SAAS,SAAS,QAAM,MAAC;AAAA,WAEvD;AAAA;AAAA,IACJ,GAER;AAAA,KACJ;AAER;AAIO,IAAM,SAAS,CAAC;AAAA,EACnB,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW,CAAC;AAAA,EACZ,aAAa;AAAA,EACb;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAmB;AACf,QAAM,CAAC,cAAc,eAAe,IAAIK,WAAwB,IAAI;AACpE,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAClD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAwB,IAAI;AACxE,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,KAAK;AAC9D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,KAAK;AAE1D,QAAM,kBAAkBC,SAA6C,IAAI;AACzE,QAAM,sBAAsBA,SAA6C,IAAI;AAC7E,QAAM,cAAcA,SAAuB,IAAI;AAC/C,QAAM,aAAaA,SAA0B,IAAI;AAEjD,QAAM,kBAAkB,QAAQ,iBAAiB,cAAc,SAAS,CAAC;AAEzE,QAAM,eAAe,UAAU,UAAW,eAAe,UAAW;AAOpE,EAAAC,YAAU,MAAM;AACZ,QAAI,QAAQ,IAAI,aAAa,gBAAgB,CAAC,aAAa;AACvD,cAAQ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAEJ,GAAG,CAAC,WAAW,CAAC;AAGhB,EAAAA,YAAU,MAAM;AACZ,UAAM,WAAW,MAAM,YAAY,OAAO,UAAU,CAAC;AACrD,aAAS;AACT,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,EAC9D,GAAG,CAAC,CAAC;AAKL,EAAAA,YAAU,MAAM;AACZ,UAAM,KAAK,OAAO,WAAW,oBAAoB;AACjD,UAAM,WAAW,MAAM,aAAa,GAAG,OAAO;AAC9C,aAAS;AACT,OAAG,iBAAiB,UAAU,QAAQ;AACtC,WAAO,MAAM,GAAG,oBAAoB,UAAU,QAAQ;AAAA,EAC1D,GAAG,CAAC,CAAC;AAGL,EAAAA,YAAU,MAAM;AACZ,UAAM,QAAQ,CAAC,MAAqB;AAChC,UAAI,EAAE,QAAQ,UAAU;AACpB,wBAAgB,IAAI;AACpB,sBAAc,KAAK;AACnB,0BAAkB,KAAK;AAAA,MAC3B;AAAA,IACJ;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM,SAAS,oBAAoB,WAAW,KAAK;AAAA,EAC9D,GAAG,CAAC,CAAC;AAGL,EAAAA,YAAU,MAAM;AACZ,QAAI,CAAC,WAAY,mBAAkB,KAAK;AAAA,EAC5C,GAAG,CAAC,UAAU,CAAC;AAGf,EAAAA,YAAU,MAAM;AACZ,aAAS,KAAK,MAAM,WAAW,aAAa,WAAW;AACvD,WAAO,MAAM;AAAE,eAAS,KAAK,MAAM,WAAW;AAAA,IAAI;AAAA,EACtD,GAAG,CAAC,UAAU,CAAC;AAGf,EAAAA,YAAU,MAAM;AACZ,QAAI,CAAC,aAAc;AACnB,UAAM,gBAAgB,CAAC,MAAoB;AACvC,UAAI,YAAY,WAAW,CAAC,YAAY,QAAQ,SAAS,EAAE,MAAc,GAAG;AACxE,wBAAgB,IAAI;AAAA,MACxB;AAAA,IACJ;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,WAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,EAC1E,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,oBAAoBC,aAAY,MAAM;AACxC,QAAI,gBAAgB,SAAS;AACzB,mBAAa,gBAAgB,OAAO;AACpC,sBAAgB,UAAU;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,CAAC;AAGL,QAAM,wBAAwBA,aAAY,MAAM;AAC5C,QAAI,oBAAoB,SAAS;AAC7B,mBAAa,oBAAoB,OAAO;AACxC,0BAAoB,UAAU;AAAA,IAClC;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBA,aAAY,MAAM;AACtC,0BAAsB;AACtB,wBAAoB,IAAI;AAAA,EAC5B,GAAG,CAAC,qBAAqB,CAAC;AAE1B,QAAM,kBAAkBA,aAAY,MAAM;AACtC,0BAAsB;AACtB,wBAAoB,UAAU,WAAW,MAAM,oBAAoB,KAAK,GAAG,GAAG;AAAA,EAClF,GAAG,CAAC,qBAAqB,CAAC;AAE1B,QAAM,mBAAmBA,aAAY,CAAC,SAAiB;AACnD,wBAAoB,KAAK;AACzB,sBAAkB,KAAK;AACvB,uBAAmB,IAAI;AAAA,EAC3B,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,iBAAiBA,aAAY,CAAC,UAAkB;AAClD,sBAAkB;AAClB,oBAAgB,KAAK;AAAA,EACzB,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,iBAAiBA,aAAY,MAAM;AACrC,sBAAkB;AAClB,oBAAgB,UAAU,WAAW,MAAM,gBAAgB,IAAI,GAAG,GAAG;AAAA,EACzE,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,qBAAqB,SAAS,KAAK,CAAC,SAAS,KAAK,UAAU,YAAY;AAK9E,QAAM,gBAAgB,CAAC;AACvB,QAAM,iBAAiB,YAAY;AAGnC,SACI,gBAAAP;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,UAAU,WAAW,KAAK,IAAI,YAAY,oBAAoB,cAAc,qBAAqB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC/I,GAAG;AAAA,MAEJ;AAAA,wBAAAA,OAAC,SAAI,WAAU,eAGX;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACG,MAAM;AAAA,cACN,WAAU;AAAA,cACV,cAAW;AAAA,cACX,OAAO,kBAAkB;AAAA,cAEzB,0BAAAA,MAAC,SAAI,KAAK,cAAc,KAAI,QAAO;AAAA;AAAA,UACvC;AAAA,UAGA,gBAAAA,MAAC,SAAI,WAAU,sBAAqB,KAAK,aACrC,0BAAAC,OAAC,SAAI,WAAU,gBAGX;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,MAAM;AAAA,gBACN,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,OAAO,iBAAiB;AAAA,gBAExB,0BAAAA,MAAC,SAAI,KAAK,eAAe,SAAS,KAAI,QAAO;AAAA;AAAA,YACjD;AAAA,YAGA,gBAAAC,OAAC,SAAI,WAAU,qBACV;AAAA,uBAAS,IAAI,CAAC,SAAS;AACpB,oBAAI,KAAK,UAAU;AACf,yBACI,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEG,MAAM,KAAK;AAAA,sBACX,WAAU;AAAA,sBACV,QAAO;AAAA,sBACP,KAAI;AAAA,sBAEH;AAAA,6BAAK;AAAA,wBACN,gBAAAD,MAAC,oBAAiB;AAAA;AAAA;AAAA,oBAPb,KAAK;AAAA,kBAQd;AAAA,gBAER;AAEA,oBAAI,KAAK,UAAU;AACf,yBACI,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBAEG,WAAW;AAAA,wBACP;AAAA,wBACA,iBAAiB,KAAK,QAAQ,2BAA2B;AAAA,sBAC7D,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,sBAC1B,cAAc,MAAM,eAAe,KAAK,KAAK;AAAA,sBAC7C,cAAc;AAAA,sBACd,iBAAe,iBAAiB,KAAK;AAAA,sBACrC,iBAAc;AAAA,sBAEb;AAAA,6BAAK;AAAA,wBACN,gBAAAD,MAACE,kBAAA,EAAgB,WAAU,6BAA4B;AAAA;AAAA;AAAA,oBAXlD,KAAK;AAAA,kBAYd;AAAA,gBAER;AAEA,uBACI,gBAAAF,MAAC,OAAmB,MAAM,KAAK,MAAM,WAAU,oBAC1C,eAAK,SADF,KAAK,KAEb;AAAA,cAER,CAAC;AAAA,cAGA,iBACG,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,cAAc,kBAAkB,kBAAkB;AAAA,kBAClD,cAAc,kBAAkB,kBAAkB;AAAA,kBAElD,0BAAAC;AAAA,oBAAC;AAAA;AAAA,sBACG,KAAK;AAAA,sBACL,WAAW;AAAA,wBACP;AAAA,wBACA;AAAA,wBACA,mBAAmB,mBAAmB,2BAA2B;AAAA,sBACrE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,sBAC1B,SAAS,kBAAkB,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI;AAAA,sBAClE,iBAAe,kBAAkB,SAAS;AAAA,sBAC1C,iBAAe,kBAAkB,mBAAmB;AAAA,sBAEpD;AAAA,wCAAAD,MAAC,aAAU,WAAU,sBAAqB;AAAA,wBACzC;AAAA;AAAA;AAAA,kBACL;AAAA;AAAA,cACJ;AAAA,eAER;AAAA,YAGA,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,OAAO,iBAAiB;AAAA,gBAEvB;AAAA,+BACG,gBAAAD,MAAC,OAAE,MAAM,WACL,0BAAAA,MAAC,UAAO,aAAY,SAAQ,SAAQ,aAAY,OAAO,YAAY,GACvE;AAAA,kBAEH,WACG,gBAAAA,MAAC,OAAE,MAAM,SACL,0BAAAA,MAAC,UAAO,aAAY,SAAQ,SAAQ,WAAU,OAAO,UAAU,GACnE;AAAA;AAAA;AAAA,YAER;AAAA,aACJ,GACJ;AAAA,UAKA,gBAAAA,MAAC,mBACI,0BAAgB,oBAAoB,YACjC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,MAAM;AAAA,cACN,cAAc;AAAA,cACd,cAAc;AAAA;AAAA,YAHV;AAAA,UAIR,GAER;AAAA,UAIA,gBAAAA,MAAC,mBACI,6BAAmB,oBAChB,gBAAAA;AAAA,YAACI,QAAO;AAAA,YAAP;AAAA,cACG,WAAU;AAAA,cACV,UAAU;AAAA,cACV,SAAQ;AAAA,cACR,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,YAAY,EAAE,UAAU,MAAM,MAAM,cAAc;AAAA,cAClD,cAAc;AAAA,cACd,cAAc;AAAA,cAEd,0BAAAJ;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,OACI;AAAA,oBACI,cAAe;AAAA,oBACf;AAAA,kBACJ;AAAA,kBAGH,wBAAe,IAAI,CAAC,SACjB,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEG,WAAW;AAAA,wBACP;AAAA,wBACA,KAAK,SAAS,qBACR,uCACA;AAAA,sBACV,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,sBAC1B,SAAS,MAAM,iBAAiB,KAAK,IAAI;AAAA,sBAExC,eAAK;AAAA;AAAA,oBATD,KAAK;AAAA,kBAUd,CACH;AAAA;AAAA,cACL;AAAA;AAAA,UACJ,GAER;AAAA,UAGA,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,OAAO,kBAAkB;AAAA,cAExB;AAAA,6BACG,gBAAAD,MAAC,OAAE,MAAM,WAAW,WAAU,yBAC1B,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,aAAa,UAAU,SAAS,UAAU;AAAA,oBAC1C,SAAQ;AAAA,oBACR,OAAO;AAAA;AAAA,gBACX,GACJ;AAAA,gBAEH,WACG,gBAAAA,MAAC,OAAE,MAAM,SACL,0BAAAA,MAAC,UAAO,aAAY,SAAQ,SAAQ,WAAU,OAAO,UAAU,GACnE;AAAA;AAAA;AAAA,UAER;AAAA,UAGA,gBAAAC,OAAC,SAAI,WAAU,0BACV;AAAA,yBACG,gBAAAD,MAAC,OAAE,MAAM,WACL,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,aAAa,YAAY,UAAU,UAAU,UAAU;AAAA,gBACvD,SAAQ;AAAA,gBACR,OAAO;AAAA;AAAA,YACX,GACJ;AAAA,YAEJ,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,SAAS,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;AAAA,gBACtC,cAAY,aAAa,0BAA0B;AAAA,gBAElD,uBAAa,gBAAAA,MAACG,YAAA,EAAU,IAAK,gBAAAH,MAAC,YAAS;AAAA;AAAA,YAC5C;AAAA,aACJ;AAAA,WAEJ;AAAA,QAKA,gBAAAA,MAAC,SAAI,WAAU,uBACX,0BAAAA,MAAC,mBACI,wBACG,gBAAAC;AAAA,UAACG,QAAO;AAAA,UAAP;AAAA,YACG,WAAU;AAAA,YACV,UAAU;AAAA,YACV,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,YAAY,EAAE,UAAU,KAAK,MAAM,cAAc;AAAA,YACjD,cAAW;AAAA,YACX,MAAK;AAAA,YACL,cAAW;AAAA,YAGX;AAAA,8BAAAH,OAAC,SAAI,WAAU,sBACV;AAAA,yBAAS,IAAI,CAAC,SAAS;AACpB,sBAAI,KAAK,UAAU;AACf,2BACI,gBAAAD;AAAA,sBAAC;AAAA;AAAA,wBAEG;AAAA,wBACA,QAAQ,mBAAmB,KAAK;AAAA,wBAChC,UAAU,MACN;AAAA,0BAAkB,CAAC,SACf,SAAS,KAAK,QAAQ,OAAO,KAAK;AAAA,wBACtC;AAAA;AAAA,sBANC,KAAK;AAAA,oBAQd;AAAA,kBAER;AAEA,yBACI,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBAEG,MAAM,KAAK;AAAA,sBACX,WAAU;AAAA,sBACV,QAAQ,KAAK,WAAW,WAAW;AAAA,sBACnC,KAAK,KAAK,WAAW,wBAAwB;AAAA,sBAE5C;AAAA,6BAAK;AAAA,wBACL,KAAK,YAAY,gBAAAD,MAAC,oBAAiB;AAAA;AAAA;AAAA,oBAP/B,KAAK;AAAA,kBAQd;AAAA,gBAER,CAAC;AAAA,gBAGA,iBAAiB,CAAC,mBACf,gBAAAC,OAAC,YAAO,WAAU,uBAAsB,SAAS,iBAC7C;AAAA,kCAAAD,MAAC,aAAU,WAAU,sBAAqB;AAAA,kBACzC;AAAA,mBACL;AAAA,gBAGH,iBAAiB,mBACd,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACG,WAAU;AAAA,oBACV,SAAS,MAAM,kBAAkB,IAAI;AAAA,oBAErC;AAAA,sCAAAD,MAAC,aAAU,WAAU,sBAAqB;AAAA,sBACzC;AAAA;AAAA;AAAA,gBACL;AAAA,iBAER;AAAA,cAGC,CAAC,kBACE,gBAAAC,OAAC,SAAI,WAAU,yBACV;AAAA,6BACG,gBAAAD,MAAC,OAAE,MAAM,WAAW,OAAO,EAAE,SAAS,QAAQ,GAC1C,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,aAAY;AAAA,oBACZ,SAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,WAAS;AAAA;AAAA,gBACb,GACJ;AAAA,gBAEH,WACG,gBAAAA,MAAC,OAAE,MAAM,SAAS,OAAO,EAAE,SAAS,QAAQ,GACxC,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,aAAY;AAAA,oBACZ,SAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,WAAS;AAAA;AAAA,gBACb,GACJ;AAAA,iBAER;AAAA,cAIJ,gBAAAA,MAAC,mBACI,6BAAmB,kBAChB,gBAAAC;AAAA,gBAACG,QAAO;AAAA,gBAAP;AAAA,kBACG,WAAU;AAAA,kBACV,SAAS,EAAE,GAAG,OAAO;AAAA,kBACrB,SAAS,EAAE,GAAG,EAAE;AAAA,kBAChB,MAAM,EAAE,GAAG,OAAO;AAAA,kBAClB,YAAY,EAAE,UAAU,MAAM,MAAM,cAAc;AAAA,kBAElD;AAAA,oCAAAJ;AAAA,sBAAC;AAAA;AAAA,wBACG,WAAU;AAAA,wBACV,SAAS,MAAM,kBAAkB,KAAK;AAAA,wBACtC,cAAW;AAAA,wBAEX,0BAAAA,MAAC,mBAAgB;AAAA;AAAA,oBACrB;AAAA,oBAEA,gBAAAA,MAAC,SAAI,WAAU,4BACV,wBAAe,IAAI,CAAC,SACjB,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEG,WAAW;AAAA,0BACP;AAAA,0BACA,KAAK,SAAS,qBACR,qCACA;AAAA,wBACV,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,wBAC1B,SAAS,MAAM,iBAAiB,KAAK,IAAI;AAAA,wBAExC,eAAK;AAAA;AAAA,sBATD,KAAK;AAAA,oBAUd,CACH,GACL;AAAA;AAAA;AAAA,cACJ,GAER;AAAA;AAAA;AAAA,QACJ,GAER,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AEtyBA,SAAS,aAAAS,aAAW,mBAAAC,kBAAiB,UAAAC,UAAQ,YAAAC,kBAAgB;AAC7D;AAAA,EACI,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,qBAAAC;AAAA,OACG;;;ACEP,IAAM,cAAc,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG;AAG1C,IAAM,YAAY,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG;AAExC,IAAM,MAAM,CAAC,GAAW,GAAW,MAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAEnE,IAAM,OAAO,CAAC,GAAW,GAAW,MAAc,KAAK,IAAI,KAAK;AAGhE,IAAM,MAAM,CAAC,GAAW,IAAY,IAAY,IAAY,OAAe;AACvE,MAAI,KAAK,GAAI,QAAO;AACpB,MAAI,KAAK,GAAI,QAAO;AACpB,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,GAAG;AAC5C;AAEO,SAAS,0BAA0B,GAAW,OAAuC;AACxF,MAAI,UAAU,WAAW;AACrB,UAAMC,QAAO,IAAI,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACtD,UAAMC,QAAO,IAAI,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAC5D,UAAMC,SAAQ,IAAI,KAAK,KAAK,GAAG;AAE/B,QAAI,IAAI,KAAM,QAAOF;AACrB,QAAI,IAAI,IAAK,QAAOC;AACpB,WAAOC;AAAA,EACX;AAEA,QAAM,QAAQ,IAAI,KAAK,KAAK,GAAG;AAC/B,QAAM,OAAO,IAAI,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAC5D,QAAM,OAAO,IAAI,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACtD,MAAI,IAAI,KAAM,QAAO;AACrB,MAAI,IAAI,KAAM,QAAO;AACrB,SAAO;AACX;AAGO,SAAS,oBAAoB,GAAW,OAAuC;AAClF,MAAI,UAAU,WAAW;AACrB,UAAMF,QAAO,IAAI,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AACtD,UAAM,QAAQ,IAAI,GAAG,GAAG,CAAC;AACzB,UAAME,SAAQ,IAAI,KAAK,KAAK,GAAG;AAE/B,QAAI,IAAI,KAAM,QAAOF;AACrB,QAAI,KAAK,KAAM,QAAOE;AACtB,WAAO,IAAI,GAAG,MAAM,MAAM,OAAOA,MAAK;AAAA,EAC1C;AACA,QAAM,OAAO,IAAI,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAC5D,QAAM,QAAQ,IAAI,KAAK,KAAK,GAAG;AAC/B,QAAM,OAAO,IAAI,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtD,MAAI,IAAI,IAAK,QAAO;AACpB,MAAI,KAAK,KAAM,QAAO;AACtB,QAAM,KAAK,IAAI,OAAO;AACtB,SAAO;AAAA,IACH,KAAK,YAAY,GAAG,KAAK,CAAC;AAAA,IAC1B,KAAK,YAAY,GAAG,KAAK,CAAC;AAAA,IAC1B,KAAK,YAAY,GAAG,KAAK,CAAC;AAAA,EAC9B;AACJ;AAEO,SAAS,wBAAwB,GAAW,OAAuC;AACtF,MAAI,UAAU,WAAW;AACrB,QAAI,IAAI,KAAM,QAAO;AACrB,QAAI,KAAK,KAAM,QAAO;AACtB,WAAO,IAAI,GAAG,MAAM,MAAM,GAAG,CAAC;AAAA,EAClC;AACA,MAAI,IAAI,IAAK,QAAO;AACpB,MAAI,KAAK,KAAM,QAAO;AACtB,SAAO,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC;AACjC;AAEO,SAAS,0BAA0B,GAAW,OAAuC;AACxF,MAAI,UAAU,WAAW;AACrB,QAAI,IAAI,KAAM,QAAO;AACrB,QAAI,KAAK,KAAM,QAAO;AACtB,WAAO,IAAI,GAAG,MAAM,MAAM,GAAG,CAAC;AAAA,EAClC;AACA,MAAI,IAAI,IAAK,QAAO;AACpB,MAAI,KAAK,KAAM,QAAO;AACtB,SAAO,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC;AACjC;AAGO,IAAM,iCAAiC;AAOvC,SAAS,wBAAwB,GAAW,OAAuC;AACtF,MAAI,UAAU,UAAW,QAAO;AAChC,SAAO,IAAI,GAAG,GAAG,gCAAgC,KAAK,CAAC;AAC3D;;;AD4GgB,SAuBI,YAAAC,WAjBA,OAAAC,OANJ,QAAAC,cAAA;AA9LhB,IAAMC,UAAS,EAAE,WAAW,IAAI,SAAS,IAAI,WAAW,KAAM;AAE9D,IAAM,aAAa;AACnB,IAAM,WAAa;AAGnB,IAAM,yCAAyC;AAC/C,IAAM,uCAAuC;AAG7C,IAAM,wCAAwC;AAC9C,IAAM,sCAAsC;AAE5C,IAAM,mBAAqB;AAC3B,IAAM,qBAAqB;AAG3B,IAAMC,OAAM,CAAC,GAAW,IAAY,IAAY,IAAY,OAAe;AACvE,MAAI,KAAK,GAAI,QAAO;AACpB,MAAI,KAAK,GAAI,QAAO;AACpB,SAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK;AAC9C;AAIO,IAAM,qBAAqB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,cAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,WAAgB;AAAA,EAChB,UAAgB;AAAA,EAChB,UAAmB;AAAA,EACnB,gBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB;AAAA,EACA,eAAmB;AAAA,EACnB;AAAA,EACA,GAAG;AACP,MAA+B;AAC3B,QAAM,aAAaC,SAAuB,IAAI;AAC9C,QAAM,aAAaA,SAAwB,IAAI;AAE/C,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,WAAS,KAAK;AAC9D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAS,KAAK;AAE1D,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAiC,SAAS;AAExE,QAAM,YAAY,iBAAiB;AAEnC,EAAAC,YAAU,MAAM;AACZ,UAAM,KAAK,OAAO,WAAW,oBAAoB;AACjD,UAAM,OAAO,MAAM,WAAW,GAAG,UAAU,WAAW,SAAS;AAC/D,SAAK;AACL,OAAG,iBAAiB,UAAU,IAAI;AAClC,WAAO,MAAM,GAAG,oBAAoB,UAAU,IAAI;AAAA,EACtD,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,kBAAkB,OAAOC,QAAO,KAAKA,QAAO;AAEnE,EAAAC,iBAAgB,MAAM;AAClB,QAAI,CAAC,uBAAwB;AAE7B,UAAM,gBAAgB,MAAM;AACxB,YAAM,QAAQ,WAAW;AACzB,UAAI,CAAC,MAAO;AACZ,YAAM,IAAI,MAAM;AAChB,YAAM,MAAM,SAAS;AACrB,YAAM,MACF,IAAI,aAAa,KAAK,MAAM,SAC5B,IAAI,KAAK,YAAY,EAAE,WAAW,IAAI;AAC1C,UAAI,KAAK;AACL,4BAAoB,KAAK;AACzB,0BAAkB,IAAI,IAAI,CAAC,OAAO,KAAK;AAAA,MAC3C,OAAO;AACH,4BAAoB,IAAI,IAAI,CAAC,OAAO,KAAK;AACzC,0BAAkB,KAAK;AAAA,MAC3B;AAAA,IACJ;AAEA,kBAAc;AACd,UAAM,KAAK,IAAI,eAAe,aAAa;AAC3C,QAAI,WAAW,QAAS,IAAG,QAAQ,WAAW,OAAO;AACrD,WAAO,iBAAiB,UAAU,aAAa;AAC/C,WAAO,MAAM;AACT,SAAG,WAAW;AACd,aAAO,oBAAoB,UAAU,aAAa;AAAA,IACtD;AAAA,EACJ,GAAG;AAAA,IACC;AAAA,IACA,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,EAC5B,CAAC;AAED,QAAM,EAAE,gBAAgB,IAAIC,WAAU;AAAA,IAClC,QAAS;AAAA,IACT,QAAS,CAAC,aAAa,WAAW;AAAA,EACtC,CAAC;AAGD,QAAM,SAASC,WAAU,iBAAiBR,OAAM;AAChD,QAAM,WAAW,YAAY,kBAAkB;AAE/C,QAAM,eAAeS,cAAa,UAAU,CAAC,YAAY,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1E,QAAM,UAAYA,cAAa,UAAU,CAAC,YAAY,QAAQ,GAAG,CAAC,kBAAkB,kBAAkB,CAAC;AACvG,QAAM,YAAYC,yBAAwB,OAAO,KAAK,OAAO,KAAK,OAAO;AAOzE,QAAM,aAAaD,cAAa,UAAU,CAAC,MAAM;AAC7C,QAAI,WAAW;AACX,aAAO,YAAY,WACbR;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,IACAA;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACV;AACA,WAAOA,KAAI,GAAG,YAAY,UAAU,GAAG,CAAC;AAAA,EAC5C,CAAC;AACD,QAAM,gBAAgBQ,cAAa,UAAU,CAAC,MAAM;AAChD,QAAI,WAAW;AACX,aAAO,YAAY,WACbR;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,IACAA;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACV;AACA,WAAOA,KAAI,GAAG,YAAY,UAAU,GAAG,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,cAAcQ,cAAa,UAAU,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AACvF,QAAM,eAAeA,cAAa,UAAU,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAClF,QAAM,cAAcA,cAAa,UAAU,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AACrF,QAAM,gBAAgBA,cAAa,UAAU,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAKzF,QAAM,cAAcA;AAAA,IAAa;AAAA,IAAU,CAAC,MACxC,YAAY,WACN,GAAG,wBAAwB,GAAG,OAAO,CAAC,MACtC;AAAA,EACV;AAEA,QAAM,iBAAiB,QAAQ,kBAAkB,gBAAgB;AAEjE,QAAM,oBAAoB,QAAQ,sBAAsB;AAExD,QAAM,YAAY;AAAA,IACd;AAAA,IACA,kBAAkB,QAAQ;AAAA,IAC1B,qBAAqB,aAAa;AAAA,IAClC;AAAA,EACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,SACI,gBAAAV;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,qBACG,gBAAAA,OAAC,SAAI,WAAU,8BAA6B,eAAY,QAMpD;AAAA,0BAAAD;AAAA,YAACO,QAAO;AAAA,YAAP;AAAA,cACG,WAAU;AAAA,cACV,OAAO;AAAA,gBACH,iBAAiB,OAAO,WAAW;AAAA,gBACnC,QAAiB;AAAA,cACrB;AAAA;AAAA,UACJ;AAAA,UACA,gBAAAP;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,OAAO,EAAE,iBAAiB,OAAO,aAAa,IAAI;AAAA;AAAA,UACtD;AAAA,WACJ;AAAA,QAGJ,gBAAAC,OAAC,SAAI,WAAW,YAAY,wCAAwC,eAE/D;AAAA,WAAC,aACE,gBAAAA,OAAAF,WAAA,EACI;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,KAAK;AAAA,gBACL,KAAI;AAAA,gBACJ,SAAQ;AAAA,gBACR,WAAW;AAAA;AAAA,YACf;AAAA,YACA,gBAAAA;AAAA,cAACO,QAAO;AAAA,cAAP;AAAA,gBACG,WAAU;AAAA,gBACV,KAAK;AAAA,gBACL,KAAI;AAAA,gBACJ,SAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,OAAO,EAAE,SAAS,aAAa;AAAA;AAAA,YACnC;AAAA,aACJ;AAAA,UAGJ,gBAAAP,MAAC,SAAI,WAAU,gBACX,0BAAAA,MAAC,SAAI,WAAU,cACV,sBACG,gBAAAC,OAAC,SAAI,WAAU,kBACV;AAAA,iCAAqB,yBAClB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,aAAa;AAAA,gBAC7B,cAAY,GAAG,uBAAuB,MAAM,GAAG,uBAAuB,OAAO,MAAM,uBAAuB,MAAM,GAAG,uBAAuB,SAAS;AAAA,gBAEnJ;AAAA,kCAAAD,MAAC,UAAK,WAAU,wBACX,iCAAuB,QAC5B;AAAA,kBACA,gBAAAC,OAAC,UAAK,WAAU,sBACZ;AAAA,oCAAAD;AAAA,sBAACO,QAAO;AAAA,sBAAP;AAAA,wBACG,KAAK;AAAA,wBACL,WAAU;AAAA,wBACV,OAAO,EAAE,SAAS,YAAY;AAAA,wBAE7B,iCAAuB;AAAA;AAAA,oBAC5B;AAAA,oBACA,gBAAAP;AAAA,sBAACO,QAAO;AAAA,sBAAP;AAAA,wBACG,WAAU;AAAA,wBACV,OAAO;AAAA,0BACH,SAAmB;AAAA,0BACnB,mBAAmB;AAAA,0BACnB,iBAAmB;AAAA,wBACvB;AAAA,wBAEC,iCAAuB;AAAA;AAAA,oBAC5B;AAAA,qBACJ;AAAA;AAAA;AAAA,YACJ,IAEA,gBAAAN,OAAC,SAAI,WAAU,uBACX;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,OAAO,EAAE,OAAO,cAAc,SAAS,WAAW;AAAA,kBAEjD;AAAA;AAAA,cACL;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,eAAY;AAAA,kBACZ,OAAO,EAAE,OAAO,cAAc,SAAS,cAAc;AAAA,kBAEpD;AAAA;AAAA,cACL;AAAA,eACJ;AAAA,YAGH,kBACG,gBAAAC,OAAC,SAAI,WAAU,uBACX;AAAA,8BAAAD;AAAA,gBAACO,QAAO;AAAA,gBAAP;AAAA,kBACG,WAAU;AAAA,kBACV,OAAO;AAAA,oBACH,OAAS;AAAA,oBACT,SAAS;AAAA,kBACb;AAAA,kBAEC,4BAAkB;AAAA;AAAA,cACvB;AAAA,cACA,gBAAAP;AAAA,gBAACO,QAAO;AAAA,gBAAP;AAAA,kBACG,WAAU;AAAA,kBACV,eAAY;AAAA,kBACZ,OAAO;AAAA,oBACH,OAAS;AAAA,oBACT,SAAS;AAAA,kBACb;AAAA,kBAEC,8BAAoB;AAAA;AAAA,cACzB;AAAA,eACJ;AAAA,YAGH,CAAC,WACE,gBAAAP,MAAC,OAAE,MAAM,SAAS,WAAU,YACvB,oBACL;AAAA,aAER,IAEA,gBAAAC;AAAA,YAACM,QAAO;AAAA,YAAP;AAAA,cACG,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,UAAU;AAAA,cAEzB;AAAA,qCAAqB,yBAClB,gBAAAN;AAAA,kBAAC;AAAA;AAAA,oBACG,WAAU;AAAA,oBACV,cAAY,GAAG,uBAAuB,MAAM,GAAG,uBAAuB,OAAO,MAAM,uBAAuB,MAAM,GAAG,uBAAuB,SAAS;AAAA,oBAEnJ;AAAA,sCAAAD,MAAC,UAAK,WAAU,wBACX,iCAAuB,QAC5B;AAAA,sBACA,gBAAAC,OAAC,UAAK,WAAU,sBACZ;AAAA,wCAAAD;AAAA,0BAACO,QAAO;AAAA,0BAAP;AAAA,4BACG,KAAK;AAAA,4BACL,WAAU;AAAA,4BACV,OAAO,EAAE,SAAS,WAAW;AAAA,4BAE5B,iCAAuB;AAAA;AAAA,wBAC5B;AAAA,wBACA,gBAAAP;AAAA,0BAACO,QAAO;AAAA,0BAAP;AAAA,4BACG,WAAU;AAAA,4BACV,OAAO;AAAA,8BACH,SAAY;AAAA,8BACZ,mBAAmB;AAAA,8BACnB,iBAAmB;AAAA,4BACvB;AAAA,4BAEC,iCAAuB;AAAA;AAAA,wBAC5B;AAAA,yBACJ;AAAA;AAAA;AAAA,gBACJ,IAEA,gBAAAN,OAAC,SAAI,WAAU,uBACX;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAU;AAAA,sBACV,OAAO,EAAE,SAAS,WAAW;AAAA,sBAE5B;AAAA;AAAA,kBACL;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAU;AAAA,sBACV,eAAY;AAAA,sBACZ,OAAO,EAAE,SAAS,cAAc;AAAA,sBAE/B;AAAA;AAAA,kBACL;AAAA,mBACJ;AAAA,gBAGH,kBACG,gBAAAC,OAAC,SAAI,WAAU,uBACX;AAAA,kCAAAD;AAAA,oBAACO,QAAO;AAAA,oBAAP;AAAA,sBACG,WAAU;AAAA,sBACV,OAAO,EAAE,SAAS,WAAW;AAAA,sBAE5B,4BAAkB;AAAA;AAAA,kBACvB;AAAA,kBACA,gBAAAP;AAAA,oBAACO,QAAO;AAAA,oBAAP;AAAA,sBACG,WAAU;AAAA,sBACV,eAAY;AAAA,sBACZ,OAAO,EAAE,SAAS,cAAc;AAAA,sBAE/B,8BAAoB;AAAA;AAAA,kBACzB;AAAA,mBACJ;AAAA,gBAGH,CAAC,WACE,gBAAAP,MAAC,OAAE,MAAM,SAAS,WAAU,YACvB,oBACL;AAAA;AAAA;AAAA,UAER,GAER,GACJ;AAAA,WAEJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AEvZO,IAAM,6BAYT;AAAA,EACA,WAAc;AAAA,EACd,cAAc;AAAA,EACd,aACI;AAAA,EACJ,eACI;AAAA,EACJ,aAAkB;AAAA,EAClB,eAAkB;AAAA,EAClB,gBACI;AAAA,EACJ,kBACI;AAAA,EACJ,UAAU;AAAA,EACV,SAAU;AACd;;;ACnCA,SAAS,UAAAa,gBAAc;AACvB;AAAA,EACI,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAuJa,SAGI,OAAAC,OAHJ,QAAAC,cAAA;AA1IpB,SAAS,QAAQ,KAAa,KAAa,GAAmB;AAC1D,QAAM,QAAQ,MAAM;AACpB,WAAW,IAAI,OAAO,QAAS,SAAS,QAAS;AACrD;AASA,IAAM,kBAAkB;AACxB,IAAM,eAAe;AACrB,IAAM,WAAW;AAIjB,IAAMC,qBACF;AAIG,IAAM,gBAA4B;AAAA,EACrC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,WAAW,KAAKA,mBAAkB;AAAA,EAC1C,EAAE,MAAM,WAAW,KAAKA,mBAAkB;AAC9C;AAEO,IAAM,gBAA4B;AAAA,EACrC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,UAAU,KAAKA,mBAAkB;AAAA,EACzC,EAAE,MAAM,WAAW,KAAKA,mBAAkB;AAAA,EAC1C,EAAE,MAAM,WAAW,KAAKA,mBAAkB;AAC9C;AAEO,IAAM,eAAe;AAAA,EACxB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AACb;AAIO,IAAM,cAAc,CAAC;AAAA,EACxB,WAAW,aAAa;AAAA,EACxB,OAAO,aAAa;AAAA,EACpB,aAAa,aAAa;AAAA,EAC1B,WAAW,aAAa;AAAA,EACxB,UAAU,aAAa;AAAA,EACvB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACP,MAAwB;AAOpB,QAAM,EAAE,QAAQ,IAAIC,WAAU;AAC9B,QAAM,iBAAiB,YAAY,OAAO;AAM1C,QAAM,QAAQ,eAAe,CAAC;AAC9B,QAAM,QAAQ,eAAe,CAAC;AAI9B,QAAM,UAAUC,SAAuB,IAAI;AAC3C,QAAM,UAAUA,SAAuB,IAAI;AAe3C,oBAAkB,CAAC,GAAG,UAAU;AAC5B,UAAM,MAAM,eAAe,IAAI;AAG/B,QAAI,KAAK,IAAI,GAAG,IAAI,SAAU;AAE9B,UAAM,UAAU,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,YAAY;AACrE,UAAM,OAAO,UAAU,mBAAmB,QAAQ;AAGlD,UAAM,WAAW,QAAQ,SAAS,gBAAgB,OAAQ;AAC1D,UAAM,WAAW,QAAQ,SAAS,gBAAgB,OAAQ;AAE1D,UAAM,IAAI,QAAQ,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC;AAClD,UAAM,IAAI,QAAQ,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC;AAAA,EACtD,CAAC;AAKD,QAAM,SAAS,CAAC,GAAG,WAAW,GAAG,SAAS;AAC1C,QAAM,SAAS,CAAC,GAAG,WAAW,GAAG,SAAS;AAE1C,SACI,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpD,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,aAGX;AAAA,wBAAAD,MAAC,SAAI,WAAU,aACX,0BAAAC,OAAC,SAAI,WAAU,gBAGX;AAAA,0BAAAD,MAAC,SAAI,WAAU,0BAAyB,eAAY,QAAO;AAAA,UAG3D,gBAAAA;AAAA,YAACK,QAAO;AAAA,YAAP;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO,EAAE,GAAG,MAAM;AAAA,cAEjB,iBAAO,IAAI,CAAC,MAAM,MACf,gBAAAL,MAAC,SAAoB,WAAU,YAC3B,0BAAAA,MAAC,SAAI,WAAU,qBACX,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK;AAAA,kBACV,SAAQ;AAAA,kBACR,WAAW;AAAA;AAAA,cACf,GACJ,KARM,MAAM,CAAC,EASjB,CACH;AAAA;AAAA,UACL;AAAA,UAGA,gBAAAA;AAAA,YAACK,QAAO;AAAA,YAAP;AAAA,cACG,KAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO,EAAE,GAAG,MAAM;AAAA,cAEjB,iBAAO,IAAI,CAAC,MAAM,MACf,gBAAAL,MAAC,SAAoB,WAAU,YAC3B,0BAAAA,MAAC,SAAI,WAAU,qBACX,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK;AAAA,kBACV,SAAQ;AAAA,kBACR,WAAW;AAAA;AAAA,cACf,GACJ,KARM,MAAM,CAAC,EASjB,CACH;AAAA;AAAA,UACL;AAAA,UAGA,gBAAAA,MAAC,SAAI,WAAU,6BAA4B,eAAY,QAAO;AAAA,WAElE,GACJ;AAAA,QAGA,gBAAAC,OAAC,SAAI,WAAU,eACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,gBAAgB,oBAAS;AAAA,UAEvC,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,4BAAAD,MAAC,OAAE,WAAU,YAAY,gBAAK;AAAA,YAC9B,gBAAAA,MAAC,OAAE,WAAU,kBAAkB,sBAAW;AAAA,aAC9C;AAAA,UAEA,gBAAAC,OAAC,OAAE,MAAM,SAAS,WAAU,YACvB;AAAA;AAAA,YACD,gBAAAD,MAAC,UAAK,WAAU,iBAAgB,eAAY,QACxC,0BAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAC9D,0BAAAA,MAAC,UAAK,GAAE,8BAA6B,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAC9H,GACJ;AAAA,aACJ;AAAA,WACJ;AAAA,SAEJ;AAAA;AAAA,EACJ;AAER;A;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjKY,gBAAAM,aAAA;AA/CZ,IAAM,eAAe;AAAA,EACjB,OAAO;AAAA,IACH,YAAY,EAAE,KAAK,mCAAiB,KAAK,wBAAwB;AAAA,IACjE,UAAU,EAAE,KAAK,iCAAe,KAAK,4BAA4B;AAAA,IACjE,YAAY,EAAE,KAAK,mCAAiB,KAAK,2BAA2B;AAAA,IACpE,SAAS,EAAE,KAAK,gCAAc,KAAK,uBAAuB;AAAA,IAC1D,OAAO,EAAE,KAAK,8BAAY,KAAK,gCAAgC;AAAA,IAC/D,OAAO,EAAE,KAAK,8BAAY,KAAK,wBAAwB;AAAA,IACvD,KAAK,EAAE,KAAK,gCAAc,KAAK,uBAAuB;AAAA,EAC1D;AAAA,EACA,MAAM;AAAA,IACF,YAAY,EAAE,KAAK,kCAAgB,KAAK,wBAAwB;AAAA,IAChE,UAAU,EAAE,KAAK,gCAAc,KAAK,4BAA4B;AAAA,IAChE,YAAY,EAAE,KAAK,kCAAgB,KAAK,2BAA2B;AAAA,IACnE,SAAS,EAAE,KAAK,+BAAa,KAAK,uBAAuB;AAAA,IACzD,OAAO,EAAE,KAAK,6BAAW,KAAK,gCAAgC;AAAA,IAC9D,OAAO,EAAE,KAAK,6BAAW,KAAK,wBAAwB;AAAA,IACtD,KAAK,EAAE,KAAK,+BAAa,KAAK,uBAAuB;AAAA,EACzD;AACJ;AAIO,IAAM,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAA0B;AACtB,QAAM,EAAE,KAAK,IAAI,IAAI,aAAa,WAAW,EAAE,QAAQ;AAEvD,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,mBAAmB,WAAW;AAAA,QAC9B;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,cAAY;AAAA,MACZ,QAAO;AAAA,MACP,KAAI;AAAA,MACH,GAAG;AAAA,MAEJ,0BAAAA,MAAC,SAAI,WAAU,uBAAsB,KAAU,KAAU;AAAA;AAAA,EAC7D;AAER;;;AC1CwB,gBAAAC,OAoBY,QAAAC,cApBZ;AA5BjB,IAAM,QAAQ,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX;AACJ,MAAkB;AACd,QAAM,iBAAiB;AAAA,IACnB;AAAA,IACA,kBAAkB,UAAU,kCAAkC;AAAA,EAClE,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AACb,QAAM,eAAe,CAAC,SAAS,WAAW,oBAAoB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAK1F,QAAM,UAA6B,WAAW,QAAQ;AAEtD,SACI,gBAAAD,MAAC,WAAQ,WAAW,cAChB,0BAAAC,OAAC,SAAI,WAAW,gBAEX;AAAA,aACG,gBAAAD,MAAC,SAAI,WAAU,wBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,KAAK;AAAA,QACL,WAAU;AAAA;AAAA,IACd,GACJ;AAAA,IAIJ,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,gBAAe,IAAI,SAAU,iBAAM;AAAA,MAEjD,gBAAAA,MAAC,QAAG,WAAU,eACT,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAA,MAAC,QAAe,WAAU,eACtB,0BAAAC,OAAC,SAAI,WAAU,qBACX;AAAA,wBAAAD,MAAC,UAAK,WAAU,iBAAgB,eAAY,QACvC,kBAAQ,GACb;AAAA,QAEA,gBAAAC,OAAC,SAAI,WAAU,oBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,qBACT,eAAK,OACV;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,2BACR,eAAK,aACV;AAAA,WACJ;AAAA,SACJ,KAdK,KAeT,CACH,GACL;AAAA,OACJ;AAAA,KACJ,GACJ;AAER;;;AC/B4B,gBAAAE,OAMJ,QAAAC,cANI;AAhCrB,IAAM,iBAAiB,CAAC;AAAA,EAC3B,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAA2B;AACvB,QAAM,cAAc,UAAU,SAAS,SAAS;AAEhD,SACI,gBAAAD,MAAC,aAAQ,WAAW,0BAA0B,KAAK,IAC/C,0BAAAA,MAAC,SAAI,WAAU,gBACX,0BAAAC,OAAC,SAAI,WAAU,WAEX;AAAA,oBAAAA,OAAC,SAAI,WAAU,eACV;AAAA,qBACG,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA;AAAA,MACT;AAAA,MAEJ,gBAAAC,OAAC,SAAI,WAAU,cAEX;AAAA,wBAAAD,MAAC,UAAK,WAAU,gDACX,mBACL;AAAA,QACA,gBAAAA,MAAC,QAAG,WAAU,sDACT,sBACL;AAAA,QAEA,gBAAAA,MAAC,UAAK,WAAU,+CACX,uBACL;AAAA,QACC,cACG,gBAAAA,MAAC,UAAK,WAAU,iBAAiB,sBAAW;AAAA,SAEpD;AAAA,OACJ;AAAA,IAGA,gBAAAC,OAAC,SAAI,WAAU,aACV;AAAA,wBACG,gBAAAD,MAAC,iBAAc,UAAS,cAAa,aAA0B,MAAM,gBAAgB;AAAA,MAExF,kBACG,gBAAAA,MAAC,iBAAc,UAAS,cAAa,aAA0B,MAAM,gBAAgB;AAAA,MAExF,aACG,gBAAAA,MAAC,iBAAc,UAAS,SAAQ,aAA0B,MAAM,WAAW;AAAA,MAE9E,eACG,gBAAAA,MAAC,iBAAc,UAAS,WAAU,aAA0B,MAAM,aAAa;AAAA,MAElF,aACG,gBAAAA,MAAC,iBAAc,UAAS,SAAQ,aAA0B,MAAM,WAAW;AAAA,MAE9E,gBACG,gBAAAA,MAAC,iBAAc,UAAS,YAAW,aAA0B,MAAM,cAAc;AAAA,MAEpF,WACG,gBAAAA,MAAC,iBAAc,UAAS,OAAM,aAA0B,MAAM,SAAS;AAAA,OAE/E;AAAA,KACJ,GACJ,GACJ;AAER;;;ACxFA,SAAS,aAAAE,aAAW,UAAAC,gBAAc;AAClC,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAiEd,gBAAAC,OAEQ,QAAAC,cAFR;AA7DhB,KAAK,eAAe,aAAa;AAE1B,IAAM,aAAa,CAAC,EAAE,MAAM,UAAU,MAAuB;AAChE,QAAM,aAAaC,SAAoB,IAAI;AAC3C,QAAM,WAAWA,SAA0B,CAAC,CAAC;AAI7C,QAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,OAAO,OAAO;AAE9C,EAAAC,YAAU,MAAM;AACZ,UAAM,UAAU,WAAW;AAC3B,UAAM,UAAU,SAAS,QAAQ,OAAO,OAAO;AAC/C,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,UAAM,WAAW,OAAO,WAAW,oBAAoB,EAAE;AACzD,UAAM,aAAa,WAAW,YAAY;AAC1C,UAAM,WAAa,WAAW,eAAe;AAK7C,UAAM,QAAQ,sBAAsB,MAAM;AACtC,WAAK,IAAI,SAAS,EAAE,SAAS,IAAI,CAAC;AAElC,YAAM,KAAK,KAAK,SAAS;AAAA,QACrB,eAAe;AAAA,UACX,SAAS;AAAA,UACT,OAAO;AAAA,UACP,KAAK;AAAA,UACL,OAAO;AAAA,QACX;AAAA,MACJ,CAAC;AAED,SAAG,GAAG,SAAS;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,MACV,CAAC;AAGD,MAAC,QAAuD,MAAM;AAAA,IAClE,CAAC;AAED,WAAO,MAAM;AACT,2BAAqB,KAAK;AAC1B,YAAM,KAAM,QAAuD;AACnE,UAAI,IAAI;AACJ,WAAG,eAAe,KAAK;AACvB,WAAG,KAAK;AAAA,MACZ;AACA,WAAK,IAAI,SAAS,EAAE,YAAY,UAAU,CAAC;AAAA,IAC/C;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,SACI,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAErD,0BAAAA,MAAC,SAAI,WAAU,aACX,0BAAAA,MAAC,OAAE,WAAU,YAAW,cAAY,MAC/B,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEG,KAAK,CAAC,OAAO;AACT,gBAAI,GAAI,UAAS,QAAQ,CAAC,IAAI;AAAA,UAClC;AAAA,UACA,WAAU;AAAA,UACV,eAAY;AAAA,UAEX;AAAA;AAAA,YACA,IAAI,MAAM,SAAS,IAAI,MAAM;AAAA;AAAA;AAAA,QARzB;AAAA,MAST,CACH,GACL,GACJ;AAAA;AAAA,EACJ;AAER;;;ACrFA,SAAS,aAAAG,aAAW,UAAAC,gBAAc;AAqIlB,SACI,OAAAC,OADJ,QAAAC,cAAA;AAhIhB,IAAMC,qBACF;AAEG,IAAM,oBAAoB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAA8B;AAE1B,QAAM,WAAWC,SAA+B,CAAC,CAAC;AAElD,QAAM,gBAAgBA,SAA+B,CAAC,CAAC;AAUvD,EAAAC,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,QAAQ;AAEZ,UAAM,SAAS,MAAM;AACjB,YAAM,WAAW,SAAS,QAAQ,OAAO,OAAO;AAChD,YAAM,SAAS,cAAc,QAAQ,OAAO,OAAO;AACnD,YAAMC,KAAI,SAAS;AAEnB,eAAS,QAAQ,CAAC,SAAS,MAAM;AAC7B,cAAM,QAAQ,OAAO,CAAC;AACtB,YAAI,CAAC,MAAO;AAGZ,YAAI,MAAMA,KAAI,GAAG;AACb,gBAAM,MAAM,YAAY;AACxB,gBAAM,MAAM,SAAS;AACrB;AAAA,QACJ;AAEA,cAAM,cAAc,SAAS,IAAI,CAAC;AAClC,YAAI,CAAC,YAAa;AAElB,cAAM,cAAc,QAAQ,sBAAsB;AAClD,cAAM,WAAW,YAAY,sBAAsB;AACnD,cAAM,UAAU,YAAY,SAAS,SAAS;AAE9C,YAAI,UAAU,GAAG;AACb,gBAAM,WAAW,KAAK,IAAI,UAAU,YAAY,QAAQ,CAAC;AACzD,gBAAM,MAAM,YAAY,UAAU,IAAI,WAAW,MAAM,QAAQ,CAAC,CAAC;AACjE,gBAAM,MAAM,SAAS,eAAe,IAAI,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,QACtE,OAAO;AACH,gBAAM,MAAM,YAAY;AACxB,gBAAM,MAAM,SAAS;AAAA,QACzB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,WAAW,MAAM;AACnB,2BAAqB,KAAK;AAC1B,cAAQ,sBAAsB,MAAM;AAAA,IACxC;AAEA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO;AAEP,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,2BAAqB,KAAK;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAGjB,EAAAD,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,cAAc,MAAM;AACtB,YAAM,SAAS,cAAc,QAAQ,OAAO,OAAO;AACnD,UAAI,CAAC,OAAO,OAAQ;AAGpB,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,MAAM,YAAY;AAAA,MAC5B,CAAC;AAGD,UAAI,OAAO;AACX,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,IAAI,MAAM,sBAAsB,EAAE;AACxC,YAAI,IAAI,KAAM,QAAO;AAAA,MACzB,CAAC;AAGD,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,MAAM,YAAY,GAAG,IAAI;AAAA,MACnC,CAAC;AAAA,IACL;AAGA,gBAAY;AAGZ,WAAO,iBAAiB,UAAU,WAAW;AAG7C,QAAI,SAAS,SAAS,SAAS,MAAM,OAAO;AACxC,eAAS,MAAM,MAAM,KAAK,WAAW;AAAA,IACzC;AAEA,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,WAAW;AAAA,IACpD;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,QAAM,IAAI,MAAM;AAChB,QAAM,WAAW;AACjB,QAAM,YAAY,KAAK,IAAI,GAAG,IAAI,QAAQ;AAE1C,SACI,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACrD,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,cACX;AAAA,wBAAAA,OAAC,SAAI,WAAU,oBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,eAAe,wBAAa;AAAA,UACzC,sBACG,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,8BAAmB;AAAA,WAE5D;AAAA,QAEA,gBAAAA,MAAC,SAAI,WAAU,cACV,gBAAM,IAAI,CAAC,MAAM,MAAM;AACpB,gBAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAM,mBAAmB,KAAK,IAAI,GAAG,IAAI,SAAS;AAElD,iBACI,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,KAAK,CAAC,OAAO;AAAE,yBAAS,QAAQ,CAAC,IAAI;AAAA,cAAI;AAAA,cACzC,WAAU;AAAA,cACV,OAAO;AAAA,gBACH,CAAC,kBAA4B,GAAG,OAAO,gBAAgB;AAAA,gBACvD,QAAQ,IAAI;AAAA,cAChB;AAAA,cAEA,0BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,CAAC,OAAO;AAAE,kCAAc,QAAQ,CAAC,IAAI;AAAA,kBAAI;AAAA,kBAC9C,WAAW;AAAA,oBACP;AAAA,oBACA,oBAAoB,KAAK;AAAA,kBAC7B,EAAE,KAAK,GAAG;AAAA,kBAGV;AAAA,oCAAAA,OAAC,SAAI,WAAU,gBACX;AAAA,sCAAAD;AAAA,wBAAC;AAAA;AAAA,0BACG,KAAK,KAAK,YAAYE;AAAA,0BACtB,KAAI;AAAA,0BACJ,eAAY;AAAA,0BACZ,SAAS,MAAM,IAAI,UAAU;AAAA;AAAA,sBACjC;AAAA,sBACA,gBAAAF;AAAA,wBAAC;AAAA;AAAA,0BACG,WAAW;AAAA,4BACP;AAAA,4BACA,sBAAsB,KAAK;AAAA,0BAC/B,EAAE,KAAK,GAAG;AAAA;AAAA,sBACd;AAAA,uBACJ;AAAA,oBAEA,gBAAAC,OAAC,SAAI,WAAU,qBACX;AAAA,sCAAAD,MAAC,SAAI,WAAU,wBACX,0BAAAA,MAAC,QAAG,WAAU,mBAAmB,eAAK,OAAM,GAChD;AAAA,sBACA,gBAAAA,MAAC,SAAI,WAAU,uBACX,0BAAAA,MAAC,OAAE,WAAU,kBAAkB,eAAK,aAAY,GACpD;AAAA,uBACJ;AAAA;AAAA;AAAA,cACJ;AAAA;AAAA,YAvCK;AAAA,UAwCT;AAAA,QAER,CAAC,GACL;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AClMA,SAAS,aAAAM,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AA4BhC,SAEI,YAAAC,WAFJ,OAAAC,OAEI,QAAAC,cAFJ;AApBZ,SAAS,SAAS,OAA+B;AAC7C,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,WAAW,IAAI,EAAG,QAAO;AAC7D,MAAI;AACA,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,IAAI,aAAa,WAAW,QAAQ;AAAA,EAC/C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,cAAc,OAA+B;AAClD,QAAM,OAAO,SAAS,KAAK;AAC3B,MAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAG,QAAO;AACxC,SAAO;AACX;AAEA,SAAS,cAAc,EAAE,QAAQ,GAAyB;AACtD,SACI,gBAAAA,OAAC,SAAI,WAAU,sBAAqB,SAAQ,aAAY,eAAY,QAChE;AAAA,oBAAAD,MAAC,YAAO,WAAU,sBAAqB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC7D,UACG,gBAAAC,OAAAF,WAAA,EACI;AAAA,sBAAAC,MAAC,UAAK,WAAU,uBAAsB,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,MAAK,IAAG,KAAI;AAAA,MACjF,gBAAAA,MAAC,UAAK,WAAU,uBAAsB,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,MAAK,IAAG,KAAI;AAAA,OACrF,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,GAAE;AAAA;AAAA,IACN;AAAA,KAER;AAER;AASA,SAAS,YAAY,EAAE,MAAM,OAAO,SAAS,SAAS,GAAqB;AACvE,QAAM,MAAM,cAAc,KAAK,SAAS;AACxC,QAAM,YAAY,SAAS,KAAK,eAAe;AAC/C,QAAM,YAAY,eAAe,KAAK,IAAI,KAAK,KAAK,GAC/C,QAAQ,mBAAmB,GAAG,EAC9B,MAAM,GAAG,EAAE;AAEhB,SACI,gBAAAC,OAAC,SAAI,WAAU,gBACX;AAAA,oBAAAD,MAAC,SAAI,IAAI,WAAW,WAAU,sBAAqB,eAAY,QAC1D,gBACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,SAAS;AAAA,QACT,MAAI;AAAA,QACJ,WAAU;AAAA,QACV,OAAO,EAAE,YAAY,WAAW,gBAAgB,UAAU;AAAA,QAC1D,QACI,YACI,gBAAAA,MAAC,SAAI,KAAK,WAAW,KAAI,IAAG,SAAQ,QAAO,UAAS,SAAQ,IAC5D;AAAA;AAAA,IAEZ,IACA,MACR;AAAA,IACC,aAAa,CAAC,UACX,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAY;AAAA,QACZ,SAAQ;AAAA,QACR,UAAS;AAAA;AAAA,IACb,IACA;AAAA,IACH,MACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAW,wBAAwB,UAAU,oCAAoC,EAAE;AAAA,QACnF,iBAAe;AAAA,QACf,gBAAc;AAAA,QACd,cAAY,GAAG,UAAU,UAAU,MAAM,IAAI,KAAK,KAAK;AAAA,QACvD,SAAS;AAAA,QAET,0BAAAA,MAAC,iBAAc,SAAkB;AAAA;AAAA,IACrC,IACA;AAAA,KACR;AAER;AAEO,IAAM,0BAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAoC;AAChC,QAAM,WAAWE,SAA+B,CAAC,CAAC;AAClD,QAAM,gBAAgBA,SAA+B,CAAC,CAAC;AACvD,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAkC,CAAC,CAAC;AAElE,EAAAC,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,QAAQ;AAEZ,UAAM,SAAS,MAAM;AACjB,YAAM,WAAW,SAAS,QAAQ,OAAO,OAAO;AAChD,YAAM,SAAS,cAAc,QAAQ,OAAO,OAAO;AACnD,YAAMC,KAAI,SAAS;AAEnB,eAAS,QAAQ,CAAC,SAAS,MAAM;AAC7B,cAAM,QAAQ,OAAO,CAAC;AACtB,YAAI,CAAC,MAAO;AAEZ,YAAI,MAAMA,KAAI,GAAG;AACb,gBAAM,MAAM,YAAY;AACxB,gBAAM,MAAM,SAAS;AACrB;AAAA,QACJ;AAEA,cAAM,cAAc,SAAS,IAAI,CAAC;AAClC,YAAI,CAAC,YAAa;AAElB,cAAM,cAAc,QAAQ,sBAAsB;AAClD,cAAM,WAAW,YAAY,sBAAsB;AACnD,cAAM,UAAU,YAAY,SAAS,SAAS;AAE9C,YAAI,UAAU,GAAG;AACb,gBAAM,WAAW,KAAK,IAAI,UAAU,YAAY,QAAQ,CAAC;AACzD,gBAAM,MAAM,YAAY,UAAU,IAAI,WAAW,MAAM,QAAQ,CAAC,CAAC;AACjE,gBAAM,MAAM,SAAS,eAAe,IAAI,WAAW,KAAK,QAAQ,CAAC,CAAC;AAAA,QACtE,OAAO;AACH,gBAAM,MAAM,YAAY;AACxB,gBAAM,MAAM,SAAS;AAAA,QACzB;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,UAAM,WAAW,MAAM;AACnB,2BAAqB,KAAK;AAC1B,cAAQ,sBAAsB,MAAM;AAAA,IACxC;AAEA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO;AAEP,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,2BAAqB,KAAK;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,EAAAD,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,cAAc,MAAM;AACtB,YAAM,SAAS,cAAc,QAAQ,OAAO,OAAO;AACnD,UAAI,CAAC,OAAO,OAAQ;AAEpB,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,MAAM,YAAY;AAAA,MAC5B,CAAC;AAED,UAAI,OAAO;AACX,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,IAAI,MAAM,sBAAsB,EAAE;AACxC,YAAI,IAAI,KAAM,QAAO;AAAA,MACzB,CAAC;AAED,aAAO,QAAQ,CAAC,UAAU;AACtB,cAAM,MAAM,YAAY,GAAG,IAAI;AAAA,MACnC,CAAC;AAAA,IACL;AAEA,gBAAY;AACZ,WAAO,iBAAiB,UAAU,WAAW;AAE7C,QAAI,SAAS,SAAS,SAAS,MAAM,OAAO;AACxC,eAAS,MAAM,MAAM,KAAK,WAAW;AAAA,IACzC;AAEA,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,WAAW;AAAA,IACpD;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAEjB,QAAM,IAAI,MAAM;AAChB,QAAM,WAAW;AACjB,QAAM,YAAY,KAAK,IAAI,GAAG,IAAI,QAAQ;AAE1C,SACI,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,QAAQ,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACtD,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,eACX;AAAA,wBAAAA,OAAC,SAAI,WAAU,qBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,gBAAgB,wBAAa;AAAA,UAC1C,sBACG,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,8BAAmB;AAAA,WAE7D;AAAA,QAEA,gBAAAA,MAAC,SAAI,WAAU,eACV,gBAAM,IAAI,CAAC,MAAM,MAAM;AACpB,gBAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAM,mBAAmB,KAAK,IAAI,GAAG,IAAI,SAAS;AAElD,iBACI,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,KAAK,CAAC,OAAO;AACT,yBAAS,QAAQ,CAAC,IAAI;AAAA,cAC1B;AAAA,cACA,WAAU;AAAA,cACV,OAAO;AAAA,gBACH,CAAC,mBAA6B,GAAG,OAAO,gBAAgB;AAAA,gBACxD,QAAQ,IAAI;AAAA,cAChB;AAAA,cAEA,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,CAAC,OAAO;AACT,kCAAc,QAAQ,CAAC,IAAI;AAAA,kBAC/B;AAAA,kBACA,WAAW;AAAA,oBACP;AAAA,oBACA,qBAAqB,KAAK;AAAA,kBAC9B,EAAE,KAAK,GAAG;AAAA,kBAEV,0BAAAC,OAAC,SAAI,WAAU,sBACX;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACG;AAAA,wBACA,OAAO;AAAA,wBACP,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,wBAC3B,UAAU,MACN,WAAW,CAAC,UAAU;AAAA,0BAClB,GAAG;AAAA,0BACH,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAAA,wBAChB,EAAE;AAAA;AAAA,oBAEV;AAAA,oBACA,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,sCAAAD,MAAC,QAAG,WAAU,oBAAoB,eAAK,OAAM;AAAA,sBAC7C,gBAAAA,MAAC,OAAE,WAAU,mBAAmB,eAAK,aAAY;AAAA,uBACrD;AAAA,qBACJ;AAAA;AAAA,cACJ;AAAA;AAAA,YApCK;AAAA,UAqCT;AAAA,QAER,CAAC,GACL;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AC3QA,SAAS,YAAAM,YAAU,WAAAC,gBAAe;AAO9B,SA4EsB,YAAAC,WA3ElB,OAAAC,OADJ,QAAAC,cAAA;AADJ,IAAM,WAAW,CAAC,EAAE,UAAU,MAC1B,gBAAAA,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QAAO,WAC3E;AAAA,kBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,OAAM;AAAA,EACvE,gBAAAA,MAAC,UAAK,GAAE,aAAY,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,EAClF,gBAAAA,MAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI,MAAK,gBAAe,QAAO,gBAAe,aAAY,KAAI;AAAA,GAC3F;AAGG,IAAM,QAAQ,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAkB;AACd,QAAM,CAAC,QAAQ,SAAS,IAAIE,WAAS,EAAE;AACvC,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,CAAC;AAClC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE,SAAS,OAAO,SAAS,IAAI,aAAa,IAAI,GAAG,GAAG,GAAG,GAAG,aAAa,EAAE,CAAC;AAEnH,QAAM,UACF,iBACA,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM,GAAG,OACzC,QAAQ,CAAC,GAAG;AAGhB,QAAM,WAAWC,SAAQ,MAAM;AAC3B,UAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,KAAK;AAAA,MAAO,CAAC,QAChB,OAAO,OAAO,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,IAC9D;AAAA,EACJ,GAAG,CAAC,MAAM,MAAM,CAAC;AAGjB,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,SAAS,SAAS,QAAQ,CAAC;AACpE,QAAM,cAAc,KAAK,IAAI,MAAM,UAAU;AAC7C,QAAM,YAAY,cAAc,KAAK;AACrC,QAAM,SAAS,KAAK,IAAI,WAAW,UAAU,SAAS,MAAM;AAC5D,QAAM,UAAU,SAAS,MAAM,UAAU,MAAM;AAE/C,QAAM,eAAe,CAAC,MAA2C;AAC7D,cAAU,EAAE,OAAO,KAAK;AACxB,YAAQ,CAAC;AAAA,EACb;AAEA,QAAM,cAAc,MAAM;AACtB,cAAU,EAAE;AACZ,YAAQ,CAAC;AAAA,EACb;AAEA,SACI,gBAAAF,OAAC,aAAQ,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OACzE;AAAA,oBACG,gBAAAD,MAAC,SAAI,WAAU,uBACX,0BAAAA,MAAC,QAAG,WAAU,sBAAsB,wBAAa,GACrD;AAAA,IAEJ,gBAAAC,OAAC,SAAI,WAAU,wBACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,OAEnB;AAAA,wBAAAA,OAAC,SAAI,WAAU,eACX;AAAA,0BAAAD,MAAC,SAAI,WAAU,oBACX,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,aAAa;AAAA,cACb,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,cACT,SAAQ;AAAA,cACR,cAAY;AAAA;AAAA,UAChB,GACJ;AAAA,UACA,gBAAAA,MAAC,SAAI,WAAU,gBACV,mBAAS,SAAS,IACb,gBAAAC,OAAAF,WAAA,EAAE;AAAA;AAAA,YAAS,WAAW;AAAA,YAAE;AAAA,YAAG;AAAA,YAAO;AAAA,YAAK,SAAS;AAAA,aAAO,IACvD,cAEV;AAAA,WACJ;AAAA,QAGA,gBAAAC,MAAC,SAAI,WAAU,uBACX,0BAAAC,OAAC,WAAM,WAAU,cACb;AAAA,0BAAAD,MAAC,WACG,0BAAAA,MAAC,QAAG,WAAU,WACT,kBAAQ,IAAI,CAAC,KAAK,WAAW;AAC1B,kBAAM,UAAU,WAAW;AAC3B,kBAAM,SAAS,WAAW,QAAQ,SAAS;AAC3C,kBAAM,SAAS,IAAI,UAAU,UAAU,IAAI,QAAQ;AACnD,mBACI,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAW;AAAA,kBACP;AAAA,kBACA,SAAS,kBAAkB;AAAA,kBAC3B,IAAI,UAAU,QAAQ,iBAAiB;AAAA,gBAC3C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBAE1B,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,WAAU;AAAA,oBACV,cAAc,CAAC,MAAM;AACjB,0BAAI,CAAC,IAAI,QAAS;AAClB,4BAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,4BAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,4BAAM,UAAU,KAAK;AAGrB,4BAAM,mBAAmB;AACzB,4BAAM,SAAS;AAGf,4BAAM,WAAW,KAAK;AAAA,wBAClB,SAAS;AAAA,wBACT,KAAK,IAAI,OAAO,aAAa,SAAS,kBAAkB,OAAO;AAAA,sBACnE;AAGA,4BAAM,cAAc,UAAU;AAE9B,iCAAW;AAAA,wBACP,SAAS;AAAA,wBACT,SAAS,IAAI,QAAQ;AAAA,wBACrB,aAAa,IAAI,QAAQ;AAAA,wBACzB,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH;AAAA,sBACJ,CAAC;AAAA,oBACL;AAAA,oBACA,cAAc,MAAM;AAChB,0BAAI,IAAI,SAAS;AACb,mCAAW,WAAS,EAAE,GAAG,MAAM,SAAS,MAAM,EAAE;AAAA,sBACpD;AAAA,oBACJ;AAAA,oBAEA,0BAAAA,MAAC,UAAK,WAAW,CAAC,kBAAkB,IAAI,UAAU,2BAA2B,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACpG,gBAAM,QAAQ,IAAI,MAAM,IACnB,IAAI,OAAO,IAAI,CAAC,MAAM,OACpB,gBAAAC,OAAC,UACI;AAAA;AAAA,sBACA,KAAM,IAAI,OAAoB,SAAS,KAAK,gBAAAD,MAAC,QAAG;AAAA,yBAF1C,EAGX,CACH,IACC,IAAI,QAEd;AAAA;AAAA,gBACJ;AAAA;AAAA,cAtDK,IAAI;AAAA,YAuDb;AAAA,UAER,CAAC,GACL,GACJ;AAAA,UAEA,gBAAAA,MAAC,WAAM,WAAU,cACZ,kBAAQ,SAAS,IACd,QAAQ,IAAI,CAAC,KAAK,WACd,gBAAAA,MAAC,QAAgB,WAAU,WACtB,kBAAQ,IAAI,CAAC,QAAQ;AAClB,kBAAM,SAAS,IAAI,UAAU,UAAU,IAAI,QAAQ;AACnD,kBAAM,UAAU,IAAI,GAAG,IAAI,GAAG,UAAU;AACxC,mBACI,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAW;AAAA,kBACP;AAAA,kBACA,SAAS,kBAAkB;AAAA,kBAC3B,IAAI,UAAU,QAAQ,iBAAiB;AAAA,gBAC3C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBAEzB,mBACG,gBAAAC,OAAC,SAAI,WAAU,mBACV;AAAA,6BACG,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACG,KAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,eAAY;AAAA,sBACZ,WAAU;AAAA,sBACV,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,QAAO;AAAA;AAAA,kBACX;AAAA,kBAEJ,gBAAAA,MAAC,UAAK,WAAU,uCAAuC,cAAI,IAAI,GAAG,KAAK,IAAG;AAAA,mBAC9E,IAEA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,cAAI,IAAI,GAAG,KAAK,IAAG;AAAA;AAAA,cAvBpD,IAAI;AAAA,YAyBb;AAAA,UAER,CAAC,KAjCI,MAkCT,CACH,IAED,gBAAAA,MAAC,QAAG,WAAU,WACV,0BAAAC,OAAC,QAAG,SAAS,QAAQ,QAAQ,WAAU,mBAAkB;AAAA;AAAA,YAC9B;AAAA,YAAO;AAAA,aAClC,GACJ,GAER;AAAA,WACJ,GACJ;AAAA,QAGC,aAAa,KACV,gBAAAD,MAAC,SAAI,WAAU,eACX,0BAAAA,MAAC,SAAI,WAAU,wBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,cAAc;AAAA;AAAA,QAClB,GACJ,GACJ;AAAA,SAEJ;AAAA,MAGC,YACG,gBAAAC,OAAC,SAAI,WAAU,yBACX;AAAA,wBAAAD,MAAC,YAAS,WAAU,0BAAyB;AAAA,QAC7C,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,oBAAS;AAAA,SACpD;AAAA,OAEJ;AAAA,IAGA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACG,WAAW,CAAC,oBAAoB,QAAQ,UAAU,8BAA8B,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC5G,OAAO,EAAE,MAAM,QAAQ,GAAG,KAAK,QAAQ,IAAI,EAAE;AAAA,QAE7C;AAAA,0BAAAD,MAAC,SAAI,WAAU,yBAAyB,kBAAQ,aAAY;AAAA,UAC5D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,OAAO,EAAE,WAAW,0BAA0B,QAAQ,WAAW,OAAO;AAAA;AAAA,UAC5E;AAAA;AAAA;AAAA,IACJ;AAAA,KACJ;AAER;;;AC/NQ,gBAAAI,OA6D4B,QAAAC,cA7D5B;AArBR,IAAM,uBAAuB;AAAA,EACzB,iBAAiB;AAAA,EACjB,gBAAgB;AACpB;AAEA,IAAM,gBAAgB;AAAA,EAClB,iBAAiB;AAAA,EACjB,gBAAgB;AACpB;AAEA,IAAM,UAAU,CAAC,UAAmD;AAChE,MAAI,SAAS,KAAM,QAAO,CAAC;AAC3B,QAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACnD,SAAO,MAAM,QAAQ,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACrF;AAEA,IAAM,cAAc,CAAC,UAAyC;AAC1D,QAAM,QAAQ,QAAQ,KAAK;AAC3B,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO,MAAM,IAAI,CAAC,MAAM,UACpB,gBAAAD,MAAC,UAAiB,WAAU,mBACvB,kBADM,KAEX,CACH;AACL;AAEA,IAAM,eAAe,CAAC,QAClB,gBAAAA,MAAC,UAAK,WAAU,cACX,sBAAY,IAAI,MAAM,GAC3B;AAGJ,IAAM,aAAa,CAAC,KAA0B,QAC1C,gBAAAA,MAAC,UAAK,WAAU,cACX,sBAAY,IAAI,IAAI,GAAG,CAAC,GAC7B;AAGG,IAAM,eAAe,CAAC;AAAA,EACzB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAyB;AACrB,QAAM,cAAc,qBAAqB,OAAO;AAChD,QAAM,iBAAiB,QAAQ,MAAM,GAAG,WAAW;AACnD,QAAM,cAAc,eAAe,CAAC;AACpC,QAAM,eAAe,eAAe,MAAM,CAAC;AAE3C,SACI,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,gBAAgB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9D,GAAG;AAAA,MAEH;AAAA,wBACG,gBAAAD,MAAC,SAAI,WAAU,wBACX,0BAAAA,MAAC,QAAG,WAAU,uBAAuB,wBAAa,GACtD;AAAA,QAGJ,gBAAAA,MAAC,SAAI,WAAU,yBACX,0BAAAA,MAAC,SAAI,WAAW,CAAC,QAAQ,cAAc,OAAO,CAAC,EAAE,KAAK,GAAG,GACrD,0BAAAA,MAAC,SAAI,WAAU,wBACX,0BAAAC,OAAC,WAAM,WAAU,eACb;AAAA,0BAAAD,MAAC,WACG,0BAAAA,MAAC,QAAG,WAAU,YACT,yBAAe,IAAI,CAAC,QACjB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,OAAM;AAAA,cACN,WAAU;AAAA,cAET,uBAAa,GAAG;AAAA;AAAA,YAJZ,IAAI;AAAA,UAKb,CACH,GACL,GACJ;AAAA,UACA,gBAAAA,MAAC,WACI,eAAK,IAAI,CAAC,KAAK,WACZ,gBAAAC,OAAC,QAAgB,WAAU,YACtB;AAAA,2BACG,gBAAAD,MAAC,QAAG,OAAM,OAAM,WAAU,gBACrB,qBAAW,KAAK,WAAW,GAChC;AAAA,YAEH,aAAa,IAAI,CAAC,QACf,gBAAAA,MAAC,QAAiB,WAAU,YACvB,qBAAW,KAAK,GAAG,KADf,IAAI,GAEb,CACH;AAAA,eAVI,MAWT,CACH,GACL;AAAA,WACJ,GACJ,GACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACzGA,SAAS,YAAAE,kBAAgB;AAQjB,SAYJ,YAAAC,WAZI,OAAAC,OAqBA,QAAAC,cArBA;AAFR,IAAMC,mBAAkB,MACpB,gBAAAF,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG,0BAAAA,MAAC,UAAK,GAAE,kBAAiB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAClH;AAGJ,IAAM,gBAAgB,MAClB,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,OAAM,8BAA6B,eAAY,QACvG,0BAAAA,MAAC,UAAK,GAAE,mBAAkB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GACnH;AAIJ,IAAM,cAAc,CAAC,EAAE,KAAK,MACxB,gBAAAC,OAAAF,WAAA,EACI;AAAA,kBAAAC,MAAC,SAAI,WAAU,8BACX,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACG,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,WAAU;AAAA,MACV,SAAQ;AAAA;AAAA,EACZ,GACJ;AAAA,EACA,gBAAAC,OAAC,SAAI,WAAU,wBACX;AAAA,oBAAAD,MAAC,QAAG,WAAU,qBAAqB,eAAK,MAAK;AAAA,IAC7C,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,eAAK,MAAK;AAAA,KAChD;AAAA,EACC,KAAK,WACF,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAM,KAAK;AAAA,MACX,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,aAAa;AAAA,MACzB,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,WAAU;AAAA;AAAA,EACd;AAAA,GAER;AAGG,IAAM,aAAa,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,eAAe;AAAA,EACf;AAAA,EACA,GAAG;AACP,MAAuB;AACnB,QAAM,CAAC,YAAY,aAAa,IAAIG,WAAS,KAAK;AAElD,QAAM,UAAe,MAAM,SAAS;AACpC,QAAM,eAAe,MAAM,MAAM,GAAG,mBAAmB;AACvD,QAAM,aAAe,MAAM,MAAM,mBAAmB;AAEpD,SACI,gBAAAH,MAAC,aAAQ,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAC1E,0BAAAC,OAAC,SAAI,WAAU,0BACT;AAAA,cAAS,gBACP,gBAAAA,OAAC,SAAI,WAAU,uBACV;AAAA,eAAS,gBAAAD,MAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,MACnD,eAAe,gBAAAA,MAAC,OAAE,WAAU,4BAA4B,uBAAY;AAAA,OACzE;AAAA,IAGJ,gBAAAC,OAAC,SAAI,WAAU,6BAEX;AAAA,sBAAAD,MAAC,SAAI,WAAU,qBACV,uBAAa,IAAI,CAAC,MAAM,MACrB,gBAAAA,MAAC,SAAY,WAAU,qBACnB,0BAAAA,MAAC,eAAY,MAAY,KADnB,CAEV,CACH,GACL;AAAA,MAGC,WACG,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,aAAa,mCAAmC;AAAA,UACpD,EAAE,KAAK,GAAG;AAAA,UACV,eAAa,CAAC;AAAA,UAEd,0BAAAA,MAAC,SAAI,WAAU,2BACV,qBAAW,IAAI,CAAC,MAAM,MACnB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEG,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA,aAAa,qCAAqC;AAAA,cACtD,EAAE,KAAK,GAAG;AAAA,cACV,OAAO;AAAA,gBACH,iBAAiB,aACX,GAAG,IAAI,KAAK,GAAG,OACf;AAAA,cACV;AAAA,cAEA,0BAAAA,MAAC,eAAY,MAAY;AAAA;AAAA,YAZpB;AAAA,UAaT,CACH,GACL;AAAA;AAAA,MACJ;AAAA,OAER;AAAA,IAEC,WACG,gBAAAA,MAAC,SAAI,WAAU,wBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,SAAQ;AAAA,QACR,aAAY;AAAA,QACZ,SAAS,MAAM,cAAc,CAAC,UAAU;AAAA,QACxC,cAAa;AAAA,QACb,MAAM,aAAa,gBAAAA,MAAC,iBAAc,IAAK,gBAAAA,MAACE,kBAAA,EAAgB;AAAA,QACxD,WAAS;AAAA,QAER,uBAAa,eAAe;AAAA;AAAA,IACjC,GACJ;AAAA,KAER,GACJ;AAER;AAGO,IAAM,aAAa;AAEnB,IAAM,UAAU;;;AC/Gf,gBAAAE,OA+CY,QAAAC,cA/CZ;AAvBR,IAAM,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAGO,IAAM,mCACT;AAGJ,IAAM,gBAAgB,MAClB,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,WAAU;AAAA,IACV,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IACZ,WAAU;AAAA,IAEV,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,MAAK;AAAA,QACL,aAAY;AAAA;AAAA,IAChB;AAAA;AACJ;AAGG,IAAM,cAAc,CAAC;AAAA,EACxB,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,MAAwB;AACpB,QAAM,WAAW,YAAY,kBAAkB,YAAY;AAC3D,QAAM,UAAU,YAAY,gBAAgB,YAAY;AACxD,QAAM,UAAU,CAAC,WAAW,QAAQ,QAAQ;AAC5C,QAAM,eAAe,UAAU,MAAM,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;AACnF,QAAM,mBACF,aAAa,UAAU,mCAAmC;AAE9D,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,UAAU,wBAAwB;AAAA,QAClC;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACZ,GAAG;AAAA,MAEJ,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,wBAAwB,OAAO;AAAA,UACnC,EAAE,KAAK,GAAG;AAAA,UAGT;AAAA,wBAAY,oBACT,gBAAAA,OAAC,SAAI,WAAU,kCACX;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK;AAAA,kBACL,KAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAQ;AAAA;AAAA,cACZ;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,4BAA2B,eAAY,QAAO;AAAA,eACjE;AAAA,YAIJ,gBAAAC,OAAC,SAAI,WAAU,yBACX;AAAA,8BAAAD,MAAC,QAAG,WAAU,uBAAuB,iBAAM;AAAA,cAE1C,eACG,gBAAAA,MAAC,OAAE,WAAU,6BAA6B,uBAAY;AAAA,cAGzD,aAAa,SAAS,KACnB,gBAAAA,MAAC,QAAG,WAAU,uBAAsB,cAAW,YAC1C,uBAAa,IAAI,CAAC,UACf,gBAAAC,OAAC,QAAe,WAAU,sBACtB;AAAA,gCAAAD,MAAC,iBAAc;AAAA,gBACf,gBAAAA,MAAC,UAAK,WAAU,4BAA4B,iBAAM;AAAA,mBAF7C,KAGT,CACH,GACL;AAAA,cAGH,WACG,gBAAAA,MAAC,SAAI,WAAU,yBACX,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,aAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,aAAW;AAAA,kBACX,WAAU;AAAA;AAAA,cACd,GACJ;AAAA,eAER;AAAA,YAGC,CAAC,YAAY,oBACV,gBAAAC,OAAC,SAAI,WAAU,+BACX;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK;AAAA,kBACL,KAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAQ;AAAA;AAAA,cACZ;AAAA,cACC,WACG,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cAChB;AAAA,eAER;AAAA;AAAA;AAAA,MAER;AAAA;AAAA,EACJ;AAER;;;AC1IA,SAAS,eAAAE,cAAa,aAAAC,aAAW,SAAAC,QAAO,UAAAC,UAAQ,YAAAC,kBAAgB;A;;;;;;;;;;;AAmBxD,SAOI,OAAAC,OAPJ,QAAAC,cAAA;AALR,IAAM,WAAW,CAAC,EAAE,KAAK,MAAwB;AAC7C,QAAM,SAASC,OAAM;AACrB,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;AAE7C,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,eAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,UAAK,OAAM,MAAK,QAAO,MAAK,WAAU,2BAA0B;AAAA,QACjE,gBAAAA,MAAC,cAAS,IAAI,QACV,0BAAAA,MAAC,UAAK,OAAO,KAAK,SAAS,QAAO,MAAK,GAC3C;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,QAAO;AAAA,YACP,WAAU;AAAA,YACV,UAAU,QAAQ,MAAM;AAAA;AAAA,QAC5B;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,GAAE;AAAA,YACF,WAAU;AAAA;AAAA,QACd;AAAA;AAAA;AAAA,EACJ;AAER;AAGA,IAAM,UAAU,CAAC,EAAE,QAAQ,OAAO,KAAK,MAAqD;AACxF,QAAM,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;AAC7E,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,yBAAyB,0BAA0B,IAAI,EAAE,EAAE,KAAK,GAAG;AAAA,MAC/E,MAAK;AAAA,MACL,cAAY,SAAS,MAAM;AAAA,MAE1B,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAA,MAAC,YAAiB,QAAH,CAAe,CACjC;AAAA;AAAA,EACL;AAER;AAEA,IAAM,YAAY,CAAC,EAAE,UAAU,MAC3B,gBAAAA,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACnE,wBAAc,SACX,gBAAAA,MAAC,UAAK,GAAE,yBAAwB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,IAErH,gBAAAA,MAAC,UAAK,GAAE,wBAAuB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GAE5H;AAKJ,IAAM,aAAa;AAEnB,SAAS,gBAAgB,IAA2B;AAChD,MAAI,CAAC,GAAI,QAAO,EAAE,SAAS,OAAO,SAAS,MAAM;AACjD,QAAM,EAAE,YAAY,aAAa,YAAY,IAAI;AACjD,QAAM,YAAY,cAAc;AAChC,SAAO;AAAA,IACH,SAAS,aAAa;AAAA,IACtB,SAAS,aAAa,YAAY;AAAA,EACtC;AACJ;AAEA,IAAM,wBAAwB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,GAAG;AACP,MAAwB;AACpB,QAAM,WAAWG,SAAuB,IAAI;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIC,WAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,IAAI;AAE3C,QAAM,kBAAkBC,aAAY,MAAM;AACtC,UAAM,OAAO,gBAAgB,SAAS,OAAO;AAC7C,eAAW,KAAK,OAAO;AACvB,eAAW,KAAK,OAAO;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,EAAAC,YAAU,MAAM;AACZ,UAAM,KAAK,SAAS;AACpB,QAAI,CAAC,GAAI;AACT,oBAAgB;AAChB,UAAM,KAAK,IAAI,eAAe,MAAM,gBAAgB,CAAC;AACrD,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC/B,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,eAAe,CAAC,cAAsB;AACxC,UAAM,KAAK,SAAS;AACpB,QAAI,CAAC,GAAI;AACT,UAAM,OAAO,GAAG,cAA2B,4BAA4B;AACvE,UAAM,MAAM,OAAO,WAAW,iBAAiB,EAAE,EAAE,aAAa,GAAG,KAAK;AACxE,UAAM,QAAQ,MAAM,eAAe,GAAG,cAAc;AACpD,OAAG,SAAS,EAAE,MAAM,aAAa,QAAQ,MAAM,UAAU,SAAS,CAAC;AACnE,WAAO,sBAAsB,MAAM,OAAO,WAAW,iBAAiB,GAAG,CAAC;AAAA,EAC9E;AAEA,SACI,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,eAAe,2BAA2B,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACxF,GAAG;AAAA,MAGJ;AAAA,wBAAAD,MAAC,SAAI,WAAU,wBACV,mBACG,gBAAAA,MAAC,QAAG,WAAU,qDAAqD,iBAAM,GAEjF;AAAA,QAQA,gBAAAA,MAAC,SAAI,WAAU,yBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,WAAU;AAAA,YACV,UAAU;AAAA,YACV,MAAK;AAAA,YACL,wBAAqB;AAAA,YACrB,cAAW;AAAA,YACX,UAAU;AAAA,YAEV,0BAAAA,MAAC,SAAI,WAAU,yBACV,gBAAM,IAAI,CAAC,MAAM,MACd,gBAAAA,MAAC,SAAY,WAAU,6BACnB,0BAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,MAAM,KAAK,aAAa;AAAA,gBACxB,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,KAAI;AAAA,gBAEJ;AAAA,kCAAAD,MAAC,WAAQ,QAAQ,KAAK,UAAU,GAAG,MAAK,MAAK;AAAA,kBAC7C,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,eAAK,OAAM;AAAA,kBACjD,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,eAAK,YAAW;AAAA;AAAA;AAAA,YAC3D,KAVM,CAWV,CACH,GACL;AAAA;AAAA,QACJ,GACJ;AAAA,QAGA,gBAAAA,MAAC,SAAI,WAAU,wBACX,0BAAAC,OAAC,SAAI,WAAU,0BAKX;AAAA,0BAAAD,MAAC,SAAI,WAAU,yBACX,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAM;AAAA,cACN,WAAU;AAAA,cACV,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,cAAY,oCAA+B,eAAe;AAAA,cAE1D,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,WAAU;AAAA;AAAA,cACd;AAAA;AAAA,UACJ,GACJ;AAAA,UAgBC,MAAM,SAAS,MAAM,WAAW,YAC7B,gBAAAC,OAAC,SAAI,WAAU,uBACX;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,UAAU,CAAC;AAAA,gBACX,SAAS,MAAM,aAAa,EAAE;AAAA,gBAE9B,0BAAAA,MAAC,aAAU,WAAU,QAAO;AAAA;AAAA,YAChC;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,cAAW;AAAA,gBACX,UAAU,CAAC;AAAA,gBACX,SAAS,MAAM,aAAa,CAAC;AAAA,gBAE7B,0BAAAA,MAAC,aAAU,WAAU,QAAO;AAAA;AAAA,YAChC;AAAA,aACJ;AAAA,WAER,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;AAQA,IAAM,qBAAqB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAwB;AACpB,QAAM,CAAC,aAAa,cAAc,IAAII,WAAS,CAAC;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAgB,MAAM;AAChD,QAAM,eAAeD,SAAsB,IAAI;AAC/C,QAAM,UAAUA,SAA6C,IAAI;AAEjE,QAAM,OAAO,CAAC,SAAiB;AAC3B,QAAI,SAAS,eAAe,UAAU,OAAQ;AAC9C,iBAAa,UAAU;AACvB,aAAS,SAAS;AAAA,EACtB;AAGA,EAAAG,YAAU,MAAM;AACZ,QAAI,UAAU,WAAW;AACrB,YAAM,IAAI,WAAW,MAAM;AACvB,uBAAe,aAAa,WAAW,WAAW;AAClD,iBAAS,MAAM;AAAA,MACnB,GAAG,GAAG;AACN,aAAO,MAAM,aAAa,CAAC;AAAA,IAC/B;AAAA,EACJ,GAAG,CAAC,OAAO,WAAW,CAAC;AAGvB,EAAAA,YAAU,MAAM;AACZ,QAAI,MAAM,UAAU,EAAG;AACvB,YAAQ,UAAU,WAAW,MAAM;AAC/B,YAAM,QAAQ,cAAc,KAAK,MAAM;AACvC,mBAAa,UAAU;AACvB,eAAS,SAAS;AAAA,IACtB,GAAG,GAAI;AACP,WAAO,MAAM;AACT,UAAI,QAAQ,QAAS,cAAa,QAAQ,OAAO;AAAA,IACrD;AAAA,EACJ,GAAG,CAAC,aAAa,MAAM,MAAM,CAAC;AAE9B,SACI,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7D,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,0BACV;AAAA,iBAAS,gBAAAD,MAAC,QAAG,WAAU,sBAAsB,iBAAM;AAAA,QAEpD,gBAAAC,OAAC,SAAI,WAAU,yBAEX;AAAA,0BAAAD,MAAC,SAAI,WAAU,uBACV,gBAAM,IAAI,CAAC,MAAuB,MAAM;AACrC,kBAAM,WAAW,MAAM;AACvB,kBAAM,YAAY,YAAY,UAAU;AAExC,kBAAM,aAAa;AAAA,cACf;AAAA,cACA,YAAY,CAAC,YAAY,+BAA+B;AAAA,cACxD,YAAY,gCAAgC;AAAA,YAChD,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAEb,mBACI,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAW;AAAA,gBACX,MAAK;AAAA,gBACL,cAAY,eAAe,IAAI,CAAC,OAAO,MAAM,MAAM;AAAA,gBACnD,eAAa,CAAC;AAAA,gBAEd,0BAAAC,OAAC,SAAI,WAAU,qBAEX;AAAA,kCAAAD,MAAC,UAAK,WAAU,uDAAsD,eAAY,QAC9E,0BAAAA,MAAC,SAAI,KAAK,oBAAW,KAAI,IAAG,WAAU,8BAA6B,GACvE;AAAA,kBAGA,gBAAAA,MAAC,OAAE,WAAU,sBAAsB,eAAK,OAAM;AAAA,kBAG9C,gBAAAC,OAAC,SAAI,WAAU,uBACV;AAAA,yBAAK,aACF,gBAAAD;AAAA,sBAAC;AAAA;AAAA,wBACG,KAAK,KAAK;AAAA,wBACV,KAAK,KAAK;AAAA,wBACV,WAAU;AAAA,wBACV,SAAQ;AAAA;AAAA,oBACZ;AAAA,oBAEJ,gBAAAA,MAAC,OAAE,WAAU,4BACR,eAAK,YACV;AAAA,oBACC,KAAK,kBACF,gBAAAA,MAAC,OAAE,WAAU,gCACR,eAAK,gBACV;AAAA,qBAER;AAAA,kBAGA,gBAAAA,MAAC,UAAK,WAAU,wDAAuD,eAAY,QAC/E,0BAAAA,MAAC,SAAI,KAAK,qBAAY,KAAI,IAAG,WAAU,8BAA6B,GACxE;AAAA,mBACJ;AAAA;AAAA,cAvCK;AAAA,YAwCT;AAAA,UAER,CAAC,GACL;AAAA,UAGC,MAAM,SAAS,KACZ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAW;AAAA,cAEV,gBAAM,IAAI,CAAC,GAAG,MACX,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEG,MAAK;AAAA,kBACL,iBAAe,MAAM;AAAA,kBACrB,cAAY,qBAAqB,IAAI,CAAC;AAAA,kBACtC,WAAW;AAAA,oBACP;AAAA,oBACA,MAAM,cACA,6BACA;AAAA,kBACV,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBACb,SAAS,MAAM;AACX,wBAAI,QAAQ,QAAS,cAAa,QAAQ,OAAO;AACjD,yBAAK,CAAC;AAAA,kBACV;AAAA;AAAA,gBAfK;AAAA,cAgBT,CACH;AAAA;AAAA,UACL;AAAA,WAER;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;AAMO,IAAM,cAAc,CAAC,UAA4B;AACpD,MAAI,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW,EAAG,QAAO;AAErD,MAAI,MAAM,YAAY,cAAc;AAChC,WAAO,gBAAAA,MAAC,yBAAuB,GAAG,OAAO;AAAA,EAC7C;AAEA,SAAO,gBAAAA,MAAC,sBAAoB,GAAG,OAAO;AAC1C;;;ACtYQ,gBAAAO,OAmBI,QAAAC,cAnBJ;AAFR,IAAM,cAAc,CAAC,EAAE,SAAS,gBAAgB,MAAM,MAClD,gBAAAD,MAAC,SAAI,WAAU,eACX,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,WAAW,QAAQ,aAAa;AAAA,IAChC,cAAc,QAAQ;AAAA,IACtB,eAAe,CAAC,iBAAiB,CAAC,QAAQ;AAAA,IAC1C,OAAO,QAAQ;AAAA,IACf,SAAQ;AAAA,IACR,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,IACpD,cAAc;AAAA,IACd,YAAU;AAAA;AACd,GACJ;AAGJ,IAAM,gBAAgB,CAAC,EAAE,QAAQ,iBAAiB,MAAM,MACpD,gBAAAC,OAAC,SAAI,WAAU,aACV;AAAA,SAAO,SACJ,gBAAAA,OAAC,SAAI,WAAU,mBACX;AAAA,oBAAAD,MAAC,UAAK,WAAU,kBAAkB,iBAAO,OAAM;AAAA,IAC/C,gBAAAA,MAAC,UAAK,WAAU,iBAAgB;AAAA,KACpC;AAAA,EAEJ,gBAAAA,MAAC,SAAI,WAAU,iBACV,iBAAO,SAAS,IAAI,CAAC,SAAS,MAC3B,gBAAAA,MAAC,eAAY,SAA0B,eAAe,kBAAlB,CAAkC,CACzE,GACL;AAAA,GACJ;AAGG,IAAM,cAAc,CAAC;AAAA,EACxB;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACJ,MAAwB;AACpB,SACI,gBAAAC,OAAC,aAAQ,WAAW,CAAC,WAAW,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAErE;AAAA,oBAAAA,OAAC,SAAI,WAAU,cACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,oBACX;AAAA,wBAAAD,MAAC,SAAI,WAAU,iBACV,qBAAW,SACR,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,0BAAAD,MAAC,UAAK,WAAU,kBAAkB,qBAAW,OAAM;AAAA,UACnD,gBAAAA,MAAC,UAAK,WAAU,iBAAgB;AAAA,WACpC,GAER;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,kBACV,sBAAY,SACT,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,0BAAAD,MAAC,UAAK,WAAU,kBAAkB,sBAAY,OAAM;AAAA,UACpD,gBAAAA,MAAC,UAAK,WAAU,iBAAgB;AAAA,WACpC,GAER;AAAA,SACJ;AAAA,MACA,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,wBAAAD,MAAC,SAAI,WAAU,6BACX,0BAAAA,MAAC,iBAAc,QAAQ,EAAE,GAAG,YAAY,OAAO,OAAU,GAAG,gBAAc,MAAC,GAC/E;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,cAAa;AAAA,QAC7B,gBAAAC,OAAC,SAAI,WAAU,aACX;AAAA,0BAAAA,OAAC,SAAI,WAAU,eACX;AAAA,4BAAAA,OAAC,SAAI,WAAU,mBACX;AAAA,8BAAAD,MAAC,QAAG,WAAU,oBAAoB,mBAAS,OAAM;AAAA,cAChD,SAAS,WAAW,gBAAAA,MAAC,OAAE,WAAU,sBAAsB,mBAAS,SAAQ;AAAA,cACxE,SAAS,QAAQ,SAAS,KAAK,SAAS,KACrC,gBAAAA,MAAC,SAAI,WAAU,mBACV,mBAAS,KAAK,IAAI,CAAC,KAAK,MACrB,gBAAAC,OAAC,UAAK,WAAU,cACX;AAAA,oBAAI,KAAK,gBAAAD,MAAC,UAAK,eAAY,QAAO,WAAU,aAAY,kBAAC;AAAA,gBAC1D,gBAAAA,MAAC,OAAI,OAAO,KAAK,MAAK,MAAK,SAAQ,UAAS;AAAA,mBAFd,CAGlC,CACH,GACL;AAAA,eAER;AAAA,YACC,SAAS,aACN,gBAAAA,MAAC,SAAI,WAAU,oBACX,0BAAAA,MAAC,SAAI,KAAK,SAAS,gBAAgB,IAAI,WAAU,kBAAiB,KAAK,SAAS,WAAW,GAC/F;AAAA,aAER;AAAA,UACC,eAAe,SAAS,KACrB,gBAAAA,MAAC,SAAI,WAAU,qBACV,yBAAe,IAAI,CAAC,SAAS,MAC1B,gBAAAC,OAAC,SAAI,WAAU,iBACV;AAAA,gBAAI,KAAK,gBAAAD,MAAC,UAAK,WAAU,oBAAmB;AAAA,YAC7C,gBAAAC,OAAC,SAAI,WAAU,oBACX;AAAA,8BAAAD,MAAC,OAAE,WAAU,kBAAkB,kBAAQ,OAAM;AAAA,cAC5C,QAAQ,QAAQ,QAAQ,KAAK,SAAS,KACnC,gBAAAA,MAAC,SAAI,WAAU,mBACV,kBAAQ,KAAK,IAAI,CAAC,KAAK,MACpB,gBAAAC,OAAC,UAAK,WAAU,cACX;AAAA,oBAAI,KAAK,gBAAAD,MAAC,UAAK,eAAY,QAAO,WAAU,aAAY,kBAAC;AAAA,gBAC1D,gBAAAA,MAAC,OAAI,OAAO,KAAK,MAAK,MAAK,SAAQ,UAAS;AAAA,mBAFd,CAGlC,CACH,GACL;AAAA,eAER;AAAA,eAdgC,CAepC,CACH,GACL;AAAA,WAER;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,cAAa;AAAA,QAC7B,gBAAAA,MAAC,SAAI,WAAU,8BACX,0BAAAA,MAAC,iBAAc,QAAQ,EAAE,GAAG,aAAa,OAAO,OAAU,GAAG,GACjE;AAAA,SACJ;AAAA,OACJ;AAAA,IAGA,gBAAAC,OAAC,SAAI,WAAU,aACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,qBACX;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAkB,qBAAW,SAAS,oBAAmB;AAAA,QACzE,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,oBAAoB,mBAAS,OAAM;AAAA,UAChD,SAAS,WAAW,gBAAAA,MAAC,OAAE,WAAU,sBAAsB,mBAAS,SAAQ;AAAA,UACxE,SAAS,QAAQ,SAAS,KAAK,SAAS,KACrC,gBAAAA,MAAC,SAAI,WAAU,mBACV,mBAAS,KAAK,IAAI,CAAC,KAAK,MACrB,gBAAAC,OAAC,UAAK,WAAU,cACX;AAAA,gBAAI,KAAK,gBAAAD,MAAC,UAAK,eAAY,QAAO,WAAU,aAAY,kBAAC;AAAA,YAC1D,gBAAAA,MAAC,OAAI,OAAO,KAAK,MAAK,MAAK,SAAQ,UAAS;AAAA,eAFd,CAGlC,CACH,GACL;AAAA,WAER;AAAA,QACC,SAAS,aACN,gBAAAA,MAAC,SAAI,WAAU,0BACX,0BAAAA,MAAC,SAAI,KAAK,SAAS,gBAAgB,IAAI,WAAU,kBAAiB,KAAK,SAAS,WAAW,GAC/F;AAAA,QAEH,eAAe,SAAS,KACrB,gBAAAA,MAAC,SAAI,WAAU,qBACV,yBAAe,IAAI,CAAC,SAAS,MAC1B,gBAAAC,OAAC,SAAI,WAAU,iBACV;AAAA,cAAI,KAAK,gBAAAD,MAAC,UAAK,WAAU,oBAAmB;AAAA,UAC7C,gBAAAC,OAAC,SAAI,WAAU,oBACX;AAAA,4BAAAD,MAAC,OAAE,WAAU,kBAAkB,kBAAQ,OAAM;AAAA,YAC5C,QAAQ,QAAQ,QAAQ,KAAK,SAAS,KACnC,gBAAAA,MAAC,SAAI,WAAU,mBACV,kBAAQ,KAAK,IAAI,CAAC,KAAK,MACpB,gBAAAC,OAAC,UAAK,WAAU,cACX;AAAA,kBAAI,KAAK,gBAAAD,MAAC,UAAK,eAAY,QAAO,WAAU,aAAY,kBAAC;AAAA,cAC1D,gBAAAA,MAAC,OAAI,OAAO,KAAK,MAAK,MAAK,SAAQ,UAAS;AAAA,iBAFd,CAGlC,CACH,GACL;AAAA,aAER;AAAA,aAdgC,CAepC,CACH,GACL;AAAA,SAER;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,oBACX,0BAAAA,MAAC,iBAAc,QAAQ,EAAE,GAAG,YAAY,OAAO,OAAU,GAAG,gBAAc,MAAC,GAC/E;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,oBACX,0BAAAA,MAAC,iBAAc,QAAQ,aAAa,GACxC;AAAA,OACJ;AAAA,KACJ;AAER;;;AC3JY,SAUQ,YAAAE,WATJ,OAAAC,OADJ,QAAAC,cAAA;AApBL,IAAM,iBAAiB,CAAC;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAA2B;AACvB,QAAM,aAAa,YAAY;AAC/B,QAAM,SAAS,YAAY;AAC3B,QAAM,YAAY,CAAC,WAAW,aAAa,gBAAgB,IAAI,SAAS,oBAAoB,IAAI,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEzI,QAAM,WAAW,KAAK,KAAK,SAAS,SAAS,CAAC;AAC9C,QAAM,OAAO,SAAS,MAAM,GAAG,QAAQ;AACvC,QAAM,OAAO,SAAS,MAAM,QAAQ;AAEpC,SACI,gBAAAA,OAAC,aAAQ,WAAW,WAEhB;AAAA,oBAAAA,OAAC,SAAI,WAAU,aACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,YAAY,wBAAa;AAAA,MACtC,YACG,gBAAAA,MAAC,QAAK,aAAY,SAAQ,OAAO,UAAU,SAAS,aAAa;AAAA,OAEzE;AAAA,IAGA,gBAAAC,OAAC,SAAI,WAAU,cACV;AAAA,OAAC,cAAc,CAAC,UAAU,YACvB,gBAAAA,OAAAF,WAAA,EACI;AAAA,wBAAAC,MAAC,SAAI,WAAU,kBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,SAAS,aAAa;AAAA,YACjC,cAAc,SAAS;AAAA,YACvB,eAAe,CAAC,SAAS;AAAA,YACzB,OAAO,SAAS;AAAA,YAChB,SAAS,SAAS,WAAW;AAAA,YAC7B,OAAO,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,YACrD,cAAc;AAAA,YACd,YAAU;AAAA;AAAA,QACd,GACJ;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,WACV,mBAAS,IAAI,CAAC,SAAS,MACpB,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,QAAQ,aAAa;AAAA,YAChC,cAAc,QAAQ;AAAA,YACtB,eAAa;AAAA,YACb,OAAO,QAAQ;AAAA,YACf,SAAQ;AAAA,YACR,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,YACpD,cAAc;AAAA,YACd,YAAU;AAAA;AAAA,QACd,KAb8B,CAclC,CACH,GACL;AAAA,SACJ;AAAA,MAEH,UACG,gBAAAA,MAAC,SAAI,WAAU,WACV,mBAAS,IAAI,CAAC,SAAS,MACpB,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW,QAAQ,aAAa;AAAA,UAChC,cAAc,QAAQ;AAAA,UACtB,eAAe,CAAC,QAAQ;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf,SAAS,QAAQ,WAAW;AAAA,UAC5B,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,UACpD,cAAc;AAAA,UACd,YAAU;AAAA;AAAA,MACd,KAb8B,CAclC,CACH,GACL;AAAA,MAEH,cACG,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,wBAAAD,MAAC,SAAI,WAAU,uBACV,sBACG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,SAAS,aAAa;AAAA,YACjC,cAAc,SAAS;AAAA,YACvB,eAAe,CAAC,SAAS;AAAA,YACzB,OAAO,SAAS;AAAA,YAChB,SAAS,SAAS,WAAW;AAAA,YAC7B,OAAO,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,YACrD,cAAc;AAAA,YACd,YAAU;AAAA;AAAA,QACd,GAER;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,kBACV,eAAK,IAAI,CAAC,SAAS,MAChB,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,QAAQ,aAAa;AAAA,YAChC,cAAc,QAAQ;AAAA,YACtB,eAAe,CAAC,QAAQ;AAAA,YACxB,OAAO,QAAQ;AAAA,YACf,SAAQ;AAAA,YACR,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,YACpD,cAAc;AAAA,YACd,YAAU;AAAA;AAAA,QACd,KAbkC,CActC,CACH,GACL;AAAA,QACA,gBAAAA,MAAC,SAAI,WAAU,kBACV,eAAK,IAAI,CAAC,SAAS,MAChB,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAW,QAAQ,aAAa;AAAA,YAChC,cAAc,QAAQ;AAAA,YACtB,eAAe,CAAC,QAAQ;AAAA,YACxB,OAAO,QAAQ;AAAA,YACf,SAAQ;AAAA,YACR,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,YACpD,cAAc;AAAA,YACd,YAAU;AAAA;AAAA,QACd,KAbkC,CActC,CACH,GACL;AAAA,SACJ;AAAA,OAER;AAAA,IAGA,gBAAAC,OAAC,SAAI,WAAW,SAAS,mBAAmB,aACvC;AAAA,OAAC,UAAU,YACR,gBAAAD,MAAC,SAAI,WAAU,qBACX,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW,SAAS,aAAa;AAAA,UACjC,cAAc,SAAS;AAAA,UACvB,eAAe,CAAC,SAAS;AAAA,UACzB,OAAO,SAAS;AAAA,UAChB,SAAS,SAAS,WAAW;AAAA,UAC7B,OAAO,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,UACrD,cAAc;AAAA,UACd,YAAU;AAAA;AAAA,MACd,GACJ;AAAA,MAEH,CAAC,UACE,gBAAAA,MAAC,SAAI,WAAU,iBACV,mBAAS,IAAI,CAAC,SAAS,MACpB,gBAAAA,MAAC,SAAI,WAAU,qBACX,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAQ,aAAa,uBAAuB;AAAA,UAC5C,WAAW,QAAQ,aAAa;AAAA,UAChC,cAAc,QAAQ;AAAA,UACtB,eAAe,CAAC,cAAc,CAAC,QAAQ;AAAA,UACvC,OAAO,QAAQ;AAAA,UACf,SAAQ;AAAA,UACR,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,UACpD,cAAc;AAAA,UACd,YAAU;AAAA;AAAA,MACd,KAboC,CAcxC,CACH,GACL;AAAA,MAEH,UACG,gBAAAA,MAAC,SAAI,WAAU,mBACV,mBAAS,IAAI,CAAC,SAAS,MACpB,gBAAAA,MAAC,SAAI,WAAU,uBACX,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,UACP,WAAW,QAAQ,aAAa;AAAA,UAChC,cAAc,QAAQ;AAAA,UACtB,eAAe,CAAC,QAAQ;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf,SAAS,QAAQ,WAAW;AAAA,UAC5B,OAAO,QAAQ,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AAAA,UACpD,cAAc;AAAA,UACd,YAAU;AAAA;AAAA,MACd,KAbsC,CAc1C,CACH,GACL;AAAA,OAER;AAAA,KACJ;AAER;;;AC1NA,SAAS,eAAAE,cAAa,aAAAC,aAAW,UAAAC,UAAQ,YAAAC,kBAAgB;AAuCjD,gBAAAC,OAsBA,QAAAC,cAtBA;AA/BR,IAAM,iBAAqC;AAAA,EACvC;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAe,EAAE,OAAO,eAAe,MAAM,IAAI;AAAA,EACrD;AACJ;AAMO,IAAM,4BAAgD;AAAA,EACzD;AAAA,IACI,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,eAAe,EAAE,OAAO,uBAAuB,MAAM,IAAI;AAAA,EAC7D;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aACI;AAAA,IACJ,eAAe,EAAE,OAAO,aAAa,MAAM,IAAI;AAAA,EACnD;AACJ;AAIA,IAAM,gBAAgB,MAClB,gBAAAD,MAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,eAAY,QAAO,WAAU,SAC9D,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,MAAK;AAAA;AACT,GACJ;AAGJ,IAAM,iBAAiB,MACnB,gBAAAA,MAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,eAAY,QAAO,WAAU,SAC9D,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,MAAK;AAAA;AACT,GACJ;AAMJ,IAAM,mBAAmB,CAAC,UAAkB;AACxC,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,SAAO,MAAM,IAAI,CAAC,MAAM,MACpB,gBAAAC,OAAC,UACI;AAAA;AAAA,IACA,IAAI,MAAM,SAAS,KAAK,gBAAAD,MAAC,QAAG;AAAA,OAFtB,CAGX,CACH;AACL;AAEA,IAAME,eAAc,CAAC;AAAA,EACjB;AAAA,EACA;AACJ,MAAmE;AAC/D,MAAI,CAAC,iBAAiB,CAAC,gBAAiB,QAAO;AAC/C,SACI,gBAAAD,OAAC,SAAI,WAAU,gBACV;AAAA,sBACI,cAAc,OACX,gBAAAD,MAAC,OAAE,MAAM,cAAc,MACnB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA;AAAA,IAC3B,GACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,cAAc;AAAA,QACrB,SAAS,cAAc;AAAA;AAAA,IAC3B;AAAA,IAEP,oBACI,gBAAgB,OACb,gBAAAA,MAAC,OAAE,MAAM,gBAAgB,MACrB,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,gBAAgB;AAAA,QACvB,SAAS,gBAAgB;AAAA;AAAA,IAC7B,GACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,SAAQ;AAAA,QACR,OAAO,gBAAgB;AAAA,QACvB,SAAS,gBAAgB;AAAA;AAAA,IAC7B;AAAA,KAEZ;AAER;AAEA,IAAM,eAAe,CAAC,EAAE,MAAM,MAC1B,gBAAAC,OAAC,SAAI,WAAU,aACX;AAAA,kBAAAA,OAAC,SAAI,WAAU,gBACX;AAAA,oBAAAD,MAAC,QAAG,WAAU,cAAc,2BAAiB,MAAM,KAAK,GAAE;AAAA,IACzD,MAAM,eAAe,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,gBAAM,aAAY;AAAA,IACzE,gBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,eAAe,MAAM;AAAA,QACrB,iBAAiB,MAAM;AAAA;AAAA,IAC3B;AAAA,KACJ;AAAA,EAEA,gBAAAF,MAAC,SAAI,WAAU,eAAc,eAAY,QAAO;AAAA,GACpD;AAKG,IAAM,cAAc,CAAC;AAAA,EACxB,UAAU;AAAA,EACV;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,MAAwB;AACpB,QAAM,iBAAiB,UAAU,OAAO,SAAS,IAAI,SAAS;AAC9D,QAAM,QAAQ,eAAe;AAC7B,QAAM,aAAa,YAAY,cAAc,QAAQ;AAErD,QAAM,CAAC,aAAa,cAAc,IAAIG,WAAS,CAAC;AAChD,QAAM,gBAAgBC,SAA6C,IAAI;AACvE,QAAM,YAAYA,SAAkC,IAAI;AAExD,QAAM,OAAOC;AAAA,IACT,CAAC,UAAkB;AACf,UAAI,SAAS,EAAG;AAChB,YAAM,OAAO,YACL,QAAQ,QAAS,SAAS,QAC5B,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,QAAQ,CAAC,CAAC;AAC5C,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,CAAC,OAAO,QAAQ;AAAA,EACpB;AAEA,QAAM,SAASA,aAAY,MAAM,KAAK,cAAc,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC;AAC3E,QAAM,SAASA,aAAY,MAAM,KAAK,cAAc,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC;AAE3E,QAAM,gBAAgB,MAAM;AACxB,QAAI,cAAc,QAAS,cAAa,cAAc,OAAO;AAAA,EACjE;AAIA,EAAAC,YAAU,MAAM;AACZ,QAAI,CAAC,cAAc,CAAC,SAAU;AAC9B,kBAAc,UAAU,WAAW,MAAM;AACrC,WAAK,cAAc,CAAC;AAAA,IACxB,GAAG,aAAa;AAChB,WAAO,MAAM,cAAc;AAAA,EAE/B,GAAG,CAAC,YAAY,UAAU,eAAe,WAAW,CAAC;AAGrD,QAAM,oBAAoB,CAAC,MAAyC;AAChE,QAAI,CAAC,WAAY;AACjB,cAAU,UAAU,EAAE,QAAQ,EAAE,QAAQ;AAAA,EAC5C;AACA,QAAM,kBAAkB,CAAC,MAAyC;AAC9D,QAAI,CAAC,cAAc,CAAC,UAAU,QAAS;AACvC,UAAM,QAAQ,EAAE,UAAU,UAAU,QAAQ;AAC5C,cAAU,UAAU;AACpB,UAAM,kBAAkB;AACxB,QAAI,QAAQ,iBAAiB;AACzB,oBAAc;AACd,aAAO;AAAA,IACX,WAAW,QAAQ,CAAC,iBAAiB;AACjC,oBAAc;AACd,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,QAAM,YAAY;AAAA,IACd;AAAA,IACA,aAAa,kBAAkB;AAAA,IAC/B;AAAA,EACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAGb,MAAI,CAAC,YAAY;AACb,WACI,gBAAAN,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAA,MAAC,gBAAa,OAAO,eAAe,CAAC,GAAG,GAC5C,GACJ,GACJ;AAAA,EAER;AAOA,SACI,gBAAAA,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAC,OAAC,SAAI,WAAU,cACX;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,eAAe;AAAA,QACf,aAAa;AAAA,QAEb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,OAAO;AAAA,cACH,WAAW,eAAe,cAAc,GAAG;AAAA,cAC3C,oBAAoB,GAAG,kBAAkB;AAAA,YAC7C;AAAA,YAEC,yBAAe,IAAI,CAAC,OAAO,MACxB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,wBAAqB;AAAA,gBACrB,cAAY,GAAG,IAAI,CAAC,OAAO,KAAK;AAAA,gBAChC,eAAa,MAAM;AAAA,gBAEnB,0BAAAA,MAAC,gBAAa,OAAc;AAAA;AAAA,cAPvB,MAAM,MAAM;AAAA,YAQrB,CACH;AAAA;AAAA,QACL;AAAA;AAAA,IACJ;AAAA,IAEC,YACG,gBAAAA,MAAC,SAAI,WAAU,aAAY,MAAK,WAAU,cAAW,2BAChD,yBAAe,IAAI,CAAC,GAAG,MACpB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEG,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe,MAAM;AAAA,QACrB,cAAY,eAAe,IAAI,CAAC,OAAO,KAAK;AAAA,QAC5C,WAAW;AAAA,UACP;AAAA,UACA,MAAM,cAAc,qBAAqB;AAAA,QAC7C,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACb,SAAS,MAAM;AACX,wBAAc;AACd,eAAK,CAAC;AAAA,QACV;AAAA;AAAA,MAdK;AAAA,IAeT,CACH,GACL;AAAA,IAGH,cACG,gBAAAC,OAAC,SAAI,WAAU,eACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAW;AAAA,UACX,SAAS,MAAM;AACX,0BAAc;AACd,mBAAO;AAAA,UACX;AAAA,UAEA,0BAAAA,MAAC,iBAAc;AAAA;AAAA,MACnB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAW;AAAA,UACX,SAAS,MAAM;AACX,0BAAc;AACd,mBAAO;AAAA,UACX;AAAA,UAEA,0BAAAA,MAAC,kBAAe;AAAA;AAAA,MACpB;AAAA,OACJ;AAAA,KAER,GACJ,GACJ;AAER;A;;;;;;;;AC3QI,gBAAAO,OAcI,QAAAC,cAdJ;AA/BG,IAAM,8BAA8B;AAAA,EACvC,OAAO;AACX;AAEO,IAAM,iBAA8B;AAAA,EACvC,EAAE,OAAO,oCAAoC,UAAU,wBAAwB;AAAA,EAC/E,EAAE,OAAO,oCAAoC,UAAU,iBAAiB;AAAA,EACxE,EAAE,OAAO,2BAA2B,UAAU,iBAAiB;AAAA,EAC/D,EAAE,OAAO,gCAAgC,UAAU,iBAAiB;AAAA,EACpE,EAAE,OAAO,oCAAoC,UAAU,2BAA2B;AAAA,EAClF,EAAE,OAAO,wBAAwB,UAAU,2BAA2B;AAAA,EACtE,EAAE,OAAO,gCAAgC,UAAU,2BAA2B;AAAA,EAC9E,EAAE,OAAO,2CAA2C,UAAU,wBAAwB;AAAA,EACtF,EAAE,OAAO,+CAA+C,UAAU,wBAAwB;AAAA,EAC1F,EAAE,OAAO,sBAAsB,UAAU,iBAAiB;AAAA,EAC1D,EAAE,OAAO,oCAAoC,UAAU,wBAAwB;AAAA,EAC/E,EAAE,OAAO,qCAAqC,UAAU,wBAAwB;AAAA,EAChF,EAAE,OAAO,iCAAiC,UAAU,wBAAwB;AAAA,EAC5E,EAAE,OAAO,kCAAkC,UAAU,2BAA2B;AAAA,EAChF,EAAE,OAAO,gCAAgC,UAAU,wBAAwB;AAAA,EAC3E,EAAE,OAAO,4BAA4B,UAAU,oBAAoB;AAAA,EACnE,EAAE,OAAO,+BAA+B,UAAU,wBAAwB;AAC9E;AAQA,IAAM,aAAa,CAAC,EAAE,KAAK,MACvB,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,WAAW,sBAAsB,IAAI;AAAA,IACrC,KAAK,SAAS,SAAS,0BAAW;AAAA,IAClC,KAAI;AAAA,IACJ,eAAY;AAAA,IACZ,SAAQ;AAAA,IACR,WAAW;AAAA;AACf;AAIJ,IAAME,cAAa,CAAC,EAAE,MAAM,MACxB,gBAAAD,OAAC,SAAI,WAAU,YAAW,MAAK,YAC3B;AAAA,kBAAAD,MAAC,cAAW,MAAK,QAAO;AAAA,EACxB,gBAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,oBAAAD,MAAC,OAAE,WAAU,kBAAkB,gBAAM,OAAM;AAAA,IAC3C,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,gBAAM,UAAS;AAAA,KACrD;AAAA,EACA,gBAAAA,MAAC,cAAW,MAAK,SAAQ;AAAA,GAC7B;AAmBG,IAAM,gBAAgB,CAAC;AAAA,EAC1B,QAAQ,4BAA4B;AAAA,EACpC,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB;AAAA,EACA,GAAG;AACP,MAA0B;AACtB,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;AAE3C,QAAM,aAAa;AAAA,IACf,iBAAiB,GAAG,kBAAkB;AAAA,EAC1C;AAEA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,MAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpD,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,aACV;AAAA,iBAAS,gBAAAD,MAAC,QAAG,WAAU,aAAa,iBAAM;AAAA,QAG3C,gBAAAA,MAAC,SAAI,WAAU,YAAW,MAAK,QAC1B,iBAAO,IAAI,CAAC,OAAO,MAChB,gBAAAA,MAACE,aAAA,EAA0B,SAAV,KAAK,CAAC,EAAkB,CAC5C,GACL;AAAA,QAGA,gBAAAF,MAAC,SAAI,WAAU,gBACX,0BAAAC,OAAC,SAAI,WAAU,6BAA4B,OAAO,YAC9C;AAAA,0BAAAD,MAAC,SAAI,WAAU,mBAAkB,MAAK,QACjC,iBAAO,IAAI,CAAC,OAAO,MAChB,gBAAAA,MAACE,aAAA,EAA0B,SAAV,KAAK,CAAC,EAAkB,CAC5C,GACL;AAAA,UAGA,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,MAAK;AAAA,cACL,eAAY;AAAA,cAEX,iBAAO,IAAI,CAAC,OAAO,MAChB,gBAAAA,MAACE,aAAA,EAA8B,SAAd,SAAS,CAAC,EAAkB,CAChD;AAAA;AAAA,UACL;AAAA,WACJ,GACJ;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;ACxGQ,gBAAAC,OAiEI,QAAAC,cAjEJ;AAzBR,IAAMC,mBAAkB,CAAC,SACrB,QAAQ,gBAAgB,KAAK,IAAI,IAAI,wBAAwB;AAO1D,IAAM,4BAA4B;AAAA,EACrC,OAAO;AAAA,EACP,UAAU;AACd;AAQA,IAAM,WAAW,CAAC,EAAE,MAAM,MAAM,MAAgD;AAC5E,QAAM,OAAO,CAAC,KAAK,MAAM,KAAK,QAAQ,EACjC,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAE/B,QAAM,OACF,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,YAAU;AAAA,MACV,QAAO;AAAA,MACP,cAAc;AAAA,MACd,SAAS,KAAK;AAAA,MACd;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,MAAK;AAAA,MACL,SAAQ;AAAA;AAAA,EACZ;AAGJ,MAAI,KAAK,MAAM;AACX,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,MAAM,KAAK;AAAA,QAEX,KAAKE,iBAAgB,KAAK,IAAI;AAAA,QAE7B;AAAA;AAAA,MAHI,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,IAI/B;AAAA,EAER;AAEA,MAAI,KAAK,SAAS;AACd,WACI,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QAEV,SAAS,KAAK;AAAA,QACd,MAAK;AAAA,QAEJ;AAAA;AAAA,MAJI,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,IAK/B;AAAA,EAER;AAEA,SAAO,gBAAAA,MAAC,SAAoC,kBAA3B,GAAG,KAAK,KAAK,IAAI,KAAK,EAAU;AACrD;AAUO,IAAM,cAAc,CAAC;AAAA,EACxB,QAAQ,0BAA0B;AAAA,EAClC;AAAA,EACA,WAAW;AAAA,EACX,WAAW,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAwB;AACpB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AAEzC,SACI,gBAAAA,MAAC,aAAQ,WAAW,CAAC,cAAc,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAC/E,0BAAAC,OAAC,SAAI,WAAU,gBACV;AAAA,aAAS,gBAAAD,MAAC,QAAG,WAAU,YAAY,iBAAM;AAAA,IAE1C,gBAAAA,MAAC,SAAI,WAAU,WACV,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAA,MAAC,YAAS,OAA6C,QAA1B,GAAG,KAAK,KAAK,IAAI,KAAK,EAAgB,CACtE,GACL;AAAA,IAEC,YACG,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAKE,iBAAgB,QAAQ;AAAA,QAC7B,SAAS;AAAA;AAAA,IACb,GACJ;AAAA,KAER,GACJ;AAER;;;ACtHA,SAAS,WAAAC,UAAS,YAAAC,kBAAkC;AA0C5C,gBAAAC,OAgHI,QAAAC,cAhHJ;AAnCR,IAAM,gBAAgB,CAAC,SAA6B,QAAQ,QAAQ,gBAAgB,KAAK,IAAI,CAAC;AAQvF,IAAM,uCAAuC;AAAA,EAChD,OAAO;AAAA,EACP,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,gBAAgB;AACpB;AASA,IAAMC,YAAW,CAAC;AAAA,EACd;AAAA,EACA;AACJ,MAGM;AACF,QAAM,OAAO,CAAC,KAAK,MAAM,aAAa,EACjC,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAE/B,QAAM,OACF,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACG,YAAU;AAAA,MACV,QAAO;AAAA,MACP,cAAc;AAAA,MACd,SAAS,KAAK;AAAA,MACd;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,MAAK;AAAA,MACL,SAAQ;AAAA;AAAA,EACZ;AAGJ,MAAI,KAAK,MAAM;AACX,UAAM,WAAW,cAAc,KAAK,IAAI;AACxC,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,MAAM,KAAK;AAAA,QACX,KAAK,WAAW,wBAAwB;AAAA,QACxC,QAAQ,WAAW,WAAW;AAAA,QAE7B;AAAA;AAAA,IACL;AAAA,EAER;AAEA,MAAI,KAAK,SAAS;AACd,WACI,gBAAAA,MAAC,YAAO,WAAU,+BAA8B,SAAS,KAAK,SAAS,MAAK,UACvE,gBACL;AAAA,EAER;AAEA,SAAO,gBAAAA,MAAC,SAAK,gBAAK;AACtB;AAYO,IAAM,wBAAwB,CAAC;AAAA,EAClC,QAAQ,qCAAqC;AAAA,EAC7C;AAAA,EACA,gBAAgB,qCAAqC;AAAA,EACrD,mBAAmB,qCAAqC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB,qCAAqC;AAAA,EACzD;AAAA,EACA;AAAA,EACA,iBAAiB,qCAAqC;AAAA,EACtD;AAAA,EACA,GAAG;AACP,MAAkC;AAC9B,QAAM,CAAC,QAAQ,SAAS,IAAIG,WAAS,EAAE;AACvC,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,2BAA2B,aAAa;AAEjG,QAAM,eAAe,qBAAqB;AAC1C,QAAM,WAAW,eAAe,mBAAmB;AAEnD,QAAM,OAAOC;AAAA,IACT,MAAM,CAAC,EAAE,IAAI,eAAe,OAAO,iBAAiB,GAAG,GAAG,UAAU;AAAA,IACpE,CAAC,eAAe,kBAAkB,UAAU;AAAA,EAChD;AAEA,QAAM,oBAAoBA,SAAQ,MAAM;AACpC,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAW,QAAQ,CAAC,aAAa,IAAI,IAAI,SAAS,IAAI,SAAS,KAAK,CAAC;AACrE,WAAO;AAAA,EACX,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,gBAAgBA,SAAQ,MAAM;AAChC,UAAM,QAAQ,OAAO,KAAK,EAAE,YAAY;AACxC,WAAO,MAAM,OAAO,CAAC,SAAS;AAC1B,YAAM,kBAAkB,aAAa,iBAAiB,KAAK,aAAa;AACxE,UAAI,CAAC,gBAAiB,QAAO;AAC7B,UAAI,CAAC,MAAO,QAAO;AACnB,aACI,KAAK,MAAM,YAAY,EAAE,SAAS,KAAK,KACvC,KAAK,QAAQ,YAAY,EAAE,SAAS,KAAK;AAAA,IAEjD,CAAC;AAAA,EACL,GAAG,CAAC,OAAO,UAAU,eAAe,MAAM,CAAC;AAE3C,QAAM,kBAAkB,CAAC,OAAe;AACpC,QAAI,CAAC,aAAc,qBAAoB,EAAE;AACzC,uBAAmB,EAAE;AAAA,EACzB;AAEA,QAAM,qBAAqB,CAAC,MAAqC;AAC7D,cAAU,EAAE,OAAO,KAAK;AACxB,qBAAiB,EAAE,OAAO,KAAK;AAAA,EACnC;AAEA,QAAM,oBAAoB,MAAM;AAC5B,cAAU,EAAE;AACZ,qBAAiB,EAAE;AAAA,EACvB;AAEA,SACI,gBAAAJ,MAAC,aAAQ,WAAW,CAAC,eAAe,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAChF,0BAAAC,OAAC,SAAI,WAAU,iBACV;AAAA,aAAS,gBAAAD,MAAC,QAAG,WAAU,aAAa,iBAAM;AAAA,IAE3C,gBAAAA,MAAC,SAAI,WAAU,kBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,cAAY,mBAAmB;AAAA,QAC/B,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,OAAO;AAAA,QACP,SAAQ;AAAA;AAAA,IACZ,GACJ;AAAA,IAEA,gBAAAA,MAAC,SAAI,WAAU,gBACX,0BAAAA,MAAC,QAAK,UAAU,YAAY,eAAe,OAAO,MAAM,UAAU,iBAAiB,GACvF;AAAA,IAEC,cAAc,SAAS,IACpB,gBAAAA,MAAC,SAAI,WAAU,YACV,wBAAc,IAAI,CAAC,MAAM,UACtB,gBAAAA;AAAA,MAACE;AAAA,MAAA;AAAA,QACG,eAAe,KAAK,iBAAiB,kBAAkB,IAAI,KAAK,QAAQ;AAAA,QAExE;AAAA;AAAA,MADK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,IAE/B,CACH,GACL,IAEA,gBAAAF,MAAC,OAAE,WAAU,kBAAkB,0BAAe;AAAA,KAEtD,GACJ;AAER;;;ACrLI,qBAAAK,YAIgB,OAAAC,OAJhB,QAAAC,cAAA;AAJJ,IAAMC,mBAAkB,CAAC,SACrB,QAAQ,gBAAgB,KAAK,IAAI,IAAI,wBAAwB;AAEjE,IAAM,sBAAsB,CAAC,EAAE,SAAS,MACpC,gBAAAD,OAAAF,YAAA,EACK;AAAA,WAAS,QACN,gBAAAC,MAAC,UAAK,WAAU,iBACX,iBAAO,SAAS,SAAS,WACtB,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,KAAK,SAAS,WAAW;AAAA,MACzB,WAAU;AAAA,MACV,UAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,KAAK,SAAS;AAAA,MACd,OAAO;AAAA;AAAA,EACX,IAEA,SAAS,MAEjB;AAAA,EAGJ,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,mBAAS,OAAM;AAAA,GACrD;AAGJ,IAAM,eAAe,CAAC,EAAE,SAAS,MAA4C;AACzE,MAAI,SAAS,MAAM;AACf,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,MAAM,SAAS;AAAA,QACf,SAAS,SAAS;AAAA,QAClB,KAAKE,iBAAgB,SAAS,IAAI;AAAA,QAElC,0BAAAF,MAAC,uBAAoB,UAAoB;AAAA;AAAA,IAC7C;AAAA,EAER;AAEA,SACI,gBAAAA,MAAC,YAAO,WAAU,YAAW,SAAS,SAAS,SAAS,MAAK,UACzD,0BAAAA,MAAC,uBAAoB,UAAoB,GAC7C;AAER;AAQA,IAAM,iBAAiB,CAAC,kBAA0B,KAAK,IAAI,GAAG,KAAK,IAAI,eAAe,CAAC,CAAC;AAEjF,IAAM,uBAAuB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACJ,MAAiC;AAC7B,QAAM,cAAc,eAAe,WAAW,MAAM;AAEpD,SACI,gBAAAA,MAAC,aAAQ,WAAU,eACf,0BAAAC,OAAC,SAAI,WAAU,iBACT;AAAA,qBAAgB,uBACd,gBAAAA,OAAC,SAAI,WAAU,cACV;AAAA,sBAAgB,gBAAAD,MAAC,QAAG,WAAU,oBAAoB,wBAAa;AAAA,MAE/D,sBACG,gBAAAA,MAAC,OAAE,WAAU,0BAA0B,8BAAmB;AAAA,OAElE;AAAA,IAGJ,gBAAAA,MAAC,SAAI,WAAW,sBAAsB,WAAW,IAAI,MAAK,QACrD,qBAAW,IAAI,CAAC,UAAU,UACvB,gBAAAA,MAAC,SAAI,WAAU,gBAAiE,MAAK,YACjF,0BAAAA,MAAC,gBAAa,UAAoB,KADH,SAAS,MAAM,GAAG,SAAS,KAAK,IAAI,KAAK,EAE5E,CACH,GACL;AAAA,KACJ,GACJ;AAER;;;ACzFA,SAAS,WAAAG,UAAS,YAAAC,kBAAkC;AAYpC,gBAAAC,OAwCJ,QAAAC,cAxCI;AAPhB,IAAMC,mBAAkB,CAAC,SACrB,QAAQ,gBAAgB,KAAK,IAAI,IAAI,wBAAwB;AAEjE,IAAM,eAAe,CAAC,EAAE,KAAK,MAA2C;AACpE,MAAI,KAAK,MAAM;AACX,WACI,gBAAAF,MAAC,OAAE,WAAU,aAAY,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,KAAKE,iBAAgB,KAAK,IAAI,GAC3F,0BAAAF,MAAC,UAAK,WAAU,kBAAkB,eAAK,UAAS,GACpD;AAAA,EAER;AAEA,SACI,gBAAAA,MAAC,YAAO,WAAU,aAAY,SAAS,KAAK,SAAS,MAAK,UACtD,0BAAAA,MAAC,UAAK,WAAU,kBAAkB,eAAK,UAAS,GACpD;AAER;AAEO,IAAM,0BAA0B,CAAC;AAAA,EACpC;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AACJ,MAAoC;AAChC,QAAM,CAAC,QAAQ,SAAS,IAAIG,WAAS,EAAE;AAEvC,QAAM,WAAWC,SAAQ,MAAM;AAC3B,UAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EACzE,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,qBAAqB,CAAC,MAAqC;AAC7D,cAAU,EAAE,OAAO,KAAK;AACxB,qBAAiB,EAAE,OAAO,KAAK;AAAA,EACnC;AAEA,QAAM,cAAc,MAAM;AACtB,cAAU,EAAE;AACZ,qBAAiB,EAAE;AAAA,EACvB;AAEA,SACI,gBAAAJ,MAAC,aAAQ,WAAU,gBACf,0BAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,oBAAAD,MAAC,QAAG,WAAU,cAAc,iBAAM;AAAA,IAElC,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,cAAY,mBAAmB;AAAA,QAC/B,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAa;AAAA,QACb,OAAO;AAAA,QACP,SAAQ;AAAA;AAAA,IACZ,GACJ;AAAA,IAEC,SAAS,SAAS,IACf,gBAAAA,MAAC,SAAI,WAAU,aAAY,MAAK,QAC3B,mBAAS,IAAI,CAAC,MAAM,UACjB,gBAAAA,MAAC,SAAI,WAAU,iBAA6D,MAAK,YAC7E,0BAAAA,MAAC,gBAAa,MAAY,KADM,KAAK,MAAM,GAAG,KAAK,QAAQ,IAAI,KAAK,EAExE,CACH,GACL,IAEA,gBAAAA,MAAC,OAAE,WAAU,kBAAkB,wBAAc,QAAQ,WAAW,MAAM,GAAE;AAAA,KAEhF,GACJ;AAER;;;AChFA,SAAS,WAAAK,UAAS,YAAAC,kBAAkC;AAW5C,gBAAAC,OAmJgB,QAAAC,cAnJhB;AALR,IAAMC,mBAAkB,CAAC,SACrB,QAAQ,gBAAgB,KAAK,IAAI,IAAI,wBAAwB;AAEjE,IAAMC,mBAAkB,MACpB,gBAAAH,MAAC,SAAI,eAAY,QAAO,MAAK,QAAO,QAAO,MAAK,SAAQ,aAAY,OAAM,MAAK,OAAM,8BACjF,0BAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,eAAc,SAAQ,gBAAe,SAAQ,aAAY,OAAM,GAChH;AAGJ,IAAM,cAAc,CAAC,OAA+B,UAAkB;AAClE,MAAI,MAAM,SAAS,WAAW;AAC1B,UAAM,aAAa,MAAM,UAAU,IAAI,OAAO;AAC9C,WACI,gBAAAA,MAAC,cAAW,WAAU,oBACjB,gBAAM,QADmC,KAE9C;AAAA,EAER;AAEA,MAAI,MAAM,SAAS,QAAQ;AACvB,UAAM,UAAU,MAAM,UAAU,OAAO;AACvC,WACI,gBAAAA,MAAC,WAAQ,WAAU,iBACb,iBAAM,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,MAC5B,gBAAAA,MAAC,QAAG,WAAU,qBACT,kBADkC,CAEvC,CACH,KALmC,KAMxC;AAAA,EAER;AAEA,SACI,gBAAAA,MAAC,OAAE,WAAU,sBACR,gBAAM,QAD4B,KAEvC;AAER;AAEA,IAAM,cAAc,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACJ,MAIM;AACF,QAAM,WAAW,CAAC,WAAW,WAAW,oBAAoB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAExF,MAAI,KAAK,MAAM;AACX,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,gBAAc,WAAW,SAAS;AAAA,QAClC,WAAW;AAAA,QACX,MAAM,KAAK;AAAA,QACX,SAAS,MAAM;AACX,eAAK,UAAU;AACf,mBAAS,IAAI;AAAA,QACjB;AAAA,QACA,KAAKE,iBAAgB,KAAK,IAAI;AAAA,QAE9B,0BAAAF,MAAC,UAAK,WAAU,eAAe,eAAK,UAAS;AAAA;AAAA,IACjD;AAAA,EAER;AAEA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,gBAAc,WAAW,SAAS;AAAA,MAClC,WAAW;AAAA,MACX,SAAS,MAAM;AACX,aAAK,UAAU;AACf,iBAAS,IAAI;AAAA,MACjB;AAAA,MACA,MAAK;AAAA,MAEL,0BAAAA,MAAC,UAAK,WAAU,eAAe,eAAK,UAAS;AAAA;AAAA,EACjD;AAER;AAEO,IAAM,iBAAiB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB;AACJ,MAA2B;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAII,WAAS,EAAE;AACvC,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAAS,2BAA2B,UAAU,CAAC,GAAG,EAAE;AACpG,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,KAAK;AAEhD,QAAM,eAAe,qBAAqB;AAC1C,QAAM,WAAW,eAAe,mBAAmB;AACnD,QAAM,aAAa,UAAU,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ;AAEhE,QAAM,WAAWC,SAAQ,MAAM;AAC3B,UAAM,IAAI,OAAO,KAAK,EAAE,YAAY;AACpC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,UAAU,OAAO,CAAC,SAAS,KAAK,SAAS,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EAC7E,GAAG,CAAC,WAAW,MAAM,CAAC;AAEtB,QAAM,qBAAqB,CAAC,MAAqC;AAC7D,cAAU,EAAE,OAAO,KAAK;AACxB,qBAAiB,EAAE,OAAO,KAAK;AAAA,EACnC;AAEA,QAAM,cAAc,MAAM;AACtB,cAAU,EAAE;AACZ,qBAAiB,EAAE;AAAA,EACvB;AAEA,QAAM,eAAe,CAAC,SAAiC;AACnD,QAAI,CAAC,aAAc,qBAAoB,KAAK,EAAE;AAC9C,uBAAmB,KAAK,EAAE;AAC1B,iBAAa,KAAK;AAAA,EACtB;AAKA,QAAM,gBAAgB,YAAY,UAAU,WAAW,gBAAgB,eAAe;AACtF,QAAM,kBAAkB,YAAY,WAAW;AAE/C,QAAM,YAAY,CAAC,eAAe,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE3E,SACI,gBAAAJ,OAAC,aAAQ,WAAW,WAChB;AAAA,oBAAAA,OAAC,SAAI,WAAU,iBACX;AAAA,sBAAAD,MAAC,SAAI,WAAU,kBACX,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,cAAY,mBAAmB;AAAA,UAC/B,UAAU;AAAA,UACV,SAAS;AAAA,UACT,aAAa;AAAA,UACb,OAAO;AAAA,UACP,SAAQ;AAAA;AAAA,MACZ,GACJ;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,YAEX;AAAA,wBAAAD,MAAC,WAAM,WAAU,eACb,0BAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,oBAAoB,yBAAc;AAAA,UAE/C,SAAS,SAAS,IACf,gBAAAA,MAAC,SAAI,WAAU,YAAW,MAAK,QAC1B,mBAAS,IAAI,CAAC,SACX,gBAAAA,MAAC,SAAI,WAAU,gBAA6B,MAAK,YAC7C,0BAAAA,MAAC,eAAY,UAAU,KAAK,OAAO,UAAU,MAAY,UAAU,cAAc,KADlD,KAAK,EAExC,CACH,GACL,IAEA,gBAAAA,MAAC,OAAE,WAAU,iBAAiB,8BAAoB,QAAQ,WAAW,MAAM,GAAE;AAAA,WAErF,GACJ;AAAA,QAGA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,iBAAe;AAAA,YACf,WAAU;AAAA,YACV,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,MAAK;AAAA,YAEL;AAAA,8BAAAD,MAAC,UAAK,WAAU,yBAAyB,yBAAc;AAAA,cACvD,gBAAAA,MAAC,UAAK,WAAU,2BACZ,0BAAAA,MAACG,kBAAA,EAAgB,GACrB;AAAA;AAAA;AAAA,QACJ;AAAA,QAGA,gBAAAF,OAAC,SAAI,WAAU,eACX;AAAA,0BAAAD,MAAC,QAAG,WAAU,oBAAoB,yBAAc;AAAA,UAChD,gBAAAA,MAAC,SAAI,WAAU,mBAAmB,0BAAgB,IAAI,WAAW,GAAE;AAAA,WACvE;AAAA,SACJ;AAAA,OACJ;AAAA,IAGA,gBAAAA,MAAC,eAAY,SAAS,MAAM,aAAa,KAAK,GAAG,MAAM,WAAW,OAAO,oBACpE,mBAAS,SAAS,IACf,gBAAAA,MAAC,SAAI,WAAU,iBAAgB,MAAK,QAC/B,mBAAS,IAAI,CAAC,SACX,gBAAAA,MAAC,SAAI,WAAU,iBAA8B,MAAK,YAC9C,0BAAAA,MAAC,eAAY,UAAU,KAAK,OAAO,UAAU,MAAY,UAAU,cAAc,KADjD,KAAK,EAEzC,CACH,GACL,IAEA,gBAAAA,MAAC,OAAE,WAAU,iBAAiB,8BAAoB,QAAQ,WAAW,MAAM,GAAE,GAErF;AAAA,KACJ;AAER;;;ACpNA,SAAS,aAAAM,aAAW,WAAAC,UAAS,YAAAC,kBAAgB;A;;;;;;;;;;;;;;;;;AA0BrC,gBAAAC,OAmGQ,QAAAC,cAnGR;AAFR,IAAMC,mBAAkB,MACpB,gBAAAF,MAAC,SAAI,eAAY,QAAO,MAAK,QAAO,QAAO,MAAK,SAAQ,aAAY,OAAM,MAAK,OAAM,8BACjF,0BAAAA,MAAC,UAAK,GAAE,gBAAe,QAAO,gBAAe,eAAc,SAAQ,gBAAe,SAAQ,aAAY,OAAM,GAChH;AAGJ,IAAMG,aAAY,MACd,gBAAAH,MAAC,SAAI,eAAY,QAAO,MAAK,QAAO,QAAO,MAAK,SAAQ,aAAY,OAAM,MAAK,OAAM,8BACjF,0BAAAA,MAAC,UAAK,GAAE,oBAAmB,QAAO,gBAAe,eAAc,SAAQ,gBAAe,SAAQ,aAAY,OAAM,GACpH;AAGJ,IAAM,cAA8E;AAAA,EAChF,UAAU,EAAE,KAAK,wBAAmB,KAAK,WAAW;AAAA,EACpD,SAAS,EAAE,KAAK,iBAAY,KAAK,IAAI;AAAA,EACrC,UAAU,EAAE,KAAK,wBAAmB,KAAK,WAAW;AAAA,EACpD,UAAU,EAAE,KAAK,wBAAmB,KAAK,WAAW;AACxD;AAEA,IAAM,SAAmD;AAAA,EACrD,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACd;AAIA,IAAM,UAAU,CAAC,SACb,KACK,YAAY,EACZ,KAAK,EACL,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AAE7B,SAAS,UAAU,UAAoC,KAAa,MAAsB;AACtF,QAAM,aAAa,mBAAmB,GAAG;AACzC,QAAM,cAAc,mBAAmB,IAAI;AAC3C,UAAQ,UAAU;AAAA,IACd,KAAK;AACD,aAAO,gDAAgD,UAAU;AAAA,IACrE,KAAK;AACD,aAAO,wCAAwC,UAAU,SAAS,WAAW;AAAA,IACjF,KAAK;AACD,aAAO,uDAAuD,UAAU;AAAA,IAC5E,KAAK;AACD,aAAO,8BAA8B,UAAU,SAAS,WAAW;AAAA,EAC3E;AACJ;AAIA,IAAM,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MASM;AACF,QAAM,CAAC,MAAM,OAAO,IAAII,WAAS,WAAW;AAC5C,QAAM,UAAU,iBAAiB,QAAQ;AACzC,QAAM,SAAS,cAAc,OAAO;AAEpC,QAAM,OACF,gBAAAJ,MAAC,QAAG,WAAU,eAAc,IAAI,SAC3B,mBAAS,IAAI,CAAC,YACX,gBAAAA,MAAC,QAAG,WAAU,eACV,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACG,gBAAc,aAAa,QAAQ,KAAK,aAAa;AAAA,MACrD,WAAW,CAAC,eAAe,aAAa,QAAQ,KAAK,wBAAwB,EAAE,EAC1E,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACb,MAAM,IAAI,QAAQ,EAAE;AAAA,MACpB,SAAS,CAAC,MAAM;AACZ,UAAE,eAAe;AACjB,mBAAW,QAAQ,EAAE;AAAA,MACzB;AAAA,MAEC,kBAAQ;AAAA;AAAA,EACb,KAb6B,QAAQ,EAczC,CACH,GACL;AAGJ,SACI,gBAAAC,OAAC,SAAI,WAAU,eACV;AAAA,kBACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,WAAU;AAAA,QACV,SAAS,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI;AAAA,QACtC,MAAK;AAAA,QAEL;AAAA,0BAAAD,MAAC,UAAK,WAAU,gBAAgB,oBAAS;AAAA,UACzC,gBAAAA,MAAC,UAAK,WAAW,CAAC,kBAAkB,SAAS,yBAAyB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC9F,0BAAAA,MAACE,kBAAA,EAAgB,GACrB;AAAA;AAAA;AAAA,IACJ,IAEA,gBAAAF,MAAC,SAAI,WAAU,iBACX,0BAAAA,MAAC,UAAK,WAAU,gBAAgB,oBAAS,GAC7C;AAAA,IAEH,UAAU;AAAA,KACf;AAER;AAIA,IAAM,WAAW,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAOM;AACF,QAAM,CAAC,QAAQ,SAAS,IAAII,WAAS,KAAK;AAE1C,QAAM,aAAa,YAAY;AAC3B,cAAU,MAAM;AAChB,QAAI;AACA,UAAI,OAAO,cAAc,eAAe,UAAU,WAAW,WAAW;AACpE,cAAM,UAAU,UAAU,UAAU,QAAQ;AAC5C,kBAAU,IAAI;AACd,eAAO,WAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,MAClD;AAAA,IACJ,QAAQ;AAAA,IAER;AAAA,EACJ;AAEA,SACI,gBAAAH,OAAC,SAAI,WAAU,iBACX;AAAA,oBAAAD,MAAC,UAAK,WAAU,kBAAkB,sBAAW;AAAA,IAC7C,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,cAAY,SAAS,cAAc;AAAA,UACnC,WAAU;AAAA,UACV,SAAS;AAAA,UACT,MAAK;AAAA,UAEJ,mBAAS,gBAAAA,MAACG,YAAA,EAAU,IAAK,gBAAAH,MAAC,SAAI,KAAI,IAAG,WAAU,oBAAmB,KAAK,oBAAe;AAAA;AAAA,MAC3F;AAAA,MACC,UAAU,IAAI,CAAC,aAAa;AACzB,cAAM,OAAO,YAAY,QAAQ;AACjC,eACI,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,cAAY,OAAO,QAAQ;AAAA,YAC3B,WAAU;AAAA,YACV,MAAM,UAAU,UAAU,UAAU,SAAS;AAAA,YAE7C,SAAS,MAAM,UAAU,QAAQ;AAAA,YACjC,KAAI;AAAA,YACJ,QAAO;AAAA,YAEP,0BAAAA,MAAC,SAAI,KAAI,IAAG,WAAU,oBAAmB,KAAK,KAAK,KAAK;AAAA;AAAA,UALnD;AAAA,QAMT;AAAA,MAER,CAAC;AAAA,OACL;AAAA,KACJ;AAER;AAIA,IAAMK,eAAc,CAAC,OAAgC,OAAe,eAAoC;AACpG,MAAI,MAAM,SAAS,WAAW;AAC1B,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,aAAa,UAAU,IAAI,OAAO;AACxC,UAAM,eAAe,UAAU,IAAI,0CAA0C;AAC7E,WACI,gBAAAL,MAAC,cAAW,WAAW,cAAc,IAAI,WAAW,IAAI,KAAK,GACxD,gBAAM,QAD0D,KAErE;AAAA,EAER;AAEA,MAAI,MAAM,SAAS,QAAQ;AACvB,UAAM,UAAU,MAAM,UAAU,OAAO;AACvC,WACI,gBAAAA,MAAC,WAAQ,WAAU,iBACb,iBAAM,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,MAC5B,gBAAAA,MAAC,QAAG,WAAU,qBACT,kBADkC,CAEvC,CACH,KALmC,KAMxC;AAAA,EAER;AAEA,MAAI,MAAM,SAAS,SAAS;AACxB,WACI,gBAAAC,OAAC,gBAAW,WAAU,kBAClB;AAAA,sBAAAD,MAAC,OAAE,WAAU,sBAAsB,gBAAM,MAAK;AAAA,MAC7C,MAAM,QAAQ,gBAAAA,MAAC,UAAK,WAAU,sBAAsB,gBAAM,MAAK;AAAA,SAFxB,KAG5C;AAAA,EAER;AAEA,MAAI,MAAM,SAAS,SAAS;AACxB,WACI,gBAAAC,OAAC,YAAO,WAAU,sBACd;AAAA,sBAAAD,MAAC,SAAI,KAAK,MAAM,YAAY,IAAI,WAAU,kBAAiB,KAAK,MAAM,OAAO;AAAA,MAC5E,MAAM,WAAW,gBAAAA,MAAC,gBAAW,WAAU,oBAAoB,gBAAM,SAAQ;AAAA,SAFlC,KAG5C;AAAA,EAER;AAEA,MAAI,MAAM,SAAS,SAAS;AACxB,WACI,gBAAAA,MAAC,SAAI,WAAU,kBACX,0BAAAA,MAAC,SAAM,UAAQ,MAAC,OAAO,MAAM,SAAS,CAAC,GAAG,OAAO,MAAM,QAAQ,IAAI,SAAS,WAAW,IAAI,KAAK,GAAG,KADlE,KAErC;AAAA,EAER;AAEA,SACI,gBAAAA,MAAC,OAAE,WAAU,sBACR,gBAAM,QAD4B,KAEvC;AAER;AAiBO,IAAM,kBAAkB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC,YAAY,WAAW,YAAY,UAAU;AAAA,EAC/D,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd;AACJ,MAA4B;AACxB,QAAM,aAAaM,SAAQ,MAAM;AAC7B,UAAM,OAAO,oBAAI,IAAoB;AACrC,UAAM,MAAM,oBAAI,IAAoB;AACpC,YAAQ,QAAQ,CAAC,OAAO,MAAM;AAC1B,UAAI,MAAM,SAAS,aAAa,MAAM,SAAS,QAAS;AACxD,YAAM,OAAO,MAAM,OAAO,QAAQ,MAAM,QAAQ,EAAE,KAAK,WAAW,CAAC;AACnE,YAAM,QAAQ,KAAK,IAAI,IAAI,KAAK;AAChC,WAAK,IAAI,MAAM,QAAQ,CAAC;AACxB,UAAI,IAAI,GAAG,UAAU,IAAI,OAAO,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,IACtD,CAAC;AACD,WAAO;AAAA,EACX,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,WAAWA;AAAA,IACb,MACI,QACK,IAAI,CAAC,OAAO,OAAO,EAAE,OAAO,EAAE,EAAE,EAChC;AAAA,MACG,CAAC,EAAE,MAAM,MACL,MAAM,SAAS,WAAY,MAAM,SAAS,cAAc,MAAM,SAAS,OAAO;AAAA,IACtF,EACC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,WAAW,IAAI,CAAC,GAAa,MAAM,MAAM,QAAQ,GAAG,EAAE;AAAA,IAC5F,CAAC,SAAS,UAAU;AAAA,EACxB;AAKA,QAAM,CAAC,UAAU,WAAW,IAAIF,WAAwB,IAAI;AAE5D,EAAAG,YAAU,MAAM;AACZ,QAAI,OAAO,yBAAyB,eAAe,SAAS,WAAW,EAAG;AAE1E,UAAM,WAAW,SACZ,IAAI,CAAC,YAAY,SAAS,eAAe,QAAQ,EAAE,CAAC,EACpD,OAAO,CAAC,OAA0B,OAAO,IAAI;AAClD,QAAI,SAAS,WAAW,EAAG;AAE3B,UAAM,WAAW,IAAI;AAAA,MACjB,CAAC,YAAY;AACT,cAAM,UAAU,QAAQ,OAAO,CAAC,UAAU,MAAM,cAAc;AAC9D,YAAI,QAAQ,WAAW,EAAG;AAC1B,cAAM,UAAU,QAAQ;AAAA,UAAO,CAAC,GAAG,MAC/B,EAAE,mBAAmB,MAAM,EAAE,mBAAmB,MAAM,IAAI;AAAA,QAC9D;AACA,oBAAY,QAAQ,OAAO,EAAE;AAAA,MACjC;AAAA,MACA,EAAE,YAAY,uBAAuB,WAAW,EAAE;AAAA,IACtD;AAEA,aAAS,QAAQ,CAAC,OAAO,SAAS,QAAQ,EAAE,CAAC;AAC7C,WAAO,MAAM,SAAS,WAAW;AAAA,EACrC,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,iBAAiB,CAAC,OAAe;AACnC,gBAAY,EAAE;AACd,UAAM,KAAK,SAAS,eAAe,EAAE;AACrC,QAAI,CAAC,GAAI;AACT,UAAM,uBACF,OAAO,WAAW,eAAe,OAAO,aAAa,kCAAkC,EAAE;AAC7F,OAAG,eAAe,EAAE,UAAU,uBAAuB,SAAS,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC5F;AAEA,QAAM,UAAU,CAAC,WAAW,SAAS,SAAS;AAC9C,QAAM,YAAY,CAAC,aAAa,QAAQ,QAAQ;AAChD,QAAM,oBAAoB,aAAa;AAEvC,SACI,gBAAAP,MAAC,aAAQ,WAAW,CAAC,eAAe,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACzE,0BAAAC,OAAC,SAAI,WAAU,iBAEV;AAAA,eACG,gBAAAD,MAAC,SAAI,WAAU,qBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,aAAW;AAAA,QACX,aAAa;AAAA,QACb;AAAA,QACA,UAAS;AAAA,QACT,YAAY;AAAA,QACZ;AAAA;AAAA,IACJ,GACJ;AAAA,IAGJ,gBAAAC,OAAC,SAAI,WAAU,YACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,YACX;AAAA,wBAAAA,OAAC,YAAO,WAAU,cACb;AAAA,sBAAY,gBAAAD,MAAC,OAAI,OAAO,UAAU,MAAK,MAAK,SAAQ,QAAO;AAAA,UAC5D,gBAAAA,MAAC,QAAG,WAAU,aAAa,iBAAM;AAAA,WAC/B,eAAe,WACb,gBAAAC,OAAC,SAAI,WAAU,YACV;AAAA,sBACG,gBAAAA,OAAC,UAAK,WAAU,kBACX;AAAA,qBAAO,UACJ,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,OAAO,aAAa;AAAA,kBACzB,WAAU;AAAA,kBACV,KAAK,OAAO;AAAA;AAAA,cAChB;AAAA,cAEJ,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,iBAAO,MAAK;AAAA,eAClD;AAAA,YAEH,eAAe,gBAAAA,MAAC,UAAK,WAAU,gBAAgB,uBAAY;AAAA,aAChE;AAAA,WAER;AAAA,QAEC,aACG,gBAAAA,MAAC,SAAI,WAAU,qBACX,0BAAAA,MAAC,SAAI,KAAK,gBAAgB,IAAI,WAAU,iBAAgB,KAAK,WAAW,GAC5E;AAAA,QAGJ,gBAAAA,MAAC,SAAI,WAAU,eACV,kBAAQ,IAAI,CAAC,OAAO,UAAUK,aAAY,OAAO,OAAO,UAAU,CAAC,GACxE;AAAA,QAGC,aACG,gBAAAL,MAAC,SAAI,WAAU,uBACX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX,WAAW;AAAA,YACX;AAAA,YACA;AAAA;AAAA,QACJ,GACJ;AAAA,SAER;AAAA,OAEE,WAAW,cACT,gBAAAA,MAAC,WAAM,WAAU,eACb,0BAAAC,OAAC,SAAI,WAAU,qBACV;AAAA,mBACG,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,aAAa;AAAA,YACb,aAAa;AAAA,YACb;AAAA,YACA,UAAS;AAAA,YACT,YAAY;AAAA,YACZ;AAAA;AAAA,QACJ;AAAA,QAEH,aACG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX,WAAW;AAAA,YACX;AAAA,YACA;AAAA;AAAA,QACJ;AAAA,SAER,GACJ;AAAA,OAER;AAAA,KACJ,GACJ;AAER;;;ACxdA,SAAS,UAAAQ,gBAAc;AACvB,SAAS,UAAAC,SAAQ,aAAAC,YAAW,aAAAC,YAAW,gBAAAC,eAAc,wBAAwB;AAyFzD,SACI,OAAAC,OADJ,QAAAC,cAAA;AApFb,IAAM,+BAA+B;AAAA,EACxC,OAAO;AAAA,EACP,aACI;AAAA,EACJ,UAAU;AACd;AAEO,IAAM,wBAAqD;AAAA,EAC9D;AAAA,IACI,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aACI;AAAA,EACR;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,aACI;AAAA,EACR;AACJ;AAEA,IAAMC,qBACF;AAIJ,IAAM,cAAc;AAKpB,IAAM,kBAAkB,EAAE,WAAW,IAAI,SAAS,IAAI,WAAW,KAAM;AAEhE,IAAM,iBAAiB,CAAC;AAAA,EAC3B,UAAU;AAAA,EACV,QAAQ,6BAA6B;AAAA,EACrC,cAAc,6BAA6B;AAAA,EAC3C,WAAW,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA,WAAWA;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB;AAAA,EACA,GAAG;AACP,MAA2B;AACvB,QAAM,aAAaC,SAAoB,IAAI;AAC3C,QAAM,uBAAuB,iBAAiB;AAC9C,QAAM,iBAAiB,kBAAkB,CAAC;AAC1C,QAAM,YAAY,YAAY,iBAAiB,MAAM,SAAS;AAI9D,QAAM,EAAE,gBAAgB,IAAIC,WAAU;AAAA,IAClC,QAAQ;AAAA,IACR,QAAQ,CAAC,aAAa,WAAW;AAAA,EACrC,CAAC;AACD,QAAM,iBAAiBC,WAAU,iBAAiB,eAAe;AACjE,QAAM,YAAYC,cAAa,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,aAAa,WAAW,CAAC;AAElF,SACI,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW;AAAA,QACP;AAAA,QACA,YAAY,gBAAgB,iCAAiC;AAAA,QAC7D;AAAA,MACJ,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACZ,GAAG;AAAA,MAEJ,0BAAAC,OAAC,SAAI,WAAU,0BACX;AAAA,wBAAAA,OAAC,SAAI,WAAU,yBACX;AAAA,0BAAAA,OAAC,SAAI,WAAU,4BACX;AAAA,4BAAAD,MAAC,QAAG,WAAU,0BAA0B,iBAAM;AAAA,YAE7C,eACG,gBAAAA,MAAC,OAAE,WAAU,gCAAgC,uBAAY;AAAA,YAG5D,YACG,gBAAAA,MAAC,SAAI,WAAU,4BACX,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,aAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,aAAW;AAAA,gBACX,WAAU;AAAA;AAAA,YACd,GACJ;AAAA,aAER;AAAA,UAEC,YACG,gBAAAA,MAAC,SAAI,WAAU,kCACX,0BAAAA;AAAA,YAACO,QAAO;AAAA,YAAP;AAAA,cACG,KAAK;AAAA,cACL,KAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAQ;AAAA,cACR,OAAO,iBAAiB,EAAE,GAAG,UAAU,IAAI;AAAA;AAAA,UAC/C,GACJ;AAAA,WAER;AAAA,QAEC,aACG,gBAAAP,MAAC,SAAI,WAAU,0BAAyB,MAAK,QACxC,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,MAAK;AAAA,YAGL;AAAA,8BAAAD,MAAC,QAAG,WAAU,+BAA+B,eAAK,OAAM;AAAA,cACxD,gBAAAA,MAAC,OAAE,WAAU,qCACR,eAAK,aACV;AAAA;AAAA;AAAA,UALK,GAAG,KAAK,KAAK,IAAI,KAAK;AAAA,QAM/B,CACH,GACL;AAAA,SAER;AAAA;AAAA,EACJ;AAER;;;AC/IA,SAAS,eAAAQ,cAAa,aAAAC,aAAW,SAAAC,QAAO,WAAAC,UAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AAkOrE,SAiHgB,YAAAC,YAhHZ,OAAAC,OADJ,QAAAC,cAAA;AAvNG,IAAM,2BACT;AACG,IAAM,+BAA+B;AAE5C,IAAM,MAAM;AACZ,IAAM,qBAAqB;AAI3B,IAAM,iBAAiB,IAAI,KAAK,aAAa,SAAS;AAAA,EAClD,uBAAuB;AAAA,EACvB,uBAAuB;AAC3B,CAAC;AACD,IAAM,mBAAmB,IAAI,KAAK,aAAa,SAAS,EAAE,uBAAuB,EAAE,CAAC;AAEpF,IAAM,cAAc,CAAC,UACjB,UAAU,QAAQ,OAAO,MAAM,KAAK,IAAI,QAAQ,KAAK,eAAe,OAAO,KAAK,CAAC;AAErF,IAAM,gBAAgB,CAAC,UACnB,OAAO,MAAM,KAAK,IAAI,QAAQ,KAAK,iBAAiB,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC;AAIjF,SAAS,eACL,QACA,cACA,YACA,OACwB;AACxB,QAAM,UAAU,CAAC,aAA6B;AAC1C,QAAI,aAAa,IAAK,QAAO;AAC7B,UAAM,OAAO,QAAQ,QAAQ;AAC7B,WAAO,OAAO,IAAI,OAAO;AAAA,EAC7B;AAEA,QAAM,sBAAsB,QAAQ,OAAO,eAAe;AAC1D,QAAM,sBAAsB,QAAQ,OAAO,aAAa;AAExD,QAAM,cACF,OAAO,WAAW,UACZ,eAAe,OAAO,gBAAgB,sBACtC,eAAe,OAAO,gBAAgB,sBAAsB;AAEtE,QAAM,iBAAiB,cAAc,OAAO;AAE5C,QAAM,WAAW,OAAO,UAAU,KAAK,EAAE,YAAY;AACrD,MAAI,iBAAgC;AACpC,MAAI,kBAAiC;AAErC,MAAI,aAAa,aAAa;AAC1B,qBACI,eAAe,OAAO,gBAAgB,OAAO,aAAa,OAAO,iBAAiB;AACtF,sBACI,eAAe,OAAO,gBAAgB,OAAO,aAAa,OAAO,kBAAkB;AAAA,EAC3F,WAAW,aAAa,mDAAmD;AACvE,qBACM,eAAe,OAAO,gBAAgB,cAAc,OAAO,iBAAiB,OAAQ,MACtF;AACJ,sBACM,eAAe,OAAO,gBAAgB,cAAc,OAAO,kBAAkB,OAAQ,MACvF;AAAA,EACR;AAEA,QAAM,WAAW,OAAO,WAAW,eAAe,OAAO,gBAAgB;AAEzE,SAAO,EAAE,gBAAgB,aAAa,UAAU,gBAAgB,gBAAgB;AACpF;AAQA,SAAS,iBAAiB,OAAkC;AACxD,QAAM,YAAYC,SAAyB,IAAI;AAC/C,QAAM,WAAWA,SAAO,CAAC;AACzB,QAAM,aAAaA;AAAA,IACf,oBAAI,IAAkG;AAAA,EAC1G;AACA,QAAM,WAAWA,SAAO,oBAAI,IAAkE,CAAC;AAE/F,EAAAC,YAAU,MAAM;AACZ,UAAM,UAAU,WAAW;AAC3B,WAAO,MAAM;AACT,gBAAU,SAAS,MAAM;AACzB,gBAAU,UAAU;AACpB,cAAQ,QAAQ,CAAC,UAAU,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC,CAAC;AACzE,cAAQ,MAAM;AAAA,IAClB;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,WAAWC;AAAA,IACb,CAAC,iBAA0D;AACvD,UAAI,CAAC,MAAO,QAAO,QAAQ,OAAO,IAAI,MAAM,2CAA2C,CAAC;AAExF,YAAM,SAAS,SAAS,QAAQ,IAAI,YAAY;AAChD,UAAI,UAAU,KAAK,IAAI,IAAI,OAAO,YAAY,oBAAoB;AAC9D,eAAO,QAAQ,QAAQ,OAAO,KAAK;AAAA,MACvC;AAEA,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,cAAM,cAAc,CAAC,WAAsB;AACvC,gBAAM,QAAQ,SAAS;AACvB,qBAAW,QAAQ,IAAI,OAAO;AAAA,YAC1B,SAAS,CAAC,UAAU;AAChB,uBAAS,QAAQ,IAAI,cAAc,EAAE,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;AACnE,sBAAQ,KAAK;AAAA,YACjB;AAAA,YACA;AAAA,UACJ,CAAC;AACD,iBAAO,KAAK,KAAK,UAAU,EAAE,gBAAgB,GAAG,eAAe,cAAc,QAAQ,MAAM,CAAC,CAAC;AAAA,QACjG;AAEA,cAAM,WAAW,UAAU;AAC3B,cAAM,iBAAiB,CAAC,YAAY,SAAS,eAAe,UAAU,UAAU,SAAS,eAAe,UAAU;AAElH,YAAI,kBAAkB,CAAC,UAAU;AAC7B,gBAAM,SAAS,IAAI,UAAU,KAAK;AAClC,oBAAU,UAAU;AAEpB,iBAAO,YAAY,CAAC,UAAU;AAC1B,gBAAI;AACJ,gBAAI;AACA,qBAAO,KAAK,MAAM,MAAM,IAAc;AAAA,YAC1C,QAAQ;AACJ;AAAA,YACJ;AACA,gBAAI,KAAK,UAAU,KAAM;AACzB,kBAAM,QAAQ,WAAW,QAAQ,IAAI,KAAK,MAAM;AAChD,gBAAI,CAAC,MAAO;AACZ,uBAAW,QAAQ,OAAO,KAAK,MAAM;AACrC,gBAAI,KAAK,OAAO;AACZ,oBAAM,OAAO,IAAI,MAAM,KAAK,MAAM,WAAW,8BAA8B,CAAC;AAAA,YAChF,OAAO;AACH,oBAAM,QAAQ,KAAK,gBAAgB,SAAS,CAAC,CAAC;AAAA,YAClD;AAAA,UACJ;AAEA,iBAAO,UAAU,MAAM;AACnB,uBAAW,QAAQ,QAAQ,CAAC,UAAU,MAAM,OAAO,IAAI,MAAM,iCAAiC,CAAC,CAAC;AAChG,uBAAW,QAAQ,MAAM;AAAA,UAC7B;AAEA,iBAAO,SAAS,MAAM,YAAY,MAAM;AAAA,QAC5C,WAAW,SAAS,eAAe,UAAU,MAAM;AAC/C,sBAAY,QAAQ;AAAA,QACxB,OAAO;AACH,gBAAM,iBAAiB,SAAS;AAChC,mBAAS,SAAS,CAAC,UAAU;AACzB,gBAAI,OAAO,mBAAmB,WAAY,gBAAe,KAAK,UAAU,KAAK;AAC7E,wBAAY,QAAQ;AAAA,UACxB;AAAA,QACJ;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA,CAAC,KAAK;AAAA,EACV;AAEA,SAAO;AACX;AAWA,SAAS,WAAW,aAA8C,UAA8C;AAC5G,QAAM,CAAC,OAAO,QAAQ,IAAIC;AAAA,IACtB,cAAc,EAAE,QAAQ,SAAS,MAAM,YAAY,IAAI,EAAE,QAAQ,UAAU;AAAA,EAC/E;AACA,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,CAAC;AAE9C,EAAAF,YAAU,MAAM;AACZ,QAAI,aAAa;AACb,eAAS,EAAE,QAAQ,SAAS,MAAM,YAAY,CAAC;AAC/C;AAAA,IACJ;AACA,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI,YAAY;AAChB,aAAS,EAAE,QAAQ,UAAU,CAAC;AAE9B,UAAM,QAAQ,EACT,KAAK,CAAC,aAAa;AAChB,UAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AACjF,aAAO,SAAS,KAAK;AAAA,IACzB,CAAC,EACA,KAAK,CAAC,SAA8B;AACjC,UAAI,UAAW;AACf,eAAS,EAAE,QAAQ,SAAS,KAAK,CAAC;AAAA,IACtC,CAAC,EACA,MAAM,CAAC,UAAiB;AACrB,UAAI,UAAW;AACf,eAAS,EAAE,QAAQ,SAAS,SAAS,MAAM,WAAW,yBAAyB,CAAC;AAAA,IACpF,CAAC;AAEL,WAAO,MAAM;AACT,kBAAY;AAAA,IAChB;AAAA,EAEJ,GAAG,CAAC,aAAa,UAAU,UAAU,CAAC;AAEtC,QAAM,QAAQC,aAAY,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/D,SAAO,CAAC,OAAO,KAAK;AACxB;AAKA,IAAM,YAAY,MACd,gBAAAH,OAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACpE;AAAA,kBAAAD,MAAC,UAAK,GAAE,2BAA0B,QAAO,gBAAe,aAAY,OAAM,gBAAe,SAAQ;AAAA,EACjG,gBAAAA,MAAC,UAAK,GAAE,YAAW,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,EACjF,gBAAAA,MAAC,YAAO,IAAG,KAAI,IAAG,QAAO,GAAE,QAAO,MAAK,gBAAe;AAAA,GAC1D;AAGJ,IAAMM,eAAc,MAChB,gBAAAN,MAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACpE,0BAAAA,MAAC,UAAK,GAAE,sBAAqB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,GACtH;AAsBJ,SAAS,kBAAkB,SAA+D;AACtF,QAAM,SAAS,oBAAI,IAAiC;AACpD,aAAW,QAAQ,SAAS;AACxB,UAAM,OAAO,OAAO,IAAI,KAAK,WAAW,KAAK,CAAC;AAC9C,SAAK,KAAK,IAAI;AACd,WAAO,IAAI,KAAK,aAAa,IAAI;AAAA,EACrC;AACA,aAAW,QAAQ,OAAO,OAAO,GAAG;AAChC,SAAK,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAAA,EACxD;AACA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC;AAC/B;AAEA,IAAM,iBAAiB,CAAC,EAAE,cAAc,SAAS,UAAU,UAAU,OAAO,QAAQ,MAA2B;AAC3G,QAAM,CAAC,OAAO,QAAQ,IAAIK,WAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,EAAE;AACjD,QAAM,aAAaH,SAAuB,IAAI;AAC9C,QAAM,YAAYK,OAAM;AAExB,QAAM,YAAY,aAAa,WAAW;AAC1C,QAAM,UAAU,aAAa,WAAW;AACxC,QAAM,aAAa,aAAa,WAAW,UAAU,aAAa,OAAO,CAAC;AAE1E,QAAM,WAAWC,SAAQ,MAAM;AAC3B,UAAM,OAAO,MAAM,KAAK,EAAE,YAAY;AACtC,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,WAAW;AAAA,MACd,CAAC,SACG,KAAK,OAAO,YAAY,EAAE,SAAS,IAAI,KACvC,KAAK,YAAY,YAAY,EAAE,SAAS,IAAI,KAC5C,KAAK,YAAY,YAAY,EAAE,SAAS,IAAI;AAAA,IACpD;AAAA,EACJ,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtB,QAAM,UAAUA,SAAQ,MAAM,kBAAkB,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACrE,QAAM,cAAcA,SAAQ,MAAM,QAAQ,QAAQ,CAAC,CAAC,EAAE,KAAK,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC;AAElF,EAAAL,YAAU,MAAM;AACZ,QAAI,CAAC,OAAQ;AACb,UAAM,oBAAoB,CAAC,UAAsB;AAC7C,UAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC1E,kBAAU,KAAK;AAAA,MACnB;AAAA,IACJ;AACA,aAAS,iBAAiB,aAAa,iBAAiB;AACxD,WAAO,MAAM,SAAS,oBAAoB,aAAa,iBAAiB;AAAA,EAC5E,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAe,SAAS,QAAQ,WAAW,GAAG,SAAS,MAAM,WAAM,SAAS,WAAW,KAAK;AAElG,QAAM,SAAS,CAAC,SAA4B;AACxC,aAAS,IAAI;AACb,aAAS,EAAE;AACX,cAAU,KAAK;AACf,mBAAe,EAAE;AAAA,EACrB;AAEA,QAAM,gBAAgB,CAAC,UAAiD;AACpE,QAAI,MAAM,QAAQ,aAAa;AAC3B,YAAM,eAAe;AACrB,gBAAU,IAAI;AACd,qBAAe,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,YAAY,SAAS,CAAC,CAAC;AAAA,IACjE,WAAW,MAAM,QAAQ,WAAW;AAChC,YAAM,eAAe;AACrB,qBAAe,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAC5C,WAAW,MAAM,QAAQ,SAAS;AAC9B,UAAI,UAAU,eAAe,KAAK,YAAY,WAAW,GAAG;AACxD,cAAM,eAAe;AACrB,eAAO,YAAY,WAAW,CAAC;AAAA,MACnC;AAAA,IACJ,WAAW,MAAM,QAAQ,UAAU;AAC/B,gBAAU,KAAK;AAAA,IACnB;AAAA,EACJ;AAEA,SACI,gBAAAF,OAAC,SAAI,WAAU,eAAc,KAAK,YAC9B;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,IAAI;AAAA,QACJ,OACI,gBAAAC,OAAAF,YAAA,EAAE;AAAA;AAAA,UACU,gBAAAC,MAAC,UAAK,WAAU,kBAAiB,eAAC;AAAA,WAC9C;AAAA,QAEJ,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,qBAAkB;AAAA,QAClB,yBACI,UAAU,eAAe,IAAI,GAAG,SAAS,IAAI,WAAW,KAAK;AAAA,QAEjE,gBAAc,QAAQ,KAAK;AAAA,QAC3B,QAAQ,QAAQ,SAAS;AAAA,QACzB,gBAAgB;AAAA,QAChB,cAAa;AAAA,QACb,UAAU,aAAa;AAAA,QACvB,iBAAe;AAAA,QACf,cAAc,gBAAAA,MAACM,cAAA,EAAY;AAAA,QAC3B,aAAa,YAAY,0BAAqB,UAAU,wBAAwB;AAAA,QAChF,OAAO;AAAA,QACP,SAAS,MAAM,UAAU,IAAI;AAAA,QAC7B,UAAU,CAAC,UAAU;AACjB,mBAAS,MAAM,OAAO,KAAK;AAC3B,oBAAU,IAAI;AACd,yBAAe,EAAE;AAAA,QACrB;AAAA,QACA,WAAW;AAAA;AAAA,IACf;AAAA,IAEC,UAAU,CAAC,aAAa,CAAC,WACtB,gBAAAL,OAAC,SAAI,WAAU,kBAAiB,IAAI,WAAW,MAAK,WAC/C;AAAA,cAAQ,WAAW,KAAK,gBAAAA,OAAC,OAAE,WAAU,uBAAsB;AAAA;AAAA,QAAmB;AAAA,QAAM;AAAA,SAAC;AAAA,MACrF,QAAQ,IAAI,CAAC,CAAC,YAAY,KAAK,MAC5B,gBAAAA,OAAC,SAAI,WAAU,uBACX;AAAA,wBAAAD,MAAC,OAAE,WAAU,4BAA4B,sBAAW;AAAA,QACnD,MAAM,IAAI,CAAC,SAAS;AACjB,gBAAM,YAAY,YAAY,QAAQ,IAAI;AAC1C,iBACI,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACG,WAAW;AAAA,gBACP;AAAA,gBACA,cAAc,cAAc,iCAAiC;AAAA,cACjE,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACb,IAAI,GAAG,SAAS,IAAI,SAAS;AAAA,cAE7B,MAAK;AAAA,cACL,iBAAe,UAAU,WAAW,KAAK;AAAA,cACzC,aAAa,CAAC,UAAU;AACpB,sBAAM,eAAe;AACrB,uBAAO,IAAI;AAAA,cACf;AAAA,cACA,cAAc,MAAM,eAAe,SAAS;AAAA,cAE5C;AAAA,gCAAAD,MAAC,UAAK,WAAU,wBAAwB,eAAK,QAAO;AAAA,gBACpD,gBAAAA,MAAC,UAAK,WAAU,sBAAsB,eAAK,aAAY;AAAA;AAAA;AAAA,YAVlD,KAAK;AAAA,UAWd;AAAA,QAER,CAAC;AAAA,WA1BqC,UA2B1C,CACH;AAAA,OACL;AAAA,IAGH,WACG,gBAAAC,OAAC,OAAE,WAAU,oBACT;AAAA,sBAAAD,MAAC,aAAU;AAAA,MAAE;AAAA,MAAyB;AAAA,MACtC,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAU,mBAAkB,SAAS,SAAS,mBAEpE;AAAA,OACJ;AAAA,IAEH,CAAC,WAAW,SACT,gBAAAC,OAAC,OAAE,WAAU,oBACT;AAAA,sBAAAD,MAAC,aAAU;AAAA,MAAE;AAAA,MAAE;AAAA,OACnB;AAAA,KAER;AAER;AAIA,IAAM,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA,YAAY;AAChB,MAKI,gBAAAC,OAAC,OAAE,WAAU,iBACT;AAAA,kBAAAD,MAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,EACxC,cAAc,MAAM,QAAQ;AAAA,EAC7B,gBAAAA,MAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,GAC7C;AAGJ,IAAM,YAAY,CAAC,EAAE,OAAO,MAAM,MAC9B,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,kBAAAD,MAAC,OAAE,WAAU,qBAAqB,iBAAM;AAAA,EACxC,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,iBAAM;AAAA,GAC5C;AAoBG,IAAM,oBAAoB,CAAC;AAAA,EAC9B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAA8B;AAC1B,QAAM,aAAa,YAAY,UAAU,YAAY;AACrD,QAAM,UAAU,YAAY,UAAU,YAAY;AAClD,QAAM,WAAW,YAAY,UAAU,YAAY;AACnD,QAAM,kBAAkB,YAAY;AACpC,QAAM,CAAC,cAAc,YAAY,IAAI,WAAW,aAAa,eAAe;AAC5E,QAAM,WAAW,iBAAiB,iBAAiB;AAEnD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIK,WAAmC,IAAI;AACnF,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,EAAE;AACnD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,EAAE;AAC/C,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAA+D,CAAC,CAAC;AAC7F,QAAM,CAAC,SAAS,UAAU,IAAIA,WAA0C,IAAI;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAwB,IAAI;AAC9D,QAAM,eAAeH,SAAO,KAAK;AAEjC,EAAAC,YAAU,MAAM;AACZ,QAAI,aAAa,WAAW,CAAC,iBAAiB,aAAa,WAAW,QAAS;AAC/E,UAAM,QAAQ,aAAa,KAAK,KAAK,CAAC,SAAS,KAAK,WAAW,aAAa;AAC5E,QAAI,OAAO;AACP,mBAAa,UAAU;AACvB,wBAAkB,KAAK;AACvB,oBAAc,OAAO,MAAM,QAAQ,CAAC;AAAA,IACxC;AAAA,EACJ,GAAG,CAAC,eAAe,YAAY,CAAC;AAEhC,QAAM,qBAAqB,CAAC,WAA8B;AACtD,sBAAkB,MAAM;AACxB,kBAAc,OAAO,OAAO,QAAQ,CAAC;AACrC,oBAAgB,EAAE;AAClB,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,cAAU,CAAC,UAAU,EAAE,GAAG,MAAM,QAAQ,OAAU,EAAE;AAAA,EACxD;AAEA,QAAM,cAAc,MAAM;AACtB,sBAAkB,IAAI;AACtB,oBAAgB,EAAE;AAClB,kBAAc,EAAE;AAChB,eAAW,IAAI;AACf,cAAU,CAAC,CAAC;AACZ,iBAAa,IAAI;AAAA,EACrB;AAEA,QAAM,kBAAkB,YAAY;AAChC,UAAM,SAAS,OAAO,WAAW,YAAY;AAC7C,UAAM,QAAQ,OAAO,WAAW,UAAU;AAC1C,UAAM,aAA4B,CAAC;AAEnC,QAAI,CAAC,eAAgB,YAAW,SAAS;AACzC,QAAI,CAAC,gBAAgB,OAAO,MAAM,MAAM,GAAG;AACvC,iBAAW,SAAS;AAAA,IACxB,WAAW,UAAU,GAAG;AACpB,iBAAW,SAAS;AAAA,IACxB,WAAW,mBAAmB,SAAS,eAAe,cAAc,SAAS,eAAe,eAAe;AACvG,iBAAW,SAAS,0BAA0B,eAAe,UAAU,QAAQ,eAAe,YAAY;AAAA,IAC9G;AACA,QAAI,CAAC,cAAc,OAAO,MAAM,KAAK,KAAK,SAAS,EAAG,YAAW,QAAQ;AAEzE,cAAU,UAAU;AACpB,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC,eAAgB;AAE3D,iBAAa,IAAI;AACjB,qBAAiB,IAAI;AACrB,QAAI;AACA,YAAM,kBAAkB,eAAe,oBAAoB,OAAO,eAAe,kBAAkB;AACnG,YAAM,QAAQ,kBAAkB,MAAM,SAAS,GAAG,IAAI;AACtD,iBAAW,eAAe,gBAAgB,QAAQ,OAAO,KAAK,CAAC;AAAA,IACnE,SAAS,OAAO;AACZ;AAAA,QACI,iBAAiB,QACX,wCAAwC,MAAM,OAAO,yBACrD;AAAA,MACV;AAAA,IACJ,UAAE;AACE,uBAAiB,KAAK;AAAA,IAC1B;AAAA,EACJ;AAEA,QAAM,gBAAgBI,OAAM;AAC5B,QAAM,gBAAgBA,OAAM;AAC5B,QAAM,eAAeA,OAAM;AAE3B,SACI,gBAAAP,MAAC,aAAQ,WAAW,CAAC,iBAAiB,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAClF,0BAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAC,OAAC,SAAI,WAAU,cAEX;AAAA,oBAAAA,OAAC,SAAI,WAAU,gBACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,oBAAmB,wBAAU;AAAA,MAE3C,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd,SAAS;AAAA;AAAA,MACb;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,wBAAAD,MAAC,WAAQ,OAAM,iBAAgB,OAAO,iBAAiB,iBAAiB,OAAO,eAAe,aAAa,IAAI,KAAK;AAAA,QACpH,gBAAAA,MAAC,WAAQ,OAAM,YAAW,OAAO,iBAAiB,OAAO,eAAe,QAAQ,IAAI,KAAK;AAAA,QACzF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN,OAAO,iBAAiB,OAAO,KAAK,OAAO,eAAe,qBAAqB,OAAO,WAAW,GAAG,IAAI,GAAG,KAAK;AAAA;AAAA,QACpH;AAAA,QACA,gBAAAA,MAAC,WAAQ,OAAM,cAAa,OAAO,iBAAiB,OAAO,eAAe,UAAU,IAAI,KAAK;AAAA,SACjG;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,eACX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,IAAI;AAAA,YACJ,WAAU;AAAA,YACV,OACI,gBAAAC,OAAAF,YAAA,EAAE;AAAA;AAAA,cACiB,gBAAAC,MAAC,UAAK,WAAU,kBAAiB,eAAC;AAAA,eACrD;AAAA,YAEJ,QAAQ,OAAO,SAAS,SAAS;AAAA,YACjC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc,QAAQ,OAAO,MAAM;AAAA,YACnC,OAAO;AAAA,YACP,UAAU,CAAC,UAAU;AACjB,oBAAM,QAAQ,MAAM,OAAO;AAC3B,8BAAgB,KAAK;AACrB,oBAAM,SAAS,OAAO,WAAW,KAAK;AACtC,oBAAM,aAAa,UAAU,MAAM,CAAC,OAAO,MAAM,MAAM,KAAK,UAAU;AACtE,wBAAU,CAAC,UAAU;AAAA,gBACjB,GAAG;AAAA,gBACH,QAAQ,aAAa,mCAAmC;AAAA,cAC5D,EAAE;AAAA,YACN;AAAA;AAAA,QACJ;AAAA,QACC,OAAO,UACJ,gBAAAC,OAAC,OAAE,WAAU,oBACT;AAAA,0BAAAD,MAAC,aAAU;AAAA,UAAE;AAAA,UAAE,OAAO;AAAA,WAC1B;AAAA,SAER;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,eACX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,IAAI;AAAA,YACJ,WAAU;AAAA,YACV,OACI,gBAAAC,OAAAF,YAAA,EAAE;AAAA;AAAA,cACc,gBAAAC,MAAC,UAAK,WAAU,kBAAiB,eAAC;AAAA,eAClD;AAAA,YAEJ,QAAQ,OAAO,QAAQ,SAAS;AAAA,YAChC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc,QAAQ,OAAO,KAAK;AAAA,YAClC,OAAO;AAAA,YACP,UAAU,CAAC,UAAU;AACjB,4BAAc,MAAM,OAAO,KAAK;AAChC,wBAAU,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,OAAU,EAAE;AAAA,YACvD;AAAA;AAAA,QACJ;AAAA,QACC,OAAO,SACJ,gBAAAC,OAAC,OAAE,WAAU,oBACT;AAAA,0BAAAD,MAAC,aAAU;AAAA,UAAE;AAAA,UAAE,OAAO;AAAA,WAC1B;AAAA,SAER;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,SAAQ;AAAA,YACR,OAAO,gBAAgB,sBAAiB;AAAA,YACxC,SAAS;AAAA,YACT,UAAU;AAAA,YACV,WAAS;AAAA;AAAA,QACb;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,SAAS;AAAA,YACT,WAAS;AAAA;AAAA,QACb;AAAA,SACJ;AAAA,OACJ;AAAA,IAOA,gBAAAC,OAAC,SAAI,WAAU,sCACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,oBAAmB,qBAAO;AAAA,MAEvC,cACG,gBAAAA,MAAC,aAAU,OAAM,mBAAkB,OAAO,UAAU,YAAY,QAAQ,cAAc,IAAI,KAAK;AAAA,MAGlG,mBAAmB,WAChB,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,wBAAAD,MAAC,aAAU,OAAM,gBAAe,OAAO,UAAU,cAAc,QAAQ,WAAW,IAAI,KAAK;AAAA,QAC3F,gBAAAA,MAAC,aAAU,OAAM,aAAY,OAAO,UAAU,YAAY,QAAQ,QAAQ,IAAI,KAAK;AAAA,SACvF;AAAA,MAGH,CAAC,mBAAmB,WACjB,gBAAAA,MAAC,aAAU,OAAM,aAAY,OAAO,UAAU,YAAY,QAAQ,QAAQ,IAAI,KAAK;AAAA,MAGtF,YACG,gBAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,wBAAAD,MAAC,aAAU,OAAM,oBAAmB,OAAO,UAAU,YAAY,QAAQ,cAAc,IAAI,KAAK;AAAA,QAChG,gBAAAA,MAAC,aAAU,OAAM,qBAAoB,OAAO,UAAU,YAAY,QAAQ,eAAe,IAAI,KAAK;AAAA,SACtG;AAAA,MAGH,aACG,gBAAAC,OAAC,OAAE,WAAU,oCACT;AAAA,wBAAAD,MAAC,aAAU;AAAA,QAAE;AAAA,QAAE;AAAA,SACnB;AAAA,MAGH,YACG,gBAAAC,OAAAF,YAAA,EACI;AAAA,wBAAAE,OAAC,SAAI,WAAU,kBACX;AAAA,0BAAAD,MAAC,WAAQ,OAAM,kBAAiB,OAAO,iBAAiB,OAAO,eAAe,cAAc,IAAI,KAAK;AAAA,UACrG,gBAAAA,MAAC,WAAQ,OAAM,mBAAkB,OAAO,iBAAiB,OAAO,eAAe,eAAe,IAAI,KAAK;AAAA,WAC3G;AAAA,QAEA,gBAAAA,MAAC,WAAQ,WAAU,KAAI,OAAM,yBAAwB,OAAO,iBAAiB,eAAe,YAAY,KAAK;AAAA,QAC7G,gBAAAA,MAAC,WAAQ,WAAU,KAAI,OAAM,kBAAiB,OAAO,iBAAiB,eAAe,kBAAkB,OAAO,KAAK;AAAA,QACnH,gBAAAA,MAAC,WAAQ,WAAU,KAAI,OAAM,iBAAgB,OAAO,iBAAiB,OAAO,eAAe,iBAAiB,GAAG,IAAI,KAAK;AAAA,SAC5H;AAAA,OAER;AAAA,KACJ,GACJ,GACJ;AAER;;;AC9sBA,SAAS,YAAAS,YAAU,aAAAC,aAAW,mBAAAC,kBAAiB,UAAAC,UAAQ,YAAAC,kBAAgB;AAkNxD,SAgHiB,YAAAC,YAhHjB,OAAAC,OAOS,QAAAC,cAPT;AAlLf,IAAM,iBAA+B;AAAA,EACjC,OAAO;AAAA,EACP,aACI;AAAA,EACJ,gBAAgB;AAAA,EAChB,eAAe;AAAA,IACX,EAAE,MAAM,QAAQ,SAAS,oDAAiD;AAAA,IAC1E,EAAE,MAAM,YAAY,SAAS,mEAAmE;AAAA,IAChG,EAAE,MAAM,QAAQ,SAAS,uDAAuD;AAAA,IAChF;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,QACH,EAAE,MAAM,SAAS,SAAS,kCAAkC;AAAA,QAC5D,EAAE,MAAM,SAAS,SAAS,qDAAqD;AAAA,MACnF;AAAA,IACJ;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,EACJ;AAAA,EACA,gBAAgB;AAAA,EAChB,cACI;AAAA,EACJ,cAAc;AAAA,IACV;AAAA,MACI,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,MAC9B,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,gBAAgB;AAAA,MAC1C,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,aAAa;AAAA,MACvC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,YAAY,OAAO,SAAS;AAAA,IACxC;AAAA,IACA;AAAA,MACI,EAAE,MAAM,YAAY,OAAO,SAAS;AAAA,MACpC,EAAE,MAAM,OAAI;AAAA,MACZ,EAAE,MAAM,SAAS,OAAO,WAAW;AAAA,MACnC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,SAAS,OAAO,kBAAkB;AAAA,IAC9C;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,EACZ,MAAM;AACV;AAEA,IAAM,cAA4B;AAAA,EAC9B,OAAO;AAAA,EACP,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,eAAe;AAAA,IACX,EAAE,MAAM,QAAQ,SAAS,6DAA6D;AAAA,IACtF;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,EACJ;AAAA,EACA,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,IACV;AAAA,MACI,EAAE,MAAM,UAAU,OAAO,WAAW;AAAA,MACpC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,MAC9B,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,gBAAgB;AAAA,MAC1C,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,aAAa;AAAA,MACvC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,oBAAoB,OAAO,YAAY;AAAA,IACnD;AAAA,EACJ;AAAA,EACA,YACI;AAAA,EACJ,MAAM;AACV;AAEA,IAAM,sBAAoC;AAAA,EACtC,OAAO;AAAA,EACP,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,eAAe;AAAA,IACX,EAAE,MAAM,QAAQ,SAAS,oEAAoE;AAAA,IAC7F;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,EACJ;AAAA,EACA,gBAAgB;AAAA,EAChB,cACI;AAAA,EACJ,cAAc;AAAA,IACV;AAAA,MACI,EAAE,MAAM,OAAO,OAAO,OAAO;AAAA,MAC7B,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,gBAAgB;AAAA,MAC1C,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,SAAS,OAAO,aAAa;AAAA,MACrC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,MACrC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,aAAa;AAAA,MACvC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,aAAa,OAAO,OAAO;AAAA,IACvC;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,EACZ,MAAM;AACV;AAEA,IAAM,0BAAwC;AAAA,EAC1C,GAAG;AAAA,EACH,eAAe;AAAA,IACX,EAAE,MAAM,QAAQ,SAAS,8FAAwF;AAAA,IACjH;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,SACI;AAAA,IACR;AAAA,EACJ;AAAA,EACA,cACI;AAAA,EACJ,cAAc;AAAA,IACV;AAAA,MACI,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,MAC9B,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,KAAK,OAAO,gBAAgB;AAAA,MACpC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,UAAU,OAAO,iBAAiB;AAAA,MAC1C,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,oBAAiB,OAAO,YAAY;AAAA,MAC5C,EAAE,MAAM,WAAQ;AAAA,MAChB,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,aAAa;AAAA,MACvC,EAAE,MAAM,IAAI;AAAA,MACZ,EAAE,MAAM,aAAa,OAAO,OAAO;AAAA,IACvC;AAAA,EACJ;AAAA,EACA,YAAY;AAChB;AAEA,IAAM,YAA0D;AAAA,EAC5D,EAAE,IAAI,UAAU,OAAO,+BAA+B;AAAA,EACtD,EAAE,IAAI,cAAc,OAAO,mCAAmC;AAClE;AAGA,IAAM,qBAAqB,CAAC,YACxB,YAAY,oBAAoB,eAAe;AAKnD,IAAM,4BAA4B,OAAO,WAAW,cAAcC,mBAAkBC;AAIpF,IAAM,mBAAmB,CAAC,EAAE,MAAM,MAA+B;AAC7D,MAAI,MAAM,SAAS,YAAY;AAC3B,WAAO,gBAAAH,MAAC,OAAE,WAAU,kBAAkB,gBAAM,SAAQ;AAAA,EACxD;AACA,MAAI,MAAM,SAAS,WAAW;AAC1B,WACI,gBAAAA,MAAC,QAAG,WAAU,iBACT,gBAAM,MAAM,IAAI,CAAC,SACd,gBAAAC,OAAC,QAAG,WAAU,oBACV;AAAA,sBAAAA,OAAC,YAAQ;AAAA,aAAK;AAAA,QAAK;AAAA,SAAC;AAAA,MAAS;AAAA,MAAE,KAAK;AAAA,SADF,KAAK,IAE3C,CACH,GACL;AAAA,EAER;AACA,SAAO,gBAAAD,MAAC,OAAE,WAAU,cAAc,gBAAM,SAAQ;AACpD;AAKA,IAAM,iBAAiB,MACnB,gBAAAC,OAAC,SAAI,OAAM,KAAI,QAAO,MAAK,SAAQ,YAAW,MAAK,QAAO,eAAY,QAAO,WAAU,oBACnF;AAAA,kBAAAD,MAAC,UAAK,GAAE,YAAW,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ;AAAA,EACjF,gBAAAA,MAAC,UAAK,GAAE,0BAAyB,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ;AAAA,GAC1H;AAoBJ,IAAM,mBAAmB,CAAC,EAAE,OAAO,MAAsC;AACrE,QAAM,aAAaI,SAAuB,IAAI;AAC9C,QAAM,WAAWA,SAAuB,IAAI;AAC5C,QAAM,CAAC,KAAK,MAAM,IAAIC,WAAS,EAAE,OAAO,GAAG,eAAe,EAAE,CAAC;AAE7D,4BAA0B,MAAM;AAC5B,UAAM,UAAU,WAAW;AAC3B,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,WAAW,CAAC,MAAO;AAExB,UAAM,YAAY,MAAM;AACpB,YAAM,YAAY,QAAQ;AAC1B,YAAM,eAAe,MAAM;AAC3B,YAAM,gBAAgB,MAAM;AAC5B,UAAI,CAAC,aAAa,CAAC,aAAc;AACjC,aAAO,EAAE,OAAO,KAAK,IAAI,GAAG,YAAY,YAAY,GAAG,cAAc,CAAC;AAAA,IAC1E;AAEA,cAAU;AAEV,UAAM,WAAW,IAAI,eAAe,SAAS;AAC7C,aAAS,QAAQ,OAAO;AACxB,aAAS,QAAQ,KAAK;AAItB,QAAI,OAAO,aAAa,eAAe,SAAS,OAAO,OAAO;AAC1D,eAAS,MAAM,MAAM,KAAK,SAAS,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvD;AAEA,WAAO,MAAM,SAAS,WAAW;AAAA,EACrC,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,WAAW,IAAI,QAAQ;AAE7B,SACI,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,KAAK;AAAA,MACL,OAAO,WAAW,EAAE,QAAQ,IAAI,gBAAgB,IAAI,MAAM,IAAI;AAAA,MAE9D,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK;AAAA,UACL,OAAO,WAAW,EAAE,WAAW,SAAS,IAAI,KAAK,IAAI,IAAI;AAAA,UACzD,MAAK;AAAA,UACL,cAAY,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,GAAG;AAAA,UAErD,iBAAO,IAAI,CAAC,OAAO,MAChB,gBAAAC,OAACF,YAAA,EACG;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACG,WAAW,CAAC,oBAAoB,MAAM,QAAQ,8BAA8B,EAAE,EACzE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,gBACb,eAAY;AAAA,gBAEZ,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,WAAW;AAAA,sBACP;AAAA,sBACA,MAAM,QAAQ,kCAAkC;AAAA,oBACpD,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBAEZ,gBAAM;AAAA;AAAA,gBACX;AAAA;AAAA,YACJ;AAAA,YACA,gBAAAA,MAAC,UAAK,WAAU,sBAAqB,eAAY,QAC5C,gBAAM,SACH,gBAAAC,OAAAF,YAAA,EACI;AAAA,8BAAAC,MAAC,kBAAe;AAAA,cAChB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAW;AAAA,oBACP;AAAA,oBACA,MAAM,KAAK,MAAM,OAAO,SAAS,IAAI,2BAA2B;AAAA,kBACpE,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBAEb,0BAAAA,MAAC,UAAK,WAAU,wBAAwB,gBAAM,OAAM;AAAA;AAAA,cACxD;AAAA,eACJ,GAER;AAAA,eAlCW,CAmCf,CACH;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;AAYO,IAAM,yBAAyB,CAAC;AAAA,EACnC,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAmC;AAC/B,QAAM,SAAS,YAAY,iBAAiB,YAAY;AACxD,QAAM,CAAC,SAAS,UAAU,IAAIK,WAA8B,MAAM,mBAAmB,OAAO,CAAC;AAK7F,EAAAF,YAAU,MAAM;AACZ,eAAW,mBAAmB,OAAO,CAAC;AAAA,EAC1C,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UACF,YAAY,QACN,cACA,SACE,YAAY,eACR,0BACA,sBACJ;AAEZ,QAAM,UAAU,SAAS,QAAQ;AACjC,QAAM,OAAO,eAAe,QAAQ;AAEpC,SACI,gBAAAH,MAAC,aAAQ,WAAW,CAAC,iBAAiB,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAClF,0BAAAC,OAAC,SAAI,WAAU,mBACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,eACX;AAAA,sBAAAD,MAAC,QAAG,WAAU,eAAe,mBAAQ;AAAA,MACpC,QAAQ,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,gBAAK;AAAA,OACpD;AAAA,IAEC,UACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU,CAAC,OAAO,WAAW,EAAyB;AAAA;AAAA,IAC1D;AAAA,IAGJ,gBAAAC,OAAC,SAAI,WAAU,cACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,gBACX;AAAA,wBAAAD,MAAC,QAAG,WAAU,qBAAqB,kBAAQ,gBAAe;AAAA,QACzD,QAAQ,cAAc,IAAI,CAAC,OAAO,MAC/B,gBAAAA,MAAC,oBAAiB,SAAmB,CAAG,CAC3C;AAAA,SACL;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,gBACX;AAAA,wBAAAD,MAAC,QAAG,WAAU,qBAAqB,kBAAQ,gBAAe;AAAA,QAC1D,gBAAAA,MAAC,OAAE,WAAU,cAAc,kBAAQ,cAAa;AAAA,QAC/C,QAAQ,eAAe,gBAAAA,MAAC,OAAE,WAAU,cAAc,kBAAQ,aAAY;AAAA,QAEtE,QAAQ,aAAa,IAAI,CAAC,OAAO,MAC9B,gBAAAA,MAAC,oBAAyB,QAAQ,SAAX,CAAkB,CAC5C;AAAA,QAED,gBAAAA,MAAC,OAAE,WAAU,cAAc,kBAAQ,YAAW;AAAA,QAC9C,gBAAAA,MAAC,OAAE,WAAU,cAAc,kBAAQ,MAAK;AAAA,SAC5C;AAAA,OACJ;AAAA,KACJ,GACJ;AAER;;;ACxaA;AAAA,EACI,eAAAM;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEG;;;ACHA,IAAM,qBAAqB;AAElC,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AACJ,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AACJ,CAAC;AAUD,SAAS,YAAY,KAAyB;AAC1C,MAAI;AACA,WAAO,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEO,SAAS,mBAAmB,QAAyB;AACxD,QAAM,SAAS,YAAY,MAAM;AACjC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,MAAI,OAAO,YAAY,OAAO,SAAU,QAAO;AAC/C,MAAI,OAAO,aAAa,OAAO,OAAO,aAAa,GAAI,QAAO;AAC9D,MAAI,OAAO,UAAU,OAAO,KAAM,QAAO;AACzC,SAAO,sBAAsB,IAAI,GAAG,OAAO,QAAQ,KAAK,OAAO,IAAI,EAAE;AACzE;AAEO,SAAS,iBAAiB,WAAmC;AAChE,QAAM,UAAU,aAAa,oBAAoB,KAAK,EAAE,QAAQ,OAAO,EAAE;AACzE,MAAI,CAAC,mBAAmB,MAAM,GAAG;AAC7B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAClE;AACA,SAAO;AACX;AAEO,SAAS,eAAe,OAAwB;AACnD,QAAM,SAAS,YAAY,KAAK;AAChC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,aAAa,OAAQ,QAAO;AACvC,MAAI,OAAO,YAAY,OAAO,SAAU,QAAO;AAC/C,SAAO,oBAAoB,IAAI,GAAG,OAAO,QAAQ,KAAK,OAAO,IAAI,EAAE;AACvE;AAUO,SAAS,YAAY,MAAsB;AAC9C,QAAM,SAAS,OAAO,QAAQ,EAAE,EAC3B,KAAK,EACL,YAAY,EACZ,QAAQ,cAAc,EAAE;AAC7B,SAAO,sEAAsE,mBAAmB,UAAU,SAAS,CAAC;AACxH;;;ACpEA,IAAM,sBAA8C;AAAA,EAChD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACV;AAEO,SAAS,SAAS,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC9E;AAEO,SAAS,eAAe,OAA+B;AAC1D,QAAM,IAAI,OAAO,UAAU,WAAW,QAAQ,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAC1F,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AACpC;AAEA,SAAS,oBAAoB,OAAuB;AAChD,SAAO,MAAM,QAAQ,QAAQ,EAAE;AACnC;AAEA,SAAS,mBAAmB,SAAkC,OAAqB;AAC/E,MAAI,OAAO,QAAQ,IAAI,MAAM,KAAK;AAC9B,UAAM,IAAI,MAAM,GAAG,KAAK,YAAY,OAAO,QAAQ,IAAI,CAAC,IAAI,OAAO,QAAQ,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC;AAAA,EAClG;AACJ;AAEO,SAAS,cAAc,KAAwC;AAClE,QAAM,MAAgC,CAAC;AACvC,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO;AAC3B,aAAW,SAAS,OAAO,OAAO,GAAG,GAAG;AACpC,QAAI,CAAC,SAAS,KAAK,EAAG;AACtB,UAAM,WAAW,OAAO,MAAM,YAAY,EAAE,EACvC,KAAK,EACL,YAAY;AACjB,QAAI,CAAC,SAAU;AACf,QAAI,QAAQ,IAAI;AAAA,MACZ,MAAM,YAAY,QAAQ;AAAA,MAC1B,UAAU,OAAO,MAAM,YAAY,MAAM,YAAY,QAAQ;AAAA,IACjE;AAAA,EACJ;AACA,SAAO;AACX;AAEO,SAAS,oBAAoB,eAAoD;AACpF,MAAI,CAAC,SAAS,aAAa,EAAG,OAAM,IAAI,MAAM,sCAAsC;AACpF,QAAM,SAAS,SAAS,cAAc,MAAM,IAAI,cAAc,SAAS,CAAC;AACxE,QAAM,MAAkC,CAAC;AAEzC,aAAW,CAAC,UAAU,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC1D,QAAI,CAAC,SAAS,WAAW,EAAG;AAC5B,eAAW,QAAQ,OAAO,OAAO,WAAW,GAAG;AAC3C,UAAI,CAAC,SAAS,IAAI,EAAG;AACrB,UAAI,KAAK,WAAW,KAAK,KAAK,WAAW,IAAK;AAC9C,YAAM,KAAK,OAAO,KAAK,UAAU,EAAE,EAC9B,KAAK,EACL,YAAY;AACjB,UAAI,CAAC,GAAI;AACT,YAAM,WAAW,OAAO,KAAK,YAAY,EAAE,EAAE,KAAK;AAClD,YAAM,YAAY,OAAO,KAAK,QAAQ,EAAE,EAAE,MAAM,GAAG;AACnD,YAAM,UACF,YACA,GAAG,oBAAoB,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,oBAAoB,UAAU,CAAC,KAAK,QAAQ,CAAC;AAC/F,YAAM,CAAC,SAAS,QAAQ,IAAI,QAAQ,MAAM,GAAG;AAC7C,YAAM,QAAQ,WAAW,IAAI,KAAK;AAClC,YAAM,SAAS,YAAY,oBAAoB,QAAQ,GAAG,KAAK,EAAE,YAAY;AAC7E,UAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,UAAI,EAAE,IAAI;AAAA,QACN;AAAA,QACA,MAAM,GAAG,IAAI,IAAI,KAAK;AAAA,QACtB;AAAA,QACA;AAAA,QACA,gBAAgB,eAAe,KAAK,KAAK,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAEO,SAAS,yBAAyB,cAAmD;AACxF,MAAI,CAAC,MAAM,QAAQ,YAAY,EAAG,OAAM,IAAI,MAAM,sCAAsC;AACxF,QAAM,MAAkC,CAAC;AACzC,aAAW,SAAS,cAAc;AAC9B,QAAI,CAAC,SAAS,KAAK,EAAG;AACtB,UAAM,SAAS,OAAO,MAAM,UAAU,EAAE,EAAE,KAAK;AAC/C,QAAI,CAAC,OAAQ;AACb,UAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,MAAM,GAAG;AACzC,UAAM,SAAS,YAAY,IAAI,YAAY;AAC3C,QAAI,CAAC,QAAQ,CAAC,MAAO;AACrB,UAAM,KAAK,OAAO,QAAQ,MAAM,EAAE,EAAE,YAAY;AAChD,UAAM,YACF,SAAS,MAAM,YAAY,KAAK,eAAe,MAAM,aAAa,oBAAoB,KAAK,OACpF,eAAe,MAAM,aAAa,oBAAoB,IACvD;AACV,QAAI,EAAE,IAAI;AAAA,MACN;AAAA,MACA,MAAM,GAAG,IAAI,IAAI,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IACpB;AAAA,EACJ;AACA,SAAO;AACX;AAEO,SAAS,oBAAoB,SAAkB,OAAmB,QAA2B;AAChG,MAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,MAAM,mDAAmD;AAC3F,qBAAmB,SAAS,oBAAoB;AAChD,MAAI,CAAC,SAAS,QAAQ,IAAI,KAAK,CAAC,SAAS,QAAQ,KAAK,MAAM,GAAG;AAC3D,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AACA,QAAM,SAAS,QAAQ,KAAK;AAC5B,QAAM,QAAQ,OAAO,OAAO,SAAS,EAAE;AACvC,MAAI,CAAC,eAAe,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC9D;AACA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,MAAM,oBAAoB,MAAM;AAAA,IAChC,OAAO,cAAc,OAAO,QAAQ;AAAA,EACxC;AACJ;AAEO,SAAS,uBAAuB,SAAkB,OAAmB,WAA8B;AACtG,MAAI,CAAC,SAAS,OAAO,EAAG,OAAM,IAAI,MAAM,+CAA+C;AACvF,qBAAmB,SAAS,qBAAqB;AACjD,MAAI,CAAC,SAAS,QAAQ,IAAI,EAAG,OAAM,IAAI,MAAM,kCAAkC;AAC/E,QAAM,QAAQ,OAAO,QAAQ,KAAK,SAAS,EAAE;AAC7C,MAAI,CAAC,eAAe,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,6CAA6C;AAAA,EACjE;AACA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,MAAM,yBAAyB,QAAQ,KAAK,YAAY;AAAA,IACxD,OAAO,cAAc,QAAQ,KAAK,QAAQ;AAAA,EAC9C;AACJ;AAEO,SAAS,kBACZ,MACA,OACsD;AACtD,QAAM,OAAO,MAAM,KAAK,KAAK,YAAY,CAAC;AAC1C,SAAO;AAAA,IACH,UAAU,MAAM,YAAY,oBAAoB,KAAK,KAAK,YAAY,CAAC,KAAK,KAAK;AAAA,IACjF,MAAM,MAAM,QAAQ,YAAY,KAAK,IAAI;AAAA,EAC7C;AACJ;AAEO,SAAS,UAAU,SAAiB,UAAiC;AACxE,MAAI,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,aAAa,EAAG,QAAO;AACtF,UAAS,UAAU,YAAY,WAAY;AAC/C;AAEO,SAAS,gBAAgB,MAI9B;AACE,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO,EAAE,OAAO,MAAM,SAAS,MAAM,KAAK,KAAK;AACpE,QAAM,OAAO,eAAe,KAAK,IAAI;AACrC,SAAO;AAAA,IACH,OAAO,eAAe,KAAK,KAAK;AAAA,IAChC,SAAS,QAAQ,OAAO,OAAO,OAAO;AAAA,IACtC,KAAK,eAAe,KAAK,GAAG;AAAA,EAChC;AACJ;AAEO,SAAS,eAAe,SAAuD;AAClF,MAAI,CAAC,SAAS,OAAO,EAAG,QAAO,CAAC;AAChC,QAAM,MAAM,MAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ,OAAO,QAAQ,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC1F,QAAM,OAA4C,CAAC;AACnD,aAAW,QAAQ,KAAK;AACpB,QAAI,CAAC,SAAS,IAAI,EAAG;AACrB,QAAI,IAAI,eAAe,KAAK,EAAE;AAC9B,UAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,QAAI,KAAK,QAAQ,SAAS,KAAM;AAChC,QAAI,IAAI,KAAM,MAAK;AACnB,SAAK,KAAK,EAAE,GAAG,MAAM,CAAC;AAAA,EAC1B;AACA,SAAO;AACX;AAEO,SAAS,cAAc,SAAiB,MAAyC;AACpF,QAAM,KACF,SAAS,WAAW,yBAAyB;AACjD,QAAM,QAAQ,GAAG,KAAK,OAAO;AAC7B,SAAO,QAAQ,CAAC,KAAK;AACzB;AAEO,SAAS,cACZ,KACA,MACuC;AACvC,MAAI,KAAK,GAAG,EAAG,QAAO,EAAE,IAAI,KAAK,MAAM,KAAK,GAAG,EAAE;AACjD,QAAM,OAAO,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAC7C,MAAI,QAAQ,KAAK,IAAI,EAAG,QAAO,EAAE,IAAI,MAAM,MAAM,KAAK,IAAI,EAAE;AAC5D,SAAO;AACX;;;AClNO,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AAExC,SAAS,SAAiB;AACtB,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AACjE;AAEA,eAAsB,UAClB,KACA,MACA,UAA4D,CAAC,GAC7C;AAChB,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,WAAW,KAAK;AACtB,QAAM,UAAU,MAAM,WAAW,MAAM;AACvC,MAAI,UAAU;AACV,QAAI,SAAS,QAAS,YAAW,MAAM;AAAA,QAClC,UAAS,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EACnE;AACA,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC5D,MAAI;AACA,UAAM,WAAW,MAAM,UAAU,KAAK;AAAA,MAClC,GAAG;AAAA,MACH,aAAa;AAAA,MACb,QAAQ,WAAW;AAAA,IACvB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AACd,YAAM,IAAI,MAAM,4BAA4B,SAAS,MAAM,EAAE;AAAA,IACjE;AACA,WAAO,MAAM,SAAS,KAAK;AAAA,EAC/B,UAAE;AACE,iBAAa,KAAK;AAClB,cAAU,oBAAoB,SAAS,OAAO;AAAA,EAClD;AACJ;AAEA,eAAsB,gBAClB,MACA,UAKI,CAAC,GACqB;AAC1B,QAAM,SAAS,iBAAiB,QAAQ,SAAS;AAEjD,MAAI,SAAS,WAAW;AACpB,UAAMC,WAAU,MAAM;AAAA,MAClB,GAAG,MAAM,GAAG,wBAAwB;AAAA,MACpC;AAAA,QACI,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,UACnB,qBAAqB;AAAA,QACzB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,QACzC,QAAQ,QAAQ;AAAA,MACpB;AAAA,MACA,EAAE,WAAW,QAAQ,WAAW,WAAW,QAAQ,UAAU;AAAA,IACjE;AACA,WAAO,uBAAuBA,UAAS,SAAS;AAAA,EACpD;AAEA,QAAM,UAAU,MAAM;AAAA,IAClB,GAAG,MAAM,GAAG,qBAAqB;AAAA,IACjC;AAAA,MACI,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,IACpB;AAAA,IACA,EAAE,WAAW,QAAQ,WAAW,WAAW,QAAQ,UAAU;AAAA,EACjE;AACA,SAAO,oBAAoB,SAAS,MAAM;AAC9C;AAEO,SAAS,iCAA0C;AACtD,SACI,OAAO,cAAc,eACrB,OAAO,wBAAwB,eAC/B,OAAO,gBAAgB;AAE/B;;;ACzFO,SAAS,eAAe,SAM4C;AACvE,QAAM,QAAQ,QAAQ;AACtB,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACxD,WAAO,EAAE,KAAK,QAAQ,UAAU,SAAS,QAAQ,cAAc,OAAO,OAAO,OAAO,2BAA2B;AAAA,EACnH;AAEA,QAAM,SAAS,QAAQ,WAAW,QAAQ,QAAQ,WAAW,QAAQ;AACrE,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACV,WAAO,EAAE,KAAK,QAAQ,WAAW,QAAQ,KAAK,QAAQ,UAAU,SAAS,QAAQ,WAAW,YAAY,KAAK,QAAQ,cAAc,OAAO,OAAO,OAAO,KAAK;AAAA,EACjK;AAEA,QAAM,SAAS,OAAO,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAC/C,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AACxC,WAAO;AAAA,MACH,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,OAAO;AAAA,MACP,OAAO;AAAA,IACX;AAAA,EACJ;AAEA,MAAI,QAAQ,SAAS,OAAO;AAExB,QAAI,QAAQ,WAAW,OAAO;AAC1B,YAAM,UAAU,SAAS;AACzB,aAAO,EAAE,KAAK,SAAS,SAAS,aAAa,OAAO,GAAG,OAAO,SAAS,GAAG,OAAO,KAAK;AAAA,IAC1F;AACA,UAAMC,OAAM,SAAS;AACrB,WAAO,EAAE,KAAK,aAAaA,IAAG,GAAG,SAAS,SAAS,OAAO,SAAS,GAAG,OAAO,KAAK;AAAA,EACtF;AAGA,MAAI,QAAQ,WAAW,OAAO;AAC1B,UAAM,UAAU,SAAS;AACzB,WAAO,EAAE,KAAK,SAAS,SAAS,aAAa,OAAO,GAAG,OAAO,SAAS,GAAG,OAAO,KAAK;AAAA,EAC1F;AACA,QAAM,MAAM,SAAS;AACrB,SAAO,EAAE,KAAK,aAAa,GAAG,GAAG,SAAS,SAAS,OAAO,SAAS,GAAG,OAAO,KAAK;AACtF;AAEO,SAAS,aAAa,OAAe,oBAAoB,GAAW;AACvE,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,QAAQ,MAAM,QAAQ,iBAAiB,EAAE,QAAQ,UAAU,EAAE;AACnE,SAAO;AACX;AAEO,SAAS,YAAY,OAAsB,YAAY,GAAW;AACrE,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACrD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,SAAS,SAAS,IAAI,YAAY,GAAG,CAAC,CAAC;AAClF,SAAO,MAAM,eAAe,QAAW;AAAA,IACnC,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EAC3B,CAAC;AACL;AAEO,SAAS,UAAU,OAA8B;AACpD,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACrD,QAAM,OAAO,SAAS,IAAI,MAAM;AAChC,SAAO,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,CAAC;AACrC;AAEO,SAAS,kBACZ,MACA,MACA,OACgC;AAChC,SAAO,SAAS,QAAQ,EAAE,KAAK,OAAO,SAAS,KAAK,IAAI,EAAE,KAAK,MAAM,SAAS,MAAM;AACxF;;;AC7DA,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AAYvB,eAAe,cAAc,MAAiC;AAC1D,MAAI,OAAO,SAAS,SAAU,QAAO,KAAK,MAAM,IAAI;AACpD,MAAI,gBAAgB,aAAa;AAC7B,UAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,QAAI,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,KAAK;AACrC,YAAM,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,YAAY,IAAI,oBAAoB,MAAM,CAAC;AACrF,aAAO,KAAK,MAAM,MAAM,IAAI,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,IACvD;AACA,WAAO,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,KAAK,CAAC;AAAA,EACrD;AACA,MAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACrD,UAAM,SAAS,MAAM,KAAK,YAAY;AACtC,WAAO,cAAc,MAAM;AAAA,EAC/B;AACA,QAAM,IAAI,MAAM,oCAAoC;AACxD;AAEA,SAAS,SAAS,MAAkB,OAA4C;AAC5E,QAAM,WAAW,kBAAkB,MAAM,KAAK;AAC9C,SAAO;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,MAAM;AAAA,IACN,aAAa;AAAA,IACb,cAAc;AAAA,IACd,aAAa;AAAA,IACb,SAAS,CAAC;AAAA,IACV,WAAW;AAAA,IACX,WAAW;AAAA,EACf;AACJ;AAEA,SAAS,UAAU,KAAsB;AACrC,QAAM,SAAU,IAAoE,OAAO;AAAA,IACvF,CAAC,MAAM,EAAE;AAAA,EACb;AACA,MAAI,CAAC,QAAQ,OAAQ;AACrB,MAAI,UAAU;AACd,QAAM,OAAO,IAAI,QAAQ,OAAO,OAAO,SAAS,CAAC;AACjD,MAAI,cAAc,OAAO,UAAU,IAAI,UAAU,MAAM,OAAO,OAAO,SAAS,CAAC,CAAE,IAAI;AACrF,MAAI,cAAc,OAAO,UAAU,kBAAkB,UAAU,MAAM,OAAO,CAAC,CAAE,IAAI;AACnF,MAAI,IAAI,gBAAgB,MAAM;AAC1B,QAAI,eAAe,OAAO,UAAU,KAAK,UAAU,MAAM,OAAO,OAAO,SAAS,EAAE,CAAE,IAAI;AAAA,EAC5F;AACA,MAAI,IAAI,QAAQ,KAAM,KAAI,OAAO,OAAO,OAAO,SAAS,CAAC;AAC7D;AAEA,SAAS,eAAe,MAAM,KAAa;AACvC,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,oBAAoB,YAAY;AAC/E,UAAM,MAAM,IAAI,YAAY,CAAC;AAC7B,WAAO,gBAAgB,GAAG;AAC1B,WAAO,IAAI,CAAC,KAAM,MAAM;AAAA,EAC5B;AACA,SAAO;AACX;AAEO,SAAS,iBACZ,YACA,UACA,UAII,CAAC,GACK;AACV,MAAI,CAAC,eAAe,WAAW,KAAK,GAAG;AACnC,aAAS,SAAS,SAAS,kCAAkC;AAC7D,WAAO,EAAE,gBAAgB;AAAA,IAAC,GAAG,QAAQ;AAAA,IAAC,EAAE;AAAA,EAC5C;AAEA,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ,WAAW;AACzB,QAAM,OAAO,oBAAI,IAAyE;AAE1F,MAAI,eAAe,QAAQ,UAAU;AACrC,MAAI,SAAS;AACb,MAAI,SAA2B;AAC/B,MAAI,iBAAuD;AAC3D,MAAI,aAAoD;AACxD,MAAI,gBAAgB,KAAK,IAAI;AAC7B,MAAI,UAAU;AACd,QAAM,mBAAmB,oBAAI,IAAY;AACzC,QAAM,kBAAkB,oBAAI,IAAY;AAExC,QAAM,YAAY,CAAC,IAAY,eAA2B;AACtD,QAAI,MAAM,KAAK,IAAI,EAAE;AACrB,QAAI,CAAC,KAAK;AACN,YAAM,SAAS,YAAY,KAAK;AAChC,WAAK,IAAI,IAAI,GAAG;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAEA,QAAM,OAAO,CAAC,YAAqB;AAC/B,QAAI,QAAQ,eAAe,cAAc,MAAM;AAC3C,aAAO,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACvC;AAAA,EACJ;AAEA,QAAM,kBAAkB,CAAC,OAAe;AACpC,QAAI,iBAAiB,IAAI,EAAE,EAAG;AAC9B,qBAAiB,IAAI,EAAE;AACvB,SAAK,EAAE,OAAO,OAAO,QAAQ,EAAE,SAAS,UAAU,EAAE,WAAW,OAAO,GAAG,EAAE,CAAC;AAAA,EAChF;AAEA,QAAM,iBAAiB,CAAC,OAAe;AACnC,QAAI,CAAC,gBAAgB,gBAAgB,IAAI,EAAE,EAAG;AAC9C,oBAAgB,IAAI,EAAE;AACtB,UAAM,UAAU,UAAU,EAAE;AAC5B,SAAK;AAAA,MACD,OAAO;AAAA,MACP,QAAQ;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,QACP,QAAQ,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,QACpC,UAAU;AAAA,MACd;AAAA,IACJ,CAAC;AACD,SAAK,EAAE,OAAO,OAAO,QAAQ,EAAE,SAAS,OAAO,GAAG,EAAE,CAAC;AAAA,EACzD;AAEA,QAAM,UAAU,CAAC,QAAmB;AAChC,QAAI,YAAY,KAAK,IAAI;AACzB,aAAS,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;AAAA,EACxD;AAEA,QAAM,YAAY,CAAC,IAAY,YAAwB,SAAkB;AACrE,UAAM,MAAM,UAAU,IAAI,UAAU;AACpC,UAAM,SAAS,gBAAgB,IAAI;AACnC,QAAI,OAAO,SAAS,KAAM,KAAI,OAAO,OAAO;AAC5C,QAAI,OAAO,WAAW,KAAM,KAAI,eAAe,OAAO;AACtD,QAAI,OAAO,OAAO,KAAM,KAAI,YAAY,OAAO;AAC/C,cAAU,GAAG;AACb,YAAQ,GAAG;AAAA,EACf;AAEA,QAAM,aAAa,CAAC,IAAY,YAAwB,YAAqB;AACzE,UAAM,MAAM,UAAU,IAAI,UAAU;AACpC,UAAM,WAAW,eAAe,OAAO;AACvC,QAAI,CAAC,SAAS,OAAQ;AACtB,UAAM,MAAM,IAAI,KAAK,IAAI,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1D,eAAW,OAAO,SAAU,KAAI,IAAI,IAAI,GAAG,GAAG;AAC9C,QAAI,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,eAAe;AAC9E,cAAU,GAAG;AACb,YAAQ,GAAG;AAAA,EACf;AAEA,QAAM,UAAU,MAAM;AAClB,QAAI,OAAQ;AACZ,aAAS,SAAS,YAAY,IAAI,eAAe,gBAAgB,YAAY,IAAI,qBAAgB,6CAAqC;AACtI,UAAM,KAAK,IAAI,cAAc,WAAW,OAAO,CAAC,kBAAkB,CAAC;AACnE,aAAS;AACT,oBAAgB,KAAK,IAAI;AACzB,QAAI,gBAAgB,GAAI,IAAG,aAAa;AAExC,iBAAa,YAAY,MAAM;AAC3B,UAAI,KAAK,IAAI,IAAI,gBAAgB,cAAc;AAC3C,iBAAS,SAAS,SAAS,qBAAqB;AAChD,YAAI;AACA,aAAG,MAAM;AAAA,QACb,QAAQ;AAAA,QAER;AAAA,MACJ;AAAA,IACJ,GAAG,cAAc;AAEjB,OAAG,SAAS,MAAM;AACd,eAAS,SAAS,QAAQ,MAAM;AAChC,WAAK;AAAA,QACD,OAAO;AAAA,QACP,QAAQ,EAAE,SAAS,YAAY,iBAAiB,aAAa,WAAW,SAAS;AAAA,MACrF,CAAC;AACD,WAAK,EAAE,OAAO,OAAO,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;AAAA,IACxD;AAEA,OAAG,YAAY,OAAO,UAAU;AAC5B,sBAAgB,KAAK,IAAI;AACzB,UAAI;AACJ,UAAI;AACA,kBAAU,MAAM,cAAc,MAAM,IAAI;AACxC,YAAI,UAAU,WAAW,GAAI;AAC7B,kBAAU;AAAA,MACd,QAAQ;AACJ;AAAA,MACJ;AAEA,UAAI,CAAC,SAAS,OAAO,EAAG;AAExB,UAAI,QAAQ,QAAQ,MAAM;AACtB,aAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAC3B;AAAA,MACJ;AAEA,UAAI,QAAQ,YAAY,YAAY,SAAS,QAAQ,IAAI,GAAG;AACxD,mBAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,QAAQ,IAAI,GAAG;AACpD,gBAAM,WAAW,cAAc,KAAK,IAAI;AACxC,cAAI,CAAC,SAAU;AACf,oBAAU,SAAS,IAAI,SAAS,MAAM,IAAI;AAC1C,0BAAgB,SAAS,EAAE;AAC3B,yBAAe,SAAS,EAAE;AAAA,QAC9B;AACA;AAAA,MACJ;AAEA,YAAM,UAAU,OAAO,QAAQ,WAAW,EAAE;AAC5C,UAAI,QAAQ,SAAS,SAAS,GAAG;AAC7B,cAAM,SAAS,cAAc,SAAS,OAAO;AAC7C,cAAM,WAAW,SAAS,cAAc,QAAQ,IAAI,IAAI;AACxD,YAAI,SAAU,YAAW,SAAS,IAAI,SAAS,MAAM,OAAO;AAC5D;AAAA,MACJ;AAEA,UAAI,QAAQ,SAAS,SAAS,KAAK,QAAQ,MAAM;AAC7C,cAAM,SAAS,cAAc,SAAS,QAAQ;AAC9C,cAAM,WAAW,SAAS,cAAc,QAAQ,IAAI,IAAI;AACxD,YAAI,SAAU,WAAU,SAAS,IAAI,SAAS,MAAM,QAAQ,IAAI;AAAA,MACpE;AAAA,IACJ;AAEA,OAAG,UAAU,MAAM;AACf,UAAI,WAAY,eAAc,UAAU;AACxC,mBAAa;AACb,uBAAiB,MAAM;AACvB,sBAAgB,MAAM;AACtB,UAAI,OAAQ;AACZ,eAAS,SAAS,gBAAgB,6CAAqC;AACvE,YAAM,QAAQ,KAAK,IAAI,KAAQ,OAAO,KAAK,OAAO,IAAI,eAAe,GAAG;AACxE,iBAAW;AACX,uBAAiB,WAAW,SAAS,KAAK;AAAA,IAC9C;AAEA,OAAG,UAAU,MAAM;AAAA,IAEnB;AAAA,EACJ;AAEA,UAAQ;AAER,SAAO;AAAA,IACH,gBAAgB;AACZ,qBAAe;AACf,iBAAW,MAAM,iBAAkB,gBAAe,EAAE;AAAA,IACxD;AAAA,IACA,QAAQ;AACJ,eAAS;AACT,UAAI,eAAgB,cAAa,cAAc;AAC/C,UAAI,WAAY,eAAc,UAAU;AACxC,UAAI;AACA,gBAAQ,MAAM;AAAA,MAClB,QAAQ;AAAA,MAER;AACA,eAAS;AAAA,IACb;AAAA,EACJ;AACJ;;;AC7PA,SAAS,kBAA6B;AAClC,SAAO;AAAA,IACH,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,MAAM,oBAAI,IAAI;AAAA,IACd,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,OAAO;AAAA,IACP,eAAe;AAAA,IACf,UAAU;AAAA,IACV,aAAa;AAAA,IACb,WAAW,oBAAI,IAAI;AAAA,IACnB,OAAO;AAAA,EACX;AACJ;AAEA,SAAS,eAAe,MAAwC;AAC5D,QAAM,YAAY,CAAC,QAAQ,QAAQ,OAAO,KAAK;AAC/C,QAAM,MAAM,oBAAI,IAAY;AAC5B,aAAW,OAAO,KAAK,OAAO,GAAG;AAC7B,QAAI,IAAI,MAAO,KAAI,IAAI,IAAI,MAAM,YAAY,CAAC;AAAA,EAClD;AACA,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,GAAG,MAAM;AAC3B,UAAM,KAAK,UAAU,QAAQ,CAAC;AAC9B,UAAM,KAAK,UAAU,QAAQ,CAAC;AAC9B,YAAQ,OAAO,KAAK,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,EAAE,cAAc,CAAC;AAAA,EAC7E,CAAC;AACL;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAa1B,YAAY,UAAmC,CAAC,GAAG;AANnD,SAAiB,QAAQ,oBAAI,IAA2B;AAAA,MACpD,CAAC,QAAQ,gBAAgB,CAAC;AAAA,MAC1B,CAAC,WAAW,gBAAgB,CAAC;AAAA,IACjC,CAAC;AACD,SAAQ,gBAAgB;AAGpB,SAAK,YAAY,iBAAiB,QAAQ,aAAa,kBAAkB;AACzE,SAAK,YAAY,QAAQ;AACzB,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,mBAAmB,QAAQ,oBAAoB;AACpD,SAAK,eAAe,QAAQ,gBAAgB;AAC5C,SAAK,uBAAuB,QAAQ,wBAAwB;AAAA,EAChE;AAAA,EAEA,YAAoB;AAChB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,YAAY,MAAkC;AAC1C,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,WAAO;AAAA,MACH;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,eAAe,MAAM;AAAA,MACrB,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,MACxB,QAAQ,eAAe,MAAM,IAAI;AAAA,MACjC,OAAO,MAAM,WAAW,WAAW,MAAM,WAAW;AAAA,MACpD,eAAe,MAAM;AAAA,MACrB,OAAO,MAAM;AAAA,IACjB;AAAA,EACJ;AAAA,EAEA,UAAU,SAA2B,UAAsC;AACvE,QAAI,OAAO,WAAW,eAAe,CAAC,KAAK,eAAe;AACtD,eAAS;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,MAAM,oBAAI,IAAI;AAAA,QACd,QAAQ,CAAC;AAAA,QACT,OAAO;AAAA,QACP,eAAe;AAAA,QACf,OAAO;AAAA,MACX,CAAC;AACD,aAAO,MAAM;AAAA,IACjB;AAEA,QAAI,CAAC,+BAA+B,KAAK,CAAC,KAAK,eAAe;AAC1D,eAAS;AAAA,QACL,MAAM,QAAQ;AAAA,QACd,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,MAAM,oBAAI,IAAI;AAAA,QACd,QAAQ,CAAC;AAAA,QACT,OAAO;AAAA,QACP,eAAe;AAAA,QACf,OAAO;AAAA,MACX,CAAC;AACD,aAAO,MAAM;AAAA,IACjB;AAEA,SAAK,aAAa;AAClB,UAAM,QAAQ,KAAK,MAAM,IAAI,QAAQ,IAAI;AACzC,UAAM,UAAU,IAAI,QAAQ;AAC5B,UAAM,YAAY;AAClB,QAAI,QAAQ,SAAS,KAAK,sBAAsB;AAC5C,YAAM,cAAc;AACpB,YAAM,MAAM,cAAc;AAAA,IAC9B;AAEA,aAAS,KAAK,YAAY,QAAQ,IAAI,CAAC;AACvC,SAAK,KAAK,WAAW,QAAQ,IAAI;AAEjC,WAAO,MAAM;AACT,YAAM,UAAU,OAAO,QAAQ;AAC/B,YAAM,WAAW,KAAK,IAAI,GAAG,MAAM,WAAW,CAAC;AAC/C,UAAI,MAAM,aAAa,GAAG;AACtB,aAAK,aAAa,QAAQ,IAAI;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,gBAAsB;AAClB,eAAW,QAAQ,CAAC,QAAQ,SAAS,GAAmB;AACpD,WAAK,aAAa,IAAI;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEQ,eAAe;AACnB,QAAI,KAAK,iBAAiB,OAAO,WAAW,YAAa;AACzD,SAAK,gBAAgB;AACrB,UAAM,SAAS,MAAM;AACjB,iBAAW,QAAQ,CAAC,QAAQ,SAAS,GAAmB;AACpD,aAAK,aAAa,IAAI;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO,iBAAiB,YAAY,MAAM;AAAA,EAC9C;AAAA,EAEQ,KAAK,MAAkB;AAC3B,UAAM,WAAW,KAAK,YAAY,IAAI;AACtC,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,eAAW,YAAY,CAAC,GAAG,MAAM,SAAS,EAAG,UAAS,QAAQ;AAAA,EAClE;AAAA,EAEA,MAAc,WAAW,MAAkB;AACvC,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,QAAI,MAAM,QAAQ,MAAM,WAAW;AAC/B,UAAI,MAAM,cAAc,CAAC,MAAM,QAAQ,MAAM,WAAW,GAAG;AACvD,aAAK,UAAU,MAAM,MAAM,UAAU;AAAA,MACzC;AACA;AAAA,IACJ;AAEA,UAAM,SAAS;AACf,UAAM,gBAAgB;AACtB,UAAM,QAAQ;AACd,SAAK,KAAK,IAAI;AAEd,UAAM,QAAQ,IAAI,gBAAgB;AAClC,UAAM,QAAQ;AACd,UAAM,YAAY,gBAAgB,MAAM;AAAA,MACpC,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,QAAQ,MAAM;AAAA,IAClB,CAAC,EACI,KAAK,CAAC,eAAe;AAClB,UAAI,MAAM,OAAO,WAAW,MAAM,aAAa,EAAG,QAAO;AACzD,YAAM,aAAa;AACnB,iBAAW,CAAC,IAAI,IAAI,KAAK,OAAO,QAAQ,WAAW,IAAI,GAAG;AACtD,YAAI,CAAC,MAAM,KAAK,IAAI,EAAE,GAAG;AACrB,gBAAM,WAAW,kBAAkB,MAAM,WAAW,KAAK;AACzD,gBAAM,KAAK,IAAI,IAAI;AAAA,YACf,GAAG;AAAA,YACH,GAAG;AAAA,YACH,MAAM;AAAA,YACN,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,SAAS,CAAC;AAAA,YACV,WAAW;AAAA,YACX,WAAW;AAAA,UACf,CAAC;AAAA,QACL;AAAA,MACJ;AACA,WAAK,UAAU,MAAM,UAAU;AAC/B,WAAK,KAAK,IAAI;AACd,aAAO;AAAA,IACX,CAAC,EACA,MAAM,CAAC,UAAiB;AACrB,UAAI,MAAM,OAAO,WAAW,MAAM,aAAa,EAAG,QAAO;AACzD,YAAM,SAAS;AACf,YAAM,gBAAgB;AACtB,YAAM,QAAQ,MAAM,WAAW;AAC/B,WAAK,KAAK,IAAI;AAEd,YAAM,QAAQ,MAAM;AAChB,YAAI,MAAM,WAAW,KAAK,CAAC,MAAM,MAAM;AACnC,gBAAM,YAAY;AAClB,eAAK,KAAK,WAAW,IAAI;AAAA,QAC7B;AAAA,MACJ;AACA,UAAI,OAAO,WAAW,aAAa;AAC/B,eAAO,WAAW,OAAO,GAAK;AAAA,MAClC,OAAO;AACH,mBAAW,OAAO,GAAK;AAAA,MAC3B;AACA,YAAM;AAAA,IACV,CAAC,EACA,QAAQ,MAAM;AACX,UAAI,MAAM,WAAW;AAAA,MAErB;AAAA,IACJ,CAAC;AAEL,QAAI;AACA,YAAM,MAAM;AAAA,IAChB,QAAQ;AAAA,IAER;AAAA,EACJ;AAAA,EAEQ,UAAU,MAAkB,YAA+B;AAC/D,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,QAAI,MAAM,QAAQ,MAAM,aAAa,EAAG;AAExC,UAAM,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACI,OAAO,CAAC,QAAQ;AACZ,gBAAM,KAAK,IAAI,IAAI,IAAI,GAAG;AAC1B,gBAAM,gBAAgB,KAAK,IAAI;AAC/B,cAAI,MAAM,WAAW,QAAQ;AACzB,kBAAM,SAAS;AACf,kBAAM,gBAAgB;AACtB,kBAAM,QAAQ;AAAA,UAClB;AACA,eAAK,KAAK,IAAI;AAAA,QAClB;AAAA,QACA,UAAU,CAAC,QAAQ,YAAY;AAC3B,gBAAM,SAAS;AACf,gBAAM,gBAAgB;AACtB,cAAI,WAAW,QAAS,OAAM,QAAQ;AACtC,eAAK,KAAK,IAAI;AAAA,QAClB;AAAA,MACJ;AAAA,MACA;AAAA,QACI,OAAO,MAAM;AAAA,QACb,eAAe,KAAK;AAAA,QACpB,cAAc,KAAK;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,aAAa,MAAkB;AACnC,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI;AACjC,UAAM,OAAO,MAAM;AACnB,UAAM,QAAQ;AACd,UAAM,MAAM,MAAM;AAClB,UAAM,OAAO;AACb,UAAM,YAAY;AAClB,UAAM,aAAa;AACnB,UAAM,KAAK,MAAM;AACjB,UAAM,SAAS;AACf,UAAM,gBAAgB;AACtB,UAAM,QAAQ;AACd,UAAM,gBAAgB;AACtB,UAAM,cAAc;AACpB,UAAM,WAAW;AAEjB,QAAI,MAAM,UAAU,SAAS,GAAG;AAAA,IAEhC;AAAA,EACJ;AACJ;AAEA,IAAI,eAAwC;AAC5C,IAAI,eAA8B;AAG3B,SAAS,0BAA0B,WAAsC;AAC5E,QAAM,SAAS,iBAAiB,aAAa,kBAAkB;AAC/D,MAAI,CAAC,gBAAgB,iBAAiB,QAAQ;AAC1C,kBAAc,cAAc;AAC5B,mBAAe,IAAI,iBAAiB,EAAE,WAAW,OAAO,CAAC;AACzD,mBAAe;AAAA,EACnB;AACA,SAAO;AACX;;;ACnUA,SAAS,aAAAC,aAAW,YAAAC,kBAAgB;AAIpC,IAAM,QAAwB;AAAA,EAC1B,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,MAAM,oBAAI,IAAI;AAAA,EACd,QAAQ,CAAC;AAAA,EACT,OAAO;AAAA,EACP,eAAe;AAAA,EACf,OAAO;AACX;AAEO,SAAS,oBACZ,SACc;AACd,QAAM,EAAE,MAAM,OAAO,WAAW,UAAU,KAAK,IAAI;AACnD,QAAM,CAAC,UAAU,WAAW,IAAIC,WAAyB,EAAE,GAAG,OAAO,KAAK,CAAC;AAE3E,EAAAC,YAAU,MAAM;AACZ,QAAI,CAAC,WAAW,OAAO,WAAW,YAAa;AAC/C,UAAM,SAAS,0BAA0B,SAAS;AAClD,WAAO,OAAO,UAAU,EAAE,MAAM,MAAM,GAAG,WAAW;AAAA,EACxD,GAAG,CAAC,MAAM,OAAO,WAAW,OAAO,CAAC;AAEpC,SAAO;AACX;;;APqBY,SA4OoB,YAAAC,YA5OpB,OAAAC,OA0KI,QAAAC,cA1KJ;AA1BL,IAAM,qBAAqB;AAElC,SAAS,UAAU,MAAmB,aAAwC;AAC1E,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,MAAI,CAAC,aAAa;AACd,WACI,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,UAAU,MAAM,KACvD,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM,KACnC,KAAK,CAAC,KACN;AAAA,EAER;AACA,QAAM,SAAS,YAAY,KAAK,EAAE,YAAY;AAC9C,SACI,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,KAChC,KAAK,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,MAAM,KAChD,KAAK,KAAK,CAAC,MAAM,EAAE,KAAK,QAAQ,KAAK,EAAE,EAAE,YAAY,MAAM,OAAO,QAAQ,KAAK,EAAE,CAAC,KAClF,KAAK,CAAC,KACN;AAER;AAEA,SAAS,WAAW,EAAE,MAAM,MAAM,MAAM,GAAkD;AACtF,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,KAAK;AAC1C,MAAI,QAAQ;AACR,WACI,gBAAAF,MAAC,UAAK,WAAU,mCAAkC,eAAY,QACzD,eAAK,MAAM,GAAG,CAAC,GACpB;AAAA,EAER;AACA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,KAAK;AAAA,MACL,KAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,UAAS;AAAA,MACT,SAAS,MAAM,UAAU,IAAI;AAAA,MAC7B,cAAY;AAAA;AAAA,EAChB;AAER;AAEO,IAAM,uBAAuB,CAAC;AAAA,EACjC,SAAS,WAAW;AAAA,EACpB,QAAQ,UAAU;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AACJ,MAAiC;AAC7B,QAAM,UAAUG,OAAM,EAAE,QAAQ,MAAM,EAAE;AACxC,QAAM,YAAY,eAAe,OAAO;AACxC,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,YAAY,eAAe,OAAO;AACxC,QAAM,WAAW,cAAc,OAAO;AAEtC,QAAM,WAAW,oBAAoB,EAAE,MAAM,QAAQ,OAAO,OAAO,UAAU,CAAC;AAC9E,QAAM,OAAOC,SAAQ,MAAM,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC;AAEvE,QAAM,CAAC,MAAM,OAAO,IAAIF,WAAoB,KAAK;AACjD,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAwB,IAAI;AAChE,QAAM,CAAC,KAAK,MAAM,IAAIA,WAAS,EAAE;AACjC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,QAAQ,SAAS,IAAIA,WAA4B,KAAK;AAC7D,QAAM,CAAC,YAAY,aAAa,IAAIA,WAAS,KAAK;AAClD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,CAAC;AAElD,QAAM,UAAUG,SAAoB,IAAI;AACxC,QAAM,YAAYA,SAA0B,IAAI;AAChD,QAAM,UAAUA,SAAyB,IAAI;AAE7C,QAAM,YACD,aAAa,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU,IAAI,SAAS,UAAU,MAAM,WAAW;AAE9F,EAAAC,YAAU,MAAM;AACZ,QAAI,CAAC,cAAc,SAAU,eAAc,SAAS,EAAE;AAAA,EAC1D,GAAG,CAAC,UAAU,UAAU,CAAC;AAEzB,QAAM,aAAaF;AAAA,IACf,MACI,eAAe;AAAA,MACX;AAAA,MACA,OAAO,UAAU,QAAQ;AAAA,MACzB,UAAU;AAAA,MACV,cAAc;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,IACL,CAAC,MAAM,UAAU,MAAM,KAAK,SAAS,MAAM;AAAA,EAC/C;AAEA,EAAAE,YAAU,MAAM;AACZ,QAAI,WAAW,MAAO,YAAW,WAAW,OAAO;AAAA,QAC9C,QAAO,WAAW,GAAG;AAAA,EAC9B,GAAG,CAAC,WAAW,KAAK,WAAW,SAAS,MAAM,CAAC;AAE/C,QAAM,SAAS,kBAAkB,MAAM,UAAU,QAAQ,UAAK,UAAU,SAAS,QAAG;AAEpF,QAAM,cAAcC,aAAY,MAAM;AAClC,kBAAc,KAAK;AACnB,cAAU,SAAS,MAAM;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,EAAAD,YAAU,MAAM;AACZ,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,CAAC,UAAsB;AACjC,UAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAc,EAAG,eAAc,KAAK;AAAA,IAC7E;AACA,UAAM,QAAQ,CAAC,UAAyB;AACpC,UAAI,MAAM,QAAQ,UAAU;AACxB,cAAM,eAAe;AACrB,oBAAY;AAAA,MAChB;AAAA,IACJ;AACA,aAAS,iBAAiB,aAAa,KAAK;AAC5C,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM;AACT,eAAS,oBAAoB,aAAa,KAAK;AAC/C,eAAS,oBAAoB,WAAW,KAAK;AAAA,IACjD;AAAA,EACJ,GAAG,CAAC,YAAY,WAAW,CAAC;AAE5B,QAAM,aAAaF;AAAA,IACf,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,IAC3D,CAAC,IAAI;AAAA,EACT;AAEA,QAAM,kBAAkB,CAAC,UAA8B;AACnD,QAAI,CAAC,WAAW,OAAQ;AACxB,QAAI,MAAM,QAAQ,aAAa;AAC3B,YAAM,eAAe;AACrB,sBAAgB,CAAC,OAAO,IAAI,KAAK,WAAW,MAAM;AAAA,IACtD,WAAW,MAAM,QAAQ,WAAW;AAChC,YAAM,eAAe;AACrB,sBAAgB,CAAC,OAAO,IAAI,IAAI,WAAW,UAAU,WAAW,MAAM;AAAA,IAC1E,WAAW,MAAM,QAAQ,QAAQ;AAC7B,YAAM,eAAe;AACrB,sBAAgB,CAAC;AAAA,IACrB,WAAW,MAAM,QAAQ,OAAO;AAC5B,YAAM,eAAe;AACrB,sBAAgB,WAAW,SAAS,CAAC;AAAA,IACzC,WAAW,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AACnD,YAAM,eAAe;AACrB,YAAM,MAAM,WAAW,YAAY;AACnC,UAAI,KAAK;AACL,sBAAc,IAAI,EAAE;AACpB,oBAAY;AAAA,MAChB;AAAA,IACJ,WAAW,MAAM,QAAQ,UAAU;AAC/B,YAAM,eAAe;AACrB,kBAAY;AAAA,IAChB;AAAA,EACJ;AAEA,EAAAE,YAAU,MAAM;AACZ,QAAI,CAAC,WAAY;AACjB,YAAQ,SAAS,iBAA8B,iBAAiB,EAAE,YAAY,GAAG,eAAe;AAAA,MAC5F,OAAO;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAC,cAAc,UAAU,CAAC;AAE7B,QAAM,aACF,SAAS,WAAW,SACd,SACA,SAAS,WAAW,kBAAkB,SAAS,WAAW,UACxD,SACA,SAAS,WAAW,WAAW,SAAS,WAAW,gBACjD,UACA;AAEd,QAAM,aAAa,UAAU,QAAQ,QAAQ,OAAO,SAAS,SAAS,IAAI,KAAK,SAAS,OAAO;AAC/F,QAAM,cACF,CAAC,cACD,SAAS,WAAW,iBACpB,SAAS,WAAW,WACpB,CAAC,WAAW;AAEhB,QAAM,cACF,UAAU,gBAAgB,OACpB,KACA,SAAS,gBAAgB,IACvB,mBACA;AAEZ,SACI,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9D,gBAAc;AAAA,MACd,eAAa;AAAA,MACb,mBAAiB,eAAe,OAAO;AAAA,MAEvC,0BAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,wBAAAA,OAAC,YAAO,WAAU,cACd;AAAA,0BAAAD,MAAC,QAAG,IAAI,eAAe,OAAO,IAAI,WAAU,aAAY,qCAExD;AAAA,UACA,gBAAAA,MAAC,OAAE,WAAU,gBAAe,gKAG5B;AAAA,WACJ;AAAA,QAEA,gBAAAC,OAAC,SAAI,WAAU,YACX;AAAA,0BAAAA,OAAC,SAAI,WAAW,0BAA0B,UAAU,IAAI,IAAI,UAAU,MAAK,UAAS,aAAU,UAC1F;AAAA,4BAAAD,MAAC,UAAK,WAAU,kBAAiB,eAAY,QAAO;AAAA,YACpD,gBAAAA,MAAC,UACI,mBAAS,WAAW,UAAU,SAAS,WAAW,eAC7C,oCACA,SAAS,kBACR,aAAa,gBAAgB,iCACxC;AAAA,aACJ;AAAA,UAEA,gBAAAC,OAAC,SAAI,WAAU,WAAU,MAAK,SAAQ,cAAW,cAC7C;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAW,SAAS,QAAQ,kCAAkC;AAAA,gBAC9D,gBAAc,SAAS;AAAA,gBACvB,SAAS,MAAM,QAAQ,KAAK;AAAA,gBAC/B;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAW,SAAS,SAAS,mCAAmC;AAAA,gBAChE,gBAAc,SAAS;AAAA,gBACvB,SAAS,MAAM,QAAQ,MAAM;AAAA,gBAChC;AAAA;AAAA,YAED;AAAA,aACJ;AAAA,UAEA,gBAAAC,OAAC,SAAI,WAAU,YACX;AAAA,4BAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,KAAK;AAAA,gBACL,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,iBAAc;AAAA,gBACd,iBAAe;AAAA,gBACf,iBAAe;AAAA,gBACf,oBAAkB;AAAA,gBAClB,UAAU,CAAC,WAAW;AAAA,gBACtB,SAAS,MAAM;AACX,sBAAI,CAAC,WAAW,OAAQ;AACxB,gCAAc,CAAC,SAAS,CAAC,IAAI;AAC7B,sBAAI,UAAU;AACV,0BAAM,MAAM,WAAW,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS,EAAE;AAC5D,oCAAgB,OAAO,IAAI,MAAM,CAAC;AAAA,kBACtC;AAAA,gBACJ;AAAA,gBACA,WAAW,CAAC,UAAU;AAClB,uBAAK,MAAM,QAAQ,eAAe,MAAM,QAAQ,YAAY,CAAC,YAAY;AACrE,0BAAM,eAAe;AACrB,kCAAc,IAAI;AAAA,kBACtB;AAAA,gBACJ;AAAA,gBAEC;AAAA,6BACG,gBAAAA,OAAAF,YAAA,EACI;AAAA,oCAAAC,MAAC,cAAW,MAAM,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM;AAAA,oBAC5E,gBAAAC,OAAC,UAAK,WAAU,kBACZ;AAAA,sCAAAD,MAAC,UAAK,WAAU,kBAAkB,mBAAS,MAAK;AAAA,sBAChD,gBAAAC,OAAC,UAAK,WAAU,mBACX;AAAA,oCAAY,SAAS,MAAM,SAAS,cAAc;AAAA,wBAAG;AAAA,wBACtD,gBAAAA,OAAC,UAAK,WAAW,CAAC,cAAc,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAChE;AAAA,oCAAU,SAAS,YAAY;AAAA,0BAAE;AAAA,2BACtC;AAAA,yBACJ;AAAA,uBACJ;AAAA,qBACJ,IAEA,gBAAAA,OAAC,UAAK,WAAU,kBACZ;AAAA,oCAAAD,MAAC,UAAK,WAAU,kBAAiB,6BAAe;AAAA,oBAChD,gBAAAA,MAAC,UAAK,WAAU,mBAAkB,oBAAC;AAAA,qBACvC;AAAA,kBAEJ,gBAAAA,MAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO,oBAEvD;AAAA;AAAA;AAAA,YACJ;AAAA,YAEC,aACG,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,KAAK;AAAA,gBACL,IAAI;AAAA,gBACJ,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,UAAU;AAAA,gBACV,WAAW;AAAA,gBAEV,qBAAW,IAAI,CAAC,KAAK,UAAU;AAC5B,wBAAM,iBAAiB,UAAU,OAAO,IAAI;AAC5C,wBAAM,SAAS,UAAU;AACzB,wBAAM,YACF,IAAI,gBAAgB,OACd,KACA,IAAI,gBAAgB,IAClB,mBACA;AACZ,yBACI,gBAAAC;AAAA,oBAAC;AAAA;AAAA,sBAEG,IAAI,GAAG,SAAS,QAAQ,KAAK;AAAA,sBAC7B,MAAK;AAAA,sBACL,iBAAe;AAAA,sBACf,WAAW;AAAA,wBACP;AAAA,wBACA,SAAS,cAAc;AAAA,wBACvB,iBAAiB,gBAAgB;AAAA,sBACrC,EACK,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,sBACb,cAAc,MAAM,gBAAgB,KAAK;AAAA,sBACzC,SAAS,MAAM;AACX,sCAAc,IAAI,EAAE;AACpB,oCAAY;AAAA,sBAChB;AAAA,sBAEA;AAAA,wCAAAD,MAAC,cAAW,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,MAAM;AAAA,wBAC7D,gBAAAC,OAAC,UAAK,WAAU,oBACZ;AAAA,0CAAAD,MAAC,UAAK,WAAU,oBAAoB,cAAI,MAAK;AAAA,0BAC7C,gBAAAA,MAAC,UAAK,WAAU,mBAAmB,cAAI,UAAS;AAAA,2BACpD;AAAA,wBACA,gBAAAC,OAAC,UAAK,WAAU,qBACZ;AAAA,0CAAAD,MAAC,UAAM,sBAAY,IAAI,MAAM,IAAI,cAAc,GAAE;AAAA,0BACjD,gBAAAA,MAAC,UAAK,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAC9D,oBAAU,IAAI,YAAY,GAC/B;AAAA,2BACJ;AAAA;AAAA;AAAA,oBA3BK,IAAI;AAAA,kBA4Bb;AAAA,gBAER,CAAC;AAAA;AAAA,YACL,IACA;AAAA,aACR;AAAA,UAEA,gBAAAC,OAAC,SAAI,WAAU,cACX;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,IAAI;AAAA,gBACJ,OAAO,YAAY,OAAO,GAAG;AAAA,gBAC7B,WAAU;AAAA,gBACV,cAAa;AAAA,gBACb,aAAY;AAAA,gBACZ,OAAO,WAAW,QAAQ,MAAM,WAAW;AAAA,gBAC3C,QAAQ,WAAW,QAAQ,SAAS;AAAA,gBACpC,gBAAc,QAAQ,WAAW,KAAK;AAAA,gBACtC,oBAAkB;AAAA,gBAClB,UAAU,CAAC,UAAU;AACjB,4BAAU,KAAK;AACf,yBAAO,MAAM,OAAO,KAAK;AAAA,gBAC7B;AAAA;AAAA,YACJ;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,IAAI;AAAA,gBACJ,OAAO,gBAAgB,OAAO,OAAO;AAAA,gBACrC,WAAU;AAAA,gBACV,cAAa;AAAA,gBACb,aAAY;AAAA,gBACZ,OAAO,WAAW,YAAY,UAAU,WAAW;AAAA,gBACnD,QAAQ,WAAW,QAAQ,SAAS;AAAA,gBACpC,gBAAc,QAAQ,WAAW,KAAK;AAAA,gBACtC,oBACI,cAAc,WACR,YAAY,OAAO,KACnB;AAAA,gBAEV,UAAU,CAAC,UAAU;AACjB,4BAAU,SAAS;AACnB,6BAAW,MAAM,OAAO,KAAK;AAAA,gBACjC;AAAA;AAAA,YACJ;AAAA,aACJ;AAAA,UAEC,cAAc,WACX,gBAAAC,OAAC,OAAE,IAAI,YAAY,OAAO,IAAI,WAAU,YAAW;AAAA;AAAA,YAChC,SAAS;AAAA,YAAK;AAAA,YAAI,YAAY,SAAS,MAAM,SAAS,cAAc;AAAA,YAAG;AAAA,YACrF,SAAS;AAAA,YAAM;AAAA,aACpB,IAEA,gBAAAD,MAAC,OAAE,WAAU,YAAW,MAAK,UACxB,mBAAS,WAAW,gBACf,sDACA,WAAW,SAAS,yCAC9B;AAAA,UAGH,WAAW,QACR,gBAAAA,MAAC,OAAE,WAAU,aAAY,MAAK,SACzB,qBAAW,OAChB,IACA;AAAA,UAEJ,gBAAAA,MAAC,SAAI,WAAU,WACV,wBACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,SAAQ;AAAA,cACR,WAAS;AAAA,cACT,OAAO,SAAS,QAAQ,QAAQ;AAAA,cAChC,UAAQ;AAAA,cACR,iBAAc;AAAA;AAAA,UAClB,IAEA,gBAAAA,MAAC,OAAE,WAAU,gBAAe,MAAM,WAAW,KAAI,uBAC7C,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,SAAQ;AAAA,cACR,WAAS;AAAA,cACT,OAAO,SAAS,QAAQ,QAAQ;AAAA,cAChC,UAAU;AAAA;AAAA,UACd,GACJ,GAER;AAAA,WACJ;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AQhcA,SAAS,aAAAQ,aAAW,SAAAC,QAAO,WAAAC,UAAS,UAAAC,UAAQ,YAAAC,kBAAgB;AAkBhD,gBAAAC,OA4MQ,QAAAC,cA5MR;AAJZ,SAASC,YAAW,EAAE,MAAM,KAAK,GAAmC;AAChE,QAAM,CAAC,QAAQ,SAAS,IAAIC,WAAS,KAAK;AAC1C,MAAI,QAAQ;AACR,WACI,gBAAAH,MAAC,UAAK,WAAU,mCAAkC,eAAY,QACzD,eAAK,MAAM,GAAG,CAAC,GACpB;AAAA,EAER;AACA,SACI,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,KAAK;AAAA,MACL,KAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAQ;AAAA,MACR,UAAS;AAAA,MACT,SAAS,MAAM,UAAU,IAAI;AAAA;AAAA,EACjC;AAER;AAEA,SAAS,UAAU;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKG;AACC,QAAM,YAAYI,SAA0B,IAAI;AAEhD,EAAAC,YAAU,MAAM;AACZ,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,OAAO,IAAI,MAAM,EAAE,OAAO,OAAO,QAAQ;AACxD,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK;AAEV,UAAM,MAAM,OAAO,oBAAoB;AACvC,UAAM,QAAQ,OAAO,eAAe;AACpC,UAAM,SAAS,OAAO,gBAAgB;AACtC,WAAO,QAAQ,QAAQ;AACvB,WAAO,SAAS,SAAS;AACzB,QAAI,aAAa,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AACrC,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AAEjC,QAAI,OAAO,SAAS,EAAG;AAEvB,UAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,OAAO;AAC3C,UAAM,MAAM,CAAC,MAAc,KAAM,QAAQ,KAAK,KAAM,OAAO,SAAS;AACpE,UAAM,MAAM,CAAC,MAAc,SAAS,KAAM,IAAI,OAAO,SAAU,SAAS;AACxE,UAAM,SAAS,KACT,iBAAiB,MAAM,EAAE,iBAAiB,YAAY,EAAE,KAAK,KAAK,YAClE,iBAAiB,MAAM,EAAE,iBAAiB,YAAY,EAAE,KAAK,KAAK;AAExE,QAAI,CAAC,eAAe;AAChB,UAAI,UAAU;AACd,UAAI,OAAO,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAE,CAAC;AAClC,aAAO,QAAQ,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACnD,UAAI,OAAO,IAAI,OAAO,SAAS,CAAC,GAAG,MAAM;AACzC,UAAI,OAAO,IAAI,CAAC,GAAG,MAAM;AACzB,UAAI,UAAU;AACd,YAAM,WAAW,IAAI,qBAAqB,GAAG,GAAG,GAAG,MAAM;AACzD,eAAS,aAAa,GAAG,GAAG,MAAM,IAAI;AACtC,eAAS,aAAa,GAAG,GAAG,MAAM,IAAI;AACtC,UAAI,YAAY;AAChB,UAAI,KAAK;AAAA,IACb;AAEA,QAAI,UAAU;AACd,QAAI,OAAO,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,CAAE,CAAC;AAClC,WAAO,QAAQ,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACnD,QAAI,YAAY;AAChB,QAAI,cAAc;AAClB,QAAI,OAAO;AAAA,EACf,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;AAE9B,SACI,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY;AAAA;AAAA,EAChB;AAER;AAEA,SAAS,SAAS,MAAmB,KAAc,KAA2B;AAC1E,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC5B,QAAI,QAAQ,QAAQ;AAChB,YAAMM,QAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,EAAE;AACrD,aAAO,QAAQ,QAAQA,OAAM,CAACA;AAAA,IAClC;AACA,UAAM,KAAK,EAAE,GAAG;AAChB,UAAM,KAAK,EAAE,GAAG;AAChB,UAAM,WAAW,MAAM,QAAQ,CAAC,OAAO,SAAS,OAAO,EAAE,CAAC;AAC1D,UAAM,WAAW,MAAM,QAAQ,CAAC,OAAO,SAAS,OAAO,EAAE,CAAC;AAC1D,QAAI,YAAY,SAAU,QAAO;AACjC,QAAI,SAAU,QAAO;AACrB,QAAI,SAAU,QAAO;AACrB,UAAM,MAAM,OAAO,EAAE,IAAI,OAAO,EAAE;AAClC,WAAO,QAAQ,QAAQ,MAAM,CAAC;AAAA,EAClC,CAAC;AACL;AAEA,SAAS,WAAW,EAAE,MAAM,GAA6B;AACrD,MAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,GAAG;AAC1C,WAAO,gBAAAN,MAAC,UAAK,WAAU,aAAY,oBAAC;AAAA,EACxC;AACA,QAAM,OAAO,SAAS,IAAI,mBAAmB;AAC7C,SAAO,gBAAAA,MAAC,UAAK,WAAW,CAAC,cAAc,IAAI,EAAE,KAAK,GAAG,GAAI,oBAAU,KAAK,GAAE;AAC9E;AAEO,IAAM,qBAAqB,CAAC;AAAA,EAC/B,SAAS,WAAW;AAAA,EACpB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACJ,MAA+B;AAC3B,QAAM,UAAUO,OAAM,EAAE,QAAQ,MAAM,EAAE;AACxC,QAAM,CAAC,MAAM,OAAO,IAAIJ,WAAqB,aAAa;AAC1D,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAS,qBAAqB,YAAY,CAAC;AACrE,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAkB,MAAM;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAkB,MAAM;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,KAAK;AACxD,QAAM,YAAYC,SAAuB,IAAI;AAC7C,QAAM,CAAC,UAAU,WAAW,IAAID,WAAS,KAAK;AAE9C,QAAM,WAAW,oBAAoB,EAAE,MAAM,OAAO,MAAM,UAAU,CAAC;AAErE,EAAAE,YAAU,MAAM;AACZ,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,KAAK,OAAO,WAAW,kCAAkC;AAC/D,UAAM,SAAS,MAAM,iBAAiB,GAAG,OAAO;AAChD,WAAO;AACP,OAAG,mBAAmB,UAAU,MAAM;AACtC,WAAO,MAAM,GAAG,sBAAsB,UAAU,MAAM;AAAA,EAC1D,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACZ,UAAM,OAAO,UAAU;AACvB,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,MAAM,YAAY,KAAK,aAAa,CAAC;AACtD,aAAS;AACT,SAAK,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC3D,WAAO,MAAM,KAAK,oBAAoB,UAAU,QAAQ;AAAA,EAC5D,GAAG,CAAC,CAAC;AAEL,EAAAA,YAAU,MAAM;AACZ,QAAI,SAAS,OAAO,UAAU,CAAC,SAAS,OAAO,SAAS,KAAK,GAAG;AAC5D,eAAS,SAAS,OAAO,CAAC,CAAE;AAAA,IAChC;AAAA,EACJ,GAAG,CAAC,SAAS,QAAQ,KAAK,CAAC;AAE3B,QAAM,WAAWG,SAAQ,MAAM;AAC3B,UAAM,OAAO,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,EAAE;AAAA,MACrC,CAAC,QAAQ,IAAI,MAAM,YAAY,MAAM,MAAM,YAAY;AAAA,IAC3D;AACA,UAAM,SAAS,SAAS,MAAM,SAAS,OAAO;AAC9C,WAAO,OAAO,YAAY,YAAY,UAAU,IAAI,OAAO,MAAM,GAAG,OAAO,IAAI;AAAA,EACnF,GAAG,CAAC,SAAS,MAAM,OAAO,SAAS,SAAS,OAAO,CAAC;AAEpD,QAAM,SAAS,CAAC,QAAiB;AAC7B,QAAI,QAAQ,SAAS;AACjB,iBAAW,CAAC,MAAO,MAAM,QAAQ,SAAS,KAAM;AAAA,IACpD,OAAO;AACH,iBAAW,GAAG;AACd,iBAAW,QAAQ,SAAS,QAAQ,MAAM;AAAA,IAC9C;AAAA,EACJ;AAEA,QAAM,aACF,SAAS,WAAW,SACd,SACA,SAAS,WAAW,kBAAkB,SAAS,WAAW,UACxD,SACA,SAAS,WAAW,WAAW,SAAS,WAAW,gBACjD,UACA;AAEd,QAAM,eACF,SAAS,WAAW,gBACd,wDACA,SAAS,WAAW,UAClB,+CACA,SAAS,WAAW,gBAAgB,SAAS,WAAW,SACtD,8BACA,MAAM,KAAK,aAAa,IAAI;AAE1C,SACI,gBAAAR;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,CAAC,eAAe,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC9D,gBAAc;AAAA,MACd,mBAAiB,eAAe,OAAO;AAAA,MAEvC,0BAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,wBAAAA,OAAC,YAAO,WAAU,cACd;AAAA,0BAAAD,MAAC,QAAG,IAAI,eAAe,OAAO,IAAI,WAAU,aAAY,iCAExD;AAAA,UACA,gBAAAC,OAAC,OAAE,WAAW,0BAA0B,UAAU,IAAI,MAAK,UAAS,aAAU,UAC1E;AAAA,4BAAAD,MAAC,UAAK,WAAU,kBAAiB,eAAY,QAAO;AAAA,YACpD,gBAAAA,MAAC,UACI,mBAAS,WAAW,SACf,SACA,SAAS,iBAAiB,oBACpC;AAAA,aACJ;AAAA,WACJ;AAAA,QAEA,gBAAAC,OAAC,SAAI,WAAU,YACX;AAAA,0BAAAA,OAAC,SAAI,WAAU,eACX;AAAA,4BAAAD,MAAC,SAAI,WAAU,WAAU,MAAK,SAAQ,cAAW,eAC3C,WAAC,QAAQ,SAAS,EAAmB,IAAI,CAAC,UACxC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,MAAK;AAAA,gBACL,WAAW,SAAS,QAAQ,2BAA2B;AAAA,gBACvD,gBAAc,SAAS;AAAA,gBACvB,SAAS,MAAM,QAAQ,KAAK;AAAA,gBAE3B,oBAAU,SAAS,SAAS;AAAA;AAAA,cANxB;AAAA,YAOT,CACH,GACL;AAAA,YACA,gBAAAA,MAAC,SAAI,WAAU,YAAW,MAAK,WAAU,cAAW,kBAC/C,mBAAS,OAAO,IAAI,CAAC,MAClB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEG,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,iBAAe,MAAM;AAAA,gBACrB,WAAW,MAAM,QAAQ,sBAAsB;AAAA,gBAC/C,SAAS,MAAM,SAAS,CAAC;AAAA,gBAExB;AAAA;AAAA,cAPI;AAAA,YAQT,CACH,GACL;AAAA,aACJ;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,WAAW,CAAC,cAAc,WAAW,gBAAgB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,cACjF,UAAU;AAAA,cACV,MAAK;AAAA,cACL,cAAW;AAAA,cAEX,0BAAAC,OAAC,WAAM,WAAU,aACb;AAAA,gCAAAD,MAAC,WACG,0BAAAA,MAAC,QAEO;AAAA,kBACI,CAAC,QAAQ,MAAM;AAAA,kBACf,CAAC,QAAQ,OAAO;AAAA,kBAChB,CAAC,eAAe,MAAM;AAAA,kBACtB,CAAC,gBAAgB,OAAO;AAAA,kBACxB,CAAC,eAAe,UAAU;AAAA,gBAC9B,EACF,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACpB,wBAAM,SAAS,YAAY;AAC3B,yBACI,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEG,OAAM;AAAA,sBACN,aACI,SACM,YAAY,QACR,cACA,eACJ;AAAA,sBAGV,0BAAAC;AAAA,wBAAC;AAAA;AAAA,0BACG,MAAK;AAAA,0BACL,WAAW,SAAS,uBAAuB;AAAA,0BAC3C,SAAS,MAAM,OAAO,GAAG;AAAA,0BAExB;AAAA;AAAA,4BACD,gBAAAD,MAAC,UAAK,WAAU,eAAc,eAAY,QACrC,mBAAU,YAAY,QAAQ,WAAM,WAAO,IAChD;AAAA;AAAA;AAAA,sBACJ;AAAA;AAAA,oBAnBK;AAAA,kBAoBT;AAAA,gBAER,CAAC,GACL,GACJ;AAAA,gBACA,gBAAAA,MAAC,WACI,WAAC,SAAS,SACP,gBAAAA,MAAC,QACG,0BAAAA,MAAC,QAAG,SAAS,GAAG,WAAU,aACrB,wBACL,GACJ,IAEA,SAAS,IAAI,CAAC,QACV,gBAAAC,OAAC,QACG;AAAA,kCAAAD,MAAC,QACG,0BAAAC,OAAC,SAAI,WAAU,YACX;AAAA,oCAAAD,MAACE,aAAA,EAAW,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM;AAAA,oBAC5C,gBAAAD,OAAC,SAAI,WAAU,kBACX;AAAA,sCAAAA,OAAC,UAAK,WAAU,YACX;AAAA,4BAAI;AAAA,wBACL,gBAAAA,OAAC,UAAK,WAAU,aAAY;AAAA;AAAA,0BAAE,IAAI;AAAA,2BAAM;AAAA,yBAC5C;AAAA,sBACA,gBAAAD,MAAC,UAAK,WAAU,YAAY,cAAI,UAAS;AAAA,uBAC7C;AAAA,qBACJ,GACJ;AAAA,kBACA,gBAAAA,MAAC,QAAG,WAAU,aACT,sBAAY,IAAI,MAAM,IAAI,cAAc,GAC7C;AAAA,kBACA,gBAAAA,MAAC,QACG,0BAAAA,MAAC,cAAW,OAAO,IAAI,aAAa,GACxC;AAAA,kBACA,gBAAAA,MAAC,QACG,0BAAAA,MAAC,cAAW,OAAO,IAAI,cAAc,GACzC;AAAA,kBACA,gBAAAA,MAAC,QAAG,WAAU,kBACV,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,QAAQ,IAAI;AAAA,sBACZ,KAAK,IAAI,eAAe,MAAM;AAAA,sBAC9B,OAAO,GAAG,IAAI,IAAI;AAAA,sBAClB;AAAA;AAAA,kBACJ,GACJ;AAAA,qBA7BK,IAAI,EA8Bb,CACH,GAET;AAAA,iBACJ;AAAA;AAAA,UACJ;AAAA,WACJ;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;ACvWA,SAAS,WAAAS,WAAS,YAAAC,kBAAgB;AA8BtB,gBAAAC,OASA,QAAAC,cATA;AAxBZ,IAAMC,iBAAgB,CAAC,SAA6B,QAAQ,QAAQ,gBAAgB,KAAK,IAAI,CAAC;AAQvF,IAAM,+BAA+B;AAAA,EACxC,OAAO;AAAA,EACP,UAAU;AACd;AAOA,IAAM,aAAa,CAAC,EAAE,QAAQ,SAAS,MAAmD;AACtF,QAAM,QAAQ,OAAO,YAAY;AACjC,QAAM,WAAWA,eAAc,OAAO,IAAI;AAE1C,SACI,gBAAAD,OAAC,SAAI,WAAU,WACX;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,OAAO,WAAW,OAAO;AAAA,QAC9B,WAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAQ;AAAA,QACR,KAAK,OAAO;AAAA,QACZ,OAAO;AAAA;AAAA,IACX;AAAA,IAEA,gBAAAC,OAAC,QAAG,WAAU,gBACT;AAAA,aAAO;AAAA,MAAK;AAAA,MAAG,OAAO;AAAA,OAC3B;AAAA,IAEA,gBAAAD,MAAC,OAAE,WAAU,cACR,iBAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,MACnC,gBAAAC,OAAC,UACI;AAAA;AAAA,MACA,IAAI,OAAO,QAAQ,MAAM,IAAI,EAAE,SAAS,KAAK,gBAAAD,MAAC,QAAG;AAAA,SAF3C,CAGX,CACH,GACL;AAAA,IAEC,OAAO,QACJ,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb;AAAA,QACA,KAAK,WAAW,wBAAwB;AAAA,QACxC,QAAQ,WAAW,WAAW;AAAA;AAAA,IAClC,GACJ;AAAA,KAER;AAER;AAQO,IAAM,iBAAiB,CAAC;AAAA,EAC3B,QAAQ,6BAA6B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,6BAA6B;AAAA,EACxC;AAAA,EACA,GAAG;AACP,MAA2B;AACvB,QAAM,CAAC,kBAAkB,mBAAmB,IAAIG;AAAA,IAC5C,yBAAyB,QAAQ,CAAC,GAAG;AAAA,EACzC;AAEA,QAAM,eAAe,mBAAmB;AACxC,QAAM,WAAW,eAAe,iBAAiB;AAEjD,QAAM,kBAAkBC;AAAA,IACpB,MAAM,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,QAAQ;AAAA,IAC3D,CAAC,SAAS,QAAQ;AAAA,EACtB;AAEA,QAAM,kBAAkB,CAAC,OAAe;AACpC,QAAI,CAAC,aAAc,qBAAoB,EAAE;AACzC,qBAAiB,EAAE;AAAA,EACvB;AAEA,SACI,gBAAAJ,MAAC,aAAQ,WAAW,CAAC,cAAc,aAAa,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAI,GAAG,OAC/E,0BAAAC,OAAC,SAAI,WAAU,gBACV;AAAA,aAAS,gBAAAD,MAAC,QAAG,WAAU,YAAY,iBAAM;AAAA,IAE1C,gBAAAA,MAAC,SAAI,WAAU,eACX,0BAAAA,MAAC,QAAK,UAAU,YAAY,IAAI,OAAO,SAAS,UAAU,iBAAiB,GAC/E;AAAA,IAEA,gBAAAA,MAAC,SAAI,WAAU,WACV,0BAAgB,IAAI,CAAC,QAAQ,UAC1B,gBAAAA,MAAC,cAA2C,UAAoB,UAA/C,GAAG,OAAO,IAAI,IAAI,KAAK,EAAwC,CACnF,GACL;AAAA,KACJ,GACJ;AAER;;;ACtFgB,SACI,OAAAK,OADJ,QAAAC,cAAA;AA5BhB,IAAM,kBAAgC,CAAC,UAAU,UAAU,QAAQ,UAAU;AAE7E,IAAM,gBAAgB,CAAC,MAAgB,UACnC,KAAK,UAAU,gBAAgB,KAAK,KAAK;AAatC,IAAM,QAAQ,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA;AACJ,MAAkB;AACd,SACI,gBAAAD,MAAC,aAAQ,WAAU,SACf,0BAAAC,OAAC,SAAI,WAAU,oBACX;AAAA,oBAAAA,OAAC,YAAO,WAAU,iBACd;AAAA,sBAAAD,MAAC,QAAG,WAAU,gBAAgB,iBAAM;AAAA,MACnC,eAAe,gBAAAA,MAAC,OAAE,WAAU,sBAAsB,uBAAY;AAAA,OACnE;AAAA,IAEA,gBAAAA,MAAC,QAAG,WAAU,eACT,gBAAM,IAAI,CAAC,MAAM,UAAU;AACxB,YAAM,SAAS,cAAc,MAAM,KAAK;AAExC,aACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEG,WAAW,4BAA4B,MAAM;AAAA,UAE7C,0BAAAC,OAAC,SAAI,WAAU,gBACX;AAAA,4BAAAA,OAAC,SAAI,WAAU,mBACX;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cAChB;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,oBACX,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK,WAAW,KAAK;AAAA,kBAC1B,WAAU;AAAA,kBACV,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAQ;AAAA;AAAA,cACZ,GACJ;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,eAAY;AAAA;AAAA,cAChB;AAAA,eACJ;AAAA,YAEA,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,8BAAAD,MAAC,QAAG,WAAU,eAAe,eAAK,MAAK;AAAA,cACvC,gBAAAA,MAAC,OAAE,WAAU,iBAAiB,eAAK,QAAO;AAAA,eAC9C;AAAA,YAEA,gBAAAC,OAAC,SAAI,WAAU,eACX;AAAA,8BAAAD,MAAC,OAAE,WAAU,qBAAqB,eAAK,OAAM;AAAA,cAC7C,gBAAAA,MAAC,OAAE,WAAU,2BACR,eAAK,aACV;AAAA,eACJ;AAAA,YAEC,KAAK,eACF,gBAAAA,MAAC,OAAE,WAAU,sBACR,eAAK,aACV;AAAA,aAER;AAAA;AAAA,QA1CK,KAAK;AAAA,MA2Cd;AAAA,IAER,CAAC,GACL;AAAA,IAEC,YACG,gBAAAA,MAAC,SAAI,WAAU,iBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA;AAAA,IACb,GACJ;AAAA,KAER,GACJ;AAER;;;AClFgB,SACI,OAAAE,OADJ,QAAAC,cAAA;AAfT,IAAM,iBAAiB,CAAC;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,MACI,gBAAAD;AAAA,EAAC;AAAA;AAAA,IACG,WAAW,CAAC,mBAAmB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IACjE,GAAG;AAAA,IAEJ,0BAAAC,OAAC,SAAI,WAAU,8BACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,4BACX;AAAA,wBAAAA,OAAC,YAAO,WAAU,2BACd;AAAA,0BAAAD,MAAC,QAAG,WAAU,0BAA0B,iBAAM;AAAA,UAC9C,gBAAAA,MAAC,OAAE,WAAU,2BAA2B,kBAAO;AAAA,WACnD;AAAA,QAEA,gBAAAA,MAAC,QAAG,WAAU,yBACT,kBAAQ,IAAI,CAAC,QAAQ,UAClB,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YAGV;AAAA,8BAAAD,MAAC,UAAK,WAAU,2BAA2B,iBAAO,QAAO;AAAA,cACzD,gBAAAA,MAAC,UAAK,WAAU,2BAA2B,iBAAO,QAAO;AAAA;AAAA;AAAA,UAHpD,GAAG,OAAO,MAAM,IAAI,KAAK;AAAA,QAIlC,CACH,GACL;AAAA,SACJ;AAAA,MAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA,UACL,SAAQ;AAAA;AAAA,MACZ;AAAA,OACJ;AAAA;AACJ;;;ACnBkB,gBAAAE,OAYU,QAAAC,cAZV;AAZf,IAAM,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACJ,MAA0B;AACtB,QAAM,YAAY,gBAAAD,MAAC,UAAO,aAAY,SAAQ,SAAQ,WAAU,OAAO,UAAU,SAAS,YAAY;AAEtG,SACI,gBAAAA,MAAC,aAAQ,WAAU,kBACf,0BAAAC,OAAC,SAAI,WAAU,6BACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,uBACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,2BACX;AAAA,wBAAAD,MAAC,QAAG,WAAU,yBAAyB,iBAAM;AAAA,QAE7C,gBAAAC,OAAC,SAAI,WAAU,wBACX;AAAA,0BAAAD,MAAC,OAAE,WAAU,6BAA6B,uBAAY;AAAA,UACrD,QACG,gBAAAC,OAAC,OAAE,WAAU,6BACT;AAAA,4BAAAD,MAAC,YAAQ,eAAK,OAAM;AAAA,YAAS;AAAA,YAAE,KAAK;AAAA,aACxC;AAAA,UAEH,eACG,gBAAAA,MAAC,OAAE,WAAU,6BAA6B,uBAAY;AAAA,WAE9D;AAAA,QAEC,YACG,gBAAAA,MAAC,SAAI,WAAU,uBACV,oBAAU,gBAAAA,MAAC,OAAE,MAAM,SAAU,qBAAU,IAAO,WACnD;AAAA,SAER;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,iCACX,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA,UACL,SAAQ;AAAA;AAAA,MACZ,GACJ;AAAA,OACJ;AAAA,IAEA,gBAAAA,MAAC,QAAG,WAAU,yBACT,gBAAM,IAAI,CAAC,MAAM,UACd,gBAAAC,OAAC,QAAG,WAAU,wBACV;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK,KAAK;AAAA,UACV,KAAK,KAAK,WAAW;AAAA,UACrB,eAAY;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAQ;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,oCAAoC,eAAK,aAAY;AAAA,SAV5B,KAW1C,CACH,GACL;AAAA,KACJ,GACJ;AAER;;;AC5CQ,gBAAAE,OA6BgB,QAAAC,cA7BhB;AA/BR,IAAM,gBAAsC,CAAC,EAAE,OAAO,cAAc,MAAM,IAAI,CAAC;AAUxE,IAAM,gCAAgC;AAAA,EACzC,OAAO;AAAA,EACP,aACI;AAAA,EACJ,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAOA,IAAMC,oBAAmB,MACrB,gBAAAF,MAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,eAAY,QAAO,WAAU,SAC9D,0BAAAA;AAAA,EAAC;AAAA;AAAA,IACG,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACnB,GACJ;AAKG,IAAM,iBAAiB,CAAC;AAAA,EAC3B,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,cAAc,aAAa;AAAA,EAC3B;AAAA,EACA,GAAG;AACP,MAA2B;AACvB,QAAM,gBAAgB,SAAS,MAAM,SAAS,IAAI,QAAQ;AAE1D,QAAM,YAAY,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SACI,gBAAAA,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAA,MAAC,SAAI,WAAU,aACX,0BAAAC,OAAC,SAAI,WAAU,aACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,gBACX;AAAA,sBAAAD,MAAC,cAAW,WAAU,cAAc,iBAAM;AAAA,MACzC,eAAe,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,uBAAY;AAAA,OACjE;AAAA,IAEA,gBAAAA,MAAC,QAAG,WAAU,cACT,wBAAc,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,aAAa,KAAK,YAAY;AACpC,aACI,gBAAAA,MAAC,QAAsB,WAAU,mBAC7B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,aAAY;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,MAAM,aAAa,gBAAAA,MAACE,mBAAA,EAAiB,IAAK;AAAA,UAC1C,cAAa;AAAA,UACb,aAAa,CAAC;AAAA,UACd,QAAQ,aAAa,WAAW;AAAA,UAChC,KAAK,aAAa,wBAAwB;AAAA;AAAA,MAC9C,KAXK,KAAK,MAAM,CAYpB;AAAA,IAER,CAAC,GACL;AAAA,KACJ,GACJ,GACJ,GACJ;AAER;;;ACpGA;AAAA,EACI,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIG;AA6EK,SAgCQ,YAAAC,YAhCR,OAAAC,OAgCQ,QAAAC,cAhCR;AAjEL,IAAM,kCAAsD;AAAA,EAC/D;AAAA,IACI,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY,CAAC;AAAA,IACb,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;AAAA,IAC7B,WAAW,CAAC,EAAE,OAAO,WAAW,CAAC;AAAA,EACrC;AACJ;AAEA,SAASC,UAAS,OAA+B;AAC7C,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,WAAW,IAAI,EAAG,QAAO;AAC7D,MAAI;AACA,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,IAAI,aAAa,WAAW,QAAQ;AAAA,EAC/C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,SAASC,eAAc,OAA8B;AACjD,QAAM,OAAOD,UAAS,KAAK;AAC3B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACA,UAAM,WAAW,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,IAAI,EAAE;AAC7D,WAAO,SAAS,YAAY,EAAE,SAAS,SAAS,IAAI,OAAO;AAAA,EAC/D,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAMA,IAAM,YAAyD;AAAA,EAC3D,OAAO;AAAA,IACH;AAAA,IACA;AAAA,EACJ;AAAA,EACA,iBAAiB;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAAA,EACA,aAAa;AAAA,IACT;AAAA,EACJ;AAAA,EACA,mBAAmB;AAAA,IACf;AAAA,EACJ;AAAA,EACA,kBAAkB;AAAA,IACd;AAAA,IACA;AAAA,EACJ;AACJ;AAEA,SAAS,SAAS,EAAE,MAAM,QAAQ,GAAkD;AAEhF,QAAM,WAAWA,UAAS,OAAO;AACjC,MAAI,UAAU;AACV,WACI,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAY;AAAA,QACZ,SAAQ;AAAA,QACR,UAAS;AAAA;AAAA,IACb;AAAA,EAER;AACA,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,UAAU,IAAI;AAC5B,MAAI,CAAC,OAAO;AACR,UAAM,WACF,SAAS,iBAAiB,OAAO,SAAS,cAAc,OAAO;AACnE,WAAO,gBAAAA,MAAC,UAAK,WAAU,qBAAoB,eAAY,QAAQ,oBAAS;AAAA,EAC5E;AACA,SACI,gBAAAA,MAAC,SAAI,WAAU,iBAAgB,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE,gBAAM,IAAI,CAAC,MACR,gBAAAA,MAAC,UAAa,GAAM,MAAK,kBAAd,CAA6B,CAC3C,GACL;AAER;AAEA,SAAS,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAuC;AAClE,SACI,gBAAAA,MAAC,QAAG,WAAU,iBACT,gBAAM,IAAI,CAAC,MAAM,UAAU;AACxB,UAAM,OAAOE,UAAS,KAAK,IAAI;AAC/B,UAAM,UACF,gBAAAD,OAAAF,YAAA,EACI;AAAA,sBAAAC,MAAC,YAAS,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS;AAAA,MAClD,gBAAAA,MAAC,UAAM,eAAK,OAAM;AAAA,OACtB;AAEJ,WACI,gBAAAA,MAAC,QACI,iBAAO,gBAAAA,MAAC,OAAE,MAAa,mBAAQ,IAAO,gBAAAA,MAAC,UAAM,mBAAQ,KADjD,GAAG,KAAK,KAAK,IAAI,KAAK,EAE/B;AAAA,EAER,CAAC,GACL;AAER;AAEA,SAASI,eAAc,EAAE,QAAQ,GAAyB;AACtD,SACI,gBAAAH,OAAC,SAAI,WAAU,oBAAmB,SAAQ,aAAY,eAAY,QAC9D;AAAA,oBAAAD,MAAC,YAAO,WAAU,oBAAmB,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC3D,UACG,gBAAAC,OAAAF,YAAA,EACI;AAAA,sBAAAC,MAAC,UAAK,WAAU,qBAAoB,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,MAAK,IAAG,KAAI;AAAA,MAC/E,gBAAAA,MAAC,UAAK,WAAU,qBAAoB,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,MAAK,IAAG,KAAI;AAAA,OACnF,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,GAAE;AAAA;AAAA,IACN;AAAA,KAER;AAER;AASA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAuB;AACnB,QAAM,MAAMG,eAAc,UAAU,GAAG;AACvC,QAAM,YAAYD,UAAS,UAAU,SAAS;AAC9C,QAAM,YAAY,gBAAgB,MAAM,IAAI,UAAU,MAAM,UAAU,KAAK,GACtE,QAAQ,mBAAmB,GAAG;AAEnC,SACI,gBAAAD,OAAC,SAAI,WAAU,sBAGX;AAAA,oBAAAD,MAAC,SAAI,IAAI,WAAW,WAAU,uBAAsB,eAAY,QAC3D,gBACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,SAAS;AAAA,QACT,MAAI;AAAA,QACJ,QACI,YACI,gBAAAA,MAAC,SAAI,KAAK,WAAW,KAAI,IAAG,SAAQ,QAAO,UAAS,SAAQ,IAC5D;AAAA;AAAA,IAEZ,IACA,MACR;AAAA,IACC,aAAa,CAAC,UACX,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAY;AAAA,QACZ,SAAQ;AAAA,QACR,UAAS;AAAA;AAAA,IACb,IACA;AAAA,IACH,MACG,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAW,sBAAsB,UAAU,kCAAkC,EAAE;AAAA,QAC/E,iBAAe;AAAA,QACf,gBAAc;AAAA,QACd,cAAY,GAAG,UAAU,UAAU,MAAM,IAAI,UAAU,KAAK;AAAA,QAC5D,SAAS;AAAA,QAET,0BAAAA,MAACI,gBAAA,EAAc,SAAkB;AAAA;AAAA,IACrC,IACA;AAAA,KACR;AAER;AAWA,SAAS,YAAY;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAqB;AACjB,QAAM,cACF,gBAAAJ,MAAC,SAAI,WAAU,mBACX,0BAAAA,MAAC,OAAG,eAAK,aAAY,GACzB;AAGJ,QAAM,aACF,gBAAAA,MAAC,SAAI,WAAW,kCAAkC,KAAK,IAAI,KAAK,WAAW,QAAQ,CAAC,CAAC,IAChF,eAAK,WAAW,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,UAAU;AACnD,UAAM,MAAM,GAAG,KAAK,EAAE,IAAI,UAAU,MAAM,KAAK;AAC/C,WACI,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEG;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,SAAS,QAAQ,QAAQ,GAAG,CAAC;AAAA,QAC7B,UAAU,MACN,WAAW,CAAC,aAAa;AAAA,UACrB,GAAG;AAAA,UACH,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG;AAAA,QACvB,EAAE;AAAA;AAAA,MARD;AAAA,IAUT;AAAA,EAER,CAAC,GACL;AAGJ,QAAM,WACF,gBAAAC,OAAC,SAAI,WAAU,gBACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,kBACX;AAAA,sBAAAD,MAAC,QAAI,wBAAa;AAAA,MAClB,gBAAAA,MAAC,YAAS,OAAO,KAAK,SAAS;AAAA,OACnC;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,sBAAAD,MAAC,QAAI,0BAAe;AAAA,MACpB,gBAAAA,MAAC,YAAS,OAAO,KAAK,WAAW;AAAA,OACrC;AAAA,KACJ;AASJ,QAAM,SACF,YAAY,YAAY,KAAK,WAAW,WAAW,IAAI,UAAU;AACrE,QAAM,cAAc,0BAA0B,OAAO,gBAAgB,MAAM;AAE3E,MAAI,WAAW,SAAS;AACpB,WACI,gBAAAC,OAAC,SAAI,WAAW,aACX;AAAA;AAAA,MAGD,gBAAAA,OAAC,SAAI,WAAU,mBACV;AAAA;AAAA,QACA;AAAA,SACL;AAAA,OACJ;AAAA,EAER;AAEA,SACI,gBAAAA,OAAC,SAAI,WAAW,aACX;AAAA;AAAA,IACA;AAAA,IACA;AAAA,KACL;AAER;AAqBA,SAAS,YAAY;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAqB;AACjB,QAAM,aAAa,KAAK;AACxB,QAAM,CAAC,aAAa,cAAc,IAAII,WAAS,CAAC;AAChD,QAAM,aAAaC,SAAqC,CAAC,CAAC;AAG1D,QAAM,YAAY,KAAK,IAAI,aAAa,KAAK,IAAI,WAAW,SAAS,GAAG,CAAC,CAAC;AAI1E,EAAAC,YAAU,MAAM;AACZ,eAAW,CAAC,CAAC;AAAA,EACjB,GAAG,CAAC,WAAW,UAAU,CAAC;AAE1B,QAAM,aAAa,QAAQ,KAAK,WAAW,KAAK,QAAQ,SAAS,CAAC;AAClE,QAAM,eAAe,QAAQ,KAAK,aAAa,KAAK,UAAU,SAAS,CAAC;AAIxE,QAAM,kBAAkB,CAAC,UAA8C;AACnE,UAAM,OAAO,WAAW,SAAS;AACjC,QAAI,OAAsB;AAE1B,QAAI,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,aAAa;AACzD,aAAO,cAAc,OAAO,IAAI,YAAY;AAAA,IAChD,WAAW,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AAC7D,aAAO,cAAc,IAAI,OAAO,YAAY;AAAA,IAChD,WAAW,MAAM,QAAQ,QAAQ;AAC7B,aAAO;AAAA,IACX,WAAW,MAAM,QAAQ,OAAO;AAC5B,aAAO;AAAA,IACX;AAEA,QAAI,SAAS,KAAM;AACnB,UAAM,eAAe;AACrB,mBAAe,IAAI;AACnB,eAAW,QAAQ,IAAI,GAAG,MAAM;AAAA,EACpC;AAEA,SACI,gBAAAN,OAAC,SAAI,WAAU,iCACX;AAAA,oBAAAD,MAAC,SAAI,WAAU,oBAGV,qBAAW,IAAI,CAAC,WAAW,UAAU;AAClC,YAAM,MAAM,GAAG,KAAK,EAAE,IAAI,UAAU,MAAM,KAAK;AAC/C,YAAM,WAAW,UAAU;AAE3B,aACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEG,WAAU;AAAA,UACV,IAAI,GAAG,QAAQ,UAAU,KAAK;AAAA,UAC9B,MAAK;AAAA,UACL,mBAAiB,GAAG,QAAQ,WAAW,KAAK;AAAA,UAC5C,QAAQ,CAAC;AAAA,UAER,qBACG,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG;AAAA,cACA,QAAQ,KAAK;AAAA,cACb,SAAS,QAAQ,QAAQ,GAAG,CAAC;AAAA,cAC7B,UAAU,MACN,WAAW,CAAC,aAAa;AAAA,gBACrB,GAAG;AAAA,gBACH,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG;AAAA,cACvB,EAAE;AAAA;AAAA,UAEV,IACA;AAAA;AAAA,QAnBC;AAAA,MAoBT;AAAA,IAER,CAAC,GACL;AAAA,IAEA,gBAAAC,OAAC,SAAI,WAAU,mBACV;AAAA,iBAAW,SAAS,IACjB,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAY,GAAG,KAAK,KAAK;AAAA,UACzB,WAAW;AAAA,UAEV,qBAAW,IAAI,CAAC,WAAW,UAAU;AAClC,kBAAM,WAAW,UAAU;AAC3B,kBAAM,UAAUE,UAAS,UAAU,OAAO;AAE1C,mBACI,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBAEG,KAAK,CAAC,SAAS;AACX,6BAAW,QAAQ,KAAK,IAAI;AAAA,gBAChC;AAAA,gBACA,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,IAAI,GAAG,QAAQ,WAAW,KAAK;AAAA,gBAC/B,iBAAe,GAAG,QAAQ,UAAU,KAAK;AAAA,gBACzC,iBAAe;AAAA,gBACf,cAAY,UAAU;AAAA,gBACtB,UAAU,WAAW,IAAI;AAAA,gBACzB,WAAW,oBACP,WAAW,+BAA+B,EAC9C;AAAA,gBACA,SAAS,MAAM,eAAe,KAAK;AAAA,gBAElC,oBACG,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,WAAU;AAAA,oBACV,KAAK;AAAA,oBACL,KAAI;AAAA,oBACJ,eAAY;AAAA,oBACZ,SAAQ;AAAA,oBACR,UAAS;AAAA;AAAA,gBACb,IAEA,gBAAAA,MAAC,UAAK,WAAU,2BACX,oBAAU,OACf;AAAA;AAAA,cA5BC,GAAG,KAAK,EAAE,WAAW,UAAU,MAAM,KAAK;AAAA,YA8BnD;AAAA,UAER,CAAC;AAAA;AAAA,MACL,IACA;AAAA,MAEJ,gBAAAA,MAAC,QAAG,WAAU,oBAAoB,eAAK,OAAM;AAAA,MAE7C,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAA,MAAC,OAAG,eAAK,aAAY,GACzB;AAAA,MAIC,cAAc,eACX,gBAAAC,OAAC,SAAI,WAAU,gBACV;AAAA,qBACG,gBAAAA,OAAC,SAAI,WAAU,kBACX;AAAA,0BAAAD,MAAC,QAAI,wBAAa;AAAA,UAClB,gBAAAA,MAAC,YAAS,OAAO,KAAK,SAAS;AAAA,WACnC,IACA;AAAA,QACH,eACG,gBAAAC,OAAC,SAAI,WAAU,kBACX;AAAA,0BAAAD,MAAC,QAAI,0BAAe;AAAA,UACpB,gBAAAA,MAAC,YAAS,OAAO,KAAK,WAAW;AAAA,WACrC,IACA;AAAA,SACR,IACA;AAAA,OACR;AAAA,KACJ;AAER;AAEO,SAAS,aAAa;AAAA,EACzB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,eAAe;AAAA,EACf,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAsB;AAClB,QAAM,cAAc,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,SAAS,MAAM,EAAE,IAAI,CAAC;AAC/E,QAAM,CAAC,kBAAkB,mBAAmB,IAAIK;AAAA,IAC5C,mBAAmB,YAAY,CAAC,GAAG,MAAM;AAAA,EAC7C;AACA,QAAM,aACF,YAAY,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,GAAG,MAClD,YAAY,KAAK,CAAC,SAAS,KAAK,OAAO,gBAAgB,GAAG,MAC1D,YAAY,CAAC,GAAG,MAChB;AACJ,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAkC,CAAC,CAAC;AAClE,QAAM,cAAcG,OAAM,EAAE,QAAQ,MAAM,EAAE;AAC5C,QAAM,YAAY,iBAAiB,WAAW;AAC9C,QAAM,UAAU;AAEhB,EAAAD,YAAU,MAAM;AACZ,eAAW,CAAC,CAAC;AAAA,EACjB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,aAAa,CAAC,OAAe;AAC/B,QAAI,aAAa,OAAW,qBAAoB,EAAE;AAClD,eAAW,EAAE;AAAA,EACjB;AAEA,QAAM,YAAY,CAAC,MAAM,OAAO,OAAO,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE9E,SACI,gBAAAP,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAC,OAAC,SAAI,WAAU,aACX;AAAA,oBAAAA,OAAC,YAAO,WAAU,cACd;AAAA,sBAAAD,MAAC,WAAQ,WAAU,eAAe,mBAAQ;AAAA,MACzC,YAAY,UAAU,YAAY,SAAS,IACxC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAO,YAAY,IAAI,CAAC,UAAU;AAAA,YAC9B,IAAI,KAAK;AAAA,YACT,OAAO,KAAK,SAAS,KAAK;AAAA,UAC9B,EAAE;AAAA,UACF,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,UACV,cAAY,GAAG,OAAO;AAAA,UACtB,WAAU;AAAA;AAAA,MACd,IACA;AAAA,OACR;AAAA,IAEC,YAAY,WAAW,IAAI,OAAO,YAAY,SAC3C,gBAAAA,MAAC,SAAI,WAAU,cACV,sBAAY,IAAI,CAAC,MAAM,UAAU;AAC9B,YAAM,WAAW,KAAK,OAAO;AAC7B,aACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEG,IAAI,GAAG,SAAS,UAAU,KAAK;AAAA,UAC/B,MAAK;AAAA,UACL,mBAAiB,GAAG,SAAS,QAAQ,KAAK;AAAA,UAC1C,QAAQ,CAAC;AAAA,UACT,UAAU;AAAA,UAEV,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG;AAAA,cACA,SAAQ;AAAA,cACR;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACJ;AAAA;AAAA,QAdK,KAAK;AAAA,MAed;AAAA,IAER,CAAC,GACL,IACA,YAAY,WACZ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM,YAAY,CAAC;AAAA,QACnB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAM,YAAY,CAAC;AAAA,QACnB,SAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,IAGH,aACG,gBAAAC,OAAC,OAAE,WAAU,kBACT;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,eAAY;AAAA,UAEZ;AAAA,4BAAAD,MAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,YACtE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACG,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,eAAc;AAAA;AAAA,YAClB;AAAA,YACA,gBAAAA,MAAC,YAAO,IAAG,KAAI,IAAG,OAAM,GAAE,QAAO,MAAK,gBAAe;AAAA;AAAA;AAAA,MACzD;AAAA,MACA,gBAAAA,MAAC,UAAM,sBAAW;AAAA,OACtB,IACA;AAAA,KACR,GACJ;AAER;;;AC7lBA,IAAM,mBAAmB;AACzB,IAAM,SAAS;AAEf,IAAM,QAA8B;AAAA,EAChC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACV;AACA,IAAM,gBAAsC;AAAA,EACxC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACV;AACA,IAAM,cAAoC;AAAA,EACtC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACV;AACA,IAAM,kBAAwC;AAAA,EAC1C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACV;AACA,IAAM,mBAAyC;AAAA,EAC3C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACV;AACA,IAAM,eAAqC;AAAA,EACvC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS,GAAG,gBAAgB;AAAA,EAC5B,MAAM;AACV;AACA,IAAM,YAAkC;AAAA,EACpC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS,GAAG,gBAAgB;AAAA,EAC5B,MAAM;AACV;AAEA,IAAM,kBAAkB,CAAC,OAAO,eAAe,aAAa,eAAe;AAC3E,IAAM,iBAAiB,CAAC,cAAc,SAAS;AAExC,IAAM,gCAAmD;AAAA,EAC5D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,IACf;AAAA,IACA;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,IACf;AAAA,IACA;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,IACf;AAAA,EACJ;AACJ;AAEO,IAAM,oCAAuD;AAAA,EAChE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS,CAAC,eAAe;AAAA,MACzB,WAAW;AAAA,IACf;AAAA,EACJ;AACJ;AAEO,IAAM,gCAAmD;AAAA,EAC5D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS,CAAC,eAAe;AAAA,MACzB,WAAW,CAAC,YAAY;AAAA,IAC5B;AAAA,EACJ;AACJ;AAEO,IAAM,8BAAiD;AAAA,EAC1D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS,CAAC,eAAe;AAAA,MACzB,WAAW,CAAC,YAAY;AAAA,IAC5B;AAAA,EACJ;AACJ;AAEO,IAAM,oCAAuD;AAAA,EAChE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,QAClB;AAAA,MACJ;AAAA,MACA,SAAS,CAAC,iBAAiB,OAAO,kBAAkB,WAAW;AAAA,MAC/D,WAAW;AAAA,IACf;AAAA,EACJ;AACJ;AAWO,IAAM,uCAA0D;AAAA,EACnE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,IACH;AAAA,MACI,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACI;AAAA,MACJ,YAAY;AAAA,QACR;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,UACd,SAAS,GAAG,gBAAgB;AAAA,QAChC;AAAA,QACA;AAAA,UACI,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,KAAK,GAAG,MAAM;AAAA,UACd,SAAS,GAAG,gBAAgB;AAAA,QAChC;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACJ;;;AClOgB,SACI,OAAAS,OADJ,QAAAC,cAAA;AArBhB,IAAMC,iBAAyC,CAAC,EAAE,OAAO,gBAAgB,MAAM,IAAI,CAAC;AAI7E,IAAM,oBAAoB,CAAC;AAAA,EAC9B,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,cAAc,aAAa;AAAA,EAC3B;AAAA,EACA,GAAG;AACP,MAA8B;AAC1B,QAAM,gBAAgB,SAAS,MAAM,SAAS,IAAI,QAAQA;AAC1D,QAAM,aAAa,CAAC,CAAC,WAAW,QAAQ,SAAS;AAEjD,QAAM,YAAY,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SACI,gBAAAF,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAC,OAAC,SAAI,WAAU,gBACX;AAAA,oBAAAD,MAAC,cAAW,WAAU,aAAa,gBAAK;AAAA,IAEvC,eAAe,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,uBAAY;AAAA,IAE5D,cACG,gBAAAA,MAAC,QAAG,WAAU,gBACT,kBAAS,IAAI,CAAC,QAAQ,MACnB,gBAAAA,MAAC,QAAW,WAAU,qBACjB,oBADI,CAET,CACH,GACL;AAAA,IAGH,cAAc,SAAS,KACpB,gBAAAA,MAAC,QAAG,WAAU,cACT,wBAAc,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,aAAa,KAAK,YAAY;AACpC,aACI,gBAAAA,MAAC,QAAsB,WAAU,mBAC7B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,aAAY;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,QAAQ,aAAa,WAAW;AAAA,UAChC,KAAK,aAAa,wBAAwB;AAAA;AAAA,MAC9C,KARK,KAAK,MAAM,CASpB;AAAA,IAER,CAAC,GACL;AAAA,KAER,GACJ,GACJ;AAER;;;AChCoB,SACI,OAAAG,OADJ,QAAAC,cAAA;AAzBpB,IAAMC,iBAAuC;AAAA,EACzC,EAAE,OAAO,gBAAgB,MAAM,IAAI;AAAA,EACnC,EAAE,OAAO,gBAAgB,MAAM,IAAI;AAAA,EACnC,EAAE,OAAO,gBAAgB,MAAM,IAAI;AAAA,EACnC,EAAE,OAAO,gBAAgB,MAAM,IAAI;AACvC;AAIO,IAAM,kBAAkB,CAAC;AAAA,EAC5B,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,cAAc,aAAa;AAAA,EAC3B;AAAA,EACA,GAAG;AACP,MAA4B;AACxB,QAAM,gBAAgB,SAAS,MAAM,SAAS,IAAI,QAAQA;AAE1D,QAAM,YAAY,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SACI,gBAAAF,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAA,MAAC,SAAI,WAAU,cACX,0BAAAC,OAAC,SAAI,WAAU,eACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,eACX;AAAA,sBAAAD,MAAC,cAAW,WAAU,cAAc,iBAAM;AAAA,MAEzC,eAAe,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,uBAAY;AAAA,OACjE;AAAA,IAEC,cAAc,SAAS,KACpB,gBAAAA,MAAC,QAAG,WAAU,aACT,wBAAc,IAAI,CAAC,MAAM,MAAM;AAC5B,YAAM,aAAa,KAAK,YAAY;AACpC,aACI,gBAAAA,MAAC,QAAsB,WAAU,aAI7B,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,MAAM,KAAK;AAAA,UACX,QAAQ,aAAa,WAAW;AAAA,UAChC,KAAK,aAAa,wBAAwB;AAAA,UAEzC;AAAA,iBAAK,WACF,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,WAAU;AAAA,gBACV,KAAK,KAAK;AAAA,gBACV,KAAK,KAAK,WAAW;AAAA,gBACrB,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,QAAQ;AAAA;AAAA,YACZ;AAAA,YAEJ,gBAAAA,MAAC,UAAK,WAAU,aAAa,eAAK,OAAM;AAAA;AAAA;AAAA,MAC5C,KArBK,KAAK,MAAM,CAsBpB;AAAA,IAER,CAAC,GACL;AAAA,KAER,GACJ,GACJ;AAER;;;AC9EA,SAAS,YAAAG,kBAAgB;AA+DT,SAMI,OAAAC,OANJ,QAAAC,cAAA;AApDhB,IAAM,iBAAuC;AAAA,EACzC;AAAA,IACI,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,MACP;AAAA,QACI,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,cAAc,EAAE,OAAO,mBAAmB,MAAM,IAAI;AAAA,MACxD;AAAA,MACA;AAAA,QACI,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,cAAc,EAAE,OAAO,mBAAmB,MAAM,IAAI;AAAA,MACxD;AAAA,IACJ;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW;AAAA,MACP,EAAE,IAAI,aAAa,OAAO,wBAAwB,MAAM,IAAI;AAAA,MAC5D,EAAE,IAAI,YAAY,OAAO,yBAAyB,MAAM,IAAI;AAAA,IAChE;AAAA,EACJ;AACJ;AAYA,IAAM,eAAe,CAAC,EAAE,UAAAC,WAAU,SAAS,SAAS,iBAAiB,MAAyB;AAC1F,QAAM,aAAaA,UAAS,YAAY;AACxC,QAAM,eAAeA,UAAS;AAE9B,QAAM,sBAAsB,CAAC,UAAyC;AAClE,QAAI,CAAC,iBAAkB;AACvB,UAAM,eAAe;AACrB,qBAAiBA,WAAU,KAAK;AAAA,EACpC;AAEA,SACI,gBAAAF,MAAC,QAAG,WAAU,iBACV,0BAAAC,OAAC,SAAI,WAAU,YACX;AAAA,oBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,MAAMC,UAAS;AAAA,QACf,QAAQ,aAAa,WAAW;AAAA,QAChC,KAAK,aAAa,wBAAwB;AAAA,QAE1C;AAAA,0BAAAF;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,KAAKE,UAAS,WAAW;AAAA,cACzB,KAAK;AAAA,cACL,SAAQ;AAAA,cACR,eAAa,UAAU,SAAY;AAAA;AAAA,UACvC;AAAA,UACA,gBAAAF,MAAC,UAAK,WAAU,kBAAkB,UAAAE,UAAS,OAAM;AAAA;AAAA;AAAA,IACrD;AAAA,IAEC,gBACG,gBAAAF,MAAC,SAAI,WAAU,mBACX,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,aAAY;AAAA,QACZ,OAAO,aAAa,SAAS;AAAA,QAC7B,MAAM,aAAa,QAAQE,UAAS;AAAA,QACpC,SAAS;AAAA,QACT,iBAAe,mBAAmB,WAAW;AAAA;AAAA,IACjD,GACJ;AAAA,KAER,GACJ;AAER;AAEA,IAAM,mBAAmB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAMI,gBAAAF,MAAC,QAAG,WAAU,aACT,oBAAU,IAAI,CAACE,WAAU,MACtB,gBAAAF;AAAA,EAAC;AAAA;AAAA,IAEG,UAAUE;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA;AAAA,EAJKA,UAAS,MAAM;AAKxB,CACH,GACL;AAGG,IAAM,gBAAgB,CAAC;AAAA,EAC1B,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB;AAAA,EACA,cAAc,aAAa;AAAA,EAC3B;AAAA,EACA,GAAG;AACP,MAA0B;AACtB,QAAM,iBAAiB,UAAU,OAAO,SAAS,IAAI,SAAS;AAC9D,QAAM,YAAY,eAAe,IAAI,CAAC,OAAO,MAAM,OAAO,MAAM,MAAM,CAAC,CAAC;AAExE,QAAM,CAAC,UAAU,WAAW,IAAIC,WAA+B,MAAS;AACxE,QAAM,mBAAmB,aAAa,SAAY,UAAU,MAAM,GAAG,CAAC,IAAI;AAE1E,QAAM,eAAe,CAAC,KAAa,SAAkB;AACjD,gBAAY,CAAC,YAAY;AACrB,YAAM,OAAO,YAAY,SAAY,UAAU,MAAM,GAAG,CAAC,IAAI;AAC7D,UAAI,CAAC,KAAM,QAAO,KAAK,OAAO,CAAC,MAAM,MAAM,GAAG;AAC9C,aAAO,oBAAoB,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG;AAAA,IAC7E,CAAC;AAAA,EACL;AAEA,QAAM,gBAAgB,eAAe,QAAQ,CAAC,UAAU,MAAM,aAAa,CAAC,CAAC;AAE7E,QAAM,YAAY,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SACI,gBAAAH,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAC,OAAC,SAAI,WAAU,cACT;AAAA,cAAS,gBACP,gBAAAA,OAAC,SAAI,WAAU,eACV;AAAA,eAAS,gBAAAD,MAAC,cAAW,WAAU,cAAc,iBAAM;AAAA,MACnD,eAAe,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,uBAAY;AAAA,OACjE;AAAA,IAGH,YAAY,SACT,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ,IAEA,gBAAAA,MAAC,SAAI,WAAU,eACV,yBAAe,IAAI,CAAC,OAAO,MAAM;AAC9B,YAAM,MAAM,UAAU,CAAC;AACvB,aACI,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEG,WAAU;AAAA,UACV,OAAO,MAAM;AAAA,UACb,MAAM,iBAAiB,SAAS,GAAG;AAAA,UACnC,UAAU,CAAC,SAAS,aAAa,KAAK,IAAI;AAAA,UAC1C,gBAAgB,IAAI;AAAA,UAEpB,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAW,MAAM,aAAa,CAAC;AAAA,cAC/B;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACJ;AAAA;AAAA,QAZK;AAAA,MAaT;AAAA,IAER,CAAC,GACL;AAAA,KAER,GACJ;AAER;;;ACnMA,SAAS,eAAAI,cAAa,aAAAC,aAAW,SAAAC,SAAO,UAAAC,gBAAc;AACtD,SAAS,gBAAAC,qBAAoB;AAcrB,gBAAAC,OA8HI,QAAAC,cA9HJ;AATR,IAAMC,aAAY,MACd,gBAAAF;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAClB;AAAA;AACJ;AAGJ,IAAM,qBAAqB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,EAAE,KAAK,GAAG;AAEH,IAAM,YAAY,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,cAAc,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAsB;AAClB,QAAM,UAAUG,QAAM;AACtB,QAAM,WAAWC,SAA8B,IAAI;AACnD,QAAM,aAAaA,SAA2B,IAAI;AAElD,QAAM,eAAeC,aAAY,MAAM;AACnC,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,WAAO,MAAM,KAAK,MAAM,iBAA8B,kBAAkB,CAAC,EAAE;AAAA,MACvE,CAAC,OAAO,GAAG,iBAAiB,QAAQ,OAAO,SAAS;AAAA,IACxD;AAAA,EACJ,GAAG,CAAC,CAAC;AAEL,EAAAC,YAAU,MAAM;AACZ,QAAI,CAAC,QAAQ,OAAO,aAAa,YAAa;AAE9C,eAAW,UACP,SAAS,yBAAyB,cAAc,SAAS,gBAAgB;AAE7E,aAAS,SAAS,MAAM;AAExB,WAAO,MAAM;AACT,YAAM,UAAU,WAAW;AAC3B,iBAAW,UAAU;AACrB,UAAI,WAAW,SAAS,SAAS,OAAO,EAAG,SAAQ,MAAM;AAAA,IAC7D;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,EAAAA,YAAU,MAAM;AACZ,QAAI,CAAC,QAAQ,OAAO,aAAa,YAAa;AAE9C,UAAM,gBAAgB,CAAC,UAAoC;AACvD,UAAI,MAAM,QAAQ,UAAU;AACxB,cAAM,gBAAgB;AACtB,gBAAQ;AAAA,MACZ;AAAA,IACJ;AAEA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACtE,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,EAAAA,YAAU,MAAM;AACZ,QAAI,CAAC,QAAQ,OAAO,aAAa,YAAa;AAE9C,UAAM,OAAO,SAAS;AACtB,UAAM,mBAAmB,KAAK,MAAM;AACpC,UAAM,uBAAuB,KAAK,MAAM;AACxC,UAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;AAEpE,SAAK,MAAM,WAAW;AACtB,QAAI,iBAAiB,GAAG;AACpB,YAAM,UAAU,WAAW,OAAO,iBAAiB,IAAI,EAAE,YAAY,KAAK;AAC1E,WAAK,MAAM,eAAe,GAAG,UAAU,cAAc;AAAA,IACzD;AAEA,WAAO,MAAM;AACT,WAAK,MAAM,WAAW;AACtB,WAAK,MAAM,eAAe;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,qBAAqB,CAAC,UAA8C;AACtE,QAAI,MAAM,QAAQ,MAAO;AAEzB,UAAM,YAAY,aAAa;AAC/B,QAAI,UAAU,WAAW,GAAG;AACxB,YAAM,eAAe;AACrB,eAAS,SAAS,MAAM;AACxB;AAAA,IACJ;AAEA,UAAM,QAAQ,UAAU,CAAC;AACzB,UAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C,UAAM,SAAS,SAAS;AAExB,QAAI,MAAM,UAAU;AAChB,UAAI,WAAW,SAAS,WAAW,SAAS,SAAS;AACjD,cAAM,eAAe;AACrB,aAAK,MAAM;AAAA,MACf;AACA;AAAA,IACJ;AAEA,QAAI,WAAW,MAAM;AACjB,YAAM,eAAe;AACrB,YAAM,MAAM;AAAA,IAChB;AAAA,EACJ;AAEA,MAAI,CAAC,QAAQ,OAAO,aAAa,YAAa,QAAO;AAErD,QAAM,YAAY,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SAAOC;AAAA,IACH,gBAAAN,OAAC,SAAI,WAAW,WAAW,SAAS,SAChC;AAAA,sBAAAD,MAAC,SAAI,WAAU,cAAa,eAAY,QAAO;AAAA,MAE/C,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,WAAU;AAAA,UACV,MAAK;AAAA,UACL,cAAW;AAAA,UACX,mBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAC1C,WAAW;AAAA,UACV,GAAG;AAAA,UAEJ;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,cAAY;AAAA,gBAEZ,0BAAAA,MAACE,YAAA,EAAU;AAAA;AAAA,YACf;AAAA,YAEA,gBAAAF,MAAC,cAAW,IAAI,SAAS,WAAU,cAC9B,iBACL;AAAA,YAEC,YAAY,gBAAAA,MAAC,SAAI,WAAU,aAAa,UAAS;AAAA;AAAA;AAAA,MACtD;AAAA,OACJ;AAAA,IACA,aAAa,SAAS;AAAA,EAC1B;AACJ;;;AChI4B,SAOQ,OAAAQ,OAPR,QAAAC,cAAA;AAtC5B,IAAM,kBAA+C;AAAA,EACjD,EAAE,IAAI,cAAc,OAAO,gBAAgB,MAAM,IAAI;AAAA,EACrD,EAAE,IAAI,cAAc,OAAO,iBAAiB,MAAM,IAAI;AAAA,EACtD,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,MAAM,IAAI;AAAA,EACvD,EAAE,IAAI,eAAe,OAAO,iBAAiB,MAAM,IAAI;AAAA,EACvD,EAAE,IAAI,eAAe,OAAO,gBAAgB,MAAM,IAAI;AAAA,EACtD,EAAE,IAAI,cAAc,OAAO,gBAAgB,MAAM,IAAI;AACzD;AAEO,IAAM,sBAAsB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAgC;AAC5B,QAAM,kBAAkB,WAAW,QAAQ,SAAS,IAAI,UAAU;AAElE,SACI,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAA,MAAC,QAAG,WAAU,aACT,0BAAgB,IAAI,CAAC,QAAQ,MAAM;AAChC,cAAM,aAAa,OAAO,YAAY;AACtC,eACI,gBAAAA,MAAC,QAAwB,WAAU,kBAC/B,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,MAAM,OAAO;AAAA,YACb,QAAQ,aAAa,WAAW;AAAA,YAChC,KAAK,aAAa,wBAAwB;AAAA,YAEzC;AAAA,qBAAO,WACJ,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACG,WAAU;AAAA,kBACV,KAAK,OAAO;AAAA,kBACZ,KAAK,OAAO,WAAW;AAAA,kBACvB,SAAQ;AAAA,kBACR,eAAa,OAAO,UAAU,SAAY;AAAA;AAAA,cAC9C;AAAA,cAEJ,gBAAAA,MAAC,UAAK,WAAU,qBAAqB,iBAAO,OAAM;AAAA;AAAA;AAAA,QACtD,KAjBK,OAAO,MAAM,CAkBtB;AAAA,MAER,CAAC,GACL;AAAA;AAAA,EACJ;AAER;;;ACjEA,SAAS,eAAAE,cAAa,WAAAC,WAAS,YAAAC,kBAAgB;AAavC,gBAAAC,OAyBI,QAAAC,cAzBJ;AATR,IAAMC,aAAY,MACd,gBAAAF;AAAA,EAAC;AAAA;AAAA,IACG,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAEZ,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,MAAK;AAAA,QACL,aAAY;AAAA;AAAA,IAChB;AAAA;AACJ;AAGJ,IAAM,gBAAgB,MAClB,gBAAAC;AAAA,EAAC;AAAA;AAAA,IACG,qBAAoB;AAAA,IACpB,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IACZ,WAAU;AAAA,IAEV;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,SAAQ;AAAA,UACR,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACT;AAAA,MACA,gBAAAA,MAAC,UACG,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACG,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,IAAG;AAAA,UACH,eAAc;AAAA,UAEd;AAAA,4BAAAD,MAAC,UAAK,WAAU,mCAAkC;AAAA,YAClD,gBAAAA,MAAC,UAAK,QAAO,KAAI,WAAU,iCAAgC;AAAA;AAAA;AAAA,MAC/D,GACJ;AAAA;AAAA;AACJ;AAGJ,IAAM,oBAAoB,CAAC,KAAa,QAAgB;AACpD,QAAM,OAAO,MAAM;AACnB,SAAO,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,KAAK,MAAM,MAAM,OAAO,KAAK,CAAC;AAChF;AAEA,IAAM,eAAe,CAAC,UAClB,IAAI,KAAK,aAAa,SAAS,EAAE,uBAAuB,EAAE,CAAC,EAAE,OAAO,KAAK;AAEtE,IAAM,mBAAmB,CAAC;AAAA,EAC7B,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB;AAAA,EACA,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACP,MAA6B;AACzB,QAAM,CAAC,eAAe,gBAAgB,IAAIG,WAAS,YAAY;AAC/D,QAAM,eAAe,SAAS;AAE9B,QAAM,eAAeC;AAAA,IACjB,CAAC,SAAiB;AACd,UAAI,UAAU,OAAW,kBAAiB,IAAI;AAC9C,sBAAgB,IAAI;AAAA,IACxB;AAAA,IACA,CAAC,eAAe,KAAK;AAAA,EACzB;AAEA,QAAM,QAAQC;AAAA,IACV,MAAM,cAAc,kBAAkB,KAAK,GAAG;AAAA,IAC9C,CAAC,KAAK,KAAK,UAAU;AAAA,EACzB;AAEA,QAAM,eAAgB,eAAe,QAAQ,MAAM,OAAQ;AAC3D,QAAM,SAAS,eAAe;AAE9B,QAAM,YAAY,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SACI,gBAAAL,MAAC,aAAQ,WAAW,WAAY,GAAG,OAC/B,0BAAAC,OAAC,SAAI,WAAU,cACX;AAAA,oBAAAA,OAAC,SAAI,WAAU,eACV;AAAA,eAAS,gBAAAD,MAAC,QAAG,WAAU,cAAc,iBAAM;AAAA,MAC3C,eAAe,gBAAAA,MAAC,OAAE,WAAU,oBAAoB,uBAAY;AAAA,OACjE;AAAA,IAEA,gBAAAA,MAAC,SAAI,WAAU,aACX,0BAAAC,OAAC,SAAI,WAAU,iBACX;AAAA,sBAAAA,OAAC,SAAI,WAAU,kBACX;AAAA,wBAAAD,MAAC,SAAI,WAAU,eAAe,wBAAa;AAAA,QAC3C,gBAAAA,MAAC,OAAE,WAAU,qBAAqB,0BAAe;AAAA,SACrD;AAAA,MAEA,gBAAAA,MAAC,SAAI,WAAU,cAAa,eAAY,QACpC,0BAAAA,MAACE,YAAA,EAAU,GACf;AAAA,MAEA,gBAAAD,OAAC,SAAI,WAAU,qBACX;AAAA,wBAAAD,MAAC,iBAAc;AAAA,QAEf,gBAAAA,MAAC,SAAI,WAAU,mBACX,0BAAAC,OAAC,SAAI,WAAU,cACX;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,OAAO,EAAE,OAAO,GAAG,WAAW,IAAI;AAAA;AAAA,UACtC;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,OAAO,EAAE,MAAM,GAAG,WAAW,IAAI;AAAA,cACjC,eAAY;AAAA;AAAA,UAChB;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,cAAY;AAAA,cACZ,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,UAAU,CAAC,UACP,aAAa,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA;AAAA,UAE/C;AAAA,WACJ,GACJ;AAAA,QAEA,gBAAAA,MAAC,SAAI,WAAU,cACV,gBAAM,IAAI,CAAC,SACR,gBAAAA,MAAC,UAAgB,WAAU,aACtB,kBADM,IAEX,CACH,GACL;AAAA,SACJ;AAAA,MAEA,gBAAAC,OAAC,SAAI,WAAU,eACX;AAAA,wBAAAA,OAAC,SAAI,WAAU,qBACX;AAAA,0BAAAD,MAAC,UAAK,WAAU,eAAe,0BAAe;AAAA,UAC9C,gBAAAA,MAAC,UAAK,WAAU,eAAe,uBAAa,MAAM,GAAE;AAAA,WACxD;AAAA,QACA,gBAAAA,MAAC,OAAE,WAAU,8CACR,uBACL;AAAA,SACJ;AAAA,OACJ,GACJ;AAAA,IAEC,cACG,gBAAAC,OAAC,SAAI,WAAU,mBACV;AAAA,2BACG,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA,UACL,SAAQ;AAAA,UACR,eAAa,oBAAoB,SAAY;AAAA;AAAA,MACjD;AAAA,MAEJ,gBAAAA,MAAC,OAAE,WAAU,wBAAwB,sBAAW;AAAA,OACpD;AAAA,KAER,GACJ;AAER;","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","ChevronIcon","jsx","jsxs","forwardRef","useState","Fragment","jsx","jsxs","SuccessIcon","FailIcon","forwardRef","useState","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","useId","useRef","jsx","useId","useRef","useState","jsx","jsxs","useState","jsx","jsxs","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","ChevronLeft","ChevronRight","useId","useState","useRef","useEffect","useCallback","useId","jsx","jsxs","useId","jsx","jsxs","jsx","jsxs","CheckIcon","useState","Fragment","jsx","jsxs","ChevronDownIcon","useState","jsx","jsxs","jsx","jsxs","Tag","useEffect","useRef","jsx","jsxs","ButtonBlock","useRef","useEffect","useEffect","useRef","useState","jsx","jsxs","useRef","useState","useEffect","useEffect","useRef","useState","jsx","jsxs","EASING","useState","useRef","useEffect","useEffect","useRef","useState","useEffect","useRef","useState","jsx","jsx","jsxs","ChevronRight","useState","useRef","useEffect","jsx","jsxs","useEffect","useRef","jsx","jsxs","useRef","useEffect","useRef","jsx","jsxs","useRef","useRef","useState","useEffect","useCallback","motion","jsx","jsxs","ChevronDownIcon","XMarkIcon","motion","useState","useRef","useEffect","useCallback","useEffect","useLayoutEffect","useRef","useState","motion","useScroll","useSpring","useTransform","useMotionTemplate","body","dark","white","Fragment","jsx","jsxs","SPRING","seg","useRef","useState","useEffect","motion","useLayoutEffect","useScroll","useSpring","useTransform","useMotionTemplate","useRef","motion","useScroll","jsx","jsxs","PLACEHOLDER_IMAGE","useScroll","useRef","motion","jsx","jsx","jsxs","jsx","jsxs","useEffect","useRef","jsx","jsxs","useRef","useEffect","useEffect","useRef","jsx","jsxs","PLACEHOLDER_IMAGE","useRef","useEffect","n","useEffect","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useEffect","n","useState","useMemo","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","useState","Fragment","jsx","jsxs","ChevronDownIcon","useState","jsx","jsxs","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","useCallback","useEffect","jsx","jsxs","Fragment","jsx","jsxs","useCallback","useEffect","useRef","useState","jsx","jsxs","ButtonBlock","useState","useRef","useCallback","useEffect","jsx","jsxs","AwardBadge","jsx","jsxs","externalLinkRel","useMemo","useState","jsx","jsxs","PostCard","useState","useMemo","Fragment","jsx","jsxs","externalLinkRel","useMemo","useState","jsx","jsxs","externalLinkRel","useState","useMemo","useMemo","useState","jsx","jsxs","externalLinkRel","ChevronDownIcon","useState","useMemo","useEffect","useMemo","useState","jsx","jsxs","ChevronDownIcon","CheckIcon","useState","renderBlock","useMemo","useEffect","useRef","motion","useScroll","useSpring","useTransform","jsx","jsxs","PLACEHOLDER_IMAGE","useRef","useScroll","useSpring","useTransform","motion","useCallback","useEffect","useId","useMemo","useRef","useState","Fragment","jsx","jsxs","useRef","useEffect","useCallback","useState","ChevronIcon","useId","useMemo","Fragment","useEffect","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","useLayoutEffect","useEffect","useRef","useState","useCallback","useEffect","useId","useMemo","useRef","useState","payload","pay","useEffect","useState","useState","useEffect","Fragment","jsx","jsxs","useState","useId","useMemo","useRef","useEffect","useCallback","useEffect","useId","useMemo","useRef","useState","jsx","jsxs","CoinAvatar","useState","useRef","useEffect","cmp","useId","useMemo","useMemo","useState","jsx","jsxs","isExternalUrl","useState","useMemo","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","ExternalLinkIcon","useEffect","useId","useRef","useState","Fragment","jsx","jsxs","safeHref","safeLottieSrc","PlaybackGlyph","useState","useRef","useEffect","useId","jsx","jsxs","DEFAULT_LINKS","jsx","jsxs","DEFAULT_ITEMS","useState","jsx","jsxs","document","useState","useCallback","useEffect","useId","useRef","createPortal","jsx","jsxs","XMarkIcon","useId","useRef","useCallback","useEffect","createPortal","jsx","jsxs","useCallback","useMemo","useState","jsx","jsxs","ArrowIcon","useState","useCallback","useMemo"]}
|