{"version":3,"file":"index.cjs","sources":["../src/hooks/useFormState.ts","../src/hooks/useAutoSave.ts","../src/hooks/useFormValidation.ts","../src/components/questions/SingleChoiceQuestion.tsx","../src/components/questions/MultipleChoiceQuestion.tsx","../src/components/questions/TextInputQuestion.tsx","../src/components/navigation/FormNavigation.tsx","../src/components/navigation/ProgressIndicator.tsx","../src/components/FormBuilder.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport type {\n  FormSchema,\n  FormProgress,\n  FormAnswers,\n  Answer,\n  Question\n} from '../types';\n\nexport interface UseFormStateOptions {\n  schema: FormSchema;\n  initialProgress?: FormProgress | null;\n}\n\nexport interface UseFormStateReturn {\n  progress: FormProgress;\n  currentQuestion: Question;\n  currentIndex: number;\n  totalQuestions: number;\n  isLastQuestion: boolean;\n  isFirstQuestion: boolean;\n  hasChanges: boolean;\n  setAnswer: (questionId: string, answer: Answer) => void;\n  goToNext: () => boolean;\n  goToPrevious: () => boolean;\n  goToQuestion: (index: number) => void;\n  markAsSaved: () => void;\n  reset: () => void;\n}\n\nexport const useFormState = ({\n  schema,\n  initialProgress\n}: UseFormStateOptions): UseFormStateReturn => {\n  // Flatten questions from schema\n  const allQuestions = schema.sections\n    ? schema.sections.flatMap(section => section.questions)\n    : schema.questions || [];\n\n  // Initialize progress\n  const [progress, setProgress] = useState<FormProgress>(() => {\n    if (initialProgress) {\n      return initialProgress;\n    }\n\n    return {\n      formId: schema.id,\n      answers: {},\n      currentQuestionIndex: 0,\n      lastSavedAt: null,\n      completionPercentage: 0,\n      isComplete: false\n    };\n  });\n\n  const [hasChanges, setHasChanges] = useState(false);\n\n  // Calculate completion percentage\n  const calculateCompletion = useCallback((answers: FormAnswers): number => {\n    const requiredQuestions = allQuestions.filter(q => q.required !== false);\n    const totalRequired = requiredQuestions.length || allQuestions.length;\n\n    const answeredRequired = requiredQuestions.filter(q => {\n      const answer = answers[q.id];\n      if (!answer) return false;\n\n      const value = answer.value;\n      if (Array.isArray(value)) {\n        return value.length > 0;\n      }\n      if (typeof value === 'object' && value !== null) {\n        if ('value' in value) return !!value.value;\n        if ('values' in value) return value.values.length > 0;\n      }\n      return !!value;\n    }).length;\n\n    return (answeredRequired / totalRequired) * 100;\n  }, [allQuestions]);\n\n  // Set answer for a question\n  const setAnswer = useCallback((questionId: string, answer: Answer) => {\n    setProgress(prev => {\n      const newAnswers = {\n        ...prev.answers,\n        [questionId]: answer\n      };\n\n      const completionPercentage = calculateCompletion(newAnswers);\n      const isComplete = completionPercentage === 100;\n\n      return {\n        ...prev,\n        answers: newAnswers,\n        completionPercentage,\n        isComplete\n      };\n    });\n\n    setHasChanges(true);\n  }, [calculateCompletion]);\n\n  // Navigate to next question\n  const goToNext = useCallback((): boolean => {\n    if (progress.currentQuestionIndex >= allQuestions.length - 1) {\n      return false;\n    }\n\n    setProgress(prev => ({\n      ...prev,\n      currentQuestionIndex: prev.currentQuestionIndex + 1\n    }));\n\n    return true;\n  }, [progress.currentQuestionIndex, allQuestions.length]);\n\n  // Navigate to previous question\n  const goToPrevious = useCallback((): boolean => {\n    if (progress.currentQuestionIndex <= 0) {\n      return false;\n    }\n\n    setProgress(prev => ({\n      ...prev,\n      currentQuestionIndex: prev.currentQuestionIndex - 1\n    }));\n\n    return true;\n  }, [progress.currentQuestionIndex]);\n\n  // Navigate to specific question\n  const goToQuestion = useCallback((index: number) => {\n    if (index >= 0 && index < allQuestions.length) {\n      setProgress(prev => ({\n        ...prev,\n        currentQuestionIndex: index\n      }));\n    }\n  }, [allQuestions.length]);\n\n  // Mark progress as saved\n  const markAsSaved = useCallback(() => {\n    setProgress(prev => ({\n      ...prev,\n      lastSavedAt: Date.now()\n    }));\n    setHasChanges(false);\n  }, []);\n\n  // Reset form\n  const reset = useCallback(() => {\n    setProgress({\n      formId: schema.id,\n      answers: {},\n      currentQuestionIndex: 0,\n      lastSavedAt: null,\n      completionPercentage: 0,\n      isComplete: false\n    });\n    setHasChanges(false);\n  }, [schema.id]);\n\n  const currentQuestion = allQuestions[progress.currentQuestionIndex];\n  const isLastQuestion = progress.currentQuestionIndex === allQuestions.length - 1;\n  const isFirstQuestion = progress.currentQuestionIndex === 0;\n\n  return {\n    progress,\n    currentQuestion,\n    currentIndex: progress.currentQuestionIndex,\n    totalQuestions: allQuestions.length,\n    isLastQuestion,\n    isFirstQuestion,\n    hasChanges,\n    setAnswer,\n    goToNext,\n    goToPrevious,\n    goToQuestion,\n    markAsSaved,\n    reset\n  };\n};\n","import { useEffect, useRef, useCallback, useState } from 'react';\nimport type { FormProgress, FormAPI, SaveStatus } from '../types';\n\nexport interface UseAutoSaveOptions {\n  progress: FormProgress;\n  api: FormAPI;\n  enabled?: boolean;\n  interval?: number; // milliseconds\n  hasChanges: boolean;\n  onSaveStart?: () => void;\n  onSaveSuccess?: () => void;\n  onSaveError?: (error: Error) => void;\n}\n\nexport interface UseAutoSaveReturn {\n  saveNow: () => Promise<void>;\n  saveStatus: SaveStatus;\n}\n\nexport const useAutoSave = ({\n  progress,\n  api,\n  enabled = true,\n  interval = 10000,\n  hasChanges,\n  onSaveStart,\n  onSaveSuccess,\n  onSaveError\n}: UseAutoSaveOptions): UseAutoSaveReturn => {\n  const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');\n  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const isSavingRef = useRef(false);\n  const lastSavedDataRef = useRef<string>('');\n\n  // Manual save function\n  const saveNow = useCallback(async () => {\n    if (isSavingRef.current) return;\n\n    // Check if data has actually changed\n    const currentData = JSON.stringify(progress);\n    if (currentData === lastSavedDataRef.current) {\n      return;\n    }\n\n    isSavingRef.current = true;\n    setSaveStatus('saving');\n    onSaveStart?.();\n\n    try {\n      await api.saveProgress(progress.formId, progress);\n      lastSavedDataRef.current = currentData;\n      setSaveStatus('saved');\n      onSaveSuccess?.();\n\n      // Reset to idle after 2 seconds\n      setTimeout(() => {\n        setSaveStatus('idle');\n      }, 2000);\n    } catch (error) {\n      setSaveStatus('error');\n      onSaveError?.(error as Error);\n\n      // Reset to idle after 3 seconds\n      setTimeout(() => {\n        setSaveStatus('idle');\n      }, 3000);\n    } finally {\n      isSavingRef.current = false;\n    }\n  }, [progress, api, onSaveStart, onSaveSuccess, onSaveError]);\n\n  // Auto-save effect\n  useEffect(() => {\n    if (!enabled || !hasChanges) {\n      return;\n    }\n\n    // Clear existing timeout\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n\n    // Set new timeout\n    timeoutRef.current = setTimeout(() => {\n      saveNow();\n    }, interval);\n\n    // Cleanup\n    return () => {\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n      }\n    };\n  }, [enabled, hasChanges, interval, saveNow]);\n\n  // Save on unmount if there are unsaved changes\n  useEffect(() => {\n    return () => {\n      if (hasChanges && enabled && !isSavingRef.current) {\n        // Fire and forget - best effort save on unmount\n        api.saveProgress(progress.formId, progress).catch(() => {\n          // Ignore errors on unmount\n        });\n      }\n    };\n  }, [hasChanges, enabled, progress, api]);\n\n  return {\n    saveNow,\n    saveStatus\n  };\n};\n","import { useCallback } from 'react';\nimport type { Question, Answer, ValidationResult } from '../types';\n\nexport const useFormValidation = () => {\n  const validateAnswer = useCallback(\n    (question: Question, answer?: Answer): ValidationResult => {\n      // Check if question is required and has no answer\n      if (question.required !== false) {\n        if (!answer) {\n          return {\n            isValid: false,\n            errorMessage: 'Este campo es obligatorio'\n          };\n        }\n\n        const value = answer.value;\n\n        // Check empty string\n        if (typeof value === 'string' && !value.trim()) {\n          return {\n            isValid: false,\n            errorMessage: 'Este campo es obligatorio'\n          };\n        }\n\n        // Check empty array (arrays should be checked BEFORE generic objects)\n        if (Array.isArray(value)) {\n          if (value.length === 0) {\n            return {\n              isValid: false,\n              errorMessage: 'Debe seleccionar al menos una opción'\n            };\n          }\n          // Array with items is valid, return early\n          return { isValid: true };\n        }\n\n        // Check object with value/values (only if not an array)\n        if (typeof value === 'object' && value !== null) {\n          if ('value' in value && !value.value) {\n            return {\n              isValid: false,\n              errorMessage: 'Este campo es obligatorio'\n            };\n          }\n          if ('values' in value && value.values.length === 0) {\n            return {\n              isValid: false,\n              errorMessage: 'Debe seleccionar al menos una opción'\n            };\n          }\n        }\n      }\n\n      // Run custom validation if provided\n      if (question.validate && answer) {\n        const customError = question.validate(answer);\n        if (customError) {\n          return {\n            isValid: false,\n            errorMessage: customError\n          };\n        }\n      }\n\n      return { isValid: true };\n    },\n    []\n  );\n\n  return { validateAnswer };\n};\n","import React, { useState } from 'react';\nimport type { Question, QuestionOption, AnswerValue } from '../../types';\n\nexport interface SingleChoiceQuestionProps {\n  question: Question;\n  value?: AnswerValue;\n  onChange: (value: AnswerValue) => void;\n  className?: string;\n  optionClassName?: string;\n  errorMessage?: string;\n}\n\nexport const SingleChoiceQuestion: React.FC<SingleChoiceQuestionProps> = ({\n  question,\n  value,\n  onChange,\n  className = '',\n  optionClassName = '',\n  errorMessage\n}) => {\n  const [specifyValues, setSpecifyValues] = useState<Record<string, string>>({});\n\n  const currentValue = typeof value === 'object' && value !== null && 'value' in value\n    ? value.value\n    : typeof value === 'string'\n    ? value\n    : '';\n\n  const currentSpecify = typeof value === 'object' && value !== null && 'specify' in value\n    ? value.specify\n    : undefined;\n\n  const handleOptionChange = (optionId: string, hasSpecify?: boolean) => {\n    if (hasSpecify) {\n      onChange({\n        value: optionId,\n        specify: specifyValues[optionId] || ''\n      });\n    } else {\n      onChange(optionId);\n    }\n  };\n\n  const handleSpecifyChange = (optionId: string, specifyText: string) => {\n    setSpecifyValues(prev => ({ ...prev, [optionId]: specifyText }));\n    onChange({\n      value: optionId,\n      specify: specifyText\n    });\n  };\n\n  return (\n    <div className={`form-question form-question--single ${className}`}>\n      <fieldset className=\"form-question__fieldset\">\n        <legend className=\"form-question__text\">\n          {question.text}\n          {question.required && <span className=\"form-question__required\" aria-label=\"required\"> *</span>}\n        </legend>\n\n        {question.description && (\n          <p className=\"form-question__description\">{question.description}</p>\n        )}\n\n        <div className=\"form-question__options\">\n          {question.options?.map((option: QuestionOption) => (\n            <div key={option.id} className={`form-option ${optionClassName}`}>\n              <label className=\"form-option__label\">\n                <input\n                  type=\"radio\"\n                  name={question.id}\n                  value={option.id}\n                  checked={currentValue === option.id}\n                  onChange={() => handleOptionChange(option.id, option.hasSpecify)}\n                  className=\"form-option__input\"\n                  aria-invalid={!!errorMessage}\n                />\n                <span className=\"form-option__text\">{option.label}</span>\n              </label>\n\n              {option.hasSpecify && currentValue === option.id && (\n                <input\n                  type=\"text\"\n                  value={specifyValues[option.id] || (typeof currentSpecify === 'string' ? currentSpecify : '') || ''}\n                  onChange={(e) => handleSpecifyChange(option.id, e.target.value)}\n                  placeholder=\"Especificar...\"\n                  className=\"form-option__specify\"\n                  aria-label={`Especificar ${option.label}`}\n                />\n              )}\n            </div>\n          ))}\n        </div>\n\n        {errorMessage && (\n          <p className=\"form-question__error\" role=\"alert\">{errorMessage}</p>\n        )}\n      </fieldset>\n    </div>\n  );\n};\n","import React, { useState } from 'react';\nimport type { Question, QuestionOption, AnswerValue } from '../../types';\n\nexport interface MultipleChoiceQuestionProps {\n  question: Question;\n  value?: AnswerValue;\n  onChange: (value: AnswerValue) => void;\n  className?: string;\n  optionClassName?: string;\n  errorMessage?: string;\n}\n\nexport const MultipleChoiceQuestion: React.FC<MultipleChoiceQuestionProps> = ({\n  question,\n  value,\n  onChange,\n  className = '',\n  optionClassName = '',\n  errorMessage\n}) => {\n  const [specifyValues, setSpecifyValues] = useState<Record<string, string>>({});\n\n  const currentValues = Array.isArray(value)\n    ? value\n    : typeof value === 'object' && value !== null && 'values' in value\n    ? value.values\n    : [];\n\n  const currentSpecifyValues = typeof value === 'object' && value !== null && 'specify' in value && typeof value.specify === 'object'\n    ? value.specify as Record<string, string>\n    : {};\n\n  const handleOptionToggle = (optionId: string) => {\n    const isSelected = currentValues.includes(optionId);\n    let newValues: string[];\n\n    if (isSelected) {\n      newValues = currentValues.filter(id => id !== optionId);\n    } else {\n      newValues = [...currentValues, optionId];\n    }\n\n    // Check if any selected option has specify\n    const hasAnySpecify = question.options?.some(\n      opt => newValues.includes(opt.id) && opt.hasSpecify\n    );\n\n    // Handle specify values\n    if (hasAnySpecify || Object.keys(currentSpecifyValues).length > 0) {\n      // Clean up specify values for unchecked items\n      const newSpecify: Record<string, string> = {};\n      Object.keys(currentSpecifyValues).forEach(key => {\n        if (newValues.includes(key)) {\n          newSpecify[key] = currentSpecifyValues[key];\n        }\n      });\n\n      // Only use object format if there are actual specify values\n      if (Object.keys(newSpecify).length > 0) {\n        onChange({\n          values: newValues,\n          specify: newSpecify\n        });\n      } else {\n        // No specify values, just pass the array\n        onChange(newValues);\n      }\n    } else {\n      onChange(newValues);\n    }\n  };\n\n  const handleSpecifyChange = (optionId: string, specifyText: string) => {\n    const newSpecify: Record<string, string> = { ...currentSpecifyValues, [optionId]: specifyText };\n    setSpecifyValues(prev => ({ ...prev, [optionId]: specifyText }));\n    onChange({\n      values: currentValues,\n      specify: newSpecify\n    });\n  };\n\n  return (\n    <div className={`form-question form-question--multiple ${className}`}>\n      <fieldset className=\"form-question__fieldset\">\n        <legend className=\"form-question__text\">\n          {question.text}\n          {question.required && <span className=\"form-question__required\" aria-label=\"required\"> *</span>}\n        </legend>\n\n        {question.description && (\n          <p className=\"form-question__description\">{question.description}</p>\n        )}\n\n        <div className=\"form-question__options\">\n          {question.options?.map((option: QuestionOption) => {\n            const isChecked = currentValues.includes(option.id);\n\n            return (\n              <div key={option.id} className={`form-option ${optionClassName}`}>\n                <label className=\"form-option__label\">\n                  <input\n                    type=\"checkbox\"\n                    name={`${question.id}[]`}\n                    value={option.id}\n                    checked={isChecked}\n                    onChange={() => handleOptionToggle(option.id)}\n                    className=\"form-option__input\"\n                    aria-invalid={!!errorMessage}\n                  />\n                  <span className=\"form-option__text\">{option.label}</span>\n                </label>\n\n                {option.hasSpecify && isChecked && (\n                  <input\n                    type=\"text\"\n                    value={specifyValues[option.id] || (currentSpecifyValues && currentSpecifyValues[option.id]) || ''}\n                    onChange={(e) => handleSpecifyChange(option.id, e.target.value)}\n                    placeholder=\"Especificar...\"\n                    className=\"form-option__specify\"\n                    aria-label={`Especificar ${option.label}`}\n                  />\n                )}\n              </div>\n            );\n          })}\n        </div>\n\n        {errorMessage && (\n          <p className=\"form-question__error\" role=\"alert\">{errorMessage}</p>\n        )}\n      </fieldset>\n    </div>\n  );\n};\n","import React from 'react';\nimport type { Question, AnswerValue } from '../../types';\n\nexport interface TextInputQuestionProps {\n  question: Question;\n  value?: AnswerValue;\n  onChange: (value: AnswerValue) => void;\n  className?: string;\n  errorMessage?: string;\n}\n\nexport const TextInputQuestion: React.FC<TextInputQuestionProps> = ({\n  question,\n  value,\n  onChange,\n  className = '',\n  errorMessage\n}) => {\n  const currentValue = typeof value === 'string' ? value : '';\n\n  return (\n    <div className={`form-question form-question--text ${className}`}>\n      <div className=\"form-question__fieldset\">\n        <label htmlFor={question.id} className=\"form-question__text\">\n          {question.text}\n          {question.required && <span className=\"form-question__required\" aria-label=\"required\"> *</span>}\n        </label>\n\n        {question.description && (\n          <p className=\"form-question__description\">{question.description}</p>\n        )}\n\n        <textarea\n          id={question.id}\n          value={currentValue}\n          onChange={(e) => onChange(e.target.value)}\n          className=\"form-question__textarea\"\n          aria-invalid={!!errorMessage}\n          aria-describedby={errorMessage ? `${question.id}-error` : undefined}\n          rows={4}\n        />\n\n        {errorMessage && (\n          <p id={`${question.id}-error`} className=\"form-question__error\" role=\"alert\">\n            {errorMessage}\n          </p>\n        )}\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\n\nexport interface FormNavigationProps {\n  currentIndex: number;\n  totalQuestions: number;\n  canGoBack: boolean;\n  canGoNext: boolean;\n  isLastQuestion: boolean;\n  onPrevious: () => void;\n  onNext: () => void;\n  onSubmit: () => void;\n  className?: string;\n  isSubmitting?: boolean;\n}\n\nexport const FormNavigation: React.FC<FormNavigationProps> = ({\n  currentIndex,\n  totalQuestions,\n  canGoBack,\n  canGoNext,\n  isLastQuestion,\n  onPrevious,\n  onNext,\n  onSubmit,\n  className = '',\n  isSubmitting = false\n}) => {\n  return (\n    <div className={`form-navigation ${className}`}>\n      <div className=\"form-navigation__container\">\n        <button\n          type=\"button\"\n          onClick={onPrevious}\n          disabled={!canGoBack}\n          className=\"form-navigation__button form-navigation__button--previous\"\n          aria-label=\"Pregunta anterior\"\n        >\n          Anterior\n        </button>\n\n        <span className=\"form-navigation__counter\" aria-live=\"polite\">\n          {currentIndex + 1} de {totalQuestions}\n        </span>\n\n        {!isLastQuestion ? (\n          <button\n            type=\"button\"\n            onClick={onNext}\n            disabled={!canGoNext}\n            className=\"form-navigation__button form-navigation__button--next\"\n            aria-label=\"Siguiente pregunta\"\n          >\n            Siguiente\n          </button>\n        ) : (\n          <button\n            type=\"button\"\n            onClick={onSubmit}\n            disabled={isSubmitting}\n            className=\"form-navigation__button form-navigation__button--submit\"\n            aria-label=\"Enviar formulario\"\n          >\n            {isSubmitting ? 'Enviando...' : 'Enviar'}\n          </button>\n        )}\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\nimport type { SaveStatus } from '../../types';\n\nexport interface ProgressIndicatorProps {\n  currentIndex: number;\n  totalQuestions: number;\n  completionPercentage: number;\n  saveStatus?: SaveStatus;\n  className?: string;\n}\n\nexport const ProgressIndicator: React.FC<ProgressIndicatorProps> = ({\n  currentIndex,\n  totalQuestions,\n  completionPercentage,\n  saveStatus = 'idle',\n  className = ''\n}) => {\n  const getSaveStatusText = () => {\n    switch (saveStatus) {\n      case 'saving':\n        return 'Guardando...';\n      case 'saved':\n        return 'Guardado';\n      case 'error':\n        return 'Error al guardar';\n      default:\n        return '';\n    }\n  };\n\n  const getSaveStatusClass = () => {\n    switch (saveStatus) {\n      case 'saving':\n        return 'form-progress__save-status--saving';\n      case 'saved':\n        return 'form-progress__save-status--saved';\n      case 'error':\n        return 'form-progress__save-status--error';\n      default:\n        return '';\n    }\n  };\n\n  return (\n    <div className={`form-progress ${className}`}>\n      <div className=\"form-progress__header\">\n        <div className=\"form-progress__info\">\n          <span className=\"form-progress__text\" aria-live=\"polite\">\n            Pregunta {currentIndex + 1} de {totalQuestions}\n          </span>\n          <span className=\"form-progress__percentage\" aria-live=\"polite\">\n            {Math.round(completionPercentage)}% completado\n          </span>\n        </div>\n\n        {saveStatus !== 'idle' && (\n          <span\n            className={`form-progress__save-status ${getSaveStatusClass()}`}\n            role=\"status\"\n            aria-live=\"polite\"\n          >\n            {getSaveStatusText()}\n          </span>\n        )}\n      </div>\n\n      <div\n        className=\"form-progress__bar-container\"\n        role=\"progressbar\"\n        aria-valuenow={Math.round(completionPercentage)}\n        aria-valuemin={0}\n        aria-valuemax={100}\n      >\n        <div\n          className=\"form-progress__bar\"\n          style={{ width: `${completionPercentage}%` }}\n        />\n      </div>\n    </div>\n  );\n};\n","import React, { useEffect, useState } from 'react';\nimport type {\n  FormSchema,\n  FormAPI,\n  FormConfig,\n  FormEventHandlers,\n  Answer,\n  Question,\n  AnswerValue\n} from '../types';\nimport { useFormState } from '../hooks/useFormState';\nimport { useAutoSave } from '../hooks/useAutoSave';\nimport { useFormValidation } from '../hooks/useFormValidation';\nimport { SingleChoiceQuestion } from './questions/SingleChoiceQuestion';\nimport { MultipleChoiceQuestion } from './questions/MultipleChoiceQuestion';\nimport { TextInputQuestion } from './questions/TextInputQuestion';\nimport { FormNavigation } from './navigation/FormNavigation';\nimport { ProgressIndicator } from './navigation/ProgressIndicator';\n\nexport interface FormBuilderProps {\n  schema: FormSchema;\n  api: FormAPI;\n  config?: FormConfig;\n  eventHandlers?: FormEventHandlers;\n  className?: string;\n  questionClassName?: string;\n  /**\n   * Custom question renderer (optional)\n   */\n  renderQuestion?: (props: {\n    question: Question;\n    value?: AnswerValue;\n    onChange: (value: AnswerValue) => void;\n    errorMessage?: string;\n  }) => React.ReactNode;\n  /**\n   * Custom navigation renderer (optional)\n   */\n  renderNavigation?: (props: {\n    currentIndex: number;\n    totalQuestions: number;\n    canGoBack: boolean;\n    canGoNext: boolean;\n    isLastQuestion: boolean;\n    onPrevious: () => void;\n    onNext: () => void;\n    onSubmit: () => void;\n  }) => React.ReactNode;\n}\n\nexport const FormBuilder: React.FC<FormBuilderProps> = ({\n  schema,\n  api,\n  config = {},\n  eventHandlers = {},\n  className = '',\n  questionClassName = '',\n  renderQuestion,\n  renderNavigation\n}) => {\n  const [isLoading, setIsLoading] = useState(true);\n  const [isSubmitting, setIsSubmitting] = useState(false);\n  const [validationError, setValidationError] = useState<string>();\n  const [transitionDirection, setTransitionDirection] = useState<'forward' | 'backward'>('forward');\n  const [isTransitioning, setIsTransitioning] = useState(false);\n  const [initialProgress, setInitialProgress] = useState<any>(null);\n\n  const {\n    autoSaveInterval = 10000,\n    autoSaveEnabled = true,\n    transition = {},\n    showProgress = true,\n    allowBackNavigation = true,\n    validateOnChange = false\n  } = config;\n\n  const { duration = 300, timingFunction = 'ease-in-out' } = transition;\n\n  // Load initial progress\n  useEffect(() => {\n    const loadProgress = async () => {\n      try {\n        const savedProgress = await api.loadProgress(schema.id);\n        setInitialProgress(savedProgress);\n      } catch (error) {\n        eventHandlers.onError?.(error as Error);\n      } finally {\n        setIsLoading(false);\n      }\n    };\n\n    loadProgress();\n  }, [schema.id, api]);\n\n  // Form state management\n  const {\n    progress,\n    currentQuestion,\n    currentIndex,\n    totalQuestions,\n    isLastQuestion,\n    isFirstQuestion,\n    hasChanges,\n    setAnswer: setFormAnswer,\n    goToNext,\n    goToPrevious,\n    markAsSaved\n  } = useFormState({ schema, initialProgress });\n\n  // Validation\n  const { validateAnswer } = useFormValidation();\n\n  // Auto-save\n  const { saveNow, saveStatus } = useAutoSave({\n    progress,\n    api,\n    enabled: autoSaveEnabled,\n    interval: autoSaveInterval,\n    hasChanges,\n    onSaveSuccess: () => {\n      markAsSaved();\n      eventHandlers.onSave?.(progress);\n    },\n    onSaveError: (error) => {\n      eventHandlers.onError?.(error);\n    }\n  });\n\n  // Handle answer change\n  const handleAnswerChange = (value: AnswerValue) => {\n    const answer: Answer = {\n      questionId: currentQuestion.id,\n      value,\n      answeredAt: Date.now()\n    };\n\n    setFormAnswer(currentQuestion.id, answer);\n    eventHandlers.onAnswer?.(currentQuestion.id, answer);\n\n    // Validate on change if enabled\n    if (validateOnChange) {\n      const validation = validateAnswer(currentQuestion, answer);\n      setValidationError(validation.errorMessage);\n    } else {\n      // Clear error when user starts typing\n      setValidationError(undefined);\n    }\n  };\n\n  // Handle navigation with transition\n  const navigateWithTransition = async (\n    navigationFn: () => boolean,\n    direction: 'forward' | 'backward'\n  ) => {\n    // Validate current question before moving forward\n    if (direction === 'forward') {\n      const currentAnswer = progress.answers[currentQuestion.id];\n      const validation = validateAnswer(currentQuestion, currentAnswer);\n\n      if (!validation.isValid) {\n        setValidationError(validation.errorMessage);\n        return;\n      }\n\n      // Save progress before navigation\n      await saveNow();\n    }\n\n    setValidationError(undefined);\n    setTransitionDirection(direction);\n    setIsTransitioning(true);\n\n    // Wait for fade out\n    setTimeout(() => {\n      const success = navigationFn();\n      if (success) {\n        eventHandlers.onNavigate?.(\n          direction === 'forward' ? 'next' : 'previous',\n          currentIndex\n        );\n      }\n\n      // Fade back in\n      setTimeout(() => {\n        setIsTransitioning(false);\n      }, 50);\n    }, duration / 2);\n  };\n\n  // Handle next\n  const handleNext = () => {\n    navigateWithTransition(goToNext, 'forward');\n  };\n\n  // Handle previous\n  const handlePrevious = () => {\n    if (allowBackNavigation) {\n      navigateWithTransition(goToPrevious, 'backward');\n    }\n  };\n\n  // Handle submit\n  const handleSubmit = async () => {\n    // Validate current question\n    const currentAnswer = progress.answers[currentQuestion.id];\n    const validation = validateAnswer(currentQuestion, currentAnswer);\n\n    if (!validation.isValid) {\n      setValidationError(validation.errorMessage);\n      return;\n    }\n\n    setIsSubmitting(true);\n    setValidationError(undefined);\n\n    try {\n      await api.submitForm(schema.id, progress);\n      eventHandlers.onSubmit?.(progress);\n    } catch (error) {\n      eventHandlers.onError?.(error as Error);\n    } finally {\n      setIsSubmitting(false);\n    }\n  };\n\n  // Render question based on type\n  const renderQuestionComponent = () => {\n    const currentAnswer = progress.answers[currentQuestion.id];\n    const value = currentAnswer?.value;\n\n    const questionProps = {\n      question: currentQuestion,\n      value,\n      onChange: handleAnswerChange,\n      errorMessage: validationError,\n      className: questionClassName\n    };\n\n    if (renderQuestion) {\n      return renderQuestion(questionProps);\n    }\n\n    switch (currentQuestion.type) {\n      case 'single':\n        return <SingleChoiceQuestion {...questionProps} />;\n      case 'multiple':\n        return <MultipleChoiceQuestion {...questionProps} />;\n      case 'text':\n        return <TextInputQuestion {...questionProps} />;\n      default:\n        return null;\n    }\n  };\n\n  if (isLoading) {\n    return (\n      <div className=\"form-builder form-builder--loading\">\n        <p>Cargando formulario...</p>\n      </div>\n    );\n  }\n\n  const transitionStyle: React.CSSProperties = {\n    transition: `opacity ${duration}ms ${timingFunction}, transform ${duration}ms ${timingFunction}`,\n    opacity: isTransitioning ? 0 : 1,\n    transform: isTransitioning\n      ? `translateX(${transitionDirection === 'forward' ? '20px' : '-20px'})`\n      : 'translateX(0)'\n  };\n\n  return (\n    <div className={`form-builder ${className}`}>\n      {showProgress && (\n        <ProgressIndicator\n          currentIndex={currentIndex}\n          totalQuestions={totalQuestions}\n          completionPercentage={progress.completionPercentage}\n          saveStatus={saveStatus}\n        />\n      )}\n\n      <div className=\"form-builder__content\">\n        <div className=\"form-builder__question-container\" style={transitionStyle}>\n          {renderQuestionComponent()}\n        </div>\n\n        {renderNavigation ? (\n          renderNavigation({\n            currentIndex,\n            totalQuestions,\n            canGoBack: !isFirstQuestion && allowBackNavigation,\n            canGoNext: true,\n            isLastQuestion,\n            onPrevious: handlePrevious,\n            onNext: handleNext,\n            onSubmit: handleSubmit\n          })\n        ) : (\n          <FormNavigation\n            currentIndex={currentIndex}\n            totalQuestions={totalQuestions}\n            canGoBack={!isFirstQuestion && allowBackNavigation}\n            canGoNext={true}\n            isLastQuestion={isLastQuestion}\n            onPrevious={handlePrevious}\n            onNext={handleNext}\n            onSubmit={handleSubmit}\n            isSubmitting={isSubmitting}\n          />\n        )}\n      </div>\n    </div>\n  );\n};\n"],"names":["useFormState","schema","initialProgress","allQuestions","section","progress","setProgress","useState","hasChanges","setHasChanges","calculateCompletion","useCallback","answers","requiredQuestions","q","totalRequired","answer","value","setAnswer","questionId","prev","newAnswers","completionPercentage","goToNext","goToPrevious","goToQuestion","index","markAsSaved","reset","currentQuestion","isLastQuestion","isFirstQuestion","useAutoSave","api","enabled","interval","onSaveStart","onSaveSuccess","onSaveError","saveStatus","setSaveStatus","timeoutRef","useRef","isSavingRef","lastSavedDataRef","saveNow","currentData","error","useEffect","useFormValidation","question","customError","SingleChoiceQuestion","onChange","className","optionClassName","errorMessage","specifyValues","setSpecifyValues","currentValue","currentSpecify","handleOptionChange","optionId","hasSpecify","handleSpecifyChange","specifyText","jsx","jsxs","option","e","MultipleChoiceQuestion","currentValues","currentSpecifyValues","handleOptionToggle","isSelected","newValues","id","_a","opt","newSpecify","key","isChecked","TextInputQuestion","FormNavigation","currentIndex","totalQuestions","canGoBack","canGoNext","onPrevious","onNext","onSubmit","isSubmitting","ProgressIndicator","getSaveStatusText","getSaveStatusClass","FormBuilder","config","eventHandlers","questionClassName","renderQuestion","renderNavigation","isLoading","setIsLoading","setIsSubmitting","validationError","setValidationError","transitionDirection","setTransitionDirection","isTransitioning","setIsTransitioning","setInitialProgress","autoSaveInterval","autoSaveEnabled","transition","showProgress","allowBackNavigation","validateOnChange","duration","timingFunction","savedProgress","setFormAnswer","validateAnswer","handleAnswerChange","validation","navigateWithTransition","navigationFn","direction","currentAnswer","handleNext","handlePrevious","handleSubmit","_b","renderQuestionComponent","questionProps","transitionStyle"],"mappings":"wIA8BaA,EAAe,CAAC,CAC3B,OAAAC,EACA,gBAAAC,CACF,IAA+C,CAE7C,MAAMC,EAAeF,EAAO,SACxBA,EAAO,SAAS,QAAQG,GAAWA,EAAQ,SAAS,EACpDH,EAAO,WAAa,CAAA,EAGlB,CAACI,EAAUC,CAAW,EAAIC,EAAAA,SAAuB,IACjDL,GAIG,CACL,OAAQD,EAAO,GACf,QAAS,CAAA,EACT,qBAAsB,EACtB,YAAa,KACb,qBAAsB,EACtB,WAAY,EAAA,CAEf,EAEK,CAACO,EAAYC,CAAa,EAAIF,EAAAA,SAAS,EAAK,EAG5CG,EAAsBC,cAAaC,GAAiC,CACxE,MAAMC,EAAoBV,EAAa,OAAOW,GAAKA,EAAE,WAAa,EAAK,EACjEC,EAAgBF,EAAkB,QAAUV,EAAa,OAiB/D,OAfyBU,EAAkB,OAAOC,GAAK,CACrD,MAAME,EAASJ,EAAQE,EAAE,EAAE,EAC3B,GAAI,CAACE,EAAQ,MAAO,GAEpB,MAAMC,EAAQD,EAAO,MACrB,GAAI,MAAM,QAAQC,CAAK,EACrB,OAAOA,EAAM,OAAS,EAExB,GAAI,OAAOA,GAAU,UAAYA,IAAU,KAAM,CAC/C,GAAI,UAAWA,EAAO,MAAO,CAAC,CAACA,EAAM,MACrC,GAAI,WAAYA,EAAO,OAAOA,EAAM,OAAO,OAAS,CACtD,CACA,MAAO,CAAC,CAACA,CACX,CAAC,EAAE,OAEwBF,EAAiB,GAC9C,EAAG,CAACZ,CAAY,CAAC,EAGXe,EAAYP,EAAAA,YAAY,CAACQ,EAAoBH,IAAmB,CACpEV,EAAYc,GAAQ,CAClB,MAAMC,EAAa,CACjB,GAAGD,EAAK,QACR,CAACD,CAAU,EAAGH,CAAA,EAGVM,EAAuBZ,EAAoBW,CAAU,EAG3D,MAAO,CACL,GAAGD,EACH,QAASC,EACT,qBAAAC,EACA,WANiBA,IAAyB,GAM1C,CAEJ,CAAC,EAEDb,EAAc,EAAI,CACpB,EAAG,CAACC,CAAmB,CAAC,EAGlBa,EAAWZ,EAAAA,YAAY,IACvBN,EAAS,sBAAwBF,EAAa,OAAS,EAClD,IAGTG,EAAYc,IAAS,CACnB,GAAGA,EACH,qBAAsBA,EAAK,qBAAuB,CAAA,EAClD,EAEK,IACN,CAACf,EAAS,qBAAsBF,EAAa,MAAM,CAAC,EAGjDqB,EAAeb,EAAAA,YAAY,IAC3BN,EAAS,sBAAwB,EAC5B,IAGTC,EAAYc,IAAS,CACnB,GAAGA,EACH,qBAAsBA,EAAK,qBAAuB,CAAA,EAClD,EAEK,IACN,CAACf,EAAS,oBAAoB,CAAC,EAG5BoB,EAAed,cAAae,GAAkB,CAC9CA,GAAS,GAAKA,EAAQvB,EAAa,QACrCG,EAAYc,IAAS,CACnB,GAAGA,EACH,qBAAsBM,CAAA,EACtB,CAEN,EAAG,CAACvB,EAAa,MAAM,CAAC,EAGlBwB,EAAchB,EAAAA,YAAY,IAAM,CACpCL,EAAYc,IAAS,CACnB,GAAGA,EACH,YAAa,KAAK,IAAA,CAAI,EACtB,EACFX,EAAc,EAAK,CACrB,EAAG,CAAA,CAAE,EAGCmB,EAAQjB,EAAAA,YAAY,IAAM,CAC9BL,EAAY,CACV,OAAQL,EAAO,GACf,QAAS,CAAA,EACT,qBAAsB,EACtB,YAAa,KACb,qBAAsB,EACtB,WAAY,EAAA,CACb,EACDQ,EAAc,EAAK,CACrB,EAAG,CAACR,EAAO,EAAE,CAAC,EAER4B,EAAkB1B,EAAaE,EAAS,oBAAoB,EAC5DyB,EAAiBzB,EAAS,uBAAyBF,EAAa,OAAS,EACzE4B,EAAkB1B,EAAS,uBAAyB,EAE1D,MAAO,CACL,SAAAA,EACA,gBAAAwB,EACA,aAAcxB,EAAS,qBACvB,eAAgBF,EAAa,OAC7B,eAAA2B,EACA,gBAAAC,EACA,WAAAvB,EACA,UAAAU,EACA,SAAAK,EACA,aAAAC,EACA,aAAAC,EACA,YAAAE,EACA,MAAAC,CAAA,CAEJ,EClKaI,EAAc,CAAC,CAC1B,SAAA3B,EACA,IAAA4B,EACA,QAAAC,EAAU,GACV,SAAAC,EAAW,IACX,WAAA3B,EACA,YAAA4B,EACA,cAAAC,EACA,YAAAC,CACF,IAA6C,CAC3C,KAAM,CAACC,EAAYC,CAAa,EAAIjC,EAAAA,SAAqB,MAAM,EACzDkC,EAAaC,EAAAA,OAA6C,IAAI,EAC9DC,EAAcD,EAAAA,OAAO,EAAK,EAC1BE,EAAmBF,EAAAA,OAAe,EAAE,EAGpCG,EAAUlC,EAAAA,YAAY,SAAY,CACtC,GAAIgC,EAAY,QAAS,OAGzB,MAAMG,EAAc,KAAK,UAAUzC,CAAQ,EAC3C,GAAIyC,IAAgBF,EAAiB,QAIrC,CAAAD,EAAY,QAAU,GACtBH,EAAc,QAAQ,EACtBJ,GAAA,MAAAA,IAEA,GAAI,CACF,MAAMH,EAAI,aAAa5B,EAAS,OAAQA,CAAQ,EAChDuC,EAAiB,QAAUE,EAC3BN,EAAc,OAAO,EACrBH,GAAA,MAAAA,IAGA,WAAW,IAAM,CACfG,EAAc,MAAM,CACtB,EAAG,GAAI,CACT,OAASO,EAAO,CACdP,EAAc,OAAO,EACrBF,GAAA,MAAAA,EAAcS,GAGd,WAAW,IAAM,CACfP,EAAc,MAAM,CACtB,EAAG,GAAI,CACT,QAAA,CACEG,EAAY,QAAU,EACxB,EACF,EAAG,CAACtC,EAAU4B,EAAKG,EAAaC,EAAeC,CAAW,CAAC,EAG3DU,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,GAACd,GAAW,CAAC1B,GAKjB,OAAIiC,EAAW,SACb,aAAaA,EAAW,OAAO,EAIjCA,EAAW,QAAU,WAAW,IAAM,CACpCI,EAAA,CACF,EAAGV,CAAQ,EAGJ,IAAM,CACPM,EAAW,SACb,aAAaA,EAAW,OAAO,CAEnC,CACF,EAAG,CAACP,EAAS1B,EAAY2B,EAAUU,CAAO,CAAC,EAG3CG,EAAAA,UAAU,IACD,IAAM,CACPxC,GAAc0B,GAAW,CAACS,EAAY,SAExCV,EAAI,aAAa5B,EAAS,OAAQA,CAAQ,EAAE,MAAM,IAAM,CAExD,CAAC,CAEL,EACC,CAACG,EAAY0B,EAAS7B,EAAU4B,CAAG,CAAC,EAEhC,CACL,QAAAY,EACA,WAAAN,CAAA,CAEJ,EC5GaU,EAAoB,KAmExB,CAAE,eAlEctC,EAAAA,YACrB,CAACuC,EAAoBlC,IAAsC,CAEzD,GAAIkC,EAAS,WAAa,GAAO,CAC/B,GAAI,CAAClC,EACH,MAAO,CACL,QAAS,GACT,aAAc,2BAAA,EAIlB,MAAMC,EAAQD,EAAO,MAGrB,GAAI,OAAOC,GAAU,UAAY,CAACA,EAAM,OACtC,MAAO,CACL,QAAS,GACT,aAAc,2BAAA,EAKlB,GAAI,MAAM,QAAQA,CAAK,EACrB,OAAIA,EAAM,SAAW,EACZ,CACL,QAAS,GACT,aAAc,sCAAA,EAIX,CAAE,QAAS,EAAA,EAIpB,GAAI,OAAOA,GAAU,UAAYA,IAAU,KAAM,CAC/C,GAAI,UAAWA,GAAS,CAACA,EAAM,MAC7B,MAAO,CACL,QAAS,GACT,aAAc,2BAAA,EAGlB,GAAI,WAAYA,GAASA,EAAM,OAAO,SAAW,EAC/C,MAAO,CACL,QAAS,GACT,aAAc,sCAAA,CAGpB,CACF,CAGA,GAAIiC,EAAS,UAAYlC,EAAQ,CAC/B,MAAMmC,EAAcD,EAAS,SAASlC,CAAM,EAC5C,GAAImC,EACF,MAAO,CACL,QAAS,GACT,aAAcA,CAAA,CAGpB,CAEA,MAAO,CAAE,QAAS,EAAA,CACpB,EACA,CAAA,CAAC,CAGM,GC1DEC,EAA4D,CAAC,CACxE,SAAAF,EACA,MAAAjC,EACA,SAAAoC,EACA,UAAAC,EAAY,GACZ,gBAAAC,EAAkB,GAClB,aAAAC,CACF,IAAM,OACJ,KAAM,CAACC,EAAeC,CAAgB,EAAInD,EAAAA,SAAiC,CAAA,CAAE,EAEvEoD,EAAe,OAAO1C,GAAU,UAAYA,IAAU,MAAQ,UAAWA,EAC3EA,EAAM,MACN,OAAOA,GAAU,SACjBA,EACA,GAEE2C,EAAiB,OAAO3C,GAAU,UAAYA,IAAU,MAAQ,YAAaA,EAC/EA,EAAM,QACN,OAEE4C,EAAqB,CAACC,EAAkBC,IAAyB,CAEnEV,EADEU,EACO,CACP,MAAOD,EACP,QAASL,EAAcK,CAAQ,GAAK,EAAA,EAG7BA,CAFR,CAIL,EAEME,EAAsB,CAACF,EAAkBG,IAAwB,CACrEP,EAAiBtC,IAAS,CAAE,GAAGA,EAAM,CAAC0C,CAAQ,EAAGG,GAAc,EAC/DZ,EAAS,CACP,MAAOS,EACP,QAASG,CAAA,CACV,CACH,EAEA,OACEC,EAAAA,IAAC,OAAI,UAAW,uCAAuCZ,CAAS,GAC9D,SAAAa,EAAAA,KAAC,WAAA,CAAS,UAAU,0BAClB,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,sBACf,SAAA,CAAAjB,EAAS,KACTA,EAAS,UAAYgB,MAAC,OAAA,CAAK,UAAU,0BAA0B,aAAW,WAAW,SAAA,IAAA,CAAE,CAAA,EAC1F,EAEChB,EAAS,aACRgB,EAAAA,IAAC,KAAE,UAAU,6BAA8B,WAAS,YAAY,EAGlEA,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACZ,cAAS,wBAAS,IAAKE,GACtBD,EAAAA,KAAC,MAAA,CAAoB,UAAW,eAAeZ,CAAe,GAC5D,SAAA,CAAAY,EAAAA,KAAC,QAAA,CAAM,UAAU,qBACf,SAAA,CAAAD,EAAAA,IAAC,QAAA,CACC,KAAK,QACL,KAAMhB,EAAS,GACf,MAAOkB,EAAO,GACd,QAAST,IAAiBS,EAAO,GACjC,SAAU,IAAMP,EAAmBO,EAAO,GAAIA,EAAO,UAAU,EAC/D,UAAU,qBACV,eAAc,CAAC,CAACZ,CAAA,CAAA,EAElBU,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,WAAO,KAAA,CAAM,CAAA,EACpD,EAECE,EAAO,YAAcT,IAAiBS,EAAO,IAC5CF,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOT,EAAcW,EAAO,EAAE,IAAM,OAAOR,GAAmB,SAAWA,EAAiB,KAAO,GACjG,SAAWS,GAAML,EAAoBI,EAAO,GAAIC,EAAE,OAAO,KAAK,EAC9D,YAAY,iBACZ,UAAU,uBACV,aAAY,eAAeD,EAAO,KAAK,EAAA,CAAA,CACzC,CAAA,EAtBMA,EAAO,EAwBjB,GAEJ,EAECZ,GACCU,EAAAA,IAAC,IAAA,CAAE,UAAU,uBAAuB,KAAK,QAAS,SAAAV,CAAA,CAAa,CAAA,CAAA,CAEnE,CAAA,CACF,CAEJ,ECvFac,EAAgE,CAAC,CAC5E,SAAApB,EACA,MAAAjC,EACA,SAAAoC,EACA,UAAAC,EAAY,GACZ,gBAAAC,EAAkB,GAClB,aAAAC,CACF,IAAM,OACJ,KAAM,CAACC,EAAeC,CAAgB,EAAInD,EAAAA,SAAiC,CAAA,CAAE,EAEvEgE,EAAgB,MAAM,QAAQtD,CAAK,EACrCA,EACA,OAAOA,GAAU,UAAYA,IAAU,MAAQ,WAAYA,EAC3DA,EAAM,OACN,CAAA,EAEEuD,EAAuB,OAAOvD,GAAU,UAAYA,IAAU,MAAQ,YAAaA,GAAS,OAAOA,EAAM,SAAY,SACvHA,EAAM,QACN,CAAA,EAEEwD,EAAsBX,GAAqB,OAC/C,MAAMY,EAAaH,EAAc,SAAST,CAAQ,EAClD,IAAIa,EAcJ,GAZID,EACFC,EAAYJ,EAAc,OAAOK,GAAMA,IAAOd,CAAQ,EAEtDa,EAAY,CAAC,GAAGJ,EAAeT,CAAQ,IAInBe,EAAA3B,EAAS,UAAT,YAAA2B,EAAkB,QAC/BF,EAAU,SAASG,EAAI,EAAE,GAAKA,EAAI,cAItB,OAAO,KAAKN,CAAoB,EAAE,OAAS,EAAG,CAEjE,MAAMO,EAAqC,CAAA,EAC3C,OAAO,KAAKP,CAAoB,EAAE,QAAQQ,GAAO,CAC3CL,EAAU,SAASK,CAAG,IACxBD,EAAWC,CAAG,EAAIR,EAAqBQ,CAAG,EAE9C,CAAC,EAGG,OAAO,KAAKD,CAAU,EAAE,OAAS,EACnC1B,EAAS,CACP,OAAQsB,EACR,QAASI,CAAA,CACV,EAGD1B,EAASsB,CAAS,CAEtB,MACEtB,EAASsB,CAAS,CAEtB,EAEMX,EAAsB,CAACF,EAAkBG,IAAwB,CACrE,MAAMc,EAAqC,CAAE,GAAGP,EAAsB,CAACV,CAAQ,EAAGG,CAAA,EAClFP,EAAiBtC,IAAS,CAAE,GAAGA,EAAM,CAAC0C,CAAQ,EAAGG,GAAc,EAC/DZ,EAAS,CACP,OAAQkB,EACR,QAASQ,CAAA,CACV,CACH,EAEA,OACEb,EAAAA,IAAC,OAAI,UAAW,yCAAyCZ,CAAS,GAChE,SAAAa,EAAAA,KAAC,WAAA,CAAS,UAAU,0BAClB,SAAA,CAAAA,EAAAA,KAAC,SAAA,CAAO,UAAU,sBACf,SAAA,CAAAjB,EAAS,KACTA,EAAS,UAAYgB,MAAC,OAAA,CAAK,UAAU,0BAA0B,aAAW,WAAW,SAAA,IAAA,CAAE,CAAA,EAC1F,EAEChB,EAAS,aACRgB,EAAAA,IAAC,KAAE,UAAU,6BAA8B,WAAS,YAAY,EAGlEA,MAAC,OAAI,UAAU,yBACZ,cAAS,wBAAS,IAAKE,GAA2B,CACjD,MAAMa,EAAYV,EAAc,SAASH,EAAO,EAAE,EAElD,OACED,EAAAA,KAAC,MAAA,CAAoB,UAAW,eAAeZ,CAAe,GAC5D,SAAA,CAAAY,EAAAA,KAAC,QAAA,CAAM,UAAU,qBACf,SAAA,CAAAD,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,KAAM,GAAGhB,EAAS,EAAE,KACpB,MAAOkB,EAAO,GACd,QAASa,EACT,SAAU,IAAMR,EAAmBL,EAAO,EAAE,EAC5C,UAAU,qBACV,eAAc,CAAC,CAACZ,CAAA,CAAA,EAElBU,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAqB,WAAO,KAAA,CAAM,CAAA,EACpD,EAECE,EAAO,YAAca,GACpBf,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOT,EAAcW,EAAO,EAAE,GAAMI,GAAwBA,EAAqBJ,EAAO,EAAE,GAAM,GAChG,SAAWC,GAAML,EAAoBI,EAAO,GAAIC,EAAE,OAAO,KAAK,EAC9D,YAAY,iBACZ,UAAU,uBACV,aAAY,eAAeD,EAAO,KAAK,EAAA,CAAA,CACzC,CAAA,EAtBMA,EAAO,EAwBjB,CAEJ,EAAC,CACH,EAECZ,GACCU,EAAAA,IAAC,IAAA,CAAE,UAAU,uBAAuB,KAAK,QAAS,SAAAV,CAAA,CAAa,CAAA,CAAA,CAEnE,CAAA,CACF,CAEJ,EC1Ha0B,EAAsD,CAAC,CAClE,SAAAhC,EACA,MAAAjC,EACA,SAAAoC,EACA,UAAAC,EAAY,GACZ,aAAAE,CACF,IAAM,CACJ,MAAMG,EAAe,OAAO1C,GAAU,SAAWA,EAAQ,GAEzD,OACEiD,EAAAA,IAAC,OAAI,UAAW,qCAAqCZ,CAAS,GAC5D,SAAAa,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,OAAC,QAAA,CAAM,QAASjB,EAAS,GAAI,UAAU,sBACpC,SAAA,CAAAA,EAAS,KACTA,EAAS,UAAYgB,MAAC,OAAA,CAAK,UAAU,0BAA0B,aAAW,WAAW,SAAA,IAAA,CAAE,CAAA,EAC1F,EAEChB,EAAS,aACRgB,EAAAA,IAAC,KAAE,UAAU,6BAA8B,WAAS,YAAY,EAGlEA,EAAAA,IAAC,WAAA,CACC,GAAIhB,EAAS,GACb,MAAOS,EACP,SAAWU,GAAMhB,EAASgB,EAAE,OAAO,KAAK,EACxC,UAAU,0BACV,eAAc,CAAC,CAACb,EAChB,mBAAkBA,EAAe,GAAGN,EAAS,EAAE,SAAW,OAC1D,KAAM,CAAA,CAAA,EAGPM,GACCU,EAAAA,IAAC,IAAA,CAAE,GAAI,GAAGhB,EAAS,EAAE,SAAU,UAAU,uBAAuB,KAAK,QAClE,SAAAM,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,CACF,CAEJ,ECnCa2B,EAAgD,CAAC,CAC5D,aAAAC,EACA,eAAAC,EACA,UAAAC,EACA,UAAAC,EACA,eAAAzD,EACA,WAAA0D,EACA,OAAAC,EACA,SAAAC,EACA,UAAApC,EAAY,GACZ,aAAAqC,EAAe,EACjB,IAEIzB,EAAAA,IAAC,OAAI,UAAW,mBAAmBZ,CAAS,GAC1C,SAAAa,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAAD,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASsB,EACT,SAAU,CAACF,EACX,UAAU,4DACV,aAAW,oBACZ,SAAA,UAAA,CAAA,EAIDnB,EAAAA,KAAC,OAAA,CAAK,UAAU,2BAA2B,YAAU,SAClD,SAAA,CAAAiB,EAAe,EAAE,OAAKC,CAAA,EACzB,EAEEvD,EAWAoC,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASwB,EACT,SAAUC,EACV,UAAU,0DACV,aAAW,oBAEV,WAAe,cAAgB,QAAA,CAAA,EAjBlCzB,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASuB,EACT,SAAU,CAACF,EACX,UAAU,wDACV,aAAW,qBACZ,SAAA,WAAA,CAAA,CAYD,CAAA,CAEJ,CAAA,CACF,ECvDSK,EAAsD,CAAC,CAClE,aAAAR,EACA,eAAAC,EACA,qBAAA/D,EACA,WAAAiB,EAAa,OACb,UAAAe,EAAY,EACd,IAAM,CACJ,MAAMuC,EAAoB,IAAM,CAC9B,OAAQtD,EAAA,CACN,IAAK,SACH,MAAO,eACT,IAAK,QACH,MAAO,WACT,IAAK,QACH,MAAO,mBACT,QACE,MAAO,EAAA,CAEb,EAEMuD,EAAqB,IAAM,CAC/B,OAAQvD,EAAA,CACN,IAAK,SACH,MAAO,qCACT,IAAK,QACH,MAAO,oCACT,IAAK,QACH,MAAO,oCACT,QACE,MAAO,EAAA,CAEb,EAEA,OACE4B,EAAAA,KAAC,MAAA,CAAI,UAAW,iBAAiBb,CAAS,GACxC,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACb,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,sBAAsB,YAAU,SAAS,SAAA,CAAA,YAC7CiB,EAAe,EAAE,OAAKC,CAAA,EAClC,EACAlB,EAAAA,KAAC,OAAA,CAAK,UAAU,4BAA4B,YAAU,SACnD,SAAA,CAAA,KAAK,MAAM7C,CAAoB,EAAE,cAAA,CAAA,CACpC,CAAA,EACF,EAECiB,IAAe,QACd2B,EAAAA,IAAC,OAAA,CACC,UAAW,8BAA8B4B,EAAA,CAAoB,GAC7D,KAAK,SACL,YAAU,SAET,SAAAD,EAAA,CAAkB,CAAA,CACrB,EAEJ,EAEA3B,EAAAA,IAAC,MAAA,CACC,UAAU,+BACV,KAAK,cACL,gBAAe,KAAK,MAAM5C,CAAoB,EAC9C,gBAAe,EACf,gBAAe,IAEf,SAAA4C,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,MAAO,CAAE,MAAO,GAAG5C,CAAoB,GAAA,CAAI,CAAA,CAC7C,CAAA,CACF,EACF,CAEJ,EC/BayE,GAA0C,CAAC,CACtD,OAAA9F,EACA,IAAAgC,EACA,OAAA+D,EAAS,CAAA,EACT,cAAAC,EAAgB,CAAA,EAChB,UAAA3C,EAAY,GACZ,kBAAA4C,EAAoB,GACpB,eAAAC,EACA,iBAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAWC,CAAY,EAAI/F,EAAAA,SAAS,EAAI,EACzC,CAACoF,EAAcY,CAAe,EAAIhG,EAAAA,SAAS,EAAK,EAChD,CAACiG,EAAiBC,CAAkB,EAAIlG,WAAA,EACxC,CAACmG,EAAqBC,CAAsB,EAAIpG,EAAAA,SAAiC,SAAS,EAC1F,CAACqG,EAAiBC,CAAkB,EAAItG,EAAAA,SAAS,EAAK,EACtD,CAACL,EAAiB4G,CAAkB,EAAIvG,EAAAA,SAAc,IAAI,EAE1D,CACJ,iBAAAwG,EAAmB,IACnB,gBAAAC,EAAkB,GAClB,WAAAC,EAAa,CAAA,EACb,aAAAC,EAAe,GACf,oBAAAC,EAAsB,GACtB,iBAAAC,EAAmB,EAAA,EACjBpB,EAEE,CAAE,SAAAqB,EAAW,IAAK,eAAAC,EAAiB,eAAkBL,EAG3DjE,EAAAA,UAAU,IAAM,EACO,SAAY,OAC/B,GAAI,CACF,MAAMuE,EAAgB,MAAMtF,EAAI,aAAahC,EAAO,EAAE,EACtD6G,EAAmBS,CAAa,CAClC,OAASxE,EAAO,EACd8B,EAAAoB,EAAc,UAAd,MAAApB,EAAA,KAAAoB,EAAwBlD,EAC1B,QAAA,CACEuD,EAAa,EAAK,CACpB,CACF,GAEA,CACF,EAAG,CAACrG,EAAO,GAAIgC,CAAG,CAAC,EAGnB,KAAM,CACJ,SAAA5B,EACA,gBAAAwB,EACA,aAAAuD,EACA,eAAAC,EACA,eAAAvD,EACA,gBAAAC,EACA,WAAAvB,EACA,UAAWgH,GACX,SAAAjG,GACA,aAAAC,GACA,YAAAG,EAAA,EACE3B,EAAa,CAAE,OAAAC,EAAQ,gBAAAC,EAAiB,EAGtC,CAAE,eAAAuH,CAAA,EAAmBxE,EAAA,EAGrB,CAAE,QAAAJ,GAAS,WAAAN,EAAA,EAAeP,EAAY,CAC1C,SAAA3B,EACA,IAAA4B,EACA,QAAS+E,EACT,SAAUD,EACV,WAAAvG,EACA,cAAe,IAAM,OACnBmB,GAAA,GACAkD,EAAAoB,EAAc,SAAd,MAAApB,EAAA,KAAAoB,EAAuB5F,EACzB,EACA,YAAc0C,GAAU,QACtB8B,EAAAoB,EAAc,UAAd,MAAApB,EAAA,KAAAoB,EAAwBlD,EAC1B,CAAA,CACD,EAGK2E,GAAsBzG,GAAuB,OACjD,MAAMD,EAAiB,CACrB,WAAYa,EAAgB,GAC5B,MAAAZ,EACA,WAAY,KAAK,IAAA,CAAI,EAOvB,GAJAuG,GAAc3F,EAAgB,GAAIb,CAAM,GACxC6D,EAAAoB,EAAc,WAAd,MAAApB,EAAA,KAAAoB,EAAyBpE,EAAgB,GAAIb,GAGzCoG,EAAkB,CACpB,MAAMO,EAAaF,EAAe5F,EAAiBb,CAAM,EACzDyF,EAAmBkB,EAAW,YAAY,CAC5C,MAEElB,EAAmB,MAAS,CAEhC,EAGMmB,EAAyB,MAC7BC,EACAC,IACG,CAEH,GAAIA,IAAc,UAAW,CAC3B,MAAMC,EAAgB1H,EAAS,QAAQwB,EAAgB,EAAE,EACnD8F,EAAaF,EAAe5F,EAAiBkG,CAAa,EAEhE,GAAI,CAACJ,EAAW,QAAS,CACvBlB,EAAmBkB,EAAW,YAAY,EAC1C,MACF,CAGA,MAAM9E,GAAA,CACR,CAEA4D,EAAmB,MAAS,EAC5BE,EAAuBmB,CAAS,EAChCjB,EAAmB,EAAI,EAGvB,WAAW,IAAM,OACCgB,EAAA,KAEdhD,EAAAoB,EAAc,aAAd,MAAApB,EAAA,KAAAoB,EACE6B,IAAc,UAAY,OAAS,WACnC1C,IAKJ,WAAW,IAAM,CACfyB,EAAmB,EAAK,CAC1B,EAAG,EAAE,CACP,EAAGQ,EAAW,CAAC,CACjB,EAGMW,EAAa,IAAM,CACvBJ,EAAuBrG,GAAU,SAAS,CAC5C,EAGM0G,EAAiB,IAAM,CACvBd,GACFS,EAAuBpG,GAAc,UAAU,CAEnD,EAGM0G,EAAe,SAAY,SAE/B,MAAMH,EAAgB1H,EAAS,QAAQwB,EAAgB,EAAE,EACnD8F,EAAaF,EAAe5F,EAAiBkG,CAAa,EAEhE,GAAI,CAACJ,EAAW,QAAS,CACvBlB,EAAmBkB,EAAW,YAAY,EAC1C,MACF,CAEApB,EAAgB,EAAI,EACpBE,EAAmB,MAAS,EAE5B,GAAI,CACF,MAAMxE,EAAI,WAAWhC,EAAO,GAAII,CAAQ,GACxCwE,EAAAoB,EAAc,WAAd,MAAApB,EAAA,KAAAoB,EAAyB5F,EAC3B,OAAS0C,GAAO,EACdoF,EAAAlC,EAAc,UAAd,MAAAkC,EAAA,KAAAlC,EAAwBlD,GAC1B,QAAA,CACEwD,EAAgB,EAAK,CACvB,CACF,EAGM6B,GAA0B,IAAM,CACpC,MAAML,EAAgB1H,EAAS,QAAQwB,EAAgB,EAAE,EACnDZ,EAAQ8G,GAAA,YAAAA,EAAe,MAEvBM,EAAgB,CACpB,SAAUxG,EACV,MAAAZ,EACA,SAAUyG,GACV,aAAclB,EACd,UAAWN,CAAA,EAGb,GAAIC,EACF,OAAOA,EAAekC,CAAa,EAGrC,OAAQxG,EAAgB,KAAA,CACtB,IAAK,SACH,OAAOqC,MAACd,EAAA,CAAsB,GAAGiF,CAAA,CAAe,EAClD,IAAK,WACH,OAAOnE,MAACI,EAAA,CAAwB,GAAG+D,CAAA,CAAe,EACpD,IAAK,OACH,OAAOnE,MAACgB,EAAA,CAAmB,GAAGmD,CAAA,CAAe,EAC/C,QACE,OAAO,IAAA,CAEb,EAEA,GAAIhC,EACF,aACG,MAAA,CAAI,UAAU,qCACb,SAAAnC,EAAAA,IAAC,IAAA,CAAE,kCAAsB,CAAA,CAC3B,EAIJ,MAAMoE,GAAuC,CAC3C,WAAY,WAAWjB,CAAQ,MAAMC,CAAc,eAAeD,CAAQ,MAAMC,CAAc,GAC9F,QAASV,EAAkB,EAAI,EAC/B,UAAWA,EACP,cAAcF,IAAwB,UAAY,OAAS,OAAO,IAClE,eAAA,EAGN,OACEvC,EAAAA,KAAC,MAAA,CAAI,UAAW,gBAAgBb,CAAS,GACtC,SAAA,CAAA4D,GACChD,EAAAA,IAAC0B,EAAA,CACC,aAAAR,EACA,eAAAC,EACA,qBAAsBhF,EAAS,qBAC/B,WAAAkC,EAAA,CAAA,EAIJ4B,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACb,SAAA,CAAAD,MAAC,OAAI,UAAU,mCAAmC,MAAOoE,GACtD,cACH,EAEClC,EACCA,EAAiB,CACf,aAAAhB,EACA,eAAAC,EACA,UAAW,CAACtD,GAAmBoF,EAC/B,UAAW,GACX,eAAArF,EACA,WAAYmG,EACZ,OAAQD,EACR,SAAUE,CAAA,CACX,EAEDhE,EAAAA,IAACiB,EAAA,CACC,aAAAC,EACA,eAAAC,EACA,UAAW,CAACtD,GAAmBoF,EAC/B,UAAW,GACX,eAAArF,EACA,WAAYmG,EACZ,OAAQD,EACR,SAAUE,EACV,aAAAvC,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EACF,CAEJ"}