@getcredify/credify-insurance-widget 1.7.2 → 1.8.2
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/credify-insurance-widget.css +1 -1
- package/dist/iframe/assets/iframe-BX0vtreg.js +50 -0
- package/dist/iframe/assets/iframe-BX0vtreg.js.map +1 -0
- package/dist/iframe/assets/iframe-DKxk2TnK.css +1 -0
- package/dist/iframe/iframe.html +2 -2
- package/dist/index.es.js +2839 -1084
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/iframe/assets/iframe-5Q3mEx6K.js +0 -50
- package/dist/iframe/assets/iframe-5Q3mEx6K.js.map +0 -1
- package/dist/iframe/assets/iframe-CcbXvutI.css +0 -1
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/components/Field.tsx","../src/components/TextInput.tsx","../src/components/NumericInput.tsx","../src/components/EmailInput.tsx","../src/components/TelInput.tsx","../src/components/UrlInput.tsx","../src/components/PasswordInput.tsx","../src/components/TextArea.tsx","../src/components/DateInput.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/SelectInput.tsx","../src/components/AddressAutocomplete.tsx","../src/utils/form.ts","../src/components/FormRenderer.tsx","../src/utils/gtm.ts","../src/components/FormWizard.tsx","../src/utils/storage.ts","../src/utils/api.ts","../src/components/Rates.tsx","../src/utils/quoteToFormValues.ts","../src/components/Widget.tsx","../src/internal/WidgetController.tsx","../src/widget.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type FieldProps = {\n id: string;\n label: string;\n hint?: string;\n error?: string;\n required?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nexport function Field({ id, label, hint, error, required, className, children }: FieldProps) {\n return (\n <div className={className}>\n <label htmlFor={id} className=\"form-label\">\n {label} {required && <span className=\"text-red-600\">*</span>}\n </label>\n {children}\n {hint && !error && (\n <p id={`${id}-hint`} className=\"mt-1 text-sm text-slate-500\">\n {hint}\n </p>\n )}\n {error && (\n <p id={`${id}-error`} className=\"mt-1 text-sm text-red-600\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id'>;\n\nexport function TextInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n type=\"text\"\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function NumericInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"number\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function EmailInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"email\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"email\"\n autoComplete=\"email\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { InputHTMLAttributes, ChangeEvent } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'value' | 'onChange'> & {\n value?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n };\n\n/**\n * Formats a phone number string to (XXX) XXX - XXXX format\n * Only formats if there are 10 digits (US phone number)\n */\nfunction formatPhoneNumber(value: string): string {\n // Remove all non-digit characters\n const digits = value.replace(/\\D/g, '');\n\n // If we have 10 digits, format as (XXX) XXX - XXXX\n if (digits.length === 10) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n\n // If we have more than 10 digits, format the first 10\n if (digits.length > 10) {\n const tenDigits = digits.slice(0, 10);\n return `(${tenDigits.slice(0, 3)}) ${tenDigits.slice(3, 6)} - ${tenDigits.slice(6)}`;\n }\n\n // Partial formatting as user types\n if (digits.length >= 6) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n if (digits.length >= 3) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3)}`;\n }\n if (digits.length > 0) {\n return `(${digits}`;\n }\n\n return digits;\n}\n\n/**\n * Extracts only digits from a phone number string\n */\nfunction extractDigits(value: string): string {\n return value.replace(/\\D/g, '');\n}\n\nexport function TelInput({ id, label, hint, error, required, className, value = '', onChange, ...rest }: Props) {\n const [displayValue, setDisplayValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef<number>(0);\n\n // Update display value when prop value changes\n useEffect(() => {\n if (!value) {\n setDisplayValue('');\n return;\n }\n\n // Extract digits, handling cases where value might include +1 or just be digits\n let digits = extractDigits(value);\n\n // If value starts with +1 or 1, remove the leading 1 (country code)\n if (digits.length === 11 && digits.startsWith('1')) {\n digits = digits.slice(1);\n }\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n setDisplayValue(formatPhoneNumber(limitedDigits));\n }, [value]);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const input = e.target;\n const inputValue = input.value;\n\n // Save cursor position before formatting\n cursorPositionRef.current = input.selectionStart || 0;\n\n // Extract digits from input\n const digits = extractDigits(inputValue);\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n\n // Format the display value\n const formatted = formatPhoneNumber(limitedDigits);\n setDisplayValue(formatted);\n\n // Create a synthetic event with the unformatted digits (with +1 prefix)\n // The actual stored value will be +1 followed by the 10 digits\n const rawValue = limitedDigits.length === 10 ? `+1${limitedDigits}` : limitedDigits;\n\n // Create a new event with the raw value\n const syntheticEvent = {\n ...e,\n currentTarget: {\n ...e.currentTarget,\n value: rawValue\n },\n target: {\n ...e.target,\n value: rawValue\n }\n } as ChangeEvent<HTMLInputElement>;\n\n // Call the original onChange with the raw value\n onChange?.(syntheticEvent);\n\n // Restore cursor position after a short delay to allow React to update\n setTimeout(() => {\n if (inputRef.current) {\n // Calculate new cursor position based on formatting\n const beforeCursor = inputValue.slice(0, cursorPositionRef.current);\n const digitsBeforeCursor = extractDigits(beforeCursor);\n const formattedBeforeCursor = formatPhoneNumber(digitsBeforeCursor);\n // Position cursor at the end of the formatted text that corresponds to the digits before cursor\n const newPosition = Math.min(formattedBeforeCursor.length, formatted.length);\n inputRef.current.setSelectionRange(newPosition, newPosition);\n }\n }, 0);\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div\n className={`tel-input-wrapper flex items-center border rounded-lg transition-colors w-full relative ${\n error ? 'border-red-500 error' : 'border-[var(--accent-color)] focus-within:border-[var(--primary-color)]'\n }`}\n >\n <label\n htmlFor={id}\n className=\"px-3 py-3 text-slate-700 font-medium border-r border-[var(--accent-color)] bg-slate-50 flex-shrink-0 relative z-0 rounded-l-lg\"\n >\n +1\n </label>\n <input\n ref={inputRef}\n id={id}\n type=\"tel\"\n className={`flex-1 px-4 py-3 border-0 rounded-r-lg outline-none bg-transparent text-[var(--text-primary)] text-base ${\n error ? 'input-error' : ''\n }`}\n inputMode=\"tel\"\n autoComplete=\"tel\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n value={displayValue}\n onChange={handleChange}\n {...rest}\n />\n </div>\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function UrlInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"url\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"url\"\n autoComplete=\"url\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function PasswordInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"password\"\n className={`form-input ${error ? 'input-error' : ''}`}\n autoComplete=\"current-password\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { TextareaHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;\n\nexport function TextArea({ id, label, hint, error, required, className, rows = 4, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <textarea\n id={id}\n rows={rows}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function DateInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"date\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\n\ntype Props = {\n id: string;\n label: string;\n className?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'id'>;\n\nexport function Checkbox({ id, label, className, ...rest }: Props) {\n return (\n <label className={`checkbox-card ${className || ''}`} htmlFor={id}>\n <input id={id} type=\"checkbox\" className=\"checkbox-input\" {...rest} />\n <span className=\"checkbox-label\">{label}</span>\n </label>\n );\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react';\n\nexport function Radio({\n name,\n value,\n checked,\n onChange,\n children\n}: {\n name: string;\n value: string;\n checked?: boolean;\n onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];\n children: ReactNode;\n}) {\n return (\n <label className=\"radio-card\">\n <input className=\"radio-input\" type=\"radio\" name={name} value={value} checked={checked} onChange={onChange} />\n <span className=\"radio-label\">{children}</span>\n </label>\n );\n}\n\nexport function RadioGroup({\n legend,\n children,\n className,\n legendClassName // NEW\n}: {\n legend: string;\n className?: string; // still applies to <fieldset>\n legendClassName?: string; // NEW: applies to <legend>\n children: ReactNode;\n}) {\n return (\n <fieldset className={className}>\n <legend className={`mb-4 text-base font-medium ${legendClassName || ''}`} style={{ color: 'var(--text-primary)' }}>\n {legend}\n </legend>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">{children}</div>\n </fieldset>\n );\n}\n","import type { SelectHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id'> & {\n /** If provided, renders a disabled first option prompting selection */\n placeholder?: string;\n /** Provide options as data (or pass custom children instead) */\n options?: SelectOption[];\n };\n\nexport function SelectInput({ id, label, hint, error, required, className, placeholder, options, children, ...rest }: Props) {\n const describedBy = [hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined;\n\n const hasCustomChildren = !!children;\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <select\n id={id}\n className={`form-input select-caret ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={describedBy}\n required={required}\n {...rest}\n >\n {placeholder && (\n <option value=\"\" disabled selected={!('value' in rest)}>\n {placeholder}\n </option>\n )}\n\n {hasCustomChildren\n ? children\n : options?.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n </Field>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\n// cspell:disable-next-line\nconst GOOGLE_MAPS_API_KEY = 'AIzaSyDjLdKLxoa-maLNGAyq_I_2r_Fe_TzFikw';\n\ntype AddressComponents = {\n streetNumber?: string;\n streetName?: string;\n city?: string;\n state?: string;\n zipCode?: string;\n country?: string;\n fullAddress?: string;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'onChange'> & {\n onChange?: (value: string, components?: AddressComponents) => void;\n onPlaceSelect?: (place: google.maps.places.PlaceResult) => void;\n };\n\n// Load Google Maps script dynamically\nfunction loadGoogleMapsScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loaded\n if (window.google?.maps?.places) {\n resolve();\n return;\n }\n\n // Check if script is already being loaded\n const existingScript = document.querySelector('script[src*=\"maps.googleapis.com\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve());\n existingScript.addEventListener('error', () => reject(new Error('Failed to load Google Maps script')));\n return;\n }\n\n // Create and load the script\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_MAPS_API_KEY}&libraries=places`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Google Maps script'));\n document.head.appendChild(script);\n });\n}\n\n// Extract address components from Google Places result\nfunction extractAddressComponents(place: google.maps.places.PlaceResult): AddressComponents {\n const components: AddressComponents = {\n fullAddress: place.formatted_address\n };\n\n if (place.address_components) {\n place.address_components.forEach((component) => {\n const types = component.types;\n\n if (types.includes('street_number')) {\n components.streetNumber = component.long_name;\n }\n if (types.includes('route')) {\n components.streetName = component.long_name;\n }\n if (types.includes('locality')) {\n components.city = component.long_name;\n }\n if (types.includes('administrative_area_level_1')) {\n components.state = component.short_name;\n }\n if (types.includes('postal_code')) {\n components.zipCode = component.long_name;\n }\n if (types.includes('country')) {\n components.country = component.short_name;\n }\n });\n }\n\n return components;\n}\n\nexport function AddressAutocomplete({ id, label, hint, error, required, className, onChange, onPlaceSelect, value, ...rest }: Props) {\n const inputRef = useRef<HTMLInputElement>(null);\n const autocompleteServiceRef = useRef<google.maps.places.AutocompleteService | null>(null);\n const placesServiceRef = useRef<google.maps.places.PlacesService | null>(null);\n const suggestionsContainerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [inputValue, setInputValue] = useState((value as string) || '');\n const [suggestions, setSuggestions] = useState<google.maps.places.AutocompletePrediction[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n // Use refs for state values used in event handlers to avoid dependency issues\n const suggestionsRef = useRef<google.maps.places.AutocompletePrediction[]>([]);\n const showSuggestionsRef = useRef(false);\n const selectedIndexRef = useRef(-1);\n\n // Keep refs in sync with state\n useEffect(() => {\n suggestionsRef.current = suggestions;\n }, [suggestions]);\n\n useEffect(() => {\n showSuggestionsRef.current = showSuggestions;\n }, [showSuggestions]);\n\n useEffect(() => {\n selectedIndexRef.current = selectedIndex;\n }, [selectedIndex]);\n\n useEffect(() => {\n // Update input value when value prop changes\n if (value !== undefined) {\n setInputValue(String(value));\n }\n }, [value]);\n\n // Debounce timer ref\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!inputRef.current) return;\n\n let isMounted = true;\n\n // Load Google Maps script and initialize services\n loadGoogleMapsScript()\n .then(() => {\n if (!isMounted || !inputRef.current) return;\n\n // Initialize services\n autocompleteServiceRef.current = new google.maps.places.AutocompleteService();\n placesServiceRef.current = new google.maps.places.PlacesService(document.createElement('div'));\n\n setIsLoading(false);\n })\n .catch((err) => {\n console.error('Error loading Google Maps:', err);\n setIsLoading(false);\n });\n\n return () => {\n isMounted = false;\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n // Handle input changes with debouncing\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n onChange?.(query);\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n if (query.length < 3) {\n setSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n\n // Debounce API calls\n debounceTimerRef.current = setTimeout(() => {\n if (!autocompleteServiceRef.current) return;\n\n autocompleteServiceRef.current.getPlacePredictions(\n {\n input: query,\n types: ['address']\n },\n (predictions, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && predictions) {\n setSuggestions(predictions);\n setShowSuggestions(true);\n setSelectedIndex(-1);\n } else {\n setSuggestions([]);\n setShowSuggestions(false);\n }\n }\n );\n }, 300);\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!showSuggestionsRef.current || suggestionsRef.current.length === 0) {\n if (e.key === 'Escape') {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev < suggestionsRef.current.length - 1 ? prev + 1 : prev;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev > 0 ? prev - 1 : -1;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'Enter':\n e.preventDefault();\n if (selectedIndexRef.current >= 0 && selectedIndexRef.current < suggestionsRef.current.length) {\n handleSuggestionClick(suggestionsRef.current[selectedIndexRef.current]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n break;\n }\n };\n\n // Handle clicks outside to close suggestions\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsContainerRef.current &&\n !suggestionsContainerRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n };\n\n if (showSuggestions) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showSuggestions]);\n\n const handleSuggestionClick = (prediction: google.maps.places.AutocompletePrediction) => {\n if (!placesServiceRef.current) return;\n\n placesServiceRef.current.getDetails(\n {\n placeId: prediction.place_id,\n fields: ['address_components', 'formatted_address', 'geometry']\n },\n (place, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && place) {\n const formattedAddress = place.formatted_address || '';\n setInputValue(formattedAddress);\n setShowSuggestions(false);\n setSuggestions([]);\n showSuggestionsRef.current = false;\n\n const addressComponents = extractAddressComponents(place);\n\n onChange?.(formattedAddress, addressComponents);\n onPlaceSelect?.(place);\n }\n }\n );\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div className=\"relative\">\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n className={`form-input ${error ? 'input-error' : ''}`}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n autoComplete=\"street-address\"\n placeholder={rest.placeholder || 'Enter an address'}\n disabled={isLoading || rest.disabled}\n {...rest}\n />\n {isLoading && <p className=\"mt-1 text-sm text-slate-500\">Loading address suggestions...</p>}\n\n {/* Suggestions dropdown */}\n {showSuggestions && suggestions.length > 0 && (\n <div\n ref={suggestionsContainerRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-slate-200 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n role=\"listbox\"\n >\n {suggestions.map((prediction, index) => (\n <div\n key={prediction.place_id}\n className={`px-4 py-3 cursor-pointer transition-colors ${\n index === selectedIndex ? 'bg-blue-50 text-slate-900' : 'bg-white text-slate-900 hover:bg-slate-50'\n } ${index < suggestions.length - 1 ? 'border-b border-slate-100' : ''}`}\n role=\"option\"\n aria-selected={index === selectedIndex}\n onClick={() => handleSuggestionClick(prediction)}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <div className=\"font-medium text-slate-900\">{prediction.structured_formatting.main_text}</div>\n {prediction.structured_formatting.secondary_text && (\n <div className=\"text-sm text-slate-500 mt-0.5\">{prediction.structured_formatting.secondary_text}</div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </Field>\n );\n}\n","import type { Question } from '@getcredify/credify-insurance-types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FormValues = Record<string, any>;\n\n// A single stage (screen) in the wizard\nexport type StageMeta<K extends string = string> = {\n key: string; // stage id\n title: string; // progress header label\n loadQuestions: () => Promise<ReadonlyArray<Question<K>>>; // lazy loader\n};\n\nexport function slugify(s: string) {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function ensureKey<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n q: Readonly<Question<KSelf, any, any>>,\n idx: number\n): string {\n return (q.key as string | undefined) ?? `${slugify(q.question)}-${idx}`;\n}\n\n// ----- per-stage validation (visible + required) -----\nexport function validateQuestions<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n questions: ReadonlyArray<Question<KSelf, any, any>>,\n values: Readonly<Record<string, unknown>>\n): Record<string, string | undefined> {\n const errors: Record<string, string | undefined> = {};\n\n const isBlank = (v: unknown) => v === undefined || v === null || (typeof v === 'string' && v.trim() === '');\n\n questions.forEach((q, i) => {\n const key = ensureKey(q, i);\n const val = values[key];\n\n if (!q.required) return;\n\n switch (q.inputType) {\n case 'checkbox':\n if (val !== true) errors[key] = 'Required';\n break;\n\n case 'radio':\n case 'select':\n if (isBlank(val)) errors[key] = 'Required';\n break;\n\n case 'number':\n // Treat '' / null / undefined as missing; 0 is valid\n if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {\n errors[key] = 'Required';\n }\n break;\n\n case 'date':\n case 'email':\n case 'tel':\n case 'url':\n case 'password':\n case 'text':\n case 'textarea':\n case 'address':\n default:\n if (isBlank(val)) errors[key] = 'Required';\n break;\n }\n });\n\n return errors;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function coerceNumber(v: any) {\n if (v === '' || v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isNaN(n) ? undefined : n;\n}\n","import { useMemo, useState, useEffect } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport {\n TextInput,\n NumericInput,\n EmailInput,\n TelInput,\n UrlInput,\n PasswordInput,\n TextArea,\n DateInput,\n Checkbox,\n Radio,\n RadioGroup,\n SelectInput,\n AddressAutocomplete\n} from './index';\n\nimport { slugify, validateQuestions, coerceNumber, type FormValues } from '../utils/form';\n\n/* ------------------------------------------------------------------ */\n/* Conditional evaluation utilities */\n/* ------------------------------------------------------------------ */\n\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(qValue: unknown, conditionalType: ConditionalNode['conditionalType'], conditionalValue: unknown): boolean {\n switch (conditionalType) {\n case 'equals':\n return qValue === conditionalValue;\n case 'lessThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(qValue, conditionalValue);\n case 'startsWith':\n return qValue != null && conditionalValue != null && String(qValue).startsWith(String(conditionalValue));\n case 'endsWith':\n return qValue != null && conditionalValue != null && String(qValue).endsWith(String(conditionalValue));\n default:\n return false;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Path helpers (immutable) */\n/* ------------------------------------------------------------------ */\n\ntype ScopePath = Array<string | number>;\n\nfunction getIn(obj: unknown, path: ScopePath): unknown {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return path.reduce((acc: any, key) => (acc == null ? undefined : acc[key]), obj as any);\n}\nfunction setInImmutable<T extends object>(obj: T, path: ScopePath, value: unknown): T {\n if (path.length === 0) return obj;\n const [head, ...tail] = path;\n\n if (tail.length === 0) {\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = value;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: value } as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const current = (obj as any)?.[head];\n const nextContainer = typeof tail[0] === 'number' ? (Array.isArray(current) ? current : []) : current && typeof current === 'object' ? current : {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const next = setInImmutable(nextContainer as any, tail, value);\n\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = next;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: next } as T;\n}\n\n/** Read from a values object using a base scope plus a local key */\nfunction scopedRead(values: FormValues, scope: ScopePath | undefined, key: string) {\n return getIn(values, [...(scope ?? []), key]);\n}\n/** Write immutably to values at scope+key */\nfunction scopedWrite(values: FormValues, scope: ScopePath | undefined, key: string, v: unknown): FormValues {\n return setInImmutable(values, [...(scope ?? []), key], v);\n}\n\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\n/* ------------------------------------------------------------------ */\n/* Key decoration (stable keys) */\n/* ------------------------------------------------------------------ */\n\nfunction decorateKeys(questions: Question[]): Question[] {\n const walk = (list: Question[], pathParts: string[]): Question[] =>\n list.map((q, qi) => {\n const parentPart = pathParts.length ? pathParts.join('__') : 'root';\n const baseKey = (q.key as string) ?? `${parentPart}__q${qi}_${String(q.question).slice(0, 24).replace(/\\W+/g, '-') || 'field'}`;\n\n const conds: readonly ConditionalNode[] = q.conditionals ?? [];\n const nextConds = conds.map((c, ci) => {\n const nested = c.conditionalQuestions\n ? walk(c.conditionalQuestions as unknown as Question[], [...pathParts, `${baseKey}__c${ci}`])\n : undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...c, conditionalQuestions: nested as any };\n });\n\n return { ...q, key: baseKey, conditionals: nextConds };\n });\n\n return walk(questions, []);\n}\n\n/** Coerce any unknown to a safe text input value */\nfunction asTextValue(v: unknown): string {\n if (v == null) return '';\n return typeof v === 'string' ? v : String(v);\n}\n\n/** Coerce to a number-control-safe value */\nfunction asNumberValue(v: unknown): string | number {\n if (v == null) return '';\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (typeof v === 'string') return v; // let the user type partial numbers like \"-\"\n return '';\n}\n\n/** Coerce to a select value (string/number/undefined) */\nfunction asSelectValue(v: unknown): string | number {\n if (v == null) return ''; // <-- force empty string, not undefined\n if (typeof v === 'string' || typeof v === 'number') return v;\n return String(v);\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function FormRenderer({\n questions,\n initialValues,\n controlledValues,\n onChangeValues,\n onSubmit\n}: {\n questions: Question[];\n initialValues?: Partial<FormValues>;\n controlledValues?: FormValues;\n onChangeValues?: (values: FormValues) => void;\n onSubmit: (values: FormValues) => void; // called on Enter key\n}) {\n const keyedQuestions = useMemo(() => decorateKeys(questions), [questions]);\n\n const initialUncontrolled: FormValues = useMemo(() => {\n const acc: FormValues = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (initialValues) Object.assign(acc, initialValues as any);\n return acc;\n }, [initialValues]);\n\n const [uncontrolled, setUncontrolled] = useState<FormValues>(initialUncontrolled);\n useEffect(() => {\n setUncontrolled(initialUncontrolled);\n }, [initialUncontrolled]);\n\n // HYBRID CONTROLLED SUPPORT\n const [localShadow, setLocalShadow] = useState<FormValues>({});\n const values: FormValues = useMemo(\n () => ({ ...localShadow, ...(controlledValues ?? uncontrolled) }),\n [localShadow, controlledValues, uncontrolled]\n );\n useEffect(() => {\n if (controlledValues) setLocalShadow((p) => ({ ...p, ...controlledValues }));\n }, [controlledValues]);\n\n const [errors, setErrors] = useState<Record<string, string | undefined>>({});\n\n // single field renderer (aware of scope)\n function renderOne(q: Question, scopePath?: ScopePath) {\n const key = q.key as string;\n const label = q.question;\n const val = scopedRead(values, scopePath, key);\n const error = errors[key];\n\n const set = (v: unknown) => {\n let nextAll = scopedWrite(values, scopePath, key, v);\n\n // If this is a radio button with conditionals, check if any array items need to be cleared\n if (q.inputType === 'radio' && q.conditionals) {\n const conds = q.conditionals ?? [];\n\n // Check each conditional to see if it will become false\n for (const cond of conds) {\n const currentValue = scopedRead(values, scopePath, key);\n const wasActive = evalConditional(currentValue, cond.conditionalType, cond.conditionalValue);\n const willBeActive = evalConditional(v, cond.conditionalType, cond.conditionalValue);\n\n // If this conditional was active but will become inactive, and it has repeatable questions, clear the array\n if (wasActive && !willBeActive && cond.conditionalQuestionsAllowMultiple) {\n const children = (cond.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n const arrStorageKey = itemsKey(key);\n\n nextAll = setInImmutable(nextAll, [...(scopePath ?? []), arrStorageKey], []);\n\n // Also clear any nested array items that might exist\n const clearNestedArrays = (questionList: Question[], currentScope: ScopePath) => {\n questionList.forEach((childQ) => {\n const childConds = childQ.conditionals ?? [];\n childConds.forEach((childCond) => {\n if (childCond.conditionalQuestionsAllowMultiple) {\n const nestedArrKey = itemsKey(childQ.key as string);\n nextAll = setInImmutable(nextAll, [...currentScope, nestedArrKey], []);\n }\n const grandChildren = (childCond.conditionalQuestions ?? []) as unknown as Question[];\n if (grandChildren.length > 0) {\n clearNestedArrays(grandChildren, currentScope);\n }\n });\n });\n };\n\n clearNestedArrays(children, [...(scopePath ?? []), arrStorageKey]);\n }\n }\n }\n }\n\n if (controlledValues && onChangeValues) onChangeValues(nextAll);\n else setUncontrolled(nextAll);\n setLocalShadow(nextAll);\n };\n\n switch (q.inputType) {\n case 'text':\n return (\n <TextInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'email':\n return (\n <EmailInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'password':\n return (\n <PasswordInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'tel':\n return (\n <>\n <TelInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n {key === 'phone' && (\n <div className=\"mt-3 text-xs text-slate-600 space-y-1\">\n <p>By entering your phone number, you agree to receive a one-time SMS from Credify Insurance with a verification code.</p>\n <p>Message & data rates may apply. One message per request.</p>\n {/* <p>Reply STOP to opt out, HELP for help.</p> */}\n <p>\n See our{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Privacy Policy\n </a>{' '}\n and{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Terms of Service\n </a>\n .\n </p>\n </div>\n )}\n </>\n );\n case 'url':\n return (\n <UrlInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'number':\n return (\n <NumericInput\n key={key}\n id={key}\n label={label}\n value={asNumberValue(val)}\n onChange={(e) => set(coerceNumber(e.currentTarget.value))}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n case 'textarea':\n return (\n <TextArea\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n rows={4}\n />\n );\n case 'date':\n return (\n <DateInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n\n case 'checkbox': {\n if (q.options) {\n const current: string[] = Array.isArray(val) ? (val as string[]) : [];\n return (\n <div key={key} className=\"space-y-2\">\n <div className=\"form-label\">\n {label}\n {q.required && <span className=\"text-red-600 ml-1\">*</span>}\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {q.options.map((opt) => {\n const idOpt = `${key}-${slugify(opt)}`;\n const checked = current.includes(opt);\n return (\n <Checkbox\n key={idOpt}\n id={idOpt}\n label={opt}\n checked={checked}\n onChange={(e) => {\n const next = new Set(current);\n if (e.currentTarget.checked) next.add(opt);\n else next.delete(opt);\n set(Array.from(next));\n }}\n aria-required={q.required || undefined}\n />\n );\n })}\n </div>\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\n </div>\n );\n }\n return (\n <Checkbox\n key={key}\n id={key}\n label={q.required ? `${label} *` : label}\n checked={!!val}\n onChange={(e) => set(e.currentTarget.checked)}\n aria-required={q.required || undefined}\n />\n );\n }\n\n case 'radio': {\n const opts = q.options ?? [];\n // Create a scoped name to avoid conflicts between array items\n const scopedName = scopePath && scopePath.length > 0 ? `${key}__${scopePath.join('__')}` : key;\n return (\n <RadioGroup key={key} legend={label} legendClassName={q.required ? 'legend-required' : undefined}>\n {opts.map((opt) => (\n <Radio key={`${key}-${slugify(opt)}`} name={scopedName} value={opt} checked={val === opt} onChange={() => set(opt)}>\n {opt}\n </Radio>\n ))}\n </RadioGroup>\n );\n }\n\n case 'select': {\n let opts = q.options ?? [];\n // Add special case for `quote_vehicle_id` key\n if (key === 'quote_vehicle_id') {\n opts = controlledValues?.vehicles__items?.map((v: { vin: string }) => v.vin) ?? [];\n }\n return (\n <SelectInput\n key={key}\n id={key}\n label={label}\n aria-required={q.required || undefined}\n error={error}\n value={asSelectValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n placeholder=\"Select an option\"\n options={opts.map((o) => ({ value: o, label: o }))}\n />\n );\n }\n\n case 'address':\n return (\n <AddressAutocomplete\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(address) => set(address)}\n aria-required={q.required || undefined}\n error={error}\n />\n );\n\n default:\n return null;\n }\n }\n\n function renderRecursive(list: Question[], scopePath?: ScopePath) {\n return list.map((q, qIndex) => {\n const key = String(q.key);\n const elem = renderOne(q, scopePath);\n\n const conds = q.conditionals ?? [];\n if (!conds.length) return <div key={`wrap-${key}-${qIndex}`}>{elem}</div>;\n\n const v = scopedRead(values, scopePath, key);\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n return (\n <div key={`wrap-${key}-${qIndex}`}>\n {elem}\n\n {branches.map((branch, bi) => {\n const children = (branch.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return null;\n\n // NON-REPEATABLE child branch at current scope\n if (!branch.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n {renderRecursive(children, scopePath)}\n </div>\n );\n }\n\n // REPEATABLE child branch at current scope\n const arrStorageKey = itemsKey(key);\n const arr: unknown[] = (getIn(values, [...(scopePath ?? []), arrStorageKey]) as unknown[]) ?? [];\n const count = Math.max(1, arr.length || 1);\n\n const pushEmpty = () => {\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey, arr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const popLast = () => {\n const nextArr = arr.slice(0, Math.max(0, arr.length - 1));\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const groupIdBase = `${key}__c${bi}`;\n\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={pushEmpty}>\n Add another\n </button>\n {count > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={popLast}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: count }).map((_, idx) => {\n const itemScope: ScopePath = [...(scopePath ?? []), arrStorageKey, idx];\n const groupId = `${groupIdBase}__i${idx}`;\n\n return (\n <div key={`group-${groupId}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{idx + 1}</div>\n\n {children.map((childQ) => (\n <div key={`${groupId}-${String(childQ.key)}`} className=\"mt-3\">\n {renderOne(childQ, itemScope)}\n\n {/* Nested conditionals under childQ (supports nested repeatables too) */}\n {(() => {\n const childConds = childQ.conditionals ?? [];\n if (!childConds.length) return null;\n\n const childVal = scopedRead(values, itemScope, childQ.key as string);\n const childMatches = childConds.filter((c) => evalConditional(childVal, c.conditionalType, c.conditionalValue));\n const childBranches =\n childMatches.length > 1 && !childMatches.some((m) => m.conditionalQuestionsAllowMultiple)\n ? childMatches.slice(0, 1)\n : childMatches;\n\n return childBranches.map((bc, bci) => {\n const grandChildren = (bc.conditionalQuestions ?? []) as unknown as Question[];\n if (!grandChildren.length) return null;\n\n // NON-REPEATABLE nested branch: same item scope\n if (!bc.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`nested-${groupId}-${bci}`} className=\"mt-3\">\n {renderRecursive(grandChildren, itemScope)}\n </div>\n );\n }\n\n // REPEATABLE nested branch: store under <itemScope> + itemsKey(childQ.key)\n const nestedArrKey = itemsKey(childQ.key as string);\n const nestedArr: unknown[] = (getIn(values, [...itemScope, nestedArrKey]) as unknown[]) ?? [];\n const nestedCount = Math.max(1, nestedArr.length || 1);\n\n const nestedPush = () => {\n const next = setInImmutable(values, [...itemScope, nestedArrKey, nestedArr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n const nestedPop = () => {\n const nextArr = nestedArr.slice(0, Math.max(0, nestedArr.length - 1));\n const next = setInImmutable(values, [...itemScope, nestedArrKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n return (\n <div key={`nested-repeat-${groupId}-${bci}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPush}>\n Add another\n </button>\n {nestedCount > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPop}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: nestedCount }).map((__, nIdx) => {\n const nestedScope: ScopePath = [...itemScope, nestedArrKey, nIdx];\n return (\n <div key={`nested-item-${groupId}-${bci}-${nIdx}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{nIdx + 1}</div>\n {renderRecursive(grandChildren, nestedScope)}\n </div>\n );\n })}\n </div>\n );\n });\n })()}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n });\n }\n\n // Visible (non-repeatable) only — used for Enter-to-continue validation feedback\n const visibleFlat = useMemo(() => {\n const out: Question[] = [];\n const walk = (list: Question[], scopePath?: ScopePath) => {\n list.forEach((q) => {\n out.push(q);\n const key = String(q.key);\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const v = scopedRead(values, scopePath, key);\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // item-level handled on wizard side\n walk(children, scopePath);\n });\n });\n };\n walk(keyedQuestions);\n return out;\n }, [keyedQuestions, values]);\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n const eMap = validateQuestions(visibleFlat as Question[], values);\n setErrors(eMap);\n\n if (Object.keys(eMap).length > 0) {\n const firstIdx = visibleFlat.findIndex((q) => eMap[q.key as string]);\n if (firstIdx >= 0) document.getElementById(visibleFlat[firstIdx].key as string)?.focus();\n return;\n }\n onSubmit(values);\n }\n\n return (\n <form className=\"space-y-6 px-1\" onSubmit={handleSubmit} noValidate>\n {renderRecursive(keyedQuestions)}\n </form>\n );\n}\n\nexport default FormRenderer;\n","/**\n * Google Tag Manager dataLayer helpers for the Credify Insurance Widget.\n * Pushes events at each step so GTM can trigger tags (e.g. GTM-NK8LGHTQ).\n */\n\nexport const GTM_CONTAINER_ID = 'GTM-NK8LGHTQ';\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n if (typeof window === 'undefined') return [];\n window.dataLayer = window.dataLayer ?? [];\n return window.dataLayer;\n}\n\nexport function pushDataLayerEvent(eventName: string, payload: Record<string, unknown> = {}): void {\n const dataLayer = getDataLayer();\n dataLayer.push({\n event: eventName,\n credifyWidget: {\n ...payload,\n containerId: GTM_CONTAINER_ID\n }\n });\n}\n\n/** Widget was opened */\nexport function pushWidgetOpened(): void {\n pushDataLayerEvent('credify_widget_opened');\n}\n\n/** Widget was closed */\nexport function pushWidgetClosed(): void {\n pushDataLayerEvent('credify_widget_closed');\n}\n\n/** User viewed a form stage (step) */\nexport function pushStageViewed(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_viewed', payload);\n}\n\n/** User completed a form stage (clicked Next successfully) */\nexport function pushStageCompleted(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_completed', payload);\n}\n\n/** User completed all stages and rates were requested */\nexport function pushFlowCompleted(): void {\n pushDataLayerEvent('credify_widget_flow_completed');\n}\n\n/** User is viewing the rates screen */\nexport function pushRatesViewed(payload?: { rateCount?: number }): void {\n pushDataLayerEvent('credify_widget_rates_viewed', payload ?? {});\n}\n\n/** User clicked Back from the rates screen */\nexport function pushRatesBack(): void {\n pushDataLayerEvent('credify_widget_rates_back');\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport { FormRenderer } from './index';\n\nimport { ensureKey, validateQuestions, type StageMeta, type FormValues } from '../utils/form';\nimport { pushStageViewed } from '../utils/gtm';\n\n/* ---------- conditional helpers (mirrors renderer) ---------- */\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(v: unknown, type: ConditionalNode['conditionalType'], rhs: unknown): boolean {\n switch (type) {\n case 'equals':\n return v === rhs;\n case 'lessThan': {\n const c = cmp(v, rhs);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(v, rhs);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(v, rhs);\n case 'startsWith':\n return v != null && rhs != null && String(v).startsWith(String(rhs));\n case 'endsWith':\n return v != null && rhs != null && String(v).endsWith(String(rhs));\n default:\n return false;\n }\n}\n\n/* ---------- visibility (non-repeatable) ---------- */\nfunction flattenVisibleQuestions(root: ReadonlyArray<Question>, values: FormValues): ReadonlyArray<Question> {\n const out: Question[] = [];\n const walk = (list: ReadonlyArray<Question>) => {\n list.forEach((q) => {\n out.push(q);\n const key = String(q.key);\n const v = values[key];\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // handled per-item below\n children.forEach((child) => out.push(child));\n });\n });\n };\n walk(root);\n return out;\n}\n\n/* ---------- repeatable validation (any depth) ---------- */\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\nfunction validateRepeatablesRecursive(questions: ReadonlyArray<Question>, valuesAtScope: FormValues): boolean {\n // returns true if any blocking error exists\n for (const q of questions) {\n const qKey = String(q.key);\n const qVal = valuesAtScope[qKey];\n const conds = q.conditionals ?? [];\n if (!conds.length) continue;\n\n const matches = conds.filter((c) => evalConditional(qVal, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n for (const b of branches) {\n const children = (b.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) continue;\n\n if (!b.conditionalQuestionsAllowMultiple) {\n // non-repeatable: keep walking for deeper repeats\n if (validateRepeatablesRecursive(children, valuesAtScope)) return true;\n continue;\n }\n\n // repeatable at this scope\n const arr = (valuesAtScope[itemsKey(qKey)] as unknown[]) ?? [];\n if (arr.length === 0) return true; // must have at least one entry\n\n for (const item of arr as Array<Record<string, unknown>>) {\n // 1) validate required fields for this item's children\n const itemErrors = validateQuestions(children, item as FormValues);\n if (Object.values(itemErrors).some(Boolean)) return true;\n\n // 2) recursively validate nested repeatables within this item\n if (validateRepeatablesRecursive(children, item as FormValues)) return true;\n }\n }\n }\n return false;\n}\n\n/** True when any visible repeatable branch (at any depth) is missing items or has invalid items */\nfunction hasRepeatableBlockingErrors(questions: ReadonlyArray<Question>, rootValues: FormValues): boolean {\n return validateRepeatablesRecursive(questions, rootValues);\n}\n\ntype CompleteCallback = (values: FormValues, stageKey: string) => Promise<{ success: boolean; error?: string }>;\n\n/* -------------------------------- component -------------------------------- */\nexport function FormWizard({\n stages,\n onStageComplete,\n onComplete,\n initialValues,\n initialActive\n}: {\n stages: StageMeta[];\n onStageComplete: CompleteCallback;\n onComplete: CompleteCallback;\n initialValues?: FormValues;\n initialActive?: number;\n}) {\n const [active, setActive] = useState(initialActive ?? 0);\n const [allValues, setAllValues] = useState<FormValues>(initialValues ?? {});\n const [perStageQuestions, setPerStageQuestions] = useState<Record<string, Question[]>>({});\n const [loading, setLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [stageError, setStageError] = useState<string | null>(null);\n const stepRefs = useRef<(HTMLLIElement | null)[]>([]);\n\n const hasStages = Array.isArray(stages) && stages.length > 0;\n const stage = hasStages ? stages[Math.min(active, stages.length - 1)] : null;\n const stageKey = stage?.key ?? null;\n\n // Update active stage when initialActive changes (e.g., when going back from rates)\n useEffect(() => {\n if (initialActive !== undefined) {\n setActive(initialActive);\n }\n }, [initialActive]);\n\n // Scroll active step into view\n useEffect(() => {\n const activeElement = stepRefs.current[active];\n if (activeElement) {\n activeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [active]);\n\n // Update form values when initialValues changes (e.g., when going back from rates)\n // Only update if initialValues is provided (not undefined/null)\n useEffect(() => {\n if (initialValues !== undefined) {\n setAllValues(initialValues);\n }\n }, [initialValues]);\n\n useEffect(() => {\n if (!stage || !stageKey) {\n setLoading(false);\n setStageError(null);\n return;\n }\n if (perStageQuestions[stageKey]) {\n setLoading(false);\n setStageError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setStageError(null);\n\n Promise.resolve(stage.loadQuestions())\n .then((qs) => {\n if (cancelled) return;\n if (!Array.isArray(qs)) throw new Error(`loadQuestions(\"${stageKey}\") did not return an array`);\n setPerStageQuestions((m) => ({ ...m, [stageKey]: qs }));\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((err: any) => {\n if (cancelled) return;\n setStageError(`Failed to load stage \"${stage?.title ?? ''}\": ${err?.message ?? 'Unknown error'}`);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [stage, stageKey, perStageQuestions]);\n\n const questions = stageKey ? perStageQuestions[stageKey] : undefined;\n\n // GTM: stage viewed (when questions for this stage have loaded)\n useEffect(() => {\n if (stage && stageKey && questions) {\n pushStageViewed({\n stageKey,\n stageTitle: stage.title ?? stageKey,\n stepIndex: active + 1,\n totalSteps: stages.length\n });\n }\n }, [stageKey, active, stages.length, stage, questions]);\n\n // Values slice for current stage (+ keep any __items arrays)\n const currentValues = useMemo(() => {\n if (!questions) return {};\n const slice: FormValues = {};\n\n // Helper function to recursively collect all nested question keys\n const collectAllQuestionKeys = (questionList: Question[]): string[] => {\n const keys: string[] = [];\n const walk = (list: Question[]) => {\n list.forEach((q, i) => {\n const k = ensureKey(q, i);\n keys.push(k);\n const kItems = itemsKey(k);\n keys.push(kItems);\n\n // Recursively collect keys from conditional questions\n const conds = q.conditionals ?? [];\n conds.forEach((c) => {\n const children = (c.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n walk(children);\n }\n });\n });\n };\n walk(questionList);\n return keys;\n };\n\n // Get all keys that could be relevant to this stage (including nested conditionals)\n const allRelevantKeys = collectAllQuestionKeys(questions);\n\n // Include values for all relevant keys\n allRelevantKeys.forEach((k) => {\n if (k in allValues) slice[k] = allValues[k];\n });\n // include any orphaned *_ _items keys to keep sub-arrays alive\n for (const [k, v] of Object.entries(allValues)) {\n if (k.endsWith(ITEMS_SUFFIX) && !(k in slice)) slice[k] = v;\n }\n return slice;\n }, [questions, allValues]);\n\n const updateCurrentValues = (next: FormValues) => {\n setAllValues((prev) => ({ ...prev, ...next }));\n };\n\n const goPrev = () => {\n setActive((i) => (i > 0 ? i - 1 : 0));\n document.querySelector<HTMLElement>('.panel-body')?.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior });\n };\n\n const goNext = async () => {\n if (!questions || !stage || loading || stageError || isSubmitting) return;\n\n // flat (visible, non-repeatable) validation\n const visible = flattenVisibleQuestions(questions, allValues);\n const flatErrors = validateQuestions(visible as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n\n // repeatable validation (any depth)\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n\n if (flatBlock || repeatBlock) return;\n\n setIsSubmitting(true);\n try {\n const nextIndex = Math.min(active + 1, stages.length - 1);\n const isComplete = active >= stages.length - 1;\n const { success, error } = isComplete ? await onComplete(allValues, stageKey ?? '') : await onStageComplete(currentValues, stageKey ?? '');\n if (!success) {\n setStageError(error ?? 'An error occurred');\n return;\n }\n if (!isComplete) setActive(nextIndex);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // LIVE disabled state for the Next button (always rendered)\n const disableNext = useMemo(() => {\n if (!questions || loading || !!stageError || isSubmitting) return true;\n const visible = flattenVisibleQuestions(questions, allValues);\n const flatErrors = validateQuestions(visible as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n return flatBlock || repeatBlock;\n }, [questions, allValues, loading, stageError, isSubmitting]);\n\n if (!hasStages) return <div className=\"text-slate-600\">Loading...</div>;\n\n return (\n <div className=\"space-y-6\">\n {/* progress header */}\n <div className=\"form-wizard-steps-header flex items-center justify-between gap-4\">\n <ol\n className=\"form-wizard-steps flex gap-2 text-xs overflow-x-auto flex-1 pb-1 scrollbar-hide items-center\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {stages.flatMap((s, i) => [\n <li\n key={s.key ?? `stage-${i}`}\n ref={(el) => {\n stepRefs.current[i] = el;\n }}\n className={`form-wizard-step-pill px-2.5 py-1 rounded-full border whitespace-nowrap flex-shrink-0 ${\n i < active\n ? 'bg-blue-600 text-white border-blue-600'\n : i === active\n ? 'border-blue-600 text-blue-600 bg-white'\n : 'border-slate-200 text-slate-600'\n }`}\n >\n {s.title}\n </li>,\n ...(i < stages.length - 1\n ? [\n <li key={`arrow-${s.key ?? i}`} className=\"form-wizard-step-arrow text-slate-400 flex-shrink-0\">\n →\n </li>\n ]\n : [])\n ])}\n </ol>\n <div className=\"form-wizard-step-counter text-sm text-slate-500 flex-shrink-0\">\n {Math.min(active + 1, stages.length)} / {stages.length}\n </div>\n </div>\n\n {/* stage content */}\n <div>\n {loading && <div className=\"text-slate-500\">Loading…</div>}\n\n {stage && (\n <FormRenderer\n key={stage.key}\n questions={questions ?? []}\n controlledValues={currentValues}\n onChangeValues={updateCurrentValues}\n onSubmit={() => goNext()} // Enter key advances\n />\n )}\n </div>\n\n {/* error message */}\n {!loading && stageError && (\n <div className=\"text-red-600 text-sm -mt-4\">\n <div>{stageError}</div>\n {stage && (\n <button\n type=\"button\"\n className=\"credify-retry-btn underline mt-1 font-bold\"\n onClick={() => {\n setPerStageQuestions((m) => {\n if (!stageKey) return m;\n const copy = { ...m };\n delete copy[stageKey];\n return copy;\n });\n }}\n >\n Retry\n </button>\n )}\n </div>\n )}\n\n {/* footer (always visible) */}\n <div className={active > 0 ? 'grid grid-cols-2 gap-3' : ''}>\n {active > 0 && (\n <button\n type=\"button\"\n onClick={goPrev}\n disabled={loading}\n className=\"credify-btn-back h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition\"\n >\n Back\n </button>\n )}\n\n <button\n type=\"button\"\n data-widget-ctrl=\"next\"\n onClick={goNext}\n disabled={disableNext}\n className={[\n 'form-wizard-next-btn',\n active > 0 ? '' : 'w-full',\n 'h-12 rounded-full text-white transition',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'flex items-center justify-center gap-2',\n disableNext\n ? 'bg-gray-300'\n : 'bg-blue-600 hover:bg-blue-600/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 bg-primary hover:bg-primary/90 focus-visible:ring-primary/40'\n ].join(' ')}\n >\n {isSubmitting && (\n <svg className=\"animate-spin h-5 w-5 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {active === stages.length - 1 ? 'Finish' : 'Next'}\n </button>\n </div>\n </div>\n );\n}\n\nexport default FormWizard;\n","const QUOTE_ID_KEY = 'credify_quote_id';\nconst AUTH_TOKEN_KEY = 'credify_auth_token';\n\n/**\n * Save quoteId to localStorage\n */\nexport function saveQuoteId(quoteId: string): void {\n try {\n localStorage.setItem(QUOTE_ID_KEY, quoteId);\n } catch (error) {\n console.error('Failed to save quoteId to localStorage:', error);\n }\n}\n\n/**\n * Load quoteId from localStorage\n */\nexport function loadQuoteId(): string | null {\n try {\n return localStorage.getItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to load quoteId from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear quoteId from localStorage\n */\nexport function clearQuoteId(): void {\n try {\n localStorage.removeItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to clear quoteId from localStorage:', error);\n }\n}\n\n/**\n * Save authToken to localStorage\n */\nexport function saveAuthToken(token: string): void {\n try {\n localStorage.setItem(AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.error('Failed to save authToken to localStorage:', error);\n }\n}\n\n/**\n * Load authToken from localStorage\n */\nexport function loadAuthToken(): string | null {\n try {\n return localStorage.getItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to load authToken from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear authToken from localStorage\n */\nexport function clearAuthToken(): void {\n try {\n localStorage.removeItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to clear authToken from localStorage:', error);\n }\n}\n\n/**\n * Clear all quote-related data from localStorage\n */\nexport function clearAllQuoteData(): void {\n clearQuoteId();\n clearAuthToken();\n}\n","import type { Stage, Question, GetRatesResponse } from '@getcredify/credify-insurance-types';\nimport type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\nimport { saveAuthToken, loadAuthToken, clearAuthToken as clearAuthTokenStorage } from './storage';\n\nconst BASE_URL = 'https://api.getcredify.com';\n\n// Store JWT token in memory\nlet authToken: string | null = null;\n\nexport function setAuthToken(token: string): void {\n authToken = token;\n saveAuthToken(token);\n}\n\nexport function getAuthToken(): string | null {\n return authToken;\n}\n\nexport function loadAuthTokenFromStorage(): void {\n const storedToken = loadAuthToken();\n if (storedToken) {\n authToken = storedToken;\n }\n}\n\nexport function clearAuthToken(): void {\n authToken = null;\n clearAuthTokenStorage();\n}\n\nasync function makeAuthenticatedRequest(url: string, body: object): Promise<Response> {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json'\n };\n\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n let errorMessage = `Request failed with status ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorMessage;\n } catch {\n // If response is not JSON, use status text\n errorMessage = response.statusText || errorMessage;\n }\n const error = new Error(errorMessage) as Error & { statusCode?: number };\n error.statusCode = response.status;\n throw error;\n }\n\n return response;\n}\n\nexport async function getQuestionsByStage(stage: Stage): Promise<{ questions: Question[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-questions-by-stage`, { stage });\n const data = await response.json();\n return data;\n}\n\nexport async function getStagesForQuote(): Promise<{ stages: Stage[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-stages-for-quote`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function createQuote(phone: string): Promise<{ quoteId: string }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/create-quote`, { phone });\n const data = await response.json();\n if (!data || typeof data !== 'object' || !data.quoteId) {\n throw new Error(`Invalid createQuote response: ${JSON.stringify(data)}`);\n }\n return data;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport async function updateQuote(payload: FormValues & { current_stage?: string }, getRates: boolean, quoteId?: string): Promise<{}> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n // Only include quoteId if it's a valid non-empty string\n const body: { payload: FormValues & { current_stage?: string }; getRates: boolean; quoteId?: string } = { payload, getRates };\n if (quoteId && typeof quoteId === 'string' && quoteId.trim() !== '') {\n body.quoteId = quoteId;\n }\n const response = await makeAuthenticatedRequest(`${BASE_URL}/update-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function verifyQuote(quoteId: string, smsCode: string): Promise<{ isVerified: boolean; token: string | null }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/verify-quote`, { quoteId, smsCode });\n const data = await response.json();\n return data;\n}\n\nexport async function isSupportedState(state: string): Promise<{ isSupported: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/is-supported-state`, { state });\n const data = await response.json();\n return data;\n}\n\nexport async function getRates(): Promise<{ rates: GetRatesResponse }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-rates`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function getQuote(quoteId?: string): Promise<{ quote: Quote }> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n const body = quoteId ? { quoteId } : {};\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function requestBind(quoteRateId: string): Promise<{ success?: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/request-bind`, { quoteRateId });\n const data = await response.json();\n // Backend returns {} on success, so return it with success: true\n return data && typeof data === 'object' && 'success' in data ? data : { success: true };\n}\n","import { useState, useEffect } from 'react';\n\nimport type { GetRatesResponse } from '@getcredify/credify-insurance-types';\n\nimport { requestBind, loadAuthTokenFromStorage, getAuthToken, clearAuthToken } from '../utils/api';\nimport { clearAllQuoteData } from '../utils/storage';\nimport { pushRatesBack } from '../utils/gtm';\n\nconst currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n});\n\ntype RequestStatus = 'idle' | 'loading' | 'success' | 'error';\n\nfunction BackButton({ onBack }: { onBack?: () => void }) {\n const handleBack = () => {\n pushRatesBack();\n onBack?.();\n };\n return (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"credify-btn-back credify-btn-back-rates h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition w-full\"\n >\n Back\n </button>\n );\n}\n\nexport function Rates({ rates, onBack }: { rates: GetRatesResponse; onBack?: () => void }) {\n const hasRates = Array.isArray(rates) && rates.length > 0;\n const [requestStatuses, setRequestStatuses] = useState<Record<string, RequestStatus>>({});\n\n // Load auth token from localStorage when component mounts\n useEffect(() => {\n loadAuthTokenFromStorage();\n }, []);\n\n if (!hasRates) {\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <p className=\"mt-2 text-sm text-slate-500\">No rates are available at this time.</p>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n }\n\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <div className=\"mt-4 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {rates.map((rate) => {\n const premiumDollars = rate.premium_cents / 100;\n const formattedPremium = currencyFormatter.format(premiumDollars);\n const cardKey = rate.quote_rate_id;\n const status = requestStatuses[cardKey] ?? 'idle';\n const isRequesting = status === 'loading';\n const isRequested = status === 'success';\n\n const handleRequestBind = async () => {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'loading' }));\n try {\n // Ensure auth token is loaded from localStorage before making the request\n loadAuthTokenFromStorage();\n const token = getAuthToken();\n if (!token) {\n throw new Error('Authentication required. Please verify your phone number first.');\n }\n const result = await requestBind(rate.quote_rate_id);\n // Backend returns {} on success, so if we get here without an error, it's successful\n // Check for success property if present, otherwise assume success if no error\n const success = result?.success !== false;\n if (!success) throw new Error('Request failed');\n\n // Clear all quote data from localStorage and memory so user starts fresh on return\n clearAllQuoteData();\n clearAuthToken();\n\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'success' }));\n } catch {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'error' }));\n }\n };\n\n return (\n <div key={cardKey} className=\"flex flex-col rounded-xl border border-slate-200 bg-white p-6 shadow-sm transition hover:shadow-md\">\n {/* Carrier Logo and Name */}\n <div className=\"mb-4 flex items-center gap-3\">\n {rate.carrier_logo_base64 ? (\n <img src={`data:image/png;base64,${rate.carrier_logo_base64}`} alt={rate.carrier_name} className=\"h-12 w-auto object-contain\" />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md bg-slate-100 text-sm font-semibold text-slate-500\">\n {rate.carrier_name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex-1\">\n <h4 className=\"font-semibold text-slate-900\">{rate.carrier_name}</h4>\n </div>\n </div>\n\n {/* Premium */}\n <div className=\"mb-2\">\n <p className=\"text-sm text-slate-500\">Premium</p>\n <p className=\"text-2xl font-bold text-slate-900\">{formattedPremium}</p>\n </div>\n\n {/* Term */}\n <div className=\"mb-4\">\n <p className=\"text-sm text-slate-500\">Term</p>\n <p className=\"font-medium text-slate-700\">{rate.term_months} months</p>\n </div>\n\n {/* Carrier Quote ID */}\n {rate.carrier_quote_id && (\n <div className=\"mb-4\">\n <p className=\"text-xs text-slate-400\">Quote ID: {rate.carrier_quote_id}</p>\n </div>\n )}\n\n {/* Request Bind Button */}\n <div className=\"mt-auto pt-4\">\n <button\n type=\"button\"\n onClick={handleRequestBind}\n disabled={isRequesting || isRequested}\n className={`rates-bind-btn w-full rounded-full px-4 py-2.5 text-sm font-semibold transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 disabled:cursor-not-allowed ${\n isRequested ? 'rates-bind-btn-requested' : 'hover:bg-blue-600/90 disabled:bg-slate-300 disabled:text-slate-500'\n }`}\n >\n {isRequesting ? 'Requesting…' : isRequested ? 'Requested' : 'Request Bind'}\n </button>\n {status === 'error' && <p className=\"mt-2 text-xs text-red-600\">Something went wrong. Please try again.</p>}\n {status === 'success' && <p className=\"mt-2 text-xs text-emerald-600\">We received your bind request.</p>}\n </div>\n </div>\n );\n })}\n </div>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n}\n","import type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\n\n/**\n * Convert boolean to \"Yes\"/\"No\" string (reverse of transformFormValues)\n */\nexport function convertBooleanToYesNo(value: boolean | null | undefined): string | undefined {\n if (value === true) return 'Yes';\n if (value === false) return 'No';\n return undefined;\n}\n\n/**\n * Format date to YYYY-MM-DD string format\n */\nexport function formatDate(date: Date | string | null | undefined): string | undefined {\n if (!date) return undefined;\n try {\n const d = typeof date === 'string' ? new Date(date) : date;\n if (isNaN(d.getTime())) return undefined;\n return d.toISOString().split('T')[0];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Transform quote data from database format to form values\n */\nexport function quoteToFormValues(quote: Quote): FormValues {\n const formValues: FormValues = {};\n\n // Root quote fields\n if (quote.phone) formValues.phone = quote.phone;\n if (quote.first_name) formValues.first_name = quote.first_name;\n if (quote.last_name) formValues.last_name = quote.last_name;\n if (quote.email) formValues.email = quote.email;\n if (quote.date_of_birth) formValues.date_of_birth = formatDate(quote.date_of_birth);\n if (quote.product) formValues.product = quote.product;\n if (quote.state) formValues.state = quote.state;\n\n // Combine address fields into a single address string\n const addressParts: string[] = [];\n if (quote.line_1) addressParts.push(quote.line_1);\n if (quote.line_2) addressParts.push(quote.line_2);\n if (quote.city) addressParts.push(quote.city);\n if (quote.state) addressParts.push(quote.state);\n if (quote.postal_code) addressParts.push(quote.postal_code);\n if (addressParts.length > 0) {\n formValues.address = addressParts.join(', ');\n }\n\n if (quote.years_at_address !== null && quote.years_at_address !== undefined) formValues.years_at_address = quote.years_at_address;\n if (quote.months_at_address !== null && quote.months_at_address !== undefined) formValues.months_at_address = quote.months_at_address;\n if (quote.move_in_date) formValues.move_in_date = formatDate(quote.move_in_date);\n\n // Combine prior address fields into a single prior_address string\n const priorAddressParts: string[] = [];\n if (quote.prior_line_1) priorAddressParts.push(quote.prior_line_1);\n if (quote.prior_line_2) priorAddressParts.push(quote.prior_line_2);\n if (quote.prior_city) priorAddressParts.push(quote.prior_city);\n if (quote.prior_state) priorAddressParts.push(quote.prior_state);\n if (quote.prior_postal_code) priorAddressParts.push(quote.prior_postal_code);\n if (priorAddressParts.length > 0) {\n formValues.prior_address = priorAddressParts.join(', ');\n }\n\n if (quote.years_at_prior_address !== null && quote.years_at_prior_address !== undefined)\n formValues.years_at_prior_address = quote.years_at_prior_address;\n\n // Auto prior insurance fields\n if (quote.auto_has_prior_insurance !== null && quote.auto_has_prior_insurance !== undefined) {\n formValues.auto_has_prior_insurance = convertBooleanToYesNo(quote.auto_has_prior_insurance);\n }\n if (quote.auto_prior_expiration_date) formValues.auto_prior_expiration_date = formatDate(quote.auto_prior_expiration_date);\n if (quote.auto_prior_carrier_name) formValues.auto_prior_carrier_name = quote.auto_prior_carrier_name;\n if (quote.auto_prior_liability_limit) formValues.auto_prior_liability_limit = quote.auto_prior_liability_limit;\n if (quote.auto_reason_for_no_insurance) formValues.auto_reason_for_no_insurance = quote.auto_reason_for_no_insurance;\n if (quote.auto_prior_years !== null && quote.auto_prior_years !== undefined) formValues.auto_prior_years = quote.auto_prior_years;\n if (quote.auto_prior_months !== null && quote.auto_prior_months !== undefined) formValues.auto_prior_months = quote.auto_prior_months;\n if (quote.auto_continuous_coverage_years !== null && quote.auto_continuous_coverage_years !== undefined) {\n formValues.auto_continuous_coverage_years = quote.auto_continuous_coverage_years;\n }\n if (quote.auto_cancelled_declined_refused_to_renew !== null && quote.auto_cancelled_declined_refused_to_renew !== undefined) {\n formValues.auto_cancelled_declined_refused_to_renew = convertBooleanToYesNo(quote.auto_cancelled_declined_refused_to_renew);\n }\n\n // Home prior insurance fields\n if (quote.home_has_prior_insurance !== null && quote.home_has_prior_insurance !== undefined) {\n formValues.home_has_prior_insurance = convertBooleanToYesNo(quote.home_has_prior_insurance);\n }\n if (quote.home_prior_expiration_date) formValues.home_prior_expiration_date = formatDate(quote.home_prior_expiration_date);\n if (quote.home_prior_carrier_name) formValues.home_prior_carrier_name = quote.home_prior_carrier_name;\n\n // Home property fields\n if (quote.year_built !== null && quote.year_built !== undefined) formValues.year_built = quote.year_built;\n if (quote.number_of_units !== null && quote.number_of_units !== undefined) formValues.number_of_units = quote.number_of_units;\n if (quote.number_of_stories !== null && quote.number_of_stories !== undefined) formValues.number_of_stories = quote.number_of_stories;\n if (quote.number_of_beds !== null && quote.number_of_beds !== undefined) formValues.number_of_beds = quote.number_of_beds;\n if (quote.number_of_full_baths !== null && quote.number_of_full_baths !== undefined) formValues.number_of_full_baths = quote.number_of_full_baths;\n if (quote.number_of_partial_baths !== null && quote.number_of_partial_baths !== undefined) {\n formValues.number_of_partial_baths = quote.number_of_partial_baths;\n }\n if (quote.under_construction !== null && quote.under_construction !== undefined) {\n formValues.under_construction = convertBooleanToYesNo(quote.under_construction);\n }\n if (quote.distance_from_fire_hydrant_ft) formValues.distance_from_fire_hydrant_ft = quote.distance_from_fire_hydrant_ft;\n if (quote.distance_from_fire_station_miles) formValues.distance_from_fire_station_miles = quote.distance_from_fire_station_miles;\n if (quote.architectural_style) formValues.architectural_style = quote.architectural_style;\n if (quote.dwelling_type) formValues.dwelling_type = quote.dwelling_type;\n if (quote.construction_quality) formValues.construction_quality = quote.construction_quality;\n if (quote.located_over_water !== null && quote.located_over_water !== undefined) {\n formValues.located_over_water = quote.located_over_water;\n }\n if (quote.construction_type) formValues.construction_type = quote.construction_type;\n if (quote.exterior_wall_type) formValues.exterior_wall_type = quote.exterior_wall_type;\n if (quote.foundation_type) formValues.foundation_type = quote.foundation_type;\n if (quote.roof_material_type) formValues.roof_material_type = quote.roof_material_type;\n if (quote.year_roof_updated !== null && quote.year_roof_updated !== undefined) formValues.year_roof_updated = quote.year_roof_updated;\n if (quote.heating_type) formValues.heating_type = quote.heating_type;\n if (quote.heating_fuel_type) formValues.heating_fuel_type = quote.heating_fuel_type;\n if (quote.number_of_fireplaces !== null && quote.number_of_fireplaces !== undefined) {\n formValues.number_of_fireplaces = quote.number_of_fireplaces;\n }\n if (quote.basement_type) formValues.basement_type = quote.basement_type;\n if (quote.parking_type) formValues.parking_type = quote.parking_type;\n if (quote.number_of_parking_spaces !== null && quote.number_of_parking_spaces !== undefined) {\n formValues.number_of_parking_spaces = quote.number_of_parking_spaces;\n }\n if (quote.plumbing_type) formValues.plumbing_type = quote.plumbing_type;\n if (quote.pool_type) formValues.pool_type = quote.pool_type;\n if (quote.total_area_sq_ft !== null && quote.total_area_sq_ft !== undefined) formValues.total_area_sq_ft = quote.total_area_sq_ft;\n if (quote.parcel_area_sq_ft !== null && quote.parcel_area_sq_ft !== undefined) formValues.parcel_area_sq_ft = quote.parcel_area_sq_ft;\n if (quote.residence_type) formValues.residence_type = quote.residence_type;\n if (quote.usage_type) formValues.usage_type = quote.usage_type;\n if (quote.household_size !== null && quote.household_size !== undefined) formValues.household_size = quote.household_size;\n if (quote.number_of_mortgagees !== null && quote.number_of_mortgagees !== undefined) {\n formValues.number_of_mortgagees = quote.number_of_mortgagees;\n }\n if (quote.has_dog !== null && quote.has_dog !== undefined) formValues.has_dog = convertBooleanToYesNo(quote.has_dog);\n if (quote.dog_breed_type) formValues.dog_breed_type = quote.dog_breed_type;\n if (quote.number_of_dogs !== null && quote.number_of_dogs !== undefined) formValues.number_of_dogs = quote.number_of_dogs;\n if (quote.has_business_on_premises !== null && quote.has_business_on_premises !== undefined) {\n formValues.has_business_on_premises = convertBooleanToYesNo(quote.has_business_on_premises);\n }\n if (quote.business_class) formValues.business_class = quote.business_class;\n\n // Discount fields\n if (quote.retiree_discount !== null && quote.retiree_discount !== undefined) {\n formValues.retiree_discount = convertBooleanToYesNo(quote.retiree_discount);\n }\n if (quote.gated_community_discount !== null && quote.gated_community_discount !== undefined) {\n formValues.gated_community_discount = convertBooleanToYesNo(quote.gated_community_discount);\n }\n if (quote.multi_policy_discount !== null && quote.multi_policy_discount !== undefined) {\n formValues.multi_policy_discount = convertBooleanToYesNo(quote.multi_policy_discount);\n }\n if (quote.non_smoker_discount !== null && quote.non_smoker_discount !== undefined) {\n formValues.non_smoker_discount = convertBooleanToYesNo(quote.non_smoker_discount);\n }\n if (quote.first_time_buyer_discount !== null && quote.first_time_buyer_discount !== undefined) {\n formValues.first_time_buyer_discount = convertBooleanToYesNo(quote.first_time_buyer_discount);\n }\n\n // Safety features\n if (quote.fire_detection_system !== null && quote.fire_detection_system !== undefined) {\n formValues.fire_detection_system = convertBooleanToYesNo(quote.fire_detection_system);\n }\n if (quote.burglar_alarm_system !== null && quote.burglar_alarm_system !== undefined) {\n formValues.burglar_alarm_system = convertBooleanToYesNo(quote.burglar_alarm_system);\n }\n if (quote.burglar_alarm_system_type) formValues.burglar_alarm_system_type = quote.burglar_alarm_system_type;\n if (quote.smoke_detectors !== null && quote.smoke_detectors !== undefined) {\n formValues.smoke_detectors = convertBooleanToYesNo(quote.smoke_detectors);\n }\n if (quote.sprinkler_system !== null && quote.sprinkler_system !== undefined) {\n formValues.sprinkler_system = convertBooleanToYesNo(quote.sprinkler_system);\n }\n if (quote.sprinkler_system_type) formValues.sprinkler_system_type = quote.sprinkler_system_type;\n if (quote.gas_leakage_detector !== null && quote.gas_leakage_detector !== undefined) {\n formValues.gas_leakage_detector = convertBooleanToYesNo(quote.gas_leakage_detector);\n }\n if (quote.deadbolt_locks !== null && quote.deadbolt_locks !== undefined) {\n formValues.deadbolt_locks = convertBooleanToYesNo(quote.deadbolt_locks);\n }\n if (quote.fire_extinguisher !== null && quote.fire_extinguisher !== undefined) {\n formValues.fire_extinguisher = convertBooleanToYesNo(quote.fire_extinguisher);\n }\n\n // Other boolean fields\n if (quote.order_credit_authorized !== null && quote.order_credit_authorized !== undefined) {\n formValues.order_credit_authorized = convertBooleanToYesNo(quote.order_credit_authorized);\n }\n if (quote.has_health_insurance_auto_accident !== null && quote.has_health_insurance_auto_accident !== undefined) {\n formValues.has_health_insurance_auto_accident = convertBooleanToYesNo(quote.has_health_insurance_auto_accident);\n }\n if (quote.named_insured_foreclosure_repo_bankruptcy !== null && quote.named_insured_foreclosure_repo_bankruptcy !== undefined) {\n formValues.named_insured_foreclosure_repo_bankruptcy = convertBooleanToYesNo(quote.named_insured_foreclosure_repo_bankruptcy);\n }\n if (quote.named_insured_convicted_insurance_fraud !== null && quote.named_insured_convicted_insurance_fraud !== undefined) {\n formValues.named_insured_convicted_insurance_fraud = convertBooleanToYesNo(quote.named_insured_convicted_insurance_fraud);\n }\n\n // Set \"Add Drivers\" checkbox based on whether drivers exist\n if (quote.drivers && quote.drivers.length > 0) {\n formValues.drivers = 'Yes';\n formValues.drivers__items = quote.drivers.map((driver) => {\n const driverValues: FormValues = {};\n if (driver.first_name) driverValues.first_name = driver.first_name;\n if (driver.last_name) driverValues.last_name = driver.last_name;\n if (driver.date_of_birth) driverValues.date_of_birth = formatDate(driver.date_of_birth);\n if (driver.gender) driverValues.gender = driver.gender;\n if (driver.marital_status) driverValues.marital_status = driver.marital_status;\n if (driver.relationship_to_insured) driverValues.relationship_to_insured = driver.relationship_to_insured;\n if (driver.license_state) driverValues.license_state = driver.license_state;\n if (driver.license_status) driverValues.license_status = driver.license_status;\n if (driver.license_number) driverValues.license_number = driver.license_number;\n if (driver.date_first_licensed) driverValues.date_first_licensed = formatDate(driver.date_first_licensed);\n if (driver.education_level) driverValues.education_level = driver.education_level;\n if (driver.occupation) driverValues.occupation = driver.occupation;\n if (driver.industry) driverValues.industry = driver.industry;\n\n // Driver violations\n if (driver.driver_violations && driver.driver_violations.length > 0) {\n driverValues.driver_violations__items = driver.driver_violations.map((violation) => {\n const violationValues: FormValues = {};\n if (violation.code) violationValues.code = violation.code;\n if (violation.occurred_at) violationValues.occurred_at = formatDate(violation.occurred_at);\n return violationValues;\n });\n }\n\n // Driver accidents\n if (driver.driver_accidents && driver.driver_accidents.length > 0) {\n driverValues.driver_accidents__items = driver.driver_accidents.map((accident) => {\n const accidentValues: FormValues = {};\n if (accident.occurred_at) accidentValues.occurred_at = formatDate(accident.occurred_at);\n if (accident.description) accidentValues.description = accident.description;\n if (accident.quote_vehicle_id) accidentValues.quote_vehicle_id = accident.quote_vehicle_id;\n if (accident.property_damage_amount_paid_cents !== null && accident.property_damage_amount_paid_cents !== undefined) {\n accidentValues.property_damage_amount_paid_cents = accident.property_damage_amount_paid_cents;\n }\n if (accident.personal_injury_amount_paid_cents !== null && accident.personal_injury_amount_paid_cents !== undefined) {\n accidentValues.personal_injury_amount_paid_cents = accident.personal_injury_amount_paid_cents;\n }\n return accidentValues;\n });\n }\n\n // Driver losses (nested under driver, using 'losses' association)\n if (driver.losses && driver.losses.length > 0) {\n driverValues.losses = driver.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n if (loss.quote_vehicle_id) lossValues.quote_vehicle_id = loss.quote_vehicle_id;\n return lossValues;\n });\n }\n\n return driverValues;\n });\n } else {\n // No drivers exist, set checkbox to 'No'\n formValues.drivers = 'No';\n }\n\n // Set \"Add Vehicles\" checkbox based on whether vehicles exist\n if (quote.vehicles && quote.vehicles.length > 0) {\n formValues.vehicles = 'Yes';\n formValues.vehicles__items = quote.vehicles.map((vehicle) => {\n const vehicleValues: FormValues = {};\n if (vehicle.vin) vehicleValues.vin = vehicle.vin;\n if (vehicle.year !== null && vehicle.year !== undefined) vehicleValues.year = vehicle.year;\n if (vehicle.make) vehicleValues.make = vehicle.make;\n if (vehicle.model) vehicleValues.model = vehicle.model;\n if (vehicle.ownership_type) vehicleValues.ownership_type = vehicle.ownership_type;\n if (vehicle.usage) vehicleValues.usage = vehicle.usage;\n if (vehicle.annual_mileage !== null && vehicle.annual_mileage !== undefined) {\n vehicleValues.annual_mileage = vehicle.annual_mileage;\n }\n if (vehicle.miles_to_work !== null && vehicle.miles_to_work !== undefined) {\n vehicleValues.miles_to_work = vehicle.miles_to_work;\n }\n if (vehicle.percent_to_work !== null && vehicle.percent_to_work !== undefined) {\n vehicleValues.percent_to_work = vehicle.percent_to_work;\n }\n\n // Combine garaging address fields into a single garaging_address string\n const garagingAddressParts: string[] = [];\n if (vehicle.garaging_address_line_1) garagingAddressParts.push(vehicle.garaging_address_line_1);\n if (vehicle.garaging_address_line_2) garagingAddressParts.push(vehicle.garaging_address_line_2);\n if (vehicle.garaging_address_city) garagingAddressParts.push(vehicle.garaging_address_city);\n if (vehicle.garaging_address_state) garagingAddressParts.push(vehicle.garaging_address_state);\n if (vehicle.garaging_address_postal_code) garagingAddressParts.push(vehicle.garaging_address_postal_code);\n if (garagingAddressParts.length > 0) {\n vehicleValues.garaging_address = garagingAddressParts.join(', ');\n }\n\n if (vehicle.anti_theft_type) vehicleValues.anti_theft_type = vehicle.anti_theft_type;\n if (vehicle.passive_restraint_type) vehicleValues.passive_restraint_type = vehicle.passive_restraint_type;\n\n // Vehicle coverages\n if (vehicle.coverages && vehicle.coverages.length > 0) {\n vehicleValues.coverages__items = vehicle.coverages.map((coverage) => {\n const coverageValues: FormValues = {};\n if (coverage.type) coverageValues.type = coverage.type;\n if (coverage.per_person_limit_cents !== null && coverage.per_person_limit_cents !== undefined) {\n coverageValues.per_person_limit_cents = coverage.per_person_limit_cents;\n }\n if (coverage.per_incident_limit_cents !== null && coverage.per_incident_limit_cents !== undefined) {\n coverageValues.per_incident_limit_cents = coverage.per_incident_limit_cents;\n }\n if (coverage.per_incident_limit_percent !== null && coverage.per_incident_limit_percent !== undefined) {\n coverageValues.per_incident_limit_percent = coverage.per_incident_limit_percent;\n }\n if (coverage.per_day_limit_cents !== null && coverage.per_day_limit_cents !== undefined) {\n coverageValues.per_day_limit_cents = coverage.per_day_limit_cents;\n }\n if (coverage.deductible_cents !== null && coverage.deductible_cents !== undefined) {\n coverageValues.deductible_cents = coverage.deductible_cents;\n }\n if (coverage.is_declined !== null && coverage.is_declined !== undefined) {\n coverageValues.is_declined = convertBooleanToYesNo(coverage.is_declined);\n }\n return coverageValues;\n });\n }\n\n // Vehicle lienholders\n if (vehicle.vehicle_lienholders && vehicle.vehicle_lienholders.length > 0) {\n vehicleValues.vehicle_lienholders__items = vehicle.vehicle_lienholders.map((lienholder) => {\n const lienholderValues: FormValues = {};\n if (lienholder.name) lienholderValues.name = lienholder.name;\n if (lienholder.type) lienholderValues.type = lienholder.type;\n if (lienholder.line_1) lienholderValues.line_1 = lienholder.line_1;\n if (lienholder.line_2) lienholderValues.line_2 = lienholder.line_2;\n if (lienholder.city) lienholderValues.city = lienholder.city;\n if (lienholder.state) lienholderValues.state = lienholder.state;\n if (lienholder.postal_code) lienholderValues.postal_code = lienholder.postal_code;\n if (lienholder.phone) lienholderValues.phone = lienholder.phone;\n if (lienholder.fax) lienholderValues.fax = lienholder.fax;\n return lienholderValues;\n });\n }\n\n return vehicleValues;\n });\n } else {\n // No vehicles exist, set checkbox to 'No'\n formValues.vehicles = 'No';\n }\n\n // Home losses array -> home_losses__items\n if (quote.losses && quote.losses.length > 0) {\n formValues.home_losses__items = quote.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n return lossValues;\n });\n }\n\n return formValues;\n}\n","import { useEffect, useCallback, useState } from 'react';\n\nimport type { GetRatesResponse, Stage } from '@getcredify/credify-insurance-types';\n\nimport { FormWizard, Rates } from './index';\n\nimport type { StageMeta, FormValues } from '../utils/form';\nimport {\n createQuote,\n getQuestionsByStage,\n getRates,\n getStagesForQuote,\n isSupportedState,\n setAuthToken,\n updateQuote,\n verifyQuote,\n getQuote,\n loadAuthTokenFromStorage,\n getAuthToken,\n clearAuthToken\n} from '../utils/api';\nimport { loadQuoteId, saveQuoteId, clearQuoteId } from '../utils/storage';\nimport { quoteToFormValues } from '../utils/quoteToFormValues';\nimport { pushWidgetOpened, pushWidgetClosed, pushFlowCompleted, pushRatesViewed, pushStageCompleted } from '../utils/gtm';\n\nfunction transformFormValues(values: FormValues): FormValues {\n const transformed: FormValues = {};\n\n // Helper function to convert \"Yes\"/\"No\" to boolean\n const convertYesNoToBoolean = (value: unknown): unknown => {\n if (typeof value === 'string') {\n if (value === 'Yes') return true;\n if (value === 'No') return false;\n }\n return value;\n };\n\n // Get all non-__items keys to determine which fields are in the current stage\n const nonItemsKeys = Object.keys(values).filter((key) => !key.includes('__items'));\n\n // Get all field names that exist within any __items arrays\n const fieldsInArrays = new Set<string>();\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items') && Array.isArray(value)) {\n value.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n Object.keys(item).forEach((fieldName) => {\n fieldsInArrays.add(fieldName);\n });\n }\n });\n }\n }\n\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items')) {\n // Convert \"drivers__items\" to \"drivers\" with the array value\n const baseKey = key.replace('__items', '');\n\n // Only include this array if there's a corresponding root-level field with the same name\n // This indicates the array is actively being used in the current stage\n const hasCorrespondingRootField = nonItemsKeys.includes(baseKey);\n\n if (hasCorrespondingRootField) {\n // Recursively transform each item in the array\n const transformedArray = Array.isArray(value) ? value.map((item) => transformFormValues(item as FormValues)) : value;\n transformed[baseKey] = transformedArray;\n }\n } else if (!key.includes('__items')) {\n // Include root-level fields that don't exist in any array items\n // This prevents including fields from previous stages that are now represented in arrays\n if (!fieldsInArrays.has(key)) {\n transformed[key] = convertYesNoToBoolean(value);\n }\n }\n // Skip any other __items related keys that we've already processed\n }\n\n return transformed;\n}\n\nexport default function Widget({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }) {\n const [stages, setStages] = useState<StageMeta[]>([]);\n const [quoteId, setQuoteId] = useState<string | null>(null);\n const [rates, setRates] = useState<GetRatesResponse | null>(null);\n const [savedFormValues, setSavedFormValues] = useState<FormValues | null>(null);\n const [initialActiveStage, setInitialActiveStage] = useState<number | undefined>(undefined);\n const [isRestoringQuote, setIsRestoringQuote] = useState(false);\n\n function mapStagesToStageMetas(stages: Stage[]): StageMeta[] {\n // Map stage keys to human-friendly titles\n const stageTitleMap: Record<string, string> = {\n SMSVerification: 'Verify',\n AutoCurrentCarrier: 'Current Auto Policy',\n HomeCurrentCarrier: 'Current Home Policy'\n };\n\n return stages.map((stage) => ({\n key: stage,\n title: stageTitleMap[stage] || stage,\n loadQuestions: async () => {\n const data = await getQuestionsByStage(stage);\n const qs = data.questions;\n return qs;\n }\n }));\n }\n\n // Restore quote state on mount\n useEffect(() => {\n const restoreQuoteState = async () => {\n try {\n // Load quoteId and authToken from localStorage\n const storedQuoteId = loadQuoteId();\n loadAuthTokenFromStorage();\n\n if (storedQuoteId) {\n setIsRestoringQuote(true);\n setQuoteId(storedQuoteId);\n\n // Try to fetch quote data - use token if available, otherwise send quoteId in body\n try {\n const token = getAuthToken();\n const response = await getQuote(token ? undefined : storedQuoteId);\n\n if (!response || !response.quote) {\n throw new Error('Invalid response from getQuote: missing quote data');\n }\n\n const { quote } = response;\n\n // Find the stage index based on current_stage FIRST\n // This ensures we have the correct stages before setting form values\n const { stages: currentStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(currentStages);\n setStages(stageMetas);\n\n // Transform quote data to form values\n try {\n const formValues = quoteToFormValues(quote);\n setSavedFormValues(formValues);\n } catch (transformError) {\n throw new Error(`Failed to transform quote data: ${transformError instanceof Error ? transformError.message : 'Unknown error'}`);\n }\n\n // Set the initial active stage based on current_stage\n if (quote.current_stage) {\n const stageIndex = stageMetas.findIndex((s) => s.key === quote.current_stage);\n if (stageIndex >= 0) {\n setInitialActiveStage(stageIndex);\n } else {\n // If current_stage not found, default to last stage\n setInitialActiveStage(stageMetas.length - 1);\n }\n } else {\n // If no current_stage, default to last stage\n setInitialActiveStage(stageMetas.length - 1);\n }\n } catch (error) {\n // If quote fetch fails, check if it's a 404 (quote not found)\n const apiError = error as Error & { statusCode?: number };\n if (apiError.statusCode === 404) {\n // Quote doesn't exist - clear invalid quoteId and let user start fresh\n clearQuoteId();\n setQuoteId(null);\n } else {\n // Other errors (e.g., token expired) - clear token but keep quoteId\n clearAuthToken();\n // Don't clear quoteId - user can continue and verify SMS again\n }\n } finally {\n setIsRestoringQuote(false);\n }\n } else {\n // No quote to restore, fetch default stages\n const { stages: defaultStages } = await getStagesForQuote();\n setStages(mapStagesToStageMetas(defaultStages));\n }\n } catch {\n // Silently handle restore errors\n setIsRestoringQuote(false);\n }\n };\n\n if (isOpen) {\n restoreQuoteState();\n }\n }, [isOpen]);\n\n // Lock background scroll\n useEffect(() => {\n if (!isOpen) return;\n const { overflow } = document.body.style;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [isOpen]);\n\n // Close on Escape\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n pushWidgetClosed();\n onClose();\n }\n },\n [onClose]\n );\n useEffect(() => {\n if (!isOpen) return;\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [isOpen, onKeyDown]);\n\n // Clear saved form values and reset state when widget closes\n useEffect(() => {\n if (!isOpen) {\n setSavedFormValues(null);\n setInitialActiveStage(undefined);\n setIsRestoringQuote(false);\n }\n }, [isOpen]);\n\n // GTM: widget opened\n useEffect(() => {\n if (isOpen) pushWidgetOpened();\n }, [isOpen]);\n\n // GTM: rates viewed\n useEffect(() => {\n if (rates && Array.isArray(rates)) pushRatesViewed({ rateCount: rates.length });\n }, [rates]);\n\n if (!isOpen) return null;\n\n const handleClose = () => {\n pushWidgetClosed();\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"insurance-modal-title\">\n <div className=\"backdrop\" aria-hidden=\"true\" />\n\n <div className=\"modal-panel bg-white relative w-full max-w-2xl flex flex-col max-h-[90vh] overflow-hidden\" role=\"document\">\n <button\n onClick={handleClose}\n className=\"modal-close-btn absolute top-4 right-4 text-slate-400 hover:text-slate-600 text-xl\"\n aria-label=\"Close\"\n type=\"button\"\n >\n ×\n </button>\n\n <div className=\"text-center mb-6\">\n <h2 id=\"insurance-modal-title\" className=\"h1-title\">\n Let's get you the best insurance rates.\n </h2>\n <p className=\"p-subtitle\">This should only take a few minutes.</p>\n </div>\n\n {/* The ONLY scrollable area */}\n <div className=\"panel-body flex-1 min-h-0 overflow-y-auto\">\n {!rates && (\n <>\n {isRestoringQuote || stages.length === 0 ? (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"text-slate-600\">Loading...</div>\n </div>\n ) : (\n <FormWizard\n stages={stages}\n initialValues={savedFormValues ?? undefined}\n initialActive={initialActiveStage}\n onStageComplete={async (stageValues, stageKey) => {\n try {\n const transformedValues = transformFormValues(stageValues);\n\n // Get the updated stages first to determine the next stage\n const { stages: newStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(newStages);\n setStages(stageMetas);\n\n // Find the next stage after the completed one\n const currentStageIndex = stageMetas.findIndex((s) => s.key === stageKey);\n const currentMeta = stageMetas[currentStageIndex];\n const nextStageIndex = currentStageIndex + 1;\n const nextStage = nextStageIndex < stageMetas.length ? stageMetas[nextStageIndex] : null;\n const nextStageKey = nextStage?.key || stageKey; // If it's the last stage, keep the current one\n\n if (!quoteId) {\n const createQuoteResponse = await createQuote(transformedValues.phone as string);\n const newQuoteId = createQuoteResponse?.quoteId;\n if (!newQuoteId || typeof newQuoteId !== 'string' || newQuoteId.trim() === '') {\n throw new Error(`Failed to create quote - invalid quoteId returned: ${newQuoteId}`);\n }\n setQuoteId(newQuoteId);\n saveQuoteId(newQuoteId);\n // Save next stage as current_stage after creating quote (no token yet, so pass quoteId)\n await updateQuote({ current_stage: nextStageKey }, false, newQuoteId);\n } else if (stageKey === 'SMSVerification') {\n const { isVerified, token } = await verifyQuote(quoteId, transformedValues.sms_code as string);\n if (!isVerified) {\n throw new Error('Invalid SMS code');\n }\n if (token) {\n setAuthToken(token);\n }\n // Save next stage as current_stage after SMS verification (now we have a token)\n await updateQuote({ current_stage: nextStageKey }, false);\n } else if (stageKey === 'State') {\n const { isSupported } = await isSupportedState(transformedValues.state as string);\n if (!isSupported) {\n throw new Error('State is not supported');\n }\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId);\n } else {\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId || undefined);\n }\n\n pushStageCompleted({\n stageKey,\n stageTitle: currentMeta?.title ?? stageKey,\n stepIndex: currentStageIndex + 1,\n totalSteps: stageMetas.length\n });\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n onComplete={async (allValues) => {\n try {\n const transformedValues = transformFormValues(allValues);\n\n if (!quoteId) {\n throw new Error('Quote ID is required');\n }\n await updateQuote(transformedValues, true);\n\n // Save form values so we can restore them when going back\n setSavedFormValues(allValues);\n\n const { rates } = await getRates();\n setRates(rates);\n\n const totalSteps = stages.length;\n const lastStage = stages[totalSteps - 1];\n pushStageCompleted({\n stageKey: lastStage?.key ?? 'unknown',\n stageTitle: lastStage?.title ?? 'unknown',\n stepIndex: totalSteps,\n totalSteps\n });\n pushFlowCompleted();\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n />\n )}\n </>\n )}{' '}\n {rates && quoteId && <Rates rates={rates} onBack={() => setRates(null)} />}\n </div>\n\n {/* Footer */}\n <div className=\"mt-4 pt-4 border-t border-slate-200\">\n <p className=\"text-center text-sm text-slate-500\">Insurance products offered through Credify Corporation, a licensed insurance agency.</p>\n </div>\n </div>\n </div>\n );\n}\n","import Widget from '../components/Widget';\nimport CredifyInsuranceWidget from '../widget';\n\nexport default function WidgetController({ isOpen }: { isOpen: boolean }) {\n return (\n <Widget\n isOpen={isOpen}\n onClose={() => {\n CredifyInsuranceWidget.close();\n }}\n />\n );\n}\n","/* @refresh skip */\nimport { createElement } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport WidgetController from './internal/WidgetController';\nimport './index.css';\n// CSS is injected at runtime by vite-plugin-css-injected-by-js so the widget always has its styles on any host.\n\ntype InitOptions = { autoOpen?: boolean };\n\nlet container: HTMLDivElement | null = null;\nlet root: Root | null = null;\nlet isOpen = false;\n\nfunction ensureRoot() {\n if (!container) {\n container = document.createElement('div');\n container.id = 'insurance-widget-root';\n // Mount on documentElement so host transforms/filters on body don't make\n // our fixed overlay position relative to body (which would look inline).\n document.documentElement.appendChild(container);\n }\n if (!root && container) {\n root = createRoot(container);\n }\n}\n\nfunction render() {\n ensureRoot();\n if (root) {\n root.render(createElement(WidgetController, { isOpen })); // ⬅️ controlled prop\n }\n}\n\nfunction destroy() {\n if (root && container) {\n root.unmount();\n container.remove();\n }\n root = null;\n container = null;\n}\n\nexport interface CredifyInsuranceWidgetAPI {\n init(options?: InitOptions): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\nexport const CredifyInsuranceWidget: CredifyInsuranceWidgetAPI = {\n init: (options) => {\n isOpen = !!options?.autoOpen; // default false\n render();\n },\n open: () => {\n isOpen = true;\n render();\n },\n close: () => {\n isOpen = false;\n render();\n },\n destroy\n};\n\n// expose globally for script-tag usage\ndeclare global {\n interface Window {\n CredifyInsuranceWidget?: CredifyInsuranceWidgetAPI;\n }\n}\nif (typeof window !== 'undefined') window.CredifyInsuranceWidget = CredifyInsuranceWidget;\n\nexport default CredifyInsuranceWidget;\n"],"names":["Field","id","label","hint","error","required","className","children","jsxs","jsx","TextInput","rest","NumericInput","EmailInput","formatPhoneNumber","value","digits","tenDigits","extractDigits","TelInput","onChange","displayValue","setDisplayValue","useState","inputRef","useRef","cursorPositionRef","useEffect","limitedDigits","handleChange","e","input","inputValue","formatted","rawValue","syntheticEvent","beforeCursor","digitsBeforeCursor","formattedBeforeCursor","newPosition","UrlInput","PasswordInput","TextArea","rows","DateInput","Checkbox","Radio","name","checked","RadioGroup","legend","legendClassName","SelectInput","placeholder","options","describedBy","hasCustomChildren","opt","GOOGLE_MAPS_API_KEY","loadGoogleMapsScript","resolve","reject","existingScript","script","extractAddressComponents","place","components","component","types","AddressAutocomplete","onPlaceSelect","autocompleteServiceRef","placesServiceRef","suggestionsContainerRef","isLoading","setIsLoading","setInputValue","suggestions","setSuggestions","showSuggestions","setShowSuggestions","selectedIndex","setSelectedIndex","suggestionsRef","showSuggestionsRef","selectedIndexRef","debounceTimerRef","isMounted","err","handleInputChange","query","predictions","status","handleKeyDown","prev","newIndex","handleSuggestionClick","handleClickOutside","event","prediction","formattedAddress","addressComponents","index","slugify","s","ensureKey","q","idx","validateQuestions","questions","values","errors","isBlank","v","key","val","coerceNumber","n","toNumber","x","toTime","cmp","a","b","na","nb","ta","tb","contains","haystack","needle","evalConditional","qValue","conditionalType","conditionalValue","c","getIn","obj","path","acc","setInImmutable","head","tail","arr","current","nextContainer","next","scopedRead","scope","scopedWrite","ITEMS_SUFFIX","itemsKey","k","decorateKeys","walk","list","pathParts","qi","parentPart","baseKey","nextConds","ci","nested","asTextValue","asNumberValue","asSelectValue","FormRenderer","initialValues","controlledValues","onChangeValues","onSubmit","keyedQuestions","useMemo","initialUncontrolled","uncontrolled","setUncontrolled","localShadow","setLocalShadow","p","setErrors","renderOne","scopePath","set","nextAll","conds","cond","currentValue","wasActive","willBeActive","arrStorageKey","clearNestedArrays","questionList","currentScope","childQ","childCond","nestedArrKey","grandChildren","Fragment","idOpt","opts","scopedName","o","address","renderRecursive","qIndex","elem","matches","branches","branch","bi","count","pushEmpty","popLast","nextArr","groupIdBase","_","itemScope","groupId","childConds","childVal","childMatches","m","bc","bci","nestedArr","nestedCount","nestedPush","nestedPop","__","nIdx","nestedScope","visibleFlat","out","handleSubmit","eMap","firstIdx","GTM_CONTAINER_ID","getDataLayer","pushDataLayerEvent","eventName","payload","pushWidgetOpened","pushWidgetClosed","pushStageViewed","pushStageCompleted","pushFlowCompleted","pushRatesViewed","pushRatesBack","type","rhs","flattenVisibleQuestions","root","child","validateRepeatablesRecursive","valuesAtScope","qKey","qVal","item","itemErrors","hasRepeatableBlockingErrors","rootValues","FormWizard","stages","onStageComplete","onComplete","initialActive","active","setActive","allValues","setAllValues","perStageQuestions","setPerStageQuestions","loading","setLoading","isSubmitting","setIsSubmitting","stageError","setStageError","stepRefs","hasStages","stage","stageKey","activeElement","cancelled","qs","currentValues","slice","keys","i","kItems","updateCurrentValues","goPrev","goNext","visible","flatErrors","flatBlock","repeatBlock","nextIndex","isComplete","success","disableNext","el","copy","QUOTE_ID_KEY","AUTH_TOKEN_KEY","saveQuoteId","quoteId","loadQuoteId","clearQuoteId","saveAuthToken","token","loadAuthToken","clearAuthToken","clearAllQuoteData","BASE_URL","authToken","setAuthToken","getAuthToken","loadAuthTokenFromStorage","storedToken","clearAuthTokenStorage","makeAuthenticatedRequest","url","body","headers","response","errorMessage","getQuestionsByStage","getStagesForQuote","createQuote","phone","data","updateQuote","getRates","verifyQuote","smsCode","isSupportedState","state","getQuote","requestBind","quoteRateId","currencyFormatter","BackButton","onBack","Rates","rates","hasRates","requestStatuses","setRequestStatuses","rate","premiumDollars","formattedPremium","cardKey","isRequesting","isRequested","handleRequestBind","convertBooleanToYesNo","formatDate","date","d","quoteToFormValues","quote","formValues","addressParts","priorAddressParts","driver","driverValues","violation","violationValues","accident","accidentValues","loss","lossValues","vehicle","vehicleValues","garagingAddressParts","coverage","coverageValues","lienholder","lienholderValues","transformFormValues","transformed","convertYesNoToBoolean","nonItemsKeys","fieldsInArrays","fieldName","transformedArray","Widget","isOpen","onClose","setStages","setQuoteId","setRates","savedFormValues","setSavedFormValues","initialActiveStage","setInitialActiveStage","isRestoringQuote","setIsRestoringQuote","mapStagesToStageMetas","stageTitleMap","storedQuoteId","currentStages","stageMetas","transformError","stageIndex","defaultStages","overflow","onKeyDown","useCallback","stageValues","transformedValues","newStages","currentStageIndex","currentMeta","nextStageIndex","nextStageKey","isVerified","isSupported","newQuoteId","totalSteps","lastStage","WidgetController","CredifyInsuranceWidget","container","ensureRoot","createRoot","render","createElement","destroy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/components/Field.tsx","../src/components/TextInput.tsx","../src/components/NumericInput.tsx","../src/components/EmailInput.tsx","../src/components/TelInput.tsx","../src/components/UrlInput.tsx","../src/components/PasswordInput.tsx","../src/components/TextArea.tsx","../src/components/DateInput.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/SelectInput.tsx","../src/components/AddressAutocomplete.tsx","../src/utils/form.ts","../src/config/bolt-policy-option-labels.ts","../src/config/bolt-driver-occupation-map.ts","../src/utils/driver-option-normalizers.ts","../src/utils/autoCoverageCondition.ts","../src/config/bolt-vehicle-option-chains.ts","../src/components/FormRenderer.tsx","../src/utils/gtm.ts","../src/components/FormWizard.tsx","../src/utils/storage.ts","../src/utils/api.ts","../src/components/Rates.tsx","../src/utils/quoteToFormValues.ts","../src/components/Widget.tsx","../src/internal/WidgetController.tsx","../src/widget.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type FieldProps = {\n id: string;\n label: string;\n hint?: string;\n error?: string;\n required?: boolean;\n className?: string;\n children: ReactNode;\n};\n\nexport function Field({ id, label, hint, error, required, className, children }: FieldProps) {\n return (\n <div className={className}>\n <label htmlFor={id} className=\"form-label\">\n {label} {required && <span className=\"text-red-600\">*</span>}\n </label>\n {children}\n {hint && !error && (\n <p id={`${id}-hint`} className=\"mt-1 text-sm text-slate-500\">\n {hint}\n </p>\n )}\n {error && (\n <p id={`${id}-error`} className=\"mt-1 text-sm text-red-600\">\n {error}\n </p>\n )}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id'>;\n\nexport function TextInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n type=\"text\"\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function NumericInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"number\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function EmailInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"email\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"email\"\n autoComplete=\"email\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { InputHTMLAttributes, ChangeEvent } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'value' | 'onChange'> & {\n value?: string;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n };\n\n/**\n * Formats a phone number string to (XXX) XXX - XXXX format\n * Only formats if there are 10 digits (US phone number)\n */\nfunction formatPhoneNumber(value: string): string {\n // Remove all non-digit characters\n const digits = value.replace(/\\D/g, '');\n\n // If we have 10 digits, format as (XXX) XXX - XXXX\n if (digits.length === 10) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n\n // If we have more than 10 digits, format the first 10\n if (digits.length > 10) {\n const tenDigits = digits.slice(0, 10);\n return `(${tenDigits.slice(0, 3)}) ${tenDigits.slice(3, 6)} - ${tenDigits.slice(6)}`;\n }\n\n // Partial formatting as user types\n if (digits.length >= 6) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)} - ${digits.slice(6)}`;\n }\n if (digits.length >= 3) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3)}`;\n }\n if (digits.length > 0) {\n return `(${digits}`;\n }\n\n return digits;\n}\n\n/**\n * Extracts only digits from a phone number string\n */\nfunction extractDigits(value: string): string {\n return value.replace(/\\D/g, '');\n}\n\nexport function TelInput({ id, label, hint, error, required, className, value = '', onChange, ...rest }: Props) {\n const [displayValue, setDisplayValue] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n const cursorPositionRef = useRef<number>(0);\n\n // Update display value when prop value changes\n useEffect(() => {\n if (!value) {\n setDisplayValue('');\n return;\n }\n\n // Extract digits, handling cases where value might include +1 or just be digits\n let digits = extractDigits(value);\n\n // If value starts with +1 or 1, remove the leading 1 (country code)\n if (digits.length === 11 && digits.startsWith('1')) {\n digits = digits.slice(1);\n }\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n setDisplayValue(formatPhoneNumber(limitedDigits));\n }, [value]);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const input = e.target;\n const inputValue = input.value;\n\n // Save cursor position before formatting\n cursorPositionRef.current = input.selectionStart || 0;\n\n // Extract digits from input\n const digits = extractDigits(inputValue);\n\n // Limit to 10 digits for US phone numbers\n const limitedDigits = digits.slice(0, 10);\n\n // Format the display value\n const formatted = formatPhoneNumber(limitedDigits);\n setDisplayValue(formatted);\n\n // Create a synthetic event with the unformatted digits (with +1 prefix)\n // The actual stored value will be +1 followed by the 10 digits\n const rawValue = limitedDigits.length === 10 ? `+1${limitedDigits}` : limitedDigits;\n\n // Create a new event with the raw value\n const syntheticEvent = {\n ...e,\n currentTarget: {\n ...e.currentTarget,\n value: rawValue\n },\n target: {\n ...e.target,\n value: rawValue\n }\n } as ChangeEvent<HTMLInputElement>;\n\n // Call the original onChange with the raw value\n onChange?.(syntheticEvent);\n\n // Restore cursor position after a short delay to allow React to update\n setTimeout(() => {\n if (inputRef.current) {\n // Calculate new cursor position based on formatting\n const beforeCursor = inputValue.slice(0, cursorPositionRef.current);\n const digitsBeforeCursor = extractDigits(beforeCursor);\n const formattedBeforeCursor = formatPhoneNumber(digitsBeforeCursor);\n // Position cursor at the end of the formatted text that corresponds to the digits before cursor\n const newPosition = Math.min(formattedBeforeCursor.length, formatted.length);\n inputRef.current.setSelectionRange(newPosition, newPosition);\n }\n }, 0);\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div\n className={`tel-input-wrapper flex items-center border rounded-lg transition-colors w-full relative ${\n error ? 'border-red-500 error' : 'border-[var(--accent-color)] focus-within:border-[var(--primary-color)]'\n }`}\n >\n <label\n htmlFor={id}\n className=\"px-3 py-3 text-slate-700 font-medium border-r border-[var(--accent-color)] bg-slate-50 flex-shrink-0 relative z-0 rounded-l-lg\"\n >\n +1\n </label>\n <input\n ref={inputRef}\n id={id}\n type=\"tel\"\n className={`flex-1 px-4 py-3 border-0 rounded-r-lg outline-none bg-transparent text-[var(--text-primary)] text-base ${\n error ? 'input-error' : ''\n }`}\n inputMode=\"tel\"\n autoComplete=\"tel\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n value={displayValue}\n onChange={handleChange}\n {...rest}\n />\n </div>\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function UrlInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"url\"\n className={`form-input ${error ? 'input-error' : ''}`}\n inputMode=\"url\"\n autoComplete=\"url\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function PasswordInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"password\"\n className={`form-input ${error ? 'input-error' : ''}`}\n autoComplete=\"current-password\"\n required={required}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n {...rest}\n />\n </Field>\n );\n}\n","import type { TextareaHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'id'>;\n\nexport function TextArea({ id, label, hint, error, required, className, rows = 4, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <textarea\n id={id}\n rows={rows}\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\ntype Props = Omit<FieldProps, 'children'> & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type'>;\n\nexport function DateInput({ id, label, hint, error, required, className, ...rest }: Props) {\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <input\n id={id}\n type=\"date\"\n className={`form-input ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n {...rest}\n />\n </Field>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\n\ntype Props = {\n id: string;\n label: string;\n className?: string;\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'id'>;\n\nexport function Checkbox({ id, label, className, ...rest }: Props) {\n return (\n <label className={`checkbox-card ${className || ''}`} htmlFor={id}>\n <input id={id} type=\"checkbox\" className=\"checkbox-input\" {...rest} />\n <span className=\"checkbox-label\">{label}</span>\n </label>\n );\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react';\n\nexport function Radio({\n name,\n value,\n checked,\n onChange,\n children\n}: {\n name: string;\n value: string;\n checked?: boolean;\n onChange?: InputHTMLAttributes<HTMLInputElement>['onChange'];\n children: ReactNode;\n}) {\n return (\n <label className=\"radio-card\">\n <input className=\"radio-input\" type=\"radio\" name={name} value={value} checked={checked} onChange={onChange} />\n <span className=\"radio-label\">{children}</span>\n </label>\n );\n}\n\nexport function RadioGroup({\n legend,\n children,\n className,\n legendClassName\n}: {\n legend: string;\n className?: string;\n legendClassName?: string;\n children: ReactNode;\n}) {\n return (\n <fieldset className={className}>\n <legend className={`form-label mb-4 ${legendClassName || ''}`}>{legend}</legend>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">{children}</div>\n </fieldset>\n );\n}\n","import type { SelectHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<SelectHTMLAttributes<HTMLSelectElement>, 'id'> & {\n /** If provided, renders a disabled first option prompting selection */\n placeholder?: string;\n /** Provide options as data (or pass custom children instead) */\n options?: SelectOption[];\n };\n\nexport function SelectInput({ id, label, hint, error, required, className, placeholder, options, children, ...rest }: Props) {\n const describedBy = [hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined;\n\n const hasCustomChildren = !!children;\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <select\n id={id}\n className={`form-input select-caret ${error ? 'input-error' : ''}`}\n aria-invalid={!!error}\n aria-describedby={describedBy}\n required={required}\n {...rest}\n >\n {placeholder && (\n <option value=\"\" disabled selected={!('value' in rest)}>\n {placeholder}\n </option>\n )}\n\n {hasCustomChildren\n ? children\n : options?.map((opt) => (\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\n {opt.label}\n </option>\n ))}\n </select>\n </Field>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { InputHTMLAttributes } from 'react';\nimport { Field, type FieldProps } from './Field';\n\n// cspell:disable-next-line\nconst GOOGLE_MAPS_API_KEY = 'AIzaSyDjLdKLxoa-maLNGAyq_I_2r_Fe_TzFikw';\n\ntype AddressComponents = {\n streetNumber?: string;\n streetName?: string;\n city?: string;\n state?: string;\n zipCode?: string;\n country?: string;\n fullAddress?: string;\n};\n\ntype Props = Omit<FieldProps, 'children'> &\n Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'type' | 'onChange'> & {\n onChange?: (value: string, components?: AddressComponents) => void;\n onPlaceSelect?: (place: google.maps.places.PlaceResult) => void;\n };\n\n// Load Google Maps script dynamically\nfunction loadGoogleMapsScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n // Check if script is already loaded\n if (window.google?.maps?.places) {\n resolve();\n return;\n }\n\n // Check if script is already being loaded\n const existingScript = document.querySelector('script[src*=\"maps.googleapis.com\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve());\n existingScript.addEventListener('error', () => reject(new Error('Failed to load Google Maps script')));\n return;\n }\n\n // Create and load the script\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${GOOGLE_MAPS_API_KEY}&libraries=places`;\n script.async = true;\n script.defer = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load Google Maps script'));\n document.head.appendChild(script);\n });\n}\n\n// Extract address components from Google Places result\nfunction extractAddressComponents(place: google.maps.places.PlaceResult): AddressComponents {\n const components: AddressComponents = {\n fullAddress: place.formatted_address\n };\n\n if (place.address_components) {\n place.address_components.forEach((component) => {\n const types = component.types;\n\n if (types.includes('street_number')) {\n components.streetNumber = component.long_name;\n }\n if (types.includes('route')) {\n components.streetName = component.long_name;\n }\n if (types.includes('locality')) {\n components.city = component.long_name;\n }\n if (types.includes('administrative_area_level_1')) {\n components.state = component.short_name;\n }\n if (types.includes('postal_code')) {\n components.zipCode = component.long_name;\n }\n if (types.includes('country')) {\n components.country = component.short_name;\n }\n });\n }\n\n return components;\n}\n\nexport function AddressAutocomplete({ id, label, hint, error, required, className, onChange, onPlaceSelect, value, ...rest }: Props) {\n const inputRef = useRef<HTMLInputElement>(null);\n const autocompleteServiceRef = useRef<google.maps.places.AutocompleteService | null>(null);\n const placesServiceRef = useRef<google.maps.places.PlacesService | null>(null);\n const suggestionsContainerRef = useRef<HTMLDivElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [inputValue, setInputValue] = useState((value as string) || '');\n const [suggestions, setSuggestions] = useState<google.maps.places.AutocompletePrediction[]>([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n\n // Use refs for state values used in event handlers to avoid dependency issues\n const suggestionsRef = useRef<google.maps.places.AutocompletePrediction[]>([]);\n const showSuggestionsRef = useRef(false);\n const selectedIndexRef = useRef(-1);\n\n // Keep refs in sync with state\n useEffect(() => {\n suggestionsRef.current = suggestions;\n }, [suggestions]);\n\n useEffect(() => {\n showSuggestionsRef.current = showSuggestions;\n }, [showSuggestions]);\n\n useEffect(() => {\n selectedIndexRef.current = selectedIndex;\n }, [selectedIndex]);\n\n useEffect(() => {\n // Update input value when value prop changes\n if (value !== undefined) {\n setInputValue(String(value));\n }\n }, [value]);\n\n // Debounce timer ref\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n if (!inputRef.current) return;\n\n let isMounted = true;\n\n // Load Google Maps script and initialize services\n loadGoogleMapsScript()\n .then(() => {\n if (!isMounted || !inputRef.current) return;\n\n // Initialize services\n autocompleteServiceRef.current = new google.maps.places.AutocompleteService();\n placesServiceRef.current = new google.maps.places.PlacesService(document.createElement('div'));\n\n setIsLoading(false);\n })\n .catch((err) => {\n console.error('Error loading Google Maps:', err);\n setIsLoading(false);\n });\n\n return () => {\n isMounted = false;\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n // Handle input changes with debouncing\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n onChange?.(query);\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n if (query.length < 3) {\n setSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n\n // Debounce API calls\n debounceTimerRef.current = setTimeout(() => {\n if (!autocompleteServiceRef.current) return;\n\n autocompleteServiceRef.current.getPlacePredictions(\n {\n input: query,\n types: ['address']\n },\n (predictions, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && predictions) {\n setSuggestions(predictions);\n setShowSuggestions(true);\n setSelectedIndex(-1);\n } else {\n setSuggestions([]);\n setShowSuggestions(false);\n }\n }\n );\n }, 300);\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!showSuggestionsRef.current || suggestionsRef.current.length === 0) {\n if (e.key === 'Escape') {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev < suggestionsRef.current.length - 1 ? prev + 1 : prev;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => {\n const newIndex = prev > 0 ? prev - 1 : -1;\n selectedIndexRef.current = newIndex;\n return newIndex;\n });\n break;\n case 'Enter':\n e.preventDefault();\n if (selectedIndexRef.current >= 0 && selectedIndexRef.current < suggestionsRef.current.length) {\n handleSuggestionClick(suggestionsRef.current[selectedIndexRef.current]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n break;\n }\n };\n\n // Handle clicks outside to close suggestions\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n suggestionsContainerRef.current &&\n !suggestionsContainerRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setShowSuggestions(false);\n showSuggestionsRef.current = false;\n }\n };\n\n if (showSuggestions) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [showSuggestions]);\n\n const handleSuggestionClick = (prediction: google.maps.places.AutocompletePrediction) => {\n if (!placesServiceRef.current) return;\n\n placesServiceRef.current.getDetails(\n {\n placeId: prediction.place_id,\n fields: ['address_components', 'formatted_address', 'geometry']\n },\n (place, status) => {\n if (status === google.maps.places.PlacesServiceStatus.OK && place) {\n const formattedAddress = place.formatted_address || '';\n setInputValue(formattedAddress);\n setShowSuggestions(false);\n setSuggestions([]);\n showSuggestionsRef.current = false;\n\n const addressComponents = extractAddressComponents(place);\n\n onChange?.(formattedAddress, addressComponents);\n onPlaceSelect?.(place);\n }\n }\n );\n };\n\n return (\n <Field id={id} label={label} hint={hint} error={error} required={required} className={className}>\n <div className=\"relative\">\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n className={`form-input ${error ? 'input-error' : ''}`}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n aria-invalid={!!error}\n aria-describedby={[hint ? `${id}-hint` : null, error ? `${id}-error` : null].filter(Boolean).join(' ') || undefined}\n required={required}\n autoComplete=\"street-address\"\n placeholder={rest.placeholder || 'Enter an address'}\n disabled={isLoading || rest.disabled}\n {...rest}\n />\n {isLoading && <p className=\"mt-1 text-sm text-slate-500\">Loading address suggestions...</p>}\n\n {/* Suggestions dropdown */}\n {showSuggestions && suggestions.length > 0 && (\n <div\n ref={suggestionsContainerRef}\n className=\"absolute z-50 w-full mt-1 bg-white border border-slate-200 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n role=\"listbox\"\n >\n {suggestions.map((prediction, index) => (\n <div\n key={prediction.place_id}\n className={`px-4 py-3 cursor-pointer transition-colors ${\n index === selectedIndex ? 'bg-blue-50 text-slate-900' : 'bg-white text-slate-900 hover:bg-slate-50'\n } ${index < suggestions.length - 1 ? 'border-b border-slate-100' : ''}`}\n role=\"option\"\n aria-selected={index === selectedIndex}\n onClick={() => handleSuggestionClick(prediction)}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <div className=\"font-medium text-slate-900\">{prediction.structured_formatting.main_text}</div>\n {prediction.structured_formatting.secondary_text && (\n <div className=\"text-sm text-slate-500 mt-0.5\">{prediction.structured_formatting.secondary_text}</div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </Field>\n );\n}\n","import type { Question } from '@getcredify/credify-insurance-types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FormValues = Record<string, any>;\n\n// A single stage (screen) in the wizard\nexport type StageMeta<K extends string = string> = {\n key: string; // stage id\n title: string; // progress header label\n loadQuestions: () => Promise<ReadonlyArray<Question<K>>>; // lazy loader\n};\n\nexport function slugify(s: string) {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function ensureKey<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n q: Readonly<Question<KSelf, any, any>>,\n idx: number\n): string {\n return (q.key as string | undefined) ?? `${slugify(q.question)}-${idx}`;\n}\n\n// ----- per-stage validation (visible + required) -----\nexport function validateQuestions<KSelf extends string = string>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n questions: ReadonlyArray<Question<KSelf, any, any>>,\n values: Readonly<Record<string, unknown>>\n): Record<string, string | undefined> {\n const errors: Record<string, string | undefined> = {};\n\n const isBlank = (v: unknown) => v === undefined || v === null || (typeof v === 'string' && v.trim() === '');\n\n questions.forEach((q, i) => {\n const key = ensureKey(q, i);\n const val = values[key];\n\n if (!q.required) return;\n\n switch (q.inputType) {\n case 'checkbox':\n if (val !== true) errors[key] = 'Required';\n break;\n\n case 'radio':\n case 'select':\n if (isBlank(val)) errors[key] = 'Required';\n break;\n\n case 'number':\n // Treat '' / null / undefined as missing; 0 is valid\n if (val === undefined || val === null || (typeof val === 'string' && val.trim() === '')) {\n errors[key] = 'Required';\n }\n break;\n\n case 'date':\n case 'email':\n case 'tel':\n case 'url':\n case 'password':\n case 'text':\n case 'textarea':\n case 'address':\n default:\n if (isBlank(val)) errors[key] = 'Required';\n break;\n }\n });\n\n return errors;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function coerceNumber(v: any) {\n if (v === '' || v === null || v === undefined) return undefined;\n const n = Number(v);\n return Number.isNaN(n) ? undefined : n;\n}\n","// cspell:disable\nexport const BOLT_AUTO_PRIOR_CARRIER_LABELS: Record<string, string> = {\n NoPriorInsurance: 'No Prior Insurance',\n TwentyFirstCentury: '21st Century',\n ACentral: 'A.Central',\n AAA: 'AAA',\n AARP: 'AARP',\n Acadia: 'Acadia',\n Ace: 'Ace',\n Acuity: 'Acuity',\n AdirondackInsExchange: 'Adirondack Ins Exchange',\n Aegis: 'Aegis',\n AIC: 'AIC',\n AIG: 'AIG',\n AlfaAlliance: 'Alfa Alliance',\n Allied: 'Allied',\n Allstate: 'Allstate',\n AmericaFirst: 'America First',\n AmericanCommerce: 'American Commerce',\n AmericanFamily: 'American Family',\n Amica: 'Amica',\n ASILloyds: 'ASI Lloyds',\n AustinMutual: 'Austin Mutual',\n Autoone: 'Autoone',\n AutoOwners: 'Auto-Owners',\n BadgerMutual: 'Badger Mutual',\n Balboa: 'Balboa',\n Bankers: 'Bankers',\n BeaconNational: 'Beacon National',\n BrethernMutual: 'Brethern Mutual',\n BristolWest: 'Bristol West',\n CapitalInsuranceGroup: 'Capital Insurance Group',\n Celina: 'Celina',\n CentralMutualOfOH: 'Central Mutual of OH',\n Chubb: 'Chubb',\n Cincinnati: 'Cincinnati',\n Clearcover: 'Clearcover',\n CNA: 'CNA',\n ColonialPenn: 'Colonial Penn',\n ColoradoCasualty: 'Colorado Casualty',\n Columbia: 'Columbia',\n CommerceWest: 'Commerce West',\n CommonwealthCasualty: 'Commonwealth Casualty',\n Ameriprise: 'CONNECT',\n ConstitutionalCasualty: 'Constitutional Casualty',\n Cornerstone: 'Cornerstone',\n Countrywide: 'Countrywide',\n CSE: 'CSE',\n Cumberland: 'Cumberland',\n Dairyland: 'Dairyland',\n Deerbrook: 'Deerbrook',\n Direct: 'Direct',\n Donegal: 'Donegal',\n Drive: 'Drive',\n Electric: 'Electric',\n EMC: 'EMC',\n Encompass: 'Encompass',\n Erie: 'Erie',\n Esurance: 'Esurance',\n Explorer: 'Explorer',\n FarmBureau: 'Farm Bureau',\n Farmers: 'Farmers',\n FiremansFund: 'Firemans Fund',\n FirstAmerican: 'First American',\n Foremost: 'Foremost',\n Geico: 'Geico',\n GeneralCasualty: 'General Casualty',\n GermantownMutual: 'Germantown Mutual',\n GMAC: 'GMAC',\n Grange: 'Grange',\n GreatAmerican: 'Great American',\n Grinnell: 'Grinnell',\n GuideOne: 'Guide One',\n Hanover: 'Hanover',\n Harbor: 'Harbor',\n Harleysville: 'Harleysville',\n HartfordOMNI: 'Hartford OMNI',\n Hartford: 'Hartford',\n HastingsMutual: 'Hastings Mutual',\n HawkeyeSecurity: 'Hawkeye Security',\n HDI: 'HDI',\n HoraceMann: 'Horace Mann',\n HoustonGeneral: 'Houston General',\n IFA: 'IFA',\n ImperialCasualty: 'Imperial Casualty',\n IndianaFarmers: 'Indiana Farmers',\n Indiana: 'Indiana',\n Infinity: 'Infinity',\n Insurequest: 'Insurequest',\n Integon: 'Integon',\n Integrity: 'Integrity',\n Kemper: 'Kemper',\n LibertyMutual: 'Liberty Mutual',\n LibertyNorthwest: 'Liberty Northwest',\n MainStreetAmerica: 'Main Street America',\n Mapfre: 'Mapfre',\n Mendota: 'Mendota',\n MerchantsGroup: 'Merchants Group',\n Mercury: 'Mercury',\n Metlife: 'MetLife',\n Metropolitan: 'Metropolitan',\n MidContinent: 'Mid-Continent',\n MidwesternIndemnity: 'Midwestern Indemnity',\n Montgomery: 'Montgomery',\n MSA: 'MSA',\n MtWashington: 'Mt. Washington',\n MutualBenefit: 'Mutual Benefit',\n NationalGeneral: 'National General',\n Nationwide: 'Nationwide',\n NewYorkCentralMutual: 'New York Central Mutual',\n NJManufacturers: 'NJ Manufacturers',\n NJSkylands: 'NJ Skylands',\n Northstar: 'Northstar',\n Occidental: 'Occidental',\n OhioCasualty: 'Ohio Casualty',\n OmahaPC: 'Omaha P/C',\n OneBeacon: 'One Beacon',\n OregonMutual: 'Oregon Mutual',\n Palisades: 'Palisades',\n PeerlessMontgomery: 'Peerless/Montgomery',\n Pekin: 'Pekin',\n Pemco: 'Pemco',\n PennNational: 'Penn National',\n PlymouthRock: 'Plymouth Rock',\n PreferredMutual: 'Preferred Mutual',\n // cspell:disable-next-line\n Proformance: 'Proformance',\n Progressive: 'Progressive',\n Prudential: 'Prudential',\n Republic: 'Republic',\n RockfordMutual: 'Rockford Mutual',\n RoyalAndSunAlliance: 'Royal and Sun Alliance',\n Safeco: 'Safeco',\n SECURA: 'SECURA',\n Selective: 'Selective',\n SouthernCounty: 'Southern County',\n SouthernMutual: 'Southern Mutual',\n SouthernTrust: 'Southern Trust',\n StPaulTravelers: 'St. Paul/Travelers',\n StandardMutual: 'Standard Mutual',\n StarCasualty: 'Star Casualty',\n StateAuto: 'State Auto',\n StateFarm: 'State Farm',\n Fidelity: 'Stillwater',\n Travelers: 'Travelers',\n TWFG: 'TWFG',\n Unigard: 'Unigard',\n UnitedFireAndCasualty: 'United Fire and Casualty',\n Unitrin: 'Unitrin',\n Universal: 'Universal',\n USAA: 'USAA',\n UticaNational: 'Utica National',\n Victoria: 'Victoria',\n WestBend: 'West Bend',\n WesternNational: 'Western National',\n WesternReserveGroup: 'Western Reserve Group',\n Westfield: 'Westfield',\n WhiteMountains: 'White Mountains',\n WilsonMutual: 'Wilson Mutual',\n Windsor: 'Windsor',\n Zurich: 'Zurich',\n OtherStandard: 'Other Standard',\n OtherNonStandard: 'Other Non-Standard'\n};\n\nexport const BOLT_TYPE_OF_RESIDENCE_LABELS: Record<string, string> = {\n OwnHome: 'Own Home',\n OwnCondo: 'Own Condo',\n RentHome: 'Rent Home',\n RentCondo: 'Rent Condo',\n RentApartment: 'Rent Apartment',\n LiveWithParents: 'Live With Parents'\n};\n\nexport const BOLT_HOME_PRIOR_CARRIER_LABELS: Record<string, string> = {\n TwentyFirstCentury: '21st Century',\n AAA: 'AAA',\n Acuity: 'Acuity',\n AdirondackInsExchange: 'Adirondack Ins Exchange',\n AIG: 'AIG',\n AlfaAlliance: 'Alfa Alliance',\n AllianzOfAmerica: 'Allianz of America',\n AllianzOfAmericaJefferson: 'Allianz of America-Jefferson',\n Allied: 'Allied',\n Allmerica: 'Allmerica',\n Allstate: 'Allstate',\n AmericaFirst: 'America First',\n AmericanFamily: 'American Family',\n AmericanCommerce: 'American Commerce',\n Amica: 'Amica',\n ASILloyds: 'ASI Lloyds',\n Assurant: 'Assurant',\n AtlasGeneralAgency: 'Atlas General Agency',\n AustinMutual: 'Austin Mutual',\n AutoOwners: 'Auto-Owners',\n BadgerMutual: 'Badger Mutual',\n Balboa: 'Balboa',\n Bamboo: 'Bamboo',\n BeaconNational: 'Beacon National',\n BunkerHill: 'Bunker Hill',\n CapitalInsuranceGroup: 'Capital Insurance Group',\n CentralMutualOfOH: 'Central Mutual of OH',\n ChubbInsurance: 'Chubb',\n Cincinnati: 'Cincinnati',\n Citizens: 'Citizens',\n ColoradoCasualty: 'Colorado Casualty',\n Ameriprise: 'CONNECT',\n CSE: 'CSE',\n Cumberland: 'Cumberland',\n Cypress: 'Cypress',\n Dairyland: 'Dairyland',\n Donegal: 'Donegal',\n Electric: 'Electric',\n EMC: 'EMC',\n Encompass: 'Encompass',\n Erie: 'Erie',\n Esurance: 'Esurance',\n ExcelsiorInsuranceCompany: 'Excelsior Insurance Company',\n FairPlan: 'Fair Plan',\n FarmBureau: 'Farm Bureau',\n Farmers: 'Farmers',\n FiremansFund: 'Firemans Fund',\n FirstAmerican: 'First American',\n ForemostInsuranceCompany: 'Foremost Insurance Company',\n Geico: 'Geico',\n GeneralCasualty: 'General Casualty',\n GermantownMutual: 'Germantown Mutual',\n GMAC: 'GMAC',\n Grange: 'Grange',\n Grinnell: 'Grinnell',\n GuideOne: 'Guide One',\n Hanover: 'Hanover',\n Harleysville: 'Harleysville',\n Hartford: 'Hartford',\n HartfordOMNI: 'Hartford OMNI',\n HawkeyeSecurity: 'Hawkeye Security',\n HippoInsuranceCompany: 'Hippo Insurance Company',\n HomeownersOfAmerica: 'Homeowners of America',\n Homesite: 'Homesite',\n HoraceMann: 'Horace Mann',\n HoustonGeneral: 'Houston General',\n Indiana: 'Indiana',\n IndianaFarmers: 'Indiana Farmers',\n Integrity: 'Integrity',\n Kemper: 'Kemper',\n LibertyMutual: 'Liberty Mutual',\n LibertyNorthwest: 'Liberty Northwest',\n Lloyds: 'Lloyds',\n MainStreetAmerica: 'Main Street America',\n MarkelInsuranceCompany: 'Markel Insurance Company',\n MerchantsGroup: 'Merchants Group',\n Mercury: 'Mercury',\n Metlife: 'MetLife',\n MidwesternIndemnity: 'Midwestern Indemnity',\n Montgomery: 'Montgomery',\n MSA: 'MSA',\n MutualBenefit: 'Mutual Benefit',\n Tower: 'National General',\n NatGenPremier: 'NatGen Premier',\n Nationwide: 'Nationwide',\n NationwideScottsdale: 'Nationwide-Scottsdale',\n NewYorkCentralMutual: 'New York Central Mutual',\n NJSkylands: 'NJ Skylands',\n Northstar: 'Northstar',\n OhioCasualty: 'Ohio Casualty',\n OneBeacon: 'One Beacon',\n OregonMutual: 'Oregon Mutual',\n PeerlessMontgomery: 'Peerless/Montgomery',\n Pekin: 'Pekin',\n PennNational: 'Penn National',\n PlymouthRock: 'Plymouth Rock',\n PreferredMutual: 'Preferred Mutual',\n Prudential: 'Prudential',\n PureHighValue: 'Pure High Value',\n Republic: 'Republic',\n RoyalAndSunAlliance: 'Royal and Sun Alliance',\n Safeco: 'Safeco',\n SECURA: 'SECURA',\n SouthernMutual: 'Southern Mutual',\n SouthernTrust: 'Southern Trust',\n StPaulTravelers: 'St. Paul/Travelers',\n StandardMutual: 'Standard Mutual',\n StateAuto: 'State Auto',\n StateFarm: 'State Farm',\n StateFarmFloridaInsuranceCompany: 'State Farm Florida Insurance Company',\n Fidelity: 'Stillwater',\n SunshineStateInsuranceCompany: 'Sunshine State Insurance Company',\n Travelers: 'Travelers',\n TWFG: 'TWFG',\n Unigard: 'Unigard',\n UnitedFireAndCasualty: 'United Fire and Casualty',\n Unitrin: 'Unitrin',\n Universal: 'Universal',\n USAA: 'USAA',\n UticaNational: 'Utica National',\n Wellington: 'Wellington',\n WestBend: 'West Bend',\n WesternNational: 'Western National',\n WesternReserveGroup: 'Western Reserve Group',\n Westfield: 'Westfield',\n WhiteMountains: 'White Mountains',\n WilsonMutual: 'Wilson Mutual',\n Zurich: 'Zurich',\n Other: 'Other',\n OtherNonStandard: 'Other Non-Standard',\n OtherStandard: 'Other Standard'\n};\n\nexport const BOLT_VEHICLE_PRIMARY_USE_LABELS: Record<string, string> = {\n Business: 'Business',\n Pleasure: 'Pleasure',\n Farming: 'Farming',\n To_FromWork: 'To/From Work',\n To_FromSchool: 'To/From School'\n};\n\nexport const BOLT_PRIOR_LIABILITY_LIMIT_LABELS: Record<string, string> = {\n Dontknow: \"Don't Know\",\n ThirtyToSixty: '30/60',\n FiftyToHundred: '50/100',\n HundredToHundred: '100/100',\n HundredToThreeHundred: '100/300',\n TwoHundredFiftyToFiveHundred: '250/500',\n ThreeHundredToThreeHundred: '300/300',\n FiveHundredToFiveHundred: '500/500',\n HundredCSL: '100CSL',\n ThreeHundredCSL: '300CSL',\n FiveHundredCSL: '500CSL'\n};\n\nexport const BOLT_NO_PRIOR_AUTO_INSURANCE_REASON_LABELS: Record<string, string> = {\n ActiveMilitaryDuty: 'Active Military Duty',\n DrivingCompanyCar: 'Driving A Company Car',\n DrivingCarOwnedByRelative: 'Driving A Car Owned By A Relative',\n HasNotOwnedOrOperatedVehicle: 'Has Not Owned Or Operated A Vehicle',\n OwnedVehParkedStoredOffRoadNotDriven: 'Owned Veh Parked/Stored Off Road/Not Driven',\n NonPayment: 'Non-Payment',\n Other: 'Other'\n};\n\nexport const BOLT_POLICY_BI_LABELS: Record<string, string> = {\n Dontknow: \"Don't Know\",\n cov30to60: '30/60',\n cov50to100: '50/100',\n cov100to100: '100/100',\n cov100to300: '100/300',\n cov250to500: '250/500',\n cov300to300: '300/300',\n cov500to500: '500/500',\n cov100CSL: '100 CSL',\n cov300CSL: '300 CSL',\n cov500CSL: '500 CSL'\n};\n\nexport const BOLT_POLICY_UM_LABELS: Record<string, string> = {\n Reject: 'Reject',\n cov30to60: '30/60',\n cov50to100: '50/100',\n cov100to100: '100/100',\n cov100to300: '100/300',\n cov250to500: '250/500',\n cov300to300: '300/300',\n cov500to500: '500/500',\n cov100CSL: '100 CSL',\n cov300CSL: '300 CSL',\n cov500CSL: '500 CSL'\n};\n\nexport const BOLT_POLICY_PD_LABELS: Record<string, string> = {\n Dontknow: \"Don't know\",\n cov25000: '25,000',\n cov50000: '50,000',\n cov100000: '100,000',\n cov250000: '250,000',\n cov500000: '500,000'\n};\n\nexport const BOLT_POLICY_MP_LABELS: Record<string, string> = {\n None: 'None',\n cov500: '500',\n cov1000: '1,000',\n cov2000: '2,000',\n cov2500: '2,500',\n cov5000: '5,000',\n cov10000: '10,000',\n cov15000: '15,000',\n cov25000: '25,000',\n cov50000: '50,000',\n cov100000: '100,000'\n};\n\nexport const BOLT_POLICY_UMPD_LABELS: Record<string, string> = {\n NoCoverage: 'No Coverage',\n cov25000: '25,000',\n cov50000: '50,000',\n cov100000: '100,000'\n};\n\nexport const BOLT_POLICY_PIP_LABELS: Record<string, string> = {\n No_Coverage: 'No Coverage',\n cov2500: '2,500',\n cov5000: '5,000',\n cov10000: '10,000',\n cov25000: '25,000',\n cov50000: '50,000',\n cov100000: '100,000'\n};\n\nexport const BOLT_POLICY_AUTO_DEATH_INDEMNITY_LABELS: Record<string, string> = {\n NoCoverage: 'No Coverage',\n cov5000: '5,000',\n cov10000: '10,000'\n};\n\nexport const BOLT_VEHICLE_COMP_COLL_DEDUCTIBLE_LABELS: Record<string, string> = {\n NoCoverage: 'No Coverage',\n Zero: '0',\n Fifty: '50',\n Hundred: '100',\n TwoHunderd: '200',\n TwoHundredfifty: '250',\n FiveHundred: '500',\n Thousand: '1,000',\n TwoThousand: '2,000'\n};\n\nexport const BOLT_VEHICLE_TOWING_AND_LABOR_LABELS: Record<string, string> = {\n NoCoverage: 'No Coverage',\n TwentyFive: '25',\n Forty: '40',\n Fifty: '50',\n SeventyFive: '75',\n Eighty: '80',\n Hundred: '100',\n TwelveHundred: '120',\n TwoHundred: '200',\n Unlimited: 'Unlimited'\n};\n\nexport const BOLT_VEHICLE_TRANSPORTATION_EXPENSE_LABELS: Record<string, string> = {\n NoCoverage: 'No Coverage',\n cov20to600: '20/600',\n cov30to900: '30/900',\n cov40to1200: '40/1,200',\n cov50to1500: '50/1,500'\n};\n\nexport const BOLT_DRIVER_EDUCATION_LEVEL_LABELS: Record<string, string> = {\n NoHighSchoolDiploma: 'No High School Diploma',\n HighSchoolDiploma: 'High School Diploma',\n SomeCollegeNoDegree: 'Some College - No Degree',\n VocationalTechnicalDegree: 'Vocational Technical Degree',\n AssociatesDegree: 'Associates Degree',\n Bachelors: 'Bachelors',\n Masters: 'Masters',\n Phd: 'Phd',\n MedicalDegree: 'Medical Degree',\n LawDegree: 'Law Degree'\n};\n\nexport const BOLT_DRIVER_INDUSTRY_LABELS: Record<string, string> = {\n 'Agriclt/Forestry/Fish': 'Agriculture/Forestry/Fishing',\n 'Art/Design/Media': 'Art/Design/Media',\n 'Banking/Finance/RE': 'Banking/Finance/Real Estate',\n 'Business/Sales/Offi': 'Business/Sales/Office',\n 'Construct/EnrgyTrds': 'Construction/Energy Trades',\n Disabled: 'Disabled',\n 'Education/Library': 'Education/Library',\n 'Engr/Archt/Sci/Math': 'Engineer/Architect/Science/Math',\n 'Government/Military': 'Government/Military',\n 'Homemaker/Houseprsn': 'Homemaker/House person',\n 'Info Tech': 'Information Technology',\n Insurance: 'Insurance',\n 'Lgl/Law Enfcmt/Sec': 'Legal/Law Enforcement/Security',\n 'Maint/Rpr/Hsekeep': 'Maintenance/Repair/Housekeeping',\n 'Mfg/Production': 'Manufacturing/Production',\n 'Med/Soc Svcs/Relig': 'Medical/Social Services/Religion',\n Other: 'Other',\n 'Person.Care/Service': 'Personal Care/Service',\n 'Rest/Hotel Services': 'Restaurant/Hotel Services',\n Retired: 'Retired',\n 'Sports/Recreation': 'Sports/Recreation',\n Student: 'Student',\n 'Trvl/Trnsprt/Warehs': 'Travel/Transportation/Warehousing',\n Unemployed: 'Unemployed'\n};\n","// cspell:disable\nexport const BOLT_DRIVER_OCCUPATIONS_BY_INDUSTRY = {\n 'Agriclt/Forestry/Fish': [\n 'Agr Inspect/Grader',\n 'Arborist',\n 'Clerk',\n 'Equip. Operator',\n 'Farm/Ranch Owner',\n 'Farm/Ranch Worker',\n 'Fisherman',\n 'Florist',\n 'Laborer/Worker',\n 'Landscape/NursryWkr',\n 'Landscaper',\n 'Logger',\n 'Millworker',\n 'Other',\n 'Ranger',\n 'Supervisor',\n 'Timber Grader/Scale'\n ],\n 'Art/Design/Media': [\n 'Actor',\n 'Admin Assist',\n 'Announcer/Broadcstr',\n 'Artist/Animator',\n 'Author/Writer',\n 'Choreography/Dancer',\n 'Clerk',\n 'Composer/Director',\n 'Curator',\n 'Designer',\n 'Editor',\n 'Journalist/Reporter',\n 'Musician/Singer',\n 'Other',\n 'Printer',\n 'Producer',\n 'Production Crew',\n 'Projectionist',\n 'Receptionist/Sec',\n 'Ticket Sales/Usher'\n ],\n 'Banking/Finance/RE': [\n 'Accountant/Auditor',\n 'Admin Assist',\n 'Analyst/Broker',\n 'Bookkeeper',\n 'Branch Manager',\n 'Clerk',\n 'Collections',\n 'Consultant',\n 'Controller',\n 'CSR/Teller',\n 'Director/Administr',\n 'Executive',\n 'Financial Advisor',\n 'Investment Banker',\n 'Investor',\n 'Loan/EscrowProcess',\n 'Mgr-Credit/Loan',\n 'Mgr-Portfolio/Prod.',\n 'Mgr-Property',\n 'Other',\n 'Realtor',\n 'Receptionist/Sec',\n 'SalesAgt/Represent.',\n 'Trader,Finan Instru',\n 'Underwriter'\n ],\n 'Business/Sales/Offi': [\n 'Account Executive',\n 'Admin Assist',\n 'Buyer',\n 'Clerk-Office',\n 'Consultant',\n 'CSR',\n 'Director/Administr',\n 'Executive',\n 'H.R. Representative',\n 'Marketing Researchr',\n 'Messenger/Courier',\n 'Mgr - District',\n 'Mgr - Finance',\n 'Mgr-Dept/Store',\n 'Mgr-General Opers',\n 'Mgr-H.R./PublicRel',\n 'Mgr-Mkt/Sales',\n 'Mgr/Supervisr-Offic',\n 'Other',\n 'Receptionist/Sec',\n 'Sales-Counter/Rentl',\n 'Sales-Home Based',\n 'Sales-Mfg Rep',\n 'Sales-Retail/Whlsle',\n 'Sales-Route/Vendor'\n ],\n 'Construct/EnrgyTrds': [\n 'Boiler Oper/Maker',\n 'Bricklayer/Mason',\n 'Carpenter',\n 'Carpet Installer',\n 'Concrete Worker',\n 'Constrct Proj Mgr',\n 'Contractor',\n 'Crane Operator',\n 'Electrician/Linesmn',\n 'ElevatorTech/Instl',\n 'Equip. Operator',\n 'FloorLayer/Finisher',\n 'Foreman/Supervisor',\n 'Handyman',\n 'Heat/Air Technician',\n 'Inspector',\n 'Laborer/Worker',\n 'Metalworker',\n 'Miner',\n 'Oil/GasDril/RigOpr',\n 'Other',\n 'Painter',\n 'Plstr/Drywall/Stuc',\n 'Plumber',\n 'Roofer'\n ],\n Disabled: ['Disabled'],\n 'Education/Library': [\n 'Admin Assist',\n 'Audio-Visual Tech.',\n 'Child/DayCare Wrker',\n 'Clerk',\n 'Counselor',\n 'Grad. Teaching/Asst',\n 'Instructor-Vocation',\n 'Librarian/Curator',\n 'Other',\n 'Professor, College',\n 'Receptionist/Sec',\n 'Superintendent',\n 'Teacher, College',\n 'Teacher, K-12',\n 'Teaching Asst/Aide',\n 'Tutor'\n ],\n 'Engr/Archt/Sci/Math': [\n 'Actuary',\n 'Admin Assist',\n 'Analyst',\n 'Architect',\n 'Clerk',\n 'Clinical Data Coord.',\n 'Drafter',\n 'Engineer',\n 'Manager-Project',\n 'Manager-R&D',\n 'Mathematician',\n 'Other',\n 'Receptionist/Sec',\n 'Research Prog. Dir.',\n 'Researcher',\n 'Scientist',\n 'Sociologist',\n 'Surveyor/Mapmaker',\n 'Technician'\n ],\n 'Government/Military': [\n 'Accountant/Auditor',\n 'Admin Assist',\n 'Analyst',\n 'Attorney',\n 'Chief Executive',\n 'Clerk',\n 'Commissioner',\n 'Council member',\n 'Director/Administr',\n 'Enlst Mil Prsnl E1-4',\n 'Legislator',\n 'Mayor/City Manager',\n 'Meter Reader',\n 'NCO (E5-9)',\n 'Officer-Commissiond',\n 'Officer-Warrant',\n 'Other',\n 'Park Ranger',\n 'Planner',\n 'Postmaster',\n 'Receptionist/Sec',\n 'Regulator',\n 'US Postal Worker'\n ],\n 'Homemaker/Houseprsn': ['Homemaker/Houseprsn'],\n 'Info Tech': [\n 'Admin Assist',\n 'Analyst',\n 'Clerk',\n 'Director/Administr',\n 'Engineer-Hardware',\n 'Engineer-Software',\n 'Engineer-Systems',\n 'Executive',\n 'Manager-Systems',\n 'Network Admin',\n 'Other',\n 'Programmer',\n 'Project Coordinator',\n 'Receptionist/Sec',\n 'Support Technician',\n 'Systems Security',\n 'Technical Writer',\n 'Web Developer'\n ],\n Insurance: [\n 'Accountant/Auditor',\n 'Actuarial Clerk',\n 'Actuary',\n 'Admin Assist',\n 'Agent/Broker',\n 'Analyst',\n 'Attorney',\n 'Claims Adjuster',\n 'Clerk',\n 'Commissioner',\n 'CSR',\n 'Director/Administr',\n 'Executive',\n 'Other',\n 'Product Manager',\n 'Receptionist/Sec',\n 'Sales Rep',\n 'Underwriter'\n ],\n 'Lgl/Law Enfcmt/Sec': [\n 'Airport Sec Ofcr',\n 'Animal Control Ofcr',\n 'Attorney',\n 'Bailiff',\n 'Corrections Officer',\n 'Court Clrk/Reporter',\n 'Deputy Sheriff',\n 'Dispatcher',\n 'Examiner',\n 'Fed Agt/Marshall',\n 'Fire Chief',\n 'Fire Fighter/Supv.',\n 'Gaming Ofcr/Invest',\n 'Highway Patrol Ofcr',\n 'Judge/Hearing Ofcr',\n 'Legal Asst./Sec',\n 'Other',\n 'Paralegal/Law Clerk',\n 'Police Chief',\n 'Police Det/Investgr',\n 'Police Offcr/Supvr',\n 'Process Server',\n 'Prvt Invest/Detec.',\n 'Security Guard',\n 'Sheriff'\n ],\n 'Maint/Rpr/Hsekeep': [\n 'Bldg Maint Engineer',\n 'Custodian/Janitor',\n 'Electrician',\n 'Field Service Tech.',\n 'Handyman',\n 'Heat/AirCond Repair',\n 'Housekeeper/Maid',\n 'Lndscpe/Grnds Maint',\n 'Maint Mechanic',\n 'Mechanic',\n 'Other'\n ],\n 'Mfg/Production': [\n 'Admin Assist',\n 'Clerk',\n 'Factory Worker',\n 'Foreman/Supervisor',\n 'Furniture Finisher',\n 'Inspector',\n 'Jeweler',\n 'Machine Operator',\n 'Other',\n 'Packer',\n 'Plant Manager',\n 'Printer/Bookbinder',\n 'Quality Control',\n 'Receptionist/Sec',\n 'Refining Operator',\n 'Shoemaker',\n 'Tailor/Custom Sewer',\n 'Textile Worker',\n 'Upholsterer'\n ],\n 'Med/Soc Svcs/Relig': [\n 'Admin Assist',\n 'Assist-Med/Dent/Vet',\n 'Clergy',\n 'Clerk',\n 'Client Care Worker',\n 'Dental Hygenist',\n 'Dentist',\n 'Doctor',\n 'Hospice Volunteer',\n 'Mortician',\n 'Nurse - C.N.A.',\n 'Nurse - LPN',\n 'Nurse - RN',\n 'Nurse Practitioner',\n 'Optometrist',\n 'Other',\n 'Paramedic/EM Tech',\n 'Pharmacist',\n 'Receptionist/Sec',\n 'Social Worker',\n 'Support Services',\n 'Technician',\n 'Therapist',\n 'Veterinarian'\n ],\n Other: ['Other'],\n 'Person.Care/Service': [\n 'Caregiver',\n 'Dry Cleaner/Laundry',\n 'Hair Stylist/Barber',\n 'Housekeeper',\n 'Manicurist',\n 'Masseuse',\n 'Nanny',\n 'Other',\n 'Pet Services',\n 'Receptionist/Sec'\n ],\n 'Rest/Hotel Services': [\n 'Baker',\n 'Bartender',\n 'Bellhop',\n 'Bus Person',\n 'Caterer',\n 'Chef',\n 'Concessionaire',\n 'Concierge',\n 'Cook-Rest/Cafeteria',\n 'Cook/Wrkr-Fast Food',\n 'Delivery Person',\n 'Desk Clerk',\n 'Dishwasher',\n 'Food Prod/Packing',\n 'Host/Maitre d',\n 'Housekeeper/Maid',\n 'Manager',\n 'Other',\n 'Valet',\n 'Waiter/Waitress',\n 'Wine Steward'\n ],\n Retired: ['Retired'],\n 'Sports/Recreation': [\n 'Activity/Recre.Asst',\n 'Admin Assist',\n 'Agent',\n 'Athlete',\n 'CampCounselor/Lead',\n 'Clerk',\n 'Coach',\n 'Concessionaire',\n 'Director, Program',\n 'Event Mgr/Promoter',\n 'Life Guard',\n 'Mgr - Fitness Club',\n 'Other',\n 'Park Ranger',\n 'Receptionist/Sec',\n 'Sales-Tkt/Mmbrshp',\n 'SportsBrdcstr/Journ',\n 'Trainer/Instructor',\n 'Umpire/Referee'\n ],\n Student: ['Graduate Student', 'High school', 'Other', 'Undergraduate'],\n 'Trvl/Trnsprt/Warehs': [\n 'Admin Assist',\n 'Air Traffic Control',\n 'Airport Ops Crew',\n 'Bellhop/Porter',\n 'Clerk',\n 'Crane Loader/Oper',\n 'Dispatcher',\n 'Driver-Bus/Strcar',\n 'Driver-Taxi/Limo',\n 'Driver-Truck/Delvry',\n 'Flight Attendant',\n 'Forklift Operator',\n 'Laborer',\n 'Longshoreman',\n 'Mate/Sailor',\n 'Mgr Warehse/Dist',\n 'Other',\n 'Parking Lot Attend',\n 'Pilot/Capt/Eng',\n 'Railroad Worker',\n 'Receptionist/Sec',\n 'Shipping/RecClk',\n 'Subway/LgtRail Oper',\n 'Ticket Agent',\n 'Transportation Spec'\n ],\n Unemployed: ['Unemployed']\n} as const;\n\nexport const BOLT_DRIVER_OCCUPATION_LABELS_FROM_BOLT = {\n 'Agr Inspect/Grader': 'Agriculture Inspector/Grader',\n Arborist: 'Arborist',\n Clerk: 'Clerk',\n 'Equip. Operator': 'Equipment Operator',\n 'Farm/Ranch Owner': 'Farm/Ranch Owner',\n 'Farm/Ranch Worker': 'Farm/Ranch Worker',\n Fisherman: 'Fisherman',\n Florist: 'Florist',\n 'Laborer/Worker': 'Laborer/Worker',\n 'Landscape/NursryWkr': 'Landscaper/Nursery Worker',\n Landscaper: 'Landscaper',\n Logger: 'Logger',\n Millworker: 'Mill worker',\n Other: 'Other',\n Ranger: 'Ranger',\n Supervisor: 'Supervisor',\n 'Timber Grader/Scale': 'Timber Grader/Scale',\n Actor: 'Actor',\n 'Admin Assist': 'Administrative Assistant',\n 'Announcer/Broadcstr': 'Announcer/Broadcaster',\n 'Artist/Animator': 'Artist/Animator',\n 'Author/Writer': 'Author/Writer',\n 'Choreography/Dancer': 'Choreography/Dancer',\n 'Composer/Director': 'Composer/Director',\n Curator: 'Curator',\n Designer: 'Designer',\n Editor: 'Editor',\n 'Journalist/Reporter': 'Journalist/Reporter',\n 'Musician/Singer': 'Musician/Singer',\n Printer: 'Printer',\n Producer: 'Producer',\n 'Production Crew': 'Production Crew',\n Projectionist: 'Projectionist',\n 'Receptionist/Sec': 'Receptionist/Secretary',\n 'Ticket Sales/Usher': 'Ticket Sales/Usher',\n 'Accountant/Auditor': 'Accountant/Auditor',\n 'Analyst/Broker': 'Analyst/Broker',\n Bookkeeper: 'Bookkeeper',\n 'Branch Manager': 'Branch Manager',\n Collections: 'Collections',\n Consultant: 'Consultant',\n Controller: 'Controller',\n 'CSR/Teller': 'CSR/Teller',\n 'Director/Administr': 'Director/Administrator',\n Executive: 'Executive',\n 'Financial Advisor': 'Financial Advisor',\n 'Investment Banker': 'Investment Banker',\n Investor: 'Investor',\n 'Loan/EscrowProcess': 'Loan/Escrow Processor',\n 'Mgr-Credit/Loan': 'Manager-Credit/Loan',\n 'Mgr-Portfolio/Prod.': 'Manager-Portfolio/Production',\n 'Mgr-Property': 'Manager-Property',\n Realtor: 'Realtor',\n 'SalesAgt/Represent.': 'Sales Agent/Representative',\n 'Trader,Finan Instru': 'Trader, Financial Instruments',\n Underwriter: 'Underwriter',\n 'Account Executive': 'Account Executive',\n Buyer: 'Buyer',\n 'Clerk-Office': 'Clerk-Office',\n CSR: 'Customer Service Representative',\n 'H.R. Representative': 'H.R. Representative',\n 'Marketing Researchr': 'Marketing Researcher',\n 'Messenger/Courier': 'Messenger/Courier',\n 'Mgr - District': 'Manager - District',\n 'Mgr - Finance': 'Manager - Finance',\n 'Mgr-Dept/Store': 'Manager - Department/Store',\n 'Mgr-General Opers': 'Manager - General Operations',\n 'Mgr-H.R./PublicRel': 'Manager - H.R./Public Relations',\n 'Mgr-Mkt/Sales': 'Manager - Marketing/Sales',\n 'Mgr/Supervisr-Offic': 'Manager/Supervisor - Office',\n 'Sales-Counter/Rentl': 'Sales-Counter/Rental',\n 'Sales-Home Based': 'Sales-Home Based',\n 'Sales-Mfg Rep': 'Sales-Manufacture Rep',\n 'Sales-Retail/Whlsle': 'Sales-Retail/Wholesale',\n 'Sales-Route/Vendor': 'Sales-Route/Vendor',\n 'Boiler Oper/Maker': 'Boiler Operator/Maker',\n 'Bricklayer/Mason': 'Bricklayer/Mason',\n Carpenter: 'Carpenter',\n 'Carpet Installer': 'Carpet Installer',\n 'Concrete Worker': 'Concrete Worker',\n 'Constrct Proj Mgr': 'Construction - Project Manager',\n Contractor: 'Contractor',\n 'Crane Operator': 'Crane Operator',\n 'Electrician/Linesmn': 'Electrician/Linesman',\n 'ElevatorTech/Instl': 'Elevator Technician/Installer',\n 'FloorLayer/Finisher': 'Floor Layer/Finisher',\n 'Foreman/Supervisor': 'Foreman/Supervisor',\n Handyman: 'Handyman',\n 'Heat/Air Technician': 'Heat/Air Technician',\n Inspector: 'Inspector',\n Metalworker: 'Metalworker',\n Miner: 'Miner',\n 'Oil/GasDril/RigOpr': 'Oil/Gas Driller/Rig Operator',\n Painter: 'Painter',\n 'Plstr/Drywall/Stuc': 'Plaster/Drywall/Stucco',\n Plumber: 'Plumber',\n Roofer: 'Roofer',\n Disabled: 'Disabled',\n 'Audio-Visual Tech.': 'Audio-Visual Tech.',\n 'Child/DayCare Wrker': 'Child/Daycare Worker',\n Counselor: 'Counselor',\n 'Grad. Teaching/Asst': 'Graduate Teaching Assistant',\n 'Instructor-Vocation': 'Instructor-Vocation',\n 'Librarian/Curator': 'Librarian/Curator',\n 'Professor, College': 'Professor, College',\n Superintendent: 'Superintendent',\n 'Teacher, College': 'Teacher, College',\n 'Teacher, K-12': 'Teacher, K-12',\n 'Teaching Asst/Aide': 'Teaching Assistant/Aide',\n Tutor: 'Tutor',\n Actuary: 'Actuary',\n Analyst: 'Analyst',\n Architect: 'Architect',\n 'Clinical Data Coord.': 'Clinical Data Coordinator',\n Drafter: 'Drafter',\n Engineer: 'Engineer',\n 'Manager-Project': 'Manager-Project',\n 'Manager-R&D': 'Manager-R&D',\n Mathematician: 'Mathematician',\n 'Research Prog. Dir.': 'Research Program Director',\n Researcher: 'Researcher',\n Scientist: 'Scientist',\n Sociologist: 'Sociologist',\n 'Surveyor/Mapmaker': 'Surveyor/Mapmaker',\n Technician: 'Technician',\n Attorney: 'Attorney',\n 'Chief Executive': 'Chief Executive',\n Commissioner: 'Commissioner',\n 'Council member': 'Council member',\n 'Enlst Mil Prsnl E1-4': 'Enlisted Military Personnel (E1-4)',\n Legislator: 'Legislator',\n 'Mayor/City Manager': 'Mayor/City Manager',\n 'Meter Reader': 'Meter Reader',\n 'NCO (E5-9)': 'NCO (E5-9)',\n 'Officer-Commissiond': 'Officer-Commissioned',\n 'Officer-Warrant': 'Officer-Warrant',\n 'Park Ranger': 'Park Ranger',\n Planner: 'Planner',\n Postmaster: 'Postmaster',\n Regulator: 'Regulator',\n 'US Postal Worker': 'US Postal Worker',\n 'Homemaker/Houseprsn': 'Homemaker/House person',\n 'Engineer-Hardware': 'Engineer-Hardware',\n 'Engineer-Software': 'Engineer-Software',\n 'Engineer-Systems': 'Engineer-Systems',\n 'Manager-Systems': 'Manager-Systems',\n 'Network Admin': 'Network Administrator',\n Programmer: 'Programmer',\n 'Project Coordinator': 'Project Coordinator',\n 'Support Technician': 'Support Technician',\n 'Systems Security': 'Systems Security',\n 'Technical Writer': 'Technical Writer',\n 'Web Developer': 'Web Developer',\n 'Actuarial Clerk': 'Actuarial Clerk',\n 'Agent/Broker': 'Agent/Broker',\n 'Claims Adjuster': 'Claims Adjuster',\n 'Product Manager': 'Product Manager',\n 'Sales Rep': 'Sales Representative',\n 'Airport Sec Ofcr': 'Airport Security Officer',\n 'Animal Control Ofcr': 'Animal Control Officer',\n Bailiff: 'Bailiff',\n 'Corrections Officer': 'Corrections Officer',\n 'Court Clrk/Reporter': 'Court Clerk/Reporter',\n 'Deputy Sheriff': 'Deputy Sheriff',\n Dispatcher: 'Dispatcher',\n Examiner: 'Examiner',\n 'Fed Agt/Marshall': 'Federal Agent/Marshall',\n 'Fire Chief': 'Fire Chief',\n 'Fire Fighter/Supv.': 'Fire Fighter/Supervisor',\n 'Gaming Ofcr/Invest': 'Gaming Officer/Investigator',\n 'Highway Patrol Ofcr': 'Highway Patrol Officer',\n 'Judge/Hearing Ofcr': 'Judge/Hearing Officer',\n 'Legal Asst./Sec': 'Legal Assistant/Secretary',\n 'Paralegal/Law Clerk': 'Paralegal/Law Clerk',\n 'Police Chief': 'Police Chief',\n 'Police Det/Investgr': 'Police Detective/Investigator',\n 'Police Offcr/Supvr': 'Police Officer/Supervisor',\n 'Process Server': 'Process Server',\n 'Prvt Invest/Detec.': 'Private Investigator/Detective',\n 'Security Guard': 'Security Guard',\n Sheriff: 'Sheriff',\n 'Bldg Maint Engineer': 'Building Maintenance Engineer',\n 'Custodian/Janitor': 'Custodian/Janitor',\n Electrician: 'Electrician',\n 'Field Service Tech.': 'Field Service Technician',\n 'Heat/AirCond Repair': 'Heat/Air Conditioner Repairman',\n 'Housekeeper/Maid': 'Housekeeper/Maid',\n 'Lndscpe/Grnds Maint': 'Landscape/Grounds Maintenance',\n 'Maint Mechanic': 'Maintenance Mechanic',\n Mechanic: 'Mechanic',\n 'Factory Worker': 'Factory Worker',\n 'Furniture Finisher': 'Furniture Finisher',\n Jeweler: 'Jeweler',\n 'Machine Operator': 'Machine Operator',\n Packer: 'Packer',\n 'Plant Manager': 'Plant Manager',\n 'Printer/Bookbinder': 'Printer/Bookbinder',\n 'Quality Control': 'Quality Control',\n 'Refining Operator': 'Refining Operator',\n Shoemaker: 'Shoemaker',\n 'Tailor/Custom Sewer': 'Tailor/Custom Sewer',\n 'Textile Worker': 'Textile Worker',\n Upholsterer: 'Upholsterer',\n 'Assist-Med/Dent/Vet': 'Assistant - Medic/Dent/Vet',\n Clergy: 'Clergy',\n 'Client Care Worker': 'Client Care Worker',\n 'Dental Hygenist': 'Dental Hygienist',\n Dentist: 'Dentist',\n Doctor: 'Doctor',\n 'Hospice Volunteer': 'Hospice Volunteer',\n Mortician: 'Mortician',\n 'Nurse - C.N.A.': 'Nurse - C.N.A.',\n 'Nurse - LPN': 'Nurse - LPN',\n 'Nurse - RN': 'Nurse - RN',\n 'Nurse Practitioner': 'Nurse Practitioner',\n Optometrist: 'Optometrist',\n 'Paramedic/EM Tech': 'Paramedic/E.M. Technician',\n Pharmacist: 'Pharmacist',\n 'Social Worker': 'Social Worker',\n 'Support Services': 'Support Services',\n Therapist: 'Therapist',\n Veterinarian: 'Veterinarian',\n Caregiver: 'Caregiver',\n 'Dry Cleaner/Laundry': 'Dry Cleaner/Laundry',\n 'Hair Stylist/Barber': 'Hair Stylist/Barber',\n Housekeeper: 'Housekeeper',\n Manicurist: 'Manicurist',\n Masseuse: 'Masseuse',\n Nanny: 'Nanny',\n 'Pet Services': 'Pet Services',\n Baker: 'Baker',\n Bartender: 'Bartender',\n Bellhop: 'Bellhop',\n 'Bus Person': 'Bus Person',\n Caterer: 'Caterer',\n Chef: 'Chef',\n Concessionaire: 'Concessionaire',\n Concierge: 'Concierge',\n 'Cook-Rest/Cafeteria': 'Cook - Restaurant/Cafeteria',\n 'Cook/Wrkr-Fast Food': 'Cook/Worker-Fast Food',\n 'Delivery Person': 'Delivery Person',\n 'Desk Clerk': 'Desk Clerk',\n Dishwasher: 'Dishwasher',\n 'Food Prod/Packing': 'Food Production/Packing',\n 'Host/Maitre d': 'Host/Maitre d',\n Manager: 'Manager',\n Valet: 'Valet',\n 'Waiter/Waitress': 'Waiter/Waitress',\n 'Wine Steward': 'Wine Steward',\n Retired: 'Retired',\n 'Activity/Recre.Asst': 'Activity/Recreational Assistant',\n Agent: 'Agent',\n Athlete: 'Athlete',\n 'CampCounselor/Lead': 'Camp Counselor/Lead',\n Coach: 'Coach',\n 'Director, Program': 'Director, Program',\n 'Event Mgr/Promoter': 'Event Manager/Promoter',\n 'Life Guard': 'Life Guard',\n 'Mgr - Fitness Club': 'Manager - Fitness Club',\n 'Sales-Tkt/Mmbrshp': 'Sales-Ticket/Membership',\n 'SportsBrdcstr/Journ': 'Sports Broadcaster/Journalist',\n 'Trainer/Instructor': 'Trainer/Instructor',\n 'Umpire/Referee': 'Umpire/Referee',\n 'Graduate Student': 'Graduate Student',\n 'High school': 'High school',\n Undergraduate: 'Undergraduate',\n 'Air Traffic Control': 'Air Traffic Control',\n 'Airport Ops Crew': 'Airport Operations Crew',\n 'Bellhop/Porter': 'Bellhop/Porter',\n 'Crane Loader/Oper': 'Crane Loader/Operator',\n 'Driver-Bus/Strcar': 'Driver - Bus/Streetcar',\n 'Driver-Taxi/Limo': 'Driver-Taxi/Limo',\n 'Driver-Truck/Delvry': 'Driver-Truck/Delivery',\n 'Flight Attendant': 'Flight Attendant',\n 'Forklift Operator': 'Forklift Operator',\n Laborer: 'Laborer',\n Longshoreman: 'Longshoreman',\n 'Mate/Sailor': 'Mate/Sailor',\n 'Mgr Warehse/Dist': 'Manager - Warehouse/District',\n 'Parking Lot Attend': 'Parking Lot Attendant',\n 'Pilot/Capt/Eng': 'Pilot/Captain/Engineer',\n 'Railroad Worker': 'Railroad Worker',\n 'Shipping/RecClk': 'Shipping/Receiving Clerk',\n 'Subway/LgtRail Oper': 'Subway/Light Rail Operator',\n 'Ticket Agent': 'Ticket Agent',\n 'Transportation Spec': 'Transportation Specialist',\n Unemployed: 'Unemployed'\n} as const;\n","import { BOLT_DRIVER_EDUCATION_LEVEL_LABELS, BOLT_DRIVER_INDUSTRY_LABELS } from '../config/bolt-policy-option-labels';\nimport { BOLT_DRIVER_OCCUPATION_LABELS_FROM_BOLT } from '../config/bolt-driver-occupation-map';\n\nfunction normalizeByLabelMap(value: unknown, labelsByKey: Record<string, string>): unknown {\n if (typeof value !== 'string') return value;\n const raw = value.trim();\n if (!raw) return value;\n\n if (labelsByKey[raw]) return raw;\n\n const lowered = raw.toLowerCase();\n const key = Object.keys(labelsByKey).find((k) => k.toLowerCase() === lowered || labelsByKey[k]?.toLowerCase() === lowered);\n return key ?? value;\n}\n\nexport function normalizeDriverIndustryValue(value: unknown): unknown {\n return normalizeByLabelMap(value, BOLT_DRIVER_INDUSTRY_LABELS);\n}\n\nexport function normalizeDriverEducationLevelValue(value: unknown): unknown {\n return normalizeByLabelMap(value, BOLT_DRIVER_EDUCATION_LEVEL_LABELS);\n}\n\nexport function normalizeDriverOccupationValue(value: unknown): unknown {\n return normalizeByLabelMap(value, BOLT_DRIVER_OCCUPATION_LABELS_FROM_BOLT as Record<string, string>);\n}\n","import type { Question } from '@getcredify/credify-insurance-types';\nimport type { FormValues } from './form';\n\ntype AutoCoverageConditionKeys = {\n currentCarrierKey: string | null;\n effectiveDateKey: string | null;\n expirationDateKey: string | null;\n noInsuranceReasonKeys: ReadonlySet<string>;\n hideWhenNoPriorInsuranceKeys: ReadonlySet<string>;\n};\n\nfunction normalizeText(text: string): string {\n return text.trim().toLowerCase();\n}\n\nfunction parseDateOnly(value: unknown): number | null {\n if (typeof value !== 'string') return null;\n const match = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!match) return null;\n\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) return null;\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n\n const dt = new Date(Date.UTC(year, month - 1, day));\n if (dt.getUTCFullYear() !== year || dt.getUTCMonth() !== month - 1 || dt.getUTCDate() !== day) return null;\n return dt.getTime();\n}\n\nexport function resolveAutoCoverageConditionKeys(questions: Question[]): AutoCoverageConditionKeys {\n let currentCarrierKey: string | null = null;\n let effectiveDateKey: string | null = null;\n let expirationDateKey: string | null = null;\n const noInsuranceReasonKeys = new Set<string>();\n const hideWhenNoPriorInsuranceKeys = new Set<string>();\n\n questions.forEach((q) => {\n const key = String(q.key ?? '');\n const prompt = normalizeText(String(q.question ?? ''));\n\n if (key === 'auto_prior_carrier_name' || prompt.includes('current auto insurance company')) {\n currentCarrierKey = key;\n }\n\n if (key === 'effective_date' || prompt.includes('when do you need your insurance to begin')) {\n effectiveDateKey = key;\n }\n\n if (key === 'auto_prior_expiration_date' || prompt.includes('when does the current policy expire')) {\n expirationDateKey = key;\n }\n\n if (key === 'auto_reason_for_no_insurance' || prompt.includes('reason you are not currently insured')) {\n noInsuranceReasonKeys.add(key);\n }\n\n if (\n key === 'auto_prior_years' ||\n key === 'auto_prior_months' ||\n key === 'auto_continuous_coverage_years' ||\n key === 'auto_prior_expiration_date' ||\n key === 'auto_current_annual_premium_cents' ||\n key === 'auto_prior_liability_limit'\n ) {\n hideWhenNoPriorInsuranceKeys.add(key);\n }\n });\n\n return {\n currentCarrierKey,\n effectiveDateKey,\n expirationDateKey,\n noInsuranceReasonKeys,\n hideWhenNoPriorInsuranceKeys\n };\n}\n\nexport function shouldRequireNoInsuranceReason(values: FormValues, keys: AutoCoverageConditionKeys): boolean {\n const selectedCarrier = keys.currentCarrierKey ? values[keys.currentCarrierKey] : undefined;\n if (selectedCarrier === 'NoPriorInsurance') return true;\n\n if (!keys.effectiveDateKey || !keys.expirationDateKey) return false;\n\n const expiration = parseDateOnly(values[keys.expirationDateKey]);\n const effective = parseDateOnly(values[keys.effectiveDateKey]);\n if (expiration == null || effective == null) return false;\n\n return expiration < effective;\n}\n\nexport function shouldShowNoInsuranceReason(question: Question, values: FormValues, keys: AutoCoverageConditionKeys): boolean {\n const key = String(question.key ?? '');\n const selectedCarrier = keys.currentCarrierKey ? values[keys.currentCarrierKey] : undefined;\n const hasNoPriorInsurance = selectedCarrier === 'NoPriorInsurance';\n\n if (hasNoPriorInsurance && keys.hideWhenNoPriorInsuranceKeys.has(key)) {\n return false;\n }\n\n if (!keys.noInsuranceReasonKeys.has(key)) return true;\n if (hasNoPriorInsurance) return true;\n return shouldRequireNoInsuranceReason(values, keys);\n}\n\nexport function isNoInsuranceReasonQuestion(question: Question, keys: AutoCoverageConditionKeys): boolean {\n const key = String(question.key ?? '');\n return keys.noInsuranceReasonKeys.has(key);\n}\n","// cspell:disable\nexport const BOLT_VEHICLE_MAKE_OPTIONS = [\n 'ACURA',\n 'ALFA ROMEO',\n 'ASTON MARTIN',\n 'AUDI',\n 'BENTLEY',\n 'BMW',\n 'BUGATTI',\n 'BUICK',\n 'CADILLAC',\n 'CHEVROLET',\n 'CHRYSLER',\n 'CRUISE',\n 'DODGE',\n 'FERRARI',\n 'FIAT',\n 'FORD',\n 'FREIGHTLINER',\n 'GENESIS',\n 'GLOBAL ELECTRIC MOTORS',\n 'GMC',\n 'HONDA',\n 'HYUNDAI',\n 'INFINITI',\n 'JAGUAR',\n 'JEEP',\n 'KARMA AUTOMOTIVE',\n 'KIA',\n 'LAMBORGHINI',\n 'LAND ROVER',\n 'LEXUS',\n 'LINCOLN',\n 'LOTUS',\n 'MASERATI',\n 'MAZDA',\n 'MCLAREN AUTOMOTIVE',\n 'MERCEDES-BENZ',\n 'MINI',\n 'MITSUBISHI',\n 'NISSAN',\n 'POLESTAR',\n 'PORSCHE',\n 'RAM',\n 'ROLLS-ROYCE',\n 'SUBARU',\n 'TESLA',\n 'TOYOTA',\n 'VOLKSWAGEN',\n 'VOLVO'\n] as const;\n\nexport const BOLT_VEHICLE_MODELS_BY_YEAR_BY_MAKE: Readonly<Record<string, Readonly<Record<string, readonly string[]>>>> = {\n '2020': {\n // Additional makes: static catalog is sparse; year fallback still applies. Expand as Bolt data is imported.\n TOYOTA: ['CAMRY LE', 'CAMRY SE', 'COROLLA LE', 'COROLLA SE', 'RAV4 LE', 'HIGHLANDER LE', 'TACOMA SR5', 'PRIUS LE'],\n FORD: ['F-150 XL', 'F-150 XLT', 'ESCAPE SE', 'EXPLORER XLT', 'MUSTANG GT', 'EDGE SEL', 'FUSION SE'],\n CHEVROLET: ['SILVERADO 1500 WT', 'EQUINOX LS', 'MALIBU LT', 'TRAVERSE LS', 'TAHOE LS', 'BOLT EV LT'],\n NISSAN: ['ALTIMA S', 'SENTRA S', 'ROGUE S', 'FRONTIER S', 'MAXIMA SV', 'PATHFINDER S'],\n HONDA: [\n 'ACCORD EX',\n 'ACCORD EXL',\n 'ACCORD HYBRID',\n 'ACCORD HYBRID EX',\n 'ACCORD HYBRID EXL',\n 'ACCORD LX',\n 'ACCORD SPORT',\n 'ACCORD TOURING',\n 'ACCORD TOURING HYBRID',\n 'CIVIC EX',\n 'CIVIC EXL',\n 'CIVIC LX',\n 'CIVIC SI',\n 'CIVIC SPORT',\n 'CIVIC SPORT TOURING',\n 'CIVIC TOURING',\n 'CIVIC TYPE-R',\n 'CIVIC TYPE-R TOURING',\n 'CLARITY',\n 'CLARITY TOURING',\n 'CR-V EX',\n 'CR-V EXL',\n 'CR-V LX',\n 'CR-V SPORT',\n 'CR-V TOURING',\n 'FIT EX',\n 'FIT EXL',\n 'FIT LX',\n 'FIT SPORT',\n 'HR-V EX',\n 'HR-V EXL',\n 'HR-V LX',\n 'HR-V SPORT',\n 'HR-V TOURING',\n 'INSIGHT EX',\n 'INSIGHT LX',\n 'INSIGHT TOURING',\n 'ODYSSEY ELITE',\n 'ODYSSEY EX',\n 'ODYSSEY EXL',\n 'ODYSSEY LX',\n 'ODYSSEY TOURING',\n 'PASSPORT ELITE',\n 'PASSPORT EXL',\n 'PASSPORT SPORT',\n 'PASSPORT TOURING',\n 'PILOT BLACK',\n 'PILOT ELITE',\n 'PILOT EX',\n 'PILOT EXL',\n 'PILOT LX',\n 'PILOT TOURING',\n 'RIDGELINE BLACK EDITION',\n 'RIDGELINE RTL',\n 'RIDGELINE SPORT'\n ]\n }\n} as const;\n\nexport const BOLT_VEHICLE_BODY_STYLES_BY_YEAR_BY_MAKE_BY_MODEL: Readonly<\n Record<string, Readonly<Record<string, Readonly<Record<string, readonly string[]>>>>>\n> = {\n '2020': {\n TOYOTA: {\n 'CAMRY LE': ['SEDAN 4 Door'],\n 'CAMRY SE': ['SEDAN 4 Door'],\n 'COROLLA LE': ['SEDAN 4 Door'],\n 'COROLLA SE': ['SEDAN 4 Door'],\n 'RAV4 LE': ['SUV 4 Door'],\n 'HIGHLANDER LE': ['SUV 4 Door'],\n 'TACOMA SR5': ['PICKUP 4 Door'],\n 'PRIUS LE': ['HATCHBACK 4 Door']\n },\n FORD: {\n 'F-150 XL': ['PICKUP 4 Door'],\n 'F-150 XLT': ['PICKUP 4 Door'],\n 'ESCAPE SE': ['SUV 4 Door'],\n 'EXPLORER XLT': ['SUV 4 Door'],\n 'MUSTANG GT': ['COUPE 2 Door'],\n 'EDGE SEL': ['SUV 4 Door'],\n 'FUSION SE': ['SEDAN 4 Door']\n },\n CHEVROLET: {\n 'SILVERADO 1500 WT': ['PICKUP 4 Door'],\n 'EQUINOX LS': ['SUV 4 Door'],\n 'MALIBU LT': ['SEDAN 4 Door'],\n 'TRAVERSE LS': ['SUV 4 Door'],\n 'TAHOE LS': ['SUV 4 Door'],\n 'BOLT EV LT': ['HATCHBACK 4 Door']\n },\n NISSAN: {\n 'ALTIMA S': ['SEDAN 4 Door'],\n 'SENTRA S': ['SEDAN 4 Door'],\n 'ROGUE S': ['SUV 4 Door'],\n 'FRONTIER S': ['PICKUP 4 Door'],\n 'MAXIMA SV': ['SEDAN 4 Door'],\n 'PATHFINDER S': ['SUV 4 Door']\n },\n HONDA: {\n 'ACCORD EX': ['SEDAN 4 Front 4L DOHC 16V']\n }\n }\n} as const;\n\n/** Bolt-style uppercase for make/model lookups (DB/API may send mixed case). */\nfunction normalizeVehicleToken(v: unknown): string {\n return String(v ?? '')\n .trim()\n .toUpperCase();\n}\n\n/** Match a normalized token to a key in static maps (keys are typically UPPERCASE). */\nfunction resolveKeyInRecord<T>(norm: string, record: Readonly<Record<string, T>> | undefined): string | undefined {\n if (!record || !norm) return undefined;\n if (record[norm] !== undefined) return norm;\n return Object.keys(record).find((k) => k.toUpperCase() === norm);\n}\n\n/** Years present in static Bolt vehicle data (string keys, e.g. \"2020\"). */\nfunction yearsWithModelData(byYear: Readonly<Record<string, Readonly<Record<string, readonly string[]>>>>): number[] {\n return Object.keys(byYear)\n .map((y) => Number(y))\n .filter((n) => Number.isFinite(n))\n .sort((a, b) => a - b);\n}\n\nfunction hasModelsForMake(data: typeof BOLT_VEHICLE_MODELS_BY_YEAR_BY_MAKE, yStr: string, makeNorm: string): boolean {\n const byMake = data[yStr];\n const makeKey = resolveKeyInRecord(makeNorm, byMake);\n const list = makeKey ? byMake?.[makeKey] : undefined;\n return !!(list && list.length > 0);\n}\n\n/**\n * Static tables are often sparse by model year. Prefer an exact year+make match;\n * otherwise use the chronologically closest year that lists this make.\n */\nfunction resolveModelYearKey(year: string, makeNorm: string, data: typeof BOLT_VEHICLE_MODELS_BY_YEAR_BY_MAKE): string | undefined {\n if (hasModelsForMake(data, year, makeNorm)) return year;\n\n const years = yearsWithModelData(data);\n const yNum = Number(year);\n if (!Number.isFinite(yNum) || years.length === 0) return undefined;\n\n let best: string | undefined;\n let bestDist = Infinity;\n for (const y of years) {\n const yStr = String(y);\n if (!hasModelsForMake(data, yStr, makeNorm)) continue;\n const d = Math.abs(y - yNum);\n if (d < bestDist) {\n bestDist = d;\n best = yStr;\n }\n }\n return best;\n}\n\nfunction lookupBodyStyles(\n yStr: string,\n makeNorm: string,\n modelNorm: string,\n data: typeof BOLT_VEHICLE_BODY_STYLES_BY_YEAR_BY_MAKE_BY_MODEL\n): readonly string[] | undefined {\n const byMake = data[yStr];\n const makeKey = resolveKeyInRecord(makeNorm, byMake);\n if (!makeKey) return undefined;\n const byModel = byMake?.[makeKey];\n const modelKey = resolveKeyInRecord(modelNorm, byModel);\n if (!modelKey) return undefined;\n const list = byModel?.[modelKey];\n return list && list.length > 0 ? list : undefined;\n}\n\n/**\n * Same idea as resolveModelYearKey: find a year key that has body styles for this trim\n * when the selected year has no row yet.\n */\nfunction resolveBodyStyleYearKey(\n year: string,\n makeNorm: string,\n modelNorm: string,\n data: typeof BOLT_VEHICLE_BODY_STYLES_BY_YEAR_BY_MAKE_BY_MODEL\n): string | undefined {\n if (lookupBodyStyles(year, makeNorm, modelNorm, data)) return year;\n\n const years = Object.keys(data)\n .map((y) => Number(y))\n .filter((n) => Number.isFinite(n))\n .sort((a, b) => a - b);\n const yNum = Number(year);\n if (!Number.isFinite(yNum) || years.length === 0) return undefined;\n\n let best: string | undefined;\n let bestDist = Infinity;\n for (const y of years) {\n const yStr = String(y);\n if (!lookupBodyStyles(yStr, makeNorm, modelNorm, data)) continue;\n const d = Math.abs(y - yNum);\n if (d < bestDist) {\n bestDist = d;\n best = yStr;\n }\n }\n return best;\n}\n\nexport function getVehicleModelOptions(yearValue: unknown, makeValue: unknown): string[] {\n const year = String(yearValue ?? '').trim();\n const makeNorm = normalizeVehicleToken(makeValue);\n if (!year || !makeNorm) return [];\n const resolvedYear = resolveModelYearKey(year, makeNorm, BOLT_VEHICLE_MODELS_BY_YEAR_BY_MAKE);\n if (!resolvedYear) return [];\n const byMake = BOLT_VEHICLE_MODELS_BY_YEAR_BY_MAKE[resolvedYear];\n const makeKey = resolveKeyInRecord(makeNorm, byMake);\n if (!makeKey) return [];\n return [...(byMake[makeKey] ?? [])];\n}\n\nexport function getVehicleBodyStyleOptions(yearValue: unknown, makeValue: unknown, modelValue: unknown): string[] {\n const year = String(yearValue ?? '').trim();\n const makeNorm = normalizeVehicleToken(makeValue);\n const modelNorm = normalizeVehicleToken(modelValue);\n if (!year || !makeNorm || !modelNorm) return [];\n const resolvedYear = resolveBodyStyleYearKey(year, makeNorm, modelNorm, BOLT_VEHICLE_BODY_STYLES_BY_YEAR_BY_MAKE_BY_MODEL);\n if (!resolvedYear) return [];\n const list = lookupBodyStyles(resolvedYear, makeNorm, modelNorm, BOLT_VEHICLE_BODY_STYLES_BY_YEAR_BY_MAKE_BY_MODEL);\n return list ? [...list] : [];\n}\n","import { useMemo, useState, useEffect } from 'react';\n\nimport { type Question } from '@getcredify/credify-insurance-types';\n\nimport {\n TextInput,\n NumericInput,\n EmailInput,\n TelInput,\n UrlInput,\n PasswordInput,\n TextArea,\n DateInput,\n Checkbox,\n Radio,\n RadioGroup,\n SelectInput,\n AddressAutocomplete\n} from './index';\n\nimport { slugify, validateQuestions, coerceNumber, type FormValues } from '../utils/form';\nimport { normalizeDriverIndustryValue } from '../utils/driver-option-normalizers';\nimport {\n resolveAutoCoverageConditionKeys,\n shouldRequireNoInsuranceReason,\n shouldShowNoInsuranceReason,\n isNoInsuranceReasonQuestion\n} from '../utils/autoCoverageCondition';\nimport {\n BOLT_AUTO_PRIOR_CARRIER_LABELS,\n BOLT_POLICY_AUTO_DEATH_INDEMNITY_LABELS,\n BOLT_POLICY_BI_LABELS,\n BOLT_POLICY_MP_LABELS,\n BOLT_POLICY_PD_LABELS,\n BOLT_POLICY_PIP_LABELS,\n BOLT_POLICY_UM_LABELS,\n BOLT_POLICY_UMPD_LABELS,\n BOLT_VEHICLE_COMP_COLL_DEDUCTIBLE_LABELS,\n BOLT_VEHICLE_TOWING_AND_LABOR_LABELS,\n BOLT_VEHICLE_TRANSPORTATION_EXPENSE_LABELS,\n BOLT_DRIVER_EDUCATION_LEVEL_LABELS,\n BOLT_DRIVER_INDUSTRY_LABELS,\n BOLT_HOME_PRIOR_CARRIER_LABELS,\n BOLT_NO_PRIOR_AUTO_INSURANCE_REASON_LABELS,\n BOLT_PRIOR_LIABILITY_LIMIT_LABELS,\n BOLT_TYPE_OF_RESIDENCE_LABELS,\n BOLT_VEHICLE_PRIMARY_USE_LABELS\n} from '../config/bolt-policy-option-labels';\nimport { BOLT_VEHICLE_MAKE_OPTIONS, getVehicleBodyStyleOptions, getVehicleModelOptions } from '../config/bolt-vehicle-option-chains';\nimport { BOLT_DRIVER_OCCUPATION_LABELS_FROM_BOLT, BOLT_DRIVER_OCCUPATIONS_BY_INDUSTRY } from '../config/bolt-driver-occupation-map';\n\n/* ------------------------------------------------------------------ */\n/* Human-readable display labels for raw API/DB option values */\n/* ------------------------------------------------------------------ */\n\n/**\n * Maps raw DB/API option values to user-friendly display labels for select inputs.\n * Any value NOT in this map falls back to the raw value itself.\n */\nconst OPTION_DISPLAY_LABELS: Record<string, string> = {\n // Prior liability limit (ZywavePriorLiabilityLimit format → readable label)\n None: 'None',\n '30000/60000/25000': '30/60k',\n '30000/60000/30000': '30/60k',\n '50000/100000/30000': '50/100k',\n '50000/100000/50000': '50/100k',\n '100000/300000/50000': '100/300k',\n '100000/300000/100000': '100/300k',\n '250000/500000/100000': '250/500k',\n '250000/500000/250000': '250/500k',\n '300000/500000/250000': '300/500k',\n '300000/500000/300000': '300/500k',\n '500000/500000/300000': '500k CSL',\n '500000/500000/500000': '500k CSL',\n '500000/1000000/300000': '500k/1M',\n '500000/1000000/500000': '500k/1M'\n};\n\nconst OPTION_DISPLAY_LABELS_BY_KEY: Record<string, Record<string, string>> = {\n auto_prior_carrier_name: BOLT_AUTO_PRIOR_CARRIER_LABELS,\n auto_prior_liability_limit: BOLT_PRIOR_LIABILITY_LIMIT_LABELS,\n auto_reason_for_no_insurance: BOLT_NO_PRIOR_AUTO_INSURANCE_REASON_LABELS,\n residence_type: BOLT_TYPE_OF_RESIDENCE_LABELS,\n home_prior_carrier_name: BOLT_HOME_PRIOR_CARRIER_LABELS,\n policy_bi: BOLT_POLICY_BI_LABELS,\n policy_um: BOLT_POLICY_UM_LABELS,\n policy_pd: BOLT_POLICY_PD_LABELS,\n policy_mp: BOLT_POLICY_MP_LABELS,\n policy_umpd: BOLT_POLICY_UMPD_LABELS,\n policy_pip: BOLT_POLICY_PIP_LABELS,\n policy_auto_death_indemnity: BOLT_POLICY_AUTO_DEATH_INDEMNITY_LABELS,\n vehicle_comp_deductible: BOLT_VEHICLE_COMP_COLL_DEDUCTIBLE_LABELS,\n vehicle_coll_deductible: BOLT_VEHICLE_COMP_COLL_DEDUCTIBLE_LABELS,\n vehicle_towing_and_labor: BOLT_VEHICLE_TOWING_AND_LABOR_LABELS,\n vehicle_transportation_expense: BOLT_VEHICLE_TRANSPORTATION_EXPENSE_LABELS,\n education_level: BOLT_DRIVER_EDUCATION_LEVEL_LABELS,\n industry: BOLT_DRIVER_INDUSTRY_LABELS,\n occupation: BOLT_DRIVER_OCCUPATION_LABELS_FROM_BOLT as Record<string, string>,\n usage: BOLT_VEHICLE_PRIMARY_USE_LABELS\n};\n\nconst VEHICLE_MODEL_FALLBACK_OPTIONS = ['OTHER / NOT LISTED'] as const;\nconst VEHICLE_BODY_STYLE_FALLBACK_OPTIONS = ['SEDAN', 'SUV', 'COUPE', 'HATCHBACK', 'PICKUP', 'VAN', 'WAGON', 'OTHER'] as const;\nconst DRIVER_OCCUPATION_FALLBACK_OPTIONS = ['Other'] as const;\n\nfunction toDateInputValue(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nfunction coerceDigitsOnlyNumber(raw: string): number | undefined {\n const digitsOnly = raw.replace(/\\D+/g, '');\n if (digitsOnly === '') return undefined;\n return coerceNumber(digitsOnly);\n}\n\nfunction isDisallowedNumberKey(key: string): boolean {\n return key === '-' || key === '+' || key === '.' || key === 'e' || key === 'E';\n}\n\nfunction getDateInputMinByKey(key: string): string | undefined {\n if (key !== 'effective_date') return undefined;\n\n // \"Future dates only\" => tomorrow and onward.\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return toDateInputValue(tomorrow);\n}\n\n/* ------------------------------------------------------------------ */\n/* Conditional evaluation utilities */\n/* ------------------------------------------------------------------ */\n\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction isImplicitYesRepeatableQuestion(q: Question): boolean {\n if (q.inputType !== 'radio') return false;\n if (!q.options || q.options.length !== 1 || q.options[0] !== 'Yes') return false;\n const conds = q.conditionals ?? [];\n return conds.some((c) => c.conditionalQuestionsAllowMultiple && c.conditionalType === 'equals' && c.conditionalValue === 'Yes');\n}\n\nfunction getEffectiveQuestionValue(q: Question, value: unknown): unknown {\n if (isImplicitYesRepeatableQuestion(q)) return 'Yes';\n return value;\n}\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(qValue: unknown, conditionalType: ConditionalNode['conditionalType'], conditionalValue: unknown): boolean {\n switch (conditionalType) {\n case 'equals':\n return qValue === conditionalValue;\n case 'lessThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(qValue, conditionalValue);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(qValue, conditionalValue);\n case 'startsWith':\n return qValue != null && conditionalValue != null && String(qValue).startsWith(String(conditionalValue));\n case 'endsWith':\n return qValue != null && conditionalValue != null && String(qValue).endsWith(String(conditionalValue));\n default:\n return false;\n }\n}\n\n/* ------------------------------------------------------------------ */\n/* Path helpers (immutable) */\n/* ------------------------------------------------------------------ */\n\ntype ScopePath = Array<string | number>;\n\nfunction getIn(obj: unknown, path: ScopePath): unknown {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return path.reduce((acc: any, key) => (acc == null ? undefined : acc[key]), obj as any);\n}\nfunction setInImmutable<T extends object>(obj: T, path: ScopePath, value: unknown): T {\n if (path.length === 0) return obj;\n const [head, ...tail] = path;\n\n if (tail.length === 0) {\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = value;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: value } as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const current = (obj as any)?.[head];\n const nextContainer = typeof tail[0] === 'number' ? (Array.isArray(current) ? current : []) : current && typeof current === 'object' ? current : {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const next = setInImmutable(nextContainer as any, tail, value);\n\n if (typeof head === 'number') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const base = Array.isArray(obj) ? (obj as any[]) : [];\n const arr = base.slice();\n arr[head] = next;\n return arr as unknown as T;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...(obj as any), [head]: next } as T;\n}\n\n/** Read from a values object using a base scope plus a local key */\nfunction scopedRead(values: FormValues, scope: ScopePath | undefined, key: string) {\n return getIn(values, [...(scope ?? []), key]);\n}\n/** Write immutably to values at scope+key */\nfunction scopedWrite(values: FormValues, scope: ScopePath | undefined, key: string, v: unknown): FormValues {\n return setInImmutable(values, [...(scope ?? []), key], v);\n}\n\n/** Stable DOM id for nested repeatables (avoids duplicate id=\"make\" / id=\"model\"). */\nfunction scopedFieldId(scopePath: ScopePath | undefined, key: string): string {\n if (!scopePath?.length) return key;\n return `${scopePath.join('-')}-${key}`;\n}\n\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\n/* ------------------------------------------------------------------ */\n/* Key decoration (stable keys) */\n/* ------------------------------------------------------------------ */\n\nfunction decorateKeys(questions: Question[]): Question[] {\n const walk = (list: Question[], pathParts: string[]): Question[] =>\n list.map((q, qi) => {\n const parentPart = pathParts.length ? pathParts.join('__') : 'root';\n const baseKey = (q.key as string) ?? `${parentPart}__q${qi}_${String(q.question).slice(0, 24).replace(/\\W+/g, '-') || 'field'}`;\n\n const conds: readonly ConditionalNode[] = q.conditionals ?? [];\n const nextConds = conds.map((c, ci) => {\n const nested = c.conditionalQuestions\n ? walk(c.conditionalQuestions as unknown as Question[], [...pathParts, `${baseKey}__c${ci}`])\n : undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...c, conditionalQuestions: nested as any };\n });\n\n return { ...q, key: baseKey, conditionals: nextConds };\n });\n\n return walk(questions, []);\n}\n\n/** Coerce any unknown to a safe text input value */\nfunction asTextValue(v: unknown): string {\n if (v == null) return '';\n return typeof v === 'string' ? v : String(v);\n}\n\n/** Coerce to a number-control-safe value */\nfunction asNumberValue(v: unknown): string | number {\n if (v == null) return '';\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (typeof v === 'string') return v; // let the user type partial numbers like \"-\"\n return '';\n}\n\n/** Coerce to a select value (string/number/undefined) */\nfunction asSelectValue(v: unknown): string | number {\n if (v == null) return ''; // <-- force empty string, not undefined\n if (typeof v === 'string' || typeof v === 'number') return v;\n return String(v);\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function FormRenderer({\n questions,\n initialValues,\n controlledValues,\n onChangeValues,\n onSubmit\n}: {\n questions: Question[];\n initialValues?: Partial<FormValues>;\n controlledValues?: FormValues;\n onChangeValues?: (values: FormValues) => void;\n onSubmit: (values: FormValues) => void; // called on Enter key\n}) {\n const keyedQuestions = useMemo(() => decorateKeys(questions), [questions]);\n const autoCoverageKeys = useMemo(() => resolveAutoCoverageConditionKeys(keyedQuestions), [keyedQuestions]);\n\n const initialUncontrolled: FormValues = useMemo(() => {\n const acc: FormValues = {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (initialValues) Object.assign(acc, initialValues as any);\n return acc;\n }, [initialValues]);\n\n const [uncontrolled, setUncontrolled] = useState<FormValues>(initialUncontrolled);\n useEffect(() => {\n setUncontrolled(initialUncontrolled);\n }, [initialUncontrolled]);\n\n // HYBRID CONTROLLED SUPPORT\n const [localShadow, setLocalShadow] = useState<FormValues>({});\n const values: FormValues = useMemo(\n () => ({ ...localShadow, ...(controlledValues ?? uncontrolled) }),\n [localShadow, controlledValues, uncontrolled]\n );\n useEffect(() => {\n if (controlledValues) setLocalShadow((p) => ({ ...p, ...controlledValues }));\n }, [controlledValues]);\n\n const [errors, setErrors] = useState<Record<string, string | undefined>>({});\n\n useEffect(() => {\n let nextAll = values;\n let changed = false;\n\n keyedQuestions.forEach((q) => {\n if (!isImplicitYesRepeatableQuestion(q)) return;\n const key = String(q.key);\n const current = scopedRead(nextAll, undefined, key);\n if (current === 'Yes') return;\n nextAll = scopedWrite(nextAll, undefined, key, 'Yes');\n changed = true;\n });\n\n if (!changed) return;\n if (controlledValues && onChangeValues) onChangeValues(nextAll);\n else setUncontrolled(nextAll);\n setLocalShadow(nextAll);\n }, [keyedQuestions, values, controlledValues, onChangeValues]);\n\n // single field renderer (aware of scope)\n function renderOne(q: Question, scopePath?: ScopePath) {\n const key = q.key as string;\n\n // Hide \"relationship to Driver #1\" for the first driver (index 0)\n if (key === 'relationship_to_insured' && scopePath) {\n const itemIdx = scopePath[scopePath.length - 1];\n if (typeof itemIdx === 'number' && itemIdx === 0) return null;\n }\n\n const label = q.question;\n const val = scopedRead(values, scopePath, key);\n const required = isNoInsuranceReasonQuestion(q, autoCoverageKeys) ? shouldRequireNoInsuranceReason(values, autoCoverageKeys) : q.required;\n const error = errors[key];\n\n const set = (v: unknown) => {\n let nextAll = scopedWrite(values, scopePath, key, v);\n\n // If this is a radio button with conditionals, check if any array items need to be cleared\n if (q.inputType === 'radio' && q.conditionals) {\n const conds = q.conditionals ?? [];\n\n // Check each conditional to see if it will become false\n for (const cond of conds) {\n const currentValue = scopedRead(values, scopePath, key);\n const wasActive = evalConditional(currentValue, cond.conditionalType, cond.conditionalValue);\n const willBeActive = evalConditional(v, cond.conditionalType, cond.conditionalValue);\n\n // If this conditional was active but will become inactive, and it has repeatable questions, clear the array\n if (wasActive && !willBeActive && cond.conditionalQuestionsAllowMultiple) {\n const children = (cond.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n const arrStorageKey = itemsKey(key);\n\n nextAll = setInImmutable(nextAll, [...(scopePath ?? []), arrStorageKey], []);\n\n // Also clear any nested array items that might exist\n const clearNestedArrays = (questionList: Question[], currentScope: ScopePath) => {\n questionList.forEach((childQ) => {\n const childConds = childQ.conditionals ?? [];\n childConds.forEach((childCond) => {\n if (childCond.conditionalQuestionsAllowMultiple) {\n const nestedArrKey = itemsKey(childQ.key as string);\n nextAll = setInImmutable(nextAll, [...currentScope, nestedArrKey], []);\n }\n const grandChildren = (childCond.conditionalQuestions ?? []) as unknown as Question[];\n if (grandChildren.length > 0) {\n clearNestedArrays(grandChildren, currentScope);\n }\n });\n });\n };\n\n clearNestedArrays(children, [...(scopePath ?? []), arrStorageKey]);\n }\n }\n }\n }\n\n if (controlledValues && onChangeValues) onChangeValues(nextAll);\n else setUncontrolled(nextAll);\n setLocalShadow(nextAll);\n };\n\n if (key === 'driver_vehicle_assignments') {\n const vehicles = (values.vehicles__items ?? []) as Array<Record<string, unknown>>;\n const drivers = (values.drivers__items ?? []) as Array<Record<string, unknown>>;\n\n if (vehicles.length === 0 || drivers.length === 0) {\n return (\n <p key={key} style={{ color: '#666', fontStyle: 'italic' }}>\n Add vehicles and drivers first to configure driver usage percentages.\n </p>\n );\n }\n\n const assignments = (values.driver_vehicle_assignments ?? {}) as Record<string, Record<string, number>>;\n\n const updateAssignment = (vIdx: number, dIdx: number, pct: number) => {\n const prev = { ...assignments };\n const vKey = `v${vIdx}`;\n prev[vKey] = { ...(prev[vKey] ?? {}) };\n prev[vKey][`d${dIdx}`] = pct;\n set(prev);\n };\n\n const getVehicleValidationError = (vIdx: number): string | null => {\n if (drivers.length < 2) return null;\n const vAssignments = assignments[`v${vIdx}`];\n if (!vAssignments) return null;\n // cspell:ignore pcts\n const pcts = drivers.map((_, dIdx) => vAssignments[`d${dIdx}`] ?? 0);\n const nonZero = pcts.filter((p) => p > 0);\n if (nonZero.length >= 2 && nonZero.every((p) => p === nonZero[0]) && nonZero[0] === 50) {\n return `Assignments for Vehicle ${vIdx + 1} cannot be 50 percent for both Drivers.`;\n }\n const total = pcts.reduce((a, b) => a + b, 0);\n if (total > 0 && total !== 100) {\n return `Driver percentages for this vehicle must add up to 100% (currently ${total}%).`;\n }\n return null;\n };\n\n return (\n <div key={key}>\n <h4 style={{ marginBottom: '12px' }}>{label}</h4>\n {vehicles.map((v, vIdx) => {\n const vLabel = [v.year, v.make, v.model].filter(Boolean).join(' ') || `Vehicle ${vIdx + 1}`;\n const validationError = getVehicleValidationError(vIdx);\n return (\n <fieldset\n key={vIdx}\n style={{ border: `1px solid ${validationError ? '#dc3545' : '#ddd'}`, borderRadius: '8px', padding: '16px', marginBottom: '16px' }}\n >\n <legend style={{ fontWeight: 600, padding: '0 8px' }}>{vLabel}</legend>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '12px' }}>\n {drivers.map((d, dIdx) => {\n const dLabel = [d.first_name, d.last_name].filter(Boolean).join(' ') || `Driver ${dIdx + 1}`;\n const pctVal = assignments[`v${vIdx}`]?.[`d${dIdx}`];\n return (\n <div key={`${vIdx}-${dIdx}`} style={{ flex: '0 0 140px' }}>\n <NumericInput\n id={`assignment-v${vIdx}-d${dIdx}`}\n label={`${dLabel} %`}\n value={pctVal ?? ''}\n min={0}\n max={100}\n step={1}\n inputMode=\"numeric\"\n onChange={(e) => {\n const raw = e.currentTarget.value.replace(/\\D+/g, '');\n updateAssignment(vIdx, dIdx, raw === '' ? 0 : Math.min(100, parseInt(raw, 10)));\n }}\n />\n </div>\n );\n })}\n </div>\n {validationError && <p style={{ color: '#dc3545', fontSize: '0.85rem', marginTop: '8px', marginBottom: 0 }}>{validationError}</p>}\n </fieldset>\n );\n })}\n </div>\n );\n }\n\n switch (q.inputType) {\n case 'text':\n return (\n <TextInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={error}\n />\n );\n case 'email':\n return (\n <EmailInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={error}\n />\n );\n case 'password':\n return (\n <PasswordInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={error}\n />\n );\n case 'tel':\n return (\n <>\n <TelInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={error}\n />\n {key === 'phone' && (\n <div className=\"mt-3 text-xs text-slate-600 space-y-1\">\n <p>By entering your phone number, you agree to receive a one-time SMS from Credify Insurance with a verification code.</p>\n <p>Message & data rates may apply. One message per request.</p>\n {/* <p>Reply STOP to opt out, HELP for help.</p> */}\n <p>\n See our{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Privacy Policy\n </a>{' '}\n and{' '}\n <a href=\"https://getcredify.com\" target=\"_blank\" rel=\"noopener noreferrer\" className=\"credify-link-underline\">\n Terms of Service\n </a>\n .\n </p>\n </div>\n )}\n </>\n );\n case 'url':\n return (\n <UrlInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={error}\n />\n );\n case 'number':\n return (\n <NumericInput\n key={key}\n id={key}\n label={label}\n value={asNumberValue(val)}\n min={0}\n step={1}\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n onKeyDown={(e) => {\n if (isDisallowedNumberKey(e.key)) {\n e.preventDefault();\n }\n }}\n onChange={(e) => set(coerceDigitsOnlyNumber(e.currentTarget.value))}\n aria-required={required || undefined}\n error={error}\n />\n );\n case 'textarea':\n return (\n <TextArea\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={error}\n rows={4}\n />\n );\n case 'date': {\n let dateMin = getDateInputMinByKey(key);\n let dateError = error;\n if (key === 'date_first_licensed' && scopePath) {\n const dob = scopedRead(values, scopePath, 'date_of_birth');\n if (typeof dob === 'string' && dob) {\n const dobDate = new Date(dob);\n if (!isNaN(dobDate.getTime())) {\n const min16 = new Date(dobDate);\n min16.setFullYear(min16.getFullYear() + 16);\n dateMin = toDateInputValue(min16);\n if (typeof val === 'string' && val) {\n const licDate = new Date(val);\n if (!isNaN(licDate.getTime()) && licDate < min16) {\n dateError = 'Driver must be at least 16 years old at the date first licensed';\n }\n }\n }\n }\n }\n return (\n <DateInput\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n min={dateMin}\n onChange={(e) => set(e.currentTarget.value)}\n aria-required={required || undefined}\n error={dateError}\n />\n );\n }\n\n case 'checkbox': {\n if (q.options) {\n const current: string[] = Array.isArray(val) ? (val as string[]) : [];\n return (\n <div key={key} className=\"space-y-2\">\n <div className=\"form-label\">\n {label}\n {required && <span className=\"text-red-600 ml-1\">*</span>}\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {q.options.map((opt) => {\n const idOpt = `${key}-${slugify(opt)}`;\n const checked = current.includes(opt);\n return (\n <Checkbox\n key={idOpt}\n id={idOpt}\n label={opt}\n checked={checked}\n onChange={(e) => {\n const next = new Set(current);\n if (e.currentTarget.checked) next.add(opt);\n else next.delete(opt);\n set(Array.from(next));\n }}\n aria-required={required || undefined}\n />\n );\n })}\n </div>\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\n </div>\n );\n }\n return (\n <Checkbox\n key={key}\n id={key}\n label={required ? `${label} *` : label}\n checked={!!val}\n onChange={(e) => set(e.currentTarget.checked)}\n aria-required={required || undefined}\n />\n );\n }\n\n case 'radio': {\n if (isImplicitYesRepeatableQuestion(q)) {\n return null;\n }\n const opts = q.options ?? [];\n // Create a scoped name to avoid conflicts between array items\n const scopedName = scopePath && scopePath.length > 0 ? `${key}__${scopePath.join('__')}` : key;\n return (\n <RadioGroup key={key} legend={label} legendClassName={required ? 'legend-required' : undefined}>\n {opts.map((opt) => (\n <Radio key={`${key}-${slugify(opt)}`} name={scopedName} value={opt} checked={val === opt} onChange={() => set(opt)}>\n {opt}\n </Radio>\n ))}\n </RadioGroup>\n );\n }\n\n case 'select': {\n let opts = q.options ?? [];\n // Add special case for `quote_vehicle_id` key\n if (key === 'quote_vehicle_id') {\n opts = controlledValues?.vehicles__items?.map((v: { vin: string }) => v.vin) ?? [];\n }\n if (key === 'make') {\n opts = [...BOLT_VEHICLE_MAKE_OPTIONS];\n }\n if (key === 'model') {\n const selectedYear = scopedRead(values, scopePath, 'year');\n const selectedMake = scopedRead(values, scopePath, 'make');\n opts = getVehicleModelOptions(selectedYear, selectedMake);\n if (opts.length === 0) {\n opts = [...VEHICLE_MODEL_FALLBACK_OPTIONS];\n }\n if (typeof val === 'string' && val && !opts.includes(val)) opts = [val, ...opts];\n }\n if (key === 'body_style') {\n const selectedYear = scopedRead(values, scopePath, 'year');\n const selectedMake = scopedRead(values, scopePath, 'make');\n const selectedModel = scopedRead(values, scopePath, 'model');\n opts = getVehicleBodyStyleOptions(selectedYear, selectedMake, selectedModel);\n if (opts.length === 0) {\n opts = [...VEHICLE_BODY_STYLE_FALLBACK_OPTIONS];\n }\n if (typeof val === 'string' && val && !opts.includes(val)) opts = [val, ...opts];\n }\n if (key === 'occupation') {\n const selectedIndustry = String(normalizeDriverIndustryValue(scopedRead(values, scopePath, 'industry')) ?? '').trim();\n opts = [\n ...((BOLT_DRIVER_OCCUPATIONS_BY_INDUSTRY as Record<string, readonly string[]>)[selectedIndustry] ?? DRIVER_OCCUPATION_FALLBACK_OPTIONS)\n ];\n if (typeof val === 'string' && val && !opts.includes(val)) opts = [val, ...opts];\n }\n\n const fieldId = scopedFieldId(scopePath, key);\n\n return (\n <SelectInput\n key={fieldId}\n id={fieldId}\n label={label}\n aria-required={required || undefined}\n error={error}\n value={asSelectValue(val)}\n onChange={(e) => {\n const nextValue = e.currentTarget.value;\n\n if (key !== 'year' && key !== 'make' && key !== 'model' && key !== 'industry') {\n set(nextValue);\n return;\n }\n\n let nextAll = scopedWrite(values, scopePath, key, nextValue);\n if (key === 'year') {\n nextAll = scopedWrite(nextAll, scopePath, 'make', '');\n nextAll = scopedWrite(nextAll, scopePath, 'model', '');\n nextAll = scopedWrite(nextAll, scopePath, 'body_style', '');\n } else if (key === 'make') {\n nextAll = scopedWrite(nextAll, scopePath, 'model', '');\n nextAll = scopedWrite(nextAll, scopePath, 'body_style', '');\n } else if (key === 'model') {\n nextAll = scopedWrite(nextAll, scopePath, 'body_style', '');\n } else if (key === 'industry') {\n nextAll = scopedWrite(nextAll, scopePath, 'occupation', '');\n }\n\n if (controlledValues && onChangeValues) onChangeValues(nextAll);\n else setUncontrolled(nextAll);\n setLocalShadow(nextAll);\n }}\n placeholder=\"Select an option\"\n options={opts.map((o) => ({\n value: o,\n label: OPTION_DISPLAY_LABELS_BY_KEY[key]?.[o] ?? OPTION_DISPLAY_LABELS[o] ?? o\n }))}\n />\n );\n }\n\n case 'address':\n return (\n <AddressAutocomplete\n key={key}\n id={key}\n label={label}\n value={asTextValue(val)}\n onChange={(address) => set(address)}\n aria-required={required || undefined}\n error={error}\n />\n );\n\n default:\n return null;\n }\n }\n\n function renderRecursive(list: Question[], scopePath?: ScopePath) {\n return list.map((q, qIndex) => {\n const key = String(q.key);\n if (!shouldShowNoInsuranceReason(q, values, autoCoverageKeys)) return null;\n const elem = renderOne(q, scopePath);\n\n const conds = q.conditionals ?? [];\n if (!conds.length) return <div key={`wrap-${key}-${qIndex}`}>{elem}</div>;\n\n const v = getEffectiveQuestionValue(q, scopedRead(values, scopePath, key));\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n return (\n <div key={`wrap-${key}-${qIndex}`}>\n {elem}\n\n {branches.map((branch, bi) => {\n const children = (branch.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return null;\n\n // NON-REPEATABLE child branch at current scope\n if (!branch.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n {renderRecursive(children, scopePath)}\n </div>\n );\n }\n\n // REPEATABLE child branch at current scope\n const arrStorageKey = itemsKey(key);\n const arr: unknown[] = (getIn(values, [...(scopePath ?? []), arrStorageKey]) as unknown[]) ?? [];\n const count = Math.max(1, arr.length || 1);\n\n const pushEmpty = () => {\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey, arr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const popLast = () => {\n const nextArr = arr.slice(0, Math.max(0, arr.length - 1));\n const next = setInImmutable(values, [...(scopePath ?? []), arrStorageKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n const groupIdBase = `${key}__c${bi}`;\n\n return (\n <div key={`branch-${key}-${bi}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={pushEmpty}>\n Add another\n </button>\n {count > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={popLast}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: count }).map((_, idx) => {\n const itemScope: ScopePath = [...(scopePath ?? []), arrStorageKey, idx];\n const groupId = `${groupIdBase}__i${idx}`;\n const itemValues = (arr[idx] ?? {}) as FormValues;\n const isDriverGroup = key === 'drivers';\n const entryLabel = isDriverGroup ? `Driver #${idx + 1}` : `Entry #${idx + 1}`;\n const hasSsnDisplay = isDriverGroup && typeof itemValues.ssn_display === 'string' && itemValues.ssn_display;\n const ssnSuffix = hasSsnDisplay ? ` — ${itemValues.ssn_display}` : '';\n\n return (\n <div key={`group-${groupId}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">\n {entryLabel}\n {ssnSuffix}\n </div>\n\n {children.map((childQ) => (\n <div key={`${groupId}-${String(childQ.key)}`} className=\"mt-3\">\n {renderOne(childQ, itemScope)}\n\n {/* Nested conditionals under childQ (supports nested repeatables too) */}\n {(() => {\n const childConds = childQ.conditionals ?? [];\n if (!childConds.length) return null;\n\n const childVal = scopedRead(values, itemScope, childQ.key as string);\n const childMatches = childConds.filter((c) => evalConditional(childVal, c.conditionalType, c.conditionalValue));\n const childBranches =\n childMatches.length > 1 && !childMatches.some((m) => m.conditionalQuestionsAllowMultiple)\n ? childMatches.slice(0, 1)\n : childMatches;\n\n return childBranches.map((bc, bci) => {\n const grandChildren = (bc.conditionalQuestions ?? []) as unknown as Question[];\n if (!grandChildren.length) return null;\n\n // NON-REPEATABLE nested branch: same item scope\n if (!bc.conditionalQuestionsAllowMultiple) {\n return (\n <div key={`nested-${groupId}-${bci}`} className=\"mt-3\">\n {renderRecursive(grandChildren, itemScope)}\n </div>\n );\n }\n\n // REPEATABLE nested branch: store under <itemScope> + itemsKey(childQ.key)\n const nestedArrKey = itemsKey(childQ.key as string);\n const nestedArr: unknown[] = (getIn(values, [...itemScope, nestedArrKey]) as unknown[]) ?? [];\n const nestedCount = Math.max(1, nestedArr.length || 1);\n\n const nestedPush = () => {\n const next = setInImmutable(values, [...itemScope, nestedArrKey, nestedArr.length], {});\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n const nestedPop = () => {\n const nextArr = nestedArr.slice(0, Math.max(0, nestedArr.length - 1));\n const next = setInImmutable(values, [...itemScope, nestedArrKey], nextArr);\n if (controlledValues && onChangeValues) onChangeValues(next);\n else setUncontrolled(next);\n setLocalShadow(next);\n };\n\n return (\n <div key={`nested-repeat-${groupId}-${bci}`} className=\"mt-3\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-sm font-medium opacity-75\">Add one or more entries</div>\n <div className=\"space-x-2\">\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPush}>\n Add another\n </button>\n {nestedCount > 1 && (\n <button type=\"button\" className=\"btn-outline px-3 py-1\" onClick={nestedPop}>\n Remove last\n </button>\n )}\n </div>\n </div>\n\n {Array.from({ length: nestedCount }).map((__, nIdx) => {\n const nestedScope: ScopePath = [...itemScope, nestedArrKey, nIdx];\n return (\n <div key={`nested-item-${groupId}-${bci}-${nIdx}`} className=\"rounded-lg border p-3 mb-3\">\n <div className=\"text-sm font-semibold mb-2\">Entry #{nIdx + 1}</div>\n {renderRecursive(grandChildren, nestedScope)}\n </div>\n );\n })}\n </div>\n );\n });\n })()}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n );\n });\n }\n\n // Visible (non-repeatable) only — used for Enter-to-continue validation feedback\n const visibleFlat = useMemo(() => {\n const out: Question[] = [];\n const walk = (list: Question[], scopePath?: ScopePath) => {\n list.forEach((q) => {\n if (!shouldShowNoInsuranceReason(q, values, autoCoverageKeys)) return;\n if (!isImplicitYesRepeatableQuestion(q)) {\n out.push(q);\n }\n const key = String(q.key);\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const v = getEffectiveQuestionValue(q, scopedRead(values, scopePath, key));\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // item-level handled on wizard side\n walk(children, scopePath);\n });\n });\n };\n walk(keyedQuestions);\n return out;\n }, [keyedQuestions, values, autoCoverageKeys]);\n\n function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n const dynamicRequired = shouldRequireNoInsuranceReason(values, autoCoverageKeys);\n const validationQuestions = visibleFlat.map((q) => (isNoInsuranceReasonQuestion(q, autoCoverageKeys) ? { ...q, required: dynamicRequired } : q));\n const eMap = validateQuestions(validationQuestions as Question[], values);\n setErrors(eMap);\n\n if (Object.keys(eMap).length > 0) {\n const firstIdx = visibleFlat.findIndex((q) => eMap[q.key as string]);\n if (firstIdx >= 0) document.getElementById(visibleFlat[firstIdx].key as string)?.focus();\n return;\n }\n onSubmit(values);\n }\n\n return (\n <form className=\"space-y-6 px-1\" onSubmit={handleSubmit} noValidate>\n {renderRecursive(keyedQuestions)}\n </form>\n );\n}\n\nexport default FormRenderer;\n","/**\n * Google Tag Manager dataLayer helpers for the Credify Insurance Widget.\n * Pushes events at each step so GTM can trigger tags (e.g. GTM-NK8LGHTQ).\n */\n\nexport const GTM_CONTAINER_ID = 'GTM-NK8LGHTQ';\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n if (typeof window === 'undefined') return [];\n window.dataLayer = window.dataLayer ?? [];\n return window.dataLayer;\n}\n\nexport function pushDataLayerEvent(eventName: string, payload: Record<string, unknown> = {}): void {\n const dataLayer = getDataLayer();\n dataLayer.push({\n event: eventName,\n credifyWidget: {\n ...payload,\n containerId: GTM_CONTAINER_ID\n }\n });\n}\n\n/** Widget was opened */\nexport function pushWidgetOpened(): void {\n pushDataLayerEvent('credify_widget_opened');\n}\n\n/** Widget was closed */\nexport function pushWidgetClosed(): void {\n pushDataLayerEvent('credify_widget_closed');\n}\n\n/** User viewed a form stage (step) */\nexport function pushStageViewed(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_viewed', payload);\n}\n\n/** User completed a form stage (clicked Next successfully) */\nexport function pushStageCompleted(payload: { stageKey: string; stageTitle: string; stepIndex: number; totalSteps: number }): void {\n pushDataLayerEvent('credify_widget_stage_completed', payload);\n}\n\n/** User completed all stages and rates were requested */\nexport function pushFlowCompleted(): void {\n pushDataLayerEvent('credify_widget_flow_completed');\n}\n\n/** User is viewing the rates screen */\nexport function pushRatesViewed(payload?: { rateCount?: number }): void {\n pushDataLayerEvent('credify_widget_rates_viewed', payload ?? {});\n}\n\n/** User clicked Back from the rates screen */\nexport function pushRatesBack(): void {\n pushDataLayerEvent('credify_widget_rates_back');\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { Question } from '@getcredify/credify-insurance-types';\n\nimport { FormRenderer } from './index';\n\nimport { ensureKey, validateQuestions, type StageMeta, type FormValues } from '../utils/form';\nimport {\n resolveAutoCoverageConditionKeys,\n shouldRequireNoInsuranceReason,\n shouldShowNoInsuranceReason,\n isNoInsuranceReasonQuestion\n} from '../utils/autoCoverageCondition';\nimport { pushStageViewed } from '../utils/gtm';\n\n/* ---------- conditional helpers (mirrors renderer) ---------- */\ntype ConditionalNode = NonNullable<Question['conditionals']>[number];\n\nfunction isImplicitYesRepeatableQuestion(q: Question): boolean {\n if (q.inputType !== 'radio') return false;\n if (!q.options || q.options.length !== 1 || q.options[0] !== 'Yes') return false;\n const conds = q.conditionals ?? [];\n return conds.some((c) => c.conditionalQuestionsAllowMultiple && c.conditionalType === 'equals' && c.conditionalValue === 'Yes');\n}\n\nfunction getEffectiveQuestionValue(q: Question, value: unknown): unknown {\n if (isImplicitYesRepeatableQuestion(q)) return 'Yes';\n return value;\n}\n\nfunction toNumber(x: unknown): number | null {\n if (typeof x === 'number' && Number.isFinite(x)) return x;\n if (typeof x === 'string' && x.trim() !== '' && !Number.isNaN(Number(x))) return Number(x);\n return null;\n}\nfunction toTime(x: unknown): number | null {\n if (x instanceof Date && !Number.isNaN(x.getTime())) return x.getTime();\n if (typeof x === 'string') {\n const t = Date.parse(x);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\nfunction cmp(a: unknown, b: unknown): number | null {\n const na = toNumber(a),\n nb = toNumber(b);\n if (na != null && nb != null) return na - nb;\n const ta = toTime(a),\n tb = toTime(b);\n if (ta != null && tb != null) return ta - tb;\n if (a == null || b == null) return null;\n return String(a).localeCompare(String(b));\n}\nfunction contains(haystack: unknown, needle: unknown): boolean {\n if (Array.isArray(haystack)) return haystack.some((v) => v === needle);\n if (typeof haystack === 'string') return needle != null && haystack.includes(String(needle));\n return false;\n}\nfunction evalConditional(v: unknown, type: ConditionalNode['conditionalType'], rhs: unknown): boolean {\n switch (type) {\n case 'equals':\n return v === rhs;\n case 'lessThan': {\n const c = cmp(v, rhs);\n return c != null && c < 0;\n }\n case 'greaterThan': {\n const c = cmp(v, rhs);\n return c != null && c > 0;\n }\n case 'contains':\n return contains(v, rhs);\n case 'startsWith':\n return v != null && rhs != null && String(v).startsWith(String(rhs));\n case 'endsWith':\n return v != null && rhs != null && String(v).endsWith(String(rhs));\n default:\n return false;\n }\n}\n\n/* ---------- visibility (non-repeatable) ---------- */\nfunction flattenVisibleQuestions(root: ReadonlyArray<Question>, values: FormValues): ReadonlyArray<Question> {\n const autoCoverageKeys = resolveAutoCoverageConditionKeys(root as Question[]);\n const out: Question[] = [];\n const walk = (list: ReadonlyArray<Question>) => {\n list.forEach((q) => {\n if (!shouldShowNoInsuranceReason(q, values, autoCoverageKeys)) return;\n if (!isImplicitYesRepeatableQuestion(q)) {\n out.push(q);\n }\n const key = String(q.key);\n const v = getEffectiveQuestionValue(q, values[key]);\n const conds = q.conditionals ?? [];\n if (!conds.length) return;\n\n const matches = conds.filter((c) => evalConditional(v, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n branches.forEach((m) => {\n const children = (m.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) return;\n if (m.conditionalQuestionsAllowMultiple) return; // handled per-item below\n children.forEach((child) => out.push(child));\n });\n });\n };\n walk(root);\n return out;\n}\n\n/* ---------- repeatable validation (any depth) ---------- */\nconst ITEMS_SUFFIX = '__items';\nconst itemsKey = (k: string) => `${k}${ITEMS_SUFFIX}`;\n\ntype ScopePath = Array<string | number>;\n\nfunction shouldSkipRequiredValidation(q: Question, scopePath: ScopePath): boolean {\n // Keep repeatable required validation aligned with renderer visibility rules.\n if (q.key === 'relationship_to_insured') {\n const itemIdx = scopePath[scopePath.length - 1];\n return typeof itemIdx === 'number' && itemIdx === 0;\n }\n return false;\n}\n\nfunction validateRepeatablesRecursive(questions: ReadonlyArray<Question>, valuesAtScope: FormValues, scopePath: ScopePath = []): boolean {\n // returns true if any blocking error exists\n for (const q of questions) {\n const qKey = String(q.key);\n const qVal = getEffectiveQuestionValue(q, valuesAtScope[qKey]);\n const conds = q.conditionals ?? [];\n if (!conds.length) continue;\n\n const matches = conds.filter((c) => evalConditional(qVal, c.conditionalType, c.conditionalValue));\n const branches = matches.length > 1 && !matches.some((m) => m.conditionalQuestionsAllowMultiple) ? matches.slice(0, 1) : matches;\n\n for (const b of branches) {\n const children = (b.conditionalQuestions ?? []) as unknown as Question[];\n if (!children.length) continue;\n\n if (!b.conditionalQuestionsAllowMultiple) {\n // non-repeatable: keep walking for deeper repeats\n if (validateRepeatablesRecursive(children, valuesAtScope, scopePath)) return true;\n continue;\n }\n\n // repeatable at this scope\n const arr = (valuesAtScope[itemsKey(qKey)] as unknown[]) ?? [];\n if (arr.length === 0) return true; // must have at least one entry\n\n for (const [idx, item] of (arr as Array<Record<string, unknown>>).entries()) {\n const itemScopePath = [...scopePath, itemsKey(qKey), idx];\n\n // 1) validate required fields for this item's children\n const visibleChildren = children.filter((childQ) => !shouldSkipRequiredValidation(childQ, itemScopePath));\n const itemErrors = validateQuestions(visibleChildren, item as FormValues);\n if (Object.values(itemErrors).some(Boolean)) return true;\n\n // 2) recursively validate nested repeatables within this item\n if (validateRepeatablesRecursive(children, item as FormValues, itemScopePath)) return true;\n }\n }\n }\n return false;\n}\n\n/** True when any visible repeatable branch (at any depth) is missing items or has invalid items */\nfunction hasRepeatableBlockingErrors(questions: ReadonlyArray<Question>, rootValues: FormValues): boolean {\n return validateRepeatablesRecursive(questions, rootValues);\n}\n\ntype CompleteCallback = (values: FormValues, stageKey: string) => Promise<{ success: boolean; error?: string }>;\n\n/* -------------------------------- component -------------------------------- */\nexport function FormWizard({\n stages,\n onStageComplete,\n onComplete,\n initialValues,\n initialActive\n}: {\n stages: StageMeta[];\n onStageComplete: CompleteCallback;\n onComplete: CompleteCallback;\n initialValues?: FormValues;\n initialActive?: number;\n}) {\n const [active, setActive] = useState(initialActive ?? 0);\n const [allValues, setAllValues] = useState<FormValues>(initialValues ?? {});\n const [perStageQuestions, setPerStageQuestions] = useState<Record<string, Question[]>>({});\n const [loading, setLoading] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [stageError, setStageError] = useState<string | null>(null);\n const stepRefs = useRef<(HTMLLIElement | null)[]>([]);\n const latestStagesRef = useRef<StageMeta[]>(stages);\n\n const hasStages = Array.isArray(stages) && stages.length > 0;\n const stage = hasStages ? stages[Math.min(active, stages.length - 1)] : null;\n const stageKey = stage?.key ?? null;\n\n // Update active stage when initialActive changes (e.g., when going back from rates)\n useEffect(() => {\n if (initialActive !== undefined) {\n setActive(initialActive);\n }\n }, [initialActive]);\n\n // Scroll active step into view\n useEffect(() => {\n latestStagesRef.current = stages;\n }, [stages]);\n\n useEffect(() => {\n const activeElement = stepRefs.current[active];\n if (activeElement) {\n activeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n }\n }, [active]);\n\n // Update form values when initialValues changes (e.g., when going back from rates)\n // Only update if initialValues is provided (not undefined/null)\n useEffect(() => {\n if (initialValues !== undefined) {\n setAllValues(initialValues);\n }\n }, [initialValues]);\n\n useEffect(() => {\n if (!stage || !stageKey) {\n setLoading(false);\n setStageError(null);\n return;\n }\n if (perStageQuestions[stageKey]) {\n setLoading(false);\n setStageError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setStageError(null);\n\n Promise.resolve(stage.loadQuestions())\n .then((qs) => {\n if (cancelled) return;\n if (!Array.isArray(qs)) throw new Error(`loadQuestions(\"${stageKey}\") did not return an array`);\n setPerStageQuestions((m) => ({ ...m, [stageKey]: qs }));\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .catch((err: any) => {\n if (cancelled) return;\n setStageError(`Failed to load stage \"${stage?.title ?? ''}\": ${err?.message ?? 'Unknown error'}`);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [stage, stageKey, perStageQuestions]);\n\n const questions = stageKey ? perStageQuestions[stageKey] : undefined;\n const autoCoverageKeys = useMemo(() => resolveAutoCoverageConditionKeys((questions ?? []) as Question[]), [questions]);\n\n // GTM: stage viewed (when questions for this stage have loaded)\n useEffect(() => {\n if (stage && stageKey && questions) {\n pushStageViewed({\n stageKey,\n stageTitle: stage.title ?? stageKey,\n stepIndex: active + 1,\n totalSteps: stages.length\n });\n }\n }, [stageKey, active, stages.length, stage, questions]);\n\n // Values slice for current stage (+ keep any __items arrays)\n const currentValues = useMemo(() => {\n if (!questions) return {};\n const slice: FormValues = {};\n\n // Helper function to recursively collect all nested question keys\n const collectAllQuestionKeys = (questionList: Question[]): string[] => {\n const keys: string[] = [];\n const walk = (list: Question[]) => {\n list.forEach((q, i) => {\n const k = ensureKey(q, i);\n keys.push(k);\n const kItems = itemsKey(k);\n keys.push(kItems);\n\n // Recursively collect keys from conditional questions\n const conds = q.conditionals ?? [];\n conds.forEach((c) => {\n const children = (c.conditionalQuestions ?? []) as unknown as Question[];\n if (children.length > 0) {\n walk(children);\n }\n });\n });\n };\n walk(questionList);\n return keys;\n };\n\n // Get all keys that could be relevant to this stage (including nested conditionals)\n const allRelevantKeys = collectAllQuestionKeys(questions);\n\n // Include values for all relevant keys\n allRelevantKeys.forEach((k) => {\n if (k in allValues) slice[k] = allValues[k];\n });\n // include any orphaned *_ _items keys to keep sub-arrays alive\n for (const [k, v] of Object.entries(allValues)) {\n if (k.endsWith(ITEMS_SUFFIX) && !(k in slice)) slice[k] = v;\n }\n return slice;\n }, [questions, allValues]);\n\n const updateCurrentValues = (next: FormValues) => {\n setAllValues((prev) => ({ ...prev, ...next }));\n };\n\n const goPrev = () => {\n setActive((i) => (i > 0 ? i - 1 : 0));\n document.querySelector<HTMLElement>('.panel-body')?.scrollTo({ top: 0, behavior: 'instant' as ScrollBehavior });\n };\n\n const goNext = async () => {\n if (!questions || !stage || loading || stageError || isSubmitting) return;\n\n // flat (visible, non-repeatable) validation\n const visible = flattenVisibleQuestions(questions, allValues);\n const dynamicRequired = shouldRequireNoInsuranceReason(allValues, autoCoverageKeys);\n const validationQuestions = visible.map((q) => (isNoInsuranceReasonQuestion(q, autoCoverageKeys) ? { ...q, required: dynamicRequired } : q));\n const flatErrors = validateQuestions(validationQuestions as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n\n // repeatable validation (any depth)\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n\n // driver-vehicle assignment validation (50/50 not allowed, must sum to 100)\n const dva = allValues.driver_vehicle_assignments as Record<string, Record<string, number>> | undefined;\n const dvaDrivers = (allValues.drivers__items ?? []) as unknown[];\n let dvaBlock = false;\n if (dva && dvaDrivers.length >= 2) {\n const vehicles = (allValues.vehicles__items ?? []) as unknown[];\n for (let vi = 0; vi < vehicles.length; vi++) {\n const vAssign = dva[`v${vi}`];\n if (!vAssign) continue;\n // cspell:ignore pcts\n const pcts = dvaDrivers.map((_, di) => vAssign[`d${di}`] ?? 0);\n const nonZero = pcts.filter((p) => p > 0);\n if (nonZero.length >= 2 && nonZero.every((p) => p === 50)) {\n dvaBlock = true;\n break;\n }\n const total = pcts.reduce((a, b) => a + b, 0);\n if (total > 0 && total !== 100) {\n dvaBlock = true;\n break;\n }\n }\n }\n\n if (flatBlock || repeatBlock || dvaBlock) return;\n\n setIsSubmitting(true);\n try {\n const isComplete = active >= stages.length - 1;\n const { success, error } = isComplete ? await onComplete(allValues, stageKey ?? '') : await onStageComplete(currentValues, stageKey ?? '');\n if (!success) {\n setStageError(error ?? 'An error occurred');\n return;\n }\n if (!isComplete) {\n const latestStages = latestStagesRef.current;\n const latestCurrentIndex = latestStages.findIndex((s) => s.key === stageKey);\n const latestNextIndex =\n latestCurrentIndex >= 0 ? Math.min(latestCurrentIndex + 1, latestStages.length - 1) : Math.min(active + 1, latestStages.length - 1);\n setActive(latestNextIndex);\n }\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // LIVE disabled state for the Next button (always rendered)\n const disableNext = useMemo(() => {\n if (!questions || loading || !!stageError || isSubmitting) return true;\n const visible = flattenVisibleQuestions(questions, allValues);\n const dynamicRequired = shouldRequireNoInsuranceReason(allValues, autoCoverageKeys);\n const validationQuestions = visible.map((q) => (isNoInsuranceReasonQuestion(q, autoCoverageKeys) ? { ...q, required: dynamicRequired } : q));\n const flatErrors = validateQuestions(validationQuestions as Question[], allValues);\n const flatBlock = Object.values(flatErrors).some(Boolean);\n const repeatBlock = hasRepeatableBlockingErrors(questions, allValues);\n\n const dva = allValues.driver_vehicle_assignments as Record<string, Record<string, number>> | undefined;\n const dvaDrivers = (allValues.drivers__items ?? []) as unknown[];\n let dvaBlock = false;\n if (dva && dvaDrivers.length >= 2) {\n const vehicles = (allValues.vehicles__items ?? []) as unknown[];\n for (let vi = 0; vi < vehicles.length; vi++) {\n const vAssign = dva[`v${vi}`];\n if (!vAssign) continue;\n // cspell:ignore pcts\n const pcts = dvaDrivers.map((_, di) => vAssign[`d${di}`] ?? 0);\n const nonZero = pcts.filter((p) => p > 0);\n if (nonZero.length >= 2 && nonZero.every((p) => p === 50)) {\n dvaBlock = true;\n break;\n }\n const total = pcts.reduce((a, b) => a + b, 0);\n if (total > 0 && total !== 100) {\n dvaBlock = true;\n break;\n }\n }\n }\n\n return flatBlock || repeatBlock || dvaBlock;\n }, [questions, allValues, loading, stageError, isSubmitting, autoCoverageKeys]);\n\n if (!hasStages) return <div className=\"text-slate-600\">Loading...</div>;\n\n return (\n <div className=\"space-y-6\">\n {/* progress header */}\n <div className=\"form-wizard-steps-header flex items-center justify-between gap-4\">\n <ol\n className=\"form-wizard-steps flex gap-2 text-xs overflow-x-auto flex-1 pb-1 scrollbar-hide items-center\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}\n >\n {stages.flatMap((s, i) => [\n <li\n key={s.key ?? `stage-${i}`}\n ref={(el) => {\n stepRefs.current[i] = el;\n }}\n className={`form-wizard-step-pill px-2.5 py-1 rounded-full border whitespace-nowrap flex-shrink-0 ${\n i < active\n ? 'bg-blue-600 text-white border-blue-600'\n : i === active\n ? 'border-blue-600 text-blue-600 bg-white'\n : 'border-slate-200 text-slate-600'\n }`}\n >\n {s.title}\n </li>,\n ...(i < stages.length - 1\n ? [\n <li key={`arrow-${s.key ?? i}`} className=\"form-wizard-step-arrow text-slate-400 flex-shrink-0\">\n →\n </li>\n ]\n : [])\n ])}\n </ol>\n <div className=\"form-wizard-step-counter text-sm text-slate-500 flex-shrink-0\">\n {Math.min(active + 1, stages.length)} / {stages.length}\n </div>\n </div>\n\n {/* stage content */}\n <div>\n {loading && <div className=\"text-slate-500\">Loading…</div>}\n\n {stage && (\n <FormRenderer\n key={stage.key}\n questions={questions ?? []}\n controlledValues={currentValues}\n onChangeValues={updateCurrentValues}\n onSubmit={() => goNext()} // Enter key advances\n />\n )}\n </div>\n\n {/* error message */}\n {!loading && stageError && (\n <div className=\"text-red-600 text-sm -mt-4\">\n <div>{stageError}</div>\n {stage && (\n <button\n type=\"button\"\n className=\"credify-retry-btn underline mt-1 font-bold\"\n onClick={() => {\n setPerStageQuestions((m) => {\n if (!stageKey) return m;\n const copy = { ...m };\n delete copy[stageKey];\n return copy;\n });\n }}\n >\n Retry\n </button>\n )}\n </div>\n )}\n\n {/* footer (always visible) */}\n <div className={active > 0 ? 'grid grid-cols-2 gap-3' : ''}>\n {active > 0 && (\n <button\n type=\"button\"\n onClick={goPrev}\n disabled={loading}\n className=\"credify-btn-back h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition\"\n >\n Back\n </button>\n )}\n\n <button\n type=\"button\"\n data-widget-ctrl=\"next\"\n onClick={goNext}\n disabled={disableNext}\n className={[\n 'form-wizard-next-btn',\n active > 0 ? '' : 'w-full',\n 'h-12 rounded-full text-white transition',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'flex items-center justify-center gap-2',\n disableNext\n ? 'bg-gray-300'\n : 'bg-blue-600 hover:bg-blue-600/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 bg-primary hover:bg-primary/90 focus-visible:ring-primary/40'\n ].join(' ')}\n >\n {isSubmitting && (\n <svg className=\"animate-spin h-5 w-5 text-white\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n )}\n {active === stages.length - 1 ? 'Finish' : 'Next'}\n </button>\n </div>\n </div>\n );\n}\n\nexport default FormWizard;\n","const QUOTE_ID_KEY = 'credify_quote_id';\nconst AUTH_TOKEN_KEY = 'credify_auth_token';\n\n/**\n * Save quoteId to localStorage\n */\nexport function saveQuoteId(quoteId: string): void {\n try {\n localStorage.setItem(QUOTE_ID_KEY, quoteId);\n } catch (error) {\n console.error('Failed to save quoteId to localStorage:', error);\n }\n}\n\n/**\n * Load quoteId from localStorage\n */\nexport function loadQuoteId(): string | null {\n try {\n return localStorage.getItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to load quoteId from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear quoteId from localStorage\n */\nexport function clearQuoteId(): void {\n try {\n localStorage.removeItem(QUOTE_ID_KEY);\n } catch (error) {\n console.error('Failed to clear quoteId from localStorage:', error);\n }\n}\n\n/**\n * Save authToken to localStorage\n */\nexport function saveAuthToken(token: string): void {\n try {\n localStorage.setItem(AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.error('Failed to save authToken to localStorage:', error);\n }\n}\n\n/**\n * Load authToken from localStorage\n */\nexport function loadAuthToken(): string | null {\n try {\n return localStorage.getItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to load authToken from localStorage:', error);\n return null;\n }\n}\n\n/**\n * Clear authToken from localStorage\n */\nexport function clearAuthToken(): void {\n try {\n localStorage.removeItem(AUTH_TOKEN_KEY);\n } catch (error) {\n console.error('Failed to clear authToken from localStorage:', error);\n }\n}\n\n/**\n * Clear all quote-related data from localStorage\n */\nexport function clearAllQuoteData(): void {\n clearQuoteId();\n clearAuthToken();\n}\n","import type { Stage, Question, GetRatesResponse } from '@getcredify/credify-insurance-types';\nimport type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\nimport { saveAuthToken, loadAuthToken, clearAuthToken as clearAuthTokenStorage } from './storage';\n\nconst BASE_URL = 'https://api.getcredify.com';\n\n// Store JWT token in memory\nlet authToken: string | null = null;\n\nexport function setAuthToken(token: string): void {\n authToken = token;\n saveAuthToken(token);\n}\n\nexport function getAuthToken(): string | null {\n return authToken;\n}\n\nexport function loadAuthTokenFromStorage(): void {\n const storedToken = loadAuthToken();\n if (storedToken) {\n authToken = storedToken;\n }\n}\n\nexport function clearAuthToken(): void {\n authToken = null;\n clearAuthTokenStorage();\n}\n\nasync function makeAuthenticatedRequest(url: string, body: object): Promise<Response> {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json'\n };\n\n if (authToken) {\n headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n });\n\n if (!response.ok) {\n let errorMessage = `Request failed with status ${response.status}`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorMessage;\n } catch {\n // If response is not JSON, use status text\n errorMessage = response.statusText || errorMessage;\n }\n const error = new Error(errorMessage) as Error & { statusCode?: number };\n error.statusCode = response.status;\n throw error;\n }\n\n return response;\n}\n\nexport async function getQuestionsByStage(stage: Stage): Promise<{ questions: Question[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-questions-by-stage`, { stage });\n const data = await response.json();\n return data;\n}\n\nexport async function getStagesForQuote(): Promise<{ stages: Stage[] }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-stages-for-quote`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function createQuote(phone: string): Promise<{ quoteId: string }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/create-quote`, { phone });\n const data = await response.json();\n if (!data || typeof data !== 'object' || !data.quoteId) {\n throw new Error(`Invalid createQuote response: ${JSON.stringify(data)}`);\n }\n return data;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport async function updateQuote(payload: FormValues & { current_stage?: string }, getRates: boolean, quoteId?: string): Promise<{}> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n // Only include quoteId if it's a valid non-empty string\n const body: { payload: FormValues & { current_stage?: string }; getRates: boolean; quoteId?: string } = { payload, getRates };\n if (quoteId && typeof quoteId === 'string' && quoteId.trim() !== '') {\n body.quoteId = quoteId;\n }\n const response = await makeAuthenticatedRequest(`${BASE_URL}/update-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function verifyQuote(quoteId: string, smsCode: string): Promise<{ isVerified: boolean; token: string | null }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/verify-quote`, { quoteId, smsCode });\n const data = await response.json();\n return data;\n}\n\nexport async function isSupportedState(state: string): Promise<{ isSupported: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/is-supported-state`, { state });\n const data = await response.json();\n return data;\n}\n\nexport async function getRates(): Promise<{ rates: GetRatesResponse }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-rates`, {});\n const data = await response.json();\n return data;\n}\n\nexport async function getQuote(quoteId?: string): Promise<{ quote: Quote }> {\n // If we have a token, use it. Otherwise, send quoteId in body (for pre-verification stage)\n const body = quoteId ? { quoteId } : {};\n const response = await makeAuthenticatedRequest(`${BASE_URL}/get-quote`, body);\n const data = await response.json();\n return data;\n}\n\nexport async function requestBind(quoteRateId: string): Promise<{ success?: boolean }> {\n const response = await makeAuthenticatedRequest(`${BASE_URL}/request-bind`, { quoteRateId });\n const data = await response.json();\n // Backend returns {} on success, so return it with success: true\n return data && typeof data === 'object' && 'success' in data ? data : { success: true };\n}\n","import { useState, useEffect } from 'react';\n\nimport type { GetRatesResponse } from '@getcredify/credify-insurance-types';\n\nimport { requestBind, loadAuthTokenFromStorage, getAuthToken, clearAuthToken } from '../utils/api';\nimport { clearAllQuoteData } from '../utils/storage';\nimport { pushRatesBack } from '../utils/gtm';\n\nconst currencyFormatter = new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n});\n\ntype RequestStatus = 'idle' | 'loading' | 'success' | 'error';\n\nfunction BackButton({ onBack }: { onBack?: () => void }) {\n const handleBack = () => {\n pushRatesBack();\n onBack?.();\n };\n return (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"credify-btn-back credify-btn-back-rates h-12 rounded-full border border-gray-300 text-text-primary hover:bg-gray-50 transition w-full\"\n >\n Back\n </button>\n );\n}\n\nexport function Rates({ rates, onBack }: { rates: GetRatesResponse; onBack?: () => void }) {\n const hasRates = Array.isArray(rates) && rates.length > 0;\n const [requestStatuses, setRequestStatuses] = useState<Record<string, RequestStatus>>({});\n\n // Load auth token from localStorage when component mounts\n useEffect(() => {\n loadAuthTokenFromStorage();\n }, []);\n\n if (!hasRates) {\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <p className=\"mt-2 text-sm text-slate-500\">No rates are available at this time.</p>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n }\n\n return (\n <section className=\"mt-8\">\n <h3 className=\"text-lg font-semibold text-slate-900\">Rates</h3>\n <div className=\"mt-4 grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {rates.map((rate) => {\n const premiumDollars = rate.premium_cents / 100;\n const formattedPremium = currencyFormatter.format(premiumDollars);\n const cardKey = rate.quote_rate_id;\n const status = requestStatuses[cardKey] ?? 'idle';\n const isRequesting = status === 'loading';\n const isRequested = status === 'success';\n\n const handleRequestBind = async () => {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'loading' }));\n try {\n // Ensure auth token is loaded from localStorage before making the request\n loadAuthTokenFromStorage();\n const token = getAuthToken();\n if (!token) {\n throw new Error('Authentication required. Please verify your phone number first.');\n }\n const result = await requestBind(rate.quote_rate_id);\n // Backend returns {} on success, so if we get here without an error, it's successful\n // Check for success property if present, otherwise assume success if no error\n const success = result?.success !== false;\n if (!success) throw new Error('Request failed');\n\n // Clear all quote data from localStorage and memory so user starts fresh on return\n clearAllQuoteData();\n clearAuthToken();\n\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'success' }));\n } catch {\n setRequestStatuses((prev) => ({ ...prev, [cardKey]: 'error' }));\n }\n };\n\n return (\n <div key={cardKey} className=\"flex flex-col rounded-xl border border-slate-200 bg-white p-6 shadow-sm transition hover:shadow-md\">\n {/* Carrier Logo and Name */}\n <div className=\"mb-4 flex items-center gap-3\">\n {rate.carrier_logo_base64 ? (\n <img src={`data:image/png;base64,${rate.carrier_logo_base64}`} alt={rate.carrier_name} className=\"h-12 w-auto object-contain\" />\n ) : (\n <div className=\"flex h-12 w-12 items-center justify-center rounded-md bg-slate-100 text-sm font-semibold text-slate-500\">\n {rate.carrier_name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex-1\">\n <h4 className=\"font-semibold text-slate-900\">{rate.carrier_name}</h4>\n </div>\n </div>\n\n {/* Premium */}\n <div className=\"mb-2\">\n <p className=\"text-sm text-slate-500\">Premium</p>\n <p className=\"text-2xl font-bold text-slate-900\">{formattedPremium}</p>\n </div>\n\n {/* Term */}\n <div className=\"mb-4\">\n <p className=\"text-sm text-slate-500\">Term</p>\n <p className=\"font-medium text-slate-700\">{rate.term_months} months</p>\n </div>\n\n {/* Carrier Quote ID */}\n {rate.carrier_quote_id && (\n <div className=\"mb-4\">\n <p className=\"text-xs text-slate-400\">Quote ID: {rate.carrier_quote_id}</p>\n </div>\n )}\n\n {/* Request Bind Button */}\n <div className=\"mt-auto pt-4\">\n <button\n type=\"button\"\n onClick={handleRequestBind}\n disabled={isRequesting || isRequested}\n className={`rates-bind-btn w-full rounded-full px-4 py-2.5 text-sm font-semibold transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-600/40 disabled:cursor-not-allowed ${\n isRequested ? 'rates-bind-btn-requested' : 'hover:bg-blue-600/90 disabled:bg-slate-300 disabled:text-slate-500'\n }`}\n >\n {isRequesting ? 'Requesting…' : isRequested ? 'Requested' : 'Request Bind'}\n </button>\n {status === 'error' && <p className=\"mt-2 text-xs text-red-600\">Something went wrong. Please try again.</p>}\n {status === 'success' && <p className=\"mt-2 text-xs text-emerald-600\">We received your bind request.</p>}\n </div>\n </div>\n );\n })}\n </div>\n {onBack && <BackButton onBack={onBack} />}\n </section>\n );\n}\n","import type { Quote } from '@getcredify/credify-insurance-db';\nimport type { FormValues } from './form';\nimport { normalizeDriverEducationLevelValue, normalizeDriverIndustryValue, normalizeDriverOccupationValue } from './driver-option-normalizers';\n\n/**\n * Convert boolean to \"Yes\"/\"No\" string (reverse of transformFormValues)\n */\nexport function convertBooleanToYesNo(value: boolean | null | undefined): string | undefined {\n if (value === true) return 'Yes';\n if (value === false) return 'No';\n return undefined;\n}\n\n/**\n * Format date to YYYY-MM-DD string format\n */\nexport function formatDate(date: Date | string | null | undefined): string | undefined {\n if (!date) return undefined;\n try {\n const d = typeof date === 'string' ? new Date(date) : date;\n if (isNaN(d.getTime())) return undefined;\n return d.toISOString().split('T')[0];\n } catch {\n return undefined;\n }\n}\n\n/**\n * Transform quote data from database format to form values\n */\nexport function quoteToFormValues(quoteRaw: Quote): FormValues {\n // Cast to a broader type so fields added after the published type definitions are accessible\n const quote = quoteRaw as typeof quoteRaw & Record<string, unknown>;\n const formValues: FormValues = {};\n\n // Root quote fields\n if (quote.phone) formValues.phone = quote.phone;\n if (quote.first_name) formValues.first_name = quote.first_name;\n if (quote.last_name) formValues.last_name = quote.last_name;\n if (quote.email) formValues.email = quote.email;\n if (quote.date_of_birth) formValues.date_of_birth = formatDate(quote.date_of_birth as Date);\n if (quote.product) formValues.product = quote.product;\n if (quote.state) formValues.state = quote.state;\n\n // Combine address fields into a single address string\n const addressParts: string[] = [];\n if (quote.line_1) addressParts.push(quote.line_1);\n if (quote.line_2) addressParts.push(quote.line_2);\n if (quote.city) addressParts.push(quote.city);\n if (quote.state) addressParts.push(quote.state);\n if (quote.postal_code) addressParts.push(quote.postal_code);\n if (addressParts.length > 0) {\n formValues.address = addressParts.join(', ');\n }\n\n if (quote.years_at_address !== null && quote.years_at_address !== undefined) formValues.years_at_address = quote.years_at_address;\n if (quote.months_at_address !== null && quote.months_at_address !== undefined) formValues.months_at_address = quote.months_at_address;\n if (quote.move_in_date) formValues.move_in_date = formatDate(quote.move_in_date as Date);\n\n // Combine prior address fields into a single prior_address string\n const priorAddressParts: string[] = [];\n if (quote.prior_line_1) priorAddressParts.push(quote.prior_line_1);\n if (quote.prior_line_2) priorAddressParts.push(quote.prior_line_2);\n if (quote.prior_city) priorAddressParts.push(quote.prior_city);\n if (quote.prior_state) priorAddressParts.push(quote.prior_state);\n if (quote.prior_postal_code) priorAddressParts.push(quote.prior_postal_code);\n if (priorAddressParts.length > 0) {\n formValues.prior_address = priorAddressParts.join(', ');\n }\n\n if (quote.years_at_prior_address !== null && quote.years_at_prior_address !== undefined)\n formValues.years_at_prior_address = quote.years_at_prior_address;\n if (quote.is_mailing_address_different !== null && quote.is_mailing_address_different !== undefined) {\n formValues.is_mailing_address_different = convertBooleanToYesNo(quote.is_mailing_address_different as boolean);\n }\n if (quote.mailing_address) formValues.mailing_address = quote.mailing_address;\n\n // Auto policy fields\n if (quote.effective_date) formValues.effective_date = formatDate(quote.effective_date as Date);\n\n // Auto prior insurance fields\n if (quote.auto_has_prior_insurance !== null && quote.auto_has_prior_insurance !== undefined) {\n formValues.auto_has_prior_insurance = convertBooleanToYesNo(quote.auto_has_prior_insurance);\n }\n if (quote.auto_prior_expiration_date) formValues.auto_prior_expiration_date = formatDate(quote.auto_prior_expiration_date as Date);\n if (quote.auto_prior_carrier_name) formValues.auto_prior_carrier_name = quote.auto_prior_carrier_name;\n if (quote.auto_prior_liability_limit) formValues.auto_prior_liability_limit = quote.auto_prior_liability_limit;\n if (quote.auto_reason_for_no_insurance) formValues.auto_reason_for_no_insurance = quote.auto_reason_for_no_insurance;\n if (quote.auto_prior_years !== null && quote.auto_prior_years !== undefined) formValues.auto_prior_years = quote.auto_prior_years;\n if (quote.auto_prior_months !== null && quote.auto_prior_months !== undefined) formValues.auto_prior_months = quote.auto_prior_months;\n if (quote.auto_continuous_coverage_years !== null && quote.auto_continuous_coverage_years !== undefined) {\n formValues.auto_continuous_coverage_years = quote.auto_continuous_coverage_years;\n }\n if (quote.auto_cancelled_declined_refused_to_renew !== null && quote.auto_cancelled_declined_refused_to_renew !== undefined) {\n formValues.auto_cancelled_declined_refused_to_renew = convertBooleanToYesNo(quote.auto_cancelled_declined_refused_to_renew);\n }\n if (quote.auto_current_annual_premium_cents !== null && quote.auto_current_annual_premium_cents !== undefined) {\n formValues.auto_current_annual_premium_cents = quote.auto_current_annual_premium_cents;\n }\n if (quote.policy_bi) formValues.policy_bi = quote.policy_bi;\n if (quote.policy_um) formValues.policy_um = quote.policy_um;\n if (quote.policy_pd) formValues.policy_pd = quote.policy_pd;\n if (quote.policy_mp) formValues.policy_mp = quote.policy_mp;\n if (quote.policy_umpd) formValues.policy_umpd = quote.policy_umpd;\n if (quote.policy_pip) formValues.policy_pip = quote.policy_pip;\n if (quote.policy_auto_death_indemnity) formValues.policy_auto_death_indemnity = quote.policy_auto_death_indemnity;\n if (quote.driver_vehicle_assignments) formValues.driver_vehicle_assignments = quote.driver_vehicle_assignments;\n\n // Home prior insurance fields\n if (quote.home_has_prior_insurance !== null && quote.home_has_prior_insurance !== undefined) {\n formValues.home_has_prior_insurance = convertBooleanToYesNo(quote.home_has_prior_insurance);\n }\n if (quote.home_prior_expiration_date) formValues.home_prior_expiration_date = formatDate(quote.home_prior_expiration_date as Date);\n if (quote.home_prior_carrier_name) formValues.home_prior_carrier_name = quote.home_prior_carrier_name;\n\n // Home property fields\n if (quote.year_built !== null && quote.year_built !== undefined) formValues.year_built = quote.year_built;\n if (quote.number_of_units !== null && quote.number_of_units !== undefined) formValues.number_of_units = quote.number_of_units;\n if (quote.number_of_stories !== null && quote.number_of_stories !== undefined) formValues.number_of_stories = quote.number_of_stories;\n if (quote.number_of_beds !== null && quote.number_of_beds !== undefined) formValues.number_of_beds = quote.number_of_beds;\n if (quote.number_of_full_baths !== null && quote.number_of_full_baths !== undefined) formValues.number_of_full_baths = quote.number_of_full_baths;\n if (quote.number_of_partial_baths !== null && quote.number_of_partial_baths !== undefined) {\n formValues.number_of_partial_baths = quote.number_of_partial_baths;\n }\n if (quote.under_construction !== null && quote.under_construction !== undefined) {\n formValues.under_construction = convertBooleanToYesNo(quote.under_construction);\n }\n if (quote.distance_from_fire_hydrant_ft) formValues.distance_from_fire_hydrant_ft = quote.distance_from_fire_hydrant_ft;\n if (quote.distance_from_fire_station_miles) formValues.distance_from_fire_station_miles = quote.distance_from_fire_station_miles;\n if (quote.architectural_style) formValues.architectural_style = quote.architectural_style;\n if (quote.dwelling_type) formValues.dwelling_type = quote.dwelling_type;\n if (quote.construction_quality) formValues.construction_quality = quote.construction_quality;\n if (quote.located_over_water !== null && quote.located_over_water !== undefined) {\n formValues.located_over_water = quote.located_over_water;\n }\n if (quote.construction_type) formValues.construction_type = quote.construction_type;\n if (quote.exterior_wall_type) formValues.exterior_wall_type = quote.exterior_wall_type;\n if (quote.foundation_type) formValues.foundation_type = quote.foundation_type;\n if (quote.roof_material_type) formValues.roof_material_type = quote.roof_material_type;\n if (quote.year_roof_updated !== null && quote.year_roof_updated !== undefined) formValues.year_roof_updated = quote.year_roof_updated;\n if (quote.heating_type) formValues.heating_type = quote.heating_type;\n if (quote.heating_fuel_type) formValues.heating_fuel_type = quote.heating_fuel_type;\n if (quote.number_of_fireplaces !== null && quote.number_of_fireplaces !== undefined) {\n formValues.number_of_fireplaces = quote.number_of_fireplaces;\n }\n if (quote.basement_type) formValues.basement_type = quote.basement_type;\n if (quote.parking_type) formValues.parking_type = quote.parking_type;\n if (quote.number_of_parking_spaces !== null && quote.number_of_parking_spaces !== undefined) {\n formValues.number_of_parking_spaces = quote.number_of_parking_spaces;\n }\n if (quote.plumbing_type) formValues.plumbing_type = quote.plumbing_type;\n if (quote.pool_type) formValues.pool_type = quote.pool_type;\n if (quote.total_area_sq_ft !== null && quote.total_area_sq_ft !== undefined) formValues.total_area_sq_ft = quote.total_area_sq_ft;\n if (quote.parcel_area_sq_ft !== null && quote.parcel_area_sq_ft !== undefined) formValues.parcel_area_sq_ft = quote.parcel_area_sq_ft;\n if (quote.residence_type) formValues.residence_type = quote.residence_type;\n if (quote.usage_type) formValues.usage_type = quote.usage_type;\n if (quote.household_size !== null && quote.household_size !== undefined) formValues.household_size = quote.household_size;\n if (quote.number_of_mortgagees !== null && quote.number_of_mortgagees !== undefined) {\n formValues.number_of_mortgagees = quote.number_of_mortgagees;\n }\n if (quote.has_dog !== null && quote.has_dog !== undefined) formValues.has_dog = convertBooleanToYesNo(quote.has_dog);\n if (quote.dog_breed_type) formValues.dog_breed_type = quote.dog_breed_type;\n if (quote.number_of_dogs !== null && quote.number_of_dogs !== undefined) formValues.number_of_dogs = quote.number_of_dogs;\n if (quote.has_business_on_premises !== null && quote.has_business_on_premises !== undefined) {\n formValues.has_business_on_premises = convertBooleanToYesNo(quote.has_business_on_premises);\n }\n if (quote.business_class) formValues.business_class = quote.business_class;\n\n // Discount fields\n if (quote.retiree_discount !== null && quote.retiree_discount !== undefined) {\n formValues.retiree_discount = convertBooleanToYesNo(quote.retiree_discount);\n }\n if (quote.gated_community_discount !== null && quote.gated_community_discount !== undefined) {\n formValues.gated_community_discount = convertBooleanToYesNo(quote.gated_community_discount);\n }\n if (quote.multi_policy_discount !== null && quote.multi_policy_discount !== undefined) {\n formValues.multi_policy_discount = convertBooleanToYesNo(quote.multi_policy_discount);\n }\n if (quote.non_smoker_discount !== null && quote.non_smoker_discount !== undefined) {\n formValues.non_smoker_discount = convertBooleanToYesNo(quote.non_smoker_discount);\n }\n if (quote.first_time_buyer_discount !== null && quote.first_time_buyer_discount !== undefined) {\n formValues.first_time_buyer_discount = convertBooleanToYesNo(quote.first_time_buyer_discount);\n }\n\n // Safety features\n if (quote.fire_detection_system !== null && quote.fire_detection_system !== undefined) {\n formValues.fire_detection_system = convertBooleanToYesNo(quote.fire_detection_system);\n }\n if (quote.burglar_alarm_system !== null && quote.burglar_alarm_system !== undefined) {\n formValues.burglar_alarm_system = convertBooleanToYesNo(quote.burglar_alarm_system);\n }\n if (quote.burglar_alarm_system_type) formValues.burglar_alarm_system_type = quote.burglar_alarm_system_type;\n if (quote.smoke_detectors !== null && quote.smoke_detectors !== undefined) {\n formValues.smoke_detectors = convertBooleanToYesNo(quote.smoke_detectors);\n }\n if (quote.sprinkler_system !== null && quote.sprinkler_system !== undefined) {\n formValues.sprinkler_system = convertBooleanToYesNo(quote.sprinkler_system);\n }\n if (quote.sprinkler_system_type) formValues.sprinkler_system_type = quote.sprinkler_system_type;\n if (quote.gas_leakage_detector !== null && quote.gas_leakage_detector !== undefined) {\n formValues.gas_leakage_detector = convertBooleanToYesNo(quote.gas_leakage_detector);\n }\n if (quote.deadbolt_locks !== null && quote.deadbolt_locks !== undefined) {\n formValues.deadbolt_locks = convertBooleanToYesNo(quote.deadbolt_locks);\n }\n if (quote.fire_extinguisher !== null && quote.fire_extinguisher !== undefined) {\n formValues.fire_extinguisher = convertBooleanToYesNo(quote.fire_extinguisher);\n }\n\n // Other boolean fields\n if (quote.order_credit_authorized !== null && quote.order_credit_authorized !== undefined) {\n formValues.order_credit_authorized = convertBooleanToYesNo(quote.order_credit_authorized);\n }\n if (quote.has_health_insurance_auto_accident !== null && quote.has_health_insurance_auto_accident !== undefined) {\n formValues.has_health_insurance_auto_accident = convertBooleanToYesNo(quote.has_health_insurance_auto_accident);\n }\n if (quote.named_insured_foreclosure_repo_bankruptcy !== null && quote.named_insured_foreclosure_repo_bankruptcy !== undefined) {\n formValues.named_insured_foreclosure_repo_bankruptcy = convertBooleanToYesNo(quote.named_insured_foreclosure_repo_bankruptcy);\n }\n if (quote.named_insured_convicted_insurance_fraud !== null && quote.named_insured_convicted_insurance_fraud !== undefined) {\n formValues.named_insured_convicted_insurance_fraud = convertBooleanToYesNo(quote.named_insured_convicted_insurance_fraud);\n }\n\n // Build a vehicle-id-to-VIN map for resolving FKs in accidents/losses\n const vehicleIdToVin: Record<string, string> = {};\n if (quote.vehicles) {\n for (const v of quote.vehicles) {\n if (v.quote_vehicle_id && v.vin) vehicleIdToVin[v.quote_vehicle_id] = v.vin;\n }\n }\n\n // Set \"Add Drivers\" checkbox based on whether drivers exist\n if (quote.drivers && quote.drivers.length > 0) {\n formValues.drivers = 'Yes';\n formValues.drivers__items = quote.drivers.map((driverRaw) => {\n const driver = driverRaw as typeof driverRaw & Record<string, unknown>;\n const driverValues: FormValues = {};\n if (driver.first_name) driverValues.first_name = driver.first_name;\n if (driver.middle_name) driverValues.middle_name = driver.middle_name;\n if (driver.last_name) driverValues.last_name = driver.last_name;\n if (driver.date_of_birth) driverValues.date_of_birth = formatDate(driver.date_of_birth as Date);\n if (driver.gender) driverValues.gender = driver.gender;\n if (driver.marital_status) driverValues.marital_status = driver.marital_status;\n if (driver.relationship_to_insured) driverValues.relationship_to_insured = driver.relationship_to_insured;\n if (driver.is_registered_owner !== null && driver.is_registered_owner !== undefined) {\n driverValues.is_registered_owner = (driver.is_registered_owner as boolean) ? 'Yes' : 'No';\n }\n if (driver.license_state) driverValues.license_state = driver.license_state;\n if (driver.license_status) driverValues.license_status = driver.license_status;\n if (driver.license_number) driverValues.license_number = driver.license_number;\n if (driver.date_first_licensed) driverValues.date_first_licensed = formatDate(driver.date_first_licensed as Date);\n if (driver.education_level) driverValues.education_level = normalizeDriverEducationLevelValue(driver.education_level as string);\n if (driver.occupation) driverValues.occupation = normalizeDriverOccupationValue(driver.occupation as string);\n if (driver.industry) driverValues.industry = normalizeDriverIndustryValue(driver.industry as string);\n if (driver.employment_status) driverValues.employment_status = driver.employment_status;\n if (driver.last_5_years_license_suspended_or_revoked !== null && driver.last_5_years_license_suspended_or_revoked !== undefined) {\n driverValues.last_5_years_license_suspended_or_revoked = convertBooleanToYesNo(driver.last_5_years_license_suspended_or_revoked as boolean);\n }\n if (driver.accident_prevention_course !== null && driver.accident_prevention_course !== undefined) {\n driverValues.accident_prevention_course = convertBooleanToYesNo(driver.accident_prevention_course as boolean);\n }\n if (driver.accident_prevention_course_date) {\n driverValues.accident_prevention_course_date = formatDate(driver.accident_prevention_course_date as Date);\n }\n if (driver.sr22 !== null && driver.sr22 !== undefined) {\n driverValues.sr22 = convertBooleanToYesNo(driver.sr22 as boolean);\n }\n const ssnDisplay = (driver as Record<string, unknown>).ssn_display;\n if (typeof ssnDisplay === 'string') driverValues.ssn_display = ssnDisplay;\n\n // Driver violations\n const driverViolations = driver.driver_violations as unknown as Array<Record<string, unknown>> | undefined;\n if (driverViolations && driverViolations.length > 0) {\n driverValues.driver_violations = 'Yes';\n driverValues.driver_violations__items = driverViolations.map((violation) => {\n const violationValues: FormValues = {};\n if (violation.code) violationValues.code = violation.code;\n if (violation.occurred_at) violationValues.occurred_at = formatDate(violation.occurred_at as Date);\n return violationValues;\n });\n }\n\n // Driver accidents\n const driverAccidents = driver.driver_accidents as unknown as Array<Record<string, unknown>> | undefined;\n if (driverAccidents && driverAccidents.length > 0) {\n driverValues.driver_accidents = 'Yes';\n driverValues.driver_accidents__items = driverAccidents.map((accident) => {\n const accidentValues: FormValues = {};\n if (accident.occurred_at) accidentValues.occurred_at = formatDate(accident.occurred_at as Date);\n if (accident.description) accidentValues.description = accident.description;\n if (accident.quote_vehicle_id) {\n accidentValues.quote_vehicle_id = vehicleIdToVin[accident.quote_vehicle_id as string] ?? accident.quote_vehicle_id;\n }\n if (accident.property_damage_amount_paid_cents !== null && accident.property_damage_amount_paid_cents !== undefined) {\n accidentValues.property_damage_amount_paid_cents = accident.property_damage_amount_paid_cents;\n }\n if (accident.personal_injury_amount_paid_cents !== null && accident.personal_injury_amount_paid_cents !== undefined) {\n accidentValues.personal_injury_amount_paid_cents = accident.personal_injury_amount_paid_cents;\n }\n return accidentValues;\n });\n }\n\n // Driver losses (nested under driver, using 'losses' association)\n const driverLosses = driver.losses as unknown as Array<Record<string, unknown>> | undefined;\n if (driverLosses && driverLosses.length > 0) {\n driverValues.losses = 'Yes';\n driverValues.losses__items = driverLosses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident as Date);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n if (loss.quote_vehicle_id) {\n lossValues.quote_vehicle_id = vehicleIdToVin[loss.quote_vehicle_id as string] ?? loss.quote_vehicle_id;\n }\n return lossValues;\n });\n }\n\n return driverValues;\n });\n } else {\n formValues.drivers = 'No';\n }\n\n // Set \"Add Vehicles\" checkbox based on whether vehicles exist\n if (quote.vehicles && quote.vehicles.length > 0) {\n formValues.vehicles = 'Yes';\n formValues.vehicles__items = quote.vehicles.map((vehicleRaw) => {\n const vehicle = vehicleRaw as typeof vehicleRaw & Record<string, unknown>;\n const vehicleValues: FormValues = {};\n if (vehicle.vin) vehicleValues.vin = vehicle.vin;\n if (vehicle.year !== null && vehicle.year !== undefined) vehicleValues.year = String(vehicle.year);\n if (vehicle.make) vehicleValues.make = vehicle.make;\n if (vehicle.model) vehicleValues.model = vehicle.model;\n if (vehicle.body_style) vehicleValues.body_style = vehicle.body_style;\n if (vehicle.ownership_type) vehicleValues.ownership_type = vehicle.ownership_type;\n if (vehicle.usage) vehicleValues.usage = vehicle.usage;\n if (vehicle.annual_mileage !== null && vehicle.annual_mileage !== undefined) {\n vehicleValues.annual_mileage = vehicle.annual_mileage;\n }\n if (vehicle.miles_to_work !== null && vehicle.miles_to_work !== undefined) {\n vehicleValues.miles_to_work = vehicle.miles_to_work;\n }\n if (vehicle.percent_to_work !== null && vehicle.percent_to_work !== undefined) {\n vehicleValues.percent_to_work = vehicle.percent_to_work;\n }\n\n const garagingAddressParts: string[] = [];\n if (vehicle.garaging_address_line_1) garagingAddressParts.push(vehicle.garaging_address_line_1 as string);\n if (vehicle.garaging_address_line_2) garagingAddressParts.push(vehicle.garaging_address_line_2 as string);\n if (vehicle.garaging_address_city) garagingAddressParts.push(vehicle.garaging_address_city as string);\n if (vehicle.garaging_address_state) garagingAddressParts.push(vehicle.garaging_address_state as string);\n if (vehicle.garaging_address_postal_code) garagingAddressParts.push(vehicle.garaging_address_postal_code as string);\n if (garagingAddressParts.length > 0) {\n vehicleValues.garaging_address = garagingAddressParts.join(', ');\n }\n\n if (vehicle.new_when_purchased !== null && vehicle.new_when_purchased !== undefined) {\n vehicleValues.new_when_purchased = convertBooleanToYesNo(vehicle.new_when_purchased as boolean);\n }\n if (vehicle.purchase_date) vehicleValues.purchase_date = formatDate(vehicle.purchase_date as Date);\n if (vehicle.anti_theft_type) vehicleValues.anti_theft_type = vehicle.anti_theft_type;\n if (vehicle.passive_restraint_type) vehicleValues.passive_restraint_type = vehicle.passive_restraint_type;\n if (vehicle.anti_lock_brakes !== null && vehicle.anti_lock_brakes !== undefined) {\n vehicleValues.anti_lock_brakes = convertBooleanToYesNo(vehicle.anti_lock_brakes as boolean);\n }\n if (vehicle.daytime_running_lights !== null && vehicle.daytime_running_lights !== undefined) {\n vehicleValues.daytime_running_lights = convertBooleanToYesNo(vehicle.daytime_running_lights as boolean);\n }\n if (vehicle.custom_equipment_value_cents !== null && vehicle.custom_equipment_value_cents !== undefined) {\n vehicleValues.custom_equipment_value_cents = vehicle.custom_equipment_value_cents;\n }\n if (vehicle.vehicle_has_modifications !== null && vehicle.vehicle_has_modifications !== undefined) {\n vehicleValues.vehicle_has_modifications = convertBooleanToYesNo(vehicle.vehicle_has_modifications as boolean);\n }\n if (vehicle.vehicle_garaged_at_residence !== null && vehicle.vehicle_garaged_at_residence !== undefined) {\n vehicleValues.vehicle_garaged_at_residence = convertBooleanToYesNo(vehicle.vehicle_garaged_at_residence as boolean);\n }\n if (vehicle.vehicle_comp_deductible) vehicleValues.vehicle_comp_deductible = vehicle.vehicle_comp_deductible;\n if (vehicle.vehicle_coll_deductible) vehicleValues.vehicle_coll_deductible = vehicle.vehicle_coll_deductible;\n if (vehicle.vehicle_towing_and_labor) vehicleValues.vehicle_towing_and_labor = vehicle.vehicle_towing_and_labor;\n if (vehicle.vehicle_transportation_expense) vehicleValues.vehicle_transportation_expense = vehicle.vehicle_transportation_expense;\n if (vehicle.vehicle_full_glass !== null && vehicle.vehicle_full_glass !== undefined) {\n vehicleValues.vehicle_full_glass = convertBooleanToYesNo(vehicle.vehicle_full_glass as boolean);\n }\n if (vehicle.vehicle_loan_lease !== null && vehicle.vehicle_loan_lease !== undefined) {\n vehicleValues.vehicle_loan_lease = convertBooleanToYesNo(vehicle.vehicle_loan_lease as boolean);\n }\n\n // Vehicle coverages\n if (vehicle.coverages && vehicle.coverages.length > 0) {\n vehicleValues.coverages__items = vehicle.coverages.map((coverage) => {\n const coverageValues: FormValues = {};\n if (coverage.type) coverageValues.type = coverage.type;\n if (coverage.per_person_limit_cents !== null && coverage.per_person_limit_cents !== undefined) {\n coverageValues.per_person_limit_cents = coverage.per_person_limit_cents;\n }\n if (coverage.per_incident_limit_cents !== null && coverage.per_incident_limit_cents !== undefined) {\n coverageValues.per_incident_limit_cents = coverage.per_incident_limit_cents;\n }\n if (coverage.per_incident_limit_percent !== null && coverage.per_incident_limit_percent !== undefined) {\n coverageValues.per_incident_limit_percent = coverage.per_incident_limit_percent;\n }\n if (coverage.per_day_limit_cents !== null && coverage.per_day_limit_cents !== undefined) {\n coverageValues.per_day_limit_cents = coverage.per_day_limit_cents;\n }\n if (coverage.deductible_cents !== null && coverage.deductible_cents !== undefined) {\n coverageValues.deductible_cents = coverage.deductible_cents;\n }\n if (coverage.is_declined !== null && coverage.is_declined !== undefined) {\n coverageValues.is_declined = convertBooleanToYesNo(coverage.is_declined);\n }\n return coverageValues;\n });\n }\n\n // Vehicle lienholders\n if (vehicle.vehicle_lienholders && vehicle.vehicle_lienholders.length > 0) {\n vehicleValues.vehicle_lienholders__items = vehicle.vehicle_lienholders.map((lienholder) => {\n const lienholderValues: FormValues = {};\n if (lienholder.name) lienholderValues.name = lienholder.name;\n if (lienholder.type) lienholderValues.type = lienholder.type;\n if (lienholder.line_1) lienholderValues.line_1 = lienholder.line_1;\n if (lienholder.line_2) lienholderValues.line_2 = lienholder.line_2;\n if (lienholder.city) lienholderValues.city = lienholder.city;\n if (lienholder.state) lienholderValues.state = lienholder.state;\n if (lienholder.postal_code) lienholderValues.postal_code = lienholder.postal_code;\n if (lienholder.phone) lienholderValues.phone = lienholder.phone;\n if (lienholder.fax) lienholderValues.fax = lienholder.fax;\n return lienholderValues;\n });\n }\n\n return vehicleValues;\n });\n } else {\n formValues.vehicles = 'No';\n }\n\n // Home losses array -> home_losses__items\n if (quote.losses && quote.losses.length > 0) {\n formValues.home_losses = 'Yes';\n formValues.home_losses__items = quote.losses.map((loss) => {\n const lossValues: FormValues = {};\n if (loss.description) lossValues.description = loss.description;\n if (loss.date_of_incident) lossValues.date_of_incident = formatDate(loss.date_of_incident);\n if (loss.amount_paid_cents !== null && loss.amount_paid_cents !== undefined) {\n lossValues.amount_paid_cents = loss.amount_paid_cents;\n }\n return lossValues;\n });\n }\n\n return formValues;\n}\n","import { useEffect, useCallback, useState } from 'react';\n\nimport type { GetRatesResponse, Question, Stage } from '@getcredify/credify-insurance-types';\n\nimport { FormWizard, Rates } from './index';\n\nimport type { StageMeta, FormValues } from '../utils/form';\nimport {\n createQuote,\n getQuestionsByStage,\n getRates,\n getStagesForQuote,\n isSupportedState,\n setAuthToken,\n updateQuote,\n verifyQuote,\n getQuote,\n loadAuthTokenFromStorage,\n getAuthToken,\n clearAuthToken\n} from '../utils/api';\nimport { loadQuoteId, saveQuoteId, clearQuoteId } from '../utils/storage';\nimport { quoteToFormValues } from '../utils/quoteToFormValues';\nimport { pushWidgetOpened, pushWidgetClosed, pushFlowCompleted, pushRatesViewed, pushStageCompleted } from '../utils/gtm';\nimport { normalizeDriverEducationLevelValue, normalizeDriverIndustryValue, normalizeDriverOccupationValue } from '../utils/driver-option-normalizers';\n\nconst FLOW_RESHAPING_STAGES: ReadonlySet<Stage> = new Set(['Product', 'State', 'Driver', 'Vehicle']);\n\nfunction getDriverCountForStageVisibility(values: FormValues | null | undefined): number | null {\n if (!values) return null;\n if (Array.isArray(values.drivers__items)) return values.drivers__items.length;\n if (Array.isArray(values.drivers)) return values.drivers.length;\n return null;\n}\n\nfunction applyAutoPolicyStageVisibility(stageMetas: StageMeta[], values: FormValues | null | undefined): StageMeta[] {\n const driverCount = getDriverCountForStageVisibility(values);\n if (driverCount === 1) {\n const filtered = stageMetas.filter((stage) => stage.key !== 'AutoPolicy');\n // Never leave the wizard with zero stages; fallback to original list.\n return filtered.length > 0 ? filtered : stageMetas;\n }\n return stageMetas;\n}\n\nfunction transformFormValues(values: FormValues): FormValues {\n const transformed: FormValues = {};\n\n // Helper function to convert \"Yes\"/\"No\" to boolean\n const convertYesNoToBoolean = (value: unknown): unknown => {\n if (typeof value === 'string') {\n if (value === 'Yes') return true;\n if (value === 'No') return false;\n }\n return value;\n };\n\n // Get all non-__items keys to determine which fields are in the current stage\n const nonItemsKeys = Object.keys(values).filter((key) => !key.includes('__items'));\n\n // Get all field names that exist within any __items arrays\n const fieldsInArrays = new Set<string>();\n // Track keys that have a corresponding __items array so we don't overwrite the\n // transformed array with the raw radio/select value (e.g. drivers: 'Yes').\n const keysWithItemsArrays = new Set<string>();\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items') && Array.isArray(value)) {\n keysWithItemsArrays.add(key.replace('__items', ''));\n value.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n Object.keys(item).forEach((fieldName) => {\n fieldsInArrays.add(fieldName);\n });\n }\n });\n }\n }\n\n for (const [key, value] of Object.entries(values)) {\n if (key.endsWith('__items')) {\n // Convert \"drivers__items\" to \"drivers\" with the array value\n const baseKey = key.replace('__items', '');\n\n // Only include this array if there's a corresponding root-level field with the same name\n // This indicates the array is actively being used in the current stage\n const hasCorrespondingRootField = nonItemsKeys.includes(baseKey);\n\n if (hasCorrespondingRootField) {\n // Recursively transform each item in the array\n const transformedArray = Array.isArray(value) ? value.map((item) => transformFormValues(item as FormValues)) : value;\n transformed[baseKey] = transformedArray;\n }\n } else if (!key.includes('__items')) {\n // Skip root-level keys whose value has been replaced by a __items array\n // (e.g. drivers: 'Yes' must not overwrite the drivers array from drivers__items)\n if (keysWithItemsArrays.has(key)) continue;\n // Include root-level fields that don't exist in any array items\n // This prevents including fields from previous stages that are now represented in arrays\n if (!fieldsInArrays.has(key)) {\n transformed[key] = convertYesNoToBoolean(value);\n }\n }\n // Skip any other __items related keys that we've already processed\n }\n\n // Derive the prior-insurance boolean from carrier selection while keeping\n // the carrier value so user input is persisted in DB.\n const selectedCarrier = transformed.auto_prior_carrier_name;\n if (typeof selectedCarrier === 'string' && selectedCarrier.trim() !== '') {\n transformed.auto_has_prior_insurance = selectedCarrier === 'NoPriorInsurance' ? false : true;\n }\n\n if (Array.isArray(transformed.drivers)) {\n transformed.drivers = transformed.drivers.map((driver) => {\n if (!driver || typeof driver !== 'object') return driver;\n const item = { ...(driver as Record<string, unknown>) };\n item.industry = normalizeDriverIndustryValue(item.industry);\n item.education_level = normalizeDriverEducationLevelValue(item.education_level);\n item.occupation = normalizeDriverOccupationValue(item.occupation);\n return item;\n });\n }\n\n console.log(\n '[DEBUG_TRANSFORM] transformed.drivers type:',\n typeof transformed.drivers,\n 'isArray:',\n Array.isArray(transformed.drivers),\n Array.isArray(transformed.drivers) ? `count=${transformed.drivers.length}` : `value=${JSON.stringify(transformed.drivers)?.slice(0, 100)}`\n );\n if (Array.isArray(transformed.drivers)) {\n transformed.drivers.forEach((d: unknown, i: number) => {\n const drv = d as Record<string, unknown>;\n console.log(`[DEBUG_TRANSFORM] Driver ${i}:`, {\n first_name: drv.first_name,\n gender: drv.gender,\n marital_status: drv.marital_status,\n education_level: drv.education_level,\n industry: drv.industry,\n occupation: drv.occupation,\n sr22: drv.sr22,\n keys: Object.keys(drv)\n });\n });\n }\n\n return transformed;\n}\n\nfunction getNextStageKey(stages: StageMeta[], stageKey: Stage): Stage {\n const currentStageIndex = stages.findIndex((s) => s.key === stageKey);\n if (currentStageIndex < 0) return stageKey;\n const nextStage = stages[currentStageIndex + 1];\n return (nextStage?.key as Stage | undefined) ?? stageKey;\n}\n\nfunction ensureAutoCurrentPolicyRequiredQuestions(stage: Stage, questions: Question[]): Question[] {\n if (stage !== 'AutoCurrentCarrier') return questions;\n\n const hasCancellationQuestion = questions.some((q) => String(q.key) === 'auto_cancelled_declined_refused_to_renew');\n if (hasCancellationQuestion) return questions;\n\n return [\n ...questions,\n {\n question: 'Has any auto insurance company cancelled, declined or refused to renew you in the last 5 years?',\n inputType: 'radio',\n options: ['Yes', 'No'],\n key: 'auto_cancelled_declined_refused_to_renew',\n required: true\n }\n ];\n}\n\nfunction ensureVehicleVinOptional(stage: Stage, questions: Question[]): Question[] {\n if (stage !== 'Vehicle') return questions;\n\n const patch = (list: Question[]): Question[] =>\n list.map((q) => {\n const nextConditionals = q.conditionals?.map((c) => {\n const nested = (c.conditionalQuestions ?? []) as unknown as Question[];\n if (!nested.length) return c;\n return {\n ...c,\n conditionalQuestions: patch(nested)\n };\n });\n\n if (String(q.key) !== 'vin') {\n return nextConditionals ? { ...q, conditionals: nextConditionals } : q;\n }\n\n return {\n ...q,\n required: false,\n ...(nextConditionals ? { conditionals: nextConditionals } : {})\n };\n });\n\n return patch(questions);\n}\n\nexport default function Widget({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }) {\n const [stages, setStages] = useState<StageMeta[]>([]);\n const [quoteId, setQuoteId] = useState<string | null>(null);\n const [rates, setRates] = useState<GetRatesResponse | null>(null);\n const [savedFormValues, setSavedFormValues] = useState<FormValues | null>(null);\n const [initialActiveStage, setInitialActiveStage] = useState<number | undefined>(undefined);\n const [isRestoringQuote, setIsRestoringQuote] = useState(false);\n\n function mapStagesToStageMetas(stages: Stage[]): StageMeta[] {\n // Map stage keys to human-friendly titles\n const stageTitleMap: Record<string, string> = {\n SMSVerification: 'Verify',\n AutoCurrentCarrier: 'Current Auto Policy',\n HomeCurrentCarrier: 'Current Home Policy',\n AutoPolicy: 'Policy'\n };\n\n return stages.map((stage) => ({\n key: stage,\n title: stageTitleMap[stage] || stage,\n loadQuestions: async () => {\n const data = await getQuestionsByStage(stage);\n const qs = ensureAutoCurrentPolicyRequiredQuestions(stage, data.questions);\n return ensureVehicleVinOptional(stage, qs);\n }\n }));\n }\n\n // Restore quote state on mount\n useEffect(() => {\n const restoreQuoteState = async () => {\n try {\n // Load quoteId and authToken from localStorage\n const storedQuoteId = loadQuoteId();\n loadAuthTokenFromStorage();\n\n if (storedQuoteId) {\n setIsRestoringQuote(true);\n setQuoteId(storedQuoteId);\n\n // Try to fetch quote data - use token if available, otherwise send quoteId in body\n try {\n const token = getAuthToken();\n const response = await getQuote(token ? undefined : storedQuoteId);\n\n if (!response || !response.quote) {\n throw new Error('Invalid response from getQuote: missing quote data');\n }\n\n const { quote } = response;\n\n // Find the stage index based on current_stage FIRST\n // This ensures we have the correct stages before setting form values\n const { stages: currentStages } = await getStagesForQuote();\n const stageMetas = mapStagesToStageMetas(currentStages);\n // Keep stage rendering resilient even if quote-to-form transformation fails.\n setStages(stageMetas);\n\n // Transform quote data to form values\n let formValues: FormValues;\n try {\n formValues = quoteToFormValues(quote);\n setSavedFormValues(formValues);\n } catch (transformError) {\n throw new Error(`Failed to transform quote data: ${transformError instanceof Error ? transformError.message : 'Unknown error'}`);\n }\n\n const visibleStageMetas = applyAutoPolicyStageVisibility(stageMetas, formValues);\n setStages(visibleStageMetas);\n\n // Set the initial active stage based on current_stage\n if (quote.current_stage) {\n const stageIndex = visibleStageMetas.findIndex((s) => s.key === quote.current_stage);\n if (stageIndex >= 0) {\n setInitialActiveStage(stageIndex);\n } else {\n // If current_stage not found, default to last stage\n setInitialActiveStage(visibleStageMetas.length - 1);\n }\n } else {\n // If no current_stage, default to last stage\n setInitialActiveStage(visibleStageMetas.length - 1);\n }\n } catch (error) {\n // If quote fetch fails, check if it's a 404 (quote not found)\n const apiError = error as Error & { statusCode?: number };\n if (apiError.statusCode === 404) {\n // Quote doesn't exist - clear invalid quoteId and let user start fresh\n clearQuoteId();\n setQuoteId(null);\n } else {\n // Other errors (e.g., token expired) - clear token but keep quoteId\n clearAuthToken();\n // Don't clear quoteId - user can continue and verify SMS again\n }\n } finally {\n setIsRestoringQuote(false);\n }\n } else {\n // No quote to restore, fetch default stages\n const { stages: defaultStages } = await getStagesForQuote();\n setStages(mapStagesToStageMetas(defaultStages));\n }\n } catch {\n // Silently handle restore errors\n setIsRestoringQuote(false);\n }\n };\n\n if (isOpen) {\n restoreQuoteState();\n }\n }, [isOpen]);\n\n // Lock background scroll\n useEffect(() => {\n if (!isOpen) return;\n const { overflow } = document.body.style;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = overflow;\n };\n }, [isOpen]);\n\n // Close on Escape\n const onKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n pushWidgetClosed();\n onClose();\n }\n },\n [onClose]\n );\n useEffect(() => {\n if (!isOpen) return;\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [isOpen, onKeyDown]);\n\n // Clear saved form values and reset state when widget closes\n useEffect(() => {\n if (!isOpen) {\n setSavedFormValues(null);\n setInitialActiveStage(undefined);\n setIsRestoringQuote(false);\n }\n }, [isOpen]);\n\n // GTM: widget opened\n useEffect(() => {\n if (isOpen) pushWidgetOpened();\n }, [isOpen]);\n\n // GTM: rates viewed\n useEffect(() => {\n if (rates && Array.isArray(rates)) pushRatesViewed({ rateCount: rates.length });\n }, [rates]);\n\n if (!isOpen) return null;\n\n const handleClose = () => {\n pushWidgetClosed();\n onClose();\n };\n\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"insurance-modal-title\">\n <div className=\"backdrop\" aria-hidden=\"true\" />\n\n <div className=\"modal-panel bg-white relative w-full max-w-2xl flex flex-col max-h-[90vh] overflow-hidden\" role=\"document\">\n <button\n onClick={handleClose}\n className=\"modal-close-btn absolute top-4 right-4 text-slate-400 hover:text-slate-600 text-xl\"\n aria-label=\"Close\"\n type=\"button\"\n >\n ×\n </button>\n\n <div className=\"text-center mb-6\">\n <h2 id=\"insurance-modal-title\" className=\"h1-title\">\n Let's get you the best insurance rates.\n </h2>\n <p className=\"p-subtitle\">This should only take a few minutes.</p>\n </div>\n\n {/* The ONLY scrollable area */}\n <div className=\"panel-body flex-1 min-h-0 overflow-y-auto\">\n {!rates && (\n <>\n {isRestoringQuote || stages.length === 0 ? (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"text-slate-600\">Loading...</div>\n </div>\n ) : (\n <FormWizard\n stages={stages}\n initialValues={savedFormValues ?? undefined}\n initialActive={initialActiveStage}\n onStageComplete={async (stageValues, stageKey) => {\n try {\n const transformedValues = transformFormValues(stageValues);\n\n let stageMetas = stages;\n\n const currentStageIndex = stageMetas.findIndex((s) => s.key === stageKey);\n const currentMeta = stageMetas[currentStageIndex];\n const nextStageKey = getNextStageKey(stageMetas, stageKey as Stage);\n\n if (!quoteId) {\n const createQuoteResponse = await createQuote(transformedValues.phone as string);\n const newQuoteId = createQuoteResponse?.quoteId;\n if (!newQuoteId || typeof newQuoteId !== 'string' || newQuoteId.trim() === '') {\n throw new Error(`Failed to create quote - invalid quoteId returned: ${newQuoteId}`);\n }\n setQuoteId(newQuoteId);\n saveQuoteId(newQuoteId);\n // Save next stage as current_stage after creating quote (no token yet, so pass quoteId)\n await updateQuote({ current_stage: nextStageKey }, false, newQuoteId);\n } else if (stageKey === 'SMSVerification') {\n const { isVerified, token } = await verifyQuote(quoteId, transformedValues.sms_code as string);\n if (!isVerified) {\n throw new Error('Invalid SMS code');\n }\n if (token) {\n setAuthToken(token);\n }\n // Save next stage as current_stage after SMS verification (now we have a token)\n await updateQuote({ current_stage: nextStageKey }, false);\n } else if (stageKey === 'State') {\n const { isSupported } = await isSupportedState(transformedValues.state as string);\n if (!isSupported) {\n throw new Error('State is not supported');\n }\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId);\n } else {\n // Include next stage as current_stage in the payload\n // Pass quoteId if we have it but no token (for pre-verification stages)\n const token = getAuthToken();\n await updateQuote({ ...transformedValues, current_stage: nextStageKey }, false, token ? undefined : quoteId || undefined);\n }\n\n // Refresh stage flow after persisting flow-shaping answers so next navigation uses latest backend state.\n if (FLOW_RESHAPING_STAGES.has(stageKey as Stage)) {\n try {\n const { stages: newStages } = await getStagesForQuote();\n stageMetas = mapStagesToStageMetas(newStages);\n stageMetas = applyAutoPolicyStageVisibility(stageMetas, stageValues);\n setStages(stageMetas);\n } catch (stageRefreshError) {\n // Do not block stage persistence if stage metadata refresh fails.\n console.warn('Unable to refresh stages after flow-shaping step', stageRefreshError);\n }\n }\n\n pushStageCompleted({\n stageKey,\n stageTitle: currentMeta?.title ?? stageKey,\n stepIndex: currentStageIndex + 1,\n totalSteps: stageMetas.length\n });\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n onComplete={async (allValues) => {\n try {\n const transformedValues = transformFormValues(allValues);\n\n if (!quoteId) {\n throw new Error('Quote ID is required');\n }\n await updateQuote(transformedValues, true);\n\n // Save form values so we can restore them when going back\n setSavedFormValues(allValues);\n\n const { rates } = await getRates();\n setRates(rates);\n\n const totalSteps = stages.length;\n const lastStage = stages[totalSteps - 1];\n pushStageCompleted({\n stageKey: lastStage?.key ?? 'unknown',\n stageTitle: lastStage?.title ?? 'unknown',\n stepIndex: totalSteps,\n totalSteps\n });\n pushFlowCompleted();\n return { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'An error occurred' };\n }\n }}\n />\n )}\n </>\n )}{' '}\n {rates && quoteId && <Rates rates={rates} onBack={() => setRates(null)} />}\n </div>\n\n {/* Footer */}\n <div className=\"mt-4 pt-4 border-t border-slate-200\">\n <p className=\"text-center text-sm text-slate-500\">Insurance products offered through Credify Corporation, a licensed insurance agency.</p>\n </div>\n </div>\n </div>\n );\n}\n","import Widget from '../components/Widget';\nimport CredifyInsuranceWidget from '../widget';\n\nexport default function WidgetController({ isOpen }: { isOpen: boolean }) {\n return (\n <Widget\n isOpen={isOpen}\n onClose={() => {\n CredifyInsuranceWidget.close();\n }}\n />\n );\n}\n","/* @refresh skip */\nimport { createElement } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport WidgetController from './internal/WidgetController';\nimport './index.css';\n// CSS is injected at runtime by vite-plugin-css-injected-by-js so the widget always has its styles on any host.\n\ntype InitOptions = { autoOpen?: boolean };\n\nlet container: HTMLDivElement | null = null;\nlet root: Root | null = null;\nlet isOpen = false;\n\nfunction ensureRoot() {\n if (!container) {\n container = document.createElement('div');\n container.id = 'insurance-widget-root';\n // Mount on documentElement so host transforms/filters on body don't make\n // our fixed overlay position relative to body (which would look inline).\n document.documentElement.appendChild(container);\n }\n if (!root && container) {\n root = createRoot(container);\n }\n}\n\nfunction render() {\n ensureRoot();\n if (root) {\n root.render(createElement(WidgetController, { isOpen })); // ⬅️ controlled prop\n }\n}\n\nfunction destroy() {\n if (root && container) {\n root.unmount();\n container.remove();\n }\n root = null;\n container = null;\n}\n\nexport interface CredifyInsuranceWidgetAPI {\n init(options?: InitOptions): void;\n open(): void;\n close(): void;\n destroy(): void;\n}\n\nexport const CredifyInsuranceWidget: CredifyInsuranceWidgetAPI = {\n init: (options) => {\n isOpen = !!options?.autoOpen; // default false\n render();\n },\n open: () => {\n isOpen = true;\n render();\n },\n close: () => {\n isOpen = false;\n render();\n },\n destroy\n};\n\n// expose globally for script-tag usage\ndeclare global {\n interface Window {\n CredifyInsuranceWidget?: CredifyInsuranceWidgetAPI;\n }\n}\nif (typeof window !== 'undefined') window.CredifyInsuranceWidget = CredifyInsuranceWidget;\n\nexport default CredifyInsuranceWidget;\n"],"names":["Field","id","label","hint","error","required","className","children","jsxs","jsx","TextInput","rest","NumericInput","EmailInput","formatPhoneNumber","value","digits","tenDigits","extractDigits","TelInput","onChange","displayValue","setDisplayValue","useState","inputRef","useRef","cursorPositionRef","useEffect","limitedDigits","handleChange","e","input","inputValue","formatted","rawValue","syntheticEvent","beforeCursor","digitsBeforeCursor","formattedBeforeCursor","newPosition","UrlInput","PasswordInput","TextArea","rows","DateInput","Checkbox","Radio","name","checked","RadioGroup","legend","legendClassName","SelectInput","placeholder","options","describedBy","hasCustomChildren","opt","GOOGLE_MAPS_API_KEY","loadGoogleMapsScript","resolve","reject","existingScript","script","extractAddressComponents","place","components","component","types","AddressAutocomplete","onPlaceSelect","autocompleteServiceRef","placesServiceRef","suggestionsContainerRef","isLoading","setIsLoading","setInputValue","suggestions","setSuggestions","showSuggestions","setShowSuggestions","selectedIndex","setSelectedIndex","suggestionsRef","showSuggestionsRef","selectedIndexRef","debounceTimerRef","isMounted","err","handleInputChange","query","predictions","status","handleKeyDown","prev","newIndex","handleSuggestionClick","handleClickOutside","event","prediction","formattedAddress","addressComponents","index","slugify","s","ensureKey","q","idx","validateQuestions","questions","values","errors","isBlank","v","i","key","val","coerceNumber","n","BOLT_AUTO_PRIOR_CARRIER_LABELS","BOLT_TYPE_OF_RESIDENCE_LABELS","BOLT_HOME_PRIOR_CARRIER_LABELS","BOLT_VEHICLE_PRIMARY_USE_LABELS","BOLT_PRIOR_LIABILITY_LIMIT_LABELS","BOLT_NO_PRIOR_AUTO_INSURANCE_REASON_LABELS","BOLT_POLICY_BI_LABELS","BOLT_POLICY_UM_LABELS","BOLT_POLICY_PD_LABELS","BOLT_POLICY_MP_LABELS","BOLT_POLICY_UMPD_LABELS","BOLT_POLICY_PIP_LABELS","BOLT_POLICY_AUTO_DEATH_INDEMNITY_LABELS","BOLT_VEHICLE_COMP_COLL_DEDUCTIBLE_LABELS","BOLT_VEHICLE_TOWING_AND_LABOR_LABELS","BOLT_VEHICLE_TRANSPORTATION_EXPENSE_LABELS","BOLT_DRIVER_EDUCATION_LEVEL_LABELS","BOLT_DRIVER_INDUSTRY_LABELS","BOLT_DRIVER_OCCUPATIONS_BY_INDUSTRY","BOLT_DRIVER_OCCUPATION_LABELS_FROM_BOLT","normalizeByLabelMap","labelsByKey","raw","lowered","k","normalizeDriverIndustryValue","normalizeDriverEducationLevelValue","normalizeDriverOccupationValue","normalizeText","text","parseDateOnly","match","year","month","day","dt","resolveAutoCoverageConditionKeys","currentCarrierKey","effectiveDateKey","expirationDateKey","noInsuranceReasonKeys","hideWhenNoPriorInsuranceKeys","prompt","shouldRequireNoInsuranceReason","keys","expiration","effective","shouldShowNoInsuranceReason","question","hasNoPriorInsurance","isNoInsuranceReasonQuestion","BOLT_VEHICLE_MAKE_OPTIONS","BOLT_VEHICLE_MODELS_BY_YEAR_BY_MAKE","BOLT_VEHICLE_BODY_STYLES_BY_YEAR_BY_MAKE_BY_MODEL","normalizeVehicleToken","resolveKeyInRecord","norm","record","yearsWithModelData","byYear","y","a","b","hasModelsForMake","data","yStr","makeNorm","byMake","makeKey","list","resolveModelYearKey","years","yNum","best","bestDist","d","lookupBodyStyles","modelNorm","byModel","modelKey","resolveBodyStyleYearKey","getVehicleModelOptions","yearValue","makeValue","resolvedYear","getVehicleBodyStyleOptions","modelValue","OPTION_DISPLAY_LABELS","OPTION_DISPLAY_LABELS_BY_KEY","VEHICLE_MODEL_FALLBACK_OPTIONS","VEHICLE_BODY_STYLE_FALLBACK_OPTIONS","DRIVER_OCCUPATION_FALLBACK_OPTIONS","toDateInputValue","coerceDigitsOnlyNumber","digitsOnly","isDisallowedNumberKey","getDateInputMinByKey","tomorrow","isImplicitYesRepeatableQuestion","c","getEffectiveQuestionValue","toNumber","x","toTime","t","cmp","na","nb","ta","tb","contains","haystack","needle","evalConditional","qValue","conditionalType","conditionalValue","getIn","obj","path","acc","setInImmutable","head","tail","arr","current","nextContainer","next","scopedRead","scope","scopedWrite","scopedFieldId","scopePath","ITEMS_SUFFIX","itemsKey","decorateKeys","walk","pathParts","qi","parentPart","baseKey","nextConds","ci","nested","asTextValue","asNumberValue","asSelectValue","FormRenderer","initialValues","controlledValues","onChangeValues","onSubmit","keyedQuestions","useMemo","autoCoverageKeys","initialUncontrolled","uncontrolled","setUncontrolled","localShadow","setLocalShadow","p","setErrors","nextAll","changed","renderOne","itemIdx","set","conds","cond","currentValue","wasActive","willBeActive","arrStorageKey","clearNestedArrays","questionList","currentScope","childQ","childCond","nestedArrKey","grandChildren","vehicles","drivers","assignments","updateAssignment","vIdx","dIdx","pct","vKey","getVehicleValidationError","vAssignments","pcts","_","nonZero","total","vLabel","validationError","dLabel","pctVal","Fragment","dateMin","dateError","dob","dobDate","min16","licDate","idOpt","opts","scopedName","selectedYear","selectedMake","selectedModel","selectedIndustry","fieldId","nextValue","o","address","renderRecursive","qIndex","elem","matches","branches","branch","bi","count","pushEmpty","popLast","nextArr","groupIdBase","itemScope","groupId","itemValues","isDriverGroup","entryLabel","ssnSuffix","childConds","childVal","childMatches","m","bc","bci","nestedArr","nestedCount","nestedPush","nestedPop","__","nIdx","nestedScope","visibleFlat","out","handleSubmit","dynamicRequired","validationQuestions","eMap","firstIdx","GTM_CONTAINER_ID","getDataLayer","pushDataLayerEvent","eventName","payload","pushWidgetOpened","pushWidgetClosed","pushStageViewed","pushStageCompleted","pushFlowCompleted","pushRatesViewed","pushRatesBack","type","rhs","flattenVisibleQuestions","root","child","shouldSkipRequiredValidation","validateRepeatablesRecursive","valuesAtScope","qKey","qVal","item","itemScopePath","visibleChildren","itemErrors","hasRepeatableBlockingErrors","rootValues","FormWizard","stages","onStageComplete","onComplete","initialActive","active","setActive","allValues","setAllValues","perStageQuestions","setPerStageQuestions","loading","setLoading","isSubmitting","setIsSubmitting","stageError","setStageError","stepRefs","latestStagesRef","hasStages","stage","stageKey","activeElement","cancelled","qs","currentValues","slice","kItems","updateCurrentValues","goPrev","goNext","visible","flatErrors","flatBlock","repeatBlock","dva","dvaDrivers","dvaBlock","vi","vAssign","di","isComplete","success","latestStages","latestCurrentIndex","latestNextIndex","disableNext","el","copy","QUOTE_ID_KEY","AUTH_TOKEN_KEY","saveQuoteId","quoteId","loadQuoteId","clearQuoteId","saveAuthToken","token","loadAuthToken","clearAuthToken","clearAllQuoteData","BASE_URL","authToken","setAuthToken","getAuthToken","loadAuthTokenFromStorage","storedToken","clearAuthTokenStorage","makeAuthenticatedRequest","url","body","headers","response","errorMessage","getQuestionsByStage","getStagesForQuote","createQuote","phone","updateQuote","getRates","verifyQuote","smsCode","isSupportedState","state","getQuote","requestBind","quoteRateId","currencyFormatter","BackButton","onBack","Rates","rates","hasRates","requestStatuses","setRequestStatuses","rate","premiumDollars","formattedPremium","cardKey","isRequesting","isRequested","handleRequestBind","convertBooleanToYesNo","formatDate","date","quoteToFormValues","quoteRaw","quote","formValues","addressParts","priorAddressParts","vehicleIdToVin","driverRaw","driver","driverValues","ssnDisplay","driverViolations","violation","violationValues","driverAccidents","accident","accidentValues","driverLosses","loss","lossValues","vehicleRaw","vehicle","vehicleValues","garagingAddressParts","coverage","coverageValues","lienholder","lienholderValues","FLOW_RESHAPING_STAGES","getDriverCountForStageVisibility","applyAutoPolicyStageVisibility","stageMetas","filtered","transformFormValues","transformed","convertYesNoToBoolean","nonItemsKeys","fieldsInArrays","keysWithItemsArrays","fieldName","transformedArray","selectedCarrier","drv","getNextStageKey","currentStageIndex","ensureAutoCurrentPolicyRequiredQuestions","ensureVehicleVinOptional","patch","nextConditionals","Widget","isOpen","onClose","setStages","setQuoteId","setRates","savedFormValues","setSavedFormValues","initialActiveStage","setInitialActiveStage","isRestoringQuote","setIsRestoringQuote","mapStagesToStageMetas","stageTitleMap","storedQuoteId","currentStages","transformError","visibleStageMetas","stageIndex","defaultStages","overflow","onKeyDown","useCallback","stageValues","transformedValues","currentMeta","nextStageKey","isVerified","isSupported","newQuoteId","newStages","stageRefreshError","totalSteps","lastStage","WidgetController","CredifyInsuranceWidget","container","ensureRoot","createRoot","render","createElement","destroy"],"mappings":";;;;;;;AAYO,SAASA,GAAM,EAAE,IAAAC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,UAAAC,KAAwB;AAC3F,SACE,gBAAAC,EAAC,SAAI,WAAAF,GACH,UAAA;AAAA,IAAA,gBAAAE,EAAC,SAAA,EAAM,SAASP,GAAI,WAAU,cAC3B,UAAA;AAAA,MAAAC;AAAA,MAAM;AAAA,MAAEG,KAAY,gBAAAI,EAAC,QAAA,EAAK,WAAU,gBAAe,UAAA,IAAA,CAAC;AAAA,IAAA,GACvD;AAAA,IACCF;AAAA,IACAJ,KAAQ,CAACC,KACR,gBAAAK,EAAC,KAAA,EAAE,IAAI,GAAGR,CAAE,SAAS,WAAU,+BAC5B,UAAAE,EAAA,CACH;AAAA,IAEDC,uBACE,KAAA,EAAE,IAAI,GAAGH,CAAE,UAAU,WAAU,6BAC7B,UAAAG,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AC1BO,SAASM,GAAU,EAAE,IAAAT,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AACzF,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,MACJ,MAAK;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;ACdO,SAASC,GAAa,EAAE,IAAAX,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AAC5F,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACdO,SAASE,GAAW,EAAE,IAAAZ,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AAC1F,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,WAAU;AAAA,MACV,cAAa;AAAA,MACb,UAAAC;AAAA,MACA,gBAAc,CAAC,CAACD;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MACzG,GAAGU;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACPA,SAASG,GAAkBC,GAAuB;AAEhD,QAAMC,IAASD,EAAM,QAAQ,OAAO,EAAE;AAGtC,MAAIC,EAAO,WAAW;AACpB,WAAO,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAO,MAAM,GAAG,CAAC,CAAC,MAAMA,EAAO,MAAM,CAAC,CAAC;AAI3E,MAAIA,EAAO,SAAS,IAAI;AACtB,UAAMC,IAAYD,EAAO,MAAM,GAAG,EAAE;AACpC,WAAO,IAAIC,EAAU,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAU,MAAM,GAAG,CAAC,CAAC,MAAMA,EAAU,MAAM,CAAC,CAAC;AAAA,EACpF;AAGA,SAAID,EAAO,UAAU,IACZ,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAO,MAAM,GAAG,CAAC,CAAC,MAAMA,EAAO,MAAM,CAAC,CAAC,KAEvEA,EAAO,UAAU,IACZ,IAAIA,EAAO,MAAM,GAAG,CAAC,CAAC,KAAKA,EAAO,MAAM,CAAC,CAAC,KAE/CA,EAAO,SAAS,IACX,IAAIA,CAAM,KAGZA;AACT;AAKA,SAASE,GAAcH,GAAuB;AAC5C,SAAOA,EAAM,QAAQ,OAAO,EAAE;AAChC;AAEO,SAASI,GAAS,EAAE,IAAAlB,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,OAAAS,IAAQ,IAAI,UAAAK,GAAU,GAAGT,KAAe;AAC9G,QAAM,CAACU,GAAcC,CAAe,IAAIC,EAAS,EAAE,GAC7CC,IAAWC,EAAyB,IAAI,GACxCC,IAAoBD,EAAe,CAAC;AAG1C,EAAAE,EAAU,MAAM;AACd,QAAI,CAACZ,GAAO;AACV,MAAAO,EAAgB,EAAE;AAClB;AAAA,IACF;AAGA,QAAIN,IAASE,GAAcH,CAAK;AAGhC,IAAIC,EAAO,WAAW,MAAMA,EAAO,WAAW,GAAG,MAC/CA,IAASA,EAAO,MAAM,CAAC;AAIzB,UAAMY,IAAgBZ,EAAO,MAAM,GAAG,EAAE;AACxC,IAAAM,EAAgBR,GAAkBc,CAAa,CAAC;AAAA,EAClD,GAAG,CAACb,CAAK,CAAC;AAEV,QAAMc,IAAe,CAACC,MAAqC;AACzD,UAAMC,IAAQD,EAAE,QACVE,IAAaD,EAAM;AAGzB,IAAAL,EAAkB,UAAUK,EAAM,kBAAkB;AAMpD,UAAMH,IAHSV,GAAcc,CAAU,EAGV,MAAM,GAAG,EAAE,GAGlCC,IAAYnB,GAAkBc,CAAa;AACjD,IAAAN,EAAgBW,CAAS;AAIzB,UAAMC,IAAWN,EAAc,WAAW,KAAK,KAAKA,CAAa,KAAKA,GAGhEO,IAAiB;AAAA,MACrB,GAAGL;AAAA,MACH,eAAe;AAAA,QACb,GAAGA,EAAE;AAAA,QACL,OAAOI;AAAA,MAAA;AAAA,MAET,QAAQ;AAAA,QACN,GAAGJ,EAAE;AAAA,QACL,OAAOI;AAAA,MAAA;AAAA,IACT;AAIF,IAAAd,IAAWe,CAAc,GAGzB,WAAW,MAAM;AACf,UAAIX,EAAS,SAAS;AAEpB,cAAMY,IAAeJ,EAAW,MAAM,GAAGN,EAAkB,OAAO,GAC5DW,IAAqBnB,GAAckB,CAAY,GAC/CE,IAAwBxB,GAAkBuB,CAAkB,GAE5DE,IAAc,KAAK,IAAID,EAAsB,QAAQL,EAAU,MAAM;AAC3E,QAAAT,EAAS,QAAQ,kBAAkBe,GAAaA,CAAW;AAAA,MAC7D;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAEA,2BACGvC,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,2FACTJ,IAAQ,yBAAyB,yEACnC;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAK;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASR;AAAA,YACT,WAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAKe;AAAA,YACL,IAAAvB;AAAA,YACA,MAAK;AAAA,YACL,WAAW,2GACTG,IAAQ,gBAAgB,EAC1B;AAAA,YACA,WAAU;AAAA,YACV,cAAa;AAAA,YACb,UAAAC;AAAA,YACA,gBAAc,CAAC,CAACD;AAAA,YAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,YAC1G,OAAOoB;AAAA,YACP,UAAUQ;AAAA,YACT,GAAGlB;AAAA,UAAA;AAAA,QAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;ACzJO,SAAS6B,GAAS,EAAE,IAAAvC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AACxF,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,WAAU;AAAA,MACV,cAAa;AAAA,MACb,UAAAC;AAAA,MACA,gBAAc,CAAC,CAACD;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MACzG,GAAGU;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;AChBO,SAAS8B,GAAc,EAAE,IAAAxC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AAC7F,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,cAAa;AAAA,MACb,UAAAC;AAAA,MACA,gBAAc,CAAC,CAACD;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MACzG,GAAGU;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACfO,SAAS+B,GAAS,EAAE,IAAAzC,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,MAAAqC,IAAO,GAAG,GAAGhC,EAAA,GAAe;AAClG,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAA0C;AAAA,MACA,WAAW,cAAcvC,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACdO,SAASiC,GAAU,EAAE,IAAA3C,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,GAAGK,KAAe;AACzF,2BACGX,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAR;AAAA,MACA,MAAK;AAAA,MACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,MACnD,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAC1G,UAAAI;AAAA,MACC,GAAGM;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ;ACXO,SAASkC,GAAS,EAAE,IAAA5C,GAAI,OAAAC,GAAO,WAAAI,GAAW,GAAGK,KAAe;AACjE,SACE,gBAAAH,EAAC,WAAM,WAAW,iBAAiBF,KAAa,EAAE,IAAI,SAASL,GAC7D,UAAA;AAAA,IAAA,gBAAAQ,EAAC,WAAM,IAAAR,GAAQ,MAAK,YAAW,WAAU,kBAAkB,GAAGU,GAAM;AAAA,IACpE,gBAAAF,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAAP,EAAA,CAAM;AAAA,EAAA,GAC1C;AAEJ;ACbO,SAAS4C,GAAM;AAAA,EACpB,MAAAC;AAAA,EACA,OAAAhC;AAAA,EACA,SAAAiC;AAAA,EACA,UAAA5B;AAAA,EACA,UAAAb;AACF,GAMG;AACD,SACE,gBAAAC,EAAC,SAAA,EAAM,WAAU,cACf,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAA,EAAM,WAAU,eAAc,MAAK,SAAQ,MAAAsC,GAAY,OAAAhC,GAAc,SAAAiC,GAAkB,UAAA5B,EAAA,CAAoB;AAAA,IAC5G,gBAAAX,EAAC,QAAA,EAAK,WAAU,eAAe,UAAAF,EAAA,CAAS;AAAA,EAAA,GAC1C;AAEJ;AAEO,SAAS0C,GAAW;AAAA,EACzB,QAAAC;AAAA,EACA,UAAA3C;AAAA,EACA,WAAAD;AAAA,EACA,iBAAA6C;AACF,GAKG;AACD,SACE,gBAAA3C,EAAC,cAAS,WAAAF,GACR,UAAA;AAAA,IAAA,gBAAAG,EAAC,YAAO,WAAW,mBAAmB0C,KAAmB,EAAE,IAAK,UAAAD,GAAO;AAAA,IACvE,gBAAAzC,EAAC,OAAA,EAAI,WAAU,yCAAyC,UAAAF,EAAA,CAAS;AAAA,EAAA,GACnE;AAEJ;ACvBO,SAAS6C,GAAY,EAAE,IAAAnD,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,aAAA+C,GAAa,SAAAC,GAAS,UAAA/C,GAAU,GAAGI,KAAe;AAC3H,QAAM4C,IAAc,CAACpD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,QAEtGuD,IAAoB,CAAC,CAACjD;AAE5B,2BACGP,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAP;AAAA,MACA,WAAW,2BAA2BG,IAAQ,gBAAgB,EAAE;AAAA,MAChE,gBAAc,CAAC,CAACA;AAAA,MAChB,oBAAkBmD;AAAA,MAClB,UAAAlD;AAAA,MACC,GAAGM;AAAA,MAEH,UAAA;AAAA,QAAA0C,KACC,gBAAA5C,EAAC,UAAA,EAAO,OAAM,IAAG,UAAQ,IAAC,UAAU,EAAE,WAAWE,IAC9C,UAAA0C,EAAA,CACH;AAAA,QAGDG,IACGjD,IACA+C,GAAS,IAAI,CAACG,wBACX,UAAA,EAAuB,OAAOA,EAAI,OAAO,UAAUA,EAAI,UACrD,YAAI,MAAA,GADMA,EAAI,KAEjB,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAET;AAEJ;AC3CA,MAAMC,KAAsB;AAmB5B,SAASC,KAAsC;AAC7C,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AAEtC,QAAI,OAAO,QAAQ,MAAM,QAAQ;AAC/B,MAAAD,EAAA;AACA;AAAA,IACF;AAGA,UAAME,IAAiB,SAAS,cAAc,oCAAoC;AAClF,QAAIA,GAAgB;AAClB,MAAAA,EAAe,iBAAiB,QAAQ,MAAMF,EAAA,CAAS,GACvDE,EAAe,iBAAiB,SAAS,MAAMD,EAAO,IAAI,MAAM,mCAAmC,CAAC,CAAC;AACrG;AAAA,IACF;AAGA,UAAME,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,MAAM,+CAA+CL,EAAmB,qBAC/EK,EAAO,QAAQ,IACfA,EAAO,QAAQ,IACfA,EAAO,SAAS,MAAMH,EAAA,GACtBG,EAAO,UAAU,MAAMF,EAAO,IAAI,MAAM,mCAAmC,CAAC,GAC5E,SAAS,KAAK,YAAYE,CAAM;AAAA,EAClC,CAAC;AACH;AAGA,SAASC,GAAyBC,GAA0D;AAC1F,QAAMC,IAAgC;AAAA,IACpC,aAAaD,EAAM;AAAA,EAAA;AAGrB,SAAIA,EAAM,sBACRA,EAAM,mBAAmB,QAAQ,CAACE,MAAc;AAC9C,UAAMC,IAAQD,EAAU;AAExB,IAAIC,EAAM,SAAS,eAAe,MAChCF,EAAW,eAAeC,EAAU,YAElCC,EAAM,SAAS,OAAO,MACxBF,EAAW,aAAaC,EAAU,YAEhCC,EAAM,SAAS,UAAU,MAC3BF,EAAW,OAAOC,EAAU,YAE1BC,EAAM,SAAS,6BAA6B,MAC9CF,EAAW,QAAQC,EAAU,aAE3BC,EAAM,SAAS,aAAa,MAC9BF,EAAW,UAAUC,EAAU,YAE7BC,EAAM,SAAS,SAAS,MAC1BF,EAAW,UAAUC,EAAU;AAAA,EAEnC,CAAC,GAGID;AACT;AAEO,SAASG,GAAoB,EAAE,IAAApE,GAAI,OAAAC,GAAO,MAAAC,GAAM,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,UAAAc,GAAU,eAAAkD,GAAe,OAAAvD,GAAO,GAAGJ,KAAe;AACnI,QAAMa,IAAWC,EAAyB,IAAI,GACxC8C,IAAyB9C,EAAsD,IAAI,GACnF+C,IAAmB/C,EAAgD,IAAI,GACvEgD,IAA0BhD,EAAuB,IAAI,GACrD,CAACiD,GAAWC,CAAY,IAAIpD,EAAS,EAAI,GACzC,CAACS,GAAY4C,CAAa,IAAIrD,EAAUR,KAAoB,EAAE,GAC9D,CAAC8D,GAAaC,CAAc,IAAIvD,EAAsD,CAAA,CAAE,GACxF,CAACwD,GAAiBC,CAAkB,IAAIzD,EAAS,EAAK,GACtD,CAAC0D,GAAeC,CAAgB,IAAI3D,EAAS,EAAE,GAG/C4D,IAAiB1D,EAAoD,EAAE,GACvE2D,IAAqB3D,EAAO,EAAK,GACjC4D,IAAmB5D,EAAO,EAAE;AAGlC,EAAAE,EAAU,MAAM;AACd,IAAAwD,EAAe,UAAUN;AAAA,EAC3B,GAAG,CAACA,CAAW,CAAC,GAEhBlD,EAAU,MAAM;AACd,IAAAyD,EAAmB,UAAUL;AAAA,EAC/B,GAAG,CAACA,CAAe,CAAC,GAEpBpD,EAAU,MAAM;AACd,IAAA0D,EAAiB,UAAUJ;AAAA,EAC7B,GAAG,CAACA,CAAa,CAAC,GAElBtD,EAAU,MAAM;AAEd,IAAIZ,MAAU,UACZ6D,EAAc,OAAO7D,CAAK,CAAC;AAAA,EAE/B,GAAG,CAACA,CAAK,CAAC;AAGV,QAAMuE,IAAmB7D,EAA8B,IAAI;AAE3D,EAAAE,EAAU,MAAM;AACd,QAAI,CAACH,EAAS,QAAS;AAEvB,QAAI+D,IAAY;AAGhB,WAAA5B,GAAA,EACG,KAAK,MAAM;AACV,MAAI,CAAC4B,KAAa,CAAC/D,EAAS,YAG5B+C,EAAuB,UAAU,IAAI,OAAO,KAAK,OAAO,oBAAA,GACxDC,EAAiB,UAAU,IAAI,OAAO,KAAK,OAAO,cAAc,SAAS,cAAc,KAAK,CAAC,GAE7FG,EAAa,EAAK;AAAA,IACpB,CAAC,EACA,MAAM,CAACa,MAAQ;AACd,cAAQ,MAAM,8BAA8BA,CAAG,GAC/Cb,EAAa,EAAK;AAAA,IACpB,CAAC,GAEI,MAAM;AACX,MAAAY,IAAY,IACRD,EAAiB,WACnB,aAAaA,EAAiB,OAAO;AAAA,IAEzC;AAAA,EACF,GAAG,CAAA,CAAE;AAGL,QAAMG,IAAoB,CAAC3D,MAA2C;AACpE,UAAM4D,IAAQ5D,EAAE,OAAO;AASvB,QARA8C,EAAcc,CAAK,GACnBtE,IAAWsE,CAAK,GAGZJ,EAAiB,WACnB,aAAaA,EAAiB,OAAO,GAGnCI,EAAM,SAAS,GAAG;AACpB,MAAAZ,EAAe,CAAA,CAAE,GACjBE,EAAmB,EAAK;AACxB;AAAA,IACF;AAGA,IAAAM,EAAiB,UAAU,WAAW,MAAM;AAC1C,MAAKf,EAAuB,WAE5BA,EAAuB,QAAQ;AAAA,QAC7B;AAAA,UACE,OAAOmB;AAAA,UACP,OAAO,CAAC,SAAS;AAAA,QAAA;AAAA,QAEnB,CAACC,GAAaC,MAAW;AACvB,UAAIA,MAAW,OAAO,KAAK,OAAO,oBAAoB,MAAMD,KAC1Db,EAAea,CAAW,GAC1BX,EAAmB,EAAI,GACvBE,EAAiB,EAAE,MAEnBJ,EAAe,CAAA,CAAE,GACjBE,EAAmB,EAAK;AAAA,QAE5B;AAAA,MAAA;AAAA,IAEJ,GAAG,GAAG;AAAA,EACR,GAGMa,IAAgB,CAAC/D,MAA6C;AAClE,QAAI,CAACsD,EAAmB,WAAWD,EAAe,QAAQ,WAAW,GAAG;AACtE,MAAIrD,EAAE,QAAQ,aACZkD,EAAmB,EAAK,GACxBI,EAAmB,UAAU;AAE/B;AAAA,IACF;AAEA,YAAQtD,EAAE,KAAA;AAAA,MACR,KAAK;AACH,QAAAA,EAAE,eAAA,GACFoD,EAAiB,CAACY,MAAS;AACzB,gBAAMC,IAAWD,IAAOX,EAAe,QAAQ,SAAS,IAAIW,IAAO,IAAIA;AACvE,iBAAAT,EAAiB,UAAUU,GACpBA;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,QAAAjE,EAAE,eAAA,GACFoD,EAAiB,CAACY,MAAS;AACzB,gBAAMC,IAAWD,IAAO,IAAIA,IAAO,IAAI;AACvC,iBAAAT,EAAiB,UAAUU,GACpBA;AAAA,QACT,CAAC;AACD;AAAA,MACF,KAAK;AACH,QAAAjE,EAAE,eAAA,GACEuD,EAAiB,WAAW,KAAKA,EAAiB,UAAUF,EAAe,QAAQ,UACrFa,EAAsBb,EAAe,QAAQE,EAAiB,OAAO,CAAC;AAExE;AAAA,MACF,KAAK;AACH,QAAAvD,EAAE,eAAA,GACFkD,EAAmB,EAAK,GACxBI,EAAmB,UAAU;AAC7B;AAAA,IAAA;AAAA,EAEN;AAGA,EAAAzD,EAAU,MAAM;AACd,UAAMsE,IAAqB,CAACC,MAAsB;AAChD,MACEzB,EAAwB,WACxB,CAACA,EAAwB,QAAQ,SAASyB,EAAM,MAAc,KAC9D1E,EAAS,WACT,CAACA,EAAS,QAAQ,SAAS0E,EAAM,MAAc,MAE/ClB,EAAmB,EAAK,GACxBI,EAAmB,UAAU;AAAA,IAEjC;AAEA,QAAIL;AACF,sBAAS,iBAAiB,aAAakB,CAAkB,GAClD,MAAM;AACX,iBAAS,oBAAoB,aAAaA,CAAkB;AAAA,MAC9D;AAAA,EAEJ,GAAG,CAAClB,CAAe,CAAC;AAEpB,QAAMiB,IAAwB,CAACG,MAA0D;AACvF,IAAK3B,EAAiB,WAEtBA,EAAiB,QAAQ;AAAA,MACvB;AAAA,QACE,SAAS2B,EAAW;AAAA,QACpB,QAAQ,CAAC,sBAAsB,qBAAqB,UAAU;AAAA,MAAA;AAAA,MAEhE,CAAClC,GAAO2B,MAAW;AACjB,YAAIA,MAAW,OAAO,KAAK,OAAO,oBAAoB,MAAM3B,GAAO;AACjE,gBAAMmC,IAAmBnC,EAAM,qBAAqB;AACpD,UAAAW,EAAcwB,CAAgB,GAC9BpB,EAAmB,EAAK,GACxBF,EAAe,CAAA,CAAE,GACjBM,EAAmB,UAAU;AAE7B,gBAAMiB,IAAoBrC,GAAyBC,CAAK;AAExD,UAAA7C,IAAWgF,GAAkBC,CAAiB,GAC9C/B,IAAgBL,CAAK;AAAA,QACvB;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEA,SACE,gBAAAxD,EAACT,IAAA,EAAM,IAAAC,GAAQ,OAAAC,GAAc,MAAAC,GAAY,OAAAC,GAAc,UAAAC,GAAoB,WAAAC,GACzE,UAAA,gBAAAE,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKe;AAAA,QACL,IAAAvB;AAAA,QACA,MAAK;AAAA,QACL,WAAW,cAAcG,IAAQ,gBAAgB,EAAE;AAAA,QACnD,OAAO4B;AAAA,QACP,UAAUyD;AAAA,QACV,WAAWI;AAAA,QACX,gBAAc,CAAC,CAACzF;AAAA,QAChB,oBAAkB,CAACD,IAAO,GAAGF,CAAE,UAAU,MAAMG,IAAQ,GAAGH,CAAE,WAAW,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,QAC1G,UAAAI;AAAA,QACA,cAAa;AAAA,QACb,aAAaM,EAAK,eAAe;AAAA,QACjC,UAAU+D,KAAa/D,EAAK;AAAA,QAC3B,GAAGA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEL+D,KAAa,gBAAAjE,EAAC,KAAA,EAAE,WAAU,+BAA8B,UAAA,kCAA8B;AAAA,IAGtFsE,KAAmBF,EAAY,SAAS,KACvC,gBAAApE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKgE;AAAA,QACL,WAAU;AAAA,QACV,MAAK;AAAA,QAEJ,UAAAI,EAAY,IAAI,CAACsB,GAAYG,MAC5B,gBAAA9F;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW,8CACT8F,MAAUrB,IAAgB,8BAA8B,2CAC1D,IAAIqB,IAAQzB,EAAY,SAAS,IAAI,8BAA8B,EAAE;AAAA,YACrE,MAAK;AAAA,YACL,iBAAeyB,MAAUrB;AAAA,YACzB,SAAS,MAAMe,EAAsBG,CAAU;AAAA,YAC/C,cAAc,MAAMjB,EAAiBoB,CAAK;AAAA,YAE1C,UAAA;AAAA,cAAA,gBAAA7F,EAAC,OAAA,EAAI,WAAU,8BAA8B,UAAA0F,EAAW,sBAAsB,WAAU;AAAA,cACvFA,EAAW,sBAAsB,kBAChC,gBAAA1F,EAAC,SAAI,WAAU,iCAAiC,UAAA0F,EAAW,sBAAsB,eAAA,CAAe;AAAA,YAAA;AAAA,UAAA;AAAA,UAX7FA,EAAW;AAAA,QAAA,CAcnB;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,EAAA,CAEJ,EAAA,CACF;AAEJ;AC/TO,SAASI,GAAQC,GAAW;AACjC,SAAOA,EACJ,cACA,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEO,SAASC,GAEdC,GACAC,GACQ;AACR,SAAQD,EAAE,OAA8B,GAAGH,GAAQG,EAAE,QAAQ,CAAC,IAAIC,CAAG;AACvE;AAGO,SAASC,GAEdC,GACAC,GACoC;AACpC,QAAMC,IAA6C,CAAA,GAE7CC,IAAU,CAACC,MAAkCA,KAAM,QAAS,OAAOA,KAAM,YAAYA,EAAE,KAAA,MAAW;AAExG,SAAAJ,EAAU,QAAQ,CAACH,GAAGQ,MAAM;AAC1B,UAAMC,IAAMV,GAAUC,GAAGQ,CAAC,GACpBE,IAAMN,EAAOK,CAAG;AAEtB,QAAKT,EAAE;AAEP,cAAQA,EAAE,WAAA;AAAA,QACR,KAAK;AACH,UAAIU,MAAQ,OAAML,EAAOI,CAAG,IAAI;AAChC;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AACH,UAAIH,EAAQI,CAAG,MAAGL,EAAOI,CAAG,IAAI;AAChC;AAAA,QAEF,KAAK;AAEH,WAAyBC,KAAQ,QAAS,OAAOA,KAAQ,YAAYA,EAAI,KAAA,MAAW,QAClFL,EAAOI,CAAG,IAAI;AAEhB;AAAA,QAEF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AACE,UAAIH,EAAQI,CAAG,MAAGL,EAAOI,CAAG,IAAI;AAChC;AAAA,MAAA;AAAA,EAEN,CAAC,GAEMJ;AACT;AAGO,SAASM,GAAaJ,GAAQ;AACnC,MAAIA,MAAM,MAAMA,MAAM,QAAQA,MAAM,OAAW;AAC/C,QAAMK,IAAI,OAAOL,CAAC;AAClB,SAAO,OAAO,MAAMK,CAAC,IAAI,SAAYA;AACvC;ACjFO,MAAMC,KAAyD;AAAA,EACpE,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,uBAAuB;AAAA,EACvB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL,WAAW;AAAA,EACX,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EACV,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,cAAc;AAAA,EACd,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA;AAAA,EAEjB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,MAAM;AAAA,EACN,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,kBAAkB;AACpB,GAEaC,KAAwD;AAAA,EACnE,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AACnB,GAEaC,KAAyD;AAAA,EACpE,oBAAoB;AAAA,EACpB,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,uBAAuB;AAAA,EACvB,KAAK;AAAA,EACL,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AAAA,EACL,WAAW;AAAA,EACX,MAAM;AAAA,EACN,UAAU;AAAA,EACV,2BAA2B;AAAA,EAC3B,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,eAAe;AAAA,EACf,OAAO;AAAA,EACP,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP,cAAc;AAAA,EACd,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,kCAAkC;AAAA,EAClC,UAAU;AAAA,EACV,+BAA+B;AAAA,EAC/B,WAAW;AAAA,EACX,MAAM;AAAA,EACN,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,MAAM;AAAA,EACN,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,kBAAkB;AAAA,EAClB,eAAe;AACjB,GAEaC,KAA0D;AAAA,EACrE,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,aAAa;AAAA,EACb,eAAe;AACjB,GAEaC,KAA4D;AAAA,EACvE,UAAU;AAAA,EACV,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,8BAA8B;AAAA,EAC9B,4BAA4B;AAAA,EAC5B,0BAA0B;AAAA,EAC1B,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,gBAAgB;AAClB,GAEaC,KAAqE;AAAA,EAChF,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,2BAA2B;AAAA,EAC3B,8BAA8B;AAAA,EAC9B,sCAAsC;AAAA,EACtC,YAAY;AAAA,EACZ,OAAO;AACT,GAEaC,KAAgD;AAAA,EAC3D,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb,GAEaC,KAAgD;AAAA,EAC3D,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb,GAEaC,KAAgD;AAAA,EAC3D,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb,GAEaC,KAAgD;AAAA,EAC3D,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb,GAEaC,KAAkD;AAAA,EAC7D,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb,GAEaC,KAAiD;AAAA,EAC5D,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AACb,GAEaC,KAAkE;AAAA,EAC7E,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AACZ,GAEaC,KAAmE;AAAA,EAC9E,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,UAAU;AAAA,EACV,aAAa;AACf,GAEaC,KAA+D;AAAA,EAC1E,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AAAA,EACP,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,WAAW;AACb,GAEaC,KAAqE;AAAA,EAChF,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AACf,GAEaC,KAA6D;AAAA,EACxE,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,2BAA2B;AAAA,EAC3B,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,KAAK;AAAA,EACL,eAAe;AAAA,EACf,WAAW;AACb,GAEaC,KAAsD;AAAA,EACjE,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,YAAY;AACd,GCpeaC,KAAsC;AAAA,EACjD,yBAAyB;AAAA,IACvB;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,EAAA;AAAA,EAEF,oBAAoB;AAAA,IAClB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,sBAAsB;AAAA,IACpB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,uBAAuB;AAAA,IACrB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,uBAAuB;AAAA,IACrB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,UAAU,CAAC,UAAU;AAAA,EACrB,qBAAqB;AAAA,IACnB;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,EAAA;AAAA,EAEF,uBAAuB;AAAA,IACrB;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,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,uBAAuB;AAAA,IACrB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,uBAAuB,CAAC,qBAAqB;AAAA,EAC7C,aAAa;AAAA,IACX;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,IACA;AAAA,EAAA;AAAA,EAEF,WAAW;AAAA,IACT;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,IACA;AAAA,EAAA;AAAA,EAEF,sBAAsB;AAAA,IACpB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,qBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,kBAAkB;AAAA,IAChB;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,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,sBAAsB;AAAA,IACpB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,OAAO,CAAC,OAAO;AAAA,EACf,uBAAuB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,uBAAuB;AAAA,IACrB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,SAAS,CAAC,SAAS;AAAA,EACnB,qBAAqB;AAAA,IACnB;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,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,SAAS,CAAC,oBAAoB,eAAe,SAAS,eAAe;AAAA,EACrE,uBAAuB;AAAA,IACrB;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,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,YAAY,CAAC,YAAY;AAC3B,GAEaC,KAA0C;AAAA,EACrD,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,OAAO;AAAA,EACP,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,WAAW;AAAA,EACX,wBAAwB;AAAA,EACxB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,QAAQ;AAAA,EACR,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,SAAS;AAAA,EACT,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,YAAY;AACd;ACnrBA,SAASC,GAAoB5H,GAAgB6H,GAA8C;AACzF,MAAI,OAAO7H,KAAU,SAAU,QAAOA;AACtC,QAAM8H,IAAM9H,EAAM,KAAA;AAClB,MAAI,CAAC8H,EAAK,QAAO9H;AAEjB,MAAI6H,EAAYC,CAAG,EAAG,QAAOA;AAE7B,QAAMC,IAAUD,EAAI,YAAA;AAEpB,SADY,OAAO,KAAKD,CAAW,EAAE,KAAK,CAACG,MAAMA,EAAE,YAAA,MAAkBD,KAAWF,EAAYG,CAAC,GAAG,YAAA,MAAkBD,CAAO,KAC3G/H;AAChB;AAEO,SAASiI,GAA6BjI,GAAyB;AACpE,SAAO4H,GAAoB5H,GAAOyH,EAA2B;AAC/D;AAEO,SAASS,GAAmClI,GAAyB;AAC1E,SAAO4H,GAAoB5H,GAAOwH,EAAkC;AACtE;AAEO,SAASW,GAA+BnI,GAAyB;AACtE,SAAO4H,GAAoB5H,GAAO2H,EAAiE;AACrG;ACdA,SAASS,GAAcC,GAAsB;AAC3C,SAAOA,EAAK,KAAA,EAAO,YAAA;AACrB;AAEA,SAASC,GAActI,GAA+B;AACpD,MAAI,OAAOA,KAAU,SAAU,QAAO;AACtC,QAAMuI,IAAQvI,EAAM,MAAM,2BAA2B;AACrD,MAAI,CAACuI,EAAO,QAAO;AAEnB,QAAMC,IAAO,OAAOD,EAAM,CAAC,CAAC,GACtBE,IAAQ,OAAOF,EAAM,CAAC,CAAC,GACvBG,IAAM,OAAOH,EAAM,CAAC,CAAC;AAE3B,MADI,CAAC,OAAO,SAASC,CAAI,KAAK,CAAC,OAAO,SAASC,CAAK,KAAK,CAAC,OAAO,SAASC,CAAG,KACzED,IAAQ,KAAKA,IAAQ,MAAMC,IAAM,KAAKA,IAAM,GAAI,QAAO;AAE3D,QAAMC,IAAK,IAAI,KAAK,KAAK,IAAIH,GAAMC,IAAQ,GAAGC,CAAG,CAAC;AAClD,SAAIC,EAAG,eAAA,MAAqBH,KAAQG,EAAG,YAAA,MAAkBF,IAAQ,KAAKE,EAAG,WAAA,MAAiBD,IAAY,OAC/FC,EAAG,QAAA;AACZ;AAEO,SAASC,GAAiC9C,GAAkD;AACjG,MAAI+C,IAAmC,MACnCC,IAAkC,MAClCC,IAAmC;AACvC,QAAMC,wBAA4B,IAAA,GAC5BC,wBAAmC,IAAA;AAEzC,SAAAnD,EAAU,QAAQ,CAACH,MAAM;AACvB,UAAMS,IAAM,OAAOT,EAAE,OAAO,EAAE,GACxBuD,IAASd,GAAc,OAAOzC,EAAE,YAAY,EAAE,CAAC;AAErD,KAAIS,MAAQ,6BAA6B8C,EAAO,SAAS,gCAAgC,OACvFL,IAAoBzC,KAGlBA,MAAQ,oBAAoB8C,EAAO,SAAS,0CAA0C,OACxFJ,IAAmB1C,KAGjBA,MAAQ,gCAAgC8C,EAAO,SAAS,qCAAqC,OAC/FH,IAAoB3C,KAGlBA,MAAQ,kCAAkC8C,EAAO,SAAS,sCAAsC,MAClGF,EAAsB,IAAI5C,CAAG,IAI7BA,MAAQ,sBACRA,MAAQ,uBACRA,MAAQ,oCACRA,MAAQ,gCACRA,MAAQ,uCACRA,MAAQ,iCAER6C,EAA6B,IAAI7C,CAAG;AAAA,EAExC,CAAC,GAEM;AAAA,IACL,mBAAAyC;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,8BAAAC;AAAA,EAAA;AAEJ;AAEO,SAASE,GAA+BpD,GAAoBqD,GAA0C;AAE3G,OADwBA,EAAK,oBAAoBrD,EAAOqD,EAAK,iBAAiB,IAAI,YAC1D,mBAAoB,QAAO;AAEnD,MAAI,CAACA,EAAK,oBAAoB,CAACA,EAAK,kBAAmB,QAAO;AAE9D,QAAMC,IAAaf,GAAcvC,EAAOqD,EAAK,iBAAiB,CAAC,GACzDE,IAAYhB,GAAcvC,EAAOqD,EAAK,gBAAgB,CAAC;AAC7D,SAAIC,KAAc,QAAQC,KAAa,OAAa,KAE7CD,IAAaC;AACtB;AAEO,SAASC,GAA4BC,GAAoBzD,GAAoBqD,GAA0C;AAC5H,QAAMhD,IAAM,OAAOoD,EAAS,OAAO,EAAE,GAE/BC,KADkBL,EAAK,oBAAoBrD,EAAOqD,EAAK,iBAAiB,IAAI,YAClC;AAEhD,SAAIK,KAAuBL,EAAK,6BAA6B,IAAIhD,CAAG,IAC3D,KAGL,CAACgD,EAAK,sBAAsB,IAAIhD,CAAG,KACnCqD,IAA4B,KACzBN,GAA+BpD,GAAQqD,CAAI;AACpD;AAEO,SAASM,GAA4BF,GAAoBJ,GAA0C;AACxG,QAAMhD,IAAM,OAAOoD,EAAS,OAAO,EAAE;AACrC,SAAOJ,EAAK,sBAAsB,IAAIhD,CAAG;AAC3C;AC5GO,MAAMuD,KAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAEaC,KAA6G;AAAA,EACxH,MAAQ;AAAA;AAAA,IAEN,QAAQ,CAAC,YAAY,YAAY,cAAc,cAAc,WAAW,iBAAiB,cAAc,UAAU;AAAA,IACjH,MAAM,CAAC,YAAY,aAAa,aAAa,gBAAgB,cAAc,YAAY,WAAW;AAAA,IAClG,WAAW,CAAC,qBAAqB,cAAc,aAAa,eAAe,YAAY,YAAY;AAAA,IACnG,QAAQ,CAAC,YAAY,YAAY,WAAW,cAAc,aAAa,cAAc;AAAA,IACrF,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAEJ,GAEaC,KAET;AAAA,EACF,MAAQ;AAAA,IACN,QAAQ;AAAA,MACN,YAAY,CAAC,cAAc;AAAA,MAC3B,YAAY,CAAC,cAAc;AAAA,MAC3B,cAAc,CAAC,cAAc;AAAA,MAC7B,cAAc,CAAC,cAAc;AAAA,MAC7B,WAAW,CAAC,YAAY;AAAA,MACxB,iBAAiB,CAAC,YAAY;AAAA,MAC9B,cAAc,CAAC,eAAe;AAAA,MAC9B,YAAY,CAAC,kBAAkB;AAAA,IAAA;AAAA,IAEjC,MAAM;AAAA,MACJ,YAAY,CAAC,eAAe;AAAA,MAC5B,aAAa,CAAC,eAAe;AAAA,MAC7B,aAAa,CAAC,YAAY;AAAA,MAC1B,gBAAgB,CAAC,YAAY;AAAA,MAC7B,cAAc,CAAC,cAAc;AAAA,MAC7B,YAAY,CAAC,YAAY;AAAA,MACzB,aAAa,CAAC,cAAc;AAAA,IAAA;AAAA,IAE9B,WAAW;AAAA,MACT,qBAAqB,CAAC,eAAe;AAAA,MACrC,cAAc,CAAC,YAAY;AAAA,MAC3B,aAAa,CAAC,cAAc;AAAA,MAC5B,eAAe,CAAC,YAAY;AAAA,MAC5B,YAAY,CAAC,YAAY;AAAA,MACzB,cAAc,CAAC,kBAAkB;AAAA,IAAA;AAAA,IAEnC,QAAQ;AAAA,MACN,YAAY,CAAC,cAAc;AAAA,MAC3B,YAAY,CAAC,cAAc;AAAA,MAC3B,WAAW,CAAC,YAAY;AAAA,MACxB,cAAc,CAAC,eAAe;AAAA,MAC9B,aAAa,CAAC,cAAc;AAAA,MAC5B,gBAAgB,CAAC,YAAY;AAAA,IAAA;AAAA,IAE/B,OAAO;AAAA,MACL,aAAa,CAAC,2BAA2B;AAAA,IAAA;AAAA,EAC3C;AAEJ;AAGA,SAASC,GAAsB5D,GAAoB;AACjD,SAAO,OAAOA,KAAK,EAAE,EAClB,KAAA,EACA,YAAA;AACL;AAGA,SAAS6D,GAAsBC,GAAcC,GAAqE;AAChH,MAAI,GAACA,KAAU,CAACD;AAChB,WAAIC,EAAOD,CAAI,MAAM,SAAkBA,IAChC,OAAO,KAAKC,CAAM,EAAE,KAAK,CAACjC,MAAMA,EAAE,YAAA,MAAkBgC,CAAI;AACjE;AAGA,SAASE,GAAmBC,GAAyF;AACnH,SAAO,OAAO,KAAKA,CAAM,EACtB,IAAI,CAACC,MAAM,OAAOA,CAAC,CAAC,EACpB,OAAO,CAAC7D,MAAM,OAAO,SAASA,CAAC,CAAC,EAChC,KAAK,CAAC8D,GAAGC,MAAMD,IAAIC,CAAC;AACzB;AAEA,SAASC,GAAiBC,GAAkDC,GAAcC,GAA2B;AACnH,QAAMC,IAASH,EAAKC,CAAI,GAClBG,IAAUb,GAAmBW,GAAUC,CAAM,GAC7CE,IAAOD,IAAUD,IAASC,CAAO,IAAI;AAC3C,SAAO,CAAC,EAAEC,KAAQA,EAAK,SAAS;AAClC;AAMA,SAASC,GAAoBtC,GAAckC,GAAkBF,GAAsE;AACjI,MAAID,GAAiBC,GAAMhC,GAAMkC,CAAQ,EAAG,QAAOlC;AAEnD,QAAMuC,IAAQb,GAAmBM,CAAI,GAC/BQ,IAAO,OAAOxC,CAAI;AACxB,MAAI,CAAC,OAAO,SAASwC,CAAI,KAAKD,EAAM,WAAW,EAAG;AAElD,MAAIE,GACAC,IAAW;AACf,aAAWd,KAAKW,GAAO;AACrB,UAAMN,IAAO,OAAOL,CAAC;AACrB,QAAI,CAACG,GAAiBC,GAAMC,GAAMC,CAAQ,EAAG;AAC7C,UAAMS,IAAI,KAAK,IAAIf,IAAIY,CAAI;AAC3B,IAAIG,IAAID,MACNA,IAAWC,GACXF,IAAOR;AAAA,EAEX;AACA,SAAOQ;AACT;AAEA,SAASG,GACPX,GACAC,GACAW,GACAb,GAC+B;AAC/B,QAAMG,IAASH,EAAKC,CAAI,GAClBG,IAAUb,GAAmBW,GAAUC,CAAM;AACnD,MAAI,CAACC,EAAS;AACd,QAAMU,IAAUX,IAASC,CAAO,GAC1BW,IAAWxB,GAAmBsB,GAAWC,CAAO;AACtD,MAAI,CAACC,EAAU;AACf,QAAMV,IAAOS,IAAUC,CAAQ;AAC/B,SAAOV,KAAQA,EAAK,SAAS,IAAIA,IAAO;AAC1C;AAMA,SAASW,GACPhD,GACAkC,GACAW,GACAb,GACoB;AACpB,MAAIY,GAAiB5C,GAAMkC,GAAUW,GAAWb,CAAI,EAAG,QAAOhC;AAE9D,QAAMuC,IAAQ,OAAO,KAAKP,CAAI,EAC3B,IAAI,CAACJ,MAAM,OAAOA,CAAC,CAAC,EACpB,OAAO,CAAC7D,MAAM,OAAO,SAASA,CAAC,CAAC,EAChC,KAAK,CAAC8D,GAAGC,MAAMD,IAAIC,CAAC,GACjBU,IAAO,OAAOxC,CAAI;AACxB,MAAI,CAAC,OAAO,SAASwC,CAAI,KAAKD,EAAM,WAAW,EAAG;AAElD,MAAIE,GACAC,IAAW;AACf,aAAWd,KAAKW,GAAO;AACrB,UAAMN,IAAO,OAAOL,CAAC;AACrB,QAAI,CAACgB,GAAiBX,GAAMC,GAAUW,GAAWb,CAAI,EAAG;AACxD,UAAM,IAAI,KAAK,IAAIJ,IAAIY,CAAI;AAC3B,IAAI,IAAIE,MACNA,IAAW,GACXD,IAAOR;AAAA,EAEX;AACA,SAAOQ;AACT;AAEO,SAASQ,GAAuBC,GAAoBC,GAA8B;AACvF,QAAMnD,IAAO,OAAOkD,KAAa,EAAE,EAAE,KAAA,GAC/BhB,IAAWZ,GAAsB6B,CAAS;AAChD,MAAI,CAACnD,KAAQ,CAACkC,UAAiB,CAAA;AAC/B,QAAMkB,IAAed,GAAoBtC,GAAMkC,GAAUd,EAAmC;AAC5F,MAAI,CAACgC,EAAc,QAAO,CAAA;AAC1B,QAAMjB,IAASf,GAAoCgC,CAAY,GACzDhB,IAAUb,GAAmBW,GAAUC,CAAM;AACnD,SAAKC,IACE,CAAC,GAAID,EAAOC,CAAO,KAAK,CAAA,CAAG,IADb,CAAA;AAEvB;AAEO,SAASiB,GAA2BH,GAAoBC,GAAoBG,GAA+B;AAChH,QAAMtD,IAAO,OAAOkD,KAAa,EAAE,EAAE,KAAA,GAC/BhB,IAAWZ,GAAsB6B,CAAS,GAC1CN,IAAYvB,GAAsBgC,CAAU;AAClD,MAAI,CAACtD,KAAQ,CAACkC,KAAY,CAACW,UAAkB,CAAA;AAC7C,QAAMO,IAAeJ,GAAwBhD,GAAMkC,GAAUW,GAAWxB,EAAiD;AACzH,MAAI,CAAC+B,EAAc,QAAO,CAAA;AAC1B,QAAMf,IAAOO,GAAiBQ,GAAclB,GAAUW,GAAWxB,EAAiD;AAClH,SAAOgB,IAAO,CAAC,GAAGA,CAAI,IAAI,CAAA;AAC5B;ACrOA,MAAMkB,KAAgD;AAAA;AAAA,EAEpD,MAAM;AAAA,EACN,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,yBAAyB;AAAA,EACzB,yBAAyB;AAC3B,GAEMC,KAAuE;AAAA,EAC3E,yBAAyBxF;AAAA,EACzB,4BAA4BI;AAAA,EAC5B,8BAA8BC;AAAA,EAC9B,gBAAgBJ;AAAA,EAChB,yBAAyBC;AAAA,EACzB,WAAWI;AAAA,EACX,WAAWC;AAAA,EACX,WAAWC;AAAA,EACX,WAAWC;AAAA,EACX,aAAaC;AAAA,EACb,YAAYC;AAAA,EACZ,6BAA6BC;AAAA,EAC7B,yBAAyBC;AAAA,EACzB,yBAAyBA;AAAA,EACzB,0BAA0BC;AAAA,EAC1B,gCAAgCC;AAAA,EAChC,iBAAiBC;AAAA,EACjB,UAAUC;AAAA,EACV,YAAYE;AAAA,EACZ,OAAOhB;AACT,GAEMsF,KAAiC,CAAC,oBAAoB,GACtDC,KAAsC,CAAC,SAAS,OAAO,SAAS,aAAa,UAAU,OAAO,SAAS,OAAO,GAC9GC,KAAqC,CAAC,OAAO;AAEnD,SAASC,GAAiBjB,GAAiB;AACzC,QAAM3C,IAAO2C,EAAE,YAAA,GACT1C,IAAQ,OAAO0C,EAAE,SAAA,IAAa,CAAC,EAAE,SAAS,GAAG,GAAG,GAChDzC,IAAM,OAAOyC,EAAE,QAAA,CAAS,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAG3C,CAAI,IAAIC,CAAK,IAAIC,CAAG;AAChC;AAEA,SAAS2D,GAAuBvE,GAAiC;AAC/D,QAAMwE,IAAaxE,EAAI,QAAQ,QAAQ,EAAE;AACzC,MAAIwE,MAAe;AACnB,WAAOhG,GAAagG,CAAU;AAChC;AAEA,SAASC,GAAsBnG,GAAsB;AACnD,SAAOA,MAAQ,OAAOA,MAAQ,OAAOA,MAAQ,OAAOA,MAAQ,OAAOA,MAAQ;AAC7E;AAEA,SAASoG,GAAqBpG,GAAiC;AAC7D,MAAIA,MAAQ,iBAAkB;AAG9B,QAAMqG,wBAAe,KAAA;AACrB,SAAAA,EAAS,QAAQA,EAAS,QAAA,IAAY,CAAC,GAChCL,GAAiBK,CAAQ;AAClC;AAQA,SAASC,GAAgC/G,GAAsB;AAE7D,SADIA,EAAE,cAAc,WAChB,CAACA,EAAE,WAAWA,EAAE,QAAQ,WAAW,KAAKA,EAAE,QAAQ,CAAC,MAAM,QAAc,MAC7DA,EAAE,gBAAgB,CAAA,GACnB,KAAK,CAACgH,MAAMA,EAAE,qCAAqCA,EAAE,oBAAoB,YAAYA,EAAE,qBAAqB,KAAK;AAChI;AAEA,SAASC,GAA0BjH,GAAa3F,GAAyB;AACvE,SAAI0M,GAAgC/G,CAAC,IAAU,QACxC3F;AACT;AAEA,SAAS6M,GAASC,GAA2B;AAC3C,SAAI,OAAOA,KAAM,YAAY,OAAO,SAASA,CAAC,IAAUA,IACpD,OAAOA,KAAM,YAAYA,EAAE,KAAA,MAAW,MAAM,CAAC,OAAO,MAAM,OAAOA,CAAC,CAAC,IAAU,OAAOA,CAAC,IAClF;AACT;AACA,SAASC,GAAOD,GAA2B;AACzC,MAAIA,aAAa,QAAQ,CAAC,OAAO,MAAMA,EAAE,SAAS,EAAG,QAAOA,EAAE,QAAA;AAC9D,MAAI,OAAOA,KAAM,UAAU;AACzB,UAAME,IAAI,KAAK,MAAMF,CAAC;AACtB,WAAO,OAAO,MAAME,CAAC,IAAI,OAAOA;AAAA,EAClC;AACA,SAAO;AACT;AACA,SAASC,GAAI5C,GAAYC,GAA2B;AAClD,QAAM4C,IAAKL,GAASxC,CAAC,GACnB8C,IAAKN,GAASvC,CAAC;AACjB,MAAI4C,KAAM,QAAQC,KAAM,aAAaD,IAAKC;AAC1C,QAAMC,IAAKL,GAAO1C,CAAC,GACjBgD,IAAKN,GAAOzC,CAAC;AACf,SAAI8C,KAAM,QAAQC,KAAM,OAAaD,IAAKC,IACtChD,KAAK,QAAQC,KAAK,OAAa,OAC5B,OAAOD,CAAC,EAAE,cAAc,OAAOC,CAAC,CAAC;AAC1C;AACA,SAASgD,GAASC,GAAmBC,GAA0B;AAC7D,SAAI,MAAM,QAAQD,CAAQ,IAAUA,EAAS,KAAK,CAACrH,MAAMA,MAAMsH,CAAM,IACjE,OAAOD,KAAa,WAAiBC,KAAU,QAAQD,EAAS,SAAS,OAAOC,CAAM,CAAC,IACpF;AACT;AACA,SAASC,GAAgBC,GAAiBC,GAAqDC,GAAoC;AACjI,UAAQD,GAAA;AAAA,IACN,KAAK;AACH,aAAOD,MAAWE;AAAA,IACpB,KAAK,YAAY;AACf,YAAMjB,IAAIM,GAAIS,GAAQE,CAAgB;AACtC,aAAOjB,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK,eAAe;AAClB,YAAMA,IAAIM,GAAIS,GAAQE,CAAgB;AACtC,aAAOjB,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK;AACH,aAAOW,GAASI,GAAQE,CAAgB;AAAA,IAC1C,KAAK;AACH,aAAOF,KAAU,QAAQE,KAAoB,QAAQ,OAAOF,CAAM,EAAE,WAAW,OAAOE,CAAgB,CAAC;AAAA,IACzG,KAAK;AACH,aAAOF,KAAU,QAAQE,KAAoB,QAAQ,OAAOF,CAAM,EAAE,SAAS,OAAOE,CAAgB,CAAC;AAAA,IACvG;AACE,aAAO;AAAA,EAAA;AAEb;AAQA,SAASC,GAAMC,GAAcC,GAA0B;AAErD,SAAOA,EAAK,OAAO,CAACC,GAAU5H,MAAmC4H,IAAI5H,CAAG,GAAI0H,CAAU;AACxF;AACA,SAASG,GAAiCH,GAAQC,GAAiB/N,GAAmB;AACpF,MAAI+N,EAAK,WAAW,EAAG,QAAOD;AAC9B,QAAM,CAACI,GAAM,GAAGC,CAAI,IAAIJ;AAExB,MAAII,EAAK,WAAW,GAAG;AACrB,QAAI,OAAOD,KAAS,UAAU;AAG5B,YAAME,KADO,MAAM,QAAQN,CAAG,IAAKA,IAAgB,CAAA,GAClC,MAAA;AACjB,aAAAM,EAAIF,CAAI,IAAIlO,GACLoO;AAAA,IACT;AAEA,WAAO,EAAE,GAAIN,GAAa,CAACI,CAAI,GAAGlO,EAAA;AAAA,EACpC;AAGA,QAAMqO,IAAWP,IAAcI,CAAI,GAC7BI,IAAgB,OAAOH,EAAK,CAAC,KAAM,WAAY,MAAM,QAAQE,CAAO,IAAIA,IAAU,CAAA,IAAMA,KAAW,OAAOA,KAAY,WAAWA,IAAU,CAAA,GAG3IE,IAAON,GAAeK,GAAsBH,GAAMnO,CAAK;AAE7D,MAAI,OAAOkO,KAAS,UAAU;AAG5B,UAAME,KADO,MAAM,QAAQN,CAAG,IAAKA,IAAgB,CAAA,GAClC,MAAA;AACjB,WAAAM,EAAIF,CAAI,IAAIK,GACLH;AAAA,EACT;AAEA,SAAO,EAAE,GAAIN,GAAa,CAACI,CAAI,GAAGK,EAAA;AACpC;AAGA,SAASC,EAAWzI,GAAoB0I,GAA8BrI,GAAa;AACjF,SAAOyH,GAAM9H,GAAQ,CAAC,GAAI0I,KAAS,CAAA,GAAKrI,CAAG,CAAC;AAC9C;AAEA,SAASsI,EAAY3I,GAAoB0I,GAA8BrI,GAAaF,GAAwB;AAC1G,SAAO+H,GAAelI,GAAQ,CAAC,GAAI0I,KAAS,IAAKrI,CAAG,GAAGF,CAAC;AAC1D;AAGA,SAASyI,GAAcC,GAAkCxI,GAAqB;AAC5E,SAAKwI,GAAW,SACT,GAAGA,EAAU,KAAK,GAAG,CAAC,IAAIxI,CAAG,KADLA;AAEjC;AAEA,MAAMyI,KAAe,WACfC,KAAW,CAAC9G,MAAc,GAAGA,CAAC,GAAG6G,EAAY;AAMnD,SAASE,GAAajJ,GAAmC;AACvD,QAAMkJ,IAAO,CAACnE,GAAkBoE,MAC9BpE,EAAK,IAAI,CAAClF,GAAGuJ,MAAO;AAClB,UAAMC,IAAaF,EAAU,SAASA,EAAU,KAAK,IAAI,IAAI,QACvDG,IAAWzJ,EAAE,OAAkB,GAAGwJ,CAAU,MAAMD,CAAE,IAAI,OAAOvJ,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,KAAK,OAAO,IAGvH0J,KADoC1J,EAAE,gBAAgB,CAAA,GACpC,IAAI,CAACgH,GAAG2C,MAAO;AACrC,YAAMC,IAAS5C,EAAE,uBACbqC,EAAKrC,EAAE,sBAA+C,CAAC,GAAGsC,GAAW,GAAGG,CAAO,MAAME,CAAE,EAAE,CAAC,IAC1F;AAEJ,aAAO,EAAE,GAAG3C,GAAG,sBAAsB4C,EAAA;AAAA,IACvC,CAAC;AAED,WAAO,EAAE,GAAG5J,GAAG,KAAKyJ,GAAS,cAAcC,EAAA;AAAA,EAC7C,CAAC;AAEH,SAAOL,EAAKlJ,GAAW,EAAE;AAC3B;AAGA,SAAS0J,GAAYtJ,GAAoB;AACvC,SAAIA,KAAK,OAAa,KACf,OAAOA,KAAM,WAAWA,IAAI,OAAOA,CAAC;AAC7C;AAGA,SAASuJ,GAAcvJ,GAA6B;AAClD,SAAIA,KAAK,OAAa,KAClB,OAAOA,KAAM,YAAY,OAAO,SAASA,CAAC,KAC1C,OAAOA,KAAM,WAAiBA,IAC3B;AACT;AAGA,SAASwJ,GAAcxJ,GAA6B;AAClD,SAAIA,KAAK,OAAa,KAClB,OAAOA,KAAM,YAAY,OAAOA,KAAM,WAAiBA,IACpD,OAAOA,CAAC;AACjB;AAMO,SAASyJ,GAAa;AAAA,EAC3B,WAAA7J;AAAA,EACA,eAAA8J;AAAA,EACA,kBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AACF,GAMG;AACD,QAAMC,IAAiBC,GAAQ,MAAMlB,GAAajJ,CAAS,GAAG,CAACA,CAAS,CAAC,GACnEoK,IAAmBD,GAAQ,MAAMrH,GAAiCoH,CAAc,GAAG,CAACA,CAAc,CAAC,GAEnGG,IAAkCF,GAAQ,MAAM;AACpD,UAAMjC,IAAkB,CAAA;AAExB,WAAI4B,KAAe,OAAO,OAAO5B,GAAK4B,CAAoB,GACnD5B;AAAA,EACT,GAAG,CAAC4B,CAAa,CAAC,GAEZ,CAACQ,GAAcC,CAAe,IAAI7P,EAAqB2P,CAAmB;AAChF,EAAAvP,EAAU,MAAM;AACd,IAAAyP,EAAgBF,CAAmB;AAAA,EACrC,GAAG,CAACA,CAAmB,CAAC;AAGxB,QAAM,CAACG,GAAaC,CAAc,IAAI/P,EAAqB,CAAA,CAAE,GACvDuF,IAAqBkK;AAAA,IACzB,OAAO,EAAE,GAAGK,GAAa,GAAIT,KAAoBO,EAAA;AAAA,IACjD,CAACE,GAAaT,GAAkBO,CAAY;AAAA,EAAA;AAE9C,EAAAxP,EAAU,MAAM;AACd,IAAIiP,OAAiC,CAACW,OAAO,EAAE,GAAGA,GAAG,GAAGX,EAAA,EAAmB;AAAA,EAC7E,GAAG,CAACA,CAAgB,CAAC;AAErB,QAAM,CAAC7J,GAAQyK,CAAS,IAAIjQ,EAA6C,CAAA,CAAE;AAE3E,EAAAI,EAAU,MAAM;AACd,QAAI8P,IAAU3K,GACV4K,IAAU;AAWd,IATAX,EAAe,QAAQ,CAACrK,MAAM;AAC5B,UAAI,CAAC+G,GAAgC/G,CAAC,EAAG;AACzC,YAAMS,IAAM,OAAOT,EAAE,GAAG;AAExB,MADgB6I,EAAWkC,GAAS,QAAWtK,CAAG,MAClC,UAChBsK,IAAUhC,EAAYgC,GAAS,QAAWtK,GAAK,KAAK,GACpDuK,IAAU;AAAA,IACZ,CAAC,GAEIA,MACDd,KAAoBC,IAAgBA,EAAeY,CAAO,MACzCA,CAAO,GAC5BH,EAAeG,CAAO;AAAA,EACxB,GAAG,CAACV,GAAgBjK,GAAQ8J,GAAkBC,CAAc,CAAC;AAG7D,WAASc,EAAUjL,GAAaiJ,GAAuB;AACrD,UAAMxI,IAAMT,EAAE;AAGd,QAAIS,MAAQ,6BAA6BwI,GAAW;AAClD,YAAMiC,IAAUjC,EAAUA,EAAU,SAAS,CAAC;AAC9C,UAAI,OAAOiC,KAAY,YAAYA,MAAY,EAAG,QAAO;AAAA,IAC3D;AAEA,UAAM1R,IAAQwG,EAAE,UACVU,IAAMmI,EAAWzI,GAAQ6I,GAAWxI,CAAG,GACvC9G,IAAWoK,GAA4B/D,GAAGuK,CAAgB,IAAI/G,GAA+BpD,GAAQmK,CAAgB,IAAIvK,EAAE,UAC3HtG,IAAQ2G,EAAOI,CAAG,GAElB0K,IAAM,CAAC5K,MAAe;AAC1B,UAAIwK,IAAUhC,EAAY3I,GAAQ6I,GAAWxI,GAAKF,CAAC;AAGnD,UAAIP,EAAE,cAAc,WAAWA,EAAE,cAAc;AAC7C,cAAMoL,IAAQpL,EAAE,gBAAgB,CAAA;AAGhC,mBAAWqL,KAAQD,GAAO;AACxB,gBAAME,IAAezC,EAAWzI,GAAQ6I,GAAWxI,CAAG,GAChD8K,IAAYzD,GAAgBwD,GAAcD,EAAK,iBAAiBA,EAAK,gBAAgB,GACrFG,IAAe1D,GAAgBvH,GAAG8K,EAAK,iBAAiBA,EAAK,gBAAgB;AAGnF,cAAIE,KAAa,CAACC,KAAgBH,EAAK,mCAAmC;AACxE,kBAAMxR,IAAYwR,EAAK,wBAAwB,CAAA;AAC/C,gBAAIxR,EAAS,SAAS,GAAG;AACvB,oBAAM4R,IAAgBtC,GAAS1I,CAAG;AAElC,cAAAsK,IAAUzC,GAAeyC,GAAS,CAAC,GAAI9B,KAAa,IAAKwC,CAAa,GAAG,EAAE;AAG3E,oBAAMC,IAAoB,CAACC,GAA0BC,MAA4B;AAC/E,gBAAAD,EAAa,QAAQ,CAACE,MAAW;AAE/B,mBADmBA,EAAO,gBAAgB,CAAA,GAC/B,QAAQ,CAACC,MAAc;AAChC,wBAAIA,EAAU,mCAAmC;AAC/C,4BAAMC,IAAe5C,GAAS0C,EAAO,GAAa;AAClD,sBAAAd,IAAUzC,GAAeyC,GAAS,CAAC,GAAGa,GAAcG,CAAY,GAAG,EAAE;AAAA,oBACvE;AACA,0BAAMC,IAAiBF,EAAU,wBAAwB,CAAA;AACzD,oBAAIE,EAAc,SAAS,KACzBN,EAAkBM,GAAeJ,CAAY;AAAA,kBAEjD,CAAC;AAAA,gBACH,CAAC;AAAA,cACH;AAEA,cAAAF,EAAkB7R,GAAU,CAAC,GAAIoP,KAAa,CAAA,GAAKwC,CAAa,CAAC;AAAA,YACnE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAIvB,KAAoBC,IAAgBA,EAAeY,CAAO,MACzCA,CAAO,GAC5BH,EAAeG,CAAO;AAAA,IACxB;AAEA,QAAItK,MAAQ,8BAA8B;AACxC,YAAMwL,IAAY7L,EAAO,mBAAmB,CAAA,GACtC8L,IAAW9L,EAAO,kBAAkB,CAAA;AAE1C,UAAI6L,EAAS,WAAW,KAAKC,EAAQ,WAAW;AAC9C,eACE,gBAAAnS,EAAC,KAAA,EAAY,OAAO,EAAE,OAAO,QAAQ,WAAW,SAAA,GAAY,UAAA,wEAAA,GAApD0G,CAER;AAIJ,YAAM0L,IAAe/L,EAAO,8BAA8B,CAAA,GAEpDgM,IAAmB,CAACC,GAAcC,GAAcC,MAAgB;AACpE,cAAMnN,IAAO,EAAE,GAAG+M,EAAA,GACZK,IAAO,IAAIH,CAAI;AACrB,QAAAjN,EAAKoN,CAAI,IAAI,EAAE,GAAIpN,EAAKoN,CAAI,KAAK,GAAC,GAClCpN,EAAKoN,CAAI,EAAE,IAAIF,CAAI,EAAE,IAAIC,GACzBpB,EAAI/L,CAAI;AAAA,MACV,GAEMqN,IAA4B,CAACJ,MAAgC;AACjE,YAAIH,EAAQ,SAAS,EAAG,QAAO;AAC/B,cAAMQ,IAAeP,EAAY,IAAIE,CAAI,EAAE;AAC3C,YAAI,CAACK,EAAc,QAAO;AAE1B,cAAMC,IAAOT,EAAQ,IAAI,CAACU,GAAGN,MAASI,EAAa,IAAIJ,CAAI,EAAE,KAAK,CAAC,GAC7DO,IAAUF,EAAK,OAAO,CAAC9B,MAAMA,IAAI,CAAC;AACxC,YAAIgC,EAAQ,UAAU,KAAKA,EAAQ,MAAM,CAAChC,MAAMA,MAAMgC,EAAQ,CAAC,CAAC,KAAKA,EAAQ,CAAC,MAAM;AAClF,iBAAO,2BAA2BR,IAAO,CAAC;AAE5C,cAAMS,IAAQH,EAAK,OAAO,CAACjI,GAAGC,MAAMD,IAAIC,GAAG,CAAC;AAC5C,eAAImI,IAAQ,KAAKA,MAAU,MAClB,sEAAsEA,CAAK,QAE7E;AAAA,MACT;AAEA,+BACG,OAAA,EACC,UAAA;AAAA,QAAA,gBAAA/S,EAAC,QAAG,OAAO,EAAE,cAAc,OAAA,GAAW,UAAAP,GAAM;AAAA,QAC3CyS,EAAS,IAAI,CAAC1L,GAAG8L,MAAS;AACzB,gBAAMU,IAAS,CAACxM,EAAE,MAAMA,EAAE,MAAMA,EAAE,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,WAAW8L,IAAO,CAAC,IACnFW,IAAkBP,EAA0BJ,CAAI;AACtD,iBACE,gBAAAvS;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,OAAO,EAAE,QAAQ,aAAakT,IAAkB,YAAY,MAAM,IAAI,cAAc,OAAO,SAAS,QAAQ,cAAc,OAAA;AAAA,cAE1H,UAAA;AAAA,gBAAA,gBAAAjT,EAAC,UAAA,EAAO,OAAO,EAAE,YAAY,KAAK,SAAS,QAAA,GAAY,UAAAgT,EAAA,CAAO;AAAA,gBAC9D,gBAAAhT,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,UACnD,UAAAmS,EAAQ,IAAI,CAAC1G,GAAG8G,MAAS;AACxB,wBAAMW,IAAS,CAACzH,EAAE,YAAYA,EAAE,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK,UAAU8G,IAAO,CAAC,IACpFY,IAASf,EAAY,IAAIE,CAAI,EAAE,IAAI,IAAIC,CAAI,EAAE;AACnD,2CACG,OAAA,EAA4B,OAAO,EAAE,MAAM,eAC1C,UAAA,gBAAAvS;AAAA,oBAACG;AAAA,oBAAA;AAAA,sBACC,IAAI,eAAemS,CAAI,KAAKC,CAAI;AAAA,sBAChC,OAAO,GAAGW,CAAM;AAAA,sBAChB,OAAOC,KAAU;AAAA,sBACjB,KAAK;AAAA,sBACL,KAAK;AAAA,sBACL,MAAM;AAAA,sBACN,WAAU;AAAA,sBACV,UAAU,CAAC9R,MAAM;AACf,8BAAM+G,IAAM/G,EAAE,cAAc,MAAM,QAAQ,QAAQ,EAAE;AACpD,wBAAAgR,EAAiBC,GAAMC,GAAMnK,MAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,SAASA,GAAK,EAAE,CAAC,CAAC;AAAA,sBAChF;AAAA,oBAAA;AAAA,kBAAA,EACF,GAbQ,GAAGkK,CAAI,IAAIC,CAAI,EAczB;AAAA,gBAEJ,CAAC,EAAA,CACH;AAAA,gBACCU,KAAmB,gBAAAjT,EAAC,KAAA,EAAE,OAAO,EAAE,OAAO,WAAW,UAAU,WAAW,WAAW,OAAO,cAAc,EAAA,GAAM,UAAAiT,EAAA,CAAgB;AAAA,cAAA;AAAA,YAAA;AAAA,YA3BxHX;AAAA,UAAA;AAAA,QA8BX,CAAC;AAAA,MAAA,EAAA,GArCO5L,CAsCV;AAAA,IAEJ;AAEA,YAAQT,EAAE,WAAA;AAAA,MACR,KAAK;AACH,eACE,gBAAAjG;AAAA,UAACC;AAAA,UAAA;AAAA,YAEC,IAAIyG;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAezB,KAAY;AAAA,YAC3B,OAAAD;AAAA,UAAA;AAAA,UANK+G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAA1G;AAAA,UAACI;AAAA,UAAA;AAAA,YAEC,IAAIsG;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAezB,KAAY;AAAA,YAC3B,OAAAD;AAAA,UAAA;AAAA,UANK+G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAA1G;AAAA,UAACgC;AAAA,UAAA;AAAA,YAEC,IAAI0E;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAezB,KAAY;AAAA,YAC3B,OAAAD;AAAA,UAAA;AAAA,UANK+G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAA3G,EAAAqT,IAAA,EACE,UAAA;AAAA,UAAA,gBAAApT;AAAA,YAACU;AAAA,YAAA;AAAA,cAEC,IAAIgG;AAAA,cACJ,OAAAjH;AAAA,cACA,OAAOqQ,GAAYnJ,CAAG;AAAA,cACtB,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,cAC1C,iBAAezB,KAAY;AAAA,cAC3B,OAAAD;AAAA,YAAA;AAAA,YANK+G;AAAA,UAAA;AAAA,UAQNA,MAAQ,WACP,gBAAA3G,EAAC,OAAA,EAAI,WAAU,yCACb,UAAA;AAAA,YAAA,gBAAAC,EAAC,OAAE,UAAA,sHAAA,CAAmH;AAAA,YACtH,gBAAAA,EAAC,OAAE,UAAA,2DAAA,CAAwD;AAAA,8BAE1D,KAAA,EAAE,UAAA;AAAA,cAAA;AAAA,cACO;AAAA,cACR,gBAAAA,EAAC,KAAA,EAAE,MAAK,0BAAyB,QAAO,UAAS,KAAI,uBAAsB,WAAU,0BAAyB,UAAA,iBAAA,CAE9G;AAAA,cAAK;AAAA,cAAI;AAAA,cACL;AAAA,cACJ,gBAAAA,EAAC,KAAA,EAAE,MAAK,0BAAyB,QAAO,UAAS,KAAI,uBAAsB,WAAU,0BAAyB,UAAA,mBAAA,CAE9G;AAAA,cAAI;AAAA,YAAA,EAAA,CAEN;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GAEJ;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAA;AAAA,UAAC+B;AAAA,UAAA;AAAA,YAEC,IAAI2E;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAezB,KAAY;AAAA,YAC3B,OAAAD;AAAA,UAAA;AAAA,UANK+G;AAAA,QAAA;AAAA,MASX,KAAK;AACH,eACE,gBAAA1G;AAAA,UAACG;AAAA,UAAA;AAAA,YAEC,IAAIuG;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOsQ,GAAcpJ,CAAG;AAAA,YACxB,KAAK;AAAA,YACL,MAAM;AAAA,YACN,WAAU;AAAA,YACV,SAAQ;AAAA,YACR,WAAW,CAACtF,MAAM;AAChB,cAAIwL,GAAsBxL,EAAE,GAAG,KAC7BA,EAAE,eAAA;AAAA,YAEN;AAAA,YACA,UAAU,CAACA,MAAM+P,EAAIzE,GAAuBtL,EAAE,cAAc,KAAK,CAAC;AAAA,YAClE,iBAAezB,KAAY;AAAA,YAC3B,OAAAD;AAAA,UAAA;AAAA,UAfK+G;AAAA,QAAA;AAAA,MAkBX,KAAK;AACH,eACE,gBAAA1G;AAAA,UAACiC;AAAA,UAAA;AAAA,YAEC,IAAIyE;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAezB,KAAY;AAAA,YAC3B,OAAAD;AAAA,YACA,MAAM;AAAA,UAAA;AAAA,UAPD+G;AAAA,QAAA;AAAA,MAUX,KAAK,QAAQ;AACX,YAAI2M,IAAUvG,GAAqBpG,CAAG,GAClC4M,IAAY3T;AAChB,YAAI+G,MAAQ,yBAAyBwI,GAAW;AAC9C,gBAAMqE,IAAMzE,EAAWzI,GAAQ6I,GAAW,eAAe;AACzD,cAAI,OAAOqE,KAAQ,YAAYA,GAAK;AAClC,kBAAMC,IAAU,IAAI,KAAKD,CAAG;AAC5B,gBAAI,CAAC,MAAMC,EAAQ,QAAA,CAAS,GAAG;AAC7B,oBAAMC,IAAQ,IAAI,KAAKD,CAAO;AAG9B,kBAFAC,EAAM,YAAYA,EAAM,YAAA,IAAgB,EAAE,GAC1CJ,IAAU3G,GAAiB+G,CAAK,GAC5B,OAAO9M,KAAQ,YAAYA,GAAK;AAClC,sBAAM+M,IAAU,IAAI,KAAK/M,CAAG;AAC5B,gBAAI,CAAC,MAAM+M,EAAQ,SAAS,KAAKA,IAAUD,MACzCH,IAAY;AAAA,cAEhB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,eACE,gBAAAtT;AAAA,UAACmC;AAAA,UAAA;AAAA,YAEC,IAAIuE;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,KAAK0M;AAAA,YACL,UAAU,CAAChS,MAAM+P,EAAI/P,EAAE,cAAc,KAAK;AAAA,YAC1C,iBAAezB,KAAY;AAAA,YAC3B,OAAO0T;AAAA,UAAA;AAAA,UAPF5M;AAAA,QAAA;AAAA,MAUX;AAAA,MAEA,KAAK,YAAY;AACf,YAAIT,EAAE,SAAS;AACb,gBAAM0I,IAAoB,MAAM,QAAQhI,CAAG,IAAKA,IAAmB,CAAA;AACnE,iBACE,gBAAA5G,EAAC,OAAA,EAAc,WAAU,aACvB,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,cACZ,UAAA;AAAA,cAAAN;AAAA,cACAG,KAAY,gBAAAI,EAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA,IAAA,CAAC;AAAA,YAAA,GACpD;AAAA,YACA,gBAAAA,EAAC,SAAI,WAAU,yCACZ,YAAE,QAAQ,IAAI,CAACgD,MAAQ;AACtB,oBAAM2Q,IAAQ,GAAGjN,CAAG,IAAIZ,GAAQ9C,CAAG,CAAC,IAC9BT,IAAUoM,EAAQ,SAAS3L,CAAG;AACpC,qBACE,gBAAAhD;AAAA,gBAACoC;AAAA,gBAAA;AAAA,kBAEC,IAAIuR;AAAA,kBACJ,OAAO3Q;AAAA,kBACP,SAAAT;AAAA,kBACA,UAAU,CAAClB,MAAM;AACf,0BAAMwN,IAAO,IAAI,IAAIF,CAAO;AAC5B,oBAAItN,EAAE,cAAc,UAASwN,EAAK,IAAI7L,CAAG,IACpC6L,EAAK,OAAO7L,CAAG,GACpBoO,EAAI,MAAM,KAAKvC,CAAI,CAAC;AAAA,kBACtB;AAAA,kBACA,iBAAejP,KAAY;AAAA,gBAAA;AAAA,gBAVtB+T;AAAA,cAAA;AAAA,YAaX,CAAC,EAAA,CACH;AAAA,YACChU,KAAS,gBAAAK,EAAC,KAAA,EAAE,WAAU,6BAA6B,UAAAL,EAAA,CAAM;AAAA,UAAA,EAAA,GA1BlD+G,CA2BV;AAAA,QAEJ;AACA,eACE,gBAAA1G;AAAA,UAACoC;AAAA,UAAA;AAAA,YAEC,IAAIsE;AAAA,YACJ,OAAO9G,IAAW,GAAGH,CAAK,OAAOA;AAAA,YACjC,SAAS,CAAC,CAACkH;AAAA,YACX,UAAU,CAACtF,MAAM+P,EAAI/P,EAAE,cAAc,OAAO;AAAA,YAC5C,iBAAezB,KAAY;AAAA,UAAA;AAAA,UALtB8G;AAAA,QAAA;AAAA,MAQX;AAAA,MAEA,KAAK,SAAS;AACZ,YAAIsG,GAAgC/G,CAAC;AACnC,iBAAO;AAET,cAAM2N,IAAO3N,EAAE,WAAW,CAAA,GAEpB4N,IAAa3E,KAAaA,EAAU,SAAS,IAAI,GAAGxI,CAAG,KAAKwI,EAAU,KAAK,IAAI,CAAC,KAAKxI;AAC3F,iCACGlE,IAAA,EAAqB,QAAQ/C,GAAO,iBAAiBG,IAAW,oBAAoB,QAClF,UAAAgU,EAAK,IAAI,CAAC5Q,MACT,gBAAAhD,EAACqC,IAAA,EAAqC,MAAMwR,GAAY,OAAO7Q,GAAK,SAAS2D,MAAQ3D,GAAK,UAAU,MAAMoO,EAAIpO,CAAG,GAC9G,UAAAA,EAAA,GADS,GAAG0D,CAAG,IAAIZ,GAAQ9C,CAAG,CAAC,EAElC,CACD,KALc0D,CAMjB;AAAA,MAEJ;AAAA,MAEA,KAAK,UAAU;AACb,YAAIkN,IAAO3N,EAAE,WAAW,CAAA;AAQxB,YANIS,MAAQ,uBACVkN,IAAOzD,GAAkB,iBAAiB,IAAI,CAAC3J,MAAuBA,EAAE,GAAG,KAAK,CAAA,IAE9EE,MAAQ,WACVkN,IAAO,CAAC,GAAG3J,EAAyB,IAElCvD,MAAQ,SAAS;AACnB,gBAAMoN,IAAehF,EAAWzI,GAAQ6I,GAAW,MAAM,GACnD6E,IAAejF,EAAWzI,GAAQ6I,GAAW,MAAM;AACzD,UAAA0E,IAAO7H,GAAuB+H,GAAcC,CAAY,GACpDH,EAAK,WAAW,MAClBA,IAAO,CAAC,GAAGrH,EAA8B,IAEvC,OAAO5F,KAAQ,YAAYA,KAAO,CAACiN,EAAK,SAASjN,CAAG,MAAGiN,IAAO,CAACjN,GAAK,GAAGiN,CAAI;AAAA,QACjF;AACA,YAAIlN,MAAQ,cAAc;AACxB,gBAAMoN,IAAehF,EAAWzI,GAAQ6I,GAAW,MAAM,GACnD6E,IAAejF,EAAWzI,GAAQ6I,GAAW,MAAM,GACnD8E,IAAgBlF,EAAWzI,GAAQ6I,GAAW,OAAO;AAC3D,UAAA0E,IAAOzH,GAA2B2H,GAAcC,GAAcC,CAAa,GACvEJ,EAAK,WAAW,MAClBA,IAAO,CAAC,GAAGpH,EAAmC,IAE5C,OAAO7F,KAAQ,YAAYA,KAAO,CAACiN,EAAK,SAASjN,CAAG,MAAGiN,IAAO,CAACjN,GAAK,GAAGiN,CAAI;AAAA,QACjF;AACA,YAAIlN,MAAQ,cAAc;AACxB,gBAAMuN,IAAmB,OAAO1L,GAA6BuG,EAAWzI,GAAQ6I,GAAW,UAAU,CAAC,KAAK,EAAE,EAAE,KAAA;AAC/G,UAAA0E,IAAO;AAAA,YACL,GAAK5L,GAA0EiM,CAAgB,KAAKxH;AAAA,UAAA,GAElG,OAAO9F,KAAQ,YAAYA,KAAO,CAACiN,EAAK,SAASjN,CAAG,MAAGiN,IAAO,CAACjN,GAAK,GAAGiN,CAAI;AAAA,QACjF;AAEA,cAAMM,IAAUjF,GAAcC,GAAWxI,CAAG;AAE5C,eACE,gBAAA1G;AAAA,UAAC2C;AAAA,UAAA;AAAA,YAEC,IAAIuR;AAAA,YACJ,OAAAzU;AAAA,YACA,iBAAeG,KAAY;AAAA,YAC3B,OAAAD;AAAA,YACA,OAAOqQ,GAAcrJ,CAAG;AAAA,YACxB,UAAU,CAACtF,MAAM;AACf,oBAAM8S,IAAY9S,EAAE,cAAc;AAElC,kBAAIqF,MAAQ,UAAUA,MAAQ,UAAUA,MAAQ,WAAWA,MAAQ,YAAY;AAC7E,gBAAA0K,EAAI+C,CAAS;AACb;AAAA,cACF;AAEA,kBAAInD,IAAUhC,EAAY3I,GAAQ6I,GAAWxI,GAAKyN,CAAS;AAC3D,cAAIzN,MAAQ,UACVsK,IAAUhC,EAAYgC,GAAS9B,GAAW,QAAQ,EAAE,GACpD8B,IAAUhC,EAAYgC,GAAS9B,GAAW,SAAS,EAAE,GACrD8B,IAAUhC,EAAYgC,GAAS9B,GAAW,cAAc,EAAE,KACjDxI,MAAQ,UACjBsK,IAAUhC,EAAYgC,GAAS9B,GAAW,SAAS,EAAE,GACrD8B,IAAUhC,EAAYgC,GAAS9B,GAAW,cAAc,EAAE,KACjDxI,MAAQ,UACjBsK,IAAUhC,EAAYgC,GAAS9B,GAAW,cAAc,EAAE,IACjDxI,MAAQ,eACjBsK,IAAUhC,EAAYgC,GAAS9B,GAAW,cAAc,EAAE,IAGxDiB,KAAoBC,IAAgBA,EAAeY,CAAO,MACzCA,CAAO,GAC5BH,EAAeG,CAAO;AAAA,YACxB;AAAA,YACA,aAAY;AAAA,YACZ,SAAS4C,EAAK,IAAI,CAACQ,OAAO;AAAA,cACxB,OAAOA;AAAA,cACP,OAAO9H,GAA6B5F,CAAG,IAAI0N,CAAC,KAAK/H,GAAsB+H,CAAC,KAAKA;AAAA,YAAA,EAC7E;AAAA,UAAA;AAAA,UApCGF;AAAA,QAAA;AAAA,MAuCX;AAAA,MAEA,KAAK;AACH,eACE,gBAAAlU;AAAA,UAAC4D;AAAA,UAAA;AAAA,YAEC,IAAI8C;AAAA,YACJ,OAAAjH;AAAA,YACA,OAAOqQ,GAAYnJ,CAAG;AAAA,YACtB,UAAU,CAAC0N,MAAYjD,EAAIiD,CAAO;AAAA,YAClC,iBAAezU,KAAY;AAAA,YAC3B,OAAAD;AAAA,UAAA;AAAA,UANK+G;AAAA,QAAA;AAAA,MAUX;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,WAAS4N,EAAgBnJ,GAAkB+D,GAAuB;AAChE,WAAO/D,EAAK,IAAI,CAAClF,GAAGsO,MAAW;AAC7B,YAAM7N,IAAM,OAAOT,EAAE,GAAG;AACxB,UAAI,CAAC4D,GAA4B5D,GAAGI,GAAQmK,CAAgB,EAAG,QAAO;AACtE,YAAMgE,IAAOtD,EAAUjL,GAAGiJ,CAAS,GAE7BmC,IAAQpL,EAAE,gBAAgB,CAAA;AAChC,UAAI,CAACoL,EAAM,OAAQ,QAAO,gBAAArR,EAAC,OAAA,EAAmC,UAAAwU,EAAA,GAA1B,QAAQ9N,CAAG,IAAI6N,CAAM,EAAU;AAEnE,YAAM/N,IAAI0G,GAA0BjH,GAAG6I,EAAWzI,GAAQ6I,GAAWxI,CAAG,CAAC,GACnE+N,IAAUpD,EAAM,OAAO,CAACpE,MAAMc,GAAgBvH,GAAGyG,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC,GACvFyH,IAAWD,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAAC,MAAM,EAAE,iCAAiC,IAAIA,EAAQ,MAAM,GAAG,CAAC,IAAIA;AAEzH,+BACG,OAAA,EACE,UAAA;AAAA,QAAAD;AAAA,QAEAE,EAAS,IAAI,CAACC,GAAQC,MAAO;AAC5B,gBAAM9U,IAAY6U,EAAO,wBAAwB,CAAA;AACjD,cAAI,CAAC7U,EAAS,OAAQ,QAAO;AAG7B,cAAI,CAAC6U,EAAO;AACV,mBACE,gBAAA3U,EAAC,OAAA,EAAgC,WAAU,QACxC,UAAAsU,EAAgBxU,GAAUoP,CAAS,EAAA,GAD5B,UAAUxI,CAAG,IAAIkO,CAAE,EAE7B;AAKJ,gBAAMlD,IAAgBtC,GAAS1I,CAAG,GAC5BgI,IAAkBP,GAAM9H,GAAQ,CAAC,GAAI6I,KAAa,CAAA,GAAKwC,CAAa,CAAC,KAAmB,CAAA,GACxFmD,IAAQ,KAAK,IAAI,GAAGnG,EAAI,UAAU,CAAC,GAEnCoG,IAAY,MAAM;AACtB,kBAAMjG,IAAON,GAAelI,GAAQ,CAAC,GAAI6I,KAAa,CAAA,GAAKwC,GAAehD,EAAI,MAAM,GAAG,CAAA,CAAE;AACzF,YAAIyB,KAAoBC,IAAgBA,EAAevB,CAAI,MACtCA,CAAI,GACzBgC,EAAehC,CAAI;AAAA,UACrB,GAEMkG,IAAU,MAAM;AACpB,kBAAMC,IAAUtG,EAAI,MAAM,GAAG,KAAK,IAAI,GAAGA,EAAI,SAAS,CAAC,CAAC,GAClDG,IAAON,GAAelI,GAAQ,CAAC,GAAI6I,KAAa,CAAA,GAAKwC,CAAa,GAAGsD,CAAO;AAClF,YAAI7E,KAAoBC,IAAgBA,EAAevB,CAAI,MACtCA,CAAI,GACzBgC,EAAehC,CAAI;AAAA,UACrB,GAEMoG,IAAc,GAAGvO,CAAG,MAAMkO,CAAE;AAElC,iBACE,gBAAA7U,EAAC,OAAA,EAAgC,WAAU,QACzC,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,cAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,2BAAuB;AAAA,cACvE,gBAAAD,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,gBAAA,gBAAAC,EAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS8U,GAAW,UAAA,cAAA,CAE5E;AAAA,gBACCD,IAAQ,KACP,gBAAA7U,EAAC,UAAA,EAAO,MAAK,UAAS,WAAU,yBAAwB,SAAS+U,GAAS,UAAA,cAAA,CAE1E;AAAA,cAAA,EAAA,CAEJ;AAAA,YAAA,GACF;AAAA,YAEC,MAAM,KAAK,EAAE,QAAQF,EAAA,CAAO,EAAE,IAAI,CAAChC,GAAG3M,MAAQ;AAC7C,oBAAMgP,IAAuB,CAAC,GAAIhG,KAAa,CAAA,GAAKwC,GAAexL,CAAG,GAChEiP,IAAU,GAAGF,CAAW,MAAM/O,CAAG,IACjCkP,IAAc1G,EAAIxI,CAAG,KAAK,CAAA,GAC1BmP,IAAgB3O,MAAQ,WACxB4O,IAAaD,IAAgB,WAAWnP,IAAM,CAAC,KAAK,UAAUA,IAAM,CAAC,IAErEqP,KADgBF,KAAiB,OAAOD,EAAW,eAAgB,YAAYA,EAAW,cAC9D,MAAMA,EAAW,WAAW,KAAK;AAEnE,qBACE,gBAAArV,EAAC,OAAA,EAA6B,WAAU,8BACtC,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8BACZ,UAAA;AAAA,kBAAAuV;AAAA,kBACAC;AAAA,gBAAA,GACH;AAAA,gBAECzV,EAAS,IAAI,CAACgS,OACb,gBAAA/R,EAAC,OAAA,EAA6C,WAAU,QACrD,UAAA;AAAA,kBAAAmR,EAAUY,IAAQoD,CAAS;AAAA,mBAG1B,MAAM;AACN,0BAAMM,KAAa1D,GAAO,gBAAgB,CAAA;AAC1C,wBAAI,CAAC0D,GAAW,OAAQ,QAAO;AAE/B,0BAAMC,KAAW3G,EAAWzI,GAAQ6O,GAAWpD,GAAO,GAAa,GAC7D4D,KAAeF,GAAW,OAAO,CAACvI,OAAMc,GAAgB0H,IAAUxI,GAAE,iBAAiBA,GAAE,gBAAgB,CAAC;AAM9G,4BAJEyI,GAAa,SAAS,KAAK,CAACA,GAAa,KAAK,CAACC,OAAMA,GAAE,iCAAiC,IACpFD,GAAa,MAAM,GAAG,CAAC,IACvBA,IAEe,IAAI,CAACE,IAAIC,OAAQ;AACpC,4BAAM5D,KAAiB2D,GAAG,wBAAwB,CAAA;AAClD,0BAAI,CAAC3D,GAAc,OAAQ,QAAO;AAGlC,0BAAI,CAAC2D,GAAG;AACN,+BACE,gBAAA5V,EAAC,OAAA,EAAqC,WAAU,QAC7C,UAAAsU,EAAgBrC,IAAeiD,CAAS,EAAA,GADjC,UAAUC,CAAO,IAAIU,EAAG,EAElC;AAKJ,4BAAM7D,KAAe5C,GAAS0C,GAAO,GAAa,GAC5CgE,KAAwB3H,GAAM9H,GAAQ,CAAC,GAAG6O,GAAWlD,EAAY,CAAC,KAAmB,CAAA,GACrF+D,KAAc,KAAK,IAAI,GAAGD,GAAU,UAAU,CAAC,GAE/CE,KAAa,MAAM;AACvB,8BAAMnH,KAAON,GAAelI,GAAQ,CAAC,GAAG6O,GAAWlD,IAAc8D,GAAU,MAAM,GAAG,EAAE;AACtF,wBAAI3F,KAAoBC,IAAgBA,EAAevB,EAAI,MACtCA,EAAI,GACzBgC,EAAehC,EAAI;AAAA,sBACrB,GACMoH,KAAY,MAAM;AACtB,8BAAMjB,KAAUc,GAAU,MAAM,GAAG,KAAK,IAAI,GAAGA,GAAU,SAAS,CAAC,CAAC,GAC9DjH,KAAON,GAAelI,GAAQ,CAAC,GAAG6O,GAAWlD,EAAY,GAAGgD,EAAO;AACzE,wBAAI7E,KAAoBC,IAAgBA,EAAevB,EAAI,MACtCA,EAAI,GACzBgC,EAAehC,EAAI;AAAA,sBACrB;AAEA,6BACE,gBAAA9O,EAAC,OAAA,EAA4C,WAAU,QACrD,UAAA;AAAA,wBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,0BAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,2BAAuB;AAAA,0BACvE,gBAAAD,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,4BAAA,gBAAAC,EAAC,YAAO,MAAK,UAAS,WAAU,yBAAwB,SAASgW,IAAY,UAAA,cAAA,CAE7E;AAAA,4BACCD,KAAc,KACb,gBAAA/V,EAAC,UAAA,EAAO,MAAK,UAAS,WAAU,yBAAwB,SAASiW,IAAW,UAAA,cAAA,CAE5E;AAAA,0BAAA,EAAA,CAEJ;AAAA,wBAAA,GACF;AAAA,wBAEC,MAAM,KAAK,EAAE,QAAQF,GAAA,CAAa,EAAE,IAAI,CAACG,IAAIC,OAAS;AACrD,gCAAMC,KAAyB,CAAC,GAAGlB,GAAWlD,IAAcmE,EAAI;AAChE,iCACE,gBAAApW,EAAC,OAAA,EAAkD,WAAU,8BAC3D,UAAA;AAAA,4BAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,8BAA6B,UAAA;AAAA,8BAAA;AAAA,8BAAQoW,KAAO;AAAA,4BAAA,GAAE;AAAA,4BAC5D7B,EAAgBrC,IAAemE,EAAW;AAAA,0BAAA,KAFnC,eAAejB,CAAO,IAAIU,EAAG,IAAIM,EAAI,EAG/C;AAAA,wBAEJ,CAAC;AAAA,sBAAA,EAAA,GAvBO,iBAAiBhB,CAAO,IAAIU,EAAG,EAwBzC;AAAA,oBAEJ,CAAC;AAAA,kBACH,GAAA;AAAA,gBAAG,KA3EK,GAAGV,CAAO,IAAI,OAAOrD,GAAO,GAAG,CAAC,EA4E1C,CACD;AAAA,cAAA,EAAA,GApFO,SAASqD,CAAO,EAqF1B;AAAA,YAEJ,CAAC;AAAA,UAAA,EAAA,GAhHO,UAAUzO,CAAG,IAAIkO,CAAE,EAiH7B;AAAA,QAEJ,CAAC;AAAA,MAAA,EAAA,GA1JO,QAAQlO,CAAG,IAAI6N,CAAM,EA2J/B;AAAA,IAEJ,CAAC;AAAA,EACH;AAGA,QAAM8B,IAAc9F,GAAQ,MAAM;AAChC,UAAM+F,IAAkB,CAAA,GAClBhH,IAAO,CAACnE,GAAkB+D,MAA0B;AACxD,MAAA/D,EAAK,QAAQ,CAAClF,MAAM;AAClB,YAAI,CAAC4D,GAA4B5D,GAAGI,GAAQmK,CAAgB,EAAG;AAC/D,QAAKxD,GAAgC/G,CAAC,KACpCqQ,EAAI,KAAKrQ,CAAC;AAEZ,cAAMS,IAAM,OAAOT,EAAE,GAAG,GAClBoL,IAAQpL,EAAE,gBAAgB,CAAA;AAChC,YAAI,CAACoL,EAAM,OAAQ;AAEnB,cAAM7K,IAAI0G,GAA0BjH,GAAG6I,EAAWzI,GAAQ6I,GAAWxI,CAAG,CAAC,GACnE+N,IAAUpD,EAAM,OAAO,CAACpE,MAAMc,GAAgBvH,GAAGyG,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC;AAG7F,SAFiBwH,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAAC,MAAM,EAAE,iCAAiC,IAAIA,EAAQ,MAAM,GAAG,CAAC,IAAIA,GAEhH,QAAQ,CAAC,MAAM;AACtB,gBAAM3U,IAAY,EAAE,wBAAwB,CAAA;AAC5C,UAAKA,EAAS,WACV,EAAE,qCACNwP,EAAKxP,GAAUoP,CAAS;AAAA,QAC1B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,WAAAI,EAAKgB,CAAc,GACZgG;AAAA,EACT,GAAG,CAAChG,GAAgBjK,GAAQmK,CAAgB,CAAC;AAE7C,WAAS+F,EAAalV,GAAqC;AACzD,IAAAA,EAAE,eAAA;AACF,UAAMmV,IAAkB/M,GAA+BpD,GAAQmK,CAAgB,GACzEiG,IAAsBJ,EAAY,IAAI,CAACpQ,MAAO+D,GAA4B/D,GAAGuK,CAAgB,IAAI,EAAE,GAAGvK,GAAG,UAAUuQ,EAAA,IAAoBvQ,CAAE,GACzIyQ,IAAOvQ,GAAkBsQ,GAAmCpQ,CAAM;AAGxE,QAFA0K,EAAU2F,CAAI,GAEV,OAAO,KAAKA,CAAI,EAAE,SAAS,GAAG;AAChC,YAAMC,IAAWN,EAAY,UAAU,CAACpQ,MAAMyQ,EAAKzQ,EAAE,GAAa,CAAC;AACnE,MAAI0Q,KAAY,KAAG,SAAS,eAAeN,EAAYM,CAAQ,EAAE,GAAa,GAAG,MAAA;AACjF;AAAA,IACF;AACA,IAAAtG,EAAShK,CAAM;AAAA,EACjB;AAEA,SACE,gBAAArG,EAAC,QAAA,EAAK,WAAU,kBAAiB,UAAUuW,GAAc,YAAU,IAChE,UAAAjC,EAAgBhE,CAAc,EAAA,CACjC;AAEJ;ACvhCO,MAAMsG,KAAmB;AAQhC,SAASC,KAA0C;AACjD,SAAI,OAAO,SAAW,MAAoB,CAAA,KAC1C,OAAO,YAAY,OAAO,aAAa,CAAA,GAChC,OAAO;AAChB;AAEO,SAASC,GAAmBC,GAAmBC,IAAmC,IAAU;AAEjG,EADkBH,GAAA,EACR,KAAK;AAAA,IACb,OAAOE;AAAA,IACP,eAAe;AAAA,MACb,GAAGC;AAAA,MACH,aAAaJ;AAAA,IAAA;AAAA,EACf,CACD;AACH;AAGO,SAASK,KAAyB;AACvC,EAAAH,GAAmB,uBAAuB;AAC5C;AAGO,SAASI,KAAyB;AACvC,EAAAJ,GAAmB,uBAAuB;AAC5C;AAGO,SAASK,GAAgBH,GAAgG;AAC9H,EAAAF,GAAmB,+BAA+BE,CAAO;AAC3D;AAGO,SAASI,GAAmBJ,GAAgG;AACjI,EAAAF,GAAmB,kCAAkCE,CAAO;AAC9D;AAGO,SAASK,KAA0B;AACxC,EAAAP,GAAmB,+BAA+B;AACpD;AAGO,SAASQ,GAAgBN,GAAwC;AACtE,EAAAF,GAAmB,+BAA+BE,KAAW,EAAE;AACjE;AAGO,SAASO,KAAsB;AACpC,EAAAT,GAAmB,2BAA2B;AAChD;AC7CA,SAAS9J,GAAgC/G,GAAsB;AAE7D,SADIA,EAAE,cAAc,WAChB,CAACA,EAAE,WAAWA,EAAE,QAAQ,WAAW,KAAKA,EAAE,QAAQ,CAAC,MAAM,QAAc,MAC7DA,EAAE,gBAAgB,CAAA,GACnB,KAAK,CAACgH,MAAMA,EAAE,qCAAqCA,EAAE,oBAAoB,YAAYA,EAAE,qBAAqB,KAAK;AAChI;AAEA,SAASC,GAA0BjH,GAAa3F,GAAyB;AACvE,SAAI0M,GAAgC/G,CAAC,IAAU,QACxC3F;AACT;AAEA,SAAS6M,GAASC,GAA2B;AAC3C,SAAI,OAAOA,KAAM,YAAY,OAAO,SAASA,CAAC,IAAUA,IACpD,OAAOA,KAAM,YAAYA,EAAE,KAAA,MAAW,MAAM,CAAC,OAAO,MAAM,OAAOA,CAAC,CAAC,IAAU,OAAOA,CAAC,IAClF;AACT;AACA,SAASC,GAAOD,GAA2B;AACzC,MAAIA,aAAa,QAAQ,CAAC,OAAO,MAAMA,EAAE,SAAS,EAAG,QAAOA,EAAE,QAAA;AAC9D,MAAI,OAAOA,KAAM,UAAU;AACzB,UAAME,IAAI,KAAK,MAAMF,CAAC;AACtB,WAAO,OAAO,MAAME,CAAC,IAAI,OAAOA;AAAA,EAClC;AACA,SAAO;AACT;AACA,SAASC,GAAI5C,GAAYC,GAA2B;AAClD,QAAM4C,IAAKL,GAASxC,CAAC,GACnB8C,IAAKN,GAASvC,CAAC;AACjB,MAAI4C,KAAM,QAAQC,KAAM,aAAaD,IAAKC;AAC1C,QAAMC,IAAKL,GAAO1C,CAAC,GACjBgD,IAAKN,GAAOzC,CAAC;AACf,SAAI8C,KAAM,QAAQC,KAAM,OAAaD,IAAKC,IACtChD,KAAK,QAAQC,KAAK,OAAa,OAC5B,OAAOD,CAAC,EAAE,cAAc,OAAOC,CAAC,CAAC;AAC1C;AACA,SAASgD,GAASC,GAAmBC,GAA0B;AAC7D,SAAI,MAAM,QAAQD,CAAQ,IAAUA,EAAS,KAAK,CAACrH,MAAMA,MAAMsH,CAAM,IACjE,OAAOD,KAAa,WAAiBC,KAAU,QAAQD,EAAS,SAAS,OAAOC,CAAM,CAAC,IACpF;AACT;AACA,SAASC,GAAgBvH,GAAYgR,GAA0CC,GAAuB;AACpG,UAAQD,GAAA;AAAA,IACN,KAAK;AACH,aAAOhR,MAAMiR;AAAA,IACf,KAAK,YAAY;AACf,YAAMxK,IAAIM,GAAI/G,GAAGiR,CAAG;AACpB,aAAOxK,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK,eAAe;AAClB,YAAMA,IAAIM,GAAI/G,GAAGiR,CAAG;AACpB,aAAOxK,KAAK,QAAQA,IAAI;AAAA,IAC1B;AAAA,IACA,KAAK;AACH,aAAOW,GAASpH,GAAGiR,CAAG;AAAA,IACxB,KAAK;AACH,aAAOjR,KAAK,QAAQiR,KAAO,QAAQ,OAAOjR,CAAC,EAAE,WAAW,OAAOiR,CAAG,CAAC;AAAA,IACrE,KAAK;AACH,aAAOjR,KAAK,QAAQiR,KAAO,QAAQ,OAAOjR,CAAC,EAAE,SAAS,OAAOiR,CAAG,CAAC;AAAA,IACnE;AACE,aAAO;AAAA,EAAA;AAEb;AAGA,SAASC,GAAwBC,GAA+BtR,GAA6C;AAC3G,QAAMmK,IAAmBtH,GAAiCyO,CAAkB,GACtErB,IAAkB,CAAA;AAuBxB,UAtBa,CAACnL,MAAkC;AAC9C,IAAAA,EAAK,QAAQ,CAAClF,MAAM;AAClB,UAAI,CAAC4D,GAA4B5D,GAAGI,GAAQmK,CAAgB,EAAG;AAC/D,MAAKxD,GAAgC/G,CAAC,KACpCqQ,EAAI,KAAKrQ,CAAC;AAEZ,YAAMS,IAAM,OAAOT,EAAE,GAAG,GAClBO,IAAI0G,GAA0BjH,GAAGI,EAAOK,CAAG,CAAC,GAC5C2K,IAAQpL,EAAE,gBAAgB,CAAA;AAChC,UAAI,CAACoL,EAAM,OAAQ;AAEnB,YAAMoD,IAAUpD,EAAM,OAAO,CAACpE,MAAMc,GAAgBvH,GAAGyG,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC;AAG7F,OAFiBwH,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAACkB,MAAMA,EAAE,iCAAiC,IAAIlB,EAAQ,MAAM,GAAG,CAAC,IAAIA,GAEhH,QAAQ,CAACkB,MAAM;AACtB,cAAM7V,IAAY6V,EAAE,wBAAwB,CAAA;AAC5C,QAAK7V,EAAS,WACV6V,EAAE,qCACN7V,EAAS,QAAQ,CAAC8X,MAAUtB,EAAI,KAAKsB,CAAK,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GACKD,CAAI,GACFrB;AACT;AAGA,MAAMnH,KAAe,WACfC,KAAW,CAAC9G,MAAc,GAAGA,CAAC,GAAG6G,EAAY;AAInD,SAAS0I,GAA6B5R,GAAaiJ,GAA+B;AAEhF,MAAIjJ,EAAE,QAAQ,2BAA2B;AACvC,UAAMkL,IAAUjC,EAAUA,EAAU,SAAS,CAAC;AAC9C,WAAO,OAAOiC,KAAY,YAAYA,MAAY;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS2G,GAA6B1R,GAAoC2R,GAA2B7I,IAAuB,CAAA,GAAa;AAEvI,aAAWjJ,KAAKG,GAAW;AACzB,UAAM4R,IAAO,OAAO/R,EAAE,GAAG,GACnBgS,IAAO/K,GAA0BjH,GAAG8R,EAAcC,CAAI,CAAC,GACvD3G,IAAQpL,EAAE,gBAAgB,CAAA;AAChC,QAAI,CAACoL,EAAM,OAAQ;AAEnB,UAAMoD,IAAUpD,EAAM,OAAO,CAACpE,MAAMc,GAAgBkK,GAAMhL,EAAE,iBAAiBA,EAAE,gBAAgB,CAAC,GAC1FyH,IAAWD,EAAQ,SAAS,KAAK,CAACA,EAAQ,KAAK,CAACkB,MAAMA,EAAE,iCAAiC,IAAIlB,EAAQ,MAAM,GAAG,CAAC,IAAIA;AAEzH,eAAW7J,KAAK8J,GAAU;AACxB,YAAM5U,IAAY8K,EAAE,wBAAwB,CAAA;AAC5C,UAAI,CAAC9K,EAAS,OAAQ;AAEtB,UAAI,CAAC8K,EAAE,mCAAmC;AAExC,YAAIkN,GAA6BhY,GAAUiY,GAAe7I,CAAS,EAAG,QAAO;AAC7E;AAAA,MACF;AAGA,YAAMR,IAAOqJ,EAAc3I,GAAS4I,CAAI,CAAC,KAAmB,CAAA;AAC5D,UAAItJ,EAAI,WAAW,EAAG,QAAO;AAE7B,iBAAW,CAACxI,GAAKgS,CAAI,KAAMxJ,EAAuC,WAAW;AAC3E,cAAMyJ,IAAgB,CAAC,GAAGjJ,GAAWE,GAAS4I,CAAI,GAAG9R,CAAG,GAGlDkS,IAAkBtY,EAAS,OAAO,CAACgS,MAAW,CAAC+F,GAA6B/F,GAAQqG,CAAa,CAAC,GAClGE,IAAalS,GAAkBiS,GAAiBF,CAAkB;AAIxE,YAHI,OAAO,OAAOG,CAAU,EAAE,KAAK,OAAO,KAGtCP,GAA6BhY,GAAUoY,GAAoBC,CAAa,EAAG,QAAO;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAASG,GAA4BlS,GAAoCmS,GAAiC;AACxG,SAAOT,GAA6B1R,GAAWmS,CAAU;AAC3D;AAKO,SAASC,GAAW;AAAA,EACzB,QAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,eAAAzI;AAAA,EACA,eAAA0I;AACF,GAMG;AACD,QAAM,CAACC,GAAQC,CAAS,IAAIhY,EAAS8X,KAAiB,CAAC,GACjD,CAACG,GAAWC,CAAY,IAAIlY,EAAqBoP,KAAiB,CAAA,CAAE,GACpE,CAAC+I,GAAmBC,CAAoB,IAAIpY,EAAqC,CAAA,CAAE,GACnF,CAACqY,GAASC,CAAU,IAAItY,EAAS,EAAK,GACtC,CAACuY,GAAcC,CAAe,IAAIxY,EAAS,EAAK,GAChD,CAACyY,GAAYC,CAAa,IAAI1Y,EAAwB,IAAI,GAC1D2Y,IAAWzY,EAAiC,EAAE,GAC9C0Y,IAAkB1Y,EAAoByX,CAAM,GAE5CkB,IAAY,MAAM,QAAQlB,CAAM,KAAKA,EAAO,SAAS,GACrDmB,IAAQD,IAAYlB,EAAO,KAAK,IAAII,GAAQJ,EAAO,SAAS,CAAC,CAAC,IAAI,MAClEoB,IAAWD,GAAO,OAAO;AAG/B,EAAA1Y,EAAU,MAAM;AACd,IAAI0X,MAAkB,UACpBE,EAAUF,CAAa;AAAA,EAE3B,GAAG,CAACA,CAAa,CAAC,GAGlB1X,EAAU,MAAM;AACd,IAAAwY,EAAgB,UAAUjB;AAAA,EAC5B,GAAG,CAACA,CAAM,CAAC,GAEXvX,EAAU,MAAM;AACd,UAAM4Y,IAAgBL,EAAS,QAAQZ,CAAM;AAC7C,IAAIiB,KACFA,EAAc,eAAe,EAAE,UAAU,UAAU,OAAO,WAAW,QAAQ,UAAU;AAAA,EAE3F,GAAG,CAACjB,CAAM,CAAC,GAIX3X,EAAU,MAAM;AACd,IAAIgP,MAAkB,UACpB8I,EAAa9I,CAAa;AAAA,EAE9B,GAAG,CAACA,CAAa,CAAC,GAElBhP,EAAU,MAAM;AACd,QAAI,CAAC0Y,KAAS,CAACC,GAAU;AACvB,MAAAT,EAAW,EAAK,GAChBI,EAAc,IAAI;AAClB;AAAA,IACF;AACA,QAAIP,EAAkBY,CAAQ,GAAG;AAC/B,MAAAT,EAAW,EAAK,GAChBI,EAAc,IAAI;AAClB;AAAA,IACF;AAEA,QAAIO,IAAY;AAChB,WAAAX,EAAW,EAAI,GACfI,EAAc,IAAI,GAElB,QAAQ,QAAQI,EAAM,cAAA,CAAe,EAClC,KAAK,CAACI,MAAO;AACZ,UAAI,CAAAD,GACJ;AAAA,YAAI,CAAC,MAAM,QAAQC,CAAE,SAAS,IAAI,MAAM,kBAAkBH,CAAQ,4BAA4B;AAC9F,QAAAX,EAAqB,CAACvD,OAAO,EAAE,GAAGA,GAAG,CAACkE,CAAQ,GAAGG,EAAA,EAAK;AAAA;AAAA,IACxD,CAAC,EAEA,MAAM,CAACjV,MAAa;AACnB,MAAIgV,KACJP,EAAc,yBAAyBI,GAAO,SAAS,EAAE,MAAM7U,GAAK,WAAW,eAAe,EAAE;AAAA,IAClG,CAAC,EACA,QAAQ,MAAM;AACb,MAAKgV,KAAWX,EAAW,EAAK;AAAA,IAClC,CAAC,GAEI,MAAM;AACX,MAAAW,IAAY;AAAA,IACd;AAAA,EACF,GAAG,CAACH,GAAOC,GAAUZ,CAAiB,CAAC;AAEvC,QAAM7S,IAAYyT,IAAWZ,EAAkBY,CAAQ,IAAI,QACrDrJ,IAAmBD,GAAQ,MAAMrH,GAAkC9C,KAAa,EAAiB,GAAG,CAACA,CAAS,CAAC;AAGrH,EAAAlF,EAAU,MAAM;AACd,IAAI0Y,KAASC,KAAYzT,KACvB+Q,GAAgB;AAAA,MACd,UAAA0C;AAAA,MACA,YAAYD,EAAM,SAASC;AAAA,MAC3B,WAAWhB,IAAS;AAAA,MACpB,YAAYJ,EAAO;AAAA,IAAA,CACpB;AAAA,EAEL,GAAG,CAACoB,GAAUhB,GAAQJ,EAAO,QAAQmB,GAAOxT,CAAS,CAAC;AAGtD,QAAM6T,IAAgB1J,GAAQ,MAAM;AAClC,QAAI,CAACnK,EAAW,QAAO,CAAA;AACvB,UAAM8T,IAAoB,CAAA;AA8B1B,KA3B+B,CAACtI,MAAuC;AACrE,YAAMlI,IAAiB,CAAA,GACjB4F,IAAO,CAACnE,MAAqB;AACjC,QAAAA,EAAK,QAAQ,CAAClF,GAAGQ,MAAM;AACrB,gBAAM6B,IAAItC,GAAUC,GAAGQ,CAAC;AACxB,UAAAiD,EAAK,KAAKpB,CAAC;AACX,gBAAM6R,IAAS/K,GAAS9G,CAAC;AACzB,UAAAoB,EAAK,KAAKyQ,CAAM,IAGFlU,EAAE,gBAAgB,CAAA,GAC1B,QAAQ,CAACgH,MAAM;AACnB,kBAAMnN,IAAYmN,EAAE,wBAAwB,CAAA;AAC5C,YAAInN,EAAS,SAAS,KACpBwP,EAAKxP,CAAQ;AAAA,UAEjB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AACA,aAAAwP,EAAKsC,CAAY,GACVlI;AAAA,IACT,GAG+CtD,CAAS,EAGxC,QAAQ,CAACkC,MAAM;AAC7B,MAAIA,KAAKyQ,MAAWmB,EAAM5R,CAAC,IAAIyQ,EAAUzQ,CAAC;AAAA,IAC5C,CAAC;AAED,eAAW,CAACA,GAAG9B,CAAC,KAAK,OAAO,QAAQuS,CAAS;AAC3C,MAAIzQ,EAAE,SAAS6G,EAAY,KAAK,EAAE7G,KAAK4R,OAAQA,EAAM5R,CAAC,IAAI9B;AAE5D,WAAO0T;AAAA,EACT,GAAG,CAAC9T,GAAW2S,CAAS,CAAC,GAEnBqB,IAAsB,CAACvL,MAAqB;AAChD,IAAAmK,EAAa,CAAC3T,OAAU,EAAE,GAAGA,GAAM,GAAGwJ,IAAO;AAAA,EAC/C,GAEMwL,IAAS,MAAM;AACnB,IAAAvB,EAAU,CAACrS,MAAOA,IAAI,IAAIA,IAAI,IAAI,CAAE,GACpC,SAAS,cAA2B,aAAa,GAAG,SAAS,EAAE,KAAK,GAAG,UAAU,WAA6B;AAAA,EAChH,GAEM6T,IAAS,YAAY;AACzB,QAAI,CAAClU,KAAa,CAACwT,KAAST,KAAWI,KAAcF,EAAc;AAGnE,UAAMkB,IAAU7C,GAAwBtR,GAAW2S,CAAS,GACtDvC,IAAkB/M,GAA+BsP,GAAWvI,CAAgB,GAC5EiG,IAAsB8D,EAAQ,IAAI,CAACtU,MAAO+D,GAA4B/D,GAAGuK,CAAgB,IAAI,EAAE,GAAGvK,GAAG,UAAUuQ,EAAA,IAAoBvQ,CAAE,GACrIuU,IAAarU,GAAkBsQ,GAAmCsC,CAAS,GAC3E0B,IAAY,OAAO,OAAOD,CAAU,EAAE,KAAK,OAAO,GAGlDE,IAAcpC,GAA4BlS,GAAW2S,CAAS,GAG9D4B,IAAM5B,EAAU,4BAChB6B,IAAc7B,EAAU,kBAAkB,CAAA;AAChD,QAAI8B,IAAW;AACf,QAAIF,KAAOC,EAAW,UAAU,GAAG;AACjC,YAAM1I,IAAY6G,EAAU,mBAAmB,CAAA;AAC/C,eAAS+B,IAAK,GAAGA,IAAK5I,EAAS,QAAQ4I,KAAM;AAC3C,cAAMC,IAAUJ,EAAI,IAAIG,CAAE,EAAE;AAC5B,YAAI,CAACC,EAAS;AAEd,cAAMnI,IAAOgI,EAAW,IAAI,CAAC/H,GAAGmI,OAAOD,EAAQ,IAAIC,EAAE,EAAE,KAAK,CAAC,GACvDlI,IAAUF,EAAK,OAAO,CAAC9B,MAAMA,IAAI,CAAC;AACxC,YAAIgC,EAAQ,UAAU,KAAKA,EAAQ,MAAM,CAAChC,MAAMA,MAAM,EAAE,GAAG;AACzD,UAAA+J,IAAW;AACX;AAAA,QACF;AACA,cAAM9H,IAAQH,EAAK,OAAO,CAACjI,GAAGC,OAAMD,IAAIC,IAAG,CAAC;AAC5C,YAAImI,IAAQ,KAAKA,MAAU,KAAK;AAC9B,UAAA8H,IAAW;AACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,EAAAJ,KAAaC,KAAeG,IAEhC;AAAA,MAAAvB,EAAgB,EAAI;AACpB,UAAI;AACF,cAAM2B,IAAapC,KAAUJ,EAAO,SAAS,GACvC,EAAE,SAAAyC,GAAS,OAAAvb,EAAA,IAAUsb,IAAa,MAAMtC,EAAWI,GAAWc,KAAY,EAAE,IAAI,MAAMnB,EAAgBuB,GAAeJ,KAAY,EAAE;AACzI,YAAI,CAACqB,GAAS;AACZ,UAAA1B,EAAc7Z,KAAS,mBAAmB;AAC1C;AAAA,QACF;AACA,YAAI,CAACsb,GAAY;AACf,gBAAME,IAAezB,EAAgB,SAC/B0B,IAAqBD,EAAa,UAAU,CAACpV,MAAMA,EAAE,QAAQ8T,CAAQ,GACrEwB,IACJD,KAAsB,IAAI,KAAK,IAAIA,IAAqB,GAAGD,EAAa,SAAS,CAAC,IAAI,KAAK,IAAItC,IAAS,GAAGsC,EAAa,SAAS,CAAC;AACpI,UAAArC,EAAUuC,CAAe;AAAA,QAC3B;AAAA,MACF,UAAA;AACE,QAAA/B,EAAgB,EAAK;AAAA,MACvB;AAAA;AAAA,EACF,GAGMgC,IAAc/K,GAAQ,MAAM;AAChC,QAAI,CAACnK,KAAa+S,KAAaI,KAAcF,EAAc,QAAO;AAClE,UAAMkB,IAAU7C,GAAwBtR,GAAW2S,CAAS,GACtDvC,IAAkB/M,GAA+BsP,GAAWvI,CAAgB,GAC5EiG,IAAsB8D,EAAQ,IAAI,CAACtU,MAAO+D,GAA4B/D,GAAGuK,CAAgB,IAAI,EAAE,GAAGvK,GAAG,UAAUuQ,EAAA,IAAoBvQ,CAAE,GACrIuU,IAAarU,GAAkBsQ,GAAmCsC,CAAS,GAC3E0B,IAAY,OAAO,OAAOD,CAAU,EAAE,KAAK,OAAO,GAClDE,IAAcpC,GAA4BlS,GAAW2S,CAAS,GAE9D4B,IAAM5B,EAAU,4BAChB6B,IAAc7B,EAAU,kBAAkB,CAAA;AAChD,QAAI8B,IAAW;AACf,QAAIF,KAAOC,EAAW,UAAU,GAAG;AACjC,YAAM1I,IAAY6G,EAAU,mBAAmB,CAAA;AAC/C,eAAS+B,IAAK,GAAGA,IAAK5I,EAAS,QAAQ4I,KAAM;AAC3C,cAAMC,IAAUJ,EAAI,IAAIG,CAAE,EAAE;AAC5B,YAAI,CAACC,EAAS;AAEd,cAAMnI,IAAOgI,EAAW,IAAI,CAAC/H,GAAGmI,OAAOD,EAAQ,IAAIC,EAAE,EAAE,KAAK,CAAC,GACvDlI,IAAUF,EAAK,OAAO,CAAC9B,MAAMA,IAAI,CAAC;AACxC,YAAIgC,EAAQ,UAAU,KAAKA,EAAQ,MAAM,CAAChC,MAAMA,MAAM,EAAE,GAAG;AACzD,UAAA+J,IAAW;AACX;AAAA,QACF;AACA,cAAM9H,IAAQH,EAAK,OAAO,CAACjI,GAAGC,OAAMD,IAAIC,IAAG,CAAC;AAC5C,YAAImI,IAAQ,KAAKA,MAAU,KAAK;AAC9B,UAAA8H,IAAW;AACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAOJ,KAAaC,KAAeG;AAAA,EACrC,GAAG,CAACzU,GAAW2S,GAAWI,GAASI,GAAYF,GAAc7I,CAAgB,CAAC;AAE9E,SAAKmJ,IAGH,gBAAA5Z,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oEACb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,gBAAgB,QAAQ,iBAAiB,OAAA;AAAA,UAEjD,UAAAyY,EAAO,QAAQ,CAAC1S,GAAGU,MAAM;AAAA,YACxB,gBAAAzG;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,KAAK,CAACub,MAAO;AACX,kBAAA9B,EAAS,QAAQhT,CAAC,IAAI8U;AAAA,gBACxB;AAAA,gBACA,WAAW,yFACT9U,IAAIoS,IACA,2CACApS,MAAMoS,IACJ,2CACA,iCACR;AAAA,gBAEC,UAAA9S,EAAE;AAAA,cAAA;AAAA,cAZEA,EAAE,OAAO,SAASU,CAAC;AAAA,YAAA;AAAA,YAc1B,GAAIA,IAAIgS,EAAO,SAAS,IACpB;AAAA,cACE,gBAAAzY,EAAC,QAA+B,WAAU,uDAAsD,iBAAvF,SAAS+F,EAAE,OAAOU,CAAC,EAE5B;AAAA,YAAA,IAEF,CAAA;AAAA,UAAC,CACN;AAAA,QAAA;AAAA,MAAA;AAAA,MAEH,gBAAA1G,EAAC,OAAA,EAAI,WAAU,iEACZ,UAAA;AAAA,QAAA,KAAK,IAAI8Y,IAAS,GAAGJ,EAAO,MAAM;AAAA,QAAE;AAAA,QAAIA,EAAO;AAAA,MAAA,EAAA,CAClD;AAAA,IAAA,GACF;AAAA,sBAGC,OAAA,EACE,UAAA;AAAA,MAAAU,KAAW,gBAAAnZ,EAAC,OAAA,EAAI,WAAU,kBAAiB,UAAA,YAAQ;AAAA,MAEnD4Z,KACC,gBAAA5Z;AAAA,QAACiQ;AAAA,QAAA;AAAA,UAEC,WAAW7J,KAAa,CAAA;AAAA,UACxB,kBAAkB6T;AAAA,UAClB,gBAAgBG;AAAA,UAChB,UAAU,MAAME,EAAA;AAAA,QAAO;AAAA,QAJlBV,EAAM;AAAA,MAAA;AAAA,IAKb,GAEJ;AAAA,IAGC,CAACT,KAAWI,KACX,gBAAAxZ,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAK,UAAAuZ,EAAA,CAAW;AAAA,MAChBK,KACC,gBAAA5Z;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,YAAAkZ,EAAqB,CAAC,MAAM;AAC1B,kBAAI,CAACW,EAAU,QAAO;AACtB,oBAAM2B,IAAO,EAAE,GAAG,EAAA;AAClB,4BAAOA,EAAK3B,CAAQ,GACb2B;AAAA,YACT,CAAC;AAAA,UACH;AAAA,UACD,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GAEJ;AAAA,sBAID,OAAA,EAAI,WAAW3C,IAAS,IAAI,2BAA2B,IACrD,UAAA;AAAA,MAAAA,IAAS,KACR,gBAAA7Y;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAASqa;AAAA,UACT,UAAUlB;AAAA,UACV,WAAU;AAAA,UACX,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKH,gBAAApZ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,oBAAiB;AAAA,UACjB,SAASua;AAAA,UACT,UAAUgB;AAAA,UACV,WAAW;AAAA,YACT;AAAA,YACAzC,IAAS,IAAI,KAAK;AAAA,YAClB;AAAA,YACA;AAAA,YACA;AAAA,YACAyC,IACI,gBACA;AAAA,UAAA,EACJ,KAAK,GAAG;AAAA,UAET,UAAA;AAAA,YAAAjC,KACC,gBAAAtZ,EAAC,SAAI,WAAU,mCAAkC,OAAM,8BAA6B,MAAK,QAAO,SAAQ,aACtG,UAAA;AAAA,cAAA,gBAAAC,EAAC,UAAA,EAAO,WAAU,cAAa,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,KAAI;AAAA,cAC5F,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,GAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH,GACH;AAAA,YAED6Y,MAAWJ,EAAO,SAAS,IAAI,WAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAC7C,EAAA,CACF;AAAA,EAAA,GACF,sBAxHsB,OAAA,EAAI,WAAU,kBAAiB,UAAA,cAAU;AA0HnE;ACpiBA,MAAMgD,KAAe,oBACfC,KAAiB;AAKhB,SAASC,GAAYC,GAAuB;AACjD,MAAI;AACF,iBAAa,QAAQH,IAAcG,CAAO;AAAA,EAC5C,SAASjc,GAAO;AACd,YAAQ,MAAM,2CAA2CA,CAAK;AAAA,EAChE;AACF;AAKO,SAASkc,KAA6B;AAC3C,MAAI;AACF,WAAO,aAAa,QAAQJ,EAAY;AAAA,EAC1C,SAAS9b,GAAO;AACd,mBAAQ,MAAM,6CAA6CA,CAAK,GACzD;AAAA,EACT;AACF;AAKO,SAASmc,KAAqB;AACnC,MAAI;AACF,iBAAa,WAAWL,EAAY;AAAA,EACtC,SAAS9b,GAAO;AACd,YAAQ,MAAM,8CAA8CA,CAAK;AAAA,EACnE;AACF;AAKO,SAASoc,GAAcC,GAAqB;AACjD,MAAI;AACF,iBAAa,QAAQN,IAAgBM,CAAK;AAAA,EAC5C,SAASrc,GAAO;AACd,YAAQ,MAAM,6CAA6CA,CAAK;AAAA,EAClE;AACF;AAKO,SAASsc,KAA+B;AAC7C,MAAI;AACF,WAAO,aAAa,QAAQP,EAAc;AAAA,EAC5C,SAAS/b,GAAO;AACd,mBAAQ,MAAM,+CAA+CA,CAAK,GAC3D;AAAA,EACT;AACF;AAKO,SAASuc,KAAuB;AACrC,MAAI;AACF,iBAAa,WAAWR,EAAc;AAAA,EACxC,SAAS/b,GAAO;AACd,YAAQ,MAAM,gDAAgDA,CAAK;AAAA,EACrE;AACF;AAKO,SAASwc,KAA0B;AACxC,EAAAL,GAAA,GACAI,GAAA;AACF;ACxEA,MAAME,KAAW;AAGjB,IAAIC,KAA2B;AAExB,SAASC,GAAaN,GAAqB;AAChD,EAAAK,KAAYL,GACZD,GAAcC,CAAK;AACrB;AAEO,SAASO,KAA8B;AAC5C,SAAOF;AACT;AAEO,SAASG,KAAiC;AAC/C,QAAMC,IAAcR,GAAA;AACpB,EAAIQ,MACFJ,KAAYI;AAEhB;AAEO,SAASP,KAAuB;AACrC,EAAAG,KAAY,MACZK,GAAA;AACF;AAEA,eAAeC,GAAyBC,GAAaC,GAAiC;AACpF,QAAMC,IAAuB;AAAA,IAC3B,gBAAgB;AAAA,EAAA;AAGlB,EAAIT,OACFS,EAAQ,gBAAmB,UAAUT,EAAS;AAGhD,QAAMU,IAAW,MAAM,MAAMH,GAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAAE;AAAA,IACA,MAAM,KAAK,UAAUD,CAAI;AAAA,EAAA,CAC1B;AAED,MAAI,CAACE,EAAS,IAAI;AAChB,QAAIC,IAAe,8BAA8BD,EAAS,MAAM;AAChE,QAAI;AAEF,MAAAC,KADkB,MAAMD,EAAS,KAAA,GACR,SAASC;AAAA,IACpC,QAAQ;AAEN,MAAAA,IAAeD,EAAS,cAAcC;AAAA,IACxC;AACA,UAAMrd,IAAQ,IAAI,MAAMqd,CAAY;AACpC,UAAArd,EAAM,aAAaod,EAAS,QACtBpd;AAAA,EACR;AAEA,SAAOod;AACT;AAEA,eAAsBE,GAAoBrD,GAAkD;AAG1F,SADa,OADI,MAAM+C,GAAyB,GAAGP,EAAQ,2BAA2B,EAAE,OAAAxC,GAAO,GACnE,KAAA;AAE9B;AAEA,eAAsBsD,KAAkD;AAGtE,SADa,OADI,MAAMP,GAAyB,GAAGP,EAAQ,yBAAyB,EAAE,GAC1D,KAAA;AAE9B;AAEA,eAAsBe,GAAYC,GAA6C;AAE7E,QAAMtS,IAAO,OADI,MAAM6R,GAAyB,GAAGP,EAAQ,iBAAiB,EAAE,OAAAgB,GAAO,GACzD,KAAA;AAC5B,MAAI,CAACtS,KAAQ,OAAOA,KAAS,YAAY,CAACA,EAAK;AAC7C,UAAM,IAAI,MAAM,iCAAiC,KAAK,UAAUA,CAAI,CAAC,EAAE;AAEzE,SAAOA;AACT;AAGA,eAAsBuS,GAAYrG,GAAkDsG,GAAmB1B,GAA+B;AAGpI,QAAMiB,IAAkG,EAAE,SAAA7F,GAAS,UAAAsG,EAAAA;AACnH,SAAI1B,KAAW,OAAOA,KAAY,YAAYA,EAAQ,KAAA,MAAW,OAC/DiB,EAAK,UAAUjB,IAGJ,OADI,MAAMe,GAAyB,GAAGP,EAAQ,iBAAiBS,CAAI,GACpD,KAAA;AAE9B;AAEA,eAAsBU,GAAY3B,GAAiB4B,GAAyE;AAG1H,SADa,OADI,MAAMb,GAAyB,GAAGP,EAAQ,iBAAiB,EAAE,SAAAR,GAAS,SAAA4B,GAAS,GACpE,KAAA;AAE9B;AAEA,eAAsBC,GAAiBC,GAAkD;AAGvF,SADa,OADI,MAAMf,GAAyB,GAAGP,EAAQ,uBAAuB,EAAE,OAAAsB,GAAO,GAC/D,KAAA;AAE9B;AAEA,eAAsBJ,KAAiD;AAGrE,SADa,OADI,MAAMX,GAAyB,GAAGP,EAAQ,cAAc,EAAE,GAC/C,KAAA;AAE9B;AAEA,eAAsBuB,GAAS/B,GAA6C;AAE1E,QAAMiB,IAAOjB,IAAU,EAAE,SAAAA,EAAA,IAAY,CAAA;AAGrC,SADa,OADI,MAAMe,GAAyB,GAAGP,EAAQ,cAAcS,CAAI,GACjD,KAAA;AAE9B;AAEA,eAAsBe,GAAYC,GAAqD;AAErF,QAAM/S,IAAO,OADI,MAAM6R,GAAyB,GAAGP,EAAQ,iBAAiB,EAAE,aAAAyB,GAAa,GAC/D,KAAA;AAE5B,SAAO/S,KAAQ,OAAOA,KAAS,YAAY,aAAaA,IAAOA,IAAO,EAAE,SAAS,GAAA;AACnF;ACxHA,MAAMgT,KAAoB,IAAI,KAAK,aAAa,SAAS;AAAA,EACvD,OAAO;AAAA,EACP,UAAU;AACZ,CAAC;AAID,SAASC,GAAW,EAAE,QAAAC,KAAmC;AAKvD,SACE,gBAAAhe;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAPe,MAAM;AACvB,QAAAuX,GAAA,GACAyG,IAAA;AAAA,MACF;AAAA,MAKI,WAAU;AAAA,MACX,UAAA;AAAA,IAAA;AAAA,EAAA;AAIL;AAEO,SAASC,GAAM,EAAE,OAAAC,GAAO,QAAAF,KAA4D;AACzF,QAAMG,IAAW,MAAM,QAAQD,CAAK,KAAKA,EAAM,SAAS,GAClD,CAACE,GAAiBC,CAAkB,IAAIvd,EAAwC,CAAA,CAAE;AAOxF,SAJAI,EAAU,MAAM;AACd,IAAAsb,GAAA;AAAA,EACF,GAAG,CAAA,CAAE,GAEA2B,IAWH,gBAAApe,EAAC,WAAA,EAAQ,WAAU,QACjB,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,wCAAuC,UAAA,SAAK;AAAA,sBACzD,OAAA,EAAI,WAAU,iDACZ,UAAAke,EAAM,IAAI,CAACI,MAAS;AACnB,YAAMC,IAAiBD,EAAK,gBAAgB,KACtCE,IAAmBV,GAAkB,OAAOS,CAAc,GAC1DE,IAAUH,EAAK,eACfnZ,IAASiZ,EAAgBK,CAAO,KAAK,QACrCC,IAAevZ,MAAW,WAC1BwZ,IAAcxZ,MAAW,WAEzByZ,IAAoB,YAAY;AACpC,QAAAP,EAAmB,CAAChZ,OAAU,EAAE,GAAGA,GAAM,CAACoZ,CAAO,GAAG,UAAA,EAAY;AAChE,YAAI;AAIF,cAFAjC,GAAA,GAEI,CADUD,GAAA;AAEZ,kBAAM,IAAI,MAAM,iEAAiE;AAMnF,cAAI,GAJW,MAAMqB,GAAYU,EAAK,aAAa,IAG3B,YAAY,IACtB,OAAM,IAAI,MAAM,gBAAgB;AAG9C,UAAAnC,GAAA,GACAD,GAAA,GAEAmC,EAAmB,CAAChZ,OAAU,EAAE,GAAGA,GAAM,CAACoZ,CAAO,GAAG,UAAA,EAAY;AAAA,QAClE,QAAQ;AACN,UAAAJ,EAAmB,CAAChZ,OAAU,EAAE,GAAGA,GAAM,CAACoZ,CAAO,GAAG,QAAA,EAAU;AAAA,QAChE;AAAA,MACF;AAEA,aACE,gBAAA1e,EAAC,OAAA,EAAkB,WAAU,sGAE3B,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACZ,UAAA;AAAA,UAAAue,EAAK,sBACJ,gBAAAte,EAAC,OAAA,EAAI,KAAK,yBAAyBse,EAAK,mBAAmB,IAAI,KAAKA,EAAK,cAAc,WAAU,8BAA6B,IAE9H,gBAAAte,EAAC,OAAA,EAAI,WAAU,2GACZ,UAAAse,EAAK,aAAa,OAAO,CAAC,EAAE,YAAA,EAAY,CAC3C;AAAA,UAEF,gBAAAte,EAAC,OAAA,EAAI,WAAU,UACb,UAAA,gBAAAA,EAAC,QAAG,WAAU,gCAAgC,UAAAse,EAAK,aAAA,CAAa,EAAA,CAClE;AAAA,QAAA,GACF;AAAA,QAGA,gBAAAve,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA,WAAO;AAAA,UAC7C,gBAAAA,EAAC,KAAA,EAAE,WAAU,qCAAqC,UAAAwe,EAAA,CAAiB;AAAA,QAAA,GACrE;AAAA,QAGA,gBAAAze,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,UAAA,gBAAAC,EAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA,QAAI;AAAA,UAC1C,gBAAAD,EAAC,KAAA,EAAE,WAAU,8BAA8B,UAAA;AAAA,YAAAue,EAAK;AAAA,YAAY;AAAA,UAAA,EAAA,CAAO;AAAA,QAAA,GACrE;AAAA,QAGCA,EAAK,oBACJ,gBAAAte,EAAC,OAAA,EAAI,WAAU,QACb,UAAA,gBAAAD,EAAC,KAAA,EAAE,WAAU,0BAAyB,UAAA;AAAA,UAAA;AAAA,UAAWue,EAAK;AAAA,QAAA,EAAA,CAAiB,EAAA,CACzE;AAAA,QAIF,gBAAAve,EAAC,OAAA,EAAI,WAAU,gBACb,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS4e;AAAA,cACT,UAAUF,KAAgBC;AAAA,cAC1B,WAAW,8LACTA,IAAc,6BAA6B,oEAC7C;AAAA,cAEC,UAAAD,IAAe,gBAAgBC,IAAc,cAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAE7DxZ,MAAW,WAAW,gBAAAnF,EAAC,KAAA,EAAE,WAAU,6BAA4B,UAAA,2CAAuC;AAAA,UACtGmF,MAAW,aAAa,gBAAAnF,EAAC,KAAA,EAAE,WAAU,iCAAgC,UAAA,iCAAA,CAA8B;AAAA,QAAA,EAAA,CACtG;AAAA,MAAA,EAAA,GAhDQye,CAiDV;AAAA,IAEJ,CAAC,EAAA,CACH;AAAA,IACCT,KAAU,gBAAAhe,EAAC+d,IAAA,EAAW,QAAAC,EAAA,CAAgB;AAAA,EAAA,GACzC,IApGE,gBAAAje,EAAC,WAAA,EAAQ,WAAU,QACjB,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,wCAAuC,UAAA,SAAK;AAAA,IAC1D,gBAAAA,EAAC,KAAA,EAAE,WAAU,+BAA8B,UAAA,wCAAoC;AAAA,IAC9Ege,KAAU,gBAAAhe,EAAC+d,IAAA,EAAW,QAAAC,EAAA,CAAgB;AAAA,EAAA,GACzC;AAkGN;ACzIO,SAASa,EAAsBve,GAAuD;AAC3F,MAAIA,MAAU,GAAM,QAAO;AAC3B,MAAIA,MAAU,GAAO,QAAO;AAE9B;AAKO,SAASwe,EAAWC,GAA4D;AACrF,MAAKA;AACL,QAAI;AACF,YAAMtT,IAAI,OAAOsT,KAAS,WAAW,IAAI,KAAKA,CAAI,IAAIA;AACtD,aAAI,MAAMtT,EAAE,QAAA,CAAS,IAAG,SACjBA,EAAE,YAAA,EAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IACrC,QAAQ;AACN;AAAA,IACF;AACF;AAKO,SAASuT,GAAkBC,GAA6B;AAE7D,QAAMC,IAAQD,GACRE,IAAyB,CAAA;AAG/B,EAAID,EAAM,UAAOC,EAAW,QAAQD,EAAM,QACtCA,EAAM,eAAYC,EAAW,aAAaD,EAAM,aAChDA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,UAAOC,EAAW,QAAQD,EAAM,QACtCA,EAAM,kBAAeC,EAAW,gBAAgBL,EAAWI,EAAM,aAAqB,IACtFA,EAAM,YAASC,EAAW,UAAUD,EAAM,UAC1CA,EAAM,UAAOC,EAAW,QAAQD,EAAM;AAG1C,QAAME,IAAyB,CAAA;AAC/B,EAAIF,EAAM,UAAQE,EAAa,KAAKF,EAAM,MAAM,GAC5CA,EAAM,UAAQE,EAAa,KAAKF,EAAM,MAAM,GAC5CA,EAAM,QAAME,EAAa,KAAKF,EAAM,IAAI,GACxCA,EAAM,SAAOE,EAAa,KAAKF,EAAM,KAAK,GAC1CA,EAAM,eAAaE,EAAa,KAAKF,EAAM,WAAW,GACtDE,EAAa,SAAS,MACxBD,EAAW,UAAUC,EAAa,KAAK,IAAI,IAGzCF,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAAWC,EAAW,mBAAmBD,EAAM,mBAC7GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,iBAAcC,EAAW,eAAeL,EAAWI,EAAM,YAAoB;AAGvF,QAAMG,IAA8B,CAAA;AACpC,EAAIH,EAAM,gBAAcG,EAAkB,KAAKH,EAAM,YAAY,GAC7DA,EAAM,gBAAcG,EAAkB,KAAKH,EAAM,YAAY,GAC7DA,EAAM,cAAYG,EAAkB,KAAKH,EAAM,UAAU,GACzDA,EAAM,eAAaG,EAAkB,KAAKH,EAAM,WAAW,GAC3DA,EAAM,qBAAmBG,EAAkB,KAAKH,EAAM,iBAAiB,GACvEG,EAAkB,SAAS,MAC7BF,EAAW,gBAAgBE,EAAkB,KAAK,IAAI,IAGpDH,EAAM,2BAA2B,QAAQA,EAAM,2BAA2B,WAC5EC,EAAW,yBAAyBD,EAAM,yBACxCA,EAAM,iCAAiC,QAAQA,EAAM,iCAAiC,WACxFC,EAAW,+BAA+BN,EAAsBK,EAAM,4BAAuC,IAE3GA,EAAM,oBAAiBC,EAAW,kBAAkBD,EAAM,kBAG1DA,EAAM,mBAAgBC,EAAW,iBAAiBL,EAAWI,EAAM,cAAsB,IAGzFA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,+BAA4BC,EAAW,6BAA6BL,EAAWI,EAAM,0BAAkC,IAC7HA,EAAM,4BAAyBC,EAAW,0BAA0BD,EAAM,0BAC1EA,EAAM,+BAA4BC,EAAW,6BAA6BD,EAAM,6BAChFA,EAAM,iCAA8BC,EAAW,+BAA+BD,EAAM,+BACpFA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAAWC,EAAW,mBAAmBD,EAAM,mBAC7GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,mCAAmC,QAAQA,EAAM,mCAAmC,WAC5FC,EAAW,iCAAiCD,EAAM,iCAEhDA,EAAM,6CAA6C,QAAQA,EAAM,6CAA6C,WAChHC,EAAW,2CAA2CN,EAAsBK,EAAM,wCAAwC,IAExHA,EAAM,sCAAsC,QAAQA,EAAM,sCAAsC,WAClGC,EAAW,oCAAoCD,EAAM,oCAEnDA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,gBAAaC,EAAW,cAAcD,EAAM,cAClDA,EAAM,eAAYC,EAAW,aAAaD,EAAM,aAChDA,EAAM,gCAA6BC,EAAW,8BAA8BD,EAAM,8BAClFA,EAAM,+BAA4BC,EAAW,6BAA6BD,EAAM,6BAGhFA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,+BAA4BC,EAAW,6BAA6BL,EAAWI,EAAM,0BAAkC,IAC7HA,EAAM,4BAAyBC,EAAW,0BAA0BD,EAAM,0BAG1EA,EAAM,eAAe,QAAQA,EAAM,eAAe,WAAWC,EAAW,aAAaD,EAAM,aAC3FA,EAAM,oBAAoB,QAAQA,EAAM,oBAAoB,WAAWC,EAAW,kBAAkBD,EAAM,kBAC1GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAAWC,EAAW,iBAAiBD,EAAM,iBACvGA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WAAWC,EAAW,uBAAuBD,EAAM,uBACzHA,EAAM,4BAA4B,QAAQA,EAAM,4BAA4B,WAC9EC,EAAW,0BAA0BD,EAAM,0BAEzCA,EAAM,uBAAuB,QAAQA,EAAM,uBAAuB,WACpEC,EAAW,qBAAqBN,EAAsBK,EAAM,kBAAkB,IAE5EA,EAAM,kCAA+BC,EAAW,gCAAgCD,EAAM,gCACtFA,EAAM,qCAAkCC,EAAW,mCAAmCD,EAAM,mCAC5FA,EAAM,wBAAqBC,EAAW,sBAAsBD,EAAM,sBAClEA,EAAM,kBAAeC,EAAW,gBAAgBD,EAAM,gBACtDA,EAAM,yBAAsBC,EAAW,uBAAuBD,EAAM,uBACpEA,EAAM,uBAAuB,QAAQA,EAAM,uBAAuB,WACpEC,EAAW,qBAAqBD,EAAM,qBAEpCA,EAAM,sBAAmBC,EAAW,oBAAoBD,EAAM,oBAC9DA,EAAM,uBAAoBC,EAAW,qBAAqBD,EAAM,qBAChEA,EAAM,oBAAiBC,EAAW,kBAAkBD,EAAM,kBAC1DA,EAAM,uBAAoBC,EAAW,qBAAqBD,EAAM,qBAChEA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,iBAAcC,EAAW,eAAeD,EAAM,eACpDA,EAAM,sBAAmBC,EAAW,oBAAoBD,EAAM,oBAC9DA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBD,EAAM,uBAEtCA,EAAM,kBAAeC,EAAW,gBAAgBD,EAAM,gBACtDA,EAAM,iBAAcC,EAAW,eAAeD,EAAM,eACpDA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BD,EAAM,2BAE1CA,EAAM,kBAAeC,EAAW,gBAAgBD,EAAM,gBACtDA,EAAM,cAAWC,EAAW,YAAYD,EAAM,YAC9CA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAAWC,EAAW,mBAAmBD,EAAM,mBAC7GA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAAWC,EAAW,oBAAoBD,EAAM,oBAChHA,EAAM,mBAAgBC,EAAW,iBAAiBD,EAAM,iBACxDA,EAAM,eAAYC,EAAW,aAAaD,EAAM,aAChDA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAAWC,EAAW,iBAAiBD,EAAM,iBACvGA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBD,EAAM,uBAEtCA,EAAM,YAAY,QAAQA,EAAM,YAAY,WAAWC,EAAW,UAAUN,EAAsBK,EAAM,OAAO,IAC/GA,EAAM,mBAAgBC,EAAW,iBAAiBD,EAAM,iBACxDA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAAWC,EAAW,iBAAiBD,EAAM,iBACvGA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,mBAAgBC,EAAW,iBAAiBD,EAAM,iBAGxDA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAChEC,EAAW,mBAAmBN,EAAsBK,EAAM,gBAAgB,IAExEA,EAAM,6BAA6B,QAAQA,EAAM,6BAA6B,WAChFC,EAAW,2BAA2BN,EAAsBK,EAAM,wBAAwB,IAExFA,EAAM,0BAA0B,QAAQA,EAAM,0BAA0B,WAC1EC,EAAW,wBAAwBN,EAAsBK,EAAM,qBAAqB,IAElFA,EAAM,wBAAwB,QAAQA,EAAM,wBAAwB,WACtEC,EAAW,sBAAsBN,EAAsBK,EAAM,mBAAmB,IAE9EA,EAAM,8BAA8B,QAAQA,EAAM,8BAA8B,WAClFC,EAAW,4BAA4BN,EAAsBK,EAAM,yBAAyB,IAI1FA,EAAM,0BAA0B,QAAQA,EAAM,0BAA0B,WAC1EC,EAAW,wBAAwBN,EAAsBK,EAAM,qBAAqB,IAElFA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBN,EAAsBK,EAAM,oBAAoB,IAEhFA,EAAM,8BAA2BC,EAAW,4BAA4BD,EAAM,4BAC9EA,EAAM,oBAAoB,QAAQA,EAAM,oBAAoB,WAC9DC,EAAW,kBAAkBN,EAAsBK,EAAM,eAAe,IAEtEA,EAAM,qBAAqB,QAAQA,EAAM,qBAAqB,WAChEC,EAAW,mBAAmBN,EAAsBK,EAAM,gBAAgB,IAExEA,EAAM,0BAAuBC,EAAW,wBAAwBD,EAAM,wBACtEA,EAAM,yBAAyB,QAAQA,EAAM,yBAAyB,WACxEC,EAAW,uBAAuBN,EAAsBK,EAAM,oBAAoB,IAEhFA,EAAM,mBAAmB,QAAQA,EAAM,mBAAmB,WAC5DC,EAAW,iBAAiBN,EAAsBK,EAAM,cAAc,IAEpEA,EAAM,sBAAsB,QAAQA,EAAM,sBAAsB,WAClEC,EAAW,oBAAoBN,EAAsBK,EAAM,iBAAiB,IAI1EA,EAAM,4BAA4B,QAAQA,EAAM,4BAA4B,WAC9EC,EAAW,0BAA0BN,EAAsBK,EAAM,uBAAuB,IAEtFA,EAAM,uCAAuC,QAAQA,EAAM,uCAAuC,WACpGC,EAAW,qCAAqCN,EAAsBK,EAAM,kCAAkC,IAE5GA,EAAM,8CAA8C,QAAQA,EAAM,8CAA8C,WAClHC,EAAW,4CAA4CN,EAAsBK,EAAM,yCAAyC,IAE1HA,EAAM,4CAA4C,QAAQA,EAAM,4CAA4C,WAC9GC,EAAW,0CAA0CN,EAAsBK,EAAM,uCAAuC;AAI1H,QAAMI,IAAyC,CAAA;AAC/C,MAAIJ,EAAM;AACR,eAAW1Y,KAAK0Y,EAAM;AACpB,MAAI1Y,EAAE,oBAAoBA,EAAE,UAAoBA,EAAE,gBAAgB,IAAIA,EAAE;AAK5E,SAAI0Y,EAAM,WAAWA,EAAM,QAAQ,SAAS,KAC1CC,EAAW,UAAU,OACrBA,EAAW,iBAAiBD,EAAM,QAAQ,IAAI,CAACK,MAAc;AAC3D,UAAMC,IAASD,GACTE,IAA2B,CAAA;AACjC,IAAID,EAAO,eAAYC,EAAa,aAAaD,EAAO,aACpDA,EAAO,gBAAaC,EAAa,cAAcD,EAAO,cACtDA,EAAO,cAAWC,EAAa,YAAYD,EAAO,YAClDA,EAAO,kBAAeC,EAAa,gBAAgBX,EAAWU,EAAO,aAAqB,IAC1FA,EAAO,WAAQC,EAAa,SAASD,EAAO,SAC5CA,EAAO,mBAAgBC,EAAa,iBAAiBD,EAAO,iBAC5DA,EAAO,4BAAyBC,EAAa,0BAA0BD,EAAO,0BAC9EA,EAAO,wBAAwB,QAAQA,EAAO,wBAAwB,WACxEC,EAAa,sBAAuBD,EAAO,sBAAkC,QAAQ,OAEnFA,EAAO,kBAAeC,EAAa,gBAAgBD,EAAO,gBAC1DA,EAAO,mBAAgBC,EAAa,iBAAiBD,EAAO,iBAC5DA,EAAO,mBAAgBC,EAAa,iBAAiBD,EAAO,iBAC5DA,EAAO,wBAAqBC,EAAa,sBAAsBX,EAAWU,EAAO,mBAA2B,IAC5GA,EAAO,oBAAiBC,EAAa,kBAAkBjX,GAAmCgX,EAAO,eAAyB,IAC1HA,EAAO,eAAYC,EAAa,aAAahX,GAA+B+W,EAAO,UAAoB,IACvGA,EAAO,aAAUC,EAAa,WAAWlX,GAA6BiX,EAAO,QAAkB,IAC/FA,EAAO,sBAAmBC,EAAa,oBAAoBD,EAAO,oBAClEA,EAAO,8CAA8C,QAAQA,EAAO,8CAA8C,WACpHC,EAAa,4CAA4CZ,EAAsBW,EAAO,yCAAoD,IAExIA,EAAO,+BAA+B,QAAQA,EAAO,+BAA+B,WACtFC,EAAa,6BAA6BZ,EAAsBW,EAAO,0BAAqC,IAE1GA,EAAO,oCACTC,EAAa,kCAAkCX,EAAWU,EAAO,+BAAuC,IAEtGA,EAAO,SAAS,QAAQA,EAAO,SAAS,WAC1CC,EAAa,OAAOZ,EAAsBW,EAAO,IAAe;AAElE,UAAME,IAAcF,EAAmC;AACvD,IAAI,OAAOE,KAAe,aAAUD,EAAa,cAAcC;AAG/D,UAAMC,IAAmBH,EAAO;AAChC,IAAIG,KAAoBA,EAAiB,SAAS,MAChDF,EAAa,oBAAoB,OACjCA,EAAa,2BAA2BE,EAAiB,IAAI,CAACC,MAAc;AAC1E,YAAMC,IAA8B,CAAA;AACpC,aAAID,EAAU,SAAMC,EAAgB,OAAOD,EAAU,OACjDA,EAAU,gBAAaC,EAAgB,cAAcf,EAAWc,EAAU,WAAmB,IAC1FC;AAAA,IACT,CAAC;AAIH,UAAMC,IAAkBN,EAAO;AAC/B,IAAIM,KAAmBA,EAAgB,SAAS,MAC9CL,EAAa,mBAAmB,OAChCA,EAAa,0BAA0BK,EAAgB,IAAI,CAACC,MAAa;AACvE,YAAMC,IAA6B,CAAA;AACnC,aAAID,EAAS,gBAAaC,EAAe,cAAclB,EAAWiB,EAAS,WAAmB,IAC1FA,EAAS,gBAAaC,EAAe,cAAcD,EAAS,cAC5DA,EAAS,qBACXC,EAAe,mBAAmBV,EAAeS,EAAS,gBAA0B,KAAKA,EAAS,mBAEhGA,EAAS,sCAAsC,QAAQA,EAAS,sCAAsC,WACxGC,EAAe,oCAAoCD,EAAS,oCAE1DA,EAAS,sCAAsC,QAAQA,EAAS,sCAAsC,WACxGC,EAAe,oCAAoCD,EAAS,oCAEvDC;AAAA,IACT,CAAC;AAIH,UAAMC,IAAeT,EAAO;AAC5B,WAAIS,KAAgBA,EAAa,SAAS,MACxCR,EAAa,SAAS,OACtBA,EAAa,gBAAgBQ,EAAa,IAAI,CAACC,MAAS;AACtD,YAAMC,IAAyB,CAAA;AAC/B,aAAID,EAAK,gBAAaC,EAAW,cAAcD,EAAK,cAChDA,EAAK,qBAAkBC,EAAW,mBAAmBrB,EAAWoB,EAAK,gBAAwB,IAC7FA,EAAK,sBAAsB,QAAQA,EAAK,sBAAsB,WAChEC,EAAW,oBAAoBD,EAAK,oBAElCA,EAAK,qBACPC,EAAW,mBAAmBb,EAAeY,EAAK,gBAA0B,KAAKA,EAAK,mBAEjFC;AAAA,IACT,CAAC,IAGIV;AAAA,EACT,CAAC,KAEDN,EAAW,UAAU,MAInBD,EAAM,YAAYA,EAAM,SAAS,SAAS,KAC5CC,EAAW,WAAW,OACtBA,EAAW,kBAAkBD,EAAM,SAAS,IAAI,CAACkB,MAAe;AAC9D,UAAMC,IAAUD,GACVE,IAA4B,CAAA;AAClC,IAAID,EAAQ,QAAKC,EAAc,MAAMD,EAAQ,MACzCA,EAAQ,SAAS,QAAQA,EAAQ,SAAS,WAAWC,EAAc,OAAO,OAAOD,EAAQ,IAAI,IAC7FA,EAAQ,SAAMC,EAAc,OAAOD,EAAQ,OAC3CA,EAAQ,UAAOC,EAAc,QAAQD,EAAQ,QAC7CA,EAAQ,eAAYC,EAAc,aAAaD,EAAQ,aACvDA,EAAQ,mBAAgBC,EAAc,iBAAiBD,EAAQ,iBAC/DA,EAAQ,UAAOC,EAAc,QAAQD,EAAQ,QAC7CA,EAAQ,mBAAmB,QAAQA,EAAQ,mBAAmB,WAChEC,EAAc,iBAAiBD,EAAQ,iBAErCA,EAAQ,kBAAkB,QAAQA,EAAQ,kBAAkB,WAC9DC,EAAc,gBAAgBD,EAAQ,gBAEpCA,EAAQ,oBAAoB,QAAQA,EAAQ,oBAAoB,WAClEC,EAAc,kBAAkBD,EAAQ;AAG1C,UAAME,IAAiC,CAAA;AACvC,WAAIF,EAAQ,2BAAyBE,EAAqB,KAAKF,EAAQ,uBAAiC,GACpGA,EAAQ,2BAAyBE,EAAqB,KAAKF,EAAQ,uBAAiC,GACpGA,EAAQ,yBAAuBE,EAAqB,KAAKF,EAAQ,qBAA+B,GAChGA,EAAQ,0BAAwBE,EAAqB,KAAKF,EAAQ,sBAAgC,GAClGA,EAAQ,gCAA8BE,EAAqB,KAAKF,EAAQ,4BAAsC,GAC9GE,EAAqB,SAAS,MAChCD,EAAc,mBAAmBC,EAAqB,KAAK,IAAI,IAG7DF,EAAQ,uBAAuB,QAAQA,EAAQ,uBAAuB,WACxEC,EAAc,qBAAqBzB,EAAsBwB,EAAQ,kBAA6B,IAE5FA,EAAQ,kBAAeC,EAAc,gBAAgBxB,EAAWuB,EAAQ,aAAqB,IAC7FA,EAAQ,oBAAiBC,EAAc,kBAAkBD,EAAQ,kBACjEA,EAAQ,2BAAwBC,EAAc,yBAAyBD,EAAQ,yBAC/EA,EAAQ,qBAAqB,QAAQA,EAAQ,qBAAqB,WACpEC,EAAc,mBAAmBzB,EAAsBwB,EAAQ,gBAA2B,IAExFA,EAAQ,2BAA2B,QAAQA,EAAQ,2BAA2B,WAChFC,EAAc,yBAAyBzB,EAAsBwB,EAAQ,sBAAiC,IAEpGA,EAAQ,iCAAiC,QAAQA,EAAQ,iCAAiC,WAC5FC,EAAc,+BAA+BD,EAAQ,+BAEnDA,EAAQ,8BAA8B,QAAQA,EAAQ,8BAA8B,WACtFC,EAAc,4BAA4BzB,EAAsBwB,EAAQ,yBAAoC,IAE1GA,EAAQ,iCAAiC,QAAQA,EAAQ,iCAAiC,WAC5FC,EAAc,+BAA+BzB,EAAsBwB,EAAQ,4BAAuC,IAEhHA,EAAQ,4BAAyBC,EAAc,0BAA0BD,EAAQ,0BACjFA,EAAQ,4BAAyBC,EAAc,0BAA0BD,EAAQ,0BACjFA,EAAQ,6BAA0BC,EAAc,2BAA2BD,EAAQ,2BACnFA,EAAQ,mCAAgCC,EAAc,iCAAiCD,EAAQ,iCAC/FA,EAAQ,uBAAuB,QAAQA,EAAQ,uBAAuB,WACxEC,EAAc,qBAAqBzB,EAAsBwB,EAAQ,kBAA6B,IAE5FA,EAAQ,uBAAuB,QAAQA,EAAQ,uBAAuB,WACxEC,EAAc,qBAAqBzB,EAAsBwB,EAAQ,kBAA6B,IAI5FA,EAAQ,aAAaA,EAAQ,UAAU,SAAS,MAClDC,EAAc,mBAAmBD,EAAQ,UAAU,IAAI,CAACG,MAAa;AACnE,YAAMC,IAA6B,CAAA;AACnC,aAAID,EAAS,SAAMC,EAAe,OAAOD,EAAS,OAC9CA,EAAS,2BAA2B,QAAQA,EAAS,2BAA2B,WAClFC,EAAe,yBAAyBD,EAAS,yBAE/CA,EAAS,6BAA6B,QAAQA,EAAS,6BAA6B,WACtFC,EAAe,2BAA2BD,EAAS,2BAEjDA,EAAS,+BAA+B,QAAQA,EAAS,+BAA+B,WAC1FC,EAAe,6BAA6BD,EAAS,6BAEnDA,EAAS,wBAAwB,QAAQA,EAAS,wBAAwB,WAC5EC,EAAe,sBAAsBD,EAAS,sBAE5CA,EAAS,qBAAqB,QAAQA,EAAS,qBAAqB,WACtEC,EAAe,mBAAmBD,EAAS,mBAEzCA,EAAS,gBAAgB,QAAQA,EAAS,gBAAgB,WAC5DC,EAAe,cAAc5B,EAAsB2B,EAAS,WAAW,IAElEC;AAAA,IACT,CAAC,IAICJ,EAAQ,uBAAuBA,EAAQ,oBAAoB,SAAS,MACtEC,EAAc,6BAA6BD,EAAQ,oBAAoB,IAAI,CAACK,MAAe;AACzF,YAAMC,IAA+B,CAAA;AACrC,aAAID,EAAW,SAAMC,EAAiB,OAAOD,EAAW,OACpDA,EAAW,SAAMC,EAAiB,OAAOD,EAAW,OACpDA,EAAW,WAAQC,EAAiB,SAASD,EAAW,SACxDA,EAAW,WAAQC,EAAiB,SAASD,EAAW,SACxDA,EAAW,SAAMC,EAAiB,OAAOD,EAAW,OACpDA,EAAW,UAAOC,EAAiB,QAAQD,EAAW,QACtDA,EAAW,gBAAaC,EAAiB,cAAcD,EAAW,cAClEA,EAAW,UAAOC,EAAiB,QAAQD,EAAW,QACtDA,EAAW,QAAKC,EAAiB,MAAMD,EAAW,MAC/CC;AAAA,IACT,CAAC,IAGIL;AAAA,EACT,CAAC,KAEDnB,EAAW,WAAW,MAIpBD,EAAM,UAAUA,EAAM,OAAO,SAAS,MACxCC,EAAW,cAAc,OACzBA,EAAW,qBAAqBD,EAAM,OAAO,IAAI,CAACgB,MAAS;AACzD,UAAMC,IAAyB,CAAA;AAC/B,WAAID,EAAK,gBAAaC,EAAW,cAAcD,EAAK,cAChDA,EAAK,qBAAkBC,EAAW,mBAAmBrB,EAAWoB,EAAK,gBAAgB,IACrFA,EAAK,sBAAsB,QAAQA,EAAK,sBAAsB,WAChEC,EAAW,oBAAoBD,EAAK,oBAE/BC;AAAA,EACT,CAAC,IAGIhB;AACT;AChbA,MAAMyB,yBAAgD,IAAI,CAAC,WAAW,SAAS,UAAU,SAAS,CAAC;AAEnG,SAASC,GAAiCxa,GAAsD;AAC9F,SAAKA,IACD,MAAM,QAAQA,EAAO,cAAc,IAAUA,EAAO,eAAe,SACnE,MAAM,QAAQA,EAAO,OAAO,IAAUA,EAAO,QAAQ,SAClD,OAHa;AAItB;AAEA,SAASya,GAA+BC,GAAyB1a,GAAoD;AAEnH,MADoBwa,GAAiCxa,CAAM,MACvC,GAAG;AACrB,UAAM2a,IAAWD,EAAW,OAAO,CAACnH,MAAUA,EAAM,QAAQ,YAAY;AAExE,WAAOoH,EAAS,SAAS,IAAIA,IAAWD;AAAA,EAC1C;AACA,SAAOA;AACT;AAEA,SAASE,GAAoB5a,GAAgC;AAC3D,QAAM6a,IAA0B,CAAA,GAG1BC,IAAwB,CAAC7gB,MAA4B;AACzD,QAAI,OAAOA,KAAU,UAAU;AAC7B,UAAIA,MAAU,MAAO,QAAO;AAC5B,UAAIA,MAAU,KAAM,QAAO;AAAA,IAC7B;AACA,WAAOA;AAAA,EACT,GAGM8gB,IAAe,OAAO,KAAK/a,CAAM,EAAE,OAAO,CAACK,MAAQ,CAACA,EAAI,SAAS,SAAS,CAAC,GAG3E2a,wBAAqB,IAAA,GAGrBC,wBAA0B,IAAA;AAChC,aAAW,CAAC5a,GAAKpG,CAAK,KAAK,OAAO,QAAQ+F,CAAM;AAC9C,IAAIK,EAAI,SAAS,SAAS,KAAK,MAAM,QAAQpG,CAAK,MAChDghB,EAAoB,IAAI5a,EAAI,QAAQ,WAAW,EAAE,CAAC,GAClDpG,EAAM,QAAQ,CAAC4X,MAAS;AACtB,MAAI,OAAOA,KAAS,YAAYA,MAAS,QACvC,OAAO,KAAKA,CAAI,EAAE,QAAQ,CAACqJ,MAAc;AACvC,QAAAF,EAAe,IAAIE,CAAS;AAAA,MAC9B,CAAC;AAAA,IAEL,CAAC;AAIL,aAAW,CAAC7a,GAAKpG,CAAK,KAAK,OAAO,QAAQ+F,CAAM;AAC9C,QAAIK,EAAI,SAAS,SAAS,GAAG;AAE3B,YAAMgJ,IAAUhJ,EAAI,QAAQ,WAAW,EAAE;AAMzC,UAFkC0a,EAAa,SAAS1R,CAAO,GAEhC;AAE7B,cAAM8R,IAAmB,MAAM,QAAQlhB,CAAK,IAAIA,EAAM,IAAI,CAAC4X,MAAS+I,GAAoB/I,CAAkB,CAAC,IAAI5X;AAC/G,QAAA4gB,EAAYxR,CAAO,IAAI8R;AAAA,MACzB;AAAA,IACF,WAAW,CAAC9a,EAAI,SAAS,SAAS,GAAG;AAGnC,UAAI4a,EAAoB,IAAI5a,CAAG,EAAG;AAGlC,MAAK2a,EAAe,IAAI3a,CAAG,MACzBwa,EAAYxa,CAAG,IAAIya,EAAsB7gB,CAAK;AAAA,IAElD;AAMF,QAAMmhB,IAAkBP,EAAY;AACpC,SAAI,OAAOO,KAAoB,YAAYA,EAAgB,KAAA,MAAW,OACpEP,EAAY,2BAA2BO,MAAoB,qBAGzD,MAAM,QAAQP,EAAY,OAAO,MACnCA,EAAY,UAAUA,EAAY,QAAQ,IAAI,CAAC1B,MAAW;AACxD,QAAI,CAACA,KAAU,OAAOA,KAAW,SAAU,QAAOA;AAClD,UAAMtH,IAAO,EAAE,GAAIsH,EAAA;AACnB,WAAAtH,EAAK,WAAW3P,GAA6B2P,EAAK,QAAQ,GAC1DA,EAAK,kBAAkB1P,GAAmC0P,EAAK,eAAe,GAC9EA,EAAK,aAAazP,GAA+ByP,EAAK,UAAU,GACzDA;AAAA,EACT,CAAC,IAGH,QAAQ;AAAA,IACN;AAAA,IACA,OAAOgJ,EAAY;AAAA,IACnB;AAAA,IACA,MAAM,QAAQA,EAAY,OAAO;AAAA,IACjC,MAAM,QAAQA,EAAY,OAAO,IAAI,SAASA,EAAY,QAAQ,MAAM,KAAK,SAAS,KAAK,UAAUA,EAAY,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC;AAAA,EAAA,GAEtI,MAAM,QAAQA,EAAY,OAAO,KACnCA,EAAY,QAAQ,QAAQ,CAACzV,GAAYhF,MAAc;AACrD,UAAMib,IAAMjW;AACZ,YAAQ,IAAI,4BAA4BhF,CAAC,KAAK;AAAA,MAC5C,YAAYib,EAAI;AAAA,MAChB,QAAQA,EAAI;AAAA,MACZ,gBAAgBA,EAAI;AAAA,MACpB,iBAAiBA,EAAI;AAAA,MACrB,UAAUA,EAAI;AAAA,MACd,YAAYA,EAAI;AAAA,MAChB,MAAMA,EAAI;AAAA,MACV,MAAM,OAAO,KAAKA,CAAG;AAAA,IAAA,CACtB;AAAA,EACH,CAAC,GAGIR;AACT;AAEA,SAASS,GAAgBlJ,GAAqBoB,GAAwB;AACpE,QAAM+H,IAAoBnJ,EAAO,UAAU,CAAC1S,MAAMA,EAAE,QAAQ8T,CAAQ;AACpE,SAAI+H,IAAoB,IAAU/H,IAChBpB,EAAOmJ,IAAoB,CAAC,GAC3B,OAA6B/H;AAClD;AAEA,SAASgI,GAAyCjI,GAAcxT,GAAmC;AAIjG,SAHIwT,MAAU,wBAEkBxT,EAAU,KAAK,CAACH,MAAM,OAAOA,EAAE,GAAG,MAAM,0CAA0C,IAC9EG,IAE7B;AAAA,IACL,GAAGA;AAAA,IACH;AAAA,MACE,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS,CAAC,OAAO,IAAI;AAAA,MACrB,KAAK;AAAA,MACL,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ;AAEA,SAAS0b,GAAyBlI,GAAcxT,GAAmC;AACjF,MAAIwT,MAAU,UAAW,QAAOxT;AAEhC,QAAM2b,IAAQ,CAAC5W,MACbA,EAAK,IAAI,CAAClF,MAAM;AACd,UAAM+b,IAAmB/b,EAAE,cAAc,IAAI,CAAC,MAAM;AAClD,YAAM4J,IAAU,EAAE,wBAAwB,CAAA;AAC1C,aAAKA,EAAO,SACL;AAAA,QACL,GAAG;AAAA,QACH,sBAAsBkS,EAAMlS,CAAM;AAAA,MAAA,IAHT;AAAA,IAK7B,CAAC;AAED,WAAI,OAAO5J,EAAE,GAAG,MAAM,QACb+b,IAAmB,EAAE,GAAG/b,GAAG,cAAc+b,MAAqB/b,IAGhE;AAAA,MACL,GAAGA;AAAA,MACH,UAAU;AAAA,MACV,GAAI+b,IAAmB,EAAE,cAAcA,MAAqB,CAAA;AAAA,IAAC;AAAA,EAEjE,CAAC;AAEH,SAAOD,EAAM3b,CAAS;AACxB;AAEA,SAAwB6b,GAAO,EAAE,QAAAC,GAAQ,SAAAC,KAAqD;AAC5F,QAAM,CAAC1J,GAAQ2J,CAAS,IAAIthB,EAAsB,CAAA,CAAE,GAC9C,CAAC8a,GAASyG,CAAU,IAAIvhB,EAAwB,IAAI,GACpD,CAACod,GAAOoE,CAAQ,IAAIxhB,EAAkC,IAAI,GAC1D,CAACyhB,GAAiBC,CAAkB,IAAI1hB,EAA4B,IAAI,GACxE,CAAC2hB,GAAoBC,CAAqB,IAAI5hB,EAA6B,MAAS,GACpF,CAAC6hB,GAAkBC,CAAmB,IAAI9hB,EAAS,EAAK;AAE9D,WAAS+hB,EAAsBpK,GAA8B;AAE3D,UAAMqK,IAAwC;AAAA,MAC5C,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,YAAY;AAAA,IAAA;AAGd,WAAOrK,EAAO,IAAI,CAACmB,OAAW;AAAA,MAC5B,KAAKA;AAAA,MACL,OAAOkJ,EAAclJ,CAAK,KAAKA;AAAA,MAC/B,eAAe,YAAY;AACzB,cAAM9O,IAAO,MAAMmS,GAAoBrD,CAAK,GACtCI,IAAK6H,GAAyCjI,GAAO9O,EAAK,SAAS;AACzE,eAAOgX,GAAyBlI,GAAOI,CAAE;AAAA,MAC3C;AAAA,IAAA,EACA;AAAA,EACJ;AAGA,EAAA9Y,EAAU,MAAM;AAgFd,IAAIghB,MA/EsB,YAAY;AACpC,UAAI;AAEF,cAAMa,IAAgBlH,GAAA;AAGtB,YAFAW,GAAA,GAEIuG,GAAe;AACjB,UAAAH,EAAoB,EAAI,GACxBP,EAAWU,CAAa;AAGxB,cAAI;AACF,kBAAM/G,IAAQO,GAAA,GACRQ,IAAW,MAAMY,GAAS3B,IAAQ,SAAY+G,CAAa;AAEjE,gBAAI,CAAChG,KAAY,CAACA,EAAS;AACzB,oBAAM,IAAI,MAAM,oDAAoD;AAGtE,kBAAM,EAAE,OAAAmC,MAAUnC,GAIZ,EAAE,QAAQiG,EAAA,IAAkB,MAAM9F,GAAA,GAClC6D,IAAa8B,EAAsBG,CAAa;AAEtD,YAAAZ,EAAUrB,CAAU;AAGpB,gBAAI5B;AACJ,gBAAI;AACF,cAAAA,IAAaH,GAAkBE,CAAK,GACpCsD,EAAmBrD,CAAU;AAAA,YAC/B,SAAS8D,GAAgB;AACvB,oBAAM,IAAI,MAAM,mCAAmCA,aAA0B,QAAQA,EAAe,UAAU,eAAe,EAAE;AAAA,YACjI;AAEA,kBAAMC,IAAoBpC,GAA+BC,GAAY5B,CAAU;AAI/E,gBAHAiD,EAAUc,CAAiB,GAGvBhE,EAAM,eAAe;AACvB,oBAAMiE,IAAaD,EAAkB,UAAU,CAACnd,MAAMA,EAAE,QAAQmZ,EAAM,aAAa;AACnF,cAAIiE,KAAc,IAChBT,EAAsBS,CAAU,IAGhCT,EAAsBQ,EAAkB,SAAS,CAAC;AAAA,YAEtD;AAEE,cAAAR,EAAsBQ,EAAkB,SAAS,CAAC;AAAA,UAEtD,SAASvjB,GAAO;AAGd,YADiBA,EACJ,eAAe,OAE1Bmc,GAAA,GACAuG,EAAW,IAAI,KAGfnG,GAAA;AAAA,UAGJ,UAAA;AACE,YAAA0G,EAAoB,EAAK;AAAA,UAC3B;AAAA,QACF,OAAO;AAEL,gBAAM,EAAE,QAAQQ,EAAA,IAAkB,MAAMlG,GAAA;AACxC,UAAAkF,EAAUS,EAAsBO,CAAa,CAAC;AAAA,QAChD;AAAA,MACF,QAAQ;AAEN,QAAAR,EAAoB,EAAK;AAAA,MAC3B;AAAA,IACF,GAGE;AAAA,EAEJ,GAAG,CAACV,CAAM,CAAC,GAGXhhB,EAAU,MAAM;AACd,QAAI,CAACghB,EAAQ;AACb,UAAM,EAAE,UAAAmB,EAAA,IAAa,SAAS,KAAK;AACnC,oBAAS,KAAK,MAAM,WAAW,UACxB,MAAM;AACX,eAAS,KAAK,MAAM,WAAWA;AAAA,IACjC;AAAA,EACF,GAAG,CAACnB,CAAM,CAAC;AAGX,QAAMoB,IAAYC;AAAA,IAChB,CAACliB,MAAqB;AACpB,MAAIA,EAAE,QAAQ,aACZ6V,GAAA,GACAiL,EAAA;AAAA,IAEJ;AAAA,IACA,CAACA,CAAO;AAAA,EAAA;AA2BV,SAzBAjhB,EAAU,MAAM;AACd,QAAKghB;AACL,oBAAO,iBAAiB,WAAWoB,CAAS,GACrC,MAAM,OAAO,oBAAoB,WAAWA,CAAS;AAAA,EAC9D,GAAG,CAACpB,GAAQoB,CAAS,CAAC,GAGtBpiB,EAAU,MAAM;AACd,IAAKghB,MACHM,EAAmB,IAAI,GACvBE,EAAsB,MAAS,GAC/BE,EAAoB,EAAK;AAAA,EAE7B,GAAG,CAACV,CAAM,CAAC,GAGXhhB,EAAU,MAAM;AACd,IAAIghB,KAAQjL,GAAA;AAAA,EACd,GAAG,CAACiL,CAAM,CAAC,GAGXhhB,EAAU,MAAM;AACd,IAAIgd,KAAS,MAAM,QAAQA,CAAK,QAAmB,EAAE,WAAWA,EAAM,QAAQ;AAAA,EAChF,GAAG,CAACA,CAAK,CAAC,GAELgE,IAQH,gBAAAniB,EAAC,SAAI,WAAU,2DAA0D,MAAK,UAAS,cAAW,QAAO,mBAAgB,yBACvH,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,YAAW,eAAY,QAAO;AAAA,IAE7C,gBAAAD,EAAC,OAAA,EAAI,WAAU,6FAA4F,MAAK,YAC9G,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAXY,MAAM;AACxB,YAAAkX,GAAA,GACAiL,EAAA;AAAA,UACF;AAAA,UASQ,WAAU;AAAA,UACV,cAAW;AAAA,UACX,MAAK;AAAA,UACN,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAID,gBAAApiB,EAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,IAAG,yBAAwB,WAAU,YAAW,UAAA,2CAEpD;AAAA,QACA,gBAAAA,EAAC,KAAA,EAAE,WAAU,cAAa,UAAA,uCAAA,CAAoC;AAAA,MAAA,GAChE;AAAA,MAGA,gBAAAD,EAAC,OAAA,EAAI,WAAU,6CACZ,UAAA;AAAA,QAAA,CAACme,KACA,gBAAAle,EAAAoT,IAAA,EACG,UAAAuP,KAAoBlK,EAAO,WAAW,IACrC,gBAAAzY,EAAC,OAAA,EAAI,WAAU,0CACb,4BAAC,OAAA,EAAI,WAAU,kBAAiB,UAAA,cAAU,GAC5C,IAEA,gBAAAA;AAAA,UAACwY;AAAA,UAAA;AAAA,YACC,QAAAC;AAAA,YACA,eAAe8J,KAAmB;AAAA,YAClC,eAAeE;AAAA,YACf,iBAAiB,OAAOe,GAAa3J,MAAa;AAChD,kBAAI;AACF,sBAAM4J,IAAoBxC,GAAoBuC,CAAW;AAEzD,oBAAIzC,IAAatI;AAEjB,sBAAMmJ,IAAoBb,EAAW,UAAU,CAAChb,MAAMA,EAAE,QAAQ8T,CAAQ,GAClE6J,IAAc3C,EAAWa,CAAiB,GAC1C+B,IAAehC,GAAgBZ,GAAYlH,CAAiB;AAElE,oBAAK+B;AAUL,sBAAW/B,MAAa,mBAAmB;AACzC,0BAAM,EAAE,YAAA+J,GAAY,OAAA5H,EAAA,IAAU,MAAMuB,GAAY3B,GAAS6H,EAAkB,QAAkB;AAC7F,wBAAI,CAACG;AACH,4BAAM,IAAI,MAAM,kBAAkB;AAEpC,oBAAI5H,KACFM,GAAaN,CAAK,GAGpB,MAAMqB,GAAY,EAAE,eAAesG,EAAA,GAAgB,EAAK;AAAA,kBAC1D,WAAW9J,MAAa,SAAS;AAC/B,0BAAM,EAAE,aAAAgK,EAAA,IAAgB,MAAMpG,GAAiBgG,EAAkB,KAAe;AAChF,wBAAI,CAACI;AACH,4BAAM,IAAI,MAAM,wBAAwB;AAI1C,0BAAM7H,IAAQO,GAAA;AACd,0BAAMc,GAAY,EAAE,GAAGoG,GAAmB,eAAeE,KAAgB,IAAO3H,IAAQ,SAAYJ,CAAO;AAAA,kBAC7G,OAAO;AAGL,0BAAMI,IAAQO,GAAA;AACd,0BAAMc,GAAY,EAAE,GAAGoG,GAAmB,eAAeE,EAAA,GAAgB,IAAO3H,IAAQ,SAAYJ,KAAW,MAAS;AAAA,kBAC1H;AAAA,qBAlCc;AAEZ,wBAAMkI,KADsB,MAAM3G,GAAYsG,EAAkB,KAAe,IACvC;AACxC,sBAAI,CAACK,KAAc,OAAOA,KAAe,YAAYA,EAAW,KAAA,MAAW;AACzE,0BAAM,IAAI,MAAM,sDAAsDA,CAAU,EAAE;AAEpF,kBAAAzB,EAAWyB,CAAU,GACrBnI,GAAYmI,CAAU,GAEtB,MAAMzG,GAAY,EAAE,eAAesG,EAAA,GAAgB,IAAOG,CAAU;AAAA,gBACtE;AA2BA,oBAAIlD,GAAsB,IAAI/G,CAAiB;AAC7C,sBAAI;AACF,0BAAM,EAAE,QAAQkK,EAAA,IAAc,MAAM7G,GAAA;AACpC,oBAAA6D,IAAa8B,EAAsBkB,CAAS,GAC5ChD,IAAaD,GAA+BC,GAAYyC,CAAW,GACnEpB,EAAUrB,CAAU;AAAA,kBACtB,SAASiD,GAAmB;AAE1B,4BAAQ,KAAK,oDAAoDA,CAAiB;AAAA,kBACpF;AAGF,uBAAA5M,GAAmB;AAAA,kBACjB,UAAAyC;AAAA,kBACA,YAAY6J,GAAa,SAAS7J;AAAA,kBAClC,WAAW+H,IAAoB;AAAA,kBAC/B,YAAYb,EAAW;AAAA,gBAAA,CACxB,GACM,EAAE,SAAS,GAAA;AAAA,cACpB,SAASphB,GAAO;AACd,uBAAO,EAAE,SAAS,IAAO,OAAOA,aAAiB,QAAQA,EAAM,UAAU,oBAAA;AAAA,cAC3E;AAAA,YACF;AAAA,YACA,YAAY,OAAOoZ,MAAc;AAC/B,kBAAI;AACF,sBAAM0K,IAAoBxC,GAAoBlI,CAAS;AAEvD,oBAAI,CAAC6C;AACH,wBAAM,IAAI,MAAM,sBAAsB;AAExC,sBAAMyB,GAAYoG,GAAmB,EAAI,GAGzCjB,EAAmBzJ,CAAS;AAE5B,sBAAM,EAAE,OAAAmF,EAAAA,IAAU,MAAMZ,GAAA;AACxB,gBAAAgF,EAASpE,CAAK;AAEd,sBAAM+F,IAAaxL,EAAO,QACpByL,IAAYzL,EAAOwL,IAAa,CAAC;AACvC,uBAAA7M,GAAmB;AAAA,kBACjB,UAAU8M,GAAW,OAAO;AAAA,kBAC5B,YAAYA,GAAW,SAAS;AAAA,kBAChC,WAAWD;AAAA,kBACX,YAAAA;AAAA,gBAAA,CACD,GACD5M,GAAA,GACO,EAAE,SAAS,GAAA;AAAA,cACpB,SAAS1X,GAAO;AACd,uBAAO,EAAE,SAAS,IAAO,OAAOA,aAAiB,QAAQA,EAAM,UAAU,oBAAA;AAAA,cAC3E;AAAA,YACF;AAAA,UAAA;AAAA,QAAA,GAGN;AAAA,QACC;AAAA,QACFue,KAAStC,KAAW,gBAAA5b,EAACie,IAAA,EAAM,OAAAC,GAAc,QAAQ,MAAMoE,EAAS,IAAI,EAAA,CAAG;AAAA,MAAA,GAC1E;AAAA,MAGA,gBAAAtiB,EAAC,SAAI,WAAU,uCACb,4BAAC,KAAA,EAAE,WAAU,sCAAqC,UAAA,uFAAA,CAAoF,EAAA,CACxI;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF,IAxJkB;AA0JtB;AChgBA,SAAwBmkB,GAAiB,EAAE,QAAAjC,KAA+B;AACxE,SACE,gBAAAliB;AAAA,IAACiiB;AAAA,IAAA;AAAA,MACC,QAAAC;AAAA,MACA,SAAS,MAAM;AACb,QAAAkC,GAAuB,MAAA;AAAA,MACzB;AAAA,IAAA;AAAA,EAAA;AAGN;ACHA,IAAIC,KAAmC,MACnC1M,KAAoB,MACpBuK,KAAS;AAEb,SAASoC,KAAa;AACpB,EAAKD,OACHA,KAAY,SAAS,cAAc,KAAK,GACxCA,GAAU,KAAK,yBAGf,SAAS,gBAAgB,YAAYA,EAAS,IAE5C,CAAC1M,MAAQ0M,OACX1M,KAAO4M,GAAWF,EAAS;AAE/B;AAEA,SAASG,KAAS;AAChB,EAAAF,GAAA,GACI3M,MACFA,GAAK,OAAO8M,GAAcN,IAAkB,EAAE,QAAAjC,GAAA,CAAQ,CAAC;AAE3D;AAEA,SAASwC,KAAU;AACjB,EAAI/M,MAAQ0M,OACV1M,GAAK,QAAA,GACL0M,GAAU,OAAA,IAEZ1M,KAAO,MACP0M,KAAY;AACd;AASO,MAAMD,KAAoD;AAAA,EAC/D,MAAM,CAACvhB,MAAY;AACjB,IAAAqf,KAAS,CAAC,CAACrf,GAAS,UACpB2hB,GAAA;AAAA,EACF;AAAA,EACA,MAAM,MAAM;AACV,IAAAtC,KAAS,IACTsC,GAAA;AAAA,EACF;AAAA,EACA,OAAO,MAAM;AACX,IAAAtC,KAAS,IACTsC,GAAA;AAAA,EACF;AAAA,EACA,SAAAE;AACF;AAQI,OAAO,SAAW,QAAa,OAAO,yBAAyBN;"}
|