@best-bundles/bundle-ui 0.0.36 → 0.0.38

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchBundleConfig.ts","../src/utils/analytics.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport type { BundleCartAdapter, BundleConfig, BundleEligibleVariant, PublicBundleConfigResponse, StyleSettings } from \"../types\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleSelectionState = Record<string, number>; // merchandiseId -> qty\ntype BundleSelectionOrder = string[]; // merchandiseId (variant GID) per-item, in first-added -> last-added order\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n\n /**\n * v1 default is \"default\" to mirror the app's current single-config endpoint.\n * Kept as a prop to avoid an API break when the public endpoint supports multiple handles.\n */\n configHandle?: string;\n\n /**\n * Optional override for Storybook/tests so we can avoid network calls.\n */\n initialData?: BundleProviderData;\n\n /**\n * Optional fetcher override for Storybook/tests.\n */\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n\n /**\n * Optional analytics endpoint override. Defaults to \"/api/public/bundle-analytics\".\n */\n analyticsEndpoint?: string;\n\n /**\n * When true, the drawer may open even when config is inactive (e.g. styling preview).\n * Default false for storefront; set true for preview contexts.\n */\n allowDrawerWhenInactive?: boolean;\n\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\n/** URL hash that opens the bundle drawer when present (e.g. nav link href=\"#best-bundles\"). */\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n const raw = value.slice(prefix.length).trim();\n if (!raw) return \"default\";\n const cleaned = raw\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n children,\n } = props;\n\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [loading, setLoading] = useState(!initialData);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [currencyCode, setCurrencyCode] = useState<string | null>(initialData?.currencyCode ?? null);\n const [config, setConfig] = useState<BundleConfig | null>(initialData?.config ?? null);\n const [eligibleVariants, setEligibleVariants] = useState<BundleEligibleVariant[]>(\n initialData?.eligibleVariants ?? [],\n );\n\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (initialData) return;\n\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n\n setLoading(true);\n setError(null);\n fetcher({ apiBaseUrl, shop, configHandle, signal: ac.signal })\n .then((json) => {\n if (!json.ok) {\n setError(json.error || \"Failed to load bundle config.\");\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n return;\n }\n setCurrencyCode(json.currencyCode ?? null);\n const win = typeof window !== \"undefined\"\n ? (window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n })\n : null;\n const previewConfig = win?.__BUNDLE_PREVIEW_CONFIG__;\n if (previewConfig) {\n setConfig(previewConfig);\n const previewVariants = win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__;\n if (previewVariants !== undefined) {\n setEligibleVariants(previewVariants);\n } else {\n const idSet = new Set(previewConfig.eligibleVariantIds ?? []);\n setEligibleVariants(\n idSet.size === 0 ? (json.eligibleVariants ?? []) : (json.eligibleVariants ?? []).filter((v) => idSet.has(v.id)),\n );\n }\n setLoading(win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true);\n } else {\n setConfig(json.config);\n setEligibleVariants(json.eligibleVariants ?? []);\n setLoading(false);\n }\n })\n .catch((e: unknown) => {\n const msg = e instanceof Error ? e.message : \"Failed to load bundle config.\";\n setError(msg);\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n })\n .finally(() => {\n const win = typeof window !== \"undefined\" ? (window as Window & { __BUNDLE_PREVIEW_CONFIG__?: BundleConfig }) : null;\n if (!win?.__BUNDLE_PREVIEW_CONFIG__) setLoading(false);\n });\n\n return () => ac.abort();\n }, [apiBaseUrl, shop, configHandle, initialData, configFetcher]);\n\n useEffect(() => {\n const effective = getEffectiveStyleSettings(config?.styleSettings);\n if (effective) injectStyleVariables(effective);\n }, [config?.styleSettings]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handlePreviewStyles = () => {\n const effective = getEffectiveStyleSettings(undefined);\n if (effective) injectStyleVariables(effective);\n };\n window.addEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n return () => window.removeEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const applyPreviewConfig = () => {\n const previewConfig = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!previewConfig) return;\n const variantsLoading = win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true;\n setLoading(variantsLoading);\n setConfig(previewConfig);\n const previewVariants = win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__;\n if (previewVariants) {\n setEligibleVariants(previewVariants);\n } else if (!variantsLoading) {\n setEligibleVariants((current) => {\n const idSet = new Set(previewConfig.eligibleVariantIds ?? []);\n if (idSet.size === 0 || current.length === 0) return current;\n return current.filter((v) => idSet.has(v.id));\n });\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, []);\n\n const open = useCallback(() => {\n if (!allowDrawerWhenInactive && config != null && !config.isActive) return;\n setIsOpen(true);\n // Track drawer opened event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((error) => {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Error in open() callback:\", error);\n }\n }\n }, [analyticsEndpoint, shop, config, allowDrawerWhenInactive]);\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((error) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", error);\n });\n } catch (error) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", error);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const openIfHash = () => {\n const handleInHash = getBundleHashHandle(window.location.hash);\n if (!handleInHash) return;\n if (handleInHash === \"default\" || handleInHash === configHandle) open();\n };\n openIfHash();\n window.addEventListener(\"hashchange\", openIfHash);\n return () => window.removeEventListener(\"hashchange\", openIfHash);\n }, [open, configHandle]);\n\n const toggle = useCallback(() => {\n if (!allowDrawerWhenInactive && !isOpen && config != null && !config.isActive) return;\n // Check current state and call appropriate function\n setIsOpen((current) => {\n if (!current) {\n // Opening - track the event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((error) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n console.warn(\"[Bundle Analytics] Error in toggle() callback:\", error);\n }\n }\n } else {\n // Closing via toggle - route through close() so bundle_closed is sent\n close();\n }\n return !current;\n });\n }, [analyticsEndpoint, shop, close, config, isOpen, allowDrawerWhenInactive]);\n\n useEffect(() => {\n if (!allowDrawerWhenInactive && config?.isActive === false && isOpen) close();\n }, [allowDrawerWhenInactive, config?.isActive, isOpen, close]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants.filter((v) => v.availableForSale !== false).map((v) => v.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((r) => r.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n // Validate that the merchandiseId is in the eligible variants set\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n // Allow optimistic selection while config/variants are still loading.\n if (!loading) return; // Silently ignore ineligible variants\n }\n\n const q = clampQty(quantity);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, v) => sum + (v || 0), 0);\n const delta =\n requestedDelta > 0\n ? Math.min(requestedDelta, Math.max(0, maxBundleSize - currentBundleSize))\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n // selections\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const { [merchandiseId]: _, ...rest } = prev.selections;\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n // order\n let nextOrder = prev.order;\n if (delta > 0) {\n // Add N items to the end.\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n // Remove N most-recent occurrences of this variant.\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = Object.values(nextSelections).reduce((sum, v) => sum + (v || 0), 0);\n\n // Track variant selection changed event (always for DB)\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n // Mixpanel: bundle_started when first product added (0 -> >= 1)\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n // Mixpanel: bundle_completed when minimum size reached\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [maxBundleSize, minRequired, eligibleVariantIdsSet, analyticsEndpoint, shop, loading]);\n\n useEffect(() => {\n if (loading) return;\n setSelectionsState((prev) => {\n const nextSelectionsEntries = Object.entries(prev.selections).filter(([id]) =>\n eligibleVariantIdsSet.has(id),\n );\n const nextSelections = Object.fromEntries(nextSelectionsEntries) as BundleSelectionState;\n const nextOrder = prev.order.filter((id) => eligibleVariantIdsSet.has(id));\n\n if (\n nextOrder.length === prev.order.length &&\n nextSelectionsEntries.length === Object.keys(prev.selections).length\n ) {\n return prev;\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [loading, eligibleVariantIdsSet]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, q) => sum + (q || 0), 0), [selections]);\n\n const canSubmit = useMemo(() => {\n if (loading || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, config?.isActive, error, loading, minRequired, submitting]);\n\n // Shared logic for adding bundle to cart\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({ merchandiseId, quantity: clampQty(quantity) }))\n .filter((l) => l.quantity > 0)\n .filter((l) => eligibleVariantIdsSet.has(l.merchandiseId)) // Filter out ineligible variants\n .map((l) => ({\n merchandiseId: l.merchandiseId,\n quantity: l.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: configHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n // Calculate pricing and discount info for analytics\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let grossPrice = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n // Find applied discount rule\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) appliedRule = r;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n\n const productVariantIds = lines.map((l) => l.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n // Track bundle added to basket event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n clearSelections();\n close();\n // Call the completion callback\n options?.onComplete?.();\n } finally {\n setSubmitting(false);\n }\n }, [\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n configHandle,\n currencyCode,\n selections,\n eligibleVariantIdsSet,\n eligibleVariants,\n bundleSize,\n analyticsEndpoint,\n shop,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition(\n {\n onComplete: () => {\n cartAdapter.openCartUI?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition(\n {\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const value: BundleBuilderContextValue = useMemo(\n () => ({\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n }),\n [\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n ],\n );\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? \"Build a bundle\"}\n </button>\n );\n}\n\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n };\n\n const title = config?.title?.trim() || \"Build your bundle\";\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(`You received a ${formatPercent0dp(hitRule.discountPercent)}% discount!`);\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Bundle builder\"\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? \"Search (expanded)\" : \"Search\"}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder=\"Search\"\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label=\"Clear search\"\n >\n Clear\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label=\"Close\">\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>Loading…</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n\n // Show discounted variant price only when a rule is actually unlocked.\n const discountPercentToUse = appliedDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={`${variantA11y} is sold out`}>\n Sold<br />Out\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.addToBundleButton}\n aria-label={`Add ${variantA11y} to bundle`}\n >\n Add\n </button>\n ) : (\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={`Decrease ${variantA11y}`}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={`Quantity ${qty}`}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.qtyButton}\n aria-label={`Increase ${variantA11y}`}\n >\n +\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold ? `${threshold.discountPercent}% off` : null;\n\n const titleText = isFilled ? variant!.displayName : `Slot ${idx + 1}`;\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${discountText}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {appliedDiscountPercent}% Discount\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? \"Processing…\" : \"Checkout\"}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Processing…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Checkout\"}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n return `$${n.toFixed(2)}`;\n };\n\n const sortedVariants = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || \"Build your bundle\";\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>Loading…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && config && !config.isActive ? (\n <div className={styles.inactive}>Bundles are not active.</div>\n ) : null}\n\n {showRules && rulesSorted.length ? (\n <div className={styles.section}>\n <div className={styles.rulesVisual}>\n <div className={styles.rulesLabelsRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const ruleForLine = rulesSorted.find((r) => r.minBundleSize === lineIndex);\n const discountLabel = ruleForLine ? `${formatPercent0dp(ruleForLine.discountPercent)}% off` : null;\n\n return (\n <div key={lineIndex} className={styles.rulesLineLabelCell}>\n {discountLabel ? <span className={styles.rulesLineLabel}>{discountLabel}</span> : null}\n </div>\n );\n })}\n </div>\n <div className={styles.rulesLinesRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const isFilled = bundleSize >= lineIndex;\n\n return (\n <div\n key={lineIndex}\n className={[\n styles.rulesLine,\n isFilled ? styles.rulesLineFilled : styles.rulesLineEmpty,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\n\n {showVariants ? (\n <div className={styles.section} ref={variantsRef}>\n <div className={styles.sectionTitle}>Select items</div>\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {sortedVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const isClickable = !isUnavailable && !isAtMaxBundleSize;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n setQuantity(variant.id, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setQuantity(variant.id, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? `${variant.displayName} is sold out`\n : `Add ${variant.displayName} to bundle`\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variant.displayName}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>Item</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variant.displayName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={`${variant.displayName} is sold out`}>\n Sold Out\n </div>\n ) : (\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={`Remove ${variant.displayName} from bundle`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, qty > 0 ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={`${variant.displayName} quantity ${qty}`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role=\"button\"\n tabIndex={0}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={`Add ${variant.displayName}`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n ) : null}\n\n <footer className={styles.footer}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold ? `${threshold.discountPercent}% off` : null;\n const titleText = isFilled ? variant!.displayName : `Slot ${idx + 1}`;\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${discountText}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n width={1}\n height={1}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={[styles.totalsReveal, hasUnlockedFirstDiscount ? styles.totalsRevealOpen : null].filter(Boolean).join(\" \")}>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{appliedDiscountPercent}% Discount</span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\n </button>\n );\n }\n\n return (\n <div className={styles.ctaButtonGroup}>\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.ctaDualLeft}>\n <span>{submitting ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? \"Processing…\" : \"Checkout\"}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? \"Processing…\"\n : itemsRemaining > 0\n ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`\n : \"Checkout\"}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? \"Adding…\"\n : itemsRemaining > 0\n ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`\n : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by{\" \"}\n <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\">\n BestBundles\n </a>\n </div>\n </footer>\n </section>\n );\n}\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n openCartUI() {\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchBundleConfig","params","url","json","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","getBundleHashHandle","hash","value","prefix","raw","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","name","s","injectGoogleFontsLink","styles","_a","body","title","families","href","link","injectStyleVariables","root","key","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","n","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","initialData","configFetcher","providedAnalyticsEndpoint","allowDrawerWhenInactive","children","isOpen","setIsOpen","useState","loading","setLoading","submitting","setSubmitting","setError","currencyCode","setCurrencyCode","config","setConfig","eligibleVariants","setEligibleVariants","selectionsState","setSelectionsState","abortRef","useRef","useEffect","ac","fetcher","defaultFetchBundleConfig","win","previewConfig","previewVariants","idSet","v","e","msg","effective","handlePreviewStyles","applyPreviewConfig","variantsLoading","current","open","useCallback","anonymousUserId","close","openIfHash","handleInHash","toggle","maxBundleSize","useMemo","eligibleVariantIdsSet","minRequired","rules","ruleMin","r","normalizedRuleMin","configuredRaw","configuredMin","setQuantity","merchandiseId","quantity","q","prev","prevQty","requestedDelta","currentBundleSize","sum","delta","nextQty","nextSelections","_","rest","nextOrder","remainingToRemove","keptReversed","i","id","prevBundleSize","nextBundleSize","basePayload","nextSelectionsEntries","clearSelections","selections","selectionOrder","bundleSize","canSubmit","performCartAddition","options","bundleId","bundleTitle","lines","l","byId","grossPrice","variantId","qty","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","_b","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","t","_c","d","c","p","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","itemsRemaining","best","firstRule","hasUnlockedFirstDiscount","subtotal","total","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","source","jsxs","variantPrimaryName","variantOptionText","variantA11y","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","variant","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","sortedVariants","variantsRef","lineIndex","ruleForLine","isUnavailable","isClickable","toProperties","attributes","acc","attr","normalizeVariantId","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","text","createLiquidCartAdapter","items","line","lineIds"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12,13,14,15]}
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/api/fetchBundleConfig.ts","../src/utils/analytics.ts","../src/context/BundleProvider.tsx","../src/hooks/useBundleBuilder.ts","../src/hooks/useBundleBuilderDrawer.ts","../src/components/BundleButton.tsx","../../../node_modules/tween-functions/index.js","../../../node_modules/react-confetti/dist/react-confetti.mjs","../../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/lucide-react/dist/esm/icons/plus.js","../../../node_modules/lucide-react/dist/esm/icons/search.js","../../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../src/components/BundleBuilderDrawer.tsx","../src/components/BundleBuilderPanel.tsx","../src/adapters/LiquidAdapter.ts"],"sourcesContent":["export const BundleLineAttributeKeys = {\n bundleId: \"_bundle_id\",\n bundleConfig: \"_bundle_config\",\n bundleSource: \"_bundle_source\",\n bundleTitle: \"_bundle_title\",\n} as const;\n\n","import type { PublicBundleConfigResponse } from \"../types\";\n\nexport async function fetchBundleConfig(params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n}): Promise<PublicBundleConfigResponse> {\n const url = new URL(\"/api/public/bundle-config\", params.apiBaseUrl);\n url.searchParams.set(\"shop\", params.shop);\n if (params.configHandle) {\n url.searchParams.set(\"handle\", params.configHandle);\n }\n\n const resp = await fetch(url, {\n method: \"GET\",\n signal: params.signal,\n headers: { \"Content-Type\": \"application/json\" },\n });\n\n // The endpoint uses 4xx/5xx for some errors; normalize to {ok:false}.\n const json = (await resp.json().catch(() => null)) as unknown;\n if (!json || typeof json !== \"object\") {\n return { ok: false, error: \"Invalid response.\" };\n }\n\n return json as PublicBundleConfigResponse;\n}\n","const ANONYMOUS_USER_ID_KEY = \"bb_anonymous_user_id\";\n\n/**\n * Gets or creates an anonymous user ID stored in localStorage.\n * This ID persists across sessions to attribute events to the same user.\n */\nexport function getOrCreateAnonymousUserId(): string {\n if (typeof window === \"undefined\" || typeof localStorage === \"undefined\") {\n // Fallback for SSR or environments without localStorage\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n try {\n const existing = localStorage.getItem(ANONYMOUS_USER_ID_KEY);\n if (existing && typeof existing === \"string\" && existing.length > 0) {\n return existing;\n }\n\n // Generate new ID\n let newId: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) {\n newId = cryptoAny.randomUUID();\n } else {\n throw new Error(\"crypto.randomUUID not available\");\n }\n } catch {\n // Fallback UUID generation\n newId = `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n localStorage.setItem(ANONYMOUS_USER_ID_KEY, newId);\n return newId;\n } catch {\n // If localStorage fails, generate a temporary ID\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n }\n}\n\nexport type AnalyticsEventType =\n | \"DRAWER_OPENED\"\n | \"DRAWER_CLOSED\"\n | \"VARIANT_SELECTION_CHANGED\"\n | \"BUNDLE_ADDED_TO_BASKET\";\n\n/** Mixpanel event names used for the bundle funnel (backend maps these to Mixpanel). */\nexport type MixpanelBundleEventName =\n | \"bundle_opened\"\n | \"bundle_closed\"\n | \"bundle_started\"\n | \"bundle_completed\"\n | \"bundle_added_to_cart\"\n | \"checkout_started_with_bundle\";\n\nexport type DrawerOpenedEvent = {\n eventType: \"DRAWER_OPENED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_opened\";\n};\n\nexport type DrawerClosedEvent = {\n eventType: \"DRAWER_CLOSED\";\n shop: string;\n anonymousUserId: string;\n timestamp: string;\n mixpanelEvent?: \"bundle_closed\";\n};\n\nexport type VariantSelectionChangedEvent = {\n eventType: \"VARIANT_SELECTION_CHANGED\";\n shop: string;\n anonymousUserId: string;\n before: Record<string, number>; // variantId -> quantity\n after: Record<string, number>;\n timestamp: string;\n mixpanelEvent?: \"bundle_started\" | \"bundle_completed\";\n};\n\nexport type BundleAddedToBasketEvent = {\n eventType: \"BUNDLE_ADDED_TO_BASKET\";\n shop: string;\n anonymousUserId: string;\n bundleId: string;\n productVariantIds: string[];\n grossPrice: number;\n discountedPrice: number;\n currency?: string;\n discountThresholdIdentifier: string; // rule handle\n discountLabel: string;\n discountPercentage: number | null;\n discountedAmount: number;\n timestamp: string;\n checkout?: boolean;\n mixpanelEvent?: \"bundle_added_to_cart\" | \"checkout_started_with_bundle\";\n};\n\nexport type AnalyticsEvent =\n | DrawerOpenedEvent\n | DrawerClosedEvent\n | VariantSelectionChangedEvent\n | BundleAddedToBasketEvent;\n\n/**\n * Sends an analytics event to the backend API endpoint.\n * Failures are silently caught to prevent breaking bundle functionality.\n */\nexport async function trackEvent(\n analyticsEndpoint: string,\n shop: string,\n event: AnalyticsEvent,\n): Promise<void> {\n if (typeof window === \"undefined\") {\n return; // Skip in SSR\n }\n\n try {\n const url = new URL(analyticsEndpoint, window.location.origin);\n url.searchParams.set(\"shop\", shop);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(event),\n // Don't wait for response - fire and forget\n keepalive: true,\n });\n\n if (!response.ok) {\n console.warn(\n `[Bundle Analytics] Event tracking failed with status ${response.status}:`,\n await response.text().catch(() => \"Unable to read response\"),\n );\n }\n } catch (error) {\n // Log error for debugging but don't break bundle functionality\n console.warn(\"[Bundle Analytics] Failed to track event:\", error);\n }\n}\n","import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { BundleLineAttributeKeys } from \"../constants\";\nimport { fetchBundleConfig as defaultFetchBundleConfig } from \"../api/fetchBundleConfig\";\nimport type { BundleCartAdapter, BundleConfig, BundleEligibleVariant, PublicBundleConfigResponse, StyleSettings } from \"../types\";\nimport { getOrCreateAnonymousUserId, trackEvent } from \"../utils/analytics\";\n\ntype BundleProviderData = {\n currencyCode: string | null;\n config: BundleConfig;\n eligibleVariants: BundleEligibleVariant[];\n};\n\ntype BundleSelectionState = Record<string, number>; // merchandiseId -> qty\ntype BundleSelectionOrder = string[]; // merchandiseId (variant GID) per-item, in first-added -> last-added order\n\nexport type BundleProviderProps = {\n apiBaseUrl: string;\n shop: string;\n cartAdapter: BundleCartAdapter;\n\n /**\n * v1 default is \"default\" to mirror the app's current single-config endpoint.\n * Kept as a prop to avoid an API break when the public endpoint supports multiple handles.\n */\n configHandle?: string;\n\n /**\n * Optional override for Storybook/tests so we can avoid network calls.\n */\n initialData?: BundleProviderData;\n\n /**\n * Optional fetcher override for Storybook/tests.\n */\n configFetcher?: (params: {\n apiBaseUrl: string;\n shop: string;\n configHandle?: string;\n signal?: AbortSignal;\n }) => Promise<PublicBundleConfigResponse>;\n\n /**\n * Optional analytics endpoint override. Defaults to \"/api/public/bundle-analytics\".\n */\n analyticsEndpoint?: string;\n\n /**\n * When true, the drawer may open even when config is inactive (e.g. styling preview).\n * Default false for storefront; set true for preview contexts.\n */\n allowDrawerWhenInactive?: boolean;\n\n children: React.ReactNode;\n};\n\nexport type BundleBuilderContextValue = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n\n loading: boolean;\n submitting: boolean;\n error: string | null;\n\n currencyCode: string | null;\n config: BundleConfig | null;\n eligibleVariants: BundleEligibleVariant[];\n\n selections: BundleSelectionState;\n selectionOrder: BundleSelectionOrder;\n setQuantity: (merchandiseId: string, quantity: number) => void;\n clearSelections: () => void;\n\n bundleSize: number;\n minRequired: number;\n canSubmit: boolean;\n submit: () => Promise<void>;\n submitAndCheckout: () => Promise<void>;\n};\n\nexport const BundleBuilderContext = createContext<BundleBuilderContextValue | null>(null);\n\n/** URL hash that opens the bundle drawer when present (e.g. nav link href=\"#best-bundles\"). */\nconst BUNDLE_DRAWER_HASH = \"#best-bundles\";\n\nfunction getBundleHashHandle(hash: string): string | null {\n const value = String(hash ?? \"\").trim().toLowerCase();\n if (!value.startsWith(BUNDLE_DRAWER_HASH)) return null;\n if (value === BUNDLE_DRAWER_HASH) return \"default\";\n const prefix = `${BUNDLE_DRAWER_HASH}:`;\n if (!value.startsWith(prefix)) return null;\n const raw = value.slice(prefix.length).trim();\n if (!raw) return \"default\";\n const cleaned = raw\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+/, \"\")\n .replace(/-+$/, \"\")\n .replace(/-{2,}/g, \"-\");\n return cleaned || \"default\";\n}\n\ntype StyleSettingCssVarKey = Exclude<keyof StyleSettings, \"confettiColors\">;\nconst STYLE_SETTINGS_TO_CSS_VAR: Record<StyleSettingCssVarKey, string> = {\n primaryColor: \"--bb-cta-bg\",\n primaryHoverColor: \"--bb-cta-bg-hover\",\n primaryTextColor: \"--bb-cta-text\",\n backgroundColor: \"--bb-surface-bg\",\n backdropColor: \"--bb-backdrop-bg\",\n textColor: \"--bb-text-color\",\n titleColor: \"--bb-title-color\",\n mutedTextColor: \"--bb-muted-color\",\n borderRadius: \"--bb-panel-radius\",\n borderColor: \"--bb-border-color\",\n borderStrongColor: \"--bb-border-strong-color\",\n focusRingColor: \"--bb-focus-ring\",\n tierBorderColor: \"--bb-tier-border\",\n tierTextColor: \"--bb-tier-text\",\n tierBackgroundColor: \"--bb-tier-bg\",\n celebrationTextColor: \"--bb-celebration-text\",\n celebrationBgTop: \"--bb-celebration-bg-top\",\n celebrationBgBottom: \"--bb-celebration-bg-bottom\",\n celebrationBorderColor: \"--bb-celebration-border\",\n fontFamilyBody: \"--bb-font-family-body\",\n fontFamilyTitle: \"--bb-font-family-title\",\n};\n\nconst GOOGLE_FONTS_LINK_ID = \"bb-google-fonts\";\n\nfunction fontNameToParam(name: string): string {\n const s = (name ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n return s ? encodeURIComponent(s).replace(/%20/g, \"+\") : \"\";\n}\n\nfunction injectGoogleFontsLink(styles: StyleSettings | undefined) {\n if (typeof document === \"undefined\" || !document.head) return;\n if (!styles) {\n document.getElementById(GOOGLE_FONTS_LINK_ID)?.remove();\n return;\n }\n const body = (styles.fontFamilyBody ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const title = (styles.fontFamilyTitle ?? \"\").trim().replace(/^[\"']|[\"']$/g, \"\");\n const families: string[] = [];\n if (body) families.push(\"family=\" + fontNameToParam(body));\n if (title && title !== body) families.push(\"family=\" + fontNameToParam(title));\n const existing = document.getElementById(GOOGLE_FONTS_LINK_ID) as HTMLLinkElement | null;\n if (families.length === 0) {\n existing?.remove();\n return;\n }\n const href = `https://fonts.googleapis.com/css2?${families.join(\"&\")}&display=swap`;\n if (existing) {\n if (existing.getAttribute(\"href\") !== href) existing.setAttribute(\"href\", href);\n return;\n }\n const link = document.createElement(\"link\");\n link.id = GOOGLE_FONTS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = href;\n document.head.appendChild(link);\n}\n\nfunction injectStyleVariables(styles: StyleSettings | undefined) {\n if (!styles) return;\n injectGoogleFontsLink(styles);\n const root = document.documentElement;\n (Object.entries(STYLE_SETTINGS_TO_CSS_VAR) as Array<[StyleSettingCssVarKey, string]>).forEach(([key, cssVar]) => {\n let value = styles[key];\n if (value) {\n if ((key === \"fontFamilyBody\" || key === \"fontFamilyTitle\") && /^\\s*\\S+\\s+\\S/.test(value) && !/^[\"']/.test(value.trim())) {\n value = `\"${value.trim().replace(/^[\"']|[\"']$/g, \"\")}\"`;\n }\n root.style.setProperty(cssVar, value);\n }\n });\n}\n\nfunction getEffectiveStyleSettings(configSettings: StyleSettings | undefined): StyleSettings | undefined {\n if (typeof window === \"undefined\") return configSettings;\n const preview = (window as Window & { __BUNDLE_PREVIEW_STYLES__?: StyleSettings }).__BUNDLE_PREVIEW_STYLES__;\n if (preview && typeof preview === \"object\") return preview;\n return configSettings;\n}\n\nfunction safeRandomUUID() {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoAny = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoAny?.randomUUID) return cryptoAny.randomUUID();\n } catch {\n // ignore\n }\n return `bb_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction clampQty(n: number) {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.floor(n));\n}\n\nexport function BundleProvider(props: BundleProviderProps) {\n const {\n apiBaseUrl,\n shop,\n cartAdapter,\n configHandle = \"default\",\n initialData,\n configFetcher,\n analyticsEndpoint: providedAnalyticsEndpoint,\n allowDrawerWhenInactive = false,\n children,\n } = props;\n\n const analyticsEndpoint = providedAnalyticsEndpoint ?? `${apiBaseUrl}/api/public/bundle-analytics`;\n\n const [isOpen, setIsOpen] = useState(false);\n const [loading, setLoading] = useState(!initialData);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [currencyCode, setCurrencyCode] = useState<string | null>(initialData?.currencyCode ?? null);\n const [config, setConfig] = useState<BundleConfig | null>(initialData?.config ?? null);\n const [eligibleVariants, setEligibleVariants] = useState<BundleEligibleVariant[]>(\n initialData?.eligibleVariants ?? [],\n );\n\n const [selectionsState, setSelectionsState] = useState<{ selections: BundleSelectionState; order: BundleSelectionOrder }>(\n () => ({ selections: {}, order: [] }),\n );\n\n const abortRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (initialData) return;\n\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n\n const fetcher = configFetcher ?? defaultFetchBundleConfig;\n\n setLoading(true);\n setError(null);\n fetcher({ apiBaseUrl, shop, configHandle, signal: ac.signal })\n .then((json) => {\n if (!json.ok) {\n setError(json.error || \"Failed to load bundle config.\");\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n return;\n }\n setCurrencyCode(json.currencyCode ?? null);\n const win = typeof window !== \"undefined\"\n ? (window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n })\n : null;\n const previewConfig = win?.__BUNDLE_PREVIEW_CONFIG__;\n if (previewConfig) {\n setConfig(previewConfig);\n const previewVariants = win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__;\n if (previewVariants !== undefined) {\n setEligibleVariants(previewVariants);\n } else {\n const idSet = new Set(previewConfig.eligibleVariantIds ?? []);\n setEligibleVariants(\n idSet.size === 0 ? (json.eligibleVariants ?? []) : (json.eligibleVariants ?? []).filter((v) => idSet.has(v.id)),\n );\n }\n setLoading(win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true);\n } else {\n setConfig(json.config);\n setEligibleVariants(json.eligibleVariants ?? []);\n setLoading(false);\n }\n })\n .catch((e: unknown) => {\n const msg = e instanceof Error ? e.message : \"Failed to load bundle config.\";\n setError(msg);\n setConfig(null);\n setEligibleVariants([]);\n setCurrencyCode(null);\n })\n .finally(() => {\n const win = typeof window !== \"undefined\" ? (window as Window & { __BUNDLE_PREVIEW_CONFIG__?: BundleConfig }) : null;\n if (!win?.__BUNDLE_PREVIEW_CONFIG__) setLoading(false);\n });\n\n return () => ac.abort();\n }, [apiBaseUrl, shop, configHandle, initialData, configFetcher]);\n\n useEffect(() => {\n const effective = getEffectiveStyleSettings(config?.styleSettings);\n if (effective) injectStyleVariables(effective);\n }, [config?.styleSettings]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const handlePreviewStyles = () => {\n const effective = getEffectiveStyleSettings(undefined);\n if (effective) injectStyleVariables(effective);\n };\n window.addEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n return () => window.removeEventListener(\"bundle-preview-styles-updated\", handlePreviewStyles);\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const win = window as Window & {\n __BUNDLE_PREVIEW_CONFIG__?: BundleConfig;\n __BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__?: BundleEligibleVariant[];\n __BUNDLE_PREVIEW_VARIANTS_LOADING__?: boolean;\n };\n const applyPreviewConfig = () => {\n const previewConfig = win.__BUNDLE_PREVIEW_CONFIG__;\n if (!previewConfig) return;\n const variantsLoading = win.__BUNDLE_PREVIEW_VARIANTS_LOADING__ === true;\n setLoading(variantsLoading);\n setConfig(previewConfig);\n const previewVariants = win.__BUNDLE_PREVIEW_ELIGIBLE_VARIANTS__;\n if (previewVariants) {\n setEligibleVariants(previewVariants);\n } else if (!variantsLoading) {\n setEligibleVariants((current) => {\n const idSet = new Set(previewConfig.eligibleVariantIds ?? []);\n if (idSet.size === 0 || current.length === 0) return current;\n return current.filter((v) => idSet.has(v.id));\n });\n }\n };\n if (win.__BUNDLE_PREVIEW_CONFIG__) applyPreviewConfig();\n window.addEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n return () => window.removeEventListener(\"bundle-preview-config-updated\", applyPreviewConfig);\n }, []);\n\n const open = useCallback(() => {\n if (!allowDrawerWhenInactive && config != null && !config.isActive) return;\n setIsOpen(true);\n // Track drawer opened event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((error) => {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n // Log error for debugging but don't break functionality\n console.warn(\"[Bundle Analytics] Error in open() callback:\", error);\n }\n }\n }, [analyticsEndpoint, shop, config, allowDrawerWhenInactive]);\n const close = useCallback(() => {\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_CLOSED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_closed\",\n }).catch((error) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer closed:\", error);\n });\n } catch (error) {\n console.warn(\"[Bundle Analytics] Error in close() callback:\", error);\n }\n }\n setIsOpen(false);\n if (typeof window !== \"undefined\" && window.location.hash.toLowerCase().startsWith(BUNDLE_DRAWER_HASH)) {\n window.history.replaceState(null, \"\", window.location.pathname + window.location.search);\n }\n }, [analyticsEndpoint, shop]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const openIfHash = () => {\n const handleInHash = getBundleHashHandle(window.location.hash);\n if (!handleInHash) return;\n if (handleInHash === \"default\" || handleInHash === configHandle) open();\n };\n openIfHash();\n window.addEventListener(\"hashchange\", openIfHash);\n return () => window.removeEventListener(\"hashchange\", openIfHash);\n }, [open, configHandle]);\n\n const toggle = useCallback(() => {\n if (!allowDrawerWhenInactive && !isOpen && config != null && !config.isActive) return;\n // Check current state and call appropriate function\n setIsOpen((current) => {\n if (!current) {\n // Opening - track the event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"DRAWER_OPENED\",\n shop,\n anonymousUserId,\n timestamp: new Date().toISOString(),\n mixpanelEvent: \"bundle_opened\",\n }).catch((error) => {\n console.warn(\"[Bundle Analytics] Failed to track drawer opened:\", error);\n });\n } catch (error) {\n console.warn(\"[Bundle Analytics] Error in toggle() callback:\", error);\n }\n }\n } else {\n // Closing via toggle - route through close() so bundle_closed is sent\n close();\n }\n return !current;\n });\n }, [analyticsEndpoint, shop, close, config, isOpen, allowDrawerWhenInactive]);\n\n useEffect(() => {\n if (!allowDrawerWhenInactive && config?.isActive === false && isOpen) close();\n }, [allowDrawerWhenInactive, config?.isActive, isOpen, close]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const eligibleVariantIdsSet = useMemo(() => {\n return new Set(\n eligibleVariants.filter((v) => v.availableForSale !== false).map((v) => v.id),\n );\n }, [eligibleVariants]);\n\n const minRequired = useMemo(() => {\n const rules = config?.rules ?? [];\n const ruleMin = rules.length ? Math.min(...rules.map((r) => r.minBundleSize)) : 2;\n const normalizedRuleMin = Number.isFinite(ruleMin) && ruleMin > 0 ? ruleMin : 2;\n const configuredRaw = Number(config?.minBundleSize ?? NaN);\n const configuredMin =\n Number.isFinite(configuredRaw) && Number.isInteger(configuredRaw)\n ? Math.max(2, Math.min(100, configuredRaw))\n : null;\n return configuredMin == null\n ? normalizedRuleMin\n : Math.min(normalizedRuleMin, configuredMin);\n }, [config?.minBundleSize, config?.rules]);\n\n const setQuantity = useCallback((merchandiseId: string, quantity: number) => {\n // Validate that the merchandiseId is in the eligible variants set\n if (!eligibleVariantIdsSet.has(merchandiseId)) {\n // Allow optimistic selection while config/variants are still loading.\n if (!loading) return; // Silently ignore ineligible variants\n }\n\n const q = clampQty(quantity);\n setSelectionsState((prev) => {\n const prevQty = prev.selections[merchandiseId] ?? 0;\n const requestedDelta = q - prevQty;\n const currentBundleSize = Object.values(prev.selections).reduce((sum, v) => sum + (v || 0), 0);\n const delta =\n requestedDelta > 0\n ? Math.min(requestedDelta, Math.max(0, maxBundleSize - currentBundleSize))\n : requestedDelta;\n\n const nextQty = prevQty + delta;\n\n // selections\n let nextSelections: BundleSelectionState;\n if (nextQty <= 0) {\n const { [merchandiseId]: _, ...rest } = prev.selections;\n nextSelections = rest;\n } else if (prevQty === nextQty) {\n nextSelections = prev.selections;\n } else {\n nextSelections = { ...prev.selections, [merchandiseId]: nextQty };\n }\n\n // order\n let nextOrder = prev.order;\n if (delta > 0) {\n // Add N items to the end.\n nextOrder = [...prev.order, ...Array.from({ length: delta }, () => merchandiseId)];\n } else if (delta < 0) {\n // Remove N most-recent occurrences of this variant.\n let remainingToRemove = -delta;\n const keptReversed: string[] = [];\n for (let i = prev.order.length - 1; i >= 0; i--) {\n const id = prev.order[i];\n if (id === merchandiseId && remainingToRemove > 0) {\n remainingToRemove--;\n continue;\n }\n keptReversed.push(id);\n }\n keptReversed.reverse();\n nextOrder = keptReversed;\n }\n\n if (nextSelections === prev.selections && nextOrder === prev.order) return prev;\n\n const prevBundleSize = currentBundleSize;\n const nextBundleSize = Object.values(nextSelections).reduce((sum, v) => sum + (v || 0), 0);\n\n // Track variant selection changed event (always for DB)\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const basePayload = {\n eventType: \"VARIANT_SELECTION_CHANGED\" as const,\n shop,\n anonymousUserId,\n before: { ...prev.selections },\n after: { ...nextSelections },\n timestamp: new Date().toISOString(),\n };\n trackEvent(analyticsEndpoint, shop, basePayload);\n\n // Mixpanel: bundle_started when first product added (0 -> >= 1)\n if (prevBundleSize === 0 && nextBundleSize >= 1) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_started\",\n });\n }\n // Mixpanel: bundle_completed when minimum size reached\n if (prevBundleSize < minRequired && nextBundleSize >= minRequired) {\n trackEvent(analyticsEndpoint, shop, {\n ...basePayload,\n mixpanelEvent: \"bundle_completed\",\n });\n }\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [maxBundleSize, minRequired, eligibleVariantIdsSet, analyticsEndpoint, shop, loading]);\n\n useEffect(() => {\n if (loading) return;\n setSelectionsState((prev) => {\n const nextSelectionsEntries = Object.entries(prev.selections).filter(([id]) =>\n eligibleVariantIdsSet.has(id),\n );\n const nextSelections = Object.fromEntries(nextSelectionsEntries) as BundleSelectionState;\n const nextOrder = prev.order.filter((id) => eligibleVariantIdsSet.has(id));\n\n if (\n nextOrder.length === prev.order.length &&\n nextSelectionsEntries.length === Object.keys(prev.selections).length\n ) {\n return prev;\n }\n\n return { selections: nextSelections, order: nextOrder };\n });\n }, [loading, eligibleVariantIdsSet]);\n\n const clearSelections = useCallback(() => setSelectionsState({ selections: {}, order: [] }), []);\n\n const selections = selectionsState.selections;\n const selectionOrder = selectionsState.order;\n\n const bundleSize = useMemo(() => Object.values(selections).reduce((sum, q) => sum + (q || 0), 0), [selections]);\n\n const canSubmit = useMemo(() => {\n if (loading || submitting) return false;\n if (error) return false;\n if (!config?.isActive) return false;\n if (bundleSize < minRequired) return false;\n return true;\n }, [bundleSize, config?.isActive, error, loading, minRequired, submitting]);\n\n // Shared logic for adding bundle to cart\n const performCartAddition = useCallback(async (options?: { onComplete?: () => void; checkout?: boolean }) => {\n if (!canSubmit || !config) return;\n\n const bundleId = safeRandomUUID();\n const bundleTitle = (config.title ?? \"\").trim().slice(0, 255);\n const lines = Object.entries(selections)\n .map(([merchandiseId, quantity]) => ({ merchandiseId, quantity: clampQty(quantity) }))\n .filter((l) => l.quantity > 0)\n .filter((l) => eligibleVariantIdsSet.has(l.merchandiseId)) // Filter out ineligible variants\n .map((l) => ({\n merchandiseId: l.merchandiseId,\n quantity: l.quantity,\n attributes: [\n { key: BundleLineAttributeKeys.bundleId, value: bundleId },\n { key: BundleLineAttributeKeys.bundleConfig, value: configHandle },\n { key: BundleLineAttributeKeys.bundleSource, value: \"bundle_builder\" },\n ...(bundleTitle ? [{ key: BundleLineAttributeKeys.bundleTitle, value: bundleTitle }] : []),\n ],\n }));\n\n if (!lines.length) return;\n\n // Calculate pricing and discount info for analytics\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let grossPrice = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n grossPrice += price * q;\n }\n grossPrice = Math.round(grossPrice * 100) / 100;\n\n // Find applied discount rule\n const rulesSorted = [...(config.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n let appliedRule: (typeof rulesSorted)[number] | null = null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) appliedRule = r;\n }\n\n const appliedDiscountPercent = appliedRule\n ? (() => {\n const pct = Number.parseFloat(appliedRule!.discountPercent);\n return Number.isFinite(pct) && pct > 0 ? pct : null;\n })()\n : null;\n\n const discountedPrice = appliedDiscountPercent\n ? Math.round(grossPrice * (1 - appliedDiscountPercent / 100) * 100) / 100\n : grossPrice;\n const discountedAmount = grossPrice - discountedPrice;\n\n const productVariantIds = lines.map((l) => l.merchandiseId);\n const discountThresholdIdentifier = appliedRule?.handle ?? \"\";\n const discountLabel = appliedRule?.label?.trim() || \"\";\n\n setSubmitting(true);\n try {\n if (options?.checkout) {\n await cartAdapter.linesAddForCheckout(lines);\n } else {\n await cartAdapter.linesAdd(lines);\n }\n\n // Track bundle added to basket event\n if (analyticsEndpoint) {\n try {\n const anonymousUserId = getOrCreateAnonymousUserId();\n const isCheckout = !!options?.checkout;\n trackEvent(analyticsEndpoint, shop, {\n eventType: \"BUNDLE_ADDED_TO_BASKET\",\n shop,\n anonymousUserId,\n bundleId,\n productVariantIds,\n grossPrice,\n discountedPrice,\n currency: currencyCode ?? undefined,\n discountThresholdIdentifier,\n discountLabel,\n discountPercentage: appliedDiscountPercent,\n discountedAmount,\n timestamp: new Date().toISOString(),\n checkout: isCheckout,\n mixpanelEvent: isCheckout ? \"checkout_started_with_bundle\" : \"bundle_added_to_cart\",\n });\n } catch {\n // Silently fail - analytics should not break functionality\n }\n }\n\n clearSelections();\n close();\n // Call the completion callback\n options?.onComplete?.();\n } finally {\n setSubmitting(false);\n }\n }, [\n canSubmit,\n cartAdapter,\n clearSelections,\n close,\n config,\n configHandle,\n currencyCode,\n selections,\n eligibleVariantIdsSet,\n eligibleVariants,\n bundleSize,\n analyticsEndpoint,\n shop,\n ]);\n\n const submit = useCallback(async () => {\n await performCartAddition(\n {\n onComplete: () => {\n cartAdapter.openCartUI?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const submitAndCheckout = useCallback(async () => {\n await performCartAddition(\n {\n checkout: true,\n onComplete: () => {\n cartAdapter.navigateToCheckout?.();\n }\n }\n );\n }, [performCartAddition, cartAdapter]);\n\n const value: BundleBuilderContextValue = useMemo(\n () => ({\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n }),\n [\n isOpen,\n open,\n close,\n toggle,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n clearSelections,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n ],\n );\n\n return <BundleBuilderContext.Provider value={value}>{children}</BundleBuilderContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { BundleBuilderContext } from \"../context/BundleProvider\";\n\nexport function useBundleBuilder() {\n const ctx = useContext(BundleBuilderContext);\n if (!ctx) {\n throw new Error(\"useBundleBuilder must be used within <BundleProvider />\");\n }\n return ctx;\n}\n\n","import { useBundleBuilder } from \"./useBundleBuilder\";\n\nexport type BundleBuilderDrawerControls = {\n isOpen: boolean;\n open: () => void;\n close: () => void;\n toggle: () => void;\n};\n\n/**\n * Convenience hook for controlling the drawer (alternative to using <BundleButton />).\n * Must be used within <BundleProvider />.\n */\nexport function useBundleBuilderDrawer(): BundleBuilderDrawerControls {\n const { isOpen, open, close, toggle } = useBundleBuilder();\n return { isOpen, open, close, toggle };\n}\n\n","import React from \"react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleButton.module.css\";\n\nexport type BundleButtonProps = {\n children?: React.ReactNode;\n className?: string;\n};\n\nexport function BundleButton(props: BundleButtonProps) {\n const { toggle } = useBundleBuilder();\n return (\n <button\n type=\"button\"\n onClick={toggle}\n className={[styles.button, props.className].filter(Boolean).join(\" \")}\n >\n {props.children ?? \"Build a bundle\"}\n </button>\n );\n}\n\n","'use strict';\n\n// t: current time, b: beginning value, _c: final value, d: total duration\nvar tweenFunctions = {\n linear: function(t, b, _c, d) {\n var c = _c - b;\n return c * t / d + b;\n },\n easeInQuad: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t + b;\n },\n easeOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (t /= d) * (t - 2) + b;\n },\n easeInOutQuad: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t + b;\n } else {\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n }\n },\n easeInCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t + b;\n },\n easeOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t + 1) + b;\n },\n easeInOutCubic: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n },\n easeInQuart: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t + b;\n },\n easeOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n },\n easeInOutQuart: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t + b;\n } else {\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n },\n easeInQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * (t /= d) * t * t * t * t + b;\n },\n easeOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n },\n easeInOutQuint: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return c / 2 * t * t * t * t * t + b;\n } else {\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n },\n easeInSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n },\n easeOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n },\n easeInOutSine: function(t, b, _c, d) {\n var c = _c - b;\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n },\n easeInExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\n },\n easeOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\n },\n easeInOutExpo: function(t, b, _c, d) {\n var c = _c - b;\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n } else {\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n },\n easeInCirc: function(t, b, _c, d) {\n var c = _c - b;\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n },\n easeOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n },\n easeInOutCirc: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d / 2) < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n } else {\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n },\n easeInElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n },\n easeOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d) === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n },\n easeInOutElastic: function(t, b, _c, d) {\n var c = _c - b;\n var a, p, s;\n s = 1.70158;\n p = 0;\n a = c;\n if (t === 0) {\n return b;\n } else if ((t /= d / 2) === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n } else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n if (t < 1) {\n return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n } else {\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b;\n }\n },\n easeInBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n },\n easeOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n },\n easeInOutBack: function(t, b, _c, d, s) {\n var c = _c - b;\n if (s === void 0) {\n s = 1.70158;\n }\n if ((t /= d / 2) < 1) {\n return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;\n } else {\n return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;\n }\n },\n easeInBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n v = tweenFunctions.easeOutBounce(d - t, 0, c, d);\n return c - v + b;\n },\n easeOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n if ((t /= d) < 1 / 2.75) {\n return c * (7.5625 * t * t) + b;\n } else if (t < 2 / 2.75) {\n return c * (7.5625 * (t -= 1.5 / 2.75) * t + 0.75) + b;\n } else if (t < 2.5 / 2.75) {\n return c * (7.5625 * (t -= 2.25 / 2.75) * t + 0.9375) + b;\n } else {\n return c * (7.5625 * (t -= 2.625 / 2.75) * t + 0.984375) + b;\n }\n },\n easeInOutBounce: function(t, b, _c, d) {\n var c = _c - b;\n var v;\n if (t < d / 2) {\n v = tweenFunctions.easeInBounce(t * 2, 0, c, d);\n return v * 0.5 + b;\n } else {\n v = tweenFunctions.easeOutBounce(t * 2 - d, 0, c, d);\n return v * 0.5 + c * 0.5 + b;\n }\n }\n};\n\nmodule.exports = tweenFunctions;\n","import { jsx } from 'react/jsx-runtime';\nimport React from 'react';\nimport * as tweens from 'tween-functions';\n\nfunction degreesToRads(degrees) {\n return (degrees * Math.PI) / 180;\n}\nfunction randomRange(min, max) {\n return min + Math.random() * (max - min);\n}\nfunction randomInt(min, max) {\n return Math.floor(min + Math.random() * (max - min + 1));\n}\n\nvar ParticleShape;\n(function (ParticleShape) {\n ParticleShape[ParticleShape[\"Circle\"] = 0] = \"Circle\";\n ParticleShape[ParticleShape[\"Square\"] = 1] = \"Square\";\n ParticleShape[ParticleShape[\"Strip\"] = 2] = \"Strip\";\n})(ParticleShape || (ParticleShape = {}));\nvar RotationDirection;\n(function (RotationDirection) {\n RotationDirection[RotationDirection[\"Positive\"] = 1] = \"Positive\";\n RotationDirection[RotationDirection[\"Negative\"] = -1] = \"Negative\";\n})(RotationDirection || (RotationDirection = {}));\nconst DEFAULT_FRAME_TIME = 1000 / 60;\nclass Particle {\n constructor(context, getOptions, x, y) {\n this.getOptions = getOptions;\n const { colors, initialVelocityX, initialVelocityY } = this.getOptions();\n this.context = context;\n this.x = x;\n this.y = y;\n this.w = randomRange(5, 20);\n this.h = randomRange(5, 20);\n this.radius = randomRange(5, 10);\n this.vx =\n typeof initialVelocityX === 'number'\n ? randomRange(-initialVelocityX, initialVelocityX)\n : randomRange(initialVelocityX.min, initialVelocityX.max);\n this.vy =\n typeof initialVelocityY === 'number'\n ? randomRange(-initialVelocityY, 0)\n : randomRange(initialVelocityY.min, initialVelocityY.max);\n this.shape = randomInt(0, 2);\n this.angle = degreesToRads(randomRange(0, 360));\n this.angularSpin = randomRange(-0.2, 0.2);\n this.color = colors[Math.floor(Math.random() * colors.length)];\n this.rotateY = randomRange(0, 1);\n this.rotationDirection = randomRange(0, 1)\n ? RotationDirection.Positive\n : RotationDirection.Negative;\n }\n update(elapsed) {\n const { gravity, wind, friction, opacity, drawShape } = this.getOptions();\n const frameTimeMultiplier = elapsed / DEFAULT_FRAME_TIME;\n this.x += this.vx * frameTimeMultiplier;\n this.y += this.vy * frameTimeMultiplier;\n this.vy += gravity * frameTimeMultiplier;\n this.vx += wind * frameTimeMultiplier;\n this.vx *= friction ** frameTimeMultiplier;\n this.vy *= friction ** frameTimeMultiplier;\n if (this.rotateY >= 1 &&\n this.rotationDirection === RotationDirection.Positive) {\n this.rotationDirection = RotationDirection.Negative;\n }\n else if (this.rotateY <= -1 &&\n this.rotationDirection === RotationDirection.Negative) {\n this.rotationDirection = RotationDirection.Positive;\n }\n const rotateDelta = 0.1 * this.rotationDirection * frameTimeMultiplier;\n this.rotateY += rotateDelta;\n this.angle += this.angularSpin;\n this.context.save();\n this.context.translate(this.x, this.y);\n this.context.rotate(this.angle);\n this.context.scale(1, this.rotateY);\n this.context.rotate(this.angle);\n this.context.beginPath();\n this.context.fillStyle = this.color;\n this.context.strokeStyle = this.color;\n this.context.globalAlpha = opacity;\n this.context.lineCap = 'round';\n this.context.lineWidth = 2;\n if (drawShape && typeof drawShape === 'function') {\n drawShape.call(this, this.context);\n }\n else {\n switch (this.shape) {\n case ParticleShape.Circle: {\n this.context.beginPath();\n this.context.arc(0, 0, this.radius, 0, 2 * Math.PI);\n this.context.fill();\n break;\n }\n case ParticleShape.Square: {\n this.context.fillRect(-this.w / 2, -this.h / 2, this.w, this.h);\n break;\n }\n case ParticleShape.Strip: {\n this.context.fillRect(-this.w / 6, -this.h / 2, this.w / 3, this.h);\n break;\n }\n }\n }\n this.context.closePath();\n this.context.restore();\n }\n}\n\nclass ParticleGenerator {\n constructor(canvas, getOptions) {\n this.x = 0;\n this.y = 0;\n this.w = 0;\n this.h = 0;\n this.lastNumberOfPieces = 0;\n this.tweenProgress = 0;\n this.tweenFrom = 0;\n this.particles = [];\n this.particlesGenerated = 0;\n this.removeParticleAt = (i) => {\n this.particles.splice(i, 1);\n };\n this.getParticle = () => {\n const newParticleX = randomRange(this.x, this.w + this.x);\n const newParticleY = randomRange(this.y, this.h + this.y);\n return new Particle(this.context, this.getOptions, newParticleX, newParticleY);\n };\n this.animate = (elapsed) => {\n const { canvas, context, particlesGenerated, lastNumberOfPieces } = this;\n const { run, recycle, numberOfPieces, debug, tweenFunction, tweenDuration, } = this.getOptions();\n if (!run) {\n return false;\n }\n const nP = this.particles.length;\n const activeCount = recycle ? nP : particlesGenerated;\n // Initial population\n if (activeCount < numberOfPieces) {\n // Use the numberOfPieces prop as a key to reset the easing timing\n if (lastNumberOfPieces !== numberOfPieces) {\n this.tweenProgress = 0;\n this.tweenFrom = activeCount;\n this.lastNumberOfPieces = numberOfPieces;\n }\n // Clamp tweenProgress between 0 and tweenDuration\n this.tweenProgress = Math.min(tweenDuration, Math.max(0, this.tweenProgress + elapsed));\n const tweenedVal = tweenFunction(this.tweenProgress, this.tweenFrom, numberOfPieces, tweenDuration);\n const numToAdd = Math.round(tweenedVal - activeCount);\n for (let i = 0; i < numToAdd; i++) {\n this.particles.push(this.getParticle());\n }\n this.particlesGenerated += numToAdd;\n }\n if (debug) {\n // Draw debug text\n context.font = '12px sans-serif';\n context.fillStyle = '#333';\n context.textAlign = 'right';\n context.fillText(`Particles: ${nP}`, canvas.width - 10, canvas.height - 20);\n }\n // Maintain the population, iterating backwards to prevent issues when removing particles\n for (let i = this.particles.length - 1; i >= 0; i--) {\n const p = this.particles[i];\n // Update each particle's position\n p.update(elapsed);\n // Prune the off-canvas particles\n if (p.y > canvas.height ||\n p.y < -100 ||\n p.x > canvas.width + 100 ||\n p.x < -100) {\n if (recycle && activeCount <= numberOfPieces) {\n // Replace the particle with a brand new one\n this.particles[i] = this.getParticle();\n }\n else {\n this.removeParticleAt(i);\n }\n }\n }\n return nP > 0 || activeCount < numberOfPieces;\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.getOptions = getOptions;\n }\n}\n\nconst confettiDefaults = {\n width: typeof window !== 'undefined' ? window.innerWidth : 300,\n height: typeof window !== 'undefined' ? window.innerHeight : 200,\n numberOfPieces: 200,\n friction: 0.99,\n wind: 0,\n gravity: 0.1,\n initialVelocityX: 4,\n initialVelocityY: 10,\n colors: [\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4CAF50',\n '#8BC34A',\n '#CDDC39',\n '#FFEB3B',\n '#FFC107',\n '#FF9800',\n '#FF5722',\n '#795548',\n ],\n opacity: 1.0,\n debug: false,\n tweenFunction: tweens.easeInOutQuad,\n tweenDuration: 5000,\n recycle: true,\n run: true,\n};\nclass Confetti {\n constructor(canvas, opts) {\n this.lastFrameTime = 0;\n this.setOptionsWithDefaults = (opts) => {\n const computedConfettiDefaults = {\n confettiSource: {\n x: 0,\n y: 0,\n w: this.canvas.width,\n h: 0,\n },\n };\n this._options = {\n ...computedConfettiDefaults,\n ...confettiDefaults,\n ...opts,\n };\n Object.assign(this, opts.confettiSource);\n };\n this.update = (timestamp = 0) => {\n const { options: { run, onConfettiComplete, frameRate }, canvas, context, } = this;\n // Cap elapsed time to 50ms to prevent large time steps\n const elapsed = Math.min(timestamp - this.lastFrameTime, 50);\n // Throttle the frame rate if set\n if (frameRate && elapsed < 1000 / frameRate) {\n this.rafId = requestAnimationFrame(this.update);\n return;\n }\n this.lastFrameTime = timestamp - (frameRate ? elapsed % frameRate : 0);\n if (run) {\n context.fillStyle = 'white';\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n if (this.generator.animate(elapsed)) {\n this.rafId = requestAnimationFrame(this.update);\n }\n else {\n if (onConfettiComplete &&\n typeof onConfettiComplete === 'function' &&\n this.generator.particlesGenerated > 0) {\n onConfettiComplete.call(this, this);\n }\n this._options.run = false;\n }\n };\n this.reset = () => {\n if (this.generator && this.generator.particlesGenerated > 0) {\n this.generator.particlesGenerated = 0;\n this.generator.particles = [];\n this.generator.lastNumberOfPieces = 0;\n }\n };\n this.stop = () => {\n this.options = { run: false };\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = undefined;\n }\n };\n this.canvas = canvas;\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.context = ctx;\n this.generator = new ParticleGenerator(this.canvas, () => this.options);\n this.options = opts;\n this.update();\n }\n get options() {\n return this._options;\n }\n set options(opts) {\n const lastRunState = this._options?.run;\n const lastRecycleState = this._options?.recycle;\n this.setOptionsWithDefaults(opts);\n if (this.generator) {\n Object.assign(this.generator, this.options.confettiSource);\n if (typeof opts.recycle === 'boolean' &&\n opts.recycle &&\n lastRecycleState === false) {\n this.generator.lastNumberOfPieces = this.generator.particles.length;\n }\n }\n if (typeof opts.run === 'boolean' && opts.run && lastRunState === false) {\n this.update();\n }\n }\n}\n\nconst ref = React.createRef();\nclass ReactConfettiInternal extends React.Component {\n constructor(props) {\n super(props);\n this.canvas = React.createRef();\n this.canvas = props.canvasRef || ref;\n }\n componentDidMount() {\n if (this.canvas.current) {\n const opts = extractCanvasProps(this.props)[0];\n this.confetti = new Confetti(this.canvas.current, opts);\n }\n }\n componentDidUpdate() {\n const confettiOptions = extractCanvasProps(this.props)[0];\n if (this.confetti) {\n this.confetti.options = confettiOptions;\n }\n }\n componentWillUnmount() {\n if (this.confetti) {\n this.confetti.stop();\n }\n this.confetti = undefined;\n }\n render() {\n const [confettiOptions, passedProps] = extractCanvasProps(this.props);\n const canvasStyles = {\n zIndex: 2,\n position: 'absolute',\n pointerEvents: 'none',\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n ...passedProps.style,\n };\n return (jsx(\"canvas\", { width: confettiOptions.width, height: confettiOptions.height, ref: this.canvas, ...passedProps, style: canvasStyles }));\n }\n}\nReactConfettiInternal.defaultProps = {\n ...confettiDefaults,\n};\nReactConfettiInternal.displayName = 'ReactConfetti';\nfunction extractCanvasProps(props) {\n const confettiOptions = {};\n const refs = {};\n const rest = {};\n const confettiOptionKeys = [\n ...Object.keys(confettiDefaults),\n 'confettiSource',\n 'drawShape',\n 'onConfettiComplete',\n 'frameRate',\n ];\n const refProps = ['canvasRef'];\n for (const prop in props) {\n const val = props[prop];\n if (confettiOptionKeys.includes(prop)) {\n confettiOptions[prop] = val;\n }\n else if (refProps.includes(prop)) {\n refProps[prop] = val;\n }\n else {\n rest[prop] = val;\n }\n }\n return [confettiOptions, rest, refs];\n}\nconst ReactConfetti = React.forwardRef((props, ref) => jsx(ReactConfettiInternal, { canvasRef: ref, ...props }));\n\nexport { ReactConfetti as default };\n//# sourceMappingURL=react-confetti.mjs.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.515.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport Confetti from \"react-confetti\";\nimport { Link, Search } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderDrawer.module.css\";\n\nexport type BundleBuilderDrawerProps = {\n className?: string;\n};\n\nexport function BundleBuilderDrawer(props: BundleBuilderDrawerProps) {\n const {\n isOpen,\n close,\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const [isSearchOpen, setIsSearchOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const footerRef = useRef<HTMLElement | null>(null);\n const celebrationChipRef = useRef<HTMLDivElement | null>(null);\n\n const [windowSize, setWindowSize] = useState<{ width: number; height: number }>(() => {\n if (typeof window === \"undefined\") return { width: 0, height: 0 };\n return { width: window.innerWidth, height: window.innerHeight };\n });\n\n const [confettiKey, setConfettiKey] = useState(0);\n const [confettiSource, setConfettiSource] = useState<{ x: number; y: number; w: number; h: number } | null>(null);\n const [isConfettiActive, setIsConfettiActive] = useState(false);\n const confettiTimerRef = useRef<number | null>(null);\n const prevBundleSizeForConfettiRef = useRef<number>(bundleSize);\n const confettiSettleMs = 7000;\n\n const [celebrationKey, setCelebrationKey] = useState(0);\n const [celebrationText, setCelebrationText] = useState<string | null>(null);\n const [isCelebrationActive, setIsCelebrationActive] = useState(false);\n const celebrationTimerRef = useRef<number | null>(null);\n const celebrationDurationMs = 2800;\n\n const DEFAULT_CONFETTI_COLORS = [\n \"#2563eb\",\n \"#3b82f6\",\n \"#60a5fa\",\n \"#93c5fd\",\n \"#bae6fd\",\n \"#e0f2fe\",\n ] as const;\n\n const confettiColors = useMemo(() => {\n const c = config?.styleSettings?.confettiColors;\n if (Array.isArray(c) && c.length >= 6) {\n return c.slice(0, 6).map((s, i) =>\n typeof s === \"string\" && s.trim() ? s : DEFAULT_CONFETTI_COLORS[i],\n );\n }\n return [...DEFAULT_CONFETTI_COLORS];\n }, [config?.styleSettings?.confettiColors]);\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" · \");\n };\n\n const getVariantPrimaryName = (v: (typeof eligibleVariants)[number]) => {\n return v.product?.title ?? v.displayName ?? v.title;\n };\n\n const getVariantA11yLabel = (v: (typeof eligibleVariants)[number]) => {\n const name = getVariantPrimaryName(v);\n const opts = formatVariantOptions(v.selectedOptions);\n return [name, opts].filter(Boolean).join(\" — \");\n };\n\n const [isMounted, setIsMounted] = useState(isOpen);\n const closeTimerRef = useRef<number | null>(null);\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n\n return `$${n.toFixed(2)}`;\n };\n\n const title = config?.title?.trim() || \"Build your bundle\";\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const sorted = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const filteredVariants = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n if (!q) return sorted;\n\n const tokens = q.split(/\\s+/).filter(Boolean);\n const matches = (v: (typeof sorted)[number]) => {\n const parts: string[] = [];\n parts.push(v.displayName);\n if (v.product?.title) parts.push(v.product.title);\n for (const o of v.selectedOptions ?? []) {\n parts.push(o.name);\n parts.push(o.value);\n }\n const haystack = parts.join(\" \").toLowerCase();\n return tokens.every((t) => haystack.includes(t));\n };\n\n return sorted.filter(matches);\n }, [searchQuery, sorted]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n // Keep cents stable for display.\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n // Slot index (0-based) => rule that becomes active at that slot.\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const slotCount = useMemo(() => {\n // Placeholders show until highest tier; if user adds more, extend (scroll).\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n // Track animation state for dual button split animation\n const [isDualButtonAnimationLoaded, setIsDualButtonAnimationLoaded] = useState(true);\n const prevItemsRemainingRef = useRef(itemsRemaining);\n\n // Trigger animation when itemsRemaining changes from > 0 to 0 in add_to_cart_checkout mode\n useEffect(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n const wasPositive = prevItemsRemainingRef.current > 0;\n const isNowZero = itemsRemaining === 0;\n\n if (wasPositive && isNowZero) {\n // Trigger animation\n setIsDualButtonAnimationLoaded(false);\n } else {\n // Reset animation\n setIsDualButtonAnimationLoaded(true);\n }\n }\n prevItemsRemainingRef.current = itemsRemaining;\n }, [itemsRemaining, config?.ctaButtonMode]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = bodyRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\"${variantId}\"]`);\n if (!row) return;\n\n const c = container.getBoundingClientRect();\n const r = row.getBoundingClientRect();\n const padding = 8;\n const isFullyVisible = r.top >= c.top + padding && r.bottom <= c.bottom - padding;\n if (isFullyVisible) return;\n\n const maxTop = Math.max(0, container.scrollHeight - container.clientHeight);\n const rowCenterOffset = (r.top - c.top) + r.height / 2;\n const targetTop = container.scrollTop + rowCenterOffset - container.clientHeight / 2;\n const nextTop = Math.min(maxTop, Math.max(0, targetTop));\n container.scrollTo({ top: nextTop, behavior: \"smooth\" });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") close();\n };\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [close, isOpen]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setWindowSize({ width: window.innerWidth, height: window.innerHeight });\n onResize();\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n useEffect(() => {\n if (closeTimerRef.current != null) {\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n\n if (isOpen) {\n setIsMounted(true);\n return;\n }\n\n // Keep mounted long enough to play exit animation.\n closeTimerRef.current = window.setTimeout(() => {\n setIsMounted(false);\n closeTimerRef.current = null;\n }, 220);\n }, [isOpen]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) window.clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n return () => {\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isSearchOpen) return;\n const raf = requestAnimationFrame(() => searchInputRef.current?.focus());\n return () => cancelAnimationFrame(raf);\n }, [isOpen, isSearchOpen]);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n\n // When hitting a threshold, try to reveal the NEXT threshold (aligned right) if it's off-screen to the right.\n // If no remaining thresholds, scroll the newest added item into view.\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n // Only scroll rightward when the target is off-screen to the right.\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const prev = prevBundleSizeForConfettiRef.current;\n prevBundleSizeForConfettiRef.current = bundleSize;\n\n // Only respond to adds (qty increases).\n if (bundleSize <= prev) return;\n\n // Trigger when crossing an exact configured threshold (e.g. 2 items, 3 items, etc.).\n const hitRule = rulesSorted.find((r) => r.minBundleSize === bundleSize);\n if (!hitRule) return;\n\n // Celebration chip (centered)\n setCelebrationText(`You received a ${formatPercent0dp(hitRule.discountPercent)}% discount!`);\n setCelebrationKey((k) => k + 1);\n setIsCelebrationActive(true);\n if (celebrationTimerRef.current != null) window.clearTimeout(celebrationTimerRef.current);\n celebrationTimerRef.current = window.setTimeout(() => {\n setIsCelebrationActive(false);\n celebrationTimerRef.current = null;\n }, celebrationDurationMs);\n }, [bundleSize, isOpen, rulesSorted]);\n\n useEffect(() => {\n if (!isOpen) return;\n if (!isCelebrationActive) return;\n if (!celebrationText) return;\n\n // After the chip renders, measure its rect and shoot confetti from it.\n const raf = requestAnimationFrame(() => {\n const chipEl = celebrationChipRef.current;\n const rect = chipEl?.getBoundingClientRect();\n\n // Fallback: use the drawer panel center if chip rect isn't available yet.\n const panelRect = panelRef.current?.getBoundingClientRect();\n const originX = rect ? rect.left + rect.width / 2 : panelRect ? panelRect.left + panelRect.width / 2 : window.innerWidth / 2;\n const originY = rect ? rect.top + rect.height / 2 : panelRect ? panelRect.top + panelRect.height / 2 : window.innerHeight / 2;\n\n const source = {\n x: originX - 2,\n y: originY - 2,\n w: 4,\n h: 4,\n };\n\n setConfettiSource(source);\n setConfettiKey((k) => k + 1);\n setIsConfettiActive(true);\n\n if (confettiTimerRef.current != null) window.clearTimeout(confettiTimerRef.current);\n confettiTimerRef.current = window.setTimeout(() => {\n setIsConfettiActive(false);\n confettiTimerRef.current = null;\n }, confettiSettleMs);\n });\n\n return () => cancelAnimationFrame(raf);\n }, [celebrationKey, celebrationText, confettiSettleMs, isCelebrationActive, isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n panelRef.current?.focus();\n }, [isOpen]);\n\n if (!isMounted) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Bundle builder\"\n className={[styles.backdrop, isOpen ? styles.backdropOpen : styles.backdropClosed, props.className].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close();\n }}\n >\n {isConfettiActive && confettiSource && windowSize.width > 0 && windowSize.height > 0 ? (\n <Confetti\n key={confettiKey}\n width={windowSize.width}\n height={windowSize.height}\n confettiSource={confettiSource}\n colors={confettiColors}\n recycle={false}\n numberOfPieces={70}\n tweenDuration={100}\n gravity={0.45}\n initialVelocityY={{ min: -10, max: -30 }}\n initialVelocityX={{ min: -6, max: 6 }}\n style={{ position: \"fixed\", inset: 0, pointerEvents: \"none\", zIndex: 2147483646 }}\n />\n ) : null}\n <aside ref={panelRef} className={[styles.panel, isOpen ? styles.panelOpen : styles.panelClosed].filter(Boolean).join(\" \")} tabIndex={-1}>\n {isCelebrationActive && celebrationText ? (\n <div className={styles.celebrationOverlay} aria-hidden=\"true\">\n <div key={celebrationKey} ref={celebrationChipRef} className={styles.celebrationChip}>\n {celebrationText}\n </div>\n </div>\n ) : null}\n <header className={[styles.header, isSearchOpen ? styles.headerSearchOpen : null].filter(Boolean).join(\" \")}>\n <button\n type=\"button\"\n className={styles.searchIconButton}\n aria-label={isSearchOpen ? \"Search (expanded)\" : \"Search\"}\n aria-expanded={isSearchOpen}\n onClick={() => {\n setIsSearchOpen(true);\n }}\n >\n <Search size={18} aria-hidden=\"true\" />\n </button>\n\n <div className={styles.headerCenter}>\n <div className={styles.headerTitleWrap} aria-hidden={isSearchOpen}>\n <h2 className={styles.title}>{title}</h2>\n </div>\n\n <div className={styles.headerSearchWrap} aria-hidden={!isSearchOpen}>\n <div className={styles.searchBar}>\n <input\n ref={searchInputRef}\n className={styles.searchInput}\n type=\"search\"\n value={searchQuery}\n placeholder=\"Search\"\n onChange={(e) => setSearchQuery(e.target.value)}\n onBlur={() => {\n if (searchQuery.trim() === \"\") setIsSearchOpen(false);\n }}\n />\n {searchQuery.trim() ? (\n <button\n type=\"button\"\n className={styles.searchClearButton}\n onMouseDown={(e) => {\n // Prevent input blur so the bar stays open and focused.\n e.preventDefault();\n }}\n onClick={() => {\n setSearchQuery(\"\");\n searchInputRef.current?.focus();\n }}\n aria-label=\"Clear search\"\n >\n Clear\n </button>\n ) : null}\n </div>\n </div>\n </div>\n\n <button type=\"button\" onClick={close} disabled={submitting} className={styles.closeButton} aria-label=\"Close\">\n ×\n </button>\n </header>\n\n <div className={styles.body} ref={bodyRef}>\n {loading ? <p className={styles.muted}>Loading…</p> : null}\n {error ? <p className={styles.error}>{error}</p> : null}\n\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {filteredVariants.map((v) => {\n const qty = selections[v.id] ?? 0;\n const variantPrimaryName = getVariantPrimaryName(v);\n const variantOptionText = formatVariantOptions(v.selectedOptions);\n const variantA11y = getVariantA11yLabel(v);\n\n // Show discounted variant price only when a rule is actually unlocked.\n const discountPercentToUse = appliedDiscountPercent;\n const originalPriceNumber = Number(v.price);\n const hasDiscount =\n discountPercentToUse != null &&\n Number.isFinite(discountPercentToUse) &&\n discountPercentToUse > 0 &&\n Number.isFinite(originalPriceNumber);\n const discountedPriceNumber = hasDiscount\n ? Math.round(originalPriceNumber * (1 - discountPercentToUse / 100) * 100) / 100\n : null;\n\n return (\n <li\n key={v.id}\n className={[styles.variantRow, v.availableForSale === false && styles.variantRowSoldOut]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={v.id}\n >\n <div className={styles.variantLeft}>\n <div className={styles.variantThumb} aria-hidden=\"true\">\n {v.image?.url ? (\n <img\n className={styles.variantThumbImg}\n src={v.image.url}\n alt={v.image.altText ?? variantA11y}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantThumbFallback}>{v.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}</div>\n )}\n </div>\n\n <div className={styles.variantInfo}>\n <div className={styles.variantName}>{variantPrimaryName}</div>\n {variantOptionText ? <div className={styles.variantMeta}>{variantOptionText}</div> : null}\n <div className={styles.variantPriceRow}>\n {hasDiscount ? (\n <span className={styles.variantCompareAt}>\n {formatMoney(Number.isFinite(originalPriceNumber) ? originalPriceNumber.toFixed(2) : v.price)}\n </span>\n ) : null}\n <span className={styles.variantPrice}>\n {formatMoney(\n discountedPriceNumber != null\n ? discountedPriceNumber.toFixed(2)\n : Number.isFinite(originalPriceNumber)\n ? originalPriceNumber.toFixed(2)\n : v.price,\n )}\n </span>\n </div>\n </div>\n </div>\n {v.availableForSale === false ? (\n <div className={styles.soldOutContainer}>\n <span className={styles.soldOut} aria-label={`${variantA11y} is sold out`}>\n Sold<br />Out\n </span>\n </div>\n ) : qty <= 0 ? (\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.addToBundleButton}\n aria-label={`Add ${variantA11y} to bundle`}\n >\n Add\n </button>\n ) : (\n <div className={styles.qtyControls}>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty - 1)}\n disabled={submitting || qty <= 0}\n className={styles.qtyButton}\n aria-label={`Decrease ${variantA11y}`}\n >\n −\n </button>\n <span className={styles.qtyValue} aria-label={`Quantity ${qty}`}>\n {qty}\n </span>\n <button\n type=\"button\"\n onClick={() => setQuantity(v.id, qty + 1)}\n disabled={submitting || isAtMaxBundleSize}\n className={styles.qtyButton}\n aria-label={`Increase ${variantA11y}`}\n >\n +\n </button>\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n\n <footer className={styles.footer} ref={footerRef}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n\n // Per your preference: show discount text only while it's still a placeholder (unlocked display comes later elsewhere).\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold ? `${threshold.discountPercent}% off` : null;\n\n const titleText = isFilled ? variant!.displayName : `Slot ${idx + 1}`;\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${discountText}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>\n {appliedDiscountPercent}% Discount\n </span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n // Show single button with \"Add X more\" when items remaining\n // Show both buttons side-by-side when minimum is met\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\n </button>\n );\n }\n\n return (\n <div className={`${styles.ctaButtonGroup} ${isDualButtonAnimationLoaded ? styles.ctaButtonGroupAnimating : \"\"}`}>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!canSubmit}\n className={`${styles.ctaDualLeft} ${isDualButtonAnimationLoaded ? styles.ctaDualLeftAnimating : \"\"}`}\n >\n <span>{submitting ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button\n type=\"button\"\n onClick={submitAndCheckout}\n disabled={!canSubmit}\n className={`${styles.ctaDualRight} ${isDualButtonAnimationLoaded ? styles.ctaDualRightAnimating : \"\"}`}\n >\n <span>{submitting ? \"Processing…\" : \"Checkout\"}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Processing…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Checkout\"}\n </button>\n );\n }\n\n // Default: add_to_cart\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : itemsRemaining > 0 ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}` : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\"> BestBundles</a>\n </div>\n </footer>\n </aside>\n </div>\n );\n}\n\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { Plus, Trash2 } from \"lucide-react\";\nimport { useBundleBuilder } from \"../hooks/useBundleBuilder\";\nimport styles from \"./BundleBuilderPanel.module.css\";\n\nexport type BundleBuilderPanelProps = {\n className?: string;\n showRules?: boolean;\n showVariants?: boolean;\n};\n\nexport function BundleBuilderPanel(props: BundleBuilderPanelProps) {\n const {\n loading,\n submitting,\n error,\n currencyCode,\n config,\n eligibleVariants,\n selections,\n selectionOrder,\n setQuantity,\n bundleSize,\n minRequired,\n canSubmit,\n submit,\n submitAndCheckout,\n } = useBundleBuilder();\n\n const {\n className,\n showRules = true,\n showVariants = true,\n } = props;\n\n const formatPercent0dp = (value: string) => {\n const n = Number.parseFloat(value);\n if (!Number.isFinite(n)) return value;\n return String(Math.round(n));\n };\n\n const formatVariantOptions = (selectedOptions: Array<{ name: string; value: string }> | null | undefined) => {\n const opts = (selectedOptions ?? []).filter((o) => {\n const name = o?.name?.trim();\n const value = o?.value?.trim();\n if (!name || !value) return false;\n if (name.toLowerCase() === \"title\") return false;\n return true;\n });\n if (!opts.length) return null;\n return opts.map((o) => `${o.name}: ${o.value}`).join(\" • \");\n };\n\n const formatMoney = (amount: string) => {\n const n = Number(amount);\n if (!Number.isFinite(n)) return amount;\n if (currencyCode) {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currencyCode }).format(n);\n } catch {\n // ignore and fall through\n }\n }\n return `$${n.toFixed(2)}`;\n };\n\n const sortedVariants = useMemo(() => {\n return [...eligibleVariants].sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [eligibleVariants]);\n\n const rulesSorted = useMemo(() => {\n return [...(config?.rules ?? [])].sort((a, b) => a.minBundleSize - b.minBundleSize);\n }, [config?.rules]);\n\n const itemsRemaining = useMemo(() => Math.max(0, minRequired - bundleSize), [bundleSize, minRequired]);\n\n const appliedRule = useMemo(() => {\n let best = null as (typeof rulesSorted)[number] | null;\n for (const r of rulesSorted) {\n if (bundleSize >= r.minBundleSize) best = r;\n }\n return best;\n }, [bundleSize, rulesSorted]);\n\n const appliedDiscountPercent = useMemo(() => {\n if (!appliedRule) return null;\n const pct = Number.parseFloat(appliedRule.discountPercent);\n if (!Number.isFinite(pct) || pct <= 0) return null;\n return pct;\n }, [appliedRule]);\n const firstRule = rulesSorted[0];\n const hasUnlockedFirstDiscount = Boolean(firstRule && bundleSize >= firstRule.minBundleSize);\n\n const subtotal = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n let total = 0;\n for (const [variantId, qty] of Object.entries(selections)) {\n const q = qty ?? 0;\n if (q <= 0) continue;\n const v = byId.get(variantId);\n const price = Number(v?.price);\n if (!Number.isFinite(price)) continue;\n total += price * q;\n }\n return Math.round(total * 100) / 100;\n }, [eligibleVariants, selections]);\n\n const discountedTotal = useMemo(() => {\n if (!appliedDiscountPercent) return subtotal;\n const total = subtotal * (1 - appliedDiscountPercent / 100);\n return Math.round(total * 100) / 100;\n }, [appliedDiscountPercent, subtotal]);\n\n const maxRuleSize = useMemo(() => {\n if (!rulesSorted.length) return 0;\n return Math.max(...rulesSorted.map((r) => r.minBundleSize));\n }, [rulesSorted]);\n\n const filledVariants = useMemo(() => {\n const byId = new Map(eligibleVariants.map((v) => [v.id, v] as const));\n return selectionOrder\n .map((variantId) => byId.get(variantId))\n .filter((v): v is (typeof eligibleVariants)[number] => Boolean(v));\n }, [eligibleVariants, selectionOrder]);\n\n const thresholdByIndex = useMemo(() => {\n const map = new Map<number, { discountPercent: string; minBundleSize: number; label: string }>();\n for (const r of rulesSorted) {\n const idx = Math.max(0, r.minBundleSize - 1);\n map.set(idx, {\n discountPercent: r.discountPercent,\n minBundleSize: r.minBundleSize,\n label: r.label?.trim() || `Buy ${r.minBundleSize}+`,\n });\n }\n return map;\n }, [rulesSorted]);\n\n const maxBundleSize = useMemo(() => {\n const raw = Number(config?.maxBundleSize ?? NaN);\n const n = Number.isFinite(raw) ? Math.floor(raw) : 100;\n return Math.max(2, Math.min(100, n));\n }, [config?.maxBundleSize]);\n\n const title = config?.title?.trim() || \"Build your bundle\";\n\n const slotCount = useMemo(() => {\n return Math.max(maxRuleSize || minRequired, filledVariants.length);\n }, [filledVariants.length, maxRuleSize, minRequired]);\n\n const isAtMaxBundleSize = bundleSize >= maxBundleSize;\n\n const variantsRef = useRef<HTMLDivElement | null>(null);\n const boxSummaryWindowRef = useRef<HTMLDivElement | null>(null);\n const prevBundleSizeRef = useRef<number>(bundleSize);\n\n useEffect(() => {\n const prev = prevBundleSizeRef.current;\n prevBundleSizeRef.current = bundleSize;\n\n if (bundleSize <= prev) return;\n\n const container = boxSummaryWindowRef.current;\n if (!container) return;\n\n const hitThreshold = rulesSorted.some((r) => r.minBundleSize === bundleSize);\n const nextThreshold = rulesSorted.find((r) => r.minBundleSize > bundleSize);\n const targetIdx = nextThreshold && hitThreshold ? nextThreshold.minBundleSize - 1 : !nextThreshold ? bundleSize - 1 : null;\n if (targetIdx == null || targetIdx < 0) return;\n\n const raf = requestAnimationFrame(() => {\n const el = container.querySelector<HTMLElement>(`[data-box-slot=\"${targetIdx}\"]`);\n if (!el) return;\n\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n const deltaRight = elRect.right - containerRect.right;\n\n if (deltaRight <= 1) return;\n\n const maxLeft = Math.max(0, container.scrollWidth - container.clientWidth);\n const nextLeft = Math.min(maxLeft, Math.max(0, container.scrollLeft + deltaRight));\n container.scrollTo({ left: nextLeft, behavior: \"smooth\" });\n });\n\n return () => cancelAnimationFrame(raf);\n }, [bundleSize, rulesSorted]);\n const scrollVariantRowIntoView = (variantId: string) => {\n const container = variantsRef.current;\n if (!container) return;\n const row = container.querySelector<HTMLElement>(`[data-variant-row=\\\"${variantId}\\\"]`);\n if (!row) return;\n row.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n };\n\n return (\n <section className={[styles.panel, className].filter(Boolean).join(\" \")} aria-busy={loading}>\n <header className={styles.header}>\n <h2 className={styles.title}>{title}</h2>\n </header>\n\n {loading ? <div className={styles.status}>Loading…</div> : null}\n {error ? <div className={styles.error}>{error}</div> : null}\n {!loading && config && !config.isActive ? (\n <div className={styles.inactive}>Bundles are not active.</div>\n ) : null}\n\n {showRules && rulesSorted.length ? (\n <div className={styles.section}>\n <div className={styles.rulesVisual}>\n <div className={styles.rulesLabelsRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const ruleForLine = rulesSorted.find((r) => r.minBundleSize === lineIndex);\n const discountLabel = ruleForLine ? `${formatPercent0dp(ruleForLine.discountPercent)}% off` : null;\n\n return (\n <div key={lineIndex} className={styles.rulesLineLabelCell}>\n {discountLabel ? <span className={styles.rulesLineLabel}>{discountLabel}</span> : null}\n </div>\n );\n })}\n </div>\n <div className={styles.rulesLinesRow}>\n {Array.from({ length: maxRuleSize }).map((_, idx) => {\n const lineIndex = idx + 1;\n const isFilled = bundleSize >= lineIndex;\n\n return (\n <div\n key={lineIndex}\n className={[\n styles.rulesLine,\n isFilled ? styles.rulesLineFilled : styles.rulesLineEmpty,\n ]\n .filter(Boolean)\n .join(\" \")}\n />\n );\n })}\n </div>\n </div>\n </div>\n ) : null}\n\n {showVariants ? (\n <div className={styles.section} ref={variantsRef}>\n <div className={styles.sectionTitle}>Select items</div>\n <div className={styles.variants}>\n <ul className={styles.variantList}>\n {sortedVariants.map((variant) => {\n const qty = selections[variant.id] ?? 0;\n const options = formatVariantOptions(variant.selectedOptions);\n const isUnavailable = variant.availableForSale === false;\n const isClickable = !isUnavailable && !isAtMaxBundleSize;\n\n return (\n <li\n key={variant.id}\n className={[\n styles.variantRow,\n isClickable ? styles.variantRowInteractive : null,\n qty > 0 ? styles.variantRowSelected : null,\n isUnavailable ? styles.variantRowSoldOut : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-variant-row={variant.id}\n role={isClickable ? \"button\" : undefined}\n tabIndex={isClickable ? 0 : undefined}\n onClick={\n isClickable\n ? () => {\n setQuantity(variant.id, qty + 1);\n }\n : undefined\n }\n onKeyDown={\n isClickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setQuantity(variant.id, qty + 1);\n scrollVariantRowIntoView(variant.id);\n }\n }\n : undefined\n }\n aria-label={\n isUnavailable\n ? `${variant.displayName} is sold out`\n : `Add ${variant.displayName} to bundle`\n }\n >\n <div className={styles.variantMedia}>\n {variant.image?.url ? (\n <img\n src={variant.image.url}\n alt={variant.image.altText ?? variant.displayName}\n width={variant.image.width ?? 64}\n height={variant.image.height ?? 64}\n className={styles.variantImage}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.variantImageFallback}>Item</div>\n )}\n </div>\n <div className={styles.variantContent}>\n <div className={styles.variantHeader}>\n <div className={styles.variantTitle}>{variant.displayName}</div>\n {options ? <div className={styles.variantMeta}>{options}</div> : null}\n </div>\n <div className={styles.variantFooterRow}>\n <div className={styles.variantPrice}>{formatMoney(variant.price)}</div>\n <div className={styles.variantActions}>\n {isUnavailable ? (\n <div className={styles.soldOut} aria-label={`${variant.displayName} is sold out`}>\n Sold Out\n </div>\n ) : (\n <div className={styles.qtyActions}>\n {qty > 0 ? (\n <button\n type=\"button\"\n className={styles.qtyTrash}\n aria-label={`Remove ${variant.displayName} from bundle`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, 0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Trash2 size={14} />\n </button>\n ) : null}\n <div\n className={[styles.qtyChip, qty > 0 ? styles.qtyChipInteractive : null].filter(Boolean).join(\" \")}\n aria-label={`${variant.displayName} quantity ${qty}`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n role=\"button\"\n tabIndex={0}\n >\n {qty <= 0 ? (\n <span className={styles.qtyChipPlus} aria-hidden=\"true\">\n <Plus size={18} strokeWidth={1.8} />\n </span>\n ) : (\n <>\n <span className={styles.qtyChipValue}>{qty}</span>\n <button\n type=\"button\"\n className={styles.qtyChipClear}\n aria-label={`Add ${variant.displayName}`}\n onClick={(e) => {\n e.stopPropagation();\n setQuantity(variant.id, qty + 1);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Plus size={12} strokeWidth={2} />\n </button>\n </>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n ) : null}\n\n <footer className={styles.footer}>\n <div className={styles.boxSummaryWindow} ref={boxSummaryWindowRef}>\n <div className={styles.boxSummaryRow} aria-label=\"Bundle box summary\">\n {Array.from({ length: slotCount }).map((_, idx) => {\n const variant = filledVariants[idx];\n const threshold = thresholdByIndex.get(idx);\n const isFilled = Boolean(variant);\n const isThreshold = Boolean(threshold);\n const showThreshold = isThreshold && !isFilled;\n const discountText = threshold ? `${threshold.discountPercent}% off` : null;\n const titleText = isFilled ? variant!.displayName : `Slot ${idx + 1}`;\n\n return (\n <div key={idx} data-box-slot={idx} className={styles.boxSlot}>\n <div\n className={[\n styles.boxItem,\n isFilled ? styles.boxItemFilled : styles.boxItemPlaceholder,\n isThreshold ? styles.boxItemThreshold : null,\n isFilled ? styles.boxItemClickable : null,\n ]\n .filter(Boolean)\n .join(\" \")}\n role={isFilled ? \"button\" : undefined}\n tabIndex={isFilled ? 0 : undefined}\n onClick={isFilled ? () => scrollVariantRowIntoView(variant!.id) : undefined}\n onKeyDown={\n isFilled\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n scrollVariantRowIntoView(variant!.id);\n }\n }\n : undefined\n }\n aria-label={showThreshold && discountText ? `${titleText}. Unlocks ${discountText}.` : titleText}\n title={showThreshold && discountText ? `${titleText} • Unlocks ${discountText}` : titleText}\n >\n {isFilled ? (\n variant!.image?.url ? (\n <img\n className={styles.boxItemImage}\n src={variant!.image!.url}\n alt={variant!.image!.altText ?? variant!.displayName}\n width={1}\n height={1}\n loading=\"lazy\"\n />\n ) : (\n <div className={styles.boxItemFallback} aria-hidden=\"true\">\n {variant!.product?.title?.slice(0, 1)?.toUpperCase() ?? \"•\"}\n </div>\n )\n ) : showThreshold && discountText ? (\n <div className={styles.boxItemDiscountText}>{discountText}</div>\n ) : (\n <div className={styles.boxItemPlus} aria-hidden=\"true\">\n +\n </div>\n )}\n </div>\n\n {isThreshold ? <div className={styles.boxThresholdLabel}>{threshold!.label}</div> : null}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={[styles.totalsReveal, hasUnlockedFirstDiscount ? styles.totalsRevealOpen : null].filter(Boolean).join(\" \")}>\n <div\n className={[styles.ctaTotalsWrap, hasUnlockedFirstDiscount ? styles.ctaTotalsWrapVisible : null].filter(Boolean).join(\" \")}\n aria-hidden={!hasUnlockedFirstDiscount}\n >\n <div className={styles.ctaTotals} aria-label=\"Totals\">\n {appliedDiscountPercent ? (\n <span className={styles.ctaDiscountBadge}>{appliedDiscountPercent}% Discount</span>\n ) : (\n <span />\n )}\n\n <span>\n {appliedDiscountPercent ? (\n <>\n <span className={styles.ctaTotalsStrike}>{formatMoney(subtotal.toFixed(2))}</span>{\" \"}\n <span className={styles.ctaTotalsPrice}>{formatMoney(discountedTotal.toFixed(2))}</span>\n </>\n ) : (\n <span className={styles.ctaTotalsPrice}>{formatMoney(subtotal.toFixed(2))}</span>\n )}\n </span>\n </div>\n </div>\n </div>\n\n {(() => {\n const buttonMode = config?.ctaButtonMode || \"add_to_cart\";\n if (buttonMode === \"add_to_cart_checkout\") {\n if (itemsRemaining > 0) {\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting ? \"Adding…\" : `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`}\n </button>\n );\n }\n\n return (\n <div className={styles.ctaButtonGroup}>\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.ctaDualLeft}>\n <span>{submitting ? \"Adding…\" : \"Add to Basket\"}</span>\n </button>\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.ctaDualRight}>\n <span>{submitting ? \"Processing…\" : \"Checkout\"}</span>\n </button>\n </div>\n );\n }\n\n if (buttonMode === \"checkout\") {\n return (\n <button type=\"button\" onClick={submitAndCheckout} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? \"Processing…\"\n : itemsRemaining > 0\n ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`\n : \"Checkout\"}\n </button>\n );\n }\n\n return (\n <button type=\"button\" onClick={submit} disabled={!canSubmit} className={styles.cta}>\n {submitting\n ? \"Adding…\"\n : itemsRemaining > 0\n ? `Add ${itemsRemaining} more product${itemsRemaining === 1 ? \"\" : \"s\"}`\n : \"Add to Basket\"}\n </button>\n );\n })()}\n\n <div className={styles.poweredBy}>\n powered by{\" \"}\n <a href=\"https://apps.shopify.com/best-bundles\" target=\"_blank\" rel=\"noopener noreferrer\">\n BestBundles\n </a>\n </div>\n </footer>\n </section>\n );\n}\n","import type { BundleCartAdapter, BundleCartLineAttribute } from \"../types\";\n\nfunction toProperties(attributes?: BundleCartLineAttribute[]) {\n if (!attributes?.length) return undefined;\n return attributes.reduce<Record<string, string>>((acc, attr) => {\n if (attr?.key) acc[attr.key] = attr.value ?? \"\";\n return acc;\n }, {});\n}\n\nfunction normalizeVariantId(merchandiseId: string) {\n const match = /\\/(\\d+)$/.exec(merchandiseId);\n return match ? match[1] : merchandiseId;\n}\n\nfunction getShopifyTheme() {\n if (typeof window === \"undefined\") return null;\n return (window as Window & {\n Shopify?: { theme?: { schema_name?: string | null; name?: string | null } };\n }).Shopify?.theme ?? null;\n}\n\nfunction isSleekTheme() {\n const theme = getShopifyTheme();\n if (!theme) return false;\n\n if (theme.schema_name === \"Sleek\") return true;\n return /sleek/i.test(theme.name ?? \"\");\n}\n\nfunction hasSleekCartDrawer() {\n if (typeof document === \"undefined\") return false;\n return !!document.querySelector(\"cart-drawer\");\n}\n\nfunction tryOpenSleekCartDrawer() {\n if (!isSleekTheme() || !hasSleekCartDrawer()) return false;\n\n document.dispatchEvent(new CustomEvent(\"cart:refresh\", {\n bubbles: true,\n detail: { open: true },\n }));\n\n return true;\n}\n\n/**\n * Refreshes the page so the theme re-renders with the updated cart.\n * Liquid themes fetch cart state on load, so a full reload guarantees the cart UI\n * (drawer, icon bubble, etc.) shows the correct state after adding bundle items.\n */\nfunction reloadPageForCartUpdate() {\n window.location.reload();\n}\n\nasync function postCartJson(endpoint: string, payload: Record<string, unknown>) {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(text || `Cart request failed: ${res.status}`);\n }\n return res.json().catch(() => null);\n}\n\nexport function createLiquidCartAdapter(): BundleCartAdapter {\n return {\n async linesAdd(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesAddForCheckout(lines) {\n const items = lines.map((line) => ({\n id: normalizeVariantId(line.merchandiseId),\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n }));\n await postCartJson(\"/cart/add.js\", { items });\n },\n async linesUpdate(lines) {\n for (const line of lines) {\n await postCartJson(\"/cart/change.js\", {\n id: line.id,\n quantity: line.quantity,\n properties: toProperties(line.attributes),\n });\n }\n },\n async linesRemove(lineIds) {\n for (const id of lineIds) {\n await postCartJson(\"/cart/change.js\", { id, quantity: 0 });\n }\n },\n openCartUI() {\n if (tryOpenSleekCartDrawer()) return;\n\n // Reload the page so the theme fetches and displays the updated cart.\n window.setTimeout(() => reloadPageForCartUpdate(), 0);\n },\n navigateToCheckout() {\n // Navigate to Shopify checkout page\n window.location.href = \"/checkout\";\n },\n };\n}\n"],"names":["BundleLineAttributeKeys","fetchBundleConfig","params","url","json","ANONYMOUS_USER_ID_KEY","getOrCreateAnonymousUserId","existing","newId","cryptoAny","trackEvent","analyticsEndpoint","shop","event","response","error","BundleBuilderContext","createContext","BUNDLE_DRAWER_HASH","getBundleHashHandle","hash","value","prefix","raw","STYLE_SETTINGS_TO_CSS_VAR","GOOGLE_FONTS_LINK_ID","fontNameToParam","name","s","injectGoogleFontsLink","styles","_a","body","title","families","href","link","injectStyleVariables","root","key","cssVar","getEffectiveStyleSettings","configSettings","preview","safeRandomUUID","clampQty","n","BundleProvider","props","apiBaseUrl","cartAdapter","configHandle","initialData","configFetcher","providedAnalyticsEndpoint","allowDrawerWhenInactive","children","isOpen","setIsOpen","useState","loading","setLoading","submitting","setSubmitting","setError","currencyCode","setCurrencyCode","config","setConfig","eligibleVariants","setEligibleVariants","selectionsState","setSelectionsState","abortRef","useRef","useEffect","ac","fetcher","defaultFetchBundleConfig","win","previewConfig","previewVariants","idSet","v","e","msg","effective","handlePreviewStyles","applyPreviewConfig","variantsLoading","current","open","useCallback","anonymousUserId","close","openIfHash","handleInHash","toggle","maxBundleSize","useMemo","eligibleVariantIdsSet","minRequired","rules","ruleMin","r","normalizedRuleMin","configuredRaw","configuredMin","setQuantity","merchandiseId","quantity","q","prev","prevQty","requestedDelta","currentBundleSize","sum","delta","nextQty","nextSelections","_","rest","nextOrder","remainingToRemove","keptReversed","i","id","prevBundleSize","nextBundleSize","basePayload","nextSelectionsEntries","clearSelections","selections","selectionOrder","bundleSize","canSubmit","performCartAddition","options","bundleId","bundleTitle","lines","l","byId","grossPrice","variantId","qty","price","rulesSorted","a","b","appliedRule","appliedDiscountPercent","pct","discountedPrice","discountedAmount","productVariantIds","discountThresholdIdentifier","discountLabel","isCheckout","_b","submit","submitAndCheckout","jsx","useBundleBuilder","ctx","useContext","useBundleBuilderDrawer","BundleButton","tweenFunctions","t","_c","d","c","p","tweenFunctions_1","degreesToRads","degrees","randomRange","min","max","randomInt","ParticleShape","RotationDirection","DEFAULT_FRAME_TIME","Particle","context","getOptions","x","y","colors","initialVelocityX","initialVelocityY","elapsed","gravity","wind","friction","opacity","drawShape","frameTimeMultiplier","rotateDelta","ParticleGenerator","canvas","newParticleX","newParticleY","particlesGenerated","lastNumberOfPieces","run","recycle","numberOfPieces","debug","tweenFunction","tweenDuration","nP","activeCount","tweenedVal","numToAdd","confettiDefaults","tweens.easeInOutQuad","Confetti","opts","computedConfettiDefaults","timestamp","onConfettiComplete","frameRate","lastRunState","lastRecycleState","ref","React","ReactConfettiInternal","extractCanvasProps","confettiOptions","passedProps","canvasStyles","refs","confettiOptionKeys","refProps","prop","val","ReactConfetti","toKebabCase","string","toCamelCase","match","p1","p2","toPascalCase","camelCase","mergeClasses","classes","className","index","array","hasA11yProp","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","iconNode","createElement","tag","attrs","createLucideIcon","iconName","Component","__iconNode","Plus","Search","Trash2","BundleBuilderDrawer","isSearchOpen","setIsSearchOpen","searchQuery","setSearchQuery","searchInputRef","footerRef","celebrationChipRef","windowSize","setWindowSize","confettiKey","setConfettiKey","confettiSource","setConfettiSource","isConfettiActive","setIsConfettiActive","confettiTimerRef","prevBundleSizeForConfettiRef","confettiSettleMs","celebrationKey","setCelebrationKey","celebrationText","setCelebrationText","isCelebrationActive","setIsCelebrationActive","celebrationTimerRef","celebrationDurationMs","DEFAULT_CONFETTI_COLORS","confettiColors","formatPercent0dp","formatVariantOptions","selectedOptions","o","getVariantPrimaryName","getVariantA11yLabel","isMounted","setIsMounted","closeTimerRef","formatMoney","amount","isAtMaxBundleSize","sorted","filteredVariants","tokens","matches","parts","haystack","itemsRemaining","best","firstRule","hasUnlockedFirstDiscount","subtotal","total","discountedTotal","maxRuleSize","filledVariants","thresholdByIndex","map","idx","slotCount","isDualButtonAnimationLoaded","setIsDualButtonAnimationLoaded","prevItemsRemainingRef","wasPositive","panelRef","bodyRef","boxSummaryWindowRef","prevBundleSizeRef","scrollVariantRowIntoView","container","row","padding","maxTop","rowCenterOffset","targetTop","nextTop","onKeyDown","onResize","raf","hitThreshold","nextThreshold","targetIdx","el","containerRect","deltaRight","maxLeft","nextLeft","hitRule","k","chipEl","rect","panelRect","originX","originY","source","jsxs","variantPrimaryName","variantOptionText","variantA11y","discountPercentToUse","originalPriceNumber","hasDiscount","discountedPriceNumber","_d","variant","threshold","isFilled","isThreshold","showThreshold","discountText","titleText","Fragment","buttonMode","BundleBuilderPanel","showRules","showVariants","sortedVariants","variantsRef","lineIndex","ruleForLine","isUnavailable","isClickable","toProperties","attributes","acc","attr","normalizeVariantId","getShopifyTheme","isSleekTheme","theme","hasSleekCartDrawer","tryOpenSleekCartDrawer","reloadPageForCartUpdate","postCartJson","endpoint","payload","res","text","createLiquidCartAdapter","items","line","lineIds"],"mappings":";;AAAO,MAAMA,KAA0B;AAAA,EACrC,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AACf;ACHA,eAAsBC,GAAkBC,GAKA;AACtC,QAAMC,IAAM,IAAI,IAAI,6BAA6BD,EAAO,UAAU;AAClE,EAAAC,EAAI,aAAa,IAAI,QAAQD,EAAO,IAAI,GACpCA,EAAO,gBACTC,EAAI,aAAa,IAAI,UAAUD,EAAO,YAAY;AAUpD,QAAME,IAAQ,OAPD,MAAM,MAAMD,GAAK;AAAA,IAC5B,QAAQ;AAAA,IACR,QAAQD,EAAO;AAAA,IACf,SAAS,EAAE,gBAAgB,mBAAA;AAAA,EAAmB,CAC/C,GAGwB,OAAO,MAAM,MAAM,IAAI;AAChD,SAAI,CAACE,KAAQ,OAAOA,KAAS,WACpB,EAAE,IAAI,IAAO,OAAO,oBAAA,IAGtBA;AACT;AC3BA,MAAMC,KAAwB;AAMvB,SAASC,KAAqC;AACnD,MAAI,OAAO,SAAW,OAAe,OAAO,eAAiB;AAE3D,WAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAGjF,MAAI;AACF,UAAMC,IAAW,aAAa,QAAQF,EAAqB;AAC3D,QAAIE,KAAY,OAAOA,KAAa,YAAYA,EAAS,SAAS;AAChE,aAAOA;AAIT,QAAIC;AACJ,QAAI;AAEF,YAAMC,IAAa,WAAmB;AACtC,UAAIA,KAAA,QAAAA,EAAW;AACb,QAAAD,IAAQC,EAAU,WAAA;AAAA;AAElB,cAAM,IAAI,MAAM,iCAAiC;AAAA,IAErD,QAAQ;AAEN,MAAAD,IAAQ,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAClF;AAEA,wBAAa,QAAQH,IAAuBG,CAAK,GAC1CA;AAAA,EACT,QAAQ;AAEN,WAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EACjF;AACF;AAuEA,eAAsBE,GACpBC,GACAC,GACAC,GACe;AACf,MAAI,SAAO,SAAW;AAItB,QAAI;AACF,YAAMV,IAAM,IAAI,IAAIQ,GAAmB,OAAO,SAAS,MAAM;AAC7D,MAAAR,EAAI,aAAa,IAAI,QAAQS,CAAI;AAEjC,YAAME,IAAW,MAAM,MAAMX,GAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,QAAA;AAAA,QAElB,MAAM,KAAK,UAAUU,CAAK;AAAA;AAAA,QAE1B,WAAW;AAAA,MAAA,CACZ;AAED,MAAKC,EAAS,MACZ,QAAQ;AAAA,QACN,wDAAwDA,EAAS,MAAM;AAAA,QACvE,MAAMA,EAAS,OAAO,MAAM,MAAM,yBAAyB;AAAA,MAAA;AAAA,IAGjE,SAASC,GAAO;AAEd,cAAQ,KAAK,6CAA6CA,CAAK;AAAA,IACjE;AACF;AC9DO,MAAMC,KAAuBC,GAAgD,IAAI,GAGlFC,KAAqB;AAE3B,SAASC,GAAoBC,GAA6B;AACxD,QAAMC,IAAQ,OAAOD,KAAQ,EAAE,EAAE,KAAA,EAAO,YAAA;AACxC,MAAI,CAACC,EAAM,WAAWH,EAAkB,EAAG,QAAO;AAClD,MAAIG,MAAUH,GAAoB,QAAO;AACzC,QAAMI,IAAS,GAAGJ,EAAkB;AACpC,MAAI,CAACG,EAAM,WAAWC,CAAM,EAAG,QAAO;AACtC,QAAMC,IAAMF,EAAM,MAAMC,EAAO,MAAM,EAAE,KAAA;AACvC,SAAKC,KACWA,EACb,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE,EACjB,QAAQ,UAAU,GAAG,KACN;AACpB;AAGA,MAAMC,KAAmE;AAAA,EACvE,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,iBAAiB;AACnB,GAEMC,KAAuB;AAE7B,SAASC,GAAgBC,GAAsB;AAC7C,QAAMC,KAAKD,KAAQ,IAAI,OAAO,QAAQ,gBAAgB,EAAE;AACxD,SAAOC,IAAI,mBAAmBA,CAAC,EAAE,QAAQ,QAAQ,GAAG,IAAI;AAC1D;AAEA,SAASC,GAAsBC,GAAmC;;AAChE,MAAI,OAAO,WAAa,OAAe,CAAC,SAAS,KAAM;AACvD,MAAI,CAACA,GAAQ;AACX,KAAAC,IAAA,SAAS,eAAeN,EAAoB,MAA5C,QAAAM,EAA+C;AAC/C;AAAA,EACF;AACA,QAAMC,KAAQF,EAAO,kBAAkB,IAAI,OAAO,QAAQ,gBAAgB,EAAE,GACtEG,KAASH,EAAO,mBAAmB,IAAI,OAAO,QAAQ,gBAAgB,EAAE,GACxEI,IAAqB,CAAA;AAC3B,EAAIF,KAAME,EAAS,KAAK,YAAYR,GAAgBM,CAAI,CAAC,GACrDC,KAASA,MAAUD,KAAME,EAAS,KAAK,YAAYR,GAAgBO,CAAK,CAAC;AAC7E,QAAM1B,IAAW,SAAS,eAAekB,EAAoB;AAC7D,MAAIS,EAAS,WAAW,GAAG;AACzB,IAAA3B,KAAA,QAAAA,EAAU;AACV;AAAA,EACF;AACA,QAAM4B,IAAO,qCAAqCD,EAAS,KAAK,GAAG,CAAC;AACpE,MAAI3B,GAAU;AACZ,IAAIA,EAAS,aAAa,MAAM,MAAM4B,KAAM5B,EAAS,aAAa,QAAQ4B,CAAI;AAC9E;AAAA,EACF;AACA,QAAMC,IAAO,SAAS,cAAc,MAAM;AAC1C,EAAAA,EAAK,KAAKX,IACVW,EAAK,MAAM,cACXA,EAAK,OAAOD,GACZ,SAAS,KAAK,YAAYC,CAAI;AAChC;AAEA,SAASC,GAAqBP,GAAmC;AAC/D,MAAI,CAACA,EAAQ;AACb,EAAAD,GAAsBC,CAAM;AAC5B,QAAMQ,IAAO,SAAS;AACrB,SAAO,QAAQd,EAAyB,EAA6C,QAAQ,CAAC,CAACe,GAAKC,CAAM,MAAM;AAC/G,QAAInB,IAAQS,EAAOS,CAAG;AACtB,IAAIlB,OACGkB,MAAQ,oBAAoBA,MAAQ,sBAAsB,eAAe,KAAKlB,CAAK,KAAK,CAAC,QAAQ,KAAKA,EAAM,KAAA,CAAM,MACrHA,IAAQ,IAAIA,EAAM,KAAA,EAAO,QAAQ,gBAAgB,EAAE,CAAC,MAEtDiB,EAAK,MAAM,YAAYE,GAAQnB,CAAK;AAAA,EAExC,CAAC;AACH;AAEA,SAASoB,GAA0BC,GAAsE;AACvG,MAAI,OAAO,SAAW,IAAa,QAAOA;AAC1C,QAAMC,IAAW,OAAkE;AACnF,SAAIA,KAAW,OAAOA,KAAY,WAAiBA,IAC5CD;AACT;AAEA,SAASE,KAAiB;AACxB,MAAI;AAEF,UAAMnC,IAAa,WAAmB;AACtC,QAAIA,KAAA,QAAAA,EAAW,WAAY,QAAOA,EAAU,WAAA;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,SAAO,MAAM,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AACjF;AAEA,SAASoC,GAASC,GAAW;AAC3B,SAAK,OAAO,SAASA,CAAC,IACf,KAAK,IAAI,GAAG,KAAK,MAAMA,CAAC,CAAC,IADA;AAElC;AAEO,SAASC,GAAeC,GAA4B;AACzD,QAAM;AAAA,IACJ,YAAAC;AAAA,IACA,MAAArC;AAAA,IACA,aAAAsC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,mBAAmBC;AAAA,IACnB,yBAAAC,IAA0B;AAAA,IAC1B,UAAAC;AAAA,EAAA,IACER,GAEErC,IAAoB2C,KAA6B,GAAGL,CAAU,gCAE9D,CAACQ,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAASC,CAAU,IAAIF,EAAS,CAACP,CAAW,GAC7C,CAACU,IAAYC,EAAa,IAAIJ,EAAS,EAAK,GAC5C,CAAC5C,GAAOiD,CAAQ,IAAIL,EAAwB,IAAI,GAEhD,CAACM,IAAcC,EAAe,IAAIP,GAAwBP,KAAA,gBAAAA,EAAa,iBAAgB,IAAI,GAC3F,CAACe,GAAQC,CAAS,IAAIT,GAA8BP,KAAA,gBAAAA,EAAa,WAAU,IAAI,GAC/E,CAACiB,GAAkBC,CAAmB,IAAIX;AAAA,KAC9CP,KAAA,gBAAAA,EAAa,qBAAoB,CAAA;AAAA,EAAC,GAG9B,CAACmB,IAAiBC,EAAkB,IAAIb;AAAA,IAC5C,OAAO,EAAE,YAAY,IAAI,OAAO,CAAA,EAAC;AAAA,EAAE,GAG/Bc,KAAWC,EAA+B,IAAI;AAEpD,EAAAC,EAAU,MAAM;;AACd,QAAIvB,EAAa;AAEjB,KAAArB,IAAA0C,GAAS,YAAT,QAAA1C,EAAkB;AAClB,UAAM6C,IAAK,IAAI,gBAAA;AACf,IAAAH,GAAS,UAAUG;AAEnB,UAAMC,IAAUxB,KAAiByB;AAEjC,WAAAjB,EAAW,EAAI,GACfG,EAAS,IAAI,GACba,EAAQ,EAAE,YAAA5B,GAAY,MAAArC,GAAM,cAAAuC,GAAc,QAAQyB,EAAG,OAAA,CAAQ,EAC1D,KAAK,CAACxE,MAAS;AACd,UAAI,CAACA,EAAK,IAAI;AACZ,QAAA4D,EAAS5D,EAAK,SAAS,+BAA+B,GACtDgE,EAAU,IAAI,GACdE,EAAoB,CAAA,CAAE,GACtBJ,GAAgB,IAAI;AACpB;AAAA,MACF;AACA,MAAAA,GAAgB9D,EAAK,gBAAgB,IAAI;AACzC,YAAM2E,IAAM,OAAO,SAAW,MACzB,SAKD,MACEC,IAAgBD,KAAA,gBAAAA,EAAK;AAC3B,UAAIC,GAAe;AACjB,QAAAZ,EAAUY,CAAa;AACvB,cAAMC,IAAkBF,EAAI;AAC5B,YAAIE,MAAoB;AACtB,UAAAX,EAAoBW,CAAe;AAAA,aAC9B;AACL,gBAAMC,IAAQ,IAAI,IAAIF,EAAc,sBAAsB,CAAA,CAAE;AAC5D,UAAAV;AAAA,YACEY,EAAM,SAAS,IAAK9E,EAAK,oBAAoB,CAAA,KAAOA,EAAK,oBAAoB,CAAA,GAAI,OAAO,CAAC+E,MAAMD,EAAM,IAAIC,EAAE,EAAE,CAAC;AAAA,UAAA;AAAA,QAElH;AACA,QAAAtB,EAAWkB,EAAI,wCAAwC,EAAI;AAAA,MAC7D;AACE,QAAAX,EAAUhE,EAAK,MAAM,GACrBkE,EAAoBlE,EAAK,oBAAoB,EAAE,GAC/CyD,EAAW,EAAK;AAAA,IAEpB,CAAC,EACA,MAAM,CAACuB,MAAe;AACrB,YAAMC,IAAMD,aAAa,QAAQA,EAAE,UAAU;AAC7C,MAAApB,EAASqB,CAAG,GACZjB,EAAU,IAAI,GACdE,EAAoB,CAAA,CAAE,GACtBJ,GAAgB,IAAI;AAAA,IACtB,CAAC,EACA,QAAQ,MAAM;AACb,YAAMa,IAAM,OAAO,SAAW,MAAe,SAAmE;AAChH,MAAKA,KAAA,QAAAA,EAAK,6BAA2BlB,EAAW,EAAK;AAAA,IACvD,CAAC,GAEI,MAAMe,EAAG,MAAA;AAAA,EAClB,GAAG,CAAC3B,GAAYrC,GAAMuC,GAAcC,GAAaC,CAAa,CAAC,GAE/DsB,EAAU,MAAM;AACd,UAAMW,IAAY7C,GAA0B0B,KAAA,gBAAAA,EAAQ,aAAa;AACjE,IAAImB,QAAgCA,CAAS;AAAA,EAC/C,GAAG,CAACnB,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAE1BQ,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMY,IAAsB,MAAM;AAChC,YAAMD,IAAY7C,GAA0B,MAAS;AACrD,MAAI6C,QAAgCA,CAAS;AAAA,IAC/C;AACA,kBAAO,iBAAiB,iCAAiCC,CAAmB,GACrE,MAAM,OAAO,oBAAoB,iCAAiCA,CAAmB;AAAA,EAC9F,GAAG,CAAA,CAAE,GAELZ,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMI,IAAM,QAKNS,IAAqB,MAAM;AAC/B,YAAMR,IAAgBD,EAAI;AAC1B,UAAI,CAACC,EAAe;AACpB,YAAMS,IAAkBV,EAAI,wCAAwC;AACpE,MAAAlB,EAAW4B,CAAe,GAC1BrB,EAAUY,CAAa;AACvB,YAAMC,IAAkBF,EAAI;AAC5B,MAAIE,IACFX,EAAoBW,CAAe,IACzBQ,KACVnB,EAAoB,CAACoB,MAAY;AAC/B,cAAMR,IAAQ,IAAI,IAAIF,EAAc,sBAAsB,CAAA,CAAE;AAC5D,eAAIE,EAAM,SAAS,KAAKQ,EAAQ,WAAW,IAAUA,IAC9CA,EAAQ,OAAO,CAACP,MAAMD,EAAM,IAAIC,EAAE,EAAE,CAAC;AAAA,MAC9C,CAAC;AAAA,IAEL;AACA,WAAIJ,EAAI,6BAA2BS,EAAA,GACnC,OAAO,iBAAiB,iCAAiCA,CAAkB,GACpE,MAAM,OAAO,oBAAoB,iCAAiCA,CAAkB;AAAA,EAC7F,GAAG,CAAA,CAAE;AAEL,QAAMG,KAAOC,GAAY,MAAM;AAC7B,QAAI,GAACrC,KAA2BY,KAAU,QAAQ,CAACA,EAAO,cAC1DT,EAAU,EAAI,GAEV/C;AACF,UAAI;AACF,cAAMkF,IAAkBvF,GAAA;AACxB,QAAAI,GAAWC,GAAmBC,GAAM;AAAA,UAClC,WAAW;AAAA,UACX,MAAAA;AAAA,UACA,iBAAAiF;AAAA,UACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UACtB,eAAe;AAAA,QAAA,CAChB,EAAE,MAAM,CAAC9E,MAAU;AAElB,kBAAQ,KAAK,qDAAqDA,CAAK;AAAA,QACzE,CAAC;AAAA,MACH,SAASA,GAAO;AAEd,gBAAQ,KAAK,gDAAgDA,CAAK;AAAA,MACpE;AAAA,EAEJ,GAAG,CAACJ,GAAmBC,GAAMuD,GAAQZ,CAAuB,CAAC,GACvDuC,KAAQF,GAAY,MAAM;AAC9B,QAAIjF;AACF,UAAI;AACF,cAAMkF,IAAkBvF,GAAA;AACxB,QAAAI,GAAWC,GAAmBC,GAAM;AAAA,UAClC,WAAW;AAAA,UACX,MAAAA;AAAA,UACA,iBAAAiF;AAAA,UACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UACtB,eAAe;AAAA,QAAA,CAChB,EAAE,MAAM,CAAC9E,MAAU;AAClB,kBAAQ,KAAK,qDAAqDA,CAAK;AAAA,QACzE,CAAC;AAAA,MACH,SAASA,GAAO;AACd,gBAAQ,KAAK,iDAAiDA,CAAK;AAAA,MACrE;AAEF,IAAA2C,EAAU,EAAK,GACX,OAAO,SAAW,OAAe,OAAO,SAAS,KAAK,YAAA,EAAc,WAAWxC,EAAkB,KACnG,OAAO,QAAQ,aAAa,MAAM,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,MAAM;AAAA,EAE3F,GAAG,CAACP,GAAmBC,CAAI,CAAC;AAE5B,EAAA+D,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMoB,IAAa,MAAM;AACvB,YAAMC,IAAe7E,GAAoB,OAAO,SAAS,IAAI;AAC7D,MAAK6E,MACDA,MAAiB,aAAaA,MAAiB7C,MAAcwC,GAAA;AAAA,IACnE;AACA,WAAAI,EAAA,GACA,OAAO,iBAAiB,cAAcA,CAAU,GACzC,MAAM,OAAO,oBAAoB,cAAcA,CAAU;AAAA,EAClE,GAAG,CAACJ,IAAMxC,CAAY,CAAC;AAEvB,QAAM8C,KAASL,GAAY,MAAM;AAC/B,IAAI,CAACrC,KAA2B,CAACE,KAAUU,KAAU,QAAQ,CAACA,EAAO,YAErET,EAAU,CAACgC,MAAY;AACrB,UAAKA;AAoBH,QAAAI,GAAA;AAAA,eAlBInF;AACF,YAAI;AACF,gBAAMkF,IAAkBvF,GAAA;AACxB,UAAAI,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAAiF;AAAA,YACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,YACtB,eAAe;AAAA,UAAA,CAChB,EAAE,MAAM,CAAC9E,MAAU;AAClB,oBAAQ,KAAK,qDAAqDA,CAAK;AAAA,UACzE,CAAC;AAAA,QACH,SAASA,GAAO;AACd,kBAAQ,KAAK,kDAAkDA,CAAK;AAAA,QACtE;AAMJ,aAAO,CAAC2E;AAAA,IACV,CAAC;AAAA,EACH,GAAG,CAAC/E,GAAmBC,GAAMkF,IAAO3B,GAAQV,GAAQF,CAAuB,CAAC;AAE5E,EAAAoB,EAAU,MAAM;AACd,IAAI,CAACpB,MAA2BY,KAAA,gBAAAA,EAAQ,cAAa,MAASV,KAAQqC,GAAA;AAAA,EACxE,GAAG,CAACvC,GAAyBY,KAAA,gBAAAA,EAAQ,UAAUV,GAAQqC,EAAK,CAAC;AAE7D,QAAMI,KAAgBC,EAAQ,MAAM;AAClC,UAAM5E,IAAM,QAAO4C,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzCrB,IAAI,OAAO,SAASvB,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKuB,CAAC,CAAC;AAAA,EACrC,GAAG,CAACqB,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAEpBiC,IAAwBD,EAAQ,MAC7B,IAAI;AAAA,IACT9B,EAAiB,OAAO,CAACc,MAAMA,EAAE,qBAAqB,EAAK,EAAE,IAAI,CAACA,MAAMA,EAAE,EAAE;AAAA,EAAA,GAE7E,CAACd,CAAgB,CAAC,GAEfgC,KAAcF,EAAQ,MAAM;AAChC,UAAMG,KAAQnC,KAAA,gBAAAA,EAAQ,UAAS,CAAA,GACzBoC,IAAUD,EAAM,SAAS,KAAK,IAAI,GAAGA,EAAM,IAAI,CAACE,MAAMA,EAAE,aAAa,CAAC,IAAI,GAC1EC,IAAoB,OAAO,SAASF,CAAO,KAAKA,IAAU,IAAIA,IAAU,GACxEG,IAAgB,QAAOvC,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACnDwC,IACJ,OAAO,SAASD,CAAa,KAAK,OAAO,UAAUA,CAAa,IAC5D,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKA,CAAa,CAAC,IACxC;AACN,WAAOC,KAAiB,OACpBF,IACA,KAAK,IAAIA,GAAmBE,CAAa;AAAA,EAC/C,GAAG,CAACxC,KAAA,gBAAAA,EAAQ,eAAeA,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEnCyC,KAAchB,GAAY,CAACiB,GAAuBC,MAAqB;AAE3E,QAAI,CAACV,EAAsB,IAAIS,CAAa,KAEtC,CAACjD;AAAS;AAGhB,UAAMmD,IAAIlE,GAASiE,CAAQ;AAC3B,IAAAtC,GAAmB,CAACwC,MAAS;AAC3B,YAAMC,IAAUD,EAAK,WAAWH,CAAa,KAAK,GAC5CK,IAAiBH,IAAIE,GACrBE,IAAoB,OAAO,OAAOH,EAAK,UAAU,EAAE,OAAO,CAACI,IAAKjC,MAAMiC,MAAOjC,KAAK,IAAI,CAAC,GACvFkC,IACJH,IAAiB,IACb,KAAK,IAAIA,GAAgB,KAAK,IAAI,GAAGhB,KAAgBiB,CAAiB,CAAC,IACvED,GAEAI,IAAUL,IAAUI;AAG1B,UAAIE;AACJ,UAAID,KAAW,GAAG;AAChB,cAAM,EAAE,CAACT,CAAa,GAAGW,IAAG,GAAGC,EAAA,IAAST,EAAK;AAC7C,QAAAO,IAAiBE;AAAA,MACnB,MAAA,CAAWR,MAAYK,IACrBC,IAAiBP,EAAK,aAEtBO,IAAiB,EAAE,GAAGP,EAAK,YAAY,CAACH,CAAa,GAAGS,EAAA;AAI1D,UAAII,KAAYV,EAAK;AACrB,UAAIK,IAAQ;AAEV,QAAAK,KAAY,CAAC,GAAGV,EAAK,OAAO,GAAG,MAAM,KAAK,EAAE,QAAQK,KAAS,MAAMR,CAAa,CAAC;AAAA,eACxEQ,IAAQ,GAAG;AAEpB,YAAIM,KAAoB,CAACN;AACzB,cAAMO,IAAyB,CAAA;AAC/B,iBAASC,IAAIb,EAAK,MAAM,SAAS,GAAGa,KAAK,GAAGA,KAAK;AAC/C,gBAAMC,IAAKd,EAAK,MAAMa,CAAC;AACvB,cAAIC,MAAOjB,KAAiBc,KAAoB,GAAG;AACjD,YAAAA;AACA;AAAA,UACF;AACA,UAAAC,EAAa,KAAKE,CAAE;AAAA,QACtB;AACA,QAAAF,EAAa,QAAA,GACbF,KAAYE;AAAA,MACd;AAEA,UAAIL,MAAmBP,EAAK,cAAcU,OAAcV,EAAK,MAAO,QAAOA;AAE3E,YAAMe,KAAiBZ,GACjBa,KAAiB,OAAO,OAAOT,CAAc,EAAE,OAAO,CAACH,IAAKjC,MAAMiC,MAAOjC,KAAK,IAAI,CAAC;AAGzF,UAAIxE;AACF,YAAI;AACF,gBAAMkF,KAAkBvF,GAAA,GAClB2H,IAAc;AAAA,YAClB,WAAW;AAAA,YACX,MAAArH;AAAA,YACA,iBAAAiF;AAAA,YACA,QAAQ,EAAE,GAAGmB,EAAK,WAAA;AAAA,YAClB,OAAO,EAAE,GAAGO,EAAA;AAAA,YACZ,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UAAY;AAEpC,UAAA7G,GAAWC,GAAmBC,GAAMqH,CAAW,GAG3CF,OAAmB,KAAKC,MAAkB,KAC5CtH,GAAWC,GAAmBC,GAAM;AAAA,YAClC,GAAGqH;AAAA,YACH,eAAe;AAAA,UAAA,CAChB,GAGCF,KAAiB1B,MAAe2B,MAAkB3B,MACpD3F,GAAWC,GAAmBC,GAAM;AAAA,YAClC,GAAGqH;AAAA,YACH,eAAe;AAAA,UAAA,CAChB;AAAA,QAEL,QAAQ;AAAA,QAER;AAGF,aAAO,EAAE,YAAYV,GAAgB,OAAOG,GAAA;AAAA,IAC9C,CAAC;AAAA,EACH,GAAG,CAACxB,IAAeG,IAAaD,GAAuBzF,GAAmBC,GAAMgD,CAAO,CAAC;AAExF,EAAAe,EAAU,MAAM;AACd,IAAIf,KACJY,GAAmB,CAACwC,MAAS;AAC3B,YAAMkB,IAAwB,OAAO,QAAQlB,EAAK,UAAU,EAAE;AAAA,QAAO,CAAC,CAACc,CAAE,MACvE1B,EAAsB,IAAI0B,CAAE;AAAA,MAAA,GAExBP,IAAiB,OAAO,YAAYW,CAAqB,GACzDR,IAAYV,EAAK,MAAM,OAAO,CAACc,MAAO1B,EAAsB,IAAI0B,CAAE,CAAC;AAEzE,aACEJ,EAAU,WAAWV,EAAK,MAAM,UAChCkB,EAAsB,WAAW,OAAO,KAAKlB,EAAK,UAAU,EAAE,SAEvDA,IAGF,EAAE,YAAYO,GAAgB,OAAOG,EAAA;AAAA,IAC9C,CAAC;AAAA,EACH,GAAG,CAAC9D,GAASwC,CAAqB,CAAC;AAEnC,QAAM+B,KAAkBvC,GAAY,MAAMpB,GAAmB,EAAE,YAAY,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,EAAE,GAEzF4D,KAAa7D,GAAgB,YAC7B8D,KAAiB9D,GAAgB,OAEjC+D,KAAanC,EAAQ,MAAM,OAAO,OAAOiC,EAAU,EAAE,OAAO,CAAChB,GAAKL,MAAMK,KAAOL,KAAK,IAAI,CAAC,GAAG,CAACqB,EAAU,CAAC,GAExGG,KAAYpC,EAAQ,MACpB,EAAAvC,KAAWE,MACX/C,KACA,EAACoD,KAAA,QAAAA,EAAQ,aACTmE,KAAajC,KAEhB,CAACiC,IAAYnE,KAAA,gBAAAA,EAAQ,UAAUpD,GAAO6C,GAASyC,IAAavC,EAAU,CAAC,GAGpE0E,KAAsB5C,GAAY,OAAO6C,MAA8D;;AAC3G,QAAI,CAACF,MAAa,CAACpE,EAAQ;AAE3B,UAAMuE,IAAW9F,GAAA,GACX+F,KAAexE,EAAO,SAAS,IAAI,OAAO,MAAM,GAAG,GAAG,GACtDyE,IAAQ,OAAO,QAAQR,EAAU,EACpC,IAAI,CAAC,CAACvB,GAAeC,CAAQ,OAAO,EAAE,eAAAD,GAAe,UAAUhE,GAASiE,CAAQ,IAAI,EACpF,OAAO,CAAC+B,MAAMA,EAAE,WAAW,CAAC,EAC5B,OAAO,CAACA,MAAMzC,EAAsB,IAAIyC,EAAE,aAAa,CAAC,EACxD,IAAI,CAACA,OAAO;AAAA,MACX,eAAeA,EAAE;AAAA,MACjB,UAAUA,EAAE;AAAA,MACZ,YAAY;AAAA,QACV,EAAE,KAAK7I,GAAwB,UAAU,OAAO0I,EAAA;AAAA,QAChD,EAAE,KAAK1I,GAAwB,cAAc,OAAOmD,EAAA;AAAA,QACpD,EAAE,KAAKnD,GAAwB,cAAc,OAAO,iBAAA;AAAA,QACpD,GAAI2I,IAAc,CAAC,EAAE,KAAK3I,GAAwB,aAAa,OAAO2I,EAAA,CAAa,IAAI,CAAA;AAAA,MAAC;AAAA,IAC1F,EACA;AAEJ,QAAI,CAACC,EAAM,OAAQ;AAGnB,UAAME,IAAO,IAAI,IAAIzE,EAAiB,IAAI,CAACc,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,QAAI4D,IAAa;AACjB,eAAW,CAACC,GAAWC,CAAG,KAAK,OAAO,QAAQb,EAAU,GAAG;AACzD,YAAMrB,KAAIkC,KAAO;AACjB,UAAIlC,MAAK,EAAG;AACZ,YAAM5B,KAAI2D,EAAK,IAAIE,CAAS,GACtBE,KAAQ,OAAO/D,MAAA,gBAAAA,GAAG,KAAK;AAC7B,MAAK,OAAO,SAAS+D,EAAK,MAC1BH,KAAcG,KAAQnC;AAAA,IACxB;AACA,IAAAgC,IAAa,KAAK,MAAMA,IAAa,GAAG,IAAI;AAG5C,UAAMI,IAAc,CAAC,GAAIhF,EAAO,SAAS,CAAA,CAAG,EAAE,KAAK,CAACiF,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa;AAC9F,QAAIC,IAAmD;AACvD,eAAW9C,KAAK2C;AACd,MAAIb,MAAc9B,EAAE,kBAAe8C,IAAc9C;AAGnD,UAAM+C,IAAyBD,KAC1B,MAAM;AACP,YAAME,IAAM,OAAO,WAAWF,EAAa,eAAe;AAC1D,aAAO,OAAO,SAASE,CAAG,KAAKA,IAAM,IAAIA,IAAM;AAAA,IACjD,OACE,MAEEC,IAAkBF,IACpB,KAAK,MAAMR,KAAc,IAAIQ,IAAyB,OAAO,GAAG,IAAI,MACpER,GACEW,KAAmBX,IAAaU,GAEhCE,KAAoBf,EAAM,IAAI,CAACC,MAAMA,EAAE,aAAa,GACpDe,MAA8BN,KAAA,gBAAAA,EAAa,WAAU,IACrDO,OAAgB9H,IAAAuH,KAAA,gBAAAA,EAAa,UAAb,gBAAAvH,EAAoB,WAAU;AAEpD,IAAAgC,GAAc,EAAI;AAClB,QAAI;AAQF,UAPI0E,KAAA,QAAAA,EAAS,WACX,MAAMvF,EAAY,oBAAoB0F,CAAK,IAE3C,MAAM1F,EAAY,SAAS0F,CAAK,GAI9BjI;AACF,YAAI;AACF,gBAAMkF,IAAkBvF,GAAA,GAClBwJ,IAAa,CAAC,EAACrB,KAAA,QAAAA,EAAS;AAC9B,UAAA/H,GAAWC,GAAmBC,GAAM;AAAA,YAClC,WAAW;AAAA,YACX,MAAAA;AAAA,YACA,iBAAAiF;AAAA,YACA,UAAA6C;AAAA,YACA,mBAAAiB;AAAA,YACA,YAAAZ;AAAA,YACA,iBAAAU;AAAA,YACA,UAAUxF,MAAgB;AAAA,YAC1B,6BAAA2F;AAAA,YACA,eAAAC;AAAA,YACA,oBAAoBN;AAAA,YACpB,kBAAAG;AAAA,YACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,YACtB,UAAUI;AAAA,YACV,eAAeA,IAAa,iCAAiC;AAAA,UAAA,CAC9D;AAAA,QACH,QAAQ;AAAA,QAER;AAGF,MAAA3B,GAAA,GACArC,GAAA,IAEAiE,IAAAtB,KAAA,gBAAAA,EAAS,eAAT,QAAAsB,EAAA,KAAAtB;AAAA,IACF,UAAA;AACE,MAAA1E,GAAc,EAAK;AAAA,IACrB;AAAA,EACF,GAAG;AAAA,IACDwE;AAAA,IACArF;AAAA,IACAiF;AAAA,IACArC;AAAA,IACA3B;AAAA,IACAhB;AAAA,IACAc;AAAA,IACAmE;AAAA,IACAhC;AAAA,IACA/B;AAAA,IACAiE;AAAA,IACA3H;AAAA,IACAC;AAAA,EAAA,CACD,GAEKoJ,KAASpE,GAAY,YAAY;AACrC,UAAM4C;AAAA,MACJ;AAAA,QACE,YAAY,MAAM;;AAChB,WAAAzG,IAAAmB,EAAY,eAAZ,QAAAnB,EAAA,KAAAmB;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAACsF,IAAqBtF,CAAW,CAAC,GAE/B+G,IAAoBrE,GAAY,YAAY;AAChD,UAAM4C;AAAA,MACJ;AAAA,QACE,UAAU;AAAA,QACV,YAAY,MAAM;;AAChB,WAAAzG,IAAAmB,EAAY,uBAAZ,QAAAnB,EAAA,KAAAmB;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAACsF,IAAqBtF,CAAW,CAAC,GAE/B7B,IAAmC8E;AAAA,IACvC,OAAO;AAAA,MACL,QAAA1C;AAAA,MACA,MAAAkC;AAAA,MACA,OAAAG;AAAA,MACA,QAAAG;AAAA,MACA,SAAArC;AAAA,MACA,YAAAE;AAAA,MACA,OAAA/C;AAAA,MACA,cAAAkD;AAAA,MACA,QAAAE;AAAA,MACA,kBAAAE;AAAA,MACA,YAAA+D;AAAA,MACA,gBAAAC;AAAA,MACA,aAAAzB;AAAA,MACA,iBAAAuB;AAAA,MACA,YAAAG;AAAA,MACA,aAAAjC;AAAA,MACA,WAAAkC;AAAA,MACA,QAAAyB;AAAA,MACA,mBAAAC;AAAA,IAAA;AAAA,IAEF;AAAA,MACExG;AAAA,MACAkC;AAAA,MACAG;AAAA,MACAG;AAAA,MACArC;AAAA,MACAE;AAAA,MACA/C;AAAA,MACAkD;AAAA,MACAE;AAAA,MACAE;AAAA,MACA+D;AAAA,MACAC;AAAA,MACAzB;AAAA,MACAuB;AAAA,MACAG;AAAA,MACAjC;AAAA,MACAkC;AAAA,MACAyB;AAAA,MACAC;AAAA,IAAA;AAAA,EACF;AAGF,SAAO,gBAAAC,EAAClJ,GAAqB,UAArB,EAA8B,OAAAK,GAAe,UAAAmC,EAAA,CAAS;AAChE;AC7vBO,SAAS2G,KAAmB;AACjC,QAAMC,IAAMC,GAAWrJ,EAAoB;AAC3C,MAAI,CAACoJ;AACH,UAAM,IAAI,MAAM,yDAAyD;AAE3E,SAAOA;AACT;ACIO,SAASE,KAAsD;AACpE,QAAM,EAAE,QAAA7G,GAAQ,MAAAkC,GAAM,OAAAG,GAAO,QAAAG,EAAA,IAAWkE,GAAA;AACxC,SAAO,EAAE,QAAA1G,GAAQ,MAAAkC,GAAM,OAAAG,GAAO,QAAAG,EAAA;AAChC;;;;ACPO,SAASsE,GAAavH,GAA0B;AACrD,QAAM,EAAE,QAAAiD,EAAA,IAAWkE,GAAA;AACnB,SACE,gBAAAD;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAASjE;AAAA,MACT,WAAW,CAACnE,GAAO,QAAQkB,EAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAEnE,YAAM,YAAY;AAAA,IAAA;AAAA,EAAA;AAGzB;;;;;ACjBA,MAAIwH,IAAiB;AAAA,IACnB,QAAQ,SAASC,GAAGpB,GAAGqB,GAAIC,GAAG;AAC5B,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,IAAIH,IAAIE,IAAItB;AAAA,IACvB;AAAA,IACE,YAAY,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAKH,KAAKE,KAAKF,IAAIpB;AAAA,IAC9B;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,KAAKH,KAAKE,MAAMF,IAAI,KAAKpB;AAAA,IACrC;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,cAAKoB,KAAKE,IAAI,KAAK,IACVC,IAAI,IAAIH,IAAIA,IAAIpB,IAEhB,CAACuB,IAAI,KAAM,EAAEH,KAAMA,IAAI,KAAK,KAAKpB;AAAA,IAE9C;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAKH,KAAKE,KAAKF,IAAIA,IAAIpB;AAAA,IAClC;AAAA,IACE,cAAc,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,MAAMH,IAAIA,IAAIE,IAAI,KAAKF,IAAIA,IAAI,KAAKpB;AAAA,IAC/C;AAAA,IACE,gBAAgB,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB;AACb,cAAKoB,KAAKE,IAAI,KAAK,IACVC,IAAI,IAAIH,IAAIA,IAAIA,IAAIpB,IAEpBuB,IAAI,MAAMH,KAAK,KAAKA,IAAIA,IAAI,KAAKpB;AAAA,IAE9C;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAKH,KAAKE,KAAKF,IAAIA,IAAIA,IAAIpB;AAAA,IACtC;AAAA,IACE,cAAc,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,MAAMH,IAAIA,IAAIE,IAAI,KAAKF,IAAIA,IAAIA,IAAI,KAAKpB;AAAA,IACpD;AAAA,IACE,gBAAgB,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB;AACb,cAAKoB,KAAKE,IAAI,KAAK,IACVC,IAAI,IAAIH,IAAIA,IAAIA,IAAIA,IAAIpB,IAExB,CAACuB,IAAI,MAAMH,KAAK,KAAKA,IAAIA,IAAIA,IAAI,KAAKpB;AAAA,IAEnD;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,KAAKH,KAAKE,KAAKF,IAAIA,IAAIA,IAAIA,IAAIpB;AAAA,IAC1C;AAAA,IACE,cAAc,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,MAAMH,IAAIA,IAAIE,IAAI,KAAKF,IAAIA,IAAIA,IAAIA,IAAI,KAAKpB;AAAA,IACvD;AAAA,IACE,gBAAgB,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB;AACb,cAAKoB,KAAKE,IAAI,KAAK,IACVC,IAAI,IAAIH,IAAIA,IAAIA,IAAIA,IAAIA,IAAIpB,IAE5BuB,IAAI,MAAMH,KAAK,KAAKA,IAAIA,IAAIA,IAAIA,IAAI,KAAKpB;AAAA,IAEtD;AAAA,IACE,YAAY,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,IAAI,KAAK,IAAIH,IAAIE,KAAK,KAAK,KAAK,EAAE,IAAIC,IAAIvB;AAAA,IACtD;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,IAAI,KAAK,IAAIH,IAAIE,KAAK,KAAK,KAAK,EAAE,IAAItB;AAAA,IACjD;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,IAAI,KAAK,KAAK,IAAI,KAAK,KAAKH,IAAIE,CAAC,IAAI,KAAKtB;AAAA,IACtD;AAAA,IACE,YAAY,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAQoB,KAAG,IAAKpB,IAAIuB,IAAI,KAAK,IAAI,GAAG,MAAMH,IAAEE,IAAI,EAAE,IAAItB;AAAA,IAC1D;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAQoB,KAAGE,IAAKtB,IAAEuB,IAAIA,KAAK,CAAC,KAAK,IAAI,GAAG,MAAMH,IAAEE,CAAC,IAAI,KAAKtB;AAAA,IAC9D;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,aAAIoB,MAAM,IACDpB,IAELoB,MAAME,IACDtB,IAAIuB,KAERH,KAAKE,IAAI,KAAK,IACVC,IAAI,IAAI,KAAK,IAAI,GAAG,MAAMH,IAAI,EAAE,IAAIpB,IAEpCuB,IAAI,KAAK,CAAC,KAAK,IAAI,GAAG,MAAM,EAAEH,CAAC,IAAI,KAAKpB;AAAA,IAErD;AAAA,IACE,YAAY,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAChC,UAAIC,IAAIF,IAAKrB;AACb,aAAO,CAACuB,KAAK,KAAK,KAAK,KAAKH,KAAKE,KAAKF,CAAC,IAAI,KAAKpB;AAAA,IACpD;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACjC,UAAIC,IAAIF,IAAKrB;AACb,aAAOuB,IAAI,KAAK,KAAK,KAAKH,IAAIA,IAAIE,IAAI,KAAKF,CAAC,IAAIpB;AAAA,IACpD;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,cAAKoB,KAAKE,IAAI,KAAK,IACV,CAACC,IAAI,KAAK,KAAK,KAAK,IAAIH,IAAIA,CAAC,IAAI,KAAKpB,IAEtCuB,IAAI,KAAK,KAAK,KAAK,KAAKH,KAAK,KAAKA,CAAC,IAAI,KAAKpB;AAAA,IAEzD;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB,GACTD,GAAGyB,GAAGjJ;AAIV,aAHAA,IAAI,SACJiJ,IAAI,GACJzB,IAAIwB,GACAH,MAAM,IACDpB,KACGoB,KAAKE,OAAO,IACftB,IAAIuB,KAERC,MACHA,IAAIF,IAAI,MAENvB,IAAI,KAAK,IAAIwB,CAAC,KAChBxB,IAAIwB,GACJhJ,IAAIiJ,IAAI,KAERjJ,IAAIiJ,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIxB,CAAC,GAElC,EAAEA,IAAI,KAAK,IAAI,GAAG,MAAMqB,KAAK,EAAE,IAAI,KAAK,KAAKA,IAAIE,IAAI/I,MAAM,IAAI,KAAK,MAAMiJ,CAAC,KAAKxB;AAAA,IAC3F;AAAA,IACE,gBAAgB,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACpC,UAAIC,IAAIF,IAAKrB,GACTD,GAAGyB,GAAGjJ;AAIV,aAHAA,IAAI,SACJiJ,IAAI,GACJzB,IAAIwB,GACAH,MAAM,IACDpB,KACGoB,KAAKE,OAAO,IACftB,IAAIuB,KAERC,MACHA,IAAIF,IAAI,MAENvB,IAAI,KAAK,IAAIwB,CAAC,KAChBxB,IAAIwB,GACJhJ,IAAIiJ,IAAI,KAERjJ,IAAIiJ,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIxB,CAAC,GAElCA,IAAI,KAAK,IAAI,GAAG,MAAMqB,CAAC,IAAI,KAAK,KAAKA,IAAIE,IAAI/I,MAAM,IAAI,KAAK,MAAMiJ,CAAC,IAAID,IAAIvB;AAAA,IACtF;AAAA,IACE,kBAAkB,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACtC,UAAIC,IAAIF,IAAKrB,GACTD,GAAGyB,GAAGjJ;AAIV,aAHAA,IAAI,SACJiJ,IAAI,GACJzB,IAAIwB,GACAH,MAAM,IACDpB,KACGoB,KAAKE,IAAI,OAAO,IACnBtB,IAAIuB,KAERC,MACHA,IAAIF,KAAK,MAAM,OAEbvB,IAAI,KAAK,IAAIwB,CAAC,KAChBxB,IAAIwB,GACJhJ,IAAIiJ,IAAI,KAERjJ,IAAIiJ,KAAK,IAAI,KAAK,MAAM,KAAK,KAAKD,IAAIxB,CAAC,GAErCqB,IAAI,IACC,QAAQrB,IAAI,KAAK,IAAI,GAAG,MAAMqB,KAAK,EAAE,IAAI,KAAK,KAAKA,IAAIE,IAAI/I,MAAM,IAAI,KAAK,MAAMiJ,CAAC,KAAKxB,IAEtFD,IAAI,KAAK,IAAI,GAAG,OAAOqB,KAAK,EAAE,IAAI,KAAK,KAAKA,IAAIE,IAAI/I,MAAM,IAAI,KAAK,MAAMiJ,CAAC,IAAI,MAAMD,IAAIvB;AAAA,IAErG;AAAA,IACE,YAAY,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG/I,GAAG;AACnC,UAAIgJ,IAAIF,IAAKrB;AACb,aAAIzH,MAAM,WACRA,IAAI,UAECgJ,KAAKH,KAAKE,KAAKF,MAAM7I,IAAI,KAAK6I,IAAI7I,KAAKyH;AAAA,IAClD;AAAA,IACE,aAAa,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG/I,GAAG;AACpC,UAAIgJ,IAAIF,IAAKrB;AACb,aAAIzH,MAAM,WACRA,IAAI,UAECgJ,MAAMH,IAAIA,IAAIE,IAAI,KAAKF,MAAM7I,IAAI,KAAK6I,IAAI7I,KAAK,KAAKyH;AAAA,IAC/D;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG/I,GAAG;AACtC,UAAIgJ,IAAIF,IAAKrB;AAIb,aAHIzH,MAAM,WACRA,IAAI,WAED6I,KAAKE,IAAI,KAAK,IACVC,IAAI,KAAKH,IAAIA,OAAO7I,KAAK,SAAS,KAAK6I,IAAI7I,MAAMyH,IAEjDuB,IAAI,MAAMH,KAAK,KAAKA,OAAO7I,KAAK,SAAS,KAAK6I,IAAI7I,KAAK,KAAKyH;AAAA,IAEzE;AAAA,IACE,cAAc,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AAClC,UAAIC,IAAIF,IAAKrB,GACTlE;AACJ,aAAAA,IAAIqF,EAAe,cAAcG,IAAIF,GAAG,GAAGG,GAAGD,CAAC,GACxCC,IAAIzF,IAAIkE;AAAA,IACnB;AAAA,IACE,eAAe,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACnC,UAAIC,IAAIF,IAAKrB;AACb,cAAKoB,KAAKE,KAAK,IAAI,OACVC,KAAK,SAASH,IAAIA,KAAKpB,IACrBoB,IAAI,IAAI,OACVG,KAAK,UAAUH,KAAK,MAAM,QAAQA,IAAI,QAAQpB,IAC5CoB,IAAI,MAAM,OACZG,KAAK,UAAUH,KAAK,OAAO,QAAQA,IAAI,UAAUpB,IAEjDuB,KAAK,UAAUH,KAAK,QAAQ,QAAQA,IAAI,YAAYpB;AAAA,IAEjE;AAAA,IACE,iBAAiB,SAASoB,GAAGpB,GAAGqB,GAAIC,GAAG;AACrC,UAAIC,IAAIF,IAAKrB,GACTlE;AACJ,aAAIsF,IAAIE,IAAI,KACVxF,IAAIqF,EAAe,aAAaC,IAAI,GAAG,GAAGG,GAAGD,CAAC,GACvCxF,IAAI,MAAMkE,MAEjBlE,IAAIqF,EAAe,cAAcC,IAAI,IAAIE,GAAG,GAAGC,GAAGD,CAAC,GAC5CxF,IAAI,MAAMyF,IAAI,MAAMvB;AAAA,IAEjC;AAAA;AAGA,SAAAyB,KAAiBN;;;ACpPjB,SAASO,GAAcC,GAAS;AAC5B,SAAQA,IAAU,KAAK,KAAM;AACjC;AACA,SAASC,GAAYC,GAAKC,GAAK;AAC3B,SAAOD,IAAM,KAAK,OAAM,KAAMC,IAAMD;AACxC;AACA,SAASE,GAAUF,GAAKC,GAAK;AACzB,SAAO,KAAK,MAAMD,IAAM,KAAK,OAAM,KAAMC,IAAMD,IAAM,EAAE;AAC3D;AAEA,IAAIG;AAAA,CACH,SAAUA,GAAe;AACtB,EAAAA,EAAcA,EAAc,SAAY,CAAC,IAAI,UAC7CA,EAAcA,EAAc,SAAY,CAAC,IAAI,UAC7CA,EAAcA,EAAc,QAAW,CAAC,IAAI;AAChD,GAAGA,OAAkBA,KAAgB,CAAA,EAAG;AACxC,IAAIC;AAAA,CACH,SAAUA,GAAmB;AAC1B,EAAAA,EAAkBA,EAAkB,WAAc,CAAC,IAAI,YACvDA,EAAkBA,EAAkB,WAAc,EAAE,IAAI;AAC5D,GAAGA,OAAsBA,KAAoB,CAAA,EAAG;AAChD,MAAMC,KAAqB,MAAO;AAClC,MAAMC,GAAS;AAAA,EACX,YAAYC,GAASC,GAAYC,GAAGC,GAAG;AACnC,SAAK,aAAaF;AAClB,UAAM,EAAE,QAAAG,GAAQ,kBAAAC,GAAkB,kBAAAC,EAAgB,IAAK,KAAK,WAAU;AACtE,SAAK,UAAUN,GACf,KAAK,IAAIE,GACT,KAAK,IAAIC,GACT,KAAK,IAAIX,GAAY,GAAG,EAAE,GAC1B,KAAK,IAAIA,GAAY,GAAG,EAAE,GAC1B,KAAK,SAASA,GAAY,GAAG,EAAE,GAC/B,KAAK,KACD,OAAOa,KAAqB,WACtBb,GAAY,CAACa,GAAkBA,CAAgB,IAC/Cb,GAAYa,EAAiB,KAAKA,EAAiB,GAAG,GAChE,KAAK,KACD,OAAOC,KAAqB,WACtBd,GAAY,CAACc,GAAkB,CAAC,IAChCd,GAAYc,EAAiB,KAAKA,EAAiB,GAAG,GAChE,KAAK,QAAQX,GAAU,GAAG,CAAC,GAC3B,KAAK,QAAQL,GAAcE,GAAY,GAAG,GAAG,CAAC,GAC9C,KAAK,cAAcA,GAAY,MAAM,GAAG,GACxC,KAAK,QAAQY,EAAO,KAAK,MAAM,KAAK,OAAM,IAAKA,EAAO,MAAM,CAAC,GAC7D,KAAK,UAAUZ,GAAY,GAAG,CAAC,GAC/B,KAAK,oBAAoBA,GAAY,GAAG,CAAC,IACnCK,GAAkB,WAClBA,GAAkB;AAAA,EAC5B;AAAA,EACA,OAAOU,GAAS;AACZ,UAAM,EAAE,SAAAC,GAAS,MAAAC,GAAM,UAAAC,GAAU,SAAAC,GAAS,WAAAC,EAAS,IAAK,KAAK,WAAU,GACjEC,IAAsBN,IAAUT;AACtC,SAAK,KAAK,KAAK,KAAKe,GACpB,KAAK,KAAK,KAAK,KAAKA,GACpB,KAAK,MAAML,IAAUK,GACrB,KAAK,MAAMJ,IAAOI,GAClB,KAAK,MAAMH,KAAYG,GACvB,KAAK,MAAMH,KAAYG,GACnB,KAAK,WAAW,KAChB,KAAK,sBAAsBhB,GAAkB,WAC7C,KAAK,oBAAoBA,GAAkB,WAEtC,KAAK,WAAW,MACrB,KAAK,sBAAsBA,GAAkB,aAC7C,KAAK,oBAAoBA,GAAkB;AAE/C,UAAMiB,IAAc,MAAM,KAAK,oBAAoBD;AAcnD,QAbA,KAAK,WAAWC,GAChB,KAAK,SAAS,KAAK,aACnB,KAAK,QAAQ,KAAI,GACjB,KAAK,QAAQ,UAAU,KAAK,GAAG,KAAK,CAAC,GACrC,KAAK,QAAQ,OAAO,KAAK,KAAK,GAC9B,KAAK,QAAQ,MAAM,GAAG,KAAK,OAAO,GAClC,KAAK,QAAQ,OAAO,KAAK,KAAK,GAC9B,KAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,YAAY,KAAK,OAC9B,KAAK,QAAQ,cAAc,KAAK,OAChC,KAAK,QAAQ,cAAcH,GAC3B,KAAK,QAAQ,UAAU,SACvB,KAAK,QAAQ,YAAY,GACrBC,KAAa,OAAOA,KAAc;AAClC,MAAAA,EAAU,KAAK,MAAM,KAAK,OAAO;AAAA;AAGjC,cAAQ,KAAK,OAAK;AAAA,QACd,KAAKhB,GAAc,QAAQ;AACvB,eAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,GAAG,IAAI,KAAK,EAAE,GAClD,KAAK,QAAQ,KAAI;AACjB;AAAA,QACJ;AAAA,QACA,KAAKA,GAAc,QAAQ;AACvB,eAAK,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9D;AAAA,QACJ;AAAA,QACA,KAAKA,GAAc,OAAO;AACtB,eAAK,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAClE;AAAA,QACJ;AAAA,MAChB;AAEQ,SAAK,QAAQ,UAAS,GACtB,KAAK,QAAQ,QAAO;AAAA,EACxB;AACJ;AAEA,MAAMmB,GAAkB;AAAA,EACpB,YAAYC,GAAQf,GAAY;AAC5B,SAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,qBAAqB,GAC1B,KAAK,gBAAgB,GACrB,KAAK,YAAY,GACjB,KAAK,YAAY,CAAA,GACjB,KAAK,qBAAqB,GAC1B,KAAK,mBAAmB,CAAC7D,MAAM;AAC3B,WAAK,UAAU,OAAOA,GAAG,CAAC;AAAA,IAC9B,GACA,KAAK,cAAc,MAAM;AACrB,YAAM6E,IAAezB,GAAY,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC,GAClD0B,IAAe1B,GAAY,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC;AACxD,aAAO,IAAIO,GAAS,KAAK,SAAS,KAAK,YAAYkB,GAAcC,CAAY;AAAA,IACjF,GACA,KAAK,UAAU,CAACX,MAAY;AACxB,YAAM,EAAE,QAAAS,GAAQ,SAAAhB,GAAS,oBAAAmB,GAAoB,oBAAAC,EAAkB,IAAK,MAC9D,EAAE,KAAAC,GAAK,SAAAC,GAAS,gBAAAC,GAAgB,OAAAC,GAAO,eAAAC,GAAe,eAAAC,EAAa,IAAM,KAAK,WAAU;AAC9F,UAAI,CAACL;AACD,eAAO;AAEX,YAAMM,KAAK,KAAK,UAAU,QACpBC,KAAcN,IAAUK,KAAKR;AAEnC,UAAIS,KAAcL,GAAgB;AAE9B,QAAIH,MAAuBG,MACvB,KAAK,gBAAgB,GACrB,KAAK,YAAYK,IACjB,KAAK,qBAAqBL,IAG9B,KAAK,gBAAgB,KAAK,IAAIG,GAAe,KAAK,IAAI,GAAG,KAAK,gBAAgBnB,CAAO,CAAC;AACtF,cAAMsB,IAAaJ,EAAc,KAAK,eAAe,KAAK,WAAWF,GAAgBG,CAAa,GAC5FI,IAAW,KAAK,MAAMD,IAAaD,EAAW;AACpD,iBAASxF,KAAI,GAAGA,KAAI0F,GAAU1F;AAC1B,eAAK,UAAU,KAAK,KAAK,YAAW,CAAE;AAE1C,aAAK,sBAAsB0F;AAAA,MAC/B;AACA,MAAIN,MAEAxB,EAAQ,OAAO,mBACfA,EAAQ,YAAY,QACpBA,EAAQ,YAAY,SACpBA,EAAQ,SAAS,cAAc2B,EAAE,IAAIX,EAAO,QAAQ,IAAIA,EAAO,SAAS,EAAE;AAG9E,eAAS5E,IAAI,KAAK,UAAU,SAAS,GAAGA,KAAK,GAAGA,KAAK;AACjD,cAAMgD,IAAI,KAAK,UAAUhD,CAAC;AAE1B,QAAAgD,EAAE,OAAOmB,CAAO,IAEZnB,EAAE,IAAI4B,EAAO,UACb5B,EAAE,IAAI,QACNA,EAAE,IAAI4B,EAAO,QAAQ,OACrB5B,EAAE,IAAI,UACFkC,KAAWM,MAAeL,IAE1B,KAAK,UAAUnF,CAAC,IAAI,KAAK,YAAW,IAGpC,KAAK,iBAAiBA,CAAC;AAAA,MAGnC;AACA,aAAOuF,KAAK,KAAKC,KAAcL;AAAA,IACnC,GACA,KAAK,SAASP;AACd,UAAMrC,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,8BAA8B;AAElD,SAAK,UAAUA,GACf,KAAK,aAAasB;AAAA,EACtB;AACJ;AAEA,MAAM8B,KAAmB;AAAA,EACrB,OAAO,OAAO,SAAW,MAAc,OAAO,aAAa;AAAA,EAC3D,QAAQ,OAAO,SAAW,MAAc,OAAO,cAAc;AAAA,EAC7D,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,QAAQ;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACR;AAAA,EACI,SAAS;AAAA,EACT,OAAO;AAAA,EACP,eAAeC,GAAAA;AAAAA,EACf,eAAe;AAAA,EACf,SAAS;AAAA,EACT,KAAK;AACT;AACA,MAAMC,GAAS;AAAA,EACX,YAAYjB,GAAQkB,GAAM;AACtB,SAAK,gBAAgB,GACrB,KAAK,yBAAyB,CAACA,MAAS;AACpC,YAAMC,IAA2B;AAAA,QAC7B,gBAAgB;AAAA,UACZ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG,KAAK,OAAO;AAAA,UACf,GAAG;AAAA,QACvB;AAAA,MACA;AACY,WAAK,WAAW;AAAA,QACZ,GAAGA;AAAA,QACH,GAAGJ;AAAA,QACH,GAAGG;AAAA,MACnB,GACY,OAAO,OAAO,MAAMA,EAAK,cAAc;AAAA,IAC3C,GACA,KAAK,SAAS,CAACE,IAAY,MAAM;AAC7B,YAAM,EAAE,SAAS,EAAE,KAAAf,GAAK,oBAAAgB,GAAoB,WAAAC,KAAa,QAAAtB,GAAQ,SAAAhB,EAAO,IAAM,MAExEO,IAAU,KAAK,IAAI6B,IAAY,KAAK,eAAe,EAAE;AAE3D,UAAIE,KAAa/B,IAAU,MAAO+B,GAAW;AACzC,aAAK,QAAQ,sBAAsB,KAAK,MAAM;AAC9C;AAAA,MACJ;AACA,WAAK,gBAAgBF,KAAaE,IAAY/B,IAAU+B,IAAY,IAChEjB,MACArB,EAAQ,YAAY,SACpBA,EAAQ,UAAU,GAAG,GAAGgB,EAAO,OAAOA,EAAO,MAAM,IAEnD,KAAK,UAAU,QAAQT,CAAO,IAC9B,KAAK,QAAQ,sBAAsB,KAAK,MAAM,KAG1C8B,KACA,OAAOA,KAAuB,cAC9B,KAAK,UAAU,qBAAqB,KACpCA,EAAmB,KAAK,MAAM,IAAI,GAEtC,KAAK,SAAS,MAAM;AAAA,IAE5B,GACA,KAAK,QAAQ,MAAM;AACf,MAAI,KAAK,aAAa,KAAK,UAAU,qBAAqB,MACtD,KAAK,UAAU,qBAAqB,GACpC,KAAK,UAAU,YAAY,CAAA,GAC3B,KAAK,UAAU,qBAAqB;AAAA,IAE5C,GACA,KAAK,OAAO,MAAM;AACd,WAAK,UAAU,EAAE,KAAK,GAAK,GACvB,KAAK,UACL,qBAAqB,KAAK,KAAK,GAC/B,KAAK,QAAQ;AAAA,IAErB,GACA,KAAK,SAASrB;AACd,UAAMrC,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA;AACD,YAAM,IAAI,MAAM,8BAA8B;AAElD,SAAK,UAAUA,GACf,KAAK,YAAY,IAAIoC,GAAkB,KAAK,QAAQ,MAAM,KAAK,OAAO,GACtE,KAAK,UAAUmB,GACf,KAAK,OAAM;AAAA,EACf;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,QAAQA,GAAM;;AACd,UAAMK,KAAejM,IAAA,KAAK,aAAL,gBAAAA,EAAe,KAC9BkM,KAAmBlE,IAAA,KAAK,aAAL,gBAAAA,EAAe;AACxC,SAAK,uBAAuB4D,CAAI,GAC5B,KAAK,cACL,OAAO,OAAO,KAAK,WAAW,KAAK,QAAQ,cAAc,GACrD,OAAOA,EAAK,WAAY,aACxBA,EAAK,WACLM,MAAqB,OACrB,KAAK,UAAU,qBAAqB,KAAK,UAAU,UAAU,UAGjE,OAAON,EAAK,OAAQ,aAAaA,EAAK,OAAOK,MAAiB,MAC9D,KAAK,OAAM;AAAA,EAEnB;AACJ;AAEA,MAAME,KAAMC,GAAM,UAAS;AAC3B,MAAMC,WAA8BD,GAAM,UAAU;AAAA,EAChD,YAAYnL,GAAO;AACf,UAAMA,CAAK,GACX,KAAK,SAASmL,GAAM,UAAS,GAC7B,KAAK,SAASnL,EAAM,aAAakL;AAAA,EACrC;AAAA,EACA,oBAAoB;AAChB,QAAI,KAAK,OAAO,SAAS;AACrB,YAAMP,IAAOU,GAAmB,KAAK,KAAK,EAAE,CAAC;AAC7C,WAAK,WAAW,IAAIX,GAAS,KAAK,OAAO,SAASC,CAAI;AAAA,IAC1D;AAAA,EACJ;AAAA,EACA,qBAAqB;AACjB,UAAMW,IAAkBD,GAAmB,KAAK,KAAK,EAAE,CAAC;AACxD,IAAI,KAAK,aACL,KAAK,SAAS,UAAUC;AAAA,EAEhC;AAAA,EACA,uBAAuB;AACnB,IAAI,KAAK,YACL,KAAK,SAAS,KAAI,GAEtB,KAAK,WAAW;AAAA,EACpB;AAAA,EACA,SAAS;AACL,UAAM,CAACA,GAAiBC,CAAW,IAAIF,GAAmB,KAAK,KAAK,GAC9DG,IAAe;AAAA,MACjB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAe;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,GAAGD,EAAY;AAAA,IAC3B;AACQ,WAAQrE,EAAI,UAAU,EAAE,OAAOoE,EAAgB,OAAO,QAAQA,EAAgB,QAAQ,KAAK,KAAK,QAAQ,GAAGC,GAAa,OAAOC,GAAc;AAAA,EACjJ;AACJ;AACAJ,GAAsB,eAAe;AAAA,EACjC,GAAGZ;AACP;AACAY,GAAsB,cAAc;AACpC,SAASC,GAAmBrL,GAAO;AAC/B,QAAMsL,IAAkB,CAAA,GAClBG,IAAO,CAAA,GACPhH,IAAO,CAAA,GACPiH,IAAqB;AAAA,IACvB,GAAG,OAAO,KAAKlB,EAAgB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACR,GACUmB,IAAW,CAAC,WAAW;AAC7B,aAAWC,KAAQ5L,GAAO;AACtB,UAAM6L,IAAM7L,EAAM4L,CAAI;AACtB,IAAIF,EAAmB,SAASE,CAAI,IAChCN,EAAgBM,CAAI,IAAIC,IAEnBF,EAAS,SAASC,CAAI,IAC3BD,EAASC,CAAI,IAAIC,IAGjBpH,EAAKmH,CAAI,IAAIC;AAAA,EAErB;AACA,SAAO,CAACP,GAAiB7G,GAAMgH,CAAI;AACvC;AACA,MAAMK,KAAgBX,GAAM,WAAW,CAACnL,GAAOkL,MAAQhE,EAAIkE,IAAuB,EAAE,WAAWF,GAAK,GAAGlL,EAAK,CAAE,CAAC;ACnY/G;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAM+L,KAAc,CAACC,MAAWA,EAAO,QAAQ,sBAAsB,OAAO,EAAE,YAAW,GACnFC,KAAc,CAACD,MAAWA,EAAO;AAAA,EACrC;AAAA,EACA,CAACE,GAAOC,GAAIC,MAAOA,IAAKA,EAAG,YAAW,IAAKD,EAAG,YAAW;AAC3D,GACME,KAAe,CAACL,MAAW;AAC/B,QAAMM,IAAYL,GAAYD,CAAM;AACpC,SAAOM,EAAU,OAAO,CAAC,EAAE,YAAW,IAAKA,EAAU,MAAM,CAAC;AAC9D,GACMC,KAAe,IAAIC,MAAYA,EAAQ,OAAO,CAACC,GAAWC,GAAOC,MAC9D,EAAQF,KAAcA,EAAU,KAAI,MAAO,MAAME,EAAM,QAAQF,CAAS,MAAMC,CACtF,EAAE,KAAK,GAAG,EAAE,KAAI,GACXE,KAAc,CAAC5M,MAAU;AAC7B,aAAW4L,KAAQ5L;AACjB,QAAI4L,EAAK,WAAW,OAAO,KAAKA,MAAS,UAAUA,MAAS;AAC1D,aAAO;AAGb;ACzBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAIiB,KAAoB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;ACjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMC,KAAOC;AAAA,EACX,CAAC;AAAA,IACC,OAAAC,IAAQ;AAAA,IACR,MAAAC,IAAO;AAAA,IACP,aAAAC,IAAc;AAAA,IACd,qBAAAC;AAAA,IACA,WAAAV,IAAY;AAAA,IACZ,UAAAjM;AAAA,IACA,UAAA4M;AAAA,IACA,GAAG3I;AAAA,EACP,GAAKyG,MAAQmC;AAAA,IACT;AAAA,IACA;AAAA,MACE,KAAAnC;AAAA,MACA,GAAG2B;AAAA,MACH,OAAOI;AAAA,MACP,QAAQA;AAAA,MACR,QAAQD;AAAA,MACR,aAAaG,IAAsB,OAAOD,CAAW,IAAI,KAAK,OAAOD,CAAI,IAAIC;AAAA,MAC7E,WAAWX,GAAa,UAAUE,CAAS;AAAA,MAC3C,GAAG,CAACjM,KAAY,CAACoM,GAAYnI,CAAI,KAAK,EAAE,eAAe,OAAM;AAAA,MAC7D,GAAGA;AAAA,IACT;AAAA,IACI;AAAA,MACE,GAAG2I,EAAS,IAAI,CAAC,CAACE,GAAKC,CAAK,MAAMF,GAAcC,GAAKC,CAAK,CAAC;AAAA,MAC3D,GAAG,MAAM,QAAQ/M,CAAQ,IAAIA,IAAW,CAACA,CAAQ;AAAA,IACvD;AAAA,EACA;AACA;ACvCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMgN,KAAmB,CAACC,GAAUL,MAAa;AAC/C,QAAMM,IAAYX;AAAA,IAChB,CAAC,EAAE,WAAAN,GAAW,GAAGzM,EAAK,GAAIkL,MAAQmC,GAAcP,IAAM;AAAA,MACpD,KAAA5B;AAAA,MACA,UAAAkC;AAAA,MACA,WAAWb;AAAA,QACT,UAAUR,GAAYM,GAAaoB,CAAQ,CAAC,CAAC;AAAA,QAC7C,UAAUA,CAAQ;AAAA,QAClBhB;AAAA,MACR;AAAA,MACM,GAAGzM;AAAA,IACT,CAAK;AAAA,EACL;AACE,SAAA0N,EAAU,cAAcrB,GAAaoB,CAAQ,GACtCC;AACT;AC1BA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMC,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAAA,EACzC,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAC3C,GACMC,KAAOJ,GAAiB,QAAQG,EAAU;ACbhD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,oBAAoB,KAAK,SAAQ,CAAE;AAAA,EACjD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAQ,CAAE;AAC1D,GACME,KAASL,GAAiB,UAAUG,EAAU;ACbpD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,yCAAyC,KAAK,SAAQ,CAAE;AAAA,EACtE,CAAC,QAAQ,EAAE,GAAG,sCAAsC,KAAK,SAAQ,CAAE;AAAA,EACnE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AAAA,EAClE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,QAAO,CAAE;AACnE,GACMG,KAASN,GAAiB,WAAWG,EAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACN9C,SAASI,GAAoB/N,GAAiC;;AACnE,QAAM;AAAA,IACJ,QAAAS;AAAA,IACA,OAAAqC;AAAA,IACA,SAAAlC;AAAA,IACA,YAAAE;AAAA,IACA,OAAA/C;AAAA,IACA,cAAAkD;AAAA,IACA,QAAAE;AAAA,IACA,kBAAAE;AAAA,IACA,YAAA+D;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAzB;AAAA,IACA,YAAA0B;AAAA,IACA,aAAAjC;AAAA,IACA,WAAAkC;AAAA,IACA,QAAAyB;AAAA,IACA,mBAAAC;AAAA,EAAA,IACEE,GAAA,GAEE,CAAC6G,GAAcC,CAAe,IAAItN,EAAS,EAAK,GAChD,CAACuN,IAAaC,EAAc,IAAIxN,EAAS,EAAE,GAC3CyN,IAAiB1M,EAAgC,IAAI,GACrD2M,IAAY3M,EAA2B,IAAI,GAC3C4M,IAAqB5M,EAA8B,IAAI,GAEvD,CAAC6M,GAAYC,EAAa,IAAI7N,EAA4C,MAC1E,OAAO,SAAW,MAAoB,EAAE,OAAO,GAAG,QAAQ,EAAA,IACvD,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAA,CACnD,GAEK,CAAC8N,IAAaC,EAAc,IAAI/N,EAAS,CAAC,GAC1C,CAACgO,IAAgBC,EAAiB,IAAIjO,EAAgE,IAAI,GAC1G,CAACkO,IAAkBC,EAAmB,IAAInO,EAAS,EAAK,GACxDoO,IAAmBrN,EAAsB,IAAI,GAC7CsN,KAA+BtN,EAAe4D,CAAU,GACxD2J,KAAmB,KAEnB,CAACC,IAAgBC,EAAiB,IAAIxO,EAAS,CAAC,GAChD,CAACyO,IAAiBC,EAAkB,IAAI1O,EAAwB,IAAI,GACpE,CAAC2O,IAAqBC,EAAsB,IAAI5O,EAAS,EAAK,GAC9D6O,KAAsB9N,EAAsB,IAAI,GAChD+N,IAAwB,MAExBC,IAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAGIC,IAAiBxM,EAAQ,MAAM;;AACnC,UAAMyE,KAAI7I,IAAAoC,KAAA,gBAAAA,EAAQ,kBAAR,gBAAApC,EAAuB;AACjC,WAAI,MAAM,QAAQ6I,CAAC,KAAKA,EAAE,UAAU,IAC3BA,EAAE,MAAM,GAAG,CAAC,EAAE;AAAA,MAAI,CAAChJ,GAAGiG,MAC3B,OAAOjG,KAAM,YAAYA,EAAE,KAAA,IAASA,IAAI8Q,EAAwB7K,CAAC;AAAA,IAAA,IAG9D,CAAC,GAAG6K,CAAuB;AAAA,EACpC,GAAG,EAAC3Q,KAAAoC,KAAA,gBAAAA,EAAQ,kBAAR,gBAAApC,GAAuB,cAAc,CAAC,GAEpC6Q,IAAmB,CAACvR,MAAkB;AAC1C,UAAMyB,IAAI,OAAO,WAAWzB,CAAK;AACjC,WAAK,OAAO,SAASyB,CAAC,IACf,OAAO,KAAK,MAAMA,CAAC,CAAC,IADKzB;AAAA,EAElC,GAEMwR,IAAuB,CAACC,MAA+E;AAC3G,UAAMnF,KAAQmF,KAAmB,CAAA,GAAI,OAAO,CAACC,MAAM;;AACjD,YAAMpR,KAAOI,IAAAgR,KAAA,gBAAAA,EAAG,SAAH,gBAAAhR,EAAS,QAChBV,KAAQ0I,IAAAgJ,KAAA,gBAAAA,EAAG,UAAH,gBAAAhJ,EAAU;AAExB,aADI,GAACpI,KAAQ,CAACN,KACVM,EAAK,kBAAkB;AAAA,IAE7B,CAAC;AACD,WAAKgM,EAAK,SACHA,EAAK,IAAI,CAACoF,MAAM,GAAGA,EAAE,IAAI,KAAKA,EAAE,KAAK,EAAE,EAAE,KAAK,KAAK,IADjC;AAAA,EAE3B,GAEMC,IAAwB,CAAC7N,MAAyC;;AACtE,aAAOpD,IAAAoD,EAAE,YAAF,gBAAApD,EAAW,UAASoD,EAAE,eAAeA,EAAE;AAAA,EAChD,GAEM8N,IAAsB,CAAC9N,MAAyC;AACpE,UAAMxD,IAAOqR,EAAsB7N,CAAC,GAC9BwI,IAAOkF,EAAqB1N,EAAE,eAAe;AACnD,WAAO,CAACxD,GAAMgM,CAAI,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,EAChD,GAEM,CAACuF,GAAWC,CAAY,IAAIxP,EAASF,CAAM,GAC3C2P,IAAgB1O,EAAsB,IAAI,GAE1C2O,IAAc,CAACC,MAAmB;AACtC,UAAMxQ,IAAI,OAAOwQ,CAAM;AACvB,QAAI,CAAC,OAAO,SAASxQ,CAAC,EAAG,QAAOwQ;AAEhC,QAAIrP;AACF,UAAI;AACF,eAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,UAAUA,EAAA,CAAc,EAAE,OAAOnB,CAAC;AAAA,MACjG,QAAQ;AAAA,MAER;AAGF,WAAO,IAAIA,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzB,GAEMb,MAAQ8H,KAAA5F,KAAA,gBAAAA,EAAQ,UAAR,gBAAA4F,GAAe,WAAU,qBACjC7D,KAAgBC,EAAQ,MAAM;AAClC,UAAM5E,IAAM,QAAO4C,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzCrB,IAAI,OAAO,SAASvB,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKuB,CAAC,CAAC;AAAA,EACrC,GAAG,CAACqB,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GACpBoP,KAAoBjL,KAAcpC,IAElCsN,KAASrN,EAAQ,MACd,CAAC,GAAG9B,CAAgB,EAAE,KAAK,CAAC+E,GAAGC,MAAMD,EAAE,YAAY,cAAcC,EAAE,WAAW,CAAC,GACrF,CAAChF,CAAgB,CAAC,GAEfoP,KAAmBtN,EAAQ,MAAM;AACrC,UAAMY,IAAImK,GAAY,KAAA,EAAO,YAAA;AAC7B,QAAI,CAACnK,EAAG,QAAOyM;AAEf,UAAME,IAAS3M,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO,GACtC4M,IAAU,CAACxO,MAA+B;;AAC9C,YAAMyO,IAAkB,CAAA;AACxB,MAAAA,EAAM,KAAKzO,EAAE,WAAW,IACpBpD,IAAAoD,EAAE,YAAF,QAAApD,EAAW,WAAa,KAAKoD,EAAE,QAAQ,KAAK;AAChD,iBAAW4N,KAAK5N,EAAE,mBAAmB,CAAA;AACnC,QAAAyO,EAAM,KAAKb,EAAE,IAAI,GACjBa,EAAM,KAAKb,EAAE,KAAK;AAEpB,YAAMc,IAAWD,EAAM,KAAK,GAAG,EAAE,YAAA;AACjC,aAAOF,EAAO,MAAM,CAACjJ,MAAMoJ,EAAS,SAASpJ,CAAC,CAAC;AAAA,IACjD;AAEA,WAAO+I,GAAO,OAAOG,CAAO;AAAA,EAC9B,GAAG,CAACzC,IAAasC,EAAM,CAAC,GAElBrK,IAAchD,EAAQ,MACnB,CAAC,IAAIhC,KAAA,gBAAAA,EAAQ,UAAS,CAAA,CAAG,EAAE,KAAK,CAACiF,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa,GACjF,CAAClF,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEZ2P,IAAiB3N,EAAQ,MAAM,KAAK,IAAI,GAAGE,IAAciC,CAAU,GAAG,CAACA,GAAYjC,CAAW,CAAC,GAE/FiD,IAAcnD,EAAQ,MAAM;AAChC,QAAI4N,IAAO;AACX,eAAWvN,KAAK2C;AACd,MAAIb,KAAc9B,EAAE,kBAAeuN,IAAOvN;AAE5C,WAAOuN;AAAA,EACT,GAAG,CAACzL,GAAYa,CAAW,CAAC,GAEtBI,IAAyBpD,EAAQ,MAAM;AAC3C,QAAI,CAACmD,EAAa,QAAO;AACzB,UAAME,IAAM,OAAO,WAAWF,EAAY,eAAe;AACzD,WAAI,CAAC,OAAO,SAASE,CAAG,KAAKA,KAAO,IAAU,OACvCA;AAAA,EACT,GAAG,CAACF,CAAW,CAAC,GACV0K,KAAY7K,EAAY,CAAC,GACzB8K,KAA2B,GAAQD,MAAa1L,KAAc0L,GAAU,gBAExEE,KAAW/N,EAAQ,MAAM;AAC7B,UAAM2C,IAAO,IAAI,IAAIzE,EAAiB,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAU,CAAC;AACpE,QAAI8P,IAAQ;AACZ,eAAW,CAACnL,GAAWC,CAAG,KAAK,OAAO,QAAQb,CAAU,GAAG;AACzD,YAAMrB,IAAIkC,KAAO;AACjB,UAAIlC,KAAK,EAAG;AACZ,YAAM5B,IAAI2D,EAAK,IAAIE,CAAS,GACtBE,IAAQ,OAAO/D,KAAA,gBAAAA,EAAG,KAAK;AAC7B,MAAK,OAAO,SAAS+D,CAAK,MAC1BiL,KAASjL,IAAQnC;AAAA,IACnB;AAEA,WAAO,KAAK,MAAMoN,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC9P,GAAkB+D,CAAU,CAAC,GAE3BgM,KAAkBjO,EAAQ,MAAM;AACpC,QAAI,CAACoD,EAAwB,QAAO2K;AACpC,UAAMC,IAAQD,MAAY,IAAI3K,IAAyB;AACvD,WAAO,KAAK,MAAM4K,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC5K,GAAwB2K,EAAQ,CAAC,GAE/BG,KAAclO,EAAQ,MACrBgD,EAAY,SACV,KAAK,IAAI,GAAGA,EAAY,IAAI,CAAC3C,MAAMA,EAAE,aAAa,CAAC,IAD1B,GAE/B,CAAC2C,CAAW,CAAC,GAEVmL,KAAiBnO,EAAQ,MAAM;AACnC,UAAM2C,IAAO,IAAI,IAAIzE,EAAiB,IAAI,CAACc,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,WAAOkD,EACJ,IAAI,CAACW,MAAcF,EAAK,IAAIE,CAAS,CAAC,EACtC,OAAO,CAAC7D,MAA8C,EAAQA,CAAE;AAAA,EACrE,GAAG,CAACd,GAAkBgE,CAAc,CAAC,GAE/BkM,KAAmBpO,EAAQ,MAAM;;AAErC,UAAMqO,wBAAU,IAAA;AAChB,eAAWhO,KAAK2C,GAAa;AAC3B,YAAMsL,IAAM,KAAK,IAAI,GAAGjO,EAAE,gBAAgB,CAAC;AAC3C,MAAAgO,EAAI,IAAIC,GAAK;AAAA,QACX,iBAAiBjO,EAAE;AAAA,QACnB,eAAeA,EAAE;AAAA,QACjB,SAAOzE,IAAAyE,EAAE,UAAF,gBAAAzE,EAAS,WAAU,OAAOyE,EAAE,aAAa;AAAA,MAAA,CACjD;AAAA,IACH;AACA,WAAOgO;AAAA,EACT,GAAG,CAACrL,CAAW,CAAC,GAEVuL,KAAYvO,EAAQ,MAEjB,KAAK,IAAIkO,MAAehO,GAAaiO,GAAe,MAAM,GAChE,CAACA,GAAe,QAAQD,IAAahO,CAAW,CAAC,GAG9C,CAACsO,IAA6BC,EAA8B,IAAIjR,EAAS,EAAI,GAC7EkR,KAAwBnQ,EAAOoP,CAAc;AAGnD,EAAAnP,EAAU,MAAM;AAEd,UADmBR,KAAA,gBAAAA,EAAQ,kBAAiB,mBACzB,wBAAwB;AACzC,YAAM2Q,IAAcD,GAAsB,UAAU;AAGpD,MAEED,GAFE,EAAAE,KAFchB,MAAmB,EAIC;AAAA,IAKxC;AACA,IAAAe,GAAsB,UAAUf;AAAA,EAClC,GAAG,CAACA,GAAgB3P,KAAA,gBAAAA,EAAQ,aAAa,CAAC;AAE1C,QAAM4Q,KAAWrQ,EAA8B,IAAI,GAC7CsQ,KAAUtQ,EAA8B,IAAI,GAC5CuQ,KAAsBvQ,EAA8B,IAAI,GACxDwQ,KAAoBxQ,EAAe4D,CAAU,GAE7C6M,KAA2B,CAACnM,MAAsB;AACtD,UAAMoM,IAAYJ,GAAQ;AAC1B,QAAI,CAACI,EAAW;AAChB,UAAMC,IAAMD,EAAU,cAA2B,sBAAsBpM,CAAS,IAAI;AACpF,QAAI,CAACqM,EAAK;AAEV,UAAMzK,IAAIwK,EAAU,sBAAA,GACd5O,IAAI6O,EAAI,sBAAA,GACRC,IAAU;AAEhB,QADuB9O,EAAE,OAAOoE,EAAE,MAAM0K,KAAW9O,EAAE,UAAUoE,EAAE,SAAS0K,EACtD;AAEpB,UAAMC,IAAS,KAAK,IAAI,GAAGH,EAAU,eAAeA,EAAU,YAAY,GACpEI,KAAmBhP,EAAE,MAAMoE,EAAE,MAAOpE,EAAE,SAAS,GAC/CiP,KAAYL,EAAU,YAAYI,KAAkBJ,EAAU,eAAe,GAC7EM,KAAU,KAAK,IAAIH,GAAQ,KAAK,IAAI,GAAGE,EAAS,CAAC;AACvD,IAAAL,EAAU,SAAS,EAAE,KAAKM,IAAS,UAAU,UAAU;AAAA,EACzD;AAoKA,SAlKA/Q,EAAU,MAAM;AACd,QAAI,CAAClB,EAAQ;AACb,UAAMkS,IAAY,CAACvQ,MAAqB;AACtC,MAAIA,EAAE,QAAQ,YAAUU,EAAA;AAAA,IAC1B;AACA,kBAAO,iBAAiB,WAAW6P,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAC9D,GAAG,CAAC7P,GAAOrC,CAAM,CAAC,GAElBkB,EAAU,MAAM;AACd,QAAI,OAAO,SAAW,IAAa;AACnC,UAAMiR,IAAW,MAAMpE,GAAc,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,aAAa;AAC7F,WAAAoE,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAQ,GACnC,MAAM,OAAO,oBAAoB,UAAUA,CAAQ;AAAA,EAC5D,GAAG,CAAA,CAAE,GAELjR,EAAU,MAAM;AAMd,QALIyO,EAAc,WAAW,SAC3B,OAAO,aAAaA,EAAc,OAAO,GACzCA,EAAc,UAAU,OAGtB3P,GAAQ;AACV,MAAA0P,EAAa,EAAI;AACjB;AAAA,IACF;AAGA,IAAAC,EAAc,UAAU,OAAO,WAAW,MAAM;AAC9C,MAAAD,EAAa,EAAK,GAClBC,EAAc,UAAU;AAAA,IAC1B,GAAG,GAAG;AAAA,EACR,GAAG,CAAC3P,CAAM,CAAC,GAEXkB,EAAU,MACD,MAAM;AACX,IAAIyO,EAAc,WAAW,QAAM,OAAO,aAAaA,EAAc,OAAO;AAAA,EAC9E,GACC,CAAA,CAAE,GAELzO,EAAU,MACD,MAAM;AACX,IAAIoN,EAAiB,WAAW,QAAM,OAAO,aAAaA,EAAiB,OAAO;AAAA,EACpF,GACC,CAAA,CAAE,GAELpN,EAAU,MACD,MAAM;AACX,IAAI6N,GAAoB,WAAW,QAAM,OAAO,aAAaA,GAAoB,OAAO;AAAA,EAC1F,GACC,CAAA,CAAE,GAEL7N,EAAU,MAAM;AAEd,QADI,CAAClB,KACD,CAACuN,EAAc;AACnB,UAAM6E,IAAM,sBAAsB,MAAA;;AAAM,cAAA9T,IAAAqP,EAAe,YAAf,gBAAArP,EAAwB;AAAA,KAAO;AACvE,WAAO,MAAM,qBAAqB8T,CAAG;AAAA,EACvC,GAAG,CAACpS,GAAQuN,CAAY,CAAC,GAEzBrM,EAAU,MAAM;AACd,UAAMqC,IAAOkO,GAAkB;AAI/B,QAHAA,GAAkB,UAAU5M,GAGxBA,KAActB,EAAM;AAExB,UAAMoO,IAAYH,GAAoB;AACtC,QAAI,CAACG,EAAW;AAEhB,UAAMU,IAAe3M,EAAY,KAAK,CAAC3C,MAAMA,EAAE,kBAAkB8B,CAAU,GACrEyN,IAAgB5M,EAAY,KAAK,CAAC3C,MAAMA,EAAE,gBAAgB8B,CAAU,GAIpE0N,IAAYD,KAAiBD,IAAeC,EAAc,gBAAgB,IAAKA,IAAiC,OAAjBzN,IAAa;AAClH,QAAI0N,KAAa,QAAQA,IAAY,EAAG;AAExC,UAAMH,IAAM,sBAAsB,MAAM;AACtC,YAAMI,IAAKb,EAAU,cAA2B,mBAAmBY,CAAS,IAAI;AAChF,UAAI,CAACC,EAAI;AAET,YAAMC,IAAgBd,EAAU,sBAAA,GAE1Be,KADSF,EAAG,sBAAA,EACQ,QAAQC,EAAc;AAGhD,UAAIC,MAAc,EAAG;AAErB,YAAMC,KAAU,KAAK,IAAI,GAAGhB,EAAU,cAAcA,EAAU,WAAW,GACnEiB,KAAW,KAAK,IAAID,IAAS,KAAK,IAAI,GAAGhB,EAAU,aAAae,EAAU,CAAC;AACjF,MAAAf,EAAU,SAAS,EAAE,MAAMiB,IAAU,UAAU,UAAU;AAAA,IAC3D,CAAC;AAED,WAAO,MAAM,qBAAqBR,CAAG;AAAA,EACvC,GAAG,CAACvN,GAAYa,CAAW,CAAC,GAE5BxE,EAAU,MAAM;AACd,QAAI,CAAClB,EAAQ;AAEb,UAAMuD,IAAOgL,GAA6B;AAI1C,QAHAA,GAA6B,UAAU1J,GAGnCA,KAActB,EAAM;AAGxB,UAAMsP,IAAUnN,EAAY,KAAK,CAAC3C,MAAMA,EAAE,kBAAkB8B,CAAU;AACtE,IAAKgO,MAGLjE,GAAmB,kBAAkBO,EAAiB0D,EAAQ,eAAe,CAAC,aAAa,GAC3FnE,GAAkB,CAACoE,MAAMA,IAAI,CAAC,GAC9BhE,GAAuB,EAAI,GACvBC,GAAoB,WAAW,QAAM,OAAO,aAAaA,GAAoB,OAAO,GACxFA,GAAoB,UAAU,OAAO,WAAW,MAAM;AACpD,MAAAD,GAAuB,EAAK,GAC5BC,GAAoB,UAAU;AAAA,IAChC,GAAGC,CAAqB;AAAA,EAC1B,GAAG,CAACnK,GAAY7E,GAAQ0F,CAAW,CAAC,GAEpCxE,EAAU,MAAM;AAGd,QAFI,CAAClB,KACD,CAAC6O,MACD,CAACF,GAAiB;AAGtB,UAAMyD,IAAM,sBAAsB,MAAM;;AACtC,YAAMW,IAASlF,EAAmB,SAC5BmF,IAAOD,KAAA,gBAAAA,EAAQ,yBAGfE,KAAY3U,IAAAgT,GAAS,YAAT,gBAAAhT,EAAkB,yBAC9B4U,IAAUF,IAAOA,EAAK,OAAOA,EAAK,QAAQ,IAAIC,IAAYA,EAAU,OAAOA,EAAU,QAAQ,IAAI,OAAO,aAAa,GACrHE,IAAUH,IAAOA,EAAK,MAAMA,EAAK,SAAS,IAAIC,IAAYA,EAAU,MAAMA,EAAU,SAAS,IAAI,OAAO,cAAc,GAEtHG,IAAS;AAAA,QACb,GAAGF,IAAU;AAAA,QACb,GAAGC,IAAU;AAAA,QACb,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAGL,MAAAhF,GAAkBiF,CAAM,GACxBnF,GAAe,CAAC6E,OAAMA,KAAI,CAAC,GAC3BzE,GAAoB,EAAI,GAEpBC,EAAiB,WAAW,QAAM,OAAO,aAAaA,EAAiB,OAAO,GAClFA,EAAiB,UAAU,OAAO,WAAW,MAAM;AACjD,QAAAD,GAAoB,EAAK,GACzBC,EAAiB,UAAU;AAAA,MAC7B,GAAGE,EAAgB;AAAA,IACrB,CAAC;AAED,WAAO,MAAM,qBAAqB4D,CAAG;AAAA,EACvC,GAAG,CAAC3D,IAAgBE,IAAiBH,IAAkBK,IAAqB7O,CAAM,CAAC,GAEnFkB,EAAU,MAAM;;AACd,IAAKlB,OACL1B,IAAAgT,GAAS,YAAT,QAAAhT,EAAkB;AAAA,EACpB,GAAG,CAAC0B,CAAM,CAAC,GAENyP,IAGH,gBAAA4D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAW;AAAA,MACX,WAAW,CAAChV,EAAO,UAAU2B,IAAS3B,EAAO,eAAeA,EAAO,gBAAgBkB,EAAM,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC5H,aAAa,CAACoC,MAAM;AAClB,QAAIA,EAAE,WAAWA,EAAE,iBAAeU,EAAA;AAAA,MACpC;AAAA,MAEC,UAAA;AAAA,QAAA+L,MAAoBF,MAAkBJ,EAAW,QAAQ,KAAKA,EAAW,SAAS,IACjF,gBAAArH;AAAA,UAACwD;AAAAA,UAAA;AAAA,YAEC,OAAO6D,EAAW;AAAA,YAClB,QAAQA,EAAW;AAAA,YACnB,gBAAAI;AAAA,YACA,QAAQgB;AAAA,YACR,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,eAAe;AAAA,YACf,SAAS;AAAA,YACT,kBAAkB,EAAE,KAAK,KAAK,KAAK,IAAA;AAAA,YACnC,kBAAkB,EAAE,KAAK,IAAI,KAAK,EAAA;AAAA,YAClC,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,eAAe,QAAQ,QAAQ,WAAA;AAAA,UAAW;AAAA,UAX3ElB;AAAA,QAAA,IAaL;AAAA,QACJ,gBAAAqF,EAAC,WAAM,KAAK/B,IAAU,WAAW,CAACjT,EAAO,OAAO2B,IAAS3B,EAAO,YAAYA,EAAO,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,UAAU,IAClI,UAAA;AAAA,UAAAwQ,MAAuBF,KACtB,gBAAAlI,EAAC,OAAA,EAAI,WAAWpI,EAAO,oBAAoB,eAAY,QACrD,UAAA,gBAAAoI,EAAC,OAAA,EAAyB,KAAKoH,GAAoB,WAAWxP,EAAO,iBAClE,UAAAsQ,GAAA,GADOF,EAEV,GACF,IACE;AAAA,4BACH,UAAA,EAAO,WAAW,CAACpQ,EAAO,QAAQkP,IAAelP,EAAO,mBAAmB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACxG,UAAA;AAAA,YAAA,gBAAAoI;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAWpI,EAAO;AAAA,gBAClB,cAAYkP,IAAe,sBAAsB;AAAA,gBACjD,iBAAeA;AAAA,gBACf,SAAS,MAAM;AACb,kBAAAC,EAAgB,EAAI;AAAA,gBACtB;AAAA,gBAEA,UAAA,gBAAA/G,EAAC2G,IAAA,EAAO,MAAM,IAAI,eAAY,OAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGvC,gBAAAiG,EAAC,OAAA,EAAI,WAAWhV,EAAO,cACrB,UAAA;AAAA,cAAA,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,iBAAiB,eAAakP,GACnD,UAAA,gBAAA9G,EAAC,MAAA,EAAG,WAAWpI,EAAO,OAAQ,UAAAG,EAAA,CAAM,GACtC;AAAA,cAEA,gBAAAiI,EAAC,OAAA,EAAI,WAAWpI,EAAO,kBAAkB,eAAa,CAACkP,GACrD,UAAA,gBAAA8F,EAAC,OAAA,EAAI,WAAWhV,EAAO,WACrB,UAAA;AAAA,gBAAA,gBAAAoI;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAKkH;AAAA,oBACL,WAAWtP,EAAO;AAAA,oBAClB,MAAK;AAAA,oBACL,OAAOoP;AAAA,oBACP,aAAY;AAAA,oBACZ,UAAU,CAAC9L,MAAM+L,GAAe/L,EAAE,OAAO,KAAK;AAAA,oBAC9C,QAAQ,MAAM;AACZ,sBAAI8L,GAAY,KAAA,MAAW,QAAoB,EAAK;AAAA,oBACtD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEDA,GAAY,SACX,gBAAAhH;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAWpI,EAAO;AAAA,oBAClB,aAAa,CAACsD,MAAM;AAElB,sBAAAA,EAAE,eAAA;AAAA,oBACJ;AAAA,oBACA,SAAS,MAAM;;AACb,sBAAA+L,GAAe,EAAE,IACjBpP,IAAAqP,EAAe,YAAf,QAAArP,EAAwB;AAAA,oBAC1B;AAAA,oBACA,cAAW;AAAA,oBACZ,UAAA;AAAA,kBAAA;AAAA,gBAAA,IAGC;AAAA,cAAA,EAAA,CACN,EAAA,CACF;AAAA,YAAA,GACF;AAAA,YAEA,gBAAAmI,EAAC,UAAA,EAAO,MAAK,UAAS,SAASpE,GAAO,UAAUhC,GAAY,WAAWhC,EAAO,aAAa,cAAW,SAAQ,UAAA,IAAA,CAE9G;AAAA,UAAA,GACF;AAAA,4BAEC,OAAA,EAAI,WAAWA,EAAO,MAAM,KAAKkT,IAC/B,UAAA;AAAA,YAAApR,sBAAW,KAAA,EAAE,WAAW9B,EAAO,OAAO,sBAAQ,IAAO;AAAA,YACrDf,IAAQ,gBAAAmJ,EAAC,KAAA,EAAE,WAAWpI,EAAO,OAAQ,aAAM,IAAO;AAAA,YAEnD,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,UACrB,UAAA,gBAAAoI,EAAC,MAAA,EAAG,WAAWpI,EAAO,aACnB,UAAA2R,GAAiB,IAAI,CAACtO,MAAM;;AAC3B,oBAAM8D,IAAMb,EAAWjD,EAAE,EAAE,KAAK,GAC1B4R,IAAqB/D,EAAsB7N,CAAC,GAC5C6R,IAAoBnE,EAAqB1N,EAAE,eAAe,GAC1D8R,IAAchE,EAAoB9N,CAAC,GAGnC+R,IAAuB3N,GACvB4N,IAAsB,OAAOhS,EAAE,KAAK,GACpCiS,IACJF,KAAwB,QACxB,OAAO,SAASA,CAAoB,KACpCA,IAAuB,KACvB,OAAO,SAASC,CAAmB,GAC/BE,KAAwBD,IAC1B,KAAK,MAAMD,KAAuB,IAAID,IAAuB,OAAO,GAAG,IAAI,MAC3E;AAEJ,qBACE,gBAAAJ;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAW,CAAChV,EAAO,YAAYqD,EAAE,qBAAqB,MAASrD,EAAO,iBAAiB,EACpF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBACX,oBAAkBqD,EAAE;AAAA,kBAEpB,UAAA;AAAA,oBAAA,gBAAA2R,EAAC,OAAA,EAAI,WAAWhV,EAAO,aACrB,UAAA;AAAA,sBAAA,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,cAAc,eAAY,QAC9C,WAAAC,KAAAoD,EAAE,UAAF,QAAApD,GAAS,MACR,gBAAAmI;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAWpI,EAAO;AAAA,0BAClB,KAAKqD,EAAE,MAAM;AAAA,0BACb,KAAKA,EAAE,MAAM,WAAW8R;AAAA,0BACxB,SAAQ;AAAA,wBAAA;AAAA,sBAAA,IAGV,gBAAA/M,EAAC,OAAA,EAAI,WAAWpI,EAAO,sBAAuB,YAAAwV,MAAA5M,MAAAX,KAAA5E,EAAE,YAAF,gBAAA4E,GAAW,UAAX,gBAAAW,GAAkB,MAAM,GAAG,OAA3B,gBAAA4M,GAA+B,kBAAiB,KAAI,GAEtG;AAAA,sBAEA,gBAAAR,EAAC,OAAA,EAAI,WAAWhV,EAAO,aACrB,UAAA;AAAA,wBAAA,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,aAAc,UAAAiV,GAAmB;AAAA,wBACvDC,IAAoB,gBAAA9M,EAAC,OAAA,EAAI,WAAWpI,EAAO,aAAc,aAAkB,IAAS;AAAA,wBACrF,gBAAAgV,EAAC,OAAA,EAAI,WAAWhV,EAAO,iBACpB,UAAA;AAAA,0BAAAsV,sBACE,QAAA,EAAK,WAAWtV,EAAO,kBACrB,YAAY,OAAO,SAASqV,CAAmB,IAAIA,EAAoB,QAAQ,CAAC,IAAIhS,EAAE,KAAK,GAC9F,IACE;AAAA,0BACJ,gBAAA+E,EAAC,QAAA,EAAK,WAAWpI,EAAO,cACrB,UAAAuR;AAAA,4BACCgE,MAAyB,OACrBA,GAAsB,QAAQ,CAAC,IAC/B,OAAO,SAASF,CAAmB,IACjCA,EAAoB,QAAQ,CAAC,IAC7BhS,EAAE;AAAA,0BAAA,EACV,CACF;AAAA,wBAAA,EAAA,CACF;AAAA,sBAAA,EAAA,CACF;AAAA,oBAAA,GACF;AAAA,oBACCA,EAAE,qBAAqB,KACtB,gBAAA+E,EAAC,OAAA,EAAI,WAAWpI,EAAO,kBACrB,UAAA,gBAAAgV,EAAC,QAAA,EAAK,WAAWhV,EAAO,SAAS,cAAY,GAAGmV,CAAW,gBAAgB,UAAA;AAAA,sBAAA;AAAA,wCACpE,MAAA,EAAG;AAAA,sBAAE;AAAA,oBAAA,EAAA,CACZ,EAAA,CACF,IACEhO,KAAO,IACT,gBAAAiB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAMtD,EAAYzB,EAAE,IAAI,CAAC;AAAA,wBAClC,UAAUrB,KAAcyP;AAAA,wBACxB,WAAWzR,EAAO;AAAA,wBAClB,cAAY,OAAOmV,CAAW;AAAA,wBAC/B,UAAA;AAAA,sBAAA;AAAA,oBAAA,IAID,gBAAAH,EAAC,OAAA,EAAI,WAAWhV,EAAO,aACrB,UAAA;AAAA,sBAAA,gBAAAoI;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAMtD,EAAYzB,EAAE,IAAI8D,IAAM,CAAC;AAAA,0BACxC,UAAUnF,KAAcmF,KAAO;AAAA,0BAC/B,WAAWnH,EAAO;AAAA,0BAClB,cAAY,YAAYmV,CAAW;AAAA,0BACpC,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGD,gBAAA/M,EAAC,UAAK,WAAWpI,EAAO,UAAU,cAAY,YAAYmH,CAAG,IAC1D,UAAAA,EAAA,CACH;AAAA,sBACA,gBAAAiB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAMtD,EAAYzB,EAAE,IAAI8D,IAAM,CAAC;AAAA,0BACxC,UAAUnF,KAAcyP;AAAA,0BACxB,WAAWzR,EAAO;AAAA,0BAClB,cAAY,YAAYmV,CAAW;AAAA,0BACpC,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAED,EAAA,CACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAhFG9R,EAAE;AAAA,cAAA;AAAA,YAoFb,CAAC,GACH,EAAA,CACF;AAAA,UAAA,GACF;AAAA,4BAEC,UAAA,EAAO,WAAWrD,EAAO,QAAQ,KAAKuP,GACrC,UAAA;AAAA,YAAA,gBAAAnH,EAAC,OAAA,EAAI,WAAWpI,EAAO,kBAAkB,KAAKmT,IAC5C,UAAA,gBAAA/K,EAAC,OAAA,EAAI,WAAWpI,EAAO,eAAe,cAAW,sBAC9C,UAAA,MAAM,KAAK,EAAE,QAAQ4S,GAAA,CAAW,EAAE,IAAI,CAAClN,GAAGiN,MAAQ;;AACjD,oBAAM8C,IAAUjD,GAAeG,CAAG,GAC5B+C,IAAYjD,GAAiB,IAAIE,CAAG,GACpCgD,IAAW,EAAQF,GAGnBG,IAAc,EAAQF,GACtBG,IAAgBD,KAAe,CAACD,GAChCG,IAAeJ,IAAY,GAAGA,EAAU,eAAe,UAAU,MAEjEK,KAAYJ,IAAWF,EAAS,cAAc,QAAQ9C,IAAM,CAAC;AAEnE,uCACG,OAAA,EAAc,iBAAeA,GAAK,WAAW3S,EAAO,SACnD,UAAA;AAAA,gBAAA,gBAAAoI;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAW;AAAA,sBACTpI,EAAO;AAAA,sBACP2V,IAAW3V,EAAO,gBAAgBA,EAAO;AAAA,sBACzC4V,IAAc5V,EAAO,mBAAmB;AAAA,sBACxC2V,IAAW3V,EAAO,mBAAmB;AAAA,oBAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,oBACX,MAAM2V,IAAW,WAAW;AAAA,oBAC5B,UAAUA,IAAW,IAAI;AAAA,oBACzB,SAASA,IAAW,MAAMtC,GAAyBoC,EAAS,EAAE,IAAI;AAAA,oBAClE,WACEE,IACI,CAACrS,OAAM;AACP,uBAAIA,GAAE,QAAQ,WAAWA,GAAE,QAAQ,SACjCA,GAAE,eAAA,GACF+P,GAAyBoC,EAAS,EAAE;AAAA,oBAExC,IACE;AAAA,oBAEN,cAAYI,KAAiBC,IAAe,GAAGC,EAAS,aAAaD,CAAY,MAAMC;AAAA,oBACvF,OAAOF,KAAiBC,IAAe,GAAGC,EAAS,cAAcD,CAAY,KAAKC;AAAA,oBAEjF,UAAAJ,KACC1V,KAAAwV,EAAS,UAAT,QAAAxV,GAAgB,MACd,gBAAAmI;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAWpI,EAAO;AAAA,wBAClB,KAAKyV,EAAS,MAAO;AAAA,wBACrB,KAAKA,EAAS,MAAO,WAAWA,EAAS;AAAA,wBACzC,SAAQ;AAAA,sBAAA;AAAA,oBAAA,IAGV,gBAAArN,EAAC,OAAA,EAAI,WAAWpI,EAAO,iBAAiB,eAAY,QACjD,YAAAwV,MAAA5M,MAAAX,KAAAwN,EAAS,YAAT,gBAAAxN,GAAkB,UAAlB,gBAAAW,GAAyB,MAAM,GAAG,OAAlC,gBAAA4M,GAAsC,kBAAiB,KAC1D,IAEAK,KAAiBC,IACnB,gBAAA1N,EAAC,OAAA,EAAI,WAAWpI,EAAO,qBAAsB,UAAA8V,EAAA,CAAa,IAE1D,gBAAA1N,EAAC,SAAI,WAAWpI,EAAO,aAAa,eAAY,QAAO,UAAA,IAAA,CAEvD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIH4V,sBAAe,OAAA,EAAI,WAAW5V,EAAO,mBAAoB,UAAA0V,EAAW,OAAM,IAAS;AAAA,cAAA,EAAA,GAhD5E/C,CAiDV;AAAA,YAEJ,CAAC,GACH,GACF;AAAA,YACA,gBAAAvK;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW,CAACpI,EAAO,eAAemS,KAA2BnS,EAAO,uBAAuB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,gBACzH,eAAa,CAACmS;AAAA,gBAEd,4BAAC,OAAA,EAAI,WAAWnS,EAAO,WAAW,cAAW,UAC1C,UAAA;AAAA,kBAAAyH,IACC,gBAAAuN,EAAC,QAAA,EAAK,WAAWhV,EAAO,kBACrB,UAAA;AAAA,oBAAAyH;AAAA,oBAAuB;AAAA,kBAAA,EAAA,CAC1B,sBAEC,QAAA,EAAK;AAAA,kBAGR,gBAAAW,EAAC,QAAA,EACE,UAAAX,IACC,gBAAAuN,EAAAgB,IAAA,EACE,UAAA;AAAA,oBAAA,gBAAA5N,EAAC,QAAA,EAAK,WAAWpI,EAAO,iBAAkB,YAAYoS,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,oBAAQ;AAAA,oBACnF,gBAAAhK,EAAC,QAAA,EAAK,WAAWpI,EAAO,gBAAiB,YAAYsS,GAAgB,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,kBAAA,EAAA,CACnF,IAEA,gBAAAlK,EAAC,QAAA,EAAK,WAAWpI,EAAO,gBAAiB,UAAAuR,EAAYa,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE,EAAA,CAE9E;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,aAGA,MAAM;AACN,oBAAM6D,KAAa5T,KAAA,gBAAAA,EAAQ,kBAAiB;AAC5C,qBAAI4T,MAAe,yBAGbjE,IAAiB,IAEjB,gBAAA5J,EAAC,YAAO,MAAK,UAAS,SAASF,IAAQ,UAAU,CAACzB,GAAW,WAAWzG,EAAO,KAC5E,UAAAgC,IAAa,YAAY,OAAOgQ,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,GAAA,CAChG,IAKF,gBAAAgD,EAAC,OAAA,EAAI,WAAW,GAAGhV,EAAO,cAAc,IAAI6S,KAA8B7S,EAAO,0BAA0B,EAAE,IAC3G,UAAA;AAAA,gBAAA,gBAAAoI;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASF;AAAA,oBACT,UAAU,CAACzB;AAAA,oBACX,WAAW,GAAGzG,EAAO,WAAW,IAAI6S,KAA8B7S,EAAO,uBAAuB,EAAE;AAAA,oBAElG,UAAA,gBAAAoI,EAAC,QAAA,EAAM,UAAApG,IAAa,YAAY,gBAAA,CAAgB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAElD,gBAAAoG;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASD;AAAA,oBACT,UAAU,CAAC1B;AAAA,oBACX,WAAW,GAAGzG,EAAO,YAAY,IAAI6S,KAA8B7S,EAAO,wBAAwB,EAAE;AAAA,oBAEpG,UAAA,gBAAAoI,EAAC,QAAA,EAAM,UAAApG,IAAa,gBAAgB,WAAA,CAAW;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACjD,GACF,IAIAiU,MAAe,aAEf,gBAAA7N,EAAC,UAAA,EAAO,MAAK,UAAS,SAASD,IAAmB,UAAU,CAAC1B,GAAW,WAAWzG,EAAO,KACvF,cAAa,gBAAgBgS,IAAiB,IAAI,OAAOA,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,KAAK,WAAA,CAC9H,IAMF,gBAAA5J,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,IAAQ,UAAU,CAACzB,GAAW,WAAWzG,EAAO,KAC5E,cAAa,YAAYgS,IAAiB,IAAI,OAAOA,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,KAAK,gBAAA,CAC1H;AAAA,YAEJ,GAAA;AAAA,YAEA,gBAAAgD,EAAC,OAAA,EAAI,WAAWhV,EAAO,WAAW,UAAA;AAAA,cAAA;AAAA,cACrB,gBAAAoI,EAAC,OAAE,MAAK,yCAAwC,QAAO,UAAS,KAAI,uBAAsB,UAAA,eAAA,CAAY;AAAA,YAAA,EAAA,CACnH;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAvWmB;AA0WzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjxBO,SAAS8N,GAAmBhV,GAAgC;;AACjE,QAAM;AAAA,IACJ,SAAAY;AAAA,IACA,YAAAE;AAAA,IACA,OAAA/C;AAAA,IACA,cAAAkD;AAAA,IACA,QAAAE;AAAA,IACA,kBAAAE;AAAA,IACA,YAAA+D;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAzB;AAAA,IACA,YAAA0B;AAAA,IACA,aAAAjC;AAAA,IACA,WAAAkC;AAAA,IACA,QAAAyB;AAAA,IACA,mBAAAC;AAAA,EAAA,IACEE,GAAA,GAEE;AAAA,IACJ,WAAAsF;AAAA,IACA,WAAAwI,KAAY;AAAA,IACZ,cAAAC,IAAe;AAAA,EAAA,IACblV,GAEE4P,IAAmB,CAACvR,MAAkB;AAC1C,UAAMyB,IAAI,OAAO,WAAWzB,CAAK;AACjC,WAAK,OAAO,SAASyB,CAAC,IACf,OAAO,KAAK,MAAMA,CAAC,CAAC,IADKzB;AAAA,EAElC,GAEMwR,KAAuB,CAACC,MAA+E;AAC3G,UAAMnF,KAAQmF,KAAmB,CAAA,GAAI,OAAO,CAAC,MAAM;;AACjD,YAAMnR,KAAOI,IAAA,uBAAG,SAAH,gBAAAA,EAAS,QAChBV,KAAQ0I,IAAA,uBAAG,UAAH,gBAAAA,EAAU;AAExB,aADI,GAACpI,KAAQ,CAACN,KACVM,EAAK,kBAAkB;AAAA,IAE7B,CAAC;AACD,WAAKgM,EAAK,SACHA,EAAK,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,KAAK,IADjC;AAAA,EAE3B,GAEM0F,KAAc,CAACC,MAAmB;AACtC,UAAMxQ,IAAI,OAAOwQ,CAAM;AACvB,QAAI,CAAC,OAAO,SAASxQ,CAAC,EAAG,QAAOwQ;AAChC,QAAIrP;AACF,UAAI;AACF,eAAO,IAAI,KAAK,aAAa,QAAW,EAAE,OAAO,YAAY,UAAUA,EAAA,CAAc,EAAE,OAAOnB,CAAC;AAAA,MACjG,QAAQ;AAAA,MAER;AAEF,WAAO,IAAIA,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzB,GAEMqV,IAAiBhS,EAAQ,MACtB,CAAC,GAAG9B,CAAgB,EAAE,KAAK,CAAC+E,GAAGC,MAAMD,EAAE,YAAY,cAAcC,EAAE,WAAW,CAAC,GACrF,CAAChF,CAAgB,CAAC,GAEf8E,IAAchD,EAAQ,MACnB,CAAC,IAAIhC,KAAA,gBAAAA,EAAQ,UAAS,CAAA,CAAG,EAAE,KAAK,CAACiF,GAAGC,MAAMD,EAAE,gBAAgBC,EAAE,aAAa,GACjF,CAAClF,KAAA,gBAAAA,EAAQ,KAAK,CAAC,GAEZ2P,IAAiB3N,EAAQ,MAAM,KAAK,IAAI,GAAGE,IAAciC,CAAU,GAAG,CAACA,GAAYjC,CAAW,CAAC,GAE/FiD,IAAcnD,EAAQ,MAAM;AAChC,QAAI4N,IAAO;AACX,eAAWvN,KAAK2C;AACd,MAAIb,KAAc9B,EAAE,kBAAeuN,IAAOvN;AAE5C,WAAOuN;AAAA,EACT,GAAG,CAACzL,GAAYa,CAAW,CAAC,GAEtBI,KAAyBpD,EAAQ,MAAM;AAC3C,QAAI,CAACmD,EAAa,QAAO;AACzB,UAAME,IAAM,OAAO,WAAWF,EAAY,eAAe;AACzD,WAAI,CAAC,OAAO,SAASE,CAAG,KAAKA,KAAO,IAAU,OACvCA;AAAA,EACT,GAAG,CAACF,CAAW,CAAC,GACV0K,KAAY7K,EAAY,CAAC,GACzB8K,KAA2B,GAAQD,MAAa1L,KAAc0L,GAAU,gBAExEE,KAAW/N,EAAQ,MAAM;AAC7B,UAAM2C,IAAO,IAAI,IAAIzE,EAAiB,IAAI,CAACc,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,QAAIgP,IAAQ;AACZ,eAAW,CAACnL,GAAWC,CAAG,KAAK,OAAO,QAAQb,CAAU,GAAG;AACzD,YAAMrB,IAAIkC,KAAO;AACjB,UAAIlC,KAAK,EAAG;AACZ,YAAM5B,IAAI2D,EAAK,IAAIE,CAAS,GACtBE,IAAQ,OAAO/D,KAAA,gBAAAA,EAAG,KAAK;AAC7B,MAAK,OAAO,SAAS+D,CAAK,MAC1BiL,KAASjL,IAAQnC;AAAA,IACnB;AACA,WAAO,KAAK,MAAMoN,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC9P,GAAkB+D,CAAU,CAAC,GAE3BgM,KAAkBjO,EAAQ,MAAM;AACpC,QAAI,CAACoD,GAAwB,QAAO2K;AACpC,UAAMC,IAAQD,MAAY,IAAI3K,KAAyB;AACvD,WAAO,KAAK,MAAM4K,IAAQ,GAAG,IAAI;AAAA,EACnC,GAAG,CAAC5K,IAAwB2K,EAAQ,CAAC,GAE/BG,KAAclO,EAAQ,MACrBgD,EAAY,SACV,KAAK,IAAI,GAAGA,EAAY,IAAI,CAAC3C,MAAMA,EAAE,aAAa,CAAC,IAD1B,GAE/B,CAAC2C,CAAW,CAAC,GAEVmL,KAAiBnO,EAAQ,MAAM;AACnC,UAAM2C,IAAO,IAAI,IAAIzE,EAAiB,IAAI,CAACc,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAU,CAAC;AACpE,WAAOkD,EACJ,IAAI,CAACW,MAAcF,EAAK,IAAIE,CAAS,CAAC,EACtC,OAAO,CAAC7D,MAA8C,EAAQA,CAAE;AAAA,EACrE,GAAG,CAACd,GAAkBgE,CAAc,CAAC,GAE/BkM,IAAmBpO,EAAQ,MAAM;;AACrC,UAAMqO,wBAAU,IAAA;AAChB,eAAWhO,KAAK2C,GAAa;AAC3B,YAAMsL,IAAM,KAAK,IAAI,GAAGjO,EAAE,gBAAgB,CAAC;AAC3C,MAAAgO,EAAI,IAAIC,GAAK;AAAA,QACX,iBAAiBjO,EAAE;AAAA,QACnB,eAAeA,EAAE;AAAA,QACjB,SAAOzE,IAAAyE,EAAE,UAAF,gBAAAzE,EAAS,WAAU,OAAOyE,EAAE,aAAa;AAAA,MAAA,CACjD;AAAA,IACH;AACA,WAAOgO;AAAA,EACT,GAAG,CAACrL,CAAW,CAAC,GAEVjD,KAAgBC,EAAQ,MAAM;AAClC,UAAM5E,IAAM,QAAO4C,KAAA,gBAAAA,EAAQ,kBAAiB,GAAG,GACzCrB,IAAI,OAAO,SAASvB,CAAG,IAAI,KAAK,MAAMA,CAAG,IAAI;AACnD,WAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKuB,CAAC,CAAC;AAAA,EACrC,GAAG,CAACqB,KAAA,gBAAAA,EAAQ,aAAa,CAAC,GAEpBlC,OAAQF,KAAAoC,KAAA,gBAAAA,EAAQ,UAAR,gBAAApC,GAAe,WAAU,qBAEjC2S,KAAYvO,EAAQ,MACjB,KAAK,IAAIkO,MAAehO,GAAaiO,GAAe,MAAM,GAChE,CAACA,GAAe,QAAQD,IAAahO,CAAW,CAAC,GAE9CkN,KAAoBjL,KAAcpC,IAElCkS,KAAc1T,EAA8B,IAAI,GAChDuQ,KAAsBvQ,EAA8B,IAAI,GACxDwQ,KAAoBxQ,EAAe4D,CAAU;AAEnD,EAAA3D,EAAU,MAAM;AACd,UAAMqC,IAAOkO,GAAkB;AAG/B,QAFAA,GAAkB,UAAU5M,GAExBA,KAActB,EAAM;AAExB,UAAMoO,IAAYH,GAAoB;AACtC,QAAI,CAACG,EAAW;AAEhB,UAAMU,IAAe3M,EAAY,KAAK,CAAC3C,MAAMA,EAAE,kBAAkB8B,CAAU,GACrEyN,IAAgB5M,EAAY,KAAK,CAAC3C,MAAMA,EAAE,gBAAgB8B,CAAU,GACpE0N,IAAYD,KAAiBD,IAAeC,EAAc,gBAAgB,IAAKA,IAAiC,OAAjBzN,IAAa;AAClH,QAAI0N,KAAa,QAAQA,IAAY,EAAG;AAExC,UAAMH,IAAM,sBAAsB,MAAM;AACtC,YAAMI,IAAKb,EAAU,cAA2B,mBAAmBY,CAAS,IAAI;AAChF,UAAI,CAACC,EAAI;AAET,YAAMC,IAAgBd,EAAU,sBAAA,GAE1Be,IADSF,EAAG,sBAAA,EACQ,QAAQC,EAAc;AAEhD,UAAIC,KAAc,EAAG;AAErB,YAAMC,IAAU,KAAK,IAAI,GAAGhB,EAAU,cAAcA,EAAU,WAAW,GACnEiB,IAAW,KAAK,IAAID,GAAS,KAAK,IAAI,GAAGhB,EAAU,aAAae,CAAU,CAAC;AACjF,MAAAf,EAAU,SAAS,EAAE,MAAMiB,GAAU,UAAU,UAAU;AAAA,IAC3D,CAAC;AAED,WAAO,MAAM,qBAAqBR,CAAG;AAAA,EACvC,GAAG,CAACvN,GAAYa,CAAW,CAAC;AAC5B,QAAMgM,KAA2B,CAACnM,MAAsB;AACtD,UAAMoM,IAAYgD,GAAY;AAC9B,QAAI,CAAChD,EAAW;AAChB,UAAMC,IAAMD,EAAU,cAA2B,sBAAuBpM,CAAS,IAAK;AACtF,IAAKqM,KACLA,EAAI,eAAe,EAAE,UAAU,UAAU,OAAO,WAAW;AAAA,EAC7D;AAEA,SACE,gBAAAyB,EAAC,WAAA,EAAQ,WAAW,CAAChV,EAAO,OAAO2N,EAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAG,aAAW7L,GAClF,UAAA;AAAA,IAAA,gBAAAsG,EAAC,UAAA,EAAO,WAAWpI,EAAO,QACxB,UAAA,gBAAAoI,EAAC,QAAG,WAAWpI,EAAO,OAAQ,UAAAG,GAAA,CAAM,GACtC;AAAA,IAEC2B,IAAU,gBAAAsG,EAAC,OAAA,EAAI,WAAWpI,EAAO,QAAQ,sBAAQ,IAAS;AAAA,IAC1Df,IAAQ,gBAAAmJ,EAAC,OAAA,EAAI,WAAWpI,EAAO,OAAQ,aAAM,IAAS;AAAA,IACtD,CAAC8B,KAAWO,KAAU,CAACA,EAAO,WAC7B,gBAAA+F,EAAC,OAAA,EAAI,WAAWpI,EAAO,UAAU,UAAA,0BAAA,CAAuB,IACtD;AAAA,IAEHmW,MAAa9O,EAAY,SACxB,gBAAAe,EAAC,OAAA,EAAI,WAAWpI,EAAO,SACrB,UAAA,gBAAAgV,EAAC,OAAA,EAAI,WAAWhV,EAAO,aACrB,UAAA;AAAA,MAAA,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,gBACpB,gBAAM,KAAK,EAAE,QAAQuS,GAAA,CAAa,EAAE,IAAI,CAAC7M,GAAGiN,MAAQ;AACnD,cAAM4D,IAAY5D,IAAM,GAClB6D,IAAcnP,EAAY,KAAK,CAAC3C,MAAMA,EAAE,kBAAkB6R,CAAS,GACnExO,IAAgByO,IAAc,GAAG1F,EAAiB0F,EAAY,eAAe,CAAC,UAAU;AAE9F,eACE,gBAAApO,EAAC,OAAA,EAAoB,WAAWpI,EAAO,oBACpC,UAAA+H,IAAgB,gBAAAK,EAAC,QAAA,EAAK,WAAWpI,EAAO,gBAAiB,UAAA+H,GAAc,IAAU,QAD1EwO,CAEV;AAAA,MAEJ,CAAC,EAAA,CACH;AAAA,MACA,gBAAAnO,EAAC,OAAA,EAAI,WAAWpI,EAAO,eACpB,UAAA,MAAM,KAAK,EAAE,QAAQuS,IAAa,EAAE,IAAI,CAAC7M,GAAGiN,MAAQ;AACnD,cAAM4D,IAAY5D,IAAM,GAClBgD,IAAWnP,KAAc+P;AAE/B,eACE,gBAAAnO;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,cACTpI,EAAO;AAAA,cACP2V,IAAW3V,EAAO,kBAAkBA,EAAO;AAAA,YAAA,EAE1C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UAAA;AAAA,UANNuW;AAAA,QAAA;AAAA,MASX,CAAC,EAAA,CACH;AAAA,IAAA,EAAA,CACF,GACF,IACE;AAAA,IAEHH,IACC,gBAAApB,EAAC,OAAA,EAAI,WAAWhV,EAAO,SAAS,KAAKsW,IACnC,UAAA;AAAA,MAAA,gBAAAlO,EAAC,OAAA,EAAI,WAAWpI,EAAO,cAAc,UAAA,gBAAY;AAAA,MACjD,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,UACrB,UAAA,gBAAAoI,EAAC,MAAA,EAAG,WAAWpI,EAAO,aACnB,UAAAqW,EAAe,IAAI,CAACZ,MAAY;;AAC/B,cAAMtO,IAAMb,EAAWmP,EAAQ,EAAE,KAAK,GAChC9O,IAAUoK,GAAqB0E,EAAQ,eAAe,GACtDgB,IAAgBhB,EAAQ,qBAAqB,IAC7CiB,IAAc,CAACD,KAAiB,CAAChF;AAEvC,eACE,gBAAAuD;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA,cACThV,EAAO;AAAA,cACP0W,IAAc1W,EAAO,wBAAwB;AAAA,cAC7CmH,IAAM,IAAInH,EAAO,qBAAqB;AAAA,cACtCyW,IAAgBzW,EAAO,oBAAoB;AAAA,YAAA,EAE1C,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,oBAAkByV,EAAQ;AAAA,YAC1B,MAAMiB,IAAc,WAAW;AAAA,YAC/B,UAAUA,IAAc,IAAI;AAAA,YAC5B,SACEA,IACI,MAAM;AACN,cAAA5R,EAAY2Q,EAAQ,IAAItO,IAAM,CAAC;AAAA,YACjC,IACE;AAAA,YAEN,WACEuP,IACI,CAACpT,MAAM;AACP,eAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACFwB,EAAY2Q,EAAQ,IAAItO,IAAM,CAAC,GAC/BkM,GAAyBoC,EAAQ,EAAE;AAAA,YAEvC,IACE;AAAA,YAEN,cACEgB,IACI,GAAGhB,EAAQ,WAAW,iBACtB,OAAOA,EAAQ,WAAW;AAAA,YAGhC,UAAA;AAAA,cAAA,gBAAArN,EAAC,SAAI,WAAWpI,EAAO,cACpB,WAAAC,IAAAwV,EAAQ,UAAR,QAAAxV,EAAe,MACd,gBAAAmI;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKqN,EAAQ,MAAM;AAAA,kBACnB,KAAKA,EAAQ,MAAM,WAAWA,EAAQ;AAAA,kBACtC,OAAOA,EAAQ,MAAM,SAAS;AAAA,kBAC9B,QAAQA,EAAQ,MAAM,UAAU;AAAA,kBAChC,WAAWzV,EAAO;AAAA,kBAClB,SAAQ;AAAA,gBAAA;AAAA,cAAA,IAGV,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,sBAAsB,kBAAI,GAErD;AAAA,cACA,gBAAAgV,EAAC,OAAA,EAAI,WAAWhV,EAAO,gBACrB,UAAA;AAAA,gBAAA,gBAAAgV,EAAC,OAAA,EAAI,WAAWhV,EAAO,eACrB,UAAA;AAAA,kBAAA,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,cAAe,YAAQ,aAAY;AAAA,kBACzD2G,IAAU,gBAAAyB,EAAC,OAAA,EAAI,WAAWpI,EAAO,aAAc,aAAQ,IAAS;AAAA,gBAAA,GACnE;AAAA,gBACA,gBAAAgV,EAAC,OAAA,EAAI,WAAWhV,EAAO,kBACrB,UAAA;AAAA,kBAAA,gBAAAoI,EAAC,SAAI,WAAWpI,EAAO,cAAe,UAAAuR,GAAYkE,EAAQ,KAAK,GAAE;AAAA,kBACjE,gBAAArN,EAAC,SAAI,WAAWpI,EAAO,gBACpB,UAAAyW,IACC,gBAAArO,EAAC,OAAA,EAAI,WAAWpI,EAAO,SAAS,cAAY,GAAGyV,EAAQ,WAAW,gBAAgB,UAAA,WAAA,CAElF,IAEA,gBAAAT,EAAC,OAAA,EAAI,WAAWhV,EAAO,YACpB,UAAA;AAAA,oBAAAmH,IAAM,IACL,gBAAAiB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,WAAWpI,EAAO;AAAA,wBAClB,cAAY,UAAUyV,EAAQ,WAAW;AAAA,wBACzC,SAAS,CAACnS,MAAM;AACd,0BAAAA,EAAE,gBAAA,GACFwB,EAAY2Q,EAAQ,IAAI,CAAC;AAAA,wBAC3B;AAAA,wBACA,WAAW,CAACnS,MAAM;AAChB,0BAAAA,EAAE,gBAAA;AAAA,wBACJ;AAAA,wBAEA,UAAA,gBAAA8E,EAAC4G,IAAA,EAAO,MAAM,GAAA,CAAI;AAAA,sBAAA;AAAA,oBAAA,IAElB;AAAA,oBACJ,gBAAA5G;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAW,CAACpI,EAAO,SAASmH,IAAM,IAAInH,EAAO,qBAAqB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,wBAChG,cAAY,GAAGyV,EAAQ,WAAW,aAAatO,CAAG;AAAA,wBAClD,SAAS,CAAC7D,MAAM;AACd,0BAAAA,EAAE,gBAAA,GACFwB,EAAY2Q,EAAQ,IAAItO,IAAM,CAAC;AAAA,wBACjC;AAAA,wBACA,WAAW,CAAC7D,MAAM;AAChB,0BAAAA,EAAE,gBAAA;AAAA,wBACJ;AAAA,wBACA,MAAK;AAAA,wBACL,UAAU;AAAA,wBAET,eAAO,IACN,gBAAA8E,EAAC,QAAA,EAAK,WAAWpI,EAAO,aAAa,eAAY,QAC/C,UAAA,gBAAAoI,EAAC0G,MAAK,MAAM,IAAI,aAAa,KAAK,EAAA,CACpC,IAEA,gBAAAkG,EAAAgB,IAAA,EACE,UAAA;AAAA,0BAAA,gBAAA5N,EAAC,QAAA,EAAK,WAAWpI,EAAO,cAAe,UAAAmH,GAAI;AAAA,0BAC3C,gBAAAiB;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,MAAK;AAAA,8BACL,WAAWpI,EAAO;AAAA,8BAClB,cAAY,OAAOyV,EAAQ,WAAW;AAAA,8BACtC,SAAS,CAACnS,MAAM;AACd,gCAAAA,EAAE,gBAAA,GACFwB,EAAY2Q,EAAQ,IAAItO,IAAM,CAAC;AAAA,8BACjC;AAAA,8BACA,WAAW,CAAC7D,MAAM;AAChB,gCAAAA,EAAE,gBAAA;AAAA,8BACJ;AAAA,8BAEA,UAAA,gBAAA8E,EAAC0G,IAAA,EAAK,MAAM,IAAI,aAAa,EAAA,CAAG;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBAClC,EAAA,CACF;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAEJ,EAAA,CACF,EAAA,CAEJ;AAAA,gBAAA,EAAA,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAzHK2G,EAAQ;AAAA,QAAA;AAAA,MA4HnB,CAAC,GACH,EAAA,CACF;AAAA,IAAA,EAAA,CACF,IACE;AAAA,IAEJ,gBAAAT,EAAC,UAAA,EAAO,WAAWhV,EAAO,QACxB,UAAA;AAAA,MAAA,gBAAAoI,EAAC,OAAA,EAAI,WAAWpI,EAAO,kBAAkB,KAAKmT,IAC5C,UAAA,gBAAA/K,EAAC,OAAA,EAAI,WAAWpI,EAAO,eAAe,cAAW,sBAC9C,UAAA,MAAM,KAAK,EAAE,QAAQ4S,GAAA,CAAW,EAAE,IAAI,CAAClN,GAAGiN,MAAQ;;AACjD,cAAM8C,IAAUjD,GAAeG,CAAG,GAC5B+C,IAAYjD,EAAiB,IAAIE,CAAG,GACpCgD,IAAW,EAAQF,GACnBG,IAAc,EAAQF,GACtBG,IAAgBD,KAAe,CAACD,GAChCG,IAAeJ,IAAY,GAAGA,EAAU,eAAe,UAAU,MACjEK,IAAYJ,IAAWF,EAAS,cAAc,QAAQ9C,IAAM,CAAC;AAEnE,iCACG,OAAA,EAAc,iBAAeA,GAAK,WAAW3S,EAAO,SACnD,UAAA;AAAA,UAAA,gBAAAoI;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACTpI,EAAO;AAAA,gBACP2V,IAAW3V,EAAO,gBAAgBA,EAAO;AAAA,gBACzC4V,IAAc5V,EAAO,mBAAmB;AAAA,gBACxC2V,IAAW3V,EAAO,mBAAmB;AAAA,cAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACX,MAAM2V,IAAW,WAAW;AAAA,cAC5B,UAAUA,IAAW,IAAI;AAAA,cACzB,SAASA,IAAW,MAAMtC,GAAyBoC,EAAS,EAAE,IAAI;AAAA,cAClE,WACEE,IACI,CAACrS,OAAM;AACP,iBAAIA,GAAE,QAAQ,WAAWA,GAAE,QAAQ,SACjCA,GAAE,eAAA,GACF+P,GAAyBoC,EAAS,EAAE;AAAA,cAExC,IACE;AAAA,cAEN,cAAYI,KAAiBC,IAAe,GAAGC,CAAS,aAAaD,CAAY,MAAMC;AAAA,cACvF,OAAOF,KAAiBC,IAAe,GAAGC,CAAS,cAAcD,CAAY,KAAKC;AAAA,cAEjF,UAAAJ,KACC1V,IAAAwV,EAAS,UAAT,QAAAxV,EAAgB,MACd,gBAAAmI;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAWpI,EAAO;AAAA,kBAClB,KAAKyV,EAAS,MAAO;AAAA,kBACrB,KAAKA,EAAS,MAAO,WAAWA,EAAS;AAAA,kBACzC,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAQ;AAAA,gBAAA;AAAA,cAAA,IAGV,gBAAArN,EAAC,OAAA,EAAI,WAAWpI,EAAO,iBAAiB,eAAY,QACjD,YAAAwV,MAAA5M,KAAAX,IAAAwN,EAAS,YAAT,gBAAAxN,EAAkB,UAAlB,gBAAAW,EAAyB,MAAM,GAAG,OAAlC,gBAAA4M,GAAsC,kBAAiB,KAC1D,IAEAK,KAAiBC,IACnB,gBAAA1N,EAAC,OAAA,EAAI,WAAWpI,EAAO,qBAAsB,UAAA8V,EAAA,CAAa,IAE1D,gBAAA1N,EAAC,SAAI,WAAWpI,EAAO,aAAa,eAAY,QAAO,UAAA,IAAA,CAEvD;AAAA,YAAA;AAAA,UAAA;AAAA,UAIH4V,sBAAe,OAAA,EAAI,WAAW5V,EAAO,mBAAoB,UAAA0V,EAAW,OAAM,IAAS;AAAA,QAAA,EAAA,GAlD5E/C,CAmDV;AAAA,MAEJ,CAAC,GACH,GACF;AAAA,wBAEC,OAAA,EAAI,WAAW,CAAC3S,EAAO,cAAcmS,KAA2BnS,EAAO,mBAAmB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACvH,UAAA,gBAAAoI;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,CAACpI,EAAO,eAAemS,KAA2BnS,EAAO,uBAAuB,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,UACzH,eAAa,CAACmS;AAAA,UAEd,4BAAC,OAAA,EAAI,WAAWnS,EAAO,WAAW,cAAW,UAC1C,UAAA;AAAA,YAAAyH,KACC,gBAAAuN,EAAC,QAAA,EAAK,WAAWhV,EAAO,kBAAmB,UAAA;AAAA,cAAAyH;AAAA,cAAuB;AAAA,YAAA,EAAA,CAAU,sBAE3E,QAAA,EAAK;AAAA,YAGR,gBAAAW,EAAC,QAAA,EACE,UAAAX,KACC,gBAAAuN,EAAAgB,IAAA,EACE,UAAA;AAAA,cAAA,gBAAA5N,EAAC,QAAA,EAAK,WAAWpI,EAAO,iBAAkB,aAAYoS,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,cAAQ;AAAA,cACnF,gBAAAhK,EAAC,QAAA,EAAK,WAAWpI,EAAO,gBAAiB,aAAYsS,GAAgB,QAAQ,CAAC,CAAC,EAAA,CAAE;AAAA,YAAA,EAAA,CACnF,IAEA,gBAAAlK,EAAC,QAAA,EAAK,WAAWpI,EAAO,gBAAiB,UAAAuR,GAAYa,GAAS,QAAQ,CAAC,CAAC,EAAA,CAAE,EAAA,CAE9E;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,OAEE,MAAM;AACN,cAAM6D,KAAa5T,KAAA,gBAAAA,EAAQ,kBAAiB;AAC5C,eAAI4T,MAAe,yBACbjE,IAAiB,IAEjB,gBAAA5J,EAAC,YAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACzB,GAAW,WAAWzG,EAAO,KAC5E,UAAAgC,IAAa,YAAY,OAAOgQ,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,GAAA,CAChG,IAKF,gBAAAgD,EAAC,OAAA,EAAI,WAAWhV,EAAO,gBACrB,UAAA;AAAA,UAAA,gBAAAoI,EAAC,YAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACzB,GAAW,WAAWzG,EAAO,aAC7E,UAAA,gBAAAoI,EAAC,QAAA,EAAM,UAAApG,IAAa,YAAY,iBAAgB,GAClD;AAAA,4BACC,UAAA,EAAO,MAAK,UAAS,SAASmG,GAAmB,UAAU,CAAC1B,GAAW,WAAWzG,EAAO,cACxF,UAAA,gBAAAoI,EAAC,UAAM,UAAApG,IAAa,gBAAgB,YAAW,EAAA,CACjD;AAAA,QAAA,GACF,IAIAiU,MAAe,aAEf,gBAAA7N,EAAC,UAAA,EAAO,MAAK,UAAS,SAASD,GAAmB,UAAU,CAAC1B,GAAW,WAAWzG,EAAO,KACvF,cACG,gBACAgS,IAAiB,IACf,OAAOA,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,KACpE,WAAA,CACR,IAKF,gBAAA5J,EAAC,UAAA,EAAO,MAAK,UAAS,SAASF,GAAQ,UAAU,CAACzB,GAAW,WAAWzG,EAAO,KAC5E,cACG,YACAgS,IAAiB,IACf,OAAOA,CAAc,gBAAgBA,MAAmB,IAAI,KAAK,GAAG,KACpE,gBAAA,CACR;AAAA,MAEJ,GAAA;AAAA,MAEA,gBAAAgD,EAAC,OAAA,EAAI,WAAWhV,EAAO,WAAW,UAAA;AAAA,QAAA;AAAA,QACrB;AAAA,QACX,gBAAAoI,EAAC,OAAE,MAAK,yCAAwC,QAAO,UAAS,KAAI,uBAAsB,UAAA,cAAA,CAE1F;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;ACzhBA,SAASuO,GAAaC,GAAwC;AAC5D,MAAKA,KAAA,QAAAA,EAAY;AACjB,WAAOA,EAAW,OAA+B,CAACC,GAAKC,OACjDA,KAAA,QAAAA,EAAM,QAAKD,EAAIC,EAAK,GAAG,IAAIA,EAAK,SAAS,KACtCD,IACN,CAAA,CAAE;AACP;AAEA,SAASE,GAAmBhS,GAAuB;AACjD,QAAMqI,IAAQ,WAAW,KAAKrI,CAAa;AAC3C,SAAOqI,IAAQA,EAAM,CAAC,IAAIrI;AAC5B;AAEA,SAASiS,KAAkB;;AACzB,SAAI,OAAO,SAAW,MAAoB,SAClC/W,IAAA,OAEL,YAFK,gBAAAA,EAEI,UAAS;AACvB;AAEA,SAASgX,KAAe;AACtB,QAAMC,IAAQF,GAAA;AACd,SAAKE,IAEDA,EAAM,gBAAgB,UAAgB,KACnC,SAAS,KAAKA,EAAM,QAAQ,EAAE,IAHlB;AAIrB;AAEA,SAASC,KAAqB;AAC5B,SAAI,OAAO,WAAa,MAAoB,KACrC,CAAC,CAAC,SAAS,cAAc,aAAa;AAC/C;AAEA,SAASC,KAAyB;AAChC,SAAI,CAACH,GAAA,KAAkB,CAACE,GAAA,IAA6B,MAErD,SAAS,cAAc,IAAI,YAAY,gBAAgB;AAAA,IACrD,SAAS;AAAA,IACT,QAAQ,EAAE,MAAM,GAAA;AAAA,EAAK,CACtB,CAAC,GAEK;AACT;AAOA,SAASE,KAA0B;AACjC,SAAO,SAAS,OAAA;AAClB;AAEA,eAAeC,GAAaC,GAAkBC,GAAkC;AAC9E,QAAMC,IAAM,MAAM,MAAMF,GAAU;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAAA;AAAA,IAElB,MAAM,KAAK,UAAUC,CAAO;AAAA,EAAA,CAC7B;AACD,MAAI,CAACC,EAAI,IAAI;AACX,UAAMC,IAAO,MAAMD,EAAI,OAAO,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,MAAMC,KAAQ,wBAAwBD,EAAI,MAAM,EAAE;AAAA,EAC9D;AACA,SAAOA,EAAI,KAAA,EAAO,MAAM,MAAM,IAAI;AACpC;AAEO,SAASE,KAA6C;AAC3D,SAAO;AAAA,IACL,MAAM,SAAS7Q,GAAO;AACpB,YAAM8Q,IAAQ9Q,EAAM,IAAI,CAAC+Q,OAAU;AAAA,QACjC,IAAId,GAAmBc,EAAK,aAAa;AAAA,QACzC,UAAUA,EAAK;AAAA,QACf,YAAYlB,GAAakB,EAAK,UAAU;AAAA,MAAA,EACxC;AACF,YAAMP,GAAa,gBAAgB,EAAE,OAAAM,GAAO;AAAA,IAC9C;AAAA,IACA,MAAM,oBAAoB9Q,GAAO;AAC/B,YAAM8Q,IAAQ9Q,EAAM,IAAI,CAAC+Q,OAAU;AAAA,QACjC,IAAId,GAAmBc,EAAK,aAAa;AAAA,QACzC,UAAUA,EAAK;AAAA,QACf,YAAYlB,GAAakB,EAAK,UAAU;AAAA,MAAA,EACxC;AACF,YAAMP,GAAa,gBAAgB,EAAE,OAAAM,GAAO;AAAA,IAC9C;AAAA,IACA,MAAM,YAAY9Q,GAAO;AACvB,iBAAW+Q,KAAQ/Q;AACjB,cAAMwQ,GAAa,mBAAmB;AAAA,UACpC,IAAIO,EAAK;AAAA,UACT,UAAUA,EAAK;AAAA,UACf,YAAYlB,GAAakB,EAAK,UAAU;AAAA,QAAA,CACzC;AAAA,IAEL;AAAA,IACA,MAAM,YAAYC,GAAS;AACzB,iBAAW9R,KAAM8R;AACf,cAAMR,GAAa,mBAAmB,EAAE,IAAAtR,GAAI,UAAU,GAAG;AAAA,IAE7D;AAAA,IACA,aAAa;AACX,MAAIoR,QAGJ,OAAO,WAAW,MAAMC,GAAA,GAA2B,CAAC;AAAA,IACtD;AAAA,IACA,qBAAqB;AAEnB,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EAAA;AAEJ;","x_google_ignoreList":[7,8,9,10,11,12,13,14,15]}