@uniquedj95/vform 3.0.5 → 3.1.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/utils/maskito.ts","../src/utils/index.ts","../src/composables/useFormValidation.ts","../src/composables/useDataTransformation.ts","../src/components/vForm.vue","../src/composables/useValidationStyles.ts","../src/composables/useInputValidation.ts","../src/composables/useLabelTemplate.ts","../src/components/shared/InputLabel.vue","../src/components/inputs/BaseInput.vue","../src/components/inputs/TextInput.vue","../src/components/inputs/DateInput.vue","../src/components/inputs/NumberInput.vue","../src/components/inputs/EmailInput.vue","../src/components/inputs/PasswordInput.vue","../src/components/inputs/SelectInput.vue","../src/components/inputs/TextAreaInput.vue","../src/components/inputs/RepeatInput.vue","../src/composables/useCheckboxLabelText.ts","../src/components/inputs/CheckboxInput.vue","../src/index.ts"],"sourcesContent":["// Helper for IonInput integration with Maskito\n// eslint-disable-next-line no-undef\nexport function getElementPredicate(el: HTMLIonInputElement) {\n return new Promise(resolve => {\n requestAnimationFrame(async () => {\n const input = await el.getInputElement();\n resolve(input);\n });\n });\n}\n\ntype PatternToken = { type: 'd' | 'a' | '*'; quant: number; regex: RegExp; placeholder: string };\n\nconst MASK_CHAR_REGEX: Record<PatternToken['type'], RegExp> = {\n d: /\\d/,\n a: /[A-Za-z]/,\n '*': /[A-Za-z0-9]/, // Default: alphanum, can customize if needed\n};\n\n// Helper to sample letters/numbers for pretty placeholder\nconst DEMO_STRINGS = {\n d: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],\n a: ['A', 'B', 'C', 'x', 'y', 'z', 'D', 'f'],\n '*': ['A', '3', 'b', '8', 'z', '4', 'D', '0'],\n};\n\nfunction nextDemoChar(type: PatternToken['type'], idx: number) {\n const arr = DEMO_STRINGS[type];\n return arr[idx % arr.length];\n}\n\nexport function generateMaskitoOptions(pattern: string) {\n const mask: (RegExp | string)[] = [];\n let placeholder = '';\n let i = 0,\n demoIdx = 0;\n\n while (i < pattern.length) {\n const char = pattern[i];\n\n // Match token+quantifier, e.g. d{2,3}, a{4}\n if (['d', 'a', '*'].includes(char)) {\n let maxQuant = 1;\n\n if (pattern[i + 1] === '{') {\n const quantEnd = pattern.indexOf('}', i + 2);\n if (quantEnd !== -1) {\n const quantString = pattern.slice(i + 2, quantEnd);\n if (quantString.includes(',')) {\n const [, max] = quantString.split(',').map(s => parseInt(s.trim()));\n maxQuant = max || parseInt(quantString.split(',')[0]); // if max is empty, use min\n } else {\n maxQuant = parseInt(quantString);\n }\n i = quantEnd; // skip ahead\n }\n } else {\n // Count repeats: ddd\n let j = i + 1;\n while (pattern[j] === char) {\n maxQuant++;\n j++;\n }\n i = j - 1;\n }\n\n // Generate mask for maximum possible characters\n for (let q = 0; q < maxQuant; q++) {\n mask.push(MASK_CHAR_REGEX[char as PatternToken['type']]);\n placeholder += nextDemoChar(char as PatternToken['type'], demoIdx++);\n }\n }\n // Fixed/separator char\n else {\n mask.push(char);\n placeholder += char;\n }\n i++;\n }\n\n // MaskitoOptions + placeholder + Ionic elementPredicate\n return {\n mask,\n placeholder,\n elementPredicate: getElementPredicate,\n };\n}\n","/**\n * Form Builder Utility functions\n *\n * This module provides utility functions for form handling, including date formatting,\n * field rendering checks, deep cloning, option management, and more.\n *\n * It is designed to be used in conjunction with vform form builder components and can be extended\n * or modified as needed for specific use cases.\n *\n * @packageDocumentation\n * @module utils\n * @preferred\n * @author Daniel Justin.\n **/\nimport { ComputedData, FormData, FormField, Option } from 'types';\nexport * from './maskito';\n\n/**\n * Full month names.\n **/\nexport const monthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\n/**\n * Checks if a value is \"empty\".\n *\n * @param value - The value to check for emptiness.\n * @returns `true` if the value is `null` or `undefined`, an empty string, an empty array, or an empty object.\n * Returns `false` otherwise.\n */\nexport function isEmpty(value: any): boolean {\n return (\n value === null ||\n value === undefined ||\n (Array.isArray(value) && !value.length) ||\n (typeof value === 'object' && !Object.keys(value).length) ||\n !value\n );\n}\n\n/**\n * Format a date string according to a given pattern.\n *\n * @param date - The date string to format.\n * @param pattern - The pattern to format the date string with. default is 'DD/MMM/2024'.\n * @returns The formatted date string.\n */\nexport function formatDate(date: string, pattern: string = 'DD/MMM/YYYY'): string {\n const _date = new Date(date);\n\n if (isNaN(_date.getTime())) {\n throw new Error('Invalid date string');\n }\n\n const day = zeroPad(_date.getDate());\n const month = _date.getMonth() + 1; // months are zero-based\n const year = _date.getFullYear();\n const hour = zeroPad(_date.getHours());\n const minute = zeroPad(_date.getMinutes());\n const second = zeroPad(_date.getSeconds());\n const milliseconds = _date.getMilliseconds();\n\n const replacements: { [key: string]: string } = {\n DD: day,\n D: _date.getDate().toString(),\n MMM: monthNames[_date.getMonth()].slice(0, 3),\n MMMM: monthNames[_date.getMonth()],\n MM: zeroPad(month),\n M: month.toString(),\n YYYY: year.toString(),\n YY: year.toString().slice(-2),\n HH: hour,\n H: _date.getHours().toString(),\n mm: minute,\n m: _date.getMinutes().toString(),\n ss: second,\n s: _date.getSeconds().toString(),\n SSS: zeroPad(milliseconds),\n S: milliseconds.toString().slice(0, 1),\n // Add more replacements as needed\n };\n\n return pattern.replace(\n /DD|D|MMMM|MMM|MM|M|YYYY|YY|HH|H|mm|m|ss|s|SSS|S/g,\n match => replacements[match] || match\n );\n}\n\n/**\n * Append a zero to a number if it is less than 10.\n *\n * @param num - The number to append a zero to.\n * @returns The number as a string with a zero appended if it is less than 10.\n */\nexport function zeroPad(num: number): string {\n return num < 10 ? `0${num}` : `${num}`;\n}\n\n/**\n * Get the month name or number.\n *\n * @param month - The month number or name.\n * @param part - The part of the month to get. Either 'MMMM', 'MMM', or 'MM'.\n * @returns The month name or number.\n */\nexport function getMonth(month: number | string, part: string) {\n if (Number.isInteger(parseInt(month as string)) && Number(month) > 0) {\n if (part === 'MMMM') return monthNames[Number(month) - 1];\n if (part === 'MMM') return monthNames[Number(month) - 1].slice(0, 3);\n if (part === 'MM') return zeroPad(Number(month));\n }\n return month as string;\n}\n\n/**\n * Determines if a form field can be rendered based on a condition.\n *\n * @param field - The form field to check.\n * @param data - The current form data.\n * @param computedData - Additional computed data that may influence the condition.\n * @returns A boolean indicating whether the field can be rendered.\n */\nexport function canRenderField(field: FormField, data: FormData, computedData: ComputedData) {\n if (typeof field.condition === 'function') {\n return field.condition(data, computedData);\n }\n return true;\n}\n\n/**\n * Deep clone an object.\n *\n * @param obj - The object to clone.\n * @returns The cloned object.\n */\nexport function deepClone<T = any>(obj: T): T {\n // Handle primitive types\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n // Handle Array\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as any;\n }\n\n // Handle Object\n const cloned: any = {};\n Object.entries(obj).forEach(([key, value]) => {\n // Bind functions to the cloned object\n if (typeof value === 'function') {\n cloned[key] = value.bind(cloned);\n } else {\n cloned[key] = deepClone(value);\n }\n });\n\n return cloned;\n}\n\n/**\n * Finds an option in a list of options that matches the given option.\n *\n * The function checks for a match based on the `value` and `label` properties\n * of the `Option` object. It returns the first option that satisfies any of\n * the following conditions:\n * - The `value` of the option matches the `value` of the given option.\n * - The `label` of the option matches the `label` of the given option.\n * - The `value` of the option matches the `label` of the given option.\n * - The `label` of the option matches the `value` of the given option.\n *\n * @param {Option} option - The option to find in the list.\n * @param {Array<Option>} options - The list of options to search through.\n * @returns {number} - The index first matching option, or -1 if no match is found.\n */\nexport function findOption(option: Option, options: Array<Option>): number {\n return options.findIndex(opt => {\n return (\n opt.value === option.value ||\n opt.label === option.label ||\n opt.value === option.label ||\n opt.label === option.value\n );\n });\n}\n\n/**\n * Checks if an option exists in the provided options array. If the option is found,\n * it sets the `isChecked` property to `true`. If the option is not found, it adds\n * the option to the array with the `isChecked` property set to `true`.\n *\n * @param {Option} option - The option to check or add.\n * @param {Array<Option>} options - The array of options to search within.\n */\nexport function checkOption(option: Option, options: Array<Option>) {\n const index = findOption(option, options);\n if (index >= 0) options[index].isChecked = true;\n else options.push({ ...option, isChecked: true });\n}\n\n/**\n * Unchecks the specified option in the given array of options.\n *\n * @param option - The option to uncheck.\n * @param options - The array of options to search within.\n */\nexport function uncheckOption(option: Option, options: Array<Option>) {\n const index = findOption(option, options);\n if (index >= 0) options[index].isChecked = false;\n}\n\n/**\n * Filters an array of options based on a provided filter string.\n *\n * @param {Array<Option>} options - The array of options to filter.\n * @param {string} filter - The string to filter the options by.\n * @returns An array of options that match the filter string.\n */\nexport function getFilteredOptions(options: Array<Option>, filter: string): Array<Option> {\n if (!filter) return options;\n return options.filter(option =>\n JSON.stringify(option).toLowerCase().includes(filter.toLowerCase())\n );\n}\n","import { ref } from 'vue';\nimport { isEmpty } from '../utils';\n\n/**\n * Composable for common form validation logic\n */\nexport function useFormValidation() {\n const dynamicRefs = ref<Array<any>>([]);\n\n /**\n * Check if form is valid by validating all input refs\n */\n async function isFormValid(): Promise<boolean> {\n console.debug('Validating form inputs');\n const errors: Array<string> = [];\n for (const inputRef of dynamicRefs.value) {\n if (typeof inputRef?.onValueUpdate === 'function') {\n await inputRef.onValueUpdate();\n }\n if (typeof inputRef?.getErrors === 'function') {\n try {\n const componentErrors = inputRef.getErrors();\n if (Array.isArray(componentErrors)) {\n errors.push(...componentErrors);\n } else {\n console.warn('getErrors() returned non-array value:', componentErrors);\n }\n } catch (error) {\n console.error('Error calling getErrors on component:', error, inputRef);\n }\n } else {\n console.warn('Component does not have getErrors function:', inputRef);\n }\n }\n return errors.every(isEmpty);\n }\n\n /**\n * Reset all form inputs\n */\n function resetForm(): void {\n dynamicRefs.value.forEach((inputRef: any) => {\n if (typeof inputRef?.onReset === 'function') {\n inputRef.onReset();\n }\n });\n }\n\n /**\n * Get all validation errors from form inputs\n */\n function getFormErrors(): string[] {\n const errors: Array<string> = [];\n for (const inputRef of dynamicRefs.value) {\n if (typeof inputRef?.getErrors === 'function') {\n try {\n const componentErrors = inputRef.getErrors();\n if (Array.isArray(componentErrors)) {\n errors.push(...componentErrors);\n } else {\n errors.push(String(componentErrors));\n }\n } catch (error) {\n console.error('Error calling getErrors on component:', error, inputRef);\n }\n }\n }\n return errors;\n }\n\n /**\n * Update all form input values\n */\n async function updateFormValues(): Promise<void> {\n for (const inputRef of dynamicRefs.value) {\n if (typeof inputRef?.onValueUpdate === 'function') {\n await inputRef.onValueUpdate();\n }\n }\n }\n\n return {\n dynamicRefs,\n isFormValid,\n resetForm,\n getFormErrors,\n updateFormValues,\n };\n}\n","import { computed, Ref } from 'vue';\nimport { FormData, FormSchema, ComputedData, Option } from 'types';\n\n/**\n * Composable for data transformation logic\n * Reduces duplication in computed data processing\n */\nexport function useDataTransformation(activeSchema: Ref<FormSchema>) {\n /**\n * Transform form schema to form data\n */\n const formData = computed(() =>\n Object.entries(activeSchema.value).reduce((acc, [key, form]) => {\n if (form.value !== undefined) {\n if (typeof form.onChange === 'function') {\n acc[key] = form.onChange(form.value);\n } else {\n acc[key] = form.value;\n }\n }\n return acc;\n }, {} as FormData)\n );\n\n /**\n * Transform form data to computed data\n */\n const computedData = computed(() => {\n return Object.entries(formData.value).reduce((acc, [key, value]) => {\n if (value !== undefined) {\n // Handle children transformations\n if (activeSchema.value[key].children !== undefined) {\n acc[key] = (value as Array<Option>).map(({ other }) => {\n return Object.entries(other).reduce((results, [id, v]: [string, any]) => {\n if (typeof activeSchema.value[key].children![id].computedValue === 'function') {\n results[id] = activeSchema.value[key].children![id].computedValue(\n v,\n activeSchema.value\n );\n } else {\n results[id] = v;\n }\n return results;\n }, {} as ComputedData);\n });\n }\n\n // Handle computed values\n if (typeof activeSchema.value[key].computedValue === 'function' && value !== undefined) {\n acc[key] = activeSchema.value[key].computedValue(value, activeSchema.value);\n }\n }\n return acc;\n }, {} as ComputedData);\n });\n\n return {\n formData,\n computedData,\n };\n}\n","<template>\n <IonGrid>\n <IonRow>\n <template v-for=\"formId of Object.keys(activeSchema)\">\n <IonCol\n :key=\"formId\"\n :size=\"activeSchema[formId].grid?.xs ?? '12'\"\n :size-sm=\"activeSchema[formId].grid?.sm\"\n :size-md=\"activeSchema[formId].grid?.md\"\n :size-lg=\"activeSchema[formId].grid?.lg\"\n :size-xl=\"activeSchema[formId].grid?.xl\"\n class=\"ion-margin-vertical\"\n v-if=\"canRenderField(activeSchema[formId], data, computedData)\"\n >\n <component\n :is=\"activeSchema[formId].type\"\n v-model=\"activeSchema[formId]\"\n :schema=\"activeSchema\"\n ref=\"dynamicRefs\"\n :ref-key=\"formId\"\n />\n </IonCol>\n </template>\n </IonRow>\n <IonRow v-if=\"!hideButtons\">\n <IonCol size=\"12\" style=\"display: flex\" :style=\"{ justifyContent: buttonPlacement }\">\n <IonButton @click=\"handleCancelAction\" v-if=\"showCancelButton\">\n {{ cancelButtonText ?? 'Cancel' }}\n </IonButton>\n <IonButton @click=\"handleClearAction\" v-if=\"showClearButton\">\n {{ clearButtonText ?? 'Reset' }}\n </IonButton>\n <template v-for=\"button of customButtons\" :key=\"button.label\">\n <IonButton @click=\"button.action\" :color=\"button.color ?? 'primary'\">\n {{ button.label }}\n </IonButton>\n </template>\n <IonButton @click=\"submitForm\">\n {{ submitButtonText ?? 'Submit' }}\n </IonButton>\n </IonCol>\n </IonRow>\n </IonGrid>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue';\nimport { IonGrid, IonRow, IonCol, IonButton } from '@ionic/vue';\nimport type { FormData, ComputedData, FormSchema, CustomButton } from '../types';\nimport { canRenderField } from '../utils';\nimport { useFormValidation } from '../composables/useFormValidation';\nimport { useDataTransformation } from '../composables/useDataTransformation';\n\ninterface FormProps {\n schema: FormSchema;\n showLabels?: boolean;\n showClearButton?: boolean;\n showCancelButton?: boolean;\n buttonPlacement?: 'start' | 'middle' | 'end';\n submitButtonText?: string;\n clearButtonText?: string;\n cancelButtonText?: string;\n hideButtons?: boolean;\n customButtons?: Array<CustomButton>;\n}\n\ninterface FormEmits {\n (e: 'submit', formData: FormData, computedFormData: ComputedData): void;\n (e: 'clear'): void;\n (e: 'cancel'): void;\n}\n\nconst props = withDefaults(defineProps<FormProps>(), {\n showLabels: true,\n showClearButton: true,\n showCancelButton: true,\n hideButtons: false,\n buttonPlacement: 'start',\n submitButtonText: 'Submit',\n clearButtonText: 'Reset',\n cancelButtonText: 'Cancel',\n});\n\nconst emit = defineEmits<FormEmits>();\nconst activeSchema = ref(props.schema);\n\n// Use form validation composable\nconst { dynamicRefs, isFormValid, resetForm } = useFormValidation();\n\n// Use data transformation composable\nconst { formData: data, computedData } = useDataTransformation(activeSchema);\n\nasync function submitForm() {\n if (!(await isFormValid())) return;\n emit('submit', data.value, computedData.value);\n}\n\nfunction handleClearAction() {\n resetForm();\n emit('clear');\n}\n\nfunction handleCancelAction() {\n resetForm();\n emit('cancel');\n}\n\nwatch(\n data,\n async () => {\n for (const [k, f] of Object.entries(activeSchema.value)) {\n if (!canRenderField(f, data.value, computedData.value)) {\n // Reset the value of the field if it's not rendered\n f.value = props.schema[k].value;\n }\n }\n },\n {\n deep: true,\n immediate: true,\n }\n);\n\nwatch(\n () => props.schema,\n newSchema => {\n for (const [key, field] of Object.entries(newSchema)) {\n if (field.value !== undefined) {\n activeSchema.value[key].value = field.value;\n }\n }\n },\n {\n deep: true,\n immediate: true,\n }\n);\n\ndefineExpose({\n resetForm,\n isFormValid,\n resolveData: () => ({\n formData: data.value,\n computedData: computedData.value,\n }),\n});\n</script>\n\n<style>\n.input-label {\n font-size: large;\n font-weight: bold;\n}\n</style>\n","import { ComponentPublicInstance, Ref } from 'vue';\n\n/**\n * Composable for managing Ionic validation CSS classes\n * Reduces duplication in input validation state management\n */\nexport function useValidationStyles(inputRef: Ref<ComponentPublicInstance | null>) {\n /**\n * Apply validation state CSS classes to input element\n */\n const applyValidationState = async (isValid: boolean) => {\n // Remove existing validation classes\n inputRef.value?.$el.classList.remove('ion-invalid');\n inputRef.value?.$el.classList.remove('ion-valid');\n\n // Apply appropriate validation class\n if (isValid) {\n inputRef.value?.$el.classList.add('ion-valid');\n } else {\n inputRef.value?.$el.classList.add('ion-invalid');\n }\n\n // Mark as touched\n inputRef.value?.$el.classList.add('ion-touched');\n };\n\n /**\n * Reset validation classes when focusing\n */\n const resetValidationState = () => {\n inputRef.value?.$el.classList.remove('ion-touched');\n inputRef.value?.$el.classList.remove('ion-invalid');\n };\n\n return {\n applyValidationState,\n resetValidationState,\n };\n}\n","import { Ref } from 'vue';\nimport { FormField, FormSchema } from '../types';\nimport { useValidationStyles } from './useValidationStyles';\nimport { ComponentPublicInstance } from 'vue';\n\n/**\n * Composable for common input validation logic\n * Reduces duplication across input components with standard validation patterns\n */\nexport function useInputValidation(\n inputRef: Ref<ComponentPublicInstance | null>,\n model: Ref<FormField>,\n inputValue: Ref<any>,\n schema?: Ref<FormSchema | undefined>,\n customValidation?: (value: any) => Promise<boolean | string>\n) {\n const { applyValidationState, resetValidationState } = useValidationStyles(inputRef);\n\n /**\n * Standard validation logic for form inputs\n */\n async function isValid(): Promise<boolean> {\n // Check required field validation\n if (model.value.required && !inputValue.value) {\n model.value.error = 'This field is required';\n return false;\n }\n\n // Run custom validation if provided\n if (customValidation) {\n const customResult = await customValidation(inputValue.value);\n if (typeof customResult === 'string') {\n model.value.error = customResult;\n return false;\n }\n if (customResult === false) {\n return false;\n }\n }\n\n // Run field-specific validation function\n if (model.value.validation) {\n const errors = await model.value.validation(inputValue.value, schema?.value);\n if (errors && errors.length) {\n model.value.error = errors.join();\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Standard onValueUpdate handler\n */\n async function onValueUpdate(): Promise<void> {\n const validationResult = await isValid();\n\n if (validationResult) {\n model.value.error = '';\n model.value.value = inputValue.value;\n }\n\n await applyValidationState(validationResult);\n }\n\n /**\n * Standard onFocus handler\n */\n function onFocus(): void {\n resetValidationState();\n model.value.error = '';\n }\n\n /**\n * Standard onReset handler\n */\n function onReset(defaultValue: any = ''): void {\n inputValue.value = defaultValue;\n model.value.error = '';\n model.value.value = defaultValue;\n }\n\n /**\n * Standard getErrors handler\n */\n function getErrors(): string[] {\n return model.value.error ? [model.value.error] : [];\n }\n\n return {\n isValid,\n onValueUpdate,\n onFocus,\n onReset,\n getErrors,\n applyValidationState,\n resetValidationState,\n };\n}\n","import { computed, type Ref } from 'vue';\nimport type { FormField } from '../types';\n\n/**\n * Composable for common label template logic\n * Reduces duplication across input components that render labels with required asterisks\n */\nexport function useLabelTemplate(model: Ref<FormField>) {\n /**\n * Computed property to determine if the label should be shown\n */\n const showLabel = computed(() => !!model.value.label);\n\n /**\n * Computed property to determine if the required asterisk should be shown\n */\n const showRequired = computed(() => !!model.value.required);\n\n /**\n * Computed property for the label text\n */\n const labelText = computed(() => model.value.label || '');\n\n return {\n showLabel,\n showRequired,\n labelText,\n };\n}\n","<template>\n <ion-label slot=\"label\" v-if=\"showLabel\" class=\"input-label\">\n {{ labelText }}\n <ion-text color=\"danger\" v-if=\"showRequired\">*</ion-text>\n </ion-label>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonLabel, IonText } from '@ionic/vue';\nimport type { FormField } from '../../types';\nimport { useLabelTemplate } from '../../composables/useLabelTemplate';\nimport { toRef } from 'vue';\n\nconst props = defineProps<{\n model: FormField;\n}>();\n\nconst { showLabel, showRequired, labelText } = useLabelTemplate(toRef(props, 'model'));\n</script>\n","<template>\n <ion-input\n ref=\"inputRef\"\n v-model=\"input\"\n v-maskito=\"maskitoOptions\"\n :clear-input=\"true\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :type=\"type ?? 'text'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :placeholder=\"maskitoOptions?.placeholder ?? model.placeholder\"\n :disabled=\"model.disabled\"\n :counter=\"model.counter\"\n :min=\"model.min\"\n :max=\"model.max\"\n :max-length=\"model.maxLength\"\n :min-length=\"model.minLength\"\n :pattern=\"model.pattern\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ion-blur=\"onValueUpdate\"\n >\n <InputLabel :model=\"model\" />\n <ion-label v-if=\"model.prefix\" slot=\"start\">{{ model.prefix }}</ion-label>\n <ion-label v-if=\"model.suffix\" slot=\"end\">{{ model.suffix }} </ion-label>\n <ion-input-password-toggle slot=\"end\" v-if=\"type === 'password'\" />\n </ion-input>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonInput, IonLabel, IonInputPasswordToggle } from '@ionic/vue';\nimport { FormField, FormSchema, BaseFieldTypes } from '../../types';\nimport { generateMaskitoOptions } from '../../utils';\nimport { ComponentPublicInstance, computed, PropType, ref, watch } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema; type?: BaseFieldTypes }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as string);\nconst schema = computed(() => props.schema);\n\n// Use input validation composable\nconst { isValid, onValueUpdate, onFocus, onReset, getErrors } = useInputValidation(\n inputRef,\n model,\n input,\n schema\n);\n\nconst maskitoOptions = computed(() => {\n if (model.value.pattern) return generateMaskitoOptions(model.value.pattern);\n return undefined;\n});\n\nwatch(\n () => model.value.value,\n v => (input.value = v as string)\n);\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n isValid,\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"text\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <ion-input\n type=\"text\"\n ref=\"inputRef\"\n :clear-input=\"true\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :disabled=\"model.disabled\"\n @ion-focus=\"onFocus\"\n @ion-blur=\"onValueUpdate\"\n >\n <InputLabel :model=\"model\" />\n <template v-for=\"(part, index) in patternParts\">\n <ion-select\n slot=\"start\"\n :key=\"`select-${part}`\"\n interface=\"popover\"\n :style=\"{ minWidth: model.enableTime ? '10%' : '30%' }\"\n :placeholder=\"part\"\n :value=\"partValues[part]\"\n @ion-focus=\"onFocus\"\n @ion-input=\"buildInputDate(part, undefined, $event)\"\n @ion-blur=\"buildInputDate(part, undefined, $event)\"\n v-if=\"/MM|MMM|MMMM/.test(part)\"\n >\n <ion-select-option\n v-for=\"(month, i) in monthNames\"\n :key=\"month\"\n :value=\"getMonth(i + 1, part)\"\n >\n {{ getMonth(i + 1, part) }}\n </ion-select-option>\n </ion-select>\n <ion-input\n v-else\n slot=\"start\"\n :key=\"`input-${part}`\"\n :placeholder=\"part\"\n :autofocus=\"model.autoFocus\"\n :value=\"partValues[part]\"\n @ion-focus=\"onFocus\"\n @ion-input=\"buildInputDate(part, undefined, $event)\"\n @ion-blur=\"buildInputDate(part, undefined, $event)\"\n />\n <ion-label slot=\"start\" :key=\"`separator-${index}`\" v-if=\"index < patternParts.length - 1\">\n &nbsp;{{ separators[index] }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n </ion-label>\n </template>\n <ion-label slot=\"end\">\n <vue-date-picker\n enable-seconds\n time-picker-inline\n teleport\n :model-value=\"pickerDate\"\n :auto-apply=\"!model.enableTime\"\n :enable-time-picker=\"model.enableTime ?? false\"\n :maxDate=\"maxDate\"\n :minDate=\"minDate\"\n @date-update=\"buildPickerDate\"\n >\n <template #trigger>\n <ion-button fill=\"clear\">\n <ion-icon\n slot=\"icon-only\"\n :icon=\"calendar\"\n aria-hidden=\"true\"\n @click=\"onFocus\"\n ></ion-icon>\n </ion-button>\n </template>\n </vue-date-picker>\n </ion-label>\n </ion-input>\n</template>\n\n<script lang=\"ts\" setup>\nimport VueDatePicker from '@vuepic/vue-datepicker';\nimport '@vuepic/vue-datepicker/dist/main.css';\nimport { IonInput, IonLabel, IonIcon, IonSelect, IonSelectOption, IonButton } from '@ionic/vue';\nimport { calendar } from 'ionicons/icons';\nimport type { FormField, FormSchema } from '../../types';\nimport { ComponentPublicInstance, computed, onMounted, PropType, ref, watch } from 'vue';\nimport { formatDate, getMonth, zeroPad, monthNames } from '../../utils';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst maxDate = ref(model.value.max as string | undefined);\nconst minDate = ref(model.value.max as string | undefined);\nconst pickerDate = ref<string>(model.value.value as string);\nconst schema = computed(() => props.schema);\n\n// Custom validation for DateInput\nasync function customDateValidation(value: string): Promise<boolean | string> {\n if (value === undefined) {\n if (model.value.required) {\n return 'This field is required';\n }\n return true;\n }\n\n const _date = new Date(value);\n if (isNaN(_date.getTime())) {\n return 'Invalid date string';\n }\n\n if (minDate.value && _date < new Date(minDate.value)) {\n return `Date must be greater than ${minDate.value}`;\n }\n\n if (maxDate.value && _date > new Date(maxDate.value)) {\n return `Date must be less than ${maxDate.value}`;\n }\n\n return true;\n}\n\n// Use input validation composable with custom date validation\nconst { onValueUpdate, onFocus, getErrors } = useInputValidation(\n inputRef,\n model,\n pickerDate,\n schema,\n customDateValidation\n);\n\n// Custom onReset for DateInput\nfunction onReset() {\n pickerDate.value = '';\n model.value.error = '';\n model.value.value = '';\n}\nconst pattern = computed(() => {\n if (model.value.pattern) return model.value.pattern;\n let datePattern = model.value.pattern ?? 'DD/MMM/YYYY';\n if (model.value.enableTime) {\n datePattern += ' HH:mm:ss';\n }\n return datePattern;\n});\nconst separatorRegex = /[-/.,:\\s]+/;\nconst patternParts = computed(() => pattern.value.split(separatorRegex));\nconst separators = computed(() => pattern.value.match(/[-/.,:\\s]+/g) || []);\nconst partValues = ref({} as Record<string, any>);\n\nwatch(\n () => model.value.value,\n v => {\n pickerDate.value = v as string;\n buildPickerDate(v as string);\n }\n);\n\nasync function buildInputDate(part: string, defaultValue?: string, e?: Event) {\n let value = defaultValue ?? (e?.target as HTMLInputElement).value;\n if (/MM|MMM|MMMM/.test(part)) value = getMonth(value, part);\n if (Number.isInteger(parseInt(value))) value = zeroPad(parseInt(value));\n partValues.value[part] = value;\n const formattedDate = patternParts.value.reduce((date, part, index) => {\n date +=\n partValues.value[part] +\n (index < patternParts.value.length - 1 ? separators.value[index] : '');\n return date;\n }, '');\n pickerDate.value = formattedDate;\n await onValueUpdate();\n}\n\nasync function buildPickerDate(date: string) {\n const parts = formatDate(date, pattern.value).split(separatorRegex);\n patternParts.value.forEach((part, index) => buildInputDate(part, parts[index]));\n await onValueUpdate();\n}\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n\nonMounted(() => {\n patternParts.value.forEach((part, index) => {\n partValues.value[part] = pickerDate.value?.split(separatorRegex)[index] ?? '';\n });\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"number\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"email\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"password\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <div class=\"autocomplete-container\" @focusout=\"onValueUpdate\" ref=\"containerRef\">\n <ion-input\n ref=\"inputRef\"\n v-model=\"filter\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :type=\"type ?? 'text'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :placeholder=\"placeholder\"\n :disabled=\"model.disabled\"\n :counter=\"model.counter\"\n @ion-focus=\"onFocus\"\n :debounce=\"300\"\n @click=\"openInterface\"\n >\n <InputLabel :model=\"model\" />\n <ion-label v-if=\"model.multiple\" style=\"width: fit-content\" slot=\"start\">\n <ion-chip v-for=\"(tag, index) of tags\" :key=\"index\">\n <ion-label>{{ tag.label }}</ion-label>\n </ion-chip>\n </ion-label>\n <ion-label slot=\"start\" v-else class=\"ion-no-wrap\">\n {{ tags[0]?.label ?? '' }}\n </ion-label>\n <ion-icon slot=\"end\" :icon=\"chevronDown\" />\n <ion-icon\n slot=\"end\"\n :icon=\"close\"\n v-if=\"tags.length > 0 || filter\"\n @click=\"onReset\"\n style=\"z-index: 999999\"\n />\n </ion-input>\n\n <ion-list\n v-if=\"showOptions && options.length > 0 && interfaceType === 'popover'\"\n class=\"suggestions-list\"\n :class=\"popoverPosition\"\n >\n <ion-item button v-for=\"option in options\" :key=\"option.label\" @click=\"onSelect(option)\">\n <ion-checkbox slot=\"start\" :checked=\"option.isChecked\" v-if=\"model.multiple\" />\n <ion-label>{{ option.label }}</ion-label>\n </ion-item>\n </ion-list>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, PropType, watch, ComponentPublicInstance } from 'vue';\nimport { chevronDown, close } from 'ionicons/icons';\nimport { FormSchema, BaseFieldTypes, FormField, Option } from 'types';\nimport { isEmpty, checkOption, getFilteredOptions, uncheckOption } from '../../utils';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport {\n IonInput,\n IonList,\n IonItem,\n IonLabel,\n IonChip,\n IonIcon,\n IonCheckbox,\n actionSheetController,\n alertController,\n AlertInput,\n} from '@ionic/vue';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema; type?: BaseFieldTypes }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst containerRef = ref<HTMLElement | null>(null);\nconst showOptions = ref(false);\nconst options = ref<Option[]>([]);\nconst filter = ref('');\nconst page = ref(1);\n\nconst interfaceType = computed(() => {\n return model.value.interface ?? 'popover';\n});\n\nconst popoverPosition = computed(() => {\n return model.value.optionsPlacement === 'top' ? 'top' : 'bottom';\n});\n\nconst tags = computed<Option[]>(() => options.value.filter(o => !!o.isChecked));\n\nconst placeholder = computed(() => {\n return !filter.value && isEmpty(tags.value) && !showOptions.value\n ? (model.value.placeholder ?? 'Select an option')\n : '';\n});\n\nwatch([filter, () => model.value.options], filterOptions, {\n immediate: true,\n deep: true,\n});\nwatch(() => model.value.value, initialize, { immediate: true, deep: true });\n\nfunction onReset() {\n options.value.forEach(o => uncheckOption(o, options.value));\n model.value.error = '';\n filter.value = '';\n page.value = 1;\n model.value.value = model.value.multiple ? [] : '';\n}\n\nfunction onSelect(item: Option) {\n if (item.isChecked) return uncheckOption(item, options.value);\n if (model.value.multiple) {\n checkOption(item, options.value);\n } else {\n onReset();\n checkOption(item, options.value);\n onValueUpdate();\n }\n filter.value = '';\n}\n\nfunction openInterface() {\n switch (interfaceType.value) {\n case 'action-sheet':\n openActionSheet();\n break;\n case 'alert':\n openAlert();\n break;\n case 'popover':\n default:\n showOptions.value = true;\n break;\n }\n}\n\nasync function openActionSheet() {\n await filterOptions();\n\n if (model.value.multiple) {\n // For multiple selection, open an a popover instead of action sheet\n showOptions.value = true;\n return;\n }\n\n // Standard action sheet for single selection\n const actionSheet = await actionSheetController.create({\n header: model.value.label || 'Select an option',\n buttons: [\n ...options.value.map(option => ({\n text: option.label,\n cssClass: option.isChecked ? 'selected-option' : '',\n handler: () => {\n onSelect(option);\n return false;\n },\n })),\n {\n text: 'Cancel',\n role: 'cancel',\n },\n ],\n });\n\n await actionSheet.present();\n}\n\nasync function openAlert() {\n await filterOptions();\n\n const inputs: AlertInput[] = options.value.map(option => ({\n label: option.label,\n type: model.value.multiple ? 'checkbox' : 'radio',\n value: option,\n checked: option.isChecked,\n }));\n\n const alert = await alertController.create({\n header: model.value.label || 'Select an option',\n inputs,\n buttons: [\n {\n text: 'Cancel',\n role: 'cancel',\n },\n {\n text: 'OK',\n handler: selectedOptions => {\n if (model.value.multiple) {\n // Reset all options first\n options.value.forEach(o => uncheckOption(o, options.value));\n\n // Then check selected options\n selectedOptions.forEach((selected: Option) => {\n const option = options.value.find(o => o.value === selected.value);\n if (option) checkOption(option, options.value);\n });\n } else {\n onReset();\n const option = options.value.find(o => o.value === selectedOptions.value);\n if (option) checkOption(option, options.value);\n }\n onValueUpdate();\n },\n },\n ],\n });\n\n await alert.present();\n}\n\n// Custom validation for SelectInput - handles both required and custom validation\nasync function customSelectValidation(): Promise<boolean | string> {\n // Check required validation\n if (model.value.required && isEmpty(tags.value)) {\n return 'This field is required';\n }\n\n // Run field-specific validation function if it exists\n if (model.value.validation) {\n const errors = await model.value.validation(tags.value, props?.schema);\n if (errors && errors.length) {\n return errors.join();\n }\n }\n\n return true;\n}\n\n// Use input validation composable with custom validation\nconst { onFocus: baseOnFocus, applyValidationState } = useInputValidation(\n inputRef,\n model,\n computed(() => (model.value.multiple ? tags.value : tags.value[0])),\n computed(() => props?.schema),\n customSelectValidation\n);\n\nfunction onFocus(evt: any) {\n if (evt.target !== inputRef.value?.$el) return;\n baseOnFocus();\n\n // Only show options immediately for popover interface\n if (interfaceType.value === 'popover') {\n showOptions.value = true;\n }\n}\n\nasync function onValueUpdate(evt?: any) {\n if ((evt?.relatedTarget as HTMLElement)?.closest('.suggestions-list')) return;\n showOptions.value = false;\n\n // Validate using custom validation logic\n const validationResult = await customSelectValidation();\n\n if (validationResult === true) {\n model.value.error = '';\n model.value.value = model.value.multiple ? tags.value : tags.value[0];\n } else {\n model.value.error =\n typeof validationResult === 'string' ? validationResult : 'Validation failed';\n }\n\n await applyValidationState(validationResult === true);\n}\n\nasync function filterOptions() {\n const filtered: Array<Option> = [];\n\n if (typeof model.value.options === 'function') {\n const res = await model.value.options(filter.value);\n filtered.push(...res.filter(o => !!o.label));\n } else {\n filtered.push(...getFilteredOptions(model.value.options ?? [], filter.value));\n }\n\n tags.value.forEach(tag => checkOption(tag, filtered));\n options.value = filtered;\n}\n\nfunction initialize() {\n const defaultValue = model.value.value;\n if (defaultValue) {\n if (Array.isArray(defaultValue)) {\n defaultValue.forEach(opt => checkOption(opt, options.value));\n } else if (typeof defaultValue === 'object') {\n checkOption(defaultValue, options.value);\n } else {\n checkOption(\n {\n value: defaultValue as any,\n label: defaultValue as string,\n },\n options.value\n );\n }\n }\n}\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors: () => (model.value.error ? [model.value.error] : []),\n});\n</script>\n\n<style scoped>\n.autocomplete-container {\n position: relative;\n}\n\n.suggestions-list {\n position: absolute;\n left: 0;\n right: 0;\n background-color: white;\n border: none;\n z-index: 99000;\n max-height: 65vh;\n overflow-y: auto;\n transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.suggestions-list.bottom {\n top: 100%;\n margin-top: 4px;\n border-radius: 4px;\n box-shadow:\n 0 2px 4px -1px rgba(0, 0, 0, 0.2),\n 0 4px 5px 0 rgba(0, 0, 0, 0.14),\n 0 1px 10px 0 rgba(0, 0, 0, 0.12);\n}\n\n.suggestions-list.top {\n bottom: 100%;\n margin-bottom: 4px;\n border-radius: 4px;\n box-shadow:\n 0 -2px 4px -1px rgba(0, 0, 0, 0.2),\n 0 -4px 5px 0 rgba(0, 0, 0, 0.14),\n 0 -1px 10px 0 rgba(0, 0, 0, 0.12);\n}\n\nion-list {\n margin: 0;\n padding: 0;\n}\n\n/* Add hover effect for items */\nion-item {\n --ripple-color: var(--ion-color-primary-tint, #4c8dff);\n transition: background-color 0.2s ease;\n}\n\nion-item:hover {\n --background: rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.08);\n}\n\n:deep(.selected-option) {\n font-weight: bold;\n color: var(--ion-color-primary);\n}\n</style>\n","<template>\n <ion-textarea\n ref=\"inputRef\"\n v-model=\"input\"\n :clear-input=\"true\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :placeholder=\"model.placeholder\"\n :disabled=\"model.disabled\"\n :counter=\"model.counter\"\n :min=\"model.min\"\n :max=\"model.max\"\n :rows=\"model.rows\"\n :cols=\"model.cols\"\n :auto-grow=\"model.autoGrow\"\n :max-length=\"model.maxLength\"\n :min-length=\"model.minLength\"\n :pattern=\"model.pattern\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ion-blur=\"onValueUpdate\"\n >\n <InputLabel :model=\"model\" />\n </ion-textarea>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonTextarea } from '@ionic/vue';\nimport { FormField, FormSchema } from 'types';\nimport { ComponentPublicInstance, PropType, ref, watch, computed } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as string);\nconst schema = computed(() => props.schema);\n\n// Use input validation composable\nconst { onValueUpdate, onFocus, onReset, getErrors } = useInputValidation(\n inputRef,\n model,\n input,\n schema\n);\n\nwatch(\n () => model.value.value,\n v => (input.value = v as string)\n);\n\ndefineExpose({\n onReset,\n onValueUpdate,\n getErrors,\n});\n</script>\n","<template>\n <div v-for=\"(child, index) of childrens\" class=\"repeat-input-wrapper\" :key=\"index\">\n <div class=\"ion-margin-end\" style=\"flex-grow: 1\">\n <ion-row>\n <template v-for=\"formId of Object.keys(child)\">\n <IonCol\n :key=\"`${index}-${formId}`\"\n :size=\"child[formId].grid?.xs ?? '12'\"\n :size-sm=\"child[formId].grid?.sm\"\n :size-md=\"child[formId].grid?.md\"\n :size-lg=\"child[formId].grid?.lg\"\n :size-xl=\"child[formId].grid?.xl\"\n class=\"ion-margin-bottom\"\n v-if=\"canRenderField(child[formId], data, computedData)\"\n >\n <component\n :is=\"child[formId].type\"\n v-model=\"child[formId]\"\n :schema=\"child\"\n :ref-key=\"`${index}-${formId}`\"\n ref=\"dynamicRefs\"\n />\n </IonCol>\n </template>\n </ion-row>\n </div>\n <div style=\"display: flex; justify-content: flex-end\">\n <ion-button @click=\"addSet\" color=\"primary\" v-if=\"index === childrens.length - 1\">\n <ion-icon slot=\"icon-only\" :icon=\"add\"></ion-icon>\n </ion-button>\n <ion-button @click=\"removeSet(index)\" color=\"warning\" v-if=\"childrens.length > 1\">\n <ion-icon slot=\"icon-only\" :icon=\"remove\"></ion-icon>\n </ion-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComputedData, FormData, FormField, FormSchema, Option } from 'types';\nimport { IonRow, IonCol, IonButton, IonIcon } from '@ionic/vue';\nimport { canRenderField, deepClone } from '../../utils';\nimport { useFormValidation } from '../../composables/useFormValidation';\nimport { computed, onMounted, PropType, ref, watch } from 'vue';\nimport { add, remove } from 'ionicons/icons';\n\ninterface PropsI {\n schema?: FormSchema;\n data: FormData;\n computedData: ComputedData;\n}\n\ndefineProps<PropsI>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst childrens = ref<FormSchema[]>([]);\n\n// Use form validation composable\nconst { dynamicRefs, resetForm, getFormErrors, updateFormValues } = useFormValidation();\n\nconst inputValue = computed<Array<Option>>(() => {\n return childrens.value.map((child, index) => ({\n label: `Set ${index + 1}`,\n value: index,\n other: Object.entries(child).reduce(\n (acc, [id, field]) => {\n acc[id] = field.value;\n return acc;\n },\n {} as Record<string, any>\n ),\n }));\n});\n\nwatch(\n inputValue,\n value => {\n model.value.value = value;\n },\n { deep: true, immediate: true }\n);\n\nonMounted(addSet);\n\nfunction addSet() {\n if (model.value.children) {\n childrens.value.push(deepClone<FormSchema>(model.value.children));\n }\n}\n\nfunction removeSet(index: number) {\n childrens.value.splice(index, 1);\n}\n\nfunction onReset() {\n resetForm();\n}\n\nfunction getErrors() {\n return getFormErrors();\n}\n\nasync function onValueUpdate() {\n await updateFormValues();\n}\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n</script>\n\n<style scoped>\n.repeat-input-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n}\n</style>\n","import { computed, type Ref } from 'vue';\nimport type { FormField } from '../types';\n\n/**\n * Composable for checkbox label text content\n * Handles the specific pattern where labels are rendered as text content with asterisks\n */\nexport function useCheckboxLabelText(model: Ref<FormField>) {\n /**\n * Computed property for the complete label text including required asterisk\n */\n const labelTextWithAsterisk = computed(() => {\n const label = model.value.label || '';\n const asterisk = model.value.required ? ' *' : '';\n return label + asterisk;\n });\n\n return {\n labelTextWithAsterisk,\n };\n}\n","<template>\n <ion-checkbox\n v-model=\"input\"\n ref=\"inputRef\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :disabled=\"model.disabled\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ion-blur=\"onValueUpdate\"\n >\n {{ labelTextWithAsterisk }}\n </ion-checkbox>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonCheckbox } from '@ionic/vue';\nimport { FormField, FormSchema } from 'types';\nimport { ComponentPublicInstance, PropType, ref, watch, computed } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport { useCheckboxLabelText } from '../../composables/useCheckboxLabelText';\n\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as boolean);\nconst schema = computed(() => props.schema);\n\n// Use checkbox label text composable\nconst { labelTextWithAsterisk } = useCheckboxLabelText(model);\n\n// Use input validation composable with custom default value for checkbox\nconst { onValueUpdate, onFocus, getErrors } = useInputValidation(inputRef, model, input, schema);\n\n// Custom onReset for checkbox (default to false)\nfunction onReset() {\n input.value = false;\n model.value.error = '';\n model.value.value = false;\n}\n\nwatch(\n () => model.value.value,\n v => (input.value = v as boolean)\n);\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n</script>\n","import { App, Plugin } from 'vue';\nimport Form from './components/vForm.vue';\nimport TextInput from './components/inputs/TextInput.vue';\nimport DateInput from './components/inputs/DateInput.vue';\nimport NumberInput from './components/inputs/NumberInput.vue';\nimport EmailInput from './components/inputs/EmailInput.vue';\nimport PasswordInput from './components/inputs/PasswordInput.vue';\nimport SelectInput from './components/inputs/SelectInput.vue';\nimport TextAreaInput from './components/inputs/TextAreaInput.vue';\nimport RepeatInput from './components/inputs/RepeatInput.vue';\nimport CheckboxInput from './components/inputs/CheckboxInput.vue';\nimport { maskito } from '@maskito/vue';\n\nexport const VForm: Plugin = {\n install(app: App) {\n app.component('VForm', Form);\n app.component('TextInput', TextInput);\n app.component('DateInput', DateInput);\n app.component('NumberInput', NumberInput);\n app.component('EmailInput', EmailInput);\n app.component('PasswordInput', PasswordInput);\n app.component('SelectInput', SelectInput);\n app.component('TextAreaInput', TextAreaInput);\n app.component('RepeatInput', RepeatInput);\n app.component('CheckboxInput', CheckboxInput);\n app.directive('maskito', maskito);\n },\n};\n\nexport * from './types';\n\nexport type VFormRef = typeof Form;\n\nexport default VForm;\n"],"names":["getElementPredicate","el","resolve","input","MASK_CHAR_REGEX","DEMO_STRINGS","nextDemoChar","type","idx","arr","generateMaskitoOptions","pattern","mask","placeholder","i","demoIdx","char","maxQuant","quantEnd","quantString","max","s","j","q","monthNames","isEmpty","value","formatDate","date","_date","day","zeroPad","month","year","hour","minute","second","milliseconds","replacements","match","num","getMonth","part","canRenderField","field","data","computedData","deepClone","obj","item","cloned","key","findOption","option","options","opt","checkOption","index","uncheckOption","getFilteredOptions","filter","useFormValidation","dynamicRefs","ref","isFormValid","errors","inputRef","componentErrors","error","resetForm","getFormErrors","updateFormValues","useDataTransformation","activeSchema","formData","computed","acc","form","other","results","id","v","props","__props","emit","__emit","submitForm","handleClearAction","handleCancelAction","watch","k","f","newSchema","__expose","_createBlock","_unref","IonGrid","_createVNode","IonRow","_openBlock","_createElementBlock","_Fragment","formId","IonCol","_a","_b","_c","_d","_e","_resolveDynamicComponent","$event","hideButtons","_normalizeStyle","buttonPlacement","showCancelButton","IonButton","cancelButtonText","showClearButton","clearButtonText","_renderList","customButtons","button","_createTextVNode","_toDisplayString","submitButtonText","useValidationStyles","isValid","useInputValidation","model","inputValue","schema","customValidation","applyValidationState","resetValidationState","customResult","onValueUpdate","validationResult","onFocus","onReset","defaultValue","getErrors","useLabelTemplate","showLabel","showRequired","labelText","toRef","IonLabel","IonText","_cache","_useModel","maskitoOptions","IonInput","InputLabel","IonInputPasswordToggle","BaseInput","maxDate","minDate","pickerDate","customDateValidation","datePattern","separatorRegex","patternParts","separators","partValues","buildPickerDate","buildInputDate","e","formattedDate","parts","onMounted","IonSelect","IonSelectOption","VueDatePicker","IonIcon","calendar","containerRef","showOptions","page","interfaceType","popoverPosition","tags","o","filterOptions","initialize","onSelect","openInterface","openActionSheet","openAlert","actionSheetController","inputs","alertController","selectedOptions","selected","customSelectValidation","baseOnFocus","evt","filtered","res","tag","IonChip","chevronDown","close","IonList","_normalizeClass","IonItem","IonCheckbox","IonTextarea","childrens","child","addSet","removeSet","_createElementVNode","_hoisted_1","_hoisted_2","add","remove","useCheckboxLabelText","label","asterisk","labelTextWithAsterisk","VForm","app","Form","TextInput","DateInput","NumberInput","EmailInput","PasswordInput","SelectInput","TextAreaInput","RepeatInput","CheckboxInput","maskito"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/utils/maskito.ts","../src/utils/index.ts","../src/composables/useFormValidation.ts","../src/composables/useDataTransformation.ts","../src/components/vForm.vue","../src/composables/useValidationStyles.ts","../src/composables/useInputValidation.ts","../src/composables/useLabelTemplate.ts","../src/components/shared/InputLabel.vue","../src/components/inputs/BaseInput.vue","../src/components/inputs/TextInput.vue","../src/components/inputs/DateInput.vue","../src/components/inputs/NumberInput.vue","../src/components/inputs/EmailInput.vue","../src/components/inputs/PasswordInput.vue","../src/components/inputs/SelectInput.vue","../src/components/inputs/TextAreaInput.vue","../src/components/inputs/RepeatInput.vue","../src/components/inputs/CheckboxInput.vue","../src/components/inputs/RadioInput.vue","../src/index.ts"],"sourcesContent":["// Helper for IonInput integration with Maskito\n// eslint-disable-next-line no-undef\nexport function getElementPredicate(el: HTMLIonInputElement) {\n return new Promise(resolve => {\n requestAnimationFrame(async () => {\n const input = await el.getInputElement();\n resolve(input);\n });\n });\n}\n\ntype PatternToken = { type: 'd' | 'a' | '*'; quant: number; regex: RegExp; placeholder: string };\n\nconst MASK_CHAR_REGEX: Record<PatternToken['type'], RegExp> = {\n d: /\\d/,\n a: /[A-Za-z]/,\n '*': /[A-Za-z0-9]/, // Default: alphanum, can customize if needed\n};\n\n// Helper to sample letters/numbers for pretty placeholder\nconst DEMO_STRINGS = {\n d: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],\n a: ['A', 'B', 'C', 'x', 'y', 'z', 'D', 'f'],\n '*': ['A', '3', 'b', '8', 'z', '4', 'D', '0'],\n};\n\nfunction nextDemoChar(type: PatternToken['type'], idx: number) {\n const arr = DEMO_STRINGS[type];\n return arr[idx % arr.length];\n}\n\nexport function generateMaskitoOptions(pattern: string) {\n const mask: (RegExp | string)[] = [];\n let placeholder = '';\n let i = 0,\n demoIdx = 0;\n\n while (i < pattern.length) {\n const char = pattern[i];\n\n // Match token+quantifier, e.g. d{2,3}, a{4}\n if (['d', 'a', '*'].includes(char)) {\n let maxQuant = 1;\n\n if (pattern[i + 1] === '{') {\n const quantEnd = pattern.indexOf('}', i + 2);\n if (quantEnd !== -1) {\n const quantString = pattern.slice(i + 2, quantEnd);\n if (quantString.includes(',')) {\n const [, max] = quantString.split(',').map(s => parseInt(s.trim()));\n maxQuant = max || parseInt(quantString.split(',')[0]); // if max is empty, use min\n } else {\n maxQuant = parseInt(quantString);\n }\n i = quantEnd; // skip ahead\n }\n } else {\n // Count repeats: ddd\n let j = i + 1;\n while (pattern[j] === char) {\n maxQuant++;\n j++;\n }\n i = j - 1;\n }\n\n // Generate mask for maximum possible characters\n for (let q = 0; q < maxQuant; q++) {\n mask.push(MASK_CHAR_REGEX[char as PatternToken['type']]);\n placeholder += nextDemoChar(char as PatternToken['type'], demoIdx++);\n }\n }\n // Fixed/separator char\n else {\n mask.push(char);\n placeholder += char;\n }\n i++;\n }\n\n // MaskitoOptions + placeholder + Ionic elementPredicate\n return {\n mask,\n placeholder,\n elementPredicate: getElementPredicate,\n };\n}\n","/**\n * Form Builder Utility functions\n *\n * This module provides utility functions for form handling, including date formatting,\n * field rendering checks, deep cloning, option management, and more.\n *\n * It is designed to be used in conjunction with vform form builder components and can be extended\n * or modified as needed for specific use cases.\n *\n * @packageDocumentation\n * @module utils\n * @preferred\n * @author Daniel Justin.\n **/\nimport { ComputedData, FormData, FormField, Option } from 'types';\nexport * from './maskito';\n\n/**\n * Full month names.\n **/\nexport const monthNames = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\n/**\n * Checks if a value is \"empty\".\n *\n * @param value - The value to check for emptiness.\n * @returns `true` if the value is `null` or `undefined`, an empty string, an empty array, or an empty object.\n * Returns `false` otherwise.\n */\nexport function isEmpty(value: any): boolean {\n return (\n value === null ||\n value === undefined ||\n (Array.isArray(value) && !value.length) ||\n (typeof value === 'object' && !Object.keys(value).length) ||\n !value\n );\n}\n\n/**\n * Format a date string according to a given pattern.\n *\n * @param date - The date string to format.\n * @param pattern - The pattern to format the date string with. default is 'DD/MMM/2024'.\n * @returns The formatted date string.\n */\nexport function formatDate(date: string, pattern: string = 'DD/MMM/YYYY'): string {\n const _date = new Date(date);\n\n if (isNaN(_date.getTime())) {\n throw new Error('Invalid date string');\n }\n\n const day = zeroPad(_date.getDate());\n const month = _date.getMonth() + 1; // months are zero-based\n const year = _date.getFullYear();\n const hour = zeroPad(_date.getHours());\n const minute = zeroPad(_date.getMinutes());\n const second = zeroPad(_date.getSeconds());\n const milliseconds = _date.getMilliseconds();\n\n const replacements: { [key: string]: string } = {\n DD: day,\n D: _date.getDate().toString(),\n MMM: monthNames[_date.getMonth()].slice(0, 3),\n MMMM: monthNames[_date.getMonth()],\n MM: zeroPad(month),\n M: month.toString(),\n YYYY: year.toString(),\n YY: year.toString().slice(-2),\n HH: hour,\n H: _date.getHours().toString(),\n mm: minute,\n m: _date.getMinutes().toString(),\n ss: second,\n s: _date.getSeconds().toString(),\n SSS: zeroPad(milliseconds),\n S: milliseconds.toString().slice(0, 1),\n // Add more replacements as needed\n };\n\n return pattern.replace(\n /DD|D|MMMM|MMM|MM|M|YYYY|YY|HH|H|mm|m|ss|s|SSS|S/g,\n match => replacements[match] || match\n );\n}\n\n/**\n * Append a zero to a number if it is less than 10.\n *\n * @param num - The number to append a zero to.\n * @returns The number as a string with a zero appended if it is less than 10.\n */\nexport function zeroPad(num: number): string {\n return num < 10 ? `0${num}` : `${num}`;\n}\n\n/**\n * Get the month name or number.\n *\n * @param month - The month number or name.\n * @param part - The part of the month to get. Either 'MMMM', 'MMM', or 'MM'.\n * @returns The month name or number.\n */\nexport function getMonth(month: number | string, part: string) {\n if (Number.isInteger(parseInt(month as string)) && Number(month) > 0) {\n if (part === 'MMMM') return monthNames[Number(month) - 1];\n if (part === 'MMM') return monthNames[Number(month) - 1].slice(0, 3);\n if (part === 'MM') return zeroPad(Number(month));\n }\n return month as string;\n}\n\n/**\n * Determines if a form field can be rendered based on a condition.\n *\n * @param field - The form field to check.\n * @param data - The current form data.\n * @param computedData - Additional computed data that may influence the condition.\n * @returns A boolean indicating whether the field can be rendered.\n */\nexport function canRenderField(field: FormField, data: FormData, computedData: ComputedData) {\n if (typeof field.condition === 'function') {\n return field.condition(data, computedData);\n }\n return true;\n}\n\n/**\n * Deep clone an object.\n *\n * @param obj - The object to clone.\n * @returns The cloned object.\n */\nexport function deepClone<T = any>(obj: T): T {\n // Handle primitive types\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n // Handle Array\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as any;\n }\n\n // Handle Object\n const cloned: any = {};\n Object.entries(obj).forEach(([key, value]) => {\n // Bind functions to the cloned object\n if (typeof value === 'function') {\n cloned[key] = value.bind(cloned);\n } else {\n cloned[key] = deepClone(value);\n }\n });\n\n return cloned;\n}\n\n/**\n * Finds an option in a list of options that matches the given option.\n *\n * The function checks for a match based on the `value` and `label` properties\n * of the `Option` object. It returns the first option that satisfies any of\n * the following conditions:\n * - The `value` of the option matches the `value` of the given option.\n * - The `label` of the option matches the `label` of the given option.\n * - The `value` of the option matches the `label` of the given option.\n * - The `label` of the option matches the `value` of the given option.\n *\n * @param {Option} option - The option to find in the list.\n * @param {Array<Option>} options - The list of options to search through.\n * @returns {number} - The index first matching option, or -1 if no match is found.\n */\nexport function findOption(option: Option, options: Array<Option>): number {\n return options.findIndex(opt => {\n return (\n opt.value === option.value ||\n opt.label === option.label ||\n opt.value === option.label ||\n opt.label === option.value\n );\n });\n}\n\n/**\n * Checks if an option exists in the provided options array. If the option is found,\n * it sets the `isChecked` property to `true`. If the option is not found, it adds\n * the option to the array with the `isChecked` property set to `true`.\n *\n * @param {Option} option - The option to check or add.\n * @param {Array<Option>} options - The array of options to search within.\n */\nexport function checkOption(option: Option, options: Array<Option>) {\n const index = findOption(option, options);\n if (index >= 0) options[index].isChecked = true;\n else options.push({ ...option, isChecked: true });\n}\n\n/**\n * Unchecks the specified option in the given array of options.\n *\n * @param option - The option to uncheck.\n * @param options - The array of options to search within.\n */\nexport function uncheckOption(option: Option, options: Array<Option>) {\n const index = findOption(option, options);\n if (index >= 0) options[index].isChecked = false;\n}\n\n/**\n * Filters an array of options based on a provided filter string.\n *\n * @param {Array<Option>} options - The array of options to filter.\n * @param {string} filter - The string to filter the options by.\n * @returns An array of options that match the filter string.\n */\nexport function getFilteredOptions(options: Array<Option>, filter: string): Array<Option> {\n if (!filter) return options;\n return options.filter(option =>\n JSON.stringify(option).toLowerCase().includes(filter.toLowerCase())\n );\n}\n\n/**\n * Generates a label text for a form field, appending an asterisk if the field is required.\n *\n * @param model - The form field model containing the label and required status.\n * @returns The label text with an optional asterisk for required fields.\n */\nexport function getLabelText(model: FormField): string {\n const label = model.label || '';\n const asterisk = model.required ? ` *` : '';\n return label + asterisk;\n}\n","import { ref } from 'vue';\nimport { isEmpty } from '../utils';\n\n/**\n * Composable for common form validation logic\n */\nexport function useFormValidation() {\n const dynamicRefs = ref<Array<any>>([]);\n\n /**\n * Check if form is valid by validating all input refs\n */\n async function isFormValid(): Promise<boolean> {\n console.debug('Validating form inputs');\n const errors: Array<string> = [];\n for (const inputRef of dynamicRefs.value) {\n if (typeof inputRef?.onValueUpdate === 'function') {\n await inputRef.onValueUpdate();\n }\n if (typeof inputRef?.getErrors === 'function') {\n try {\n const componentErrors = inputRef.getErrors();\n if (Array.isArray(componentErrors)) {\n errors.push(...componentErrors);\n } else {\n console.warn('getErrors() returned non-array value:', componentErrors);\n }\n } catch (error) {\n console.error('Error calling getErrors on component:', error, inputRef);\n }\n } else {\n console.warn('Component does not have getErrors function:', inputRef);\n }\n }\n return errors.every(isEmpty);\n }\n\n /**\n * Reset all form inputs\n */\n function resetForm(): void {\n dynamicRefs.value.forEach((inputRef: any) => {\n if (typeof inputRef?.onReset === 'function') {\n inputRef.onReset();\n }\n });\n }\n\n /**\n * Get all validation errors from form inputs\n */\n function getFormErrors(): string[] {\n const errors: Array<string> = [];\n for (const inputRef of dynamicRefs.value) {\n if (typeof inputRef?.getErrors === 'function') {\n try {\n const componentErrors = inputRef.getErrors();\n if (Array.isArray(componentErrors)) {\n errors.push(...componentErrors);\n } else {\n errors.push(String(componentErrors));\n }\n } catch (error) {\n console.error('Error calling getErrors on component:', error, inputRef);\n }\n }\n }\n return errors;\n }\n\n /**\n * Update all form input values\n */\n async function updateFormValues(): Promise<void> {\n for (const inputRef of dynamicRefs.value) {\n if (typeof inputRef?.onValueUpdate === 'function') {\n await inputRef.onValueUpdate();\n }\n }\n }\n\n return {\n dynamicRefs,\n isFormValid,\n resetForm,\n getFormErrors,\n updateFormValues,\n };\n}\n","import { computed, Ref } from 'vue';\nimport { FormData, FormSchema, ComputedData, Option } from 'types';\n\n/**\n * Composable for data transformation logic\n * Reduces duplication in computed data processing\n */\nexport function useDataTransformation(activeSchema: Ref<FormSchema>) {\n /**\n * Transform form schema to form data\n */\n const formData = computed(() =>\n Object.entries(activeSchema.value).reduce((acc, [key, form]) => {\n if (form.value !== undefined) {\n if (typeof form.onChange === 'function') {\n acc[key] = form.onChange(form.value);\n } else {\n acc[key] = form.value;\n }\n }\n return acc;\n }, {} as FormData)\n );\n\n /**\n * Transform form data to computed data\n */\n const computedData = computed(() => {\n return Object.entries(formData.value).reduce((acc, [key, value]) => {\n if (value !== undefined) {\n // Handle children transformations\n if (activeSchema.value[key].children !== undefined) {\n acc[key] = (value as Array<Option>).map(({ other }) => {\n return Object.entries(other).reduce((results, [id, v]: [string, any]) => {\n if (typeof activeSchema.value[key].children![id].computedValue === 'function') {\n results[id] = activeSchema.value[key].children![id].computedValue(\n v,\n activeSchema.value\n );\n } else {\n results[id] = v;\n }\n return results;\n }, {} as ComputedData);\n });\n }\n\n // Handle computed values\n if (typeof activeSchema.value[key].computedValue === 'function' && value !== undefined) {\n acc[key] = activeSchema.value[key].computedValue(value, activeSchema.value);\n }\n }\n return acc;\n }, {} as ComputedData);\n });\n\n return {\n formData,\n computedData,\n };\n}\n","<template>\n <IonGrid>\n <IonRow>\n <template v-for=\"formId of Object.keys(activeSchema)\">\n <IonCol\n :key=\"formId\"\n :size=\"activeSchema[formId].grid?.xs ?? '12'\"\n :size-sm=\"activeSchema[formId].grid?.sm\"\n :size-md=\"activeSchema[formId].grid?.md\"\n :size-lg=\"activeSchema[formId].grid?.lg\"\n :size-xl=\"activeSchema[formId].grid?.xl\"\n class=\"ion-margin-vertical\"\n v-if=\"canRenderField(activeSchema[formId], data, computedData)\"\n >\n <component\n :is=\"activeSchema[formId].type\"\n v-model=\"activeSchema[formId]\"\n :schema=\"activeSchema\"\n ref=\"dynamicRefs\"\n :ref-key=\"formId\"\n />\n </IonCol>\n </template>\n </IonRow>\n <IonRow v-if=\"!hideButtons\">\n <IonCol size=\"12\" style=\"display: flex\" :style=\"{ justifyContent: buttonPlacement }\">\n <IonButton @click=\"handleCancelAction\" v-if=\"showCancelButton\">\n {{ cancelButtonText ?? 'Cancel' }}\n </IonButton>\n <IonButton @click=\"handleClearAction\" v-if=\"showClearButton\">\n {{ clearButtonText ?? 'Reset' }}\n </IonButton>\n <template v-for=\"button of customButtons\" :key=\"button.label\">\n <IonButton @click=\"button.action\" :color=\"button.color ?? 'primary'\">\n {{ button.label }}\n </IonButton>\n </template>\n <IonButton @click=\"submitForm\">\n {{ submitButtonText ?? 'Submit' }}\n </IonButton>\n </IonCol>\n </IonRow>\n </IonGrid>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from 'vue';\nimport { IonGrid, IonRow, IonCol, IonButton } from '@ionic/vue';\nimport type { FormData, ComputedData, FormSchema, CustomButton } from '../types';\nimport { canRenderField } from '../utils';\nimport { useFormValidation } from '../composables/useFormValidation';\nimport { useDataTransformation } from '../composables/useDataTransformation';\n\ninterface FormProps {\n schema: FormSchema;\n showLabels?: boolean;\n showClearButton?: boolean;\n showCancelButton?: boolean;\n buttonPlacement?: 'start' | 'middle' | 'end';\n submitButtonText?: string;\n clearButtonText?: string;\n cancelButtonText?: string;\n hideButtons?: boolean;\n customButtons?: Array<CustomButton>;\n}\n\ninterface FormEmits {\n (e: 'submit', formData: FormData, computedFormData: ComputedData): void;\n (e: 'clear'): void;\n (e: 'cancel'): void;\n}\n\nconst props = withDefaults(defineProps<FormProps>(), {\n showLabels: true,\n showClearButton: true,\n showCancelButton: true,\n hideButtons: false,\n buttonPlacement: 'start',\n submitButtonText: 'Submit',\n clearButtonText: 'Reset',\n cancelButtonText: 'Cancel',\n});\n\nconst emit = defineEmits<FormEmits>();\nconst activeSchema = ref(props.schema);\n\n// Use form validation composable\nconst { dynamicRefs, isFormValid, resetForm } = useFormValidation();\n\n// Use data transformation composable\nconst { formData: data, computedData } = useDataTransformation(activeSchema);\n\nasync function submitForm() {\n if (!(await isFormValid())) return;\n emit('submit', data.value, computedData.value);\n}\n\nfunction handleClearAction() {\n resetForm();\n emit('clear');\n}\n\nfunction handleCancelAction() {\n resetForm();\n emit('cancel');\n}\n\nwatch(\n data,\n async () => {\n for (const [k, f] of Object.entries(activeSchema.value)) {\n if (!canRenderField(f, data.value, computedData.value)) {\n // Reset the value of the field if it's not rendered\n f.value = props.schema[k].value;\n }\n }\n },\n {\n deep: true,\n immediate: true,\n }\n);\n\nwatch(\n () => props.schema,\n newSchema => {\n for (const [key, field] of Object.entries(newSchema)) {\n if (field.value !== undefined) {\n activeSchema.value[key].value = field.value;\n }\n }\n },\n {\n deep: true,\n immediate: true,\n }\n);\n\ndefineExpose({\n resetForm,\n isFormValid,\n resolveData: () => ({\n formData: data.value,\n computedData: computedData.value,\n }),\n});\n</script>\n\n<style>\n.input-label {\n font-size: large;\n font-weight: bold;\n}\n</style>\n","import { ComponentPublicInstance, Ref } from 'vue';\n\n/**\n * Composable for managing Ionic validation CSS classes\n * Reduces duplication in input validation state management\n */\nexport function useValidationStyles(inputRef: Ref<ComponentPublicInstance | null>) {\n /**\n * Apply validation state CSS classes to input element\n */\n const applyValidationState = async (isValid: boolean) => {\n // Remove existing validation classes\n inputRef.value?.$el.classList.remove('ion-invalid');\n inputRef.value?.$el.classList.remove('ion-valid');\n\n // Apply appropriate validation class\n if (isValid) {\n inputRef.value?.$el.classList.add('ion-valid');\n } else {\n inputRef.value?.$el.classList.add('ion-invalid');\n }\n\n // Mark as touched\n inputRef.value?.$el.classList.add('ion-touched');\n };\n\n /**\n * Reset validation classes when focusing\n */\n const resetValidationState = () => {\n inputRef.value?.$el.classList.remove('ion-touched');\n inputRef.value?.$el.classList.remove('ion-invalid');\n };\n\n return {\n applyValidationState,\n resetValidationState,\n };\n}\n","import { Ref } from 'vue';\nimport { FormField, FormSchema } from '../types';\nimport { useValidationStyles } from './useValidationStyles';\nimport { ComponentPublicInstance } from 'vue';\n\n/**\n * Composable for common input validation logic\n * Reduces duplication across input components with standard validation patterns\n */\nexport function useInputValidation(\n inputRef: Ref<ComponentPublicInstance | null>,\n model: Ref<FormField>,\n inputValue: Ref<any>,\n schema?: Ref<FormSchema | undefined>,\n customValidation?: (value: any) => Promise<boolean | string>\n) {\n const { applyValidationState, resetValidationState } = useValidationStyles(inputRef);\n\n /**\n * Standard validation logic for form inputs\n */\n async function isValid(): Promise<boolean> {\n // Check required field validation\n if (model.value.required && !inputValue.value) {\n model.value.error = 'This field is required';\n return false;\n }\n\n // Run custom validation if provided\n if (customValidation) {\n const customResult = await customValidation(inputValue.value);\n if (typeof customResult === 'string') {\n model.value.error = customResult;\n return false;\n }\n if (customResult === false) {\n return false;\n }\n }\n\n // Run field-specific validation function\n if (model.value.validation) {\n const errors = await model.value.validation(inputValue.value, schema?.value);\n if (errors && errors.length) {\n model.value.error = errors.join();\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Standard onValueUpdate handler\n */\n async function onValueUpdate(): Promise<void> {\n const validationResult = await isValid();\n\n if (validationResult) {\n model.value.error = '';\n model.value.value = inputValue.value;\n }\n\n await applyValidationState(validationResult);\n }\n\n /**\n * Standard onFocus handler\n */\n function onFocus(): void {\n resetValidationState();\n model.value.error = '';\n }\n\n /**\n * Standard onReset handler\n */\n function onReset(defaultValue: any = ''): void {\n inputValue.value = defaultValue;\n model.value.error = '';\n model.value.value = defaultValue;\n }\n\n /**\n * Standard getErrors handler\n */\n function getErrors(): string[] {\n return model.value.error ? [model.value.error] : [];\n }\n\n return {\n isValid,\n onValueUpdate,\n onFocus,\n onReset,\n getErrors,\n applyValidationState,\n resetValidationState,\n };\n}\n","import { computed, type Ref } from 'vue';\nimport type { FormField } from '../types';\n\n/**\n * Composable for common label template logic\n * Reduces duplication across input components that render labels with required asterisks\n */\nexport function useLabelTemplate(model: Ref<FormField>) {\n /**\n * Computed property to determine if the label should be shown\n */\n const showLabel = computed(() => !!model.value.label);\n\n /**\n * Computed property to determine if the required asterisk should be shown\n */\n const showRequired = computed(() => !!model.value.required);\n\n /**\n * Computed property for the label text\n */\n const labelText = computed(() => model.value.label || '');\n\n return {\n showLabel,\n showRequired,\n labelText,\n };\n}\n","<template>\n <ion-label slot=\"label\" v-if=\"showLabel\" class=\"input-label\">\n {{ labelText }}\n <ion-text color=\"danger\" v-if=\"showRequired\">*</ion-text>\n </ion-label>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonLabel, IonText } from '@ionic/vue';\nimport type { FormField } from '../../types';\nimport { useLabelTemplate } from '../../composables/useLabelTemplate';\nimport { toRef } from 'vue';\n\nconst props = defineProps<{\n model: FormField;\n}>();\n\nconst { showLabel, showRequired, labelText } = useLabelTemplate(toRef(props, 'model'));\n</script>\n","<template>\n <ion-input\n ref=\"inputRef\"\n v-model=\"input\"\n v-maskito=\"maskitoOptions\"\n :clear-input=\"true\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :type=\"type ?? 'text'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :placeholder=\"maskitoOptions?.placeholder ?? model.placeholder\"\n :disabled=\"model.disabled\"\n :counter=\"model.counter\"\n :min=\"model.min\"\n :max=\"model.max\"\n :max-length=\"model.maxLength\"\n :min-length=\"model.minLength\"\n :pattern=\"model.pattern\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ion-blur=\"onValueUpdate\"\n >\n <InputLabel :model=\"model\" />\n <ion-label v-if=\"model.prefix\" slot=\"start\">{{ model.prefix }}</ion-label>\n <ion-label v-if=\"model.suffix\" slot=\"end\">{{ model.suffix }} </ion-label>\n <ion-input-password-toggle slot=\"end\" v-if=\"type === 'password'\" />\n </ion-input>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonInput, IonLabel, IonInputPasswordToggle } from '@ionic/vue';\nimport { FormField, FormSchema, BaseFieldTypes } from '../../types';\nimport { generateMaskitoOptions } from '../../utils';\nimport { ComponentPublicInstance, computed, PropType, ref, watch } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema; type?: BaseFieldTypes }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as string);\nconst schema = computed(() => props.schema);\n\n// Use input validation composable\nconst { isValid, onValueUpdate, onFocus, onReset, getErrors } = useInputValidation(\n inputRef,\n model,\n input,\n schema\n);\n\nconst maskitoOptions = computed(() => {\n if (model.value.pattern) return generateMaskitoOptions(model.value.pattern);\n return undefined;\n});\n\nwatch(\n () => model.value.value,\n v => (input.value = v as string)\n);\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n isValid,\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"text\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <ion-input\n type=\"text\"\n ref=\"inputRef\"\n :clear-input=\"true\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :disabled=\"model.disabled\"\n @ion-focus=\"onFocus\"\n @ion-blur=\"onValueUpdate\"\n >\n <InputLabel :model=\"model\" />\n <template v-for=\"(part, index) in patternParts\">\n <ion-select\n slot=\"start\"\n :key=\"`select-${part}`\"\n interface=\"popover\"\n :style=\"{ minWidth: model.enableTime ? '10%' : '30%' }\"\n :placeholder=\"part\"\n :value=\"partValues[part]\"\n @ion-focus=\"onFocus\"\n @ion-input=\"buildInputDate(part, undefined, $event)\"\n @ion-blur=\"buildInputDate(part, undefined, $event)\"\n v-if=\"/MM|MMM|MMMM/.test(part)\"\n >\n <ion-select-option\n v-for=\"(month, i) in monthNames\"\n :key=\"month\"\n :value=\"getMonth(i + 1, part)\"\n >\n {{ getMonth(i + 1, part) }}\n </ion-select-option>\n </ion-select>\n <ion-input\n v-else\n slot=\"start\"\n :key=\"`input-${part}`\"\n :placeholder=\"part\"\n :autofocus=\"model.autoFocus\"\n :value=\"partValues[part]\"\n @ion-focus=\"onFocus\"\n @ion-input=\"buildInputDate(part, undefined, $event)\"\n @ion-blur=\"buildInputDate(part, undefined, $event)\"\n />\n <ion-label slot=\"start\" :key=\"`separator-${index}`\" v-if=\"index < patternParts.length - 1\">\n &nbsp;{{ separators[index] }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n </ion-label>\n </template>\n <ion-label slot=\"end\">\n <vue-date-picker\n enable-seconds\n time-picker-inline\n teleport\n :model-value=\"pickerDate\"\n :auto-apply=\"!model.enableTime\"\n :enable-time-picker=\"model.enableTime ?? false\"\n :maxDate=\"maxDate\"\n :minDate=\"minDate\"\n @date-update=\"buildPickerDate\"\n >\n <template #trigger>\n <ion-button fill=\"clear\">\n <ion-icon\n slot=\"icon-only\"\n :icon=\"calendar\"\n aria-hidden=\"true\"\n @click=\"onFocus\"\n ></ion-icon>\n </ion-button>\n </template>\n </vue-date-picker>\n </ion-label>\n </ion-input>\n</template>\n\n<script lang=\"ts\" setup>\nimport VueDatePicker from '@vuepic/vue-datepicker';\nimport '@vuepic/vue-datepicker/dist/main.css';\nimport { IonInput, IonLabel, IonIcon, IonSelect, IonSelectOption, IonButton } from '@ionic/vue';\nimport { calendar } from 'ionicons/icons';\nimport type { FormField, FormSchema } from '../../types';\nimport { ComponentPublicInstance, computed, onMounted, PropType, ref, watch } from 'vue';\nimport { formatDate, getMonth, zeroPad, monthNames } from '../../utils';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst maxDate = ref(model.value.max as string | undefined);\nconst minDate = ref(model.value.max as string | undefined);\nconst pickerDate = ref<string>(model.value.value as string);\nconst schema = computed(() => props.schema);\n\n// Custom validation for DateInput\nasync function customDateValidation(value: string): Promise<boolean | string> {\n if (value === undefined) {\n if (model.value.required) {\n return 'This field is required';\n }\n return true;\n }\n\n const _date = new Date(value);\n if (isNaN(_date.getTime())) {\n return 'Invalid date string';\n }\n\n if (minDate.value && _date < new Date(minDate.value)) {\n return `Date must be greater than ${minDate.value}`;\n }\n\n if (maxDate.value && _date > new Date(maxDate.value)) {\n return `Date must be less than ${maxDate.value}`;\n }\n\n return true;\n}\n\n// Use input validation composable with custom date validation\nconst { onValueUpdate, onFocus, getErrors } = useInputValidation(\n inputRef,\n model,\n pickerDate,\n schema,\n customDateValidation\n);\n\n// Custom onReset for DateInput\nfunction onReset() {\n pickerDate.value = '';\n model.value.error = '';\n model.value.value = '';\n}\nconst pattern = computed(() => {\n if (model.value.pattern) return model.value.pattern;\n let datePattern = model.value.pattern ?? 'DD/MMM/YYYY';\n if (model.value.enableTime) {\n datePattern += ' HH:mm:ss';\n }\n return datePattern;\n});\nconst separatorRegex = /[-/.,:\\s]+/;\nconst patternParts = computed(() => pattern.value.split(separatorRegex));\nconst separators = computed(() => pattern.value.match(/[-/.,:\\s]+/g) || []);\nconst partValues = ref({} as Record<string, any>);\n\nwatch(\n () => model.value.value,\n v => {\n pickerDate.value = v as string;\n buildPickerDate(v as string);\n }\n);\n\nasync function buildInputDate(part: string, defaultValue?: string, e?: Event) {\n let value = defaultValue ?? (e?.target as HTMLInputElement).value;\n if (/MM|MMM|MMMM/.test(part)) value = getMonth(value, part);\n if (Number.isInteger(parseInt(value))) value = zeroPad(parseInt(value));\n partValues.value[part] = value;\n const formattedDate = patternParts.value.reduce((date, part, index) => {\n date +=\n partValues.value[part] +\n (index < patternParts.value.length - 1 ? separators.value[index] : '');\n return date;\n }, '');\n pickerDate.value = formattedDate;\n await onValueUpdate();\n}\n\nasync function buildPickerDate(date: string) {\n const parts = formatDate(date, pattern.value).split(separatorRegex);\n patternParts.value.forEach((part, index) => buildInputDate(part, parts[index]));\n await onValueUpdate();\n}\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n\nonMounted(() => {\n patternParts.value.forEach((part, index) => {\n partValues.value[part] = pickerDate.value?.split(separatorRegex)[index] ?? '';\n });\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"number\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"email\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <base-input v-model=\"model\" type=\"password\" :schema=\"schema\" ref=\"inputRef\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, type PropType } from 'vue';\nimport { FormField, FormSchema } from 'types';\nimport BaseInput from './BaseInput.vue';\n\ndefineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<typeof BaseInput | null>(null);\n\ndefineExpose({\n onReset: () => inputRef.value?.onReset(),\n onValueUpdate: () => inputRef.value?.onValueUpdate(),\n getErrors: () => inputRef.value?.getErrors?.() ?? [],\n});\n</script>\n","<template>\n <div class=\"autocomplete-container\" @focusout=\"onValueUpdate\" ref=\"containerRef\">\n <ion-input\n ref=\"inputRef\"\n v-model=\"filter\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :type=\"type ?? 'text'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :placeholder=\"placeholder\"\n :disabled=\"model.disabled\"\n :counter=\"model.counter\"\n @ion-focus=\"onFocus\"\n :debounce=\"300\"\n @click=\"openInterface\"\n >\n <InputLabel :model=\"model\" />\n <ion-label v-if=\"model.multiple\" style=\"width: fit-content\" slot=\"start\">\n <ion-chip v-for=\"(tag, index) of tags\" :key=\"index\">\n <ion-label>{{ tag.label }}</ion-label>\n </ion-chip>\n </ion-label>\n <ion-label slot=\"start\" v-else class=\"ion-no-wrap\">\n {{ tags[0]?.label ?? '' }}\n </ion-label>\n <ion-icon slot=\"end\" :icon=\"chevronDown\" />\n <ion-icon\n slot=\"end\"\n :icon=\"close\"\n v-if=\"tags.length > 0 || filter\"\n @click=\"onReset\"\n style=\"z-index: 999999\"\n />\n </ion-input>\n\n <ion-list\n v-if=\"showOptions && options.length > 0 && interfaceType === 'popover'\"\n class=\"suggestions-list\"\n :class=\"popoverPosition\"\n >\n <ion-item button v-for=\"option in options\" :key=\"option.label\" @click=\"onSelect(option)\">\n <ion-checkbox slot=\"start\" :checked=\"option.isChecked\" v-if=\"model.multiple\" />\n <ion-label>{{ option.label }}</ion-label>\n </ion-item>\n </ion-list>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, PropType, watch, ComponentPublicInstance } from 'vue';\nimport { chevronDown, close } from 'ionicons/icons';\nimport { FormSchema, BaseFieldTypes, FormField, Option } from 'types';\nimport { isEmpty, checkOption, getFilteredOptions, uncheckOption } from '../../utils';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport {\n IonInput,\n IonList,\n IonItem,\n IonLabel,\n IonChip,\n IonIcon,\n IonCheckbox,\n actionSheetController,\n alertController,\n AlertInput,\n} from '@ionic/vue';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema; type?: BaseFieldTypes }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst containerRef = ref<HTMLElement | null>(null);\nconst showOptions = ref(false);\nconst options = ref<Option[]>([]);\nconst filter = ref('');\nconst page = ref(1);\n\nconst interfaceType = computed(() => {\n return model.value.interface ?? 'popover';\n});\n\nconst popoverPosition = computed(() => {\n return model.value.optionsPlacement === 'top' ? 'top' : 'bottom';\n});\n\nconst tags = computed<Option[]>(() => options.value.filter(o => !!o.isChecked));\n\nconst placeholder = computed(() => {\n return !filter.value && isEmpty(tags.value) && !showOptions.value\n ? (model.value.placeholder ?? 'Select an option')\n : '';\n});\n\nwatch([filter, () => model.value.options], filterOptions, {\n immediate: true,\n deep: true,\n});\nwatch(() => model.value.value, initialize, { immediate: true, deep: true });\n\nfunction onReset() {\n options.value.forEach(o => uncheckOption(o, options.value));\n model.value.error = '';\n filter.value = '';\n page.value = 1;\n model.value.value = model.value.multiple ? [] : '';\n}\n\nfunction onSelect(item: Option) {\n if (item.isChecked) return uncheckOption(item, options.value);\n if (model.value.multiple) {\n checkOption(item, options.value);\n } else {\n onReset();\n checkOption(item, options.value);\n onValueUpdate();\n }\n filter.value = '';\n}\n\nfunction openInterface() {\n switch (interfaceType.value) {\n case 'action-sheet':\n openActionSheet();\n break;\n case 'alert':\n openAlert();\n break;\n case 'popover':\n default:\n showOptions.value = true;\n break;\n }\n}\n\nasync function openActionSheet() {\n await filterOptions();\n\n if (model.value.multiple) {\n // For multiple selection, open an a popover instead of action sheet\n showOptions.value = true;\n return;\n }\n\n // Standard action sheet for single selection\n const actionSheet = await actionSheetController.create({\n header: model.value.label || 'Select an option',\n buttons: [\n ...options.value.map(option => ({\n text: option.label,\n cssClass: option.isChecked ? 'selected-option' : '',\n handler: () => {\n onSelect(option);\n return false;\n },\n })),\n {\n text: 'Cancel',\n role: 'cancel',\n },\n ],\n });\n\n await actionSheet.present();\n}\n\nasync function openAlert() {\n await filterOptions();\n\n const inputs: AlertInput[] = options.value.map(option => ({\n label: option.label,\n type: model.value.multiple ? 'checkbox' : 'radio',\n value: option,\n checked: option.isChecked,\n }));\n\n const alert = await alertController.create({\n header: model.value.label || 'Select an option',\n inputs,\n buttons: [\n {\n text: 'Cancel',\n role: 'cancel',\n },\n {\n text: 'OK',\n handler: selectedOptions => {\n if (model.value.multiple) {\n // Reset all options first\n options.value.forEach(o => uncheckOption(o, options.value));\n\n // Then check selected options\n selectedOptions.forEach((selected: Option) => {\n const option = options.value.find(o => o.value === selected.value);\n if (option) checkOption(option, options.value);\n });\n } else {\n onReset();\n const option = options.value.find(o => o.value === selectedOptions.value);\n if (option) checkOption(option, options.value);\n }\n onValueUpdate();\n },\n },\n ],\n });\n\n await alert.present();\n}\n\n// Custom validation for SelectInput - handles both required and custom validation\nasync function customSelectValidation(): Promise<boolean | string> {\n // Check required validation\n if (model.value.required && isEmpty(tags.value)) {\n return 'This field is required';\n }\n\n // Run field-specific validation function if it exists\n if (model.value.validation) {\n const errors = await model.value.validation(tags.value, props?.schema);\n if (errors && errors.length) {\n return errors.join();\n }\n }\n\n return true;\n}\n\n// Use input validation composable with custom validation\nconst { onFocus: baseOnFocus, applyValidationState } = useInputValidation(\n inputRef,\n model,\n computed(() => (model.value.multiple ? tags.value : tags.value[0])),\n computed(() => props?.schema),\n customSelectValidation\n);\n\nfunction onFocus(evt: any) {\n if (evt.target !== inputRef.value?.$el) return;\n baseOnFocus();\n\n // Only show options immediately for popover interface\n if (interfaceType.value === 'popover') {\n showOptions.value = true;\n }\n}\n\nasync function onValueUpdate(evt?: any) {\n if ((evt?.relatedTarget as HTMLElement)?.closest('.suggestions-list')) return;\n showOptions.value = false;\n\n // Validate using custom validation logic\n const validationResult = await customSelectValidation();\n\n if (validationResult === true) {\n model.value.error = '';\n model.value.value = model.value.multiple ? tags.value : tags.value[0];\n } else {\n model.value.error =\n typeof validationResult === 'string' ? validationResult : 'Validation failed';\n }\n\n await applyValidationState(validationResult === true);\n}\n\nasync function filterOptions() {\n const filtered: Array<Option> = [];\n\n if (typeof model.value.options === 'function') {\n const res = await model.value.options(filter.value);\n filtered.push(...res.filter(o => !!o.label));\n } else {\n filtered.push(...getFilteredOptions(model.value.options ?? [], filter.value));\n }\n\n tags.value.forEach(tag => checkOption(tag, filtered));\n options.value = filtered;\n}\n\nfunction initialize() {\n const defaultValue = model.value.value;\n if (defaultValue) {\n if (Array.isArray(defaultValue)) {\n defaultValue.forEach(opt => checkOption(opt, options.value));\n } else if (typeof defaultValue === 'object') {\n checkOption(defaultValue, options.value);\n } else {\n checkOption(\n {\n value: defaultValue as any,\n label: defaultValue as string,\n },\n options.value\n );\n }\n }\n}\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors: () => (model.value.error ? [model.value.error] : []),\n});\n</script>\n\n<style scoped>\n.autocomplete-container {\n position: relative;\n}\n\n.suggestions-list {\n position: absolute;\n left: 0;\n right: 0;\n background-color: white;\n border: none;\n z-index: 99000;\n max-height: 65vh;\n overflow-y: auto;\n transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.suggestions-list.bottom {\n top: 100%;\n margin-top: 4px;\n border-radius: 4px;\n box-shadow:\n 0 2px 4px -1px rgba(0, 0, 0, 0.2),\n 0 4px 5px 0 rgba(0, 0, 0, 0.14),\n 0 1px 10px 0 rgba(0, 0, 0, 0.12);\n}\n\n.suggestions-list.top {\n bottom: 100%;\n margin-bottom: 4px;\n border-radius: 4px;\n box-shadow:\n 0 -2px 4px -1px rgba(0, 0, 0, 0.2),\n 0 -4px 5px 0 rgba(0, 0, 0, 0.14),\n 0 -1px 10px 0 rgba(0, 0, 0, 0.12);\n}\n\nion-list {\n margin: 0;\n padding: 0;\n}\n\n/* Add hover effect for items */\nion-item {\n --ripple-color: var(--ion-color-primary-tint, #4c8dff);\n transition: background-color 0.2s ease;\n}\n\nion-item:hover {\n --background: rgba(var(--ion-color-primary-rgb, 56, 128, 255), 0.08);\n}\n\n:deep(.selected-option) {\n font-weight: bold;\n color: var(--ion-color-primary);\n}\n</style>\n","<template>\n <ion-textarea\n ref=\"inputRef\"\n v-model=\"input\"\n :clear-input=\"true\"\n :fill=\"model.fill ?? 'outline'\"\n :label-placement=\"model.labelPlacement ?? 'stacked'\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :autofocus=\"model.autoFocus\"\n :placeholder=\"model.placeholder\"\n :disabled=\"model.disabled\"\n :counter=\"model.counter\"\n :min=\"model.min\"\n :max=\"model.max\"\n :rows=\"model.rows\"\n :cols=\"model.cols\"\n :auto-grow=\"model.autoGrow\"\n :max-length=\"model.maxLength\"\n :min-length=\"model.minLength\"\n :pattern=\"model.pattern\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ion-blur=\"onValueUpdate\"\n >\n <InputLabel :model=\"model\" />\n </ion-textarea>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonTextarea } from '@ionic/vue';\nimport { FormField, FormSchema } from 'types';\nimport { ComponentPublicInstance, PropType, ref, watch, computed } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport InputLabel from '../shared/InputLabel.vue';\n\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as string);\nconst schema = computed(() => props.schema);\n\n// Use input validation composable\nconst { onValueUpdate, onFocus, onReset, getErrors } = useInputValidation(\n inputRef,\n model,\n input,\n schema\n);\n\nwatch(\n () => model.value.value,\n v => (input.value = v as string)\n);\n\ndefineExpose({\n onReset,\n onValueUpdate,\n getErrors,\n});\n</script>\n","<template>\n <div v-for=\"(child, index) of childrens\" class=\"repeat-input-wrapper\" :key=\"index\">\n <div class=\"ion-margin-end\" style=\"flex-grow: 1\">\n <ion-row>\n <template v-for=\"formId of Object.keys(child)\">\n <IonCol\n :key=\"`${index}-${formId}`\"\n :size=\"child[formId].grid?.xs ?? '12'\"\n :size-sm=\"child[formId].grid?.sm\"\n :size-md=\"child[formId].grid?.md\"\n :size-lg=\"child[formId].grid?.lg\"\n :size-xl=\"child[formId].grid?.xl\"\n class=\"ion-margin-bottom\"\n v-if=\"canRenderField(child[formId], data, computedData)\"\n >\n <component\n :is=\"child[formId].type\"\n v-model=\"child[formId]\"\n :schema=\"child\"\n :ref-key=\"`${index}-${formId}`\"\n ref=\"dynamicRefs\"\n />\n </IonCol>\n </template>\n </ion-row>\n </div>\n <div style=\"display: flex; justify-content: flex-end\">\n <ion-button @click=\"addSet\" color=\"primary\" v-if=\"index === childrens.length - 1\">\n <ion-icon slot=\"icon-only\" :icon=\"add\"></ion-icon>\n </ion-button>\n <ion-button @click=\"removeSet(index)\" color=\"warning\" v-if=\"childrens.length > 1\">\n <ion-icon slot=\"icon-only\" :icon=\"remove\"></ion-icon>\n </ion-button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComputedData, FormData, FormField, FormSchema, Option } from 'types';\nimport { IonRow, IonCol, IonButton, IonIcon } from '@ionic/vue';\nimport { canRenderField, deepClone } from '../../utils';\nimport { useFormValidation } from '../../composables/useFormValidation';\nimport { computed, onMounted, PropType, ref, watch } from 'vue';\nimport { add, remove } from 'ionicons/icons';\n\ninterface PropsI {\n schema?: FormSchema;\n data: FormData;\n computedData: ComputedData;\n}\n\ndefineProps<PropsI>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst childrens = ref<FormSchema[]>([]);\n\n// Use form validation composable\nconst { dynamicRefs, resetForm, getFormErrors, updateFormValues } = useFormValidation();\n\nconst inputValue = computed<Array<Option>>(() => {\n return childrens.value.map((child, index) => ({\n label: `Set ${index + 1}`,\n value: index,\n other: Object.entries(child).reduce(\n (acc, [id, field]) => {\n acc[id] = field.value;\n return acc;\n },\n {} as Record<string, any>\n ),\n }));\n});\n\nwatch(\n inputValue,\n value => {\n model.value.value = value;\n },\n { deep: true, immediate: true }\n);\n\nonMounted(addSet);\n\nfunction addSet() {\n if (model.value.children) {\n childrens.value.push(deepClone<FormSchema>(model.value.children));\n }\n}\n\nfunction removeSet(index: number) {\n childrens.value.splice(index, 1);\n}\n\nfunction onReset() {\n resetForm();\n}\n\nfunction getErrors() {\n return getFormErrors();\n}\n\nasync function onValueUpdate() {\n await updateFormValues();\n}\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n</script>\n\n<style scoped>\n.repeat-input-wrapper {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n}\n</style>\n","<template>\n <ion-checkbox\n v-model=\"input\"\n ref=\"inputRef\"\n :required=\"model.required\"\n :error-text=\"model.error\"\n :disabled=\"model.disabled\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ion-blur=\"onValueUpdate\"\n >\n {{ labelTextWithAsterisk }}\n </ion-checkbox>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonCheckbox } from '@ionic/vue';\nimport { FormField, FormSchema } from 'types';\nimport { ComponentPublicInstance, PropType, ref, watch, computed } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport { getLabelText } from '../../utils';\n\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as boolean);\nconst schema = computed(() => props.schema);\n\n// Use checkbox label text composable\nconst labelTextWithAsterisk = computed(() => getLabelText(model.value));\n\n// Use input validation composable with custom default value for checkbox\nconst { onValueUpdate, onFocus, getErrors } = useInputValidation(inputRef, model, input, schema);\n\n// Custom onReset for checkbox (default to false)\nfunction onReset() {\n input.value = false;\n model.value.error = '';\n model.value.value = false;\n}\n\nwatch(\n () => model.value.value,\n v => (input.value = v as boolean)\n);\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n</script>\n","<template>\n <ion-radio-group\n v-model=\"input\"\n ref=\"inputRef\"\n :required=\"model.required\"\n :help-text=\"helpText\"\n :error-text=\"model.error\"\n :disabled=\"model.disabled\"\n :compareWith=\"compareWith\"\n @ionFocus=\"onFocus\"\n @ionChange=\"onValueUpdate\"\n @ionBlur=\"onValueUpdate\"\n >\n <ion-radio\n v-for=\"option of options\"\n :key=\"option.value\"\n :value=\"option\"\n :disabled=\"model.disabled\"\n :label-placement=\"labelPlacement\"\n >\n {{ option.label }}\n </ion-radio>\n </ion-radio-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport { IonRadioGroup, IonRadio } from '@ionic/vue';\nimport { FormField, FormSchema, Option } from '../../types';\nimport { ComponentPublicInstance, PropType, ref, watch, computed, onMounted } from 'vue';\nimport { useInputValidation } from '../../composables/useInputValidation';\nimport { getLabelText } from '../../utils';\nconst props = defineProps<{ schema?: FormSchema }>();\nconst model = defineModel({ type: Object as PropType<FormField>, default: {} });\nconst inputRef = ref<ComponentPublicInstance | null>(null);\nconst input = ref(model.value.value as Option | undefined);\nconst schema = computed(() => props.schema);\nconst options = ref<Option[]>([]);\n\nconst helpText = computed(() => getLabelText(model.value));\n\nconst labelPlacement = computed<'start' | 'end'>(() => {\n return model.value.labelPlacement ? (model.value.labelPlacement as 'start' | 'end') : 'end';\n});\n\n// Use the input validation helpers\nconst { onValueUpdate, onFocus, getErrors } = useInputValidation(inputRef, model, input, schema);\n\n// Custom onReset for radio group (default to null)\nfunction onReset() {\n model.value.error = '';\n input.value = undefined;\n model.value.value = undefined;\n}\n\n// Custom compare function for radio group\nfunction compareWith(a: Option, b: Option): boolean {\n return a.value === b.value;\n}\n\nasync function initializeOptions() {\n if (typeof model.value.options === 'function') {\n options.value = await model.value.options();\n } else {\n options.value = model.value.options as Option[];\n }\n}\n\nwatch(\n () => model.value.value,\n v => (input.value = v as Option | undefined)\n);\n\ndefineExpose({\n onValueUpdate,\n onReset,\n getErrors,\n});\n\nonMounted(initializeOptions);\n</script>\n","import { App, Plugin } from 'vue';\nimport Form from './components/vForm.vue';\nimport TextInput from './components/inputs/TextInput.vue';\nimport DateInput from './components/inputs/DateInput.vue';\nimport NumberInput from './components/inputs/NumberInput.vue';\nimport EmailInput from './components/inputs/EmailInput.vue';\nimport PasswordInput from './components/inputs/PasswordInput.vue';\nimport SelectInput from './components/inputs/SelectInput.vue';\nimport TextAreaInput from './components/inputs/TextAreaInput.vue';\nimport RepeatInput from './components/inputs/RepeatInput.vue';\nimport CheckboxInput from './components/inputs/CheckboxInput.vue';\nimport RadioInput from './components/inputs/RadioInput.vue';\nimport { maskito } from '@maskito/vue';\n\nexport const VForm: Plugin = {\n install(app: App) {\n app.component('VForm', Form);\n app.component('TextInput', TextInput);\n app.component('DateInput', DateInput);\n app.component('NumberInput', NumberInput);\n app.component('EmailInput', EmailInput);\n app.component('PasswordInput', PasswordInput);\n app.component('SelectInput', SelectInput);\n app.component('TextAreaInput', TextAreaInput);\n app.component('RepeatInput', RepeatInput);\n app.component('CheckboxInput', CheckboxInput);\n app.component('RadioInput', RadioInput);\n app.directive('maskito', maskito);\n },\n};\n\nexport * from './types';\n\nexport type VFormRef = typeof Form;\n\nexport default VForm;\n"],"names":["getElementPredicate","el","resolve","input","MASK_CHAR_REGEX","DEMO_STRINGS","nextDemoChar","type","idx","arr","generateMaskitoOptions","pattern","mask","placeholder","i","demoIdx","char","maxQuant","quantEnd","quantString","max","s","j","q","monthNames","isEmpty","value","formatDate","date","_date","day","zeroPad","month","year","hour","minute","second","milliseconds","replacements","match","num","getMonth","part","canRenderField","field","data","computedData","deepClone","obj","item","cloned","key","findOption","option","options","opt","checkOption","index","uncheckOption","getFilteredOptions","filter","getLabelText","model","label","asterisk","useFormValidation","dynamicRefs","ref","isFormValid","errors","inputRef","componentErrors","error","resetForm","getFormErrors","updateFormValues","useDataTransformation","activeSchema","formData","computed","acc","form","other","results","id","v","props","__props","emit","__emit","submitForm","handleClearAction","handleCancelAction","watch","k","f","newSchema","__expose","_createBlock","_unref","IonGrid","_createVNode","IonRow","_openBlock","_createElementBlock","_Fragment","formId","IonCol","_a","_b","_c","_d","_e","_resolveDynamicComponent","$event","hideButtons","_normalizeStyle","buttonPlacement","showCancelButton","IonButton","cancelButtonText","showClearButton","clearButtonText","_renderList","customButtons","button","_createTextVNode","_toDisplayString","submitButtonText","useValidationStyles","isValid","useInputValidation","inputValue","schema","customValidation","applyValidationState","resetValidationState","customResult","onValueUpdate","validationResult","onFocus","onReset","defaultValue","getErrors","useLabelTemplate","showLabel","showRequired","labelText","toRef","IonLabel","IonText","_cache","_useModel","maskitoOptions","IonInput","InputLabel","IonInputPasswordToggle","BaseInput","maxDate","minDate","pickerDate","customDateValidation","datePattern","separatorRegex","patternParts","separators","partValues","buildPickerDate","buildInputDate","e","formattedDate","parts","onMounted","IonSelect","IonSelectOption","VueDatePicker","IonIcon","calendar","containerRef","showOptions","page","interfaceType","popoverPosition","tags","o","filterOptions","initialize","onSelect","openInterface","openActionSheet","openAlert","actionSheetController","inputs","alertController","selectedOptions","selected","customSelectValidation","baseOnFocus","evt","filtered","res","tag","IonChip","chevronDown","close","IonList","_normalizeClass","IonItem","IonCheckbox","IonTextarea","childrens","child","addSet","removeSet","_createElementVNode","_hoisted_1","_hoisted_2","add","remove","labelTextWithAsterisk","helpText","labelPlacement","compareWith","a","b","initializeOptions","IonRadioGroup","IonRadio","VForm","app","Form","TextInput","DateInput","NumberInput","EmailInput","PasswordInput","SelectInput","TextAreaInput","RepeatInput","CheckboxInput","RadioInput","maskito"],"mappings":";;;;;AAEO,SAASA,GAAoBC,GAAyB;AACpD,SAAA,IAAI,QAAQ,CAAWC,MAAA;AAC5B,0BAAsB,YAAY;AAC1B,YAAAC,IAAQ,MAAMF,EAAG,gBAAgB;AACvC,MAAAC,EAAQC,CAAK;AAAA,IAAA,CACd;AAAA,EAAA,CACF;AACH;AAIA,MAAMC,KAAwD;AAAA,EAC5D,GAAG;AAAA,EACH,GAAG;AAAA,EACH,KAAK;AAAA;AACP,GAGMC,KAAe;AAAA,EACnB,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EACpD,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,EAC1C,KAAK,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC9C;AAEA,SAASC,GAAaC,GAA4BC,GAAa;AACvD,QAAAC,IAAMJ,GAAaE,CAAI;AACtB,SAAAE,EAAID,IAAMC,EAAI,MAAM;AAC7B;AAEO,SAASC,GAAuBC,GAAiB;AACtD,QAAMC,IAA4B,CAAC;AACnC,MAAIC,IAAc,IACdC,IAAI,GACNC,IAAU;AAEL,SAAAD,IAAIH,EAAQ,UAAQ;AACnB,UAAAK,IAAOL,EAAQG,CAAC;AAGtB,QAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAASE,CAAI,GAAG;AAClC,UAAIC,IAAW;AAEf,UAAIN,EAAQG,IAAI,CAAC,MAAM,KAAK;AAC1B,cAAMI,IAAWP,EAAQ,QAAQ,KAAKG,IAAI,CAAC;AAC3C,YAAII,MAAa,IAAI;AACnB,gBAAMC,IAAcR,EAAQ,MAAMG,IAAI,GAAGI,CAAQ;AAC7C,cAAAC,EAAY,SAAS,GAAG,GAAG;AAC7B,kBAAM,CAAG,EAAAC,CAAG,IAAID,EAAY,MAAM,GAAG,EAAE,IAAI,CAAKE,MAAA,SAASA,EAAE,KAAM,CAAA,CAAC;AAClE,YAAAJ,IAAWG,KAAO,SAASD,EAAY,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,UAAA;AAEpD,YAAAF,IAAW,SAASE,CAAW;AAE7B,UAAAL,IAAAI;AAAA,QAAA;AAAA,MACN,OACK;AAEL,YAAII,IAAIR,IAAI;AACL,eAAAH,EAAQW,CAAC,MAAMN;AACpB,UAAAC,KACAK;AAEF,QAAAR,IAAIQ,IAAI;AAAA,MAAA;AAIV,eAASC,IAAI,GAAGA,IAAIN,GAAUM;AACvB,QAAAX,EAAA,KAAKR,GAAgBY,CAA4B,CAAC,GACxCH,KAAAP,GAAaU,GAA8BD,GAAS;AAAA,IACrE;AAIA,MAAAH,EAAK,KAAKI,CAAI,GACCH,KAAAG;AAEjB,IAAAF;AAAA,EAAA;AAIK,SAAA;AAAA,IACL,MAAAF;AAAA,IACA,aAAAC;AAAA,IACA,kBAAkBb;AAAA,EACpB;AACF;AClEO,MAAMwB,IAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASO,SAASC,GAAQC,GAAqB;AAEzC,SAAAA,KAAU,QAET,MAAM,QAAQA,CAAK,KAAK,CAACA,EAAM,UAC/B,OAAOA,KAAU,YAAY,CAAC,OAAO,KAAKA,CAAK,EAAE,UAClD,CAACA;AAEL;AASgB,SAAAC,GAAWC,GAAcjB,IAAkB,eAAuB;AAC1E,QAAAkB,IAAQ,IAAI,KAAKD,CAAI;AAE3B,MAAI,MAAMC,EAAM,QAAQ,CAAC;AACjB,UAAA,IAAI,MAAM,qBAAqB;AAGvC,QAAMC,IAAMC,EAAQF,EAAM,QAAA,CAAS,GAC7BG,IAAQH,EAAM,SAAA,IAAa,GAC3BI,IAAOJ,EAAM,YAAY,GACzBK,IAAOH,EAAQF,EAAM,SAAA,CAAU,GAC/BM,IAASJ,EAAQF,EAAM,WAAA,CAAY,GACnCO,IAASL,EAAQF,EAAM,WAAA,CAAY,GACnCQ,IAAeR,EAAM,gBAAgB,GAErCS,IAA0C;AAAA,IAC9C,IAAIR;AAAA,IACJ,GAAGD,EAAM,QAAQ,EAAE,SAAS;AAAA,IAC5B,KAAKL,EAAWK,EAAM,SAAU,CAAA,EAAE,MAAM,GAAG,CAAC;AAAA,IAC5C,MAAML,EAAWK,EAAM,UAAU;AAAA,IACjC,IAAIE,EAAQC,CAAK;AAAA,IACjB,GAAGA,EAAM,SAAS;AAAA,IAClB,MAAMC,EAAK,SAAS;AAAA,IACpB,IAAIA,EAAK,WAAW,MAAM,EAAE;AAAA,IAC5B,IAAIC;AAAA,IACJ,GAAGL,EAAM,SAAS,EAAE,SAAS;AAAA,IAC7B,IAAIM;AAAA,IACJ,GAAGN,EAAM,WAAW,EAAE,SAAS;AAAA,IAC/B,IAAIO;AAAA,IACJ,GAAGP,EAAM,WAAW,EAAE,SAAS;AAAA,IAC/B,KAAKE,EAAQM,CAAY;AAAA,IACzB,GAAGA,EAAa,SAAW,EAAA,MAAM,GAAG,CAAC;AAAA;AAAA,EAEvC;AAEA,SAAO1B,EAAQ;AAAA,IACb;AAAA,IACA,CAAA4B,MAASD,EAAaC,CAAK,KAAKA;AAAA,EAClC;AACF;AAQO,SAASR,EAAQS,GAAqB;AAC3C,SAAOA,IAAM,KAAK,IAAIA,CAAG,KAAK,GAAGA,CAAG;AACtC;AASgB,SAAAC,GAAST,GAAwBU,GAAc;AACzD,MAAA,OAAO,UAAU,SAASV,CAAe,CAAC,KAAK,OAAOA,CAAK,IAAI,GAAG;AACpE,QAAIU,MAAS,OAAQ,QAAOlB,EAAW,OAAOQ,CAAK,IAAI,CAAC;AACpD,QAAAU,MAAS,MAAO,QAAOlB,EAAW,OAAOQ,CAAK,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC;AACnE,QAAIU,MAAS,KAAM,QAAOX,EAAQ,OAAOC,CAAK,CAAC;AAAA,EAAA;AAE1C,SAAAA;AACT;AAUgB,SAAAW,GAAeC,GAAkBC,GAAgBC,GAA4B;AACvF,SAAA,OAAOF,EAAM,aAAc,aACtBA,EAAM,UAAUC,GAAMC,CAAY,IAEpC;AACT;AAQO,SAASC,GAAmBC,GAAW;AAE5C,MAAI,OAAOA,KAAQ,YAAYA,MAAQ;AAC9B,WAAAA;AAIL,MAAA,MAAM,QAAQA,CAAG;AACnB,WAAOA,EAAI,IAAI,CAAQC,MAAAF,GAAUE,CAAI,CAAC;AAIxC,QAAMC,IAAc,CAAC;AACd,gBAAA,QAAQF,CAAG,EAAE,QAAQ,CAAC,CAACG,GAAKzB,CAAK,MAAM;AAExC,IAAA,OAAOA,KAAU,aACnBwB,EAAOC,CAAG,IAAIzB,EAAM,KAAKwB,CAAM,IAExBA,EAAAC,CAAG,IAAIJ,GAAUrB,CAAK;AAAA,EAC/B,CACD,GAEMwB;AACT;AAiBgB,SAAAE,GAAWC,GAAgBC,GAAgC;AAClE,SAAAA,EAAQ,UAAU,CAAOC,MAE5BA,EAAI,UAAUF,EAAO,SACrBE,EAAI,UAAUF,EAAO,SACrBE,EAAI,UAAUF,EAAO,SACrBE,EAAI,UAAUF,EAAO,KAExB;AACH;AAUgB,SAAAG,EAAYH,GAAgBC,GAAwB;AAC5D,QAAAG,IAAQL,GAAWC,GAAQC,CAAO;AACxC,EAAIG,KAAS,IAAWH,EAAAG,CAAK,EAAE,YAAY,OAC9B,KAAK,EAAE,GAAGJ,GAAQ,WAAW,IAAM;AAClD;AAQgB,SAAAK,GAAcL,GAAgBC,GAAwB;AAC9D,QAAAG,IAAQL,GAAWC,GAAQC,CAAO;AACxC,EAAIG,KAAS,MAAWH,EAAAG,CAAK,EAAE,YAAY;AAC7C;AASgB,SAAAE,GAAmBL,GAAwBM,GAA+B;AACpF,SAACA,IACEN,EAAQ;AAAA,IAAO,CAAAD,MACpB,KAAK,UAAUA,CAAM,EAAE,cAAc,SAASO,EAAO,YAAa,CAAA;AAAA,EACpE,IAHoBN;AAItB;AAQO,SAASO,GAAaC,GAA0B;AAC/C,QAAAC,IAAQD,EAAM,SAAS,IACvBE,IAAWF,EAAM,WAAW,OAAO;AACzC,SAAOC,IAAQC;AACjB;ACjPO,SAASC,KAAoB;AAC5B,QAAAC,IAAcC,EAAgB,EAAE;AAKtC,iBAAeC,IAAgC;AAC7C,YAAQ,MAAM,wBAAwB;AACtC,UAAMC,IAAwB,CAAC;AACpB,eAAAC,KAAYJ,EAAY;AAI7B,UAHA,QAAOI,KAAA,gBAAAA,EAAU,kBAAkB,cACrC,MAAMA,EAAS,cAAc,GAE3B,QAAOA,KAAA,gBAAAA,EAAU,cAAc;AAC7B,YAAA;AACI,gBAAAC,IAAkBD,EAAS,UAAU;AACvC,UAAA,MAAM,QAAQC,CAAe,IACxBF,EAAA,KAAK,GAAGE,CAAe,IAEtB,QAAA,KAAK,yCAAyCA,CAAe;AAAA,iBAEhEC,GAAO;AACN,kBAAA,MAAM,yCAAyCA,GAAOF,CAAQ;AAAA,QAAA;AAAA;AAGhE,gBAAA,KAAK,+CAA+CA,CAAQ;AAGjE,WAAAD,EAAO,MAAM5C,EAAO;AAAA,EAAA;AAM7B,WAASgD,IAAkB;AACb,IAAAP,EAAA,MAAM,QAAQ,CAACI,MAAkB;AACvC,MAAA,QAAOA,KAAA,gBAAAA,EAAU,YAAY,cAC/BA,EAAS,QAAQ;AAAA,IACnB,CACD;AAAA,EAAA;AAMH,WAASI,IAA0B;AACjC,UAAML,IAAwB,CAAC;AACpB,eAAAC,KAAYJ,EAAY;AAC7B,UAAA,QAAOI,KAAA,gBAAAA,EAAU,cAAc;AAC7B,YAAA;AACI,gBAAAC,IAAkBD,EAAS,UAAU;AACvC,UAAA,MAAM,QAAQC,CAAe,IACxBF,EAAA,KAAK,GAAGE,CAAe,IAEvBF,EAAA,KAAK,OAAOE,CAAe,CAAC;AAAA,iBAE9BC,GAAO;AACN,kBAAA,MAAM,yCAAyCA,GAAOF,CAAQ;AAAA,QAAA;AAIrE,WAAAD;AAAA,EAAA;AAMT,iBAAeM,IAAkC;AACpC,eAAAL,KAAYJ,EAAY;AAC7B,MAAA,QAAOI,KAAA,gBAAAA,EAAU,kBAAkB,cACrC,MAAMA,EAAS,cAAc;AAAA,EAEjC;AAGK,SAAA;AAAA,IACL,aAAAJ;AAAA,IACA,aAAAE;AAAA,IACA,WAAAK;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAC;AAAA,EACF;AACF;ACjFO,SAASC,GAAsBC,GAA+B;AAInE,QAAMC,IAAWC;AAAA,IAAS,MACxB,OAAO,QAAQF,EAAa,KAAK,EAAE,OAAO,CAACG,GAAK,CAAC7B,GAAK8B,CAAI,OACpDA,EAAK,UAAU,WACb,OAAOA,EAAK,YAAa,aAC3BD,EAAI7B,CAAG,IAAI8B,EAAK,SAASA,EAAK,KAAK,IAE/BD,EAAA7B,CAAG,IAAI8B,EAAK,QAGbD,IACN,CAAc,CAAA;AAAA,EACnB,GAKMlC,IAAeiC,EAAS,MACrB,OAAO,QAAQD,EAAS,KAAK,EAAE,OAAO,CAACE,GAAK,CAAC7B,GAAKzB,CAAK,OACxDA,MAAU,WAERmD,EAAa,MAAM1B,CAAG,EAAE,aAAa,WACvC6B,EAAI7B,CAAG,IAAKzB,EAAwB,IAAI,CAAC,EAAE,OAAAwD,QAClC,OAAO,QAAQA,CAAK,EAAE,OAAO,CAACC,GAAS,CAACC,GAAIC,CAAC,OAC9C,OAAOR,EAAa,MAAM1B,CAAG,EAAE,SAAUiC,CAAE,EAAE,iBAAkB,aACzDD,EAAAC,CAAE,IAAIP,EAAa,MAAM1B,CAAG,EAAE,SAAUiC,CAAE,EAAE;AAAA,IAClDC;AAAA,IACAR,EAAa;AAAA,EACf,IAEAM,EAAQC,CAAE,IAAIC,GAETF,IACN,EAAkB,CACtB,IAIC,OAAON,EAAa,MAAM1B,CAAG,EAAE,iBAAkB,cAAczB,MAAU,WACvEsD,EAAA7B,CAAG,IAAI0B,EAAa,MAAM1B,CAAG,EAAE,cAAczB,GAAOmD,EAAa,KAAK,KAGvEG,IACN,EAAkB,CACtB;AAEM,SAAA;AAAA,IACL,UAAAF;AAAA,IACA,cAAAhC;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;ACYA,UAAMwC,IAAQC,GAWRC,IAAOC,GACPZ,IAAeV,EAAImB,EAAM,MAAM,GAG/B,EAAE,aAAApB,GAAa,aAAAE,GAAa,WAAAK,EAAA,IAAcR,GAAkB,GAG5D,EAAE,UAAUpB,GAAM,cAAAC,EAAa,IAAI8B,GAAsBC,CAAY;AAE3E,mBAAea,IAAa;AACtB,MAAE,MAAMtB,OACZoB,EAAK,UAAU3C,EAAK,OAAOC,EAAa,KAAK;AAAA,IAAA;AAG/C,aAAS6C,IAAoB;AACjB,MAAAlB,EAAA,GACVe,EAAK,OAAO;AAAA,IAAA;AAGd,aAASI,IAAqB;AAClB,MAAAnB,EAAA,GACVe,EAAK,QAAQ;AAAA,IAAA;AAGf,WAAAK;AAAA,MACEhD;AAAA,MACA,YAAY;AACC,mBAAA,CAACiD,GAAGC,CAAC,KAAK,OAAO,QAAQlB,EAAa,KAAK;AACpD,UAAKlC,GAAeoD,GAAGlD,EAAK,OAAOC,EAAa,KAAK,MAEnDiD,EAAE,QAAQT,EAAM,OAAOQ,CAAC,EAAE;AAAA,MAGhC;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,MAAA;AAAA,IAEf,GAEAD;AAAA,MACE,MAAMP,EAAM;AAAA,MACZ,CAAaU,MAAA;AACX,mBAAW,CAAC7C,GAAKP,CAAK,KAAK,OAAO,QAAQoD,CAAS;AAC7C,UAAApD,EAAM,UAAU,WAClBiC,EAAa,MAAM1B,CAAG,EAAE,QAAQP,EAAM;AAAA,MAG5C;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,MAAA;AAAA,IAEf,GAEaqD,EAAA;AAAA,MACX,WAAAxB;AAAA,MACA,aAAAL;AAAA,MACA,aAAa,OAAO;AAAA,QAClB,UAAUvB,EAAK;AAAA,QACf,cAAcC,EAAa;AAAA,MAC7B;AAAA,IAAA,CACD,gBAhJC,GAAAoD,EAyCUC,EAAAC,EAAA,GAAA,MAAA;AAAA,iBAxCR,MAqBS;AAAA,QArBTC,EAqBSF,EAAAG,EAAA,GAAA,MAAA;AAAA,qBApBG,MAA2C;AAAA,aAArDC,EAAA,EAAA,GAAAC,EAmBWC,WAnBgB,OAAO,KAAK5B,EAAA,KAAY,IAAlC6B,MAAM;;;gBASbP,EAAAxD,EAAA,EAAekC,EAAY,MAAC6B,CAAM,GAAGP,EAAAtD,CAAA,GAAMsD,EAAYrD,CAAA,CAAA,UAR/DoD,EAiBSC,EAAAQ,EAAA,GAAA;AAAA,kBAhBN,KAAKD;AAAA,kBACL,QAAME,IAAA/B,EAAY,MAAC6B,CAAM,EAAE,SAArB,gBAAAE,EAA2B,OAAE;AAAA,kBACnC,YAASC,IAAAhC,EAAY,MAAC6B,CAAM,EAAE,SAArB,gBAAAG,EAA2B;AAAA,kBACpC,YAASC,IAAAjC,EAAY,MAAC6B,CAAM,EAAE,SAArB,gBAAAI,EAA2B;AAAA,kBACpC,YAASC,IAAAlC,EAAY,MAAC6B,CAAM,EAAE,SAArB,gBAAAK,EAA2B;AAAA,kBACpC,YAASC,IAAAnC,EAAY,MAAC6B,CAAM,EAAE,SAArB,gBAAAM,EAA2B;AAAA,kBACrC,OAAM;AAAA,gBAAA;6BAGN,MAME;AAAA,qBANFT,KAAAL,EAMEe,GALKpC,EAAA,MAAa6B,CAAM,EAAE,IAAI,GAAA;AAAA,sBACrB,YAAA7B,EAAA,MAAa6B,CAAM;AAAA,sBAAnB,uBAAA,CAAAQ,MAAArC,EAAA,MAAa6B,CAAM,IAAAQ;AAAA,sBAC3B,QAAQrC,EAAY;AAAA;+BACjB;AAAA,sBAAJ,KAAIX;AAAA,sBACH,WAASwC;AAAA,oBAAA;;;;;;;;;QAKHS,EAAW,gCAA1BjB,EAiBSC,EAAAG,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,qBAhBP,MAeS;AAAA,YAfTD,EAeSF,EAAAQ,EAAA,GAAA;AAAA,cAfD,MAAK;AAAA,cAAK,OAAqBS,GAAA,CAArB,EAAqB,SAAA,OAAA,GAAA,EAAA,gBAA2BC,EAAe,iBAAA,CAAA;AAAA,YAAA;yBAC/E,MAEY;AAAA,gBAFiCC,EAAgB,yBAA7DpB,EAEYC,EAAAoB,CAAA,GAAA;AAAA;kBAFA,SAAO3B;AAAA,gBAAA;6BACjB,MAAkC;AAAA,wBAA/B4B,EAAgB,oBAAA,QAAA,GAAA,CAAA;AAAA,kBAAA;;;gBAEuBC,EAAe,wBAA3DvB,EAEYC,EAAAoB,CAAA,GAAA;AAAA;kBAFA,SAAO5B;AAAA,gBAAA;6BACjB,MAAgC;AAAA,wBAA7B+B,EAAe,mBAAA,OAAA,GAAA,CAAA;AAAA,kBAAA;;;wBAEpBlB,EAIWC,GAAA,MAAAkB,EAJgBC,EAAa,eAAA,CAAvBC,YACf3B,EAEYC,EAAAoB,CAAA,GAAA;AAAA,kBAHkC,KAAAM,EAAO;AAAA,kBACzC,SAAOA,EAAO;AAAA,kBAAS,OAAOA,EAAO,SAAK;AAAA,gBAAA;6BACpD,MAAkB;AAAA,oBAAfC,EAAAC,EAAAF,EAAO,KAAK,GAAA,CAAA;AAAA,kBAAA;;;gBAGnBxB,EAEYF,EAAAoB,CAAA,GAAA,EAFA,SAAO7B,KAAU;AAAA,6BAC3B,MAAkC;AAAA,wBAA/BsC,EAAgB,oBAAA,QAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;;;;;;;;AChCtB,SAASC,GAAoB3D,GAA+C;AA4B1E,SAAA;AAAA,IACL,sBAzB2B,OAAO4D,MAAqB;;AAEvD,OAAAtB,IAAAtC,EAAS,UAAT,QAAAsC,EAAgB,IAAI,UAAU,OAAO,iBACrCC,IAAAvC,EAAS,UAAT,QAAAuC,EAAgB,IAAI,UAAU,OAAO,cAGjCqB,KACFpB,IAAAxC,EAAS,UAAT,QAAAwC,EAAgB,IAAI,UAAU,IAAI,gBAElCC,IAAAzC,EAAS,UAAT,QAAAyC,EAAgB,IAAI,UAAU,IAAI,iBAIpCC,IAAA1C,EAAS,UAAT,QAAA0C,EAAgB,IAAI,UAAU,IAAI;AAAA,IACpC;AAAA,IAYE,sBAP2B,MAAM;;AACjC,OAAAJ,IAAAtC,EAAS,UAAT,QAAAsC,EAAgB,IAAI,UAAU,OAAO,iBACrCC,IAAAvC,EAAS,UAAT,QAAAuC,EAAgB,IAAI,UAAU,OAAO;AAAA,IACvC;AAAA,EAKA;AACF;AC7BO,SAASsB,EACd7D,GACAR,GACAsE,GACAC,GACAC,GACA;AACA,QAAM,EAAE,sBAAAC,GAAsB,sBAAAC,MAAyBP,GAAoB3D,CAAQ;AAKnF,iBAAe4D,IAA4B;AAEzC,QAAIpE,EAAM,MAAM,YAAY,CAACsE,EAAW;AACtC,aAAAtE,EAAM,MAAM,QAAQ,0BACb;AAIT,QAAIwE,GAAkB;AACpB,YAAMG,IAAe,MAAMH,EAAiBF,EAAW,KAAK;AACxD,UAAA,OAAOK,KAAiB;AAC1B,eAAA3E,EAAM,MAAM,QAAQ2E,GACb;AAET,UAAIA,MAAiB;AACZ,eAAA;AAAA,IACT;AAIE,QAAA3E,EAAM,MAAM,YAAY;AACpB,YAAAO,IAAS,MAAMP,EAAM,MAAM,WAAWsE,EAAW,OAAOC,KAAA,gBAAAA,EAAQ,KAAK;AACvE,UAAAhE,KAAUA,EAAO;AACb,eAAAP,EAAA,MAAM,QAAQO,EAAO,KAAK,GACzB;AAAA,IACT;AAGK,WAAA;AAAA,EAAA;AAMT,iBAAeqE,IAA+B;AACtC,UAAAC,IAAmB,MAAMT,EAAQ;AAEvC,IAAIS,MACF7E,EAAM,MAAM,QAAQ,IACdA,EAAA,MAAM,QAAQsE,EAAW,QAGjC,MAAMG,EAAqBI,CAAgB;AAAA,EAAA;AAM7C,WAASC,IAAgB;AACF,IAAAJ,EAAA,GACrB1E,EAAM,MAAM,QAAQ;AAAA,EAAA;AAMb,WAAA+E,EAAQC,IAAoB,IAAU;AAC7C,IAAAV,EAAW,QAAQU,GACnBhF,EAAM,MAAM,QAAQ,IACpBA,EAAM,MAAM,QAAQgF;AAAA,EAAA;AAMtB,WAASC,IAAsB;AACtB,WAAAjF,EAAM,MAAM,QAAQ,CAACA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EAAA;AAG7C,SAAA;AAAA,IACL,SAAAoE;AAAA,IACA,eAAAQ;AAAA,IACA,SAAAE;AAAA,IACA,SAAAC;AAAA,IACA,WAAAE;AAAA,IACA,sBAAAR;AAAA,IACA,sBAAAC;AAAA,EACF;AACF;AC5FO,SAASQ,GAAiBlF,GAAuB;AAItD,QAAMmF,IAAYlE,EAAS,MAAM,CAAC,CAACjB,EAAM,MAAM,KAAK,GAK9CoF,IAAenE,EAAS,MAAM,CAAC,CAACjB,EAAM,MAAM,QAAQ,GAKpDqF,IAAYpE,EAAS,MAAMjB,EAAM,MAAM,SAAS,EAAE;AAEjD,SAAA;AAAA,IACL,WAAAmF;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,EACF;AACF;;;;;;;ACfA,UAAM7D,IAAQC,GAIR,EAAE,WAAA0D,GAAW,cAAAC,GAAc,WAAAC,EAAA,IAAcH,GAAiBI,GAAM9D,GAAO,OAAO,CAAC;qBAhBrDa,EAAS8C,CAAA,UAAvC/C,EAGYC,EAAAkD,CAAA,GAAA;AAAA;MAHD,MAAK;AAAA,MAAyB,OAAM;AAAA,IAAA;iBAC7C,MAAe;AAAA,QAAZvB,EAAAC,EAAA5B,EAAAgD,CAAA,CAAS,IAAG,KACf,CAAA;AAAA,QAA+BhD,EAAY+C,CAAA,UAA3ChD,EAAyDC,EAAAmD,EAAA,GAAA;AAAA;UAA/C,OAAM;AAAA,QAAA;qBAA6B,MAACC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAD,GAAC;AAAA,UAAA;;;;;;;;;;;;;;;;;;;ACoClD,UAAMjE,IAAQC,GACRzB,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAAoC,IAAI,GACnDhE,IAAQgE,EAAIL,EAAM,MAAM,KAAe,GACvCuE,IAAStD,EAAS,MAAMO,EAAM,MAAM,GAGpC,EAAE,SAAA4C,GAAS,eAAAQ,GAAe,SAAAE,GAAS,SAAAC,GAAS,WAAAE,MAAcZ;AAAA,MAC9D7D;AAAA,MACAR;AAAA,MACA3D;AAAA,MACAkI;AAAA,IACF,GAEMoB,IAAiB1E,EAAS,MAAM;AACpC,UAAIjB,EAAM,MAAM,gBAAgBpD,GAAuBoD,EAAM,MAAM,OAAO;AAAA,IACnE,CACR;AAED,WAAA+B;AAAA,MACE,MAAM/B,EAAM,MAAM;AAAA,MAClB,CAAAuB,MAAMlF,EAAM,QAAQkF;AAAA,IACtB,GAEaY,EAAA;AAAA,MACX,eAAAyC;AAAA,MACA,SAAAG;AAAA,MACA,WAAAE;AAAA,MACA,SAAAb;AAAA,IAAA,CACD;;;sBAnEChC,EA2BYC,EAAAuD,EAAA,GAAA;AAAA,iBA1BN;AAAA,QAAJ,KAAIpF;AAAA,oBACKnE,EAAK;AAAA,sDAALA,EAAK,QAAA+G;AAAA,QAEb,eAAa;AAAA,QACb,MAAMpD,EAAK,MAAC,QAAI;AAAA,QAChB,mBAAiBA,EAAK,MAAC,kBAAc;AAAA,QACrC,MAAMvD,EAAI,QAAA;AAAA,QACV,UAAUuD,EAAK,MAAC;AAAA,QAChB,cAAYA,EAAK,MAAC;AAAA,QAClB,WAAWA,EAAK,MAAC;AAAA,QACjB,eAAa8C,IAAA6C,EAAc,UAAd,gBAAA7C,EAAgB,gBAAe9C,EAAA,MAAM;AAAA,QAClD,UAAUA,EAAK,MAAC;AAAA,QAChB,SAASA,EAAK,MAAC;AAAA,QACf,KAAKA,EAAK,MAAC;AAAA,QACX,KAAKA,EAAK,MAAC;AAAA,QACX,cAAYA,EAAK,MAAC;AAAA,QAClB,cAAYA,EAAK,MAAC;AAAA,QAClB,SAASA,EAAK,MAAC;AAAA,QACf,YAAUqC,EAAOyC,CAAA;AAAA,QACjB,aAAWzC,EAAauC,CAAA;AAAA,QACxB,WAAUvC,EAAauC,CAAA;AAAA,MAAA;mBAExB,MAA6B;AAAA,UAA7BrC,EAA6BsD,IAAA,EAAhB,OAAO7F,EAAK,MAAA,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,UACRA,EAAA,MAAM,eAAvBoC,EAA0EC,EAAAkD,CAAA,GAAA;AAAA;YAA3C,MAAK;AAAA,UAAA;uBAAQ,MAAkB;AAAA,cAAfvB,EAAAC,EAAAjE,EAAA,MAAM,MAAM,GAAA,CAAA;AAAA,YAAA;;;UAC1CA,EAAA,MAAM,eAAvBoC,EAAyEC,EAAAkD,CAAA,GAAA;AAAA;YAA1C,MAAK;AAAA,UAAA;uBAAM,MAAkB;AAAA,cAAfvB,EAAAC,EAAAjE,EAAA,MAAM,MAAM,GAAA,CAAA;AAAA,YAAA;;;UACbvD,EAAI,SAAA,mBAAhD2F,EAAmEC,EAAAyD,EAAA,GAAA;AAAA;YAAxC,MAAK;AAAA,UAAA;;;;YAvBrBH,EAAc,KAAA;AAAA,MAAA;;;;;;;;;;;;;ACMvB,UAAA3F,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAA6B,IAAI;AAErC,WAAA8B,EAAA;AAAA,MACX,SAAS,MAAM;;AAAA,gBAAAW,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MAC/B,eAAe,MAAM;;AAAA,gBAAAA,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MACrC,WAAW,MAAM;;AAAA,iBAAAC,KAAAD,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB,cAAhB,gBAAAC,EAAA,KAAAD,OAAiC,CAAA;AAAA;AAAA,IAAC,CACpD,mBAhBCV,EAA0E2D,IAAA;AAAA,kBAArD/F,EAAK;AAAA,oDAALA,EAAK,QAAAoD;AAAA,MAAE,MAAK;AAAA,MAAQ,QAAQmB,EAAM;AAAA,eAAM;AAAA,MAAJ,KAAI/D;AAAA;;;;;;;;;;;;ACwF/D,UAAMgB,IAAQC,GACRzB,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAAoC,IAAI,GACnD2F,IAAU3F,EAAIL,EAAM,MAAM,GAAyB,GACnDiG,IAAU5F,EAAIL,EAAM,MAAM,GAAyB,GACnDkG,IAAa7F,EAAYL,EAAM,MAAM,KAAe,GACpDuE,IAAStD,EAAS,MAAMO,EAAM,MAAM;AAG1C,mBAAe2E,EAAqBvI,GAA0C;AAC5E,UAAIA,MAAU;AACR,eAAAoC,EAAM,MAAM,WACP,2BAEF;AAGH,YAAAjC,IAAQ,IAAI,KAAKH,CAAK;AAC5B,aAAI,MAAMG,EAAM,QAAQ,CAAC,IAChB,wBAGLkI,EAAQ,SAASlI,IAAQ,IAAI,KAAKkI,EAAQ,KAAK,IAC1C,6BAA6BA,EAAQ,KAAK,KAG/CD,EAAQ,SAASjI,IAAQ,IAAI,KAAKiI,EAAQ,KAAK,IAC1C,0BAA0BA,EAAQ,KAAK,KAGzC;AAAA,IAAA;AAIT,UAAM,EAAE,eAAApB,GAAe,SAAAE,GAAS,WAAAG,EAAc,IAAAZ;AAAA,MAC5C7D;AAAA,MACAR;AAAA,MACAkG;AAAA,MACA3B;AAAA,MACA4B;AAAA,IACF;AAGA,aAASpB,IAAU;AACjB,MAAAmB,EAAW,QAAQ,IACnBlG,EAAM,MAAM,QAAQ,IACpBA,EAAM,MAAM,QAAQ;AAAA,IAAA;AAEhB,UAAAnD,IAAUoE,EAAS,MAAM;AAC7B,UAAIjB,EAAM,MAAM,QAAS,QAAOA,EAAM,MAAM;AACxC,UAAAoG,IAAcpG,EAAM,MAAM,WAAW;AACrC,aAAAA,EAAM,MAAM,eACCoG,KAAA,cAEVA;AAAA,IAAA,CACR,GACKC,IAAiB,cACjBC,IAAerF,EAAS,MAAMpE,EAAQ,MAAM,MAAMwJ,CAAc,CAAC,GACjEE,IAAatF,EAAS,MAAMpE,EAAQ,MAAM,MAAM,aAAa,KAAK,EAAE,GACpE2J,IAAanG,EAAI,EAAyB;AAEhD,IAAA0B;AAAA,MACE,MAAM/B,EAAM,MAAM;AAAA,MAClB,CAAKuB,MAAA;AACH,QAAA2E,EAAW,QAAQ3E,GACnBkF,EAAgBlF,CAAW;AAAA,MAAA;AAAA,IAE/B;AAEe,mBAAAmF,EAAe9H,GAAcoG,GAAuB2B,GAAW;AACxE,UAAA/I,IAAQoH,MAAiB2B,KAAA,gBAAAA,EAAG,QAA4B;AAC5D,MAAI,cAAc,KAAK/H,CAAI,MAAWhB,IAAAe,GAASf,GAAOgB,CAAI,IACtD,OAAO,UAAU,SAAShB,CAAK,CAAC,MAAWA,IAAAK,EAAQ,SAASL,CAAK,CAAC,IAC3D4I,EAAA,MAAM5H,CAAI,IAAIhB;AACzB,YAAMgJ,IAAgBN,EAAa,MAAM,OAAO,CAACxI,GAAMc,GAAMe,OAC3D7B,KACE0I,EAAW,MAAM5H,CAAI,KACpBe,IAAQ2G,EAAa,MAAM,SAAS,IAAIC,EAAW,MAAM5G,CAAK,IAAI,KAC9D7B,IACN,EAAE;AACL,MAAAoI,EAAW,QAAQU,GACnB,MAAMhC,EAAc;AAAA,IAAA;AAGtB,mBAAe6B,EAAgB3I,GAAc;AAC3C,YAAM+I,IAAQhJ,GAAWC,GAAMjB,EAAQ,KAAK,EAAE,MAAMwJ,CAAc;AACrD,MAAAC,EAAA,MAAM,QAAQ,CAAC1H,GAAMe,MAAU+G,EAAe9H,GAAMiI,EAAMlH,CAAK,CAAC,CAAC,GAC9E,MAAMiF,EAAc;AAAA,IAAA;AAGT,WAAAzC,EAAA;AAAA,MACX,eAAAyC;AAAA,MACA,SAAAG;AAAA,MACA,WAAAE;AAAA,IAAA,CACD,GAED6B,GAAU,MAAM;AACd,MAAAR,EAAa,MAAM,QAAQ,CAAC1H,GAAMe,MAAU;;AAC/B,QAAA6G,EAAA,MAAM5H,CAAI,MAAIkE,IAAAoD,EAAW,UAAX,gBAAApD,EAAkB,MAAMuD,GAAgB1G,OAAU;AAAA,MAAA,CAC5E;AAAA,IAAA,CACF,mBA5LCyC,EA0EYC,EAAAuD,EAAA,GAAA;AAAA,MAzEV,MAAK;AAAA,eACD;AAAA,MAAJ,KAAIpF;AAAA,MACH,eAAa;AAAA,MACb,MAAMR,EAAK,MAAC,QAAI;AAAA,MAChB,mBAAiBA,EAAK,MAAC,kBAAc;AAAA,MACrC,UAAUA,EAAK,MAAC;AAAA,MAChB,cAAYA,EAAK,MAAC;AAAA,MAClB,WAAWA,EAAK,MAAC;AAAA,MACjB,UAAUA,EAAK,MAAC;AAAA,MAChB,YAAWqC,EAAOyC,CAAA;AAAA,MAClB,WAAUzC,EAAauC,CAAA;AAAA,IAAA;iBAExB,MAA6B;AAAA,QAA7BrC,EAA6BsD,IAAA,EAAhB,OAAO7F,EAAK,MAAA,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,SACzByC,EAAA,EAAA,GAAAC,EAmCWC,GAnCuB,MAAAkB,EAAAyC,EAAA,OAAhB,CAAA1H,GAAMe;UAWA,cAAA,KAAKf,CAAI,OAV/B,GAAAwD,EAmBaC,EAAA0E,EAAA,GAAA;AAAA,YAlBX,MAAK;AAAA,YACJ,eAAenI,CAAI;AAAA,YACpB,WAAU;AAAA,YACT,OAAK0E,GAAA,EAAA,UAActD,EAAK,MAAC,aAAU,QAAA,OAAA;AAAA,YACnC,aAAapB;AAAA,YACb,OAAO4H,EAAU,MAAC5H,CAAI;AAAA,YACtB,YAAWyD,EAAOyC,CAAA;AAAA,YAClB,mBAAW4B,EAAe9H,GAAM,QAAWwE,CAAM;AAAA,YACjD,kBAAUsD,EAAe9H,GAAM,QAAWwE,CAAM;AAAA,UAAA;uBAI/C,MAAgC;AAAA,eADlCX,EAAA,EAAA,GAAAC,EAMoBC,GALG,MAAAkB,EAAAxB,EAAA3E,CAAA,GAAb,CAAAQ,GAAOlB,YADjBoF,EAMoBC,EAAA2E,EAAA,GAAA;AAAA,gBAJjB,KAAK9I;AAAA,gBACL,OAAOmE,EAAA1D,EAAA,EAAS3B,OAAO4B,CAAI;AAAA,cAAA;2BAE5B,MAA2B;AAAA,sBAAxByD,EAAQ1D,EAAA,EAAC3B,IAAC,GAAM4B,CAAI,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;wGAG3BwD,EAUEC,EAAAuD,EAAA,GAAA;AAAA,YARA,MAAK;AAAA,YACJ,cAAchH,CAAI;AAAA,YAClB,aAAaA;AAAA,YACb,WAAWoB,EAAK,MAAC;AAAA,YACjB,OAAOwG,EAAU,MAAC5H,CAAI;AAAA,YACtB,YAAWyD,EAAOyC,CAAA;AAAA,YAClB,mBAAW4B,EAAe9H,GAAM,QAAWwE,CAAM;AAAA,YACjD,kBAAUsD,EAAe9H,GAAM,QAAWwE,CAAM;AAAA,UAAA;UAEOzD,IAAQ2G,EAAY,MAAC,SAAM,UAArFlE,EAEYC,EAAAkD,CAAA,GAAA;AAAA,YAFD,MAAK;AAAA,YAAS,kBAAkB5F,CAAK;AAAA,UAAA;uBAA2C,MACnF;AAAA,cADmFqE,EAAA,OAChFC,EAAAsC,EAAA,MAAW5G,CAAK,KAAI,WAC/B,CAAA;AAAA,YAAA;;;;QAEF4C,EAuBYF,EAAAkD,CAAA,GAAA,EAvBD,MAAK,SAAK;AAAA,qBACnB,MAqBkB;AAAA,YArBlBhD,EAqBkBF,EAAA4E,EAAA,GAAA;AAAA,cApBhB,kBAAA;AAAA,cACA,sBAAA;AAAA,cACA,UAAA;AAAA,cACC,eAAaf,EAAU;AAAA,cACvB,cAAU,CAAGlG,EAAK,MAAC;AAAA,cACnB,sBAAoBA,EAAK,MAAC,cAAU;AAAA,cACpC,SAASgG,EAAO;AAAA,cAChB,SAASC,EAAO;AAAA,cAChB,cAAaQ;AAAA,YAAA;cAEH,WACT,MAOa;AAAA,gBAPblE,EAOaF,EAAAoB,CAAA,GAAA,EAPD,MAAK,WAAO;AAAA,6BACtB,MAKY;AAAA,oBALZlB,EAKYF,EAAA6E,CAAA,GAAA;AAAA,sBAJV,MAAK;AAAA,sBACJ,MAAM7E,EAAQ8E,EAAA;AAAA,sBACf,eAAY;AAAA,sBACX,SAAO9E,EAAOyC,CAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;AC3DvB,UAAA9E,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAA6B,IAAI;AAErC,WAAA8B,EAAA;AAAA,MACX,SAAS,MAAM;;AAAA,gBAAAW,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MAC/B,eAAe,MAAM;;AAAA,gBAAAA,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MACrC,WAAW,MAAM;;AAAA,iBAAAC,KAAAD,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB,cAAhB,gBAAAC,EAAA,KAAAD,OAAiC,CAAA;AAAA;AAAA,IAAC,CACpD,mBAhBCV,EAA4E2D,IAAA;AAAA,kBAAvD/F,EAAK;AAAA,oDAALA,EAAK,QAAAoD;AAAA,MAAE,MAAK;AAAA,MAAU,QAAQmB,EAAM;AAAA,eAAM;AAAA,MAAJ,KAAI/D;AAAA;;;;;;;;;;;;ACS3D,UAAAR,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAA6B,IAAI;AAErC,WAAA8B,EAAA;AAAA,MACX,SAAS,MAAM;;AAAA,gBAAAW,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MAC/B,eAAe,MAAM;;AAAA,gBAAAA,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MACrC,WAAW,MAAM;;AAAA,iBAAAC,KAAAD,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB,cAAhB,gBAAAC,EAAA,KAAAD,OAAiC,CAAA;AAAA;AAAA,IAAC,CACpD,mBAhBCV,EAA2E2D,IAAA;AAAA,kBAAtD/F,EAAK;AAAA,oDAALA,EAAK,QAAAoD;AAAA,MAAE,MAAK;AAAA,MAAS,QAAQmB,EAAM;AAAA,eAAM;AAAA,MAAJ,KAAI/D;AAAA;;;;;;;;;;;;ACS1D,UAAAR,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAA6B,IAAI;AAErC,WAAA8B,EAAA;AAAA,MACX,SAAS,MAAM;;AAAA,gBAAAW,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MAC/B,eAAe,MAAM;;AAAA,gBAAAA,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB;AAAA;AAAA,MACrC,WAAW,MAAM;;AAAA,iBAAAC,KAAAD,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB,cAAhB,gBAAAC,EAAA,KAAAD,OAAiC,CAAA;AAAA;AAAA,IAAC,CACpD,mBAhBCV,EAA8E2D,IAAA;AAAA,kBAAzD/F,EAAK;AAAA,oDAALA,EAAK,QAAAoD;AAAA,MAAE,MAAK;AAAA,MAAY,QAAQmB,EAAM;AAAA,eAAM;AAAA,MAAJ,KAAI/D;AAAA;;;;;;;;;;;;;ACqEnE,UAAMgB,IAAQC,GACRzB,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAAoC,IAAI,GACnD+G,IAAe/G,EAAwB,IAAI,GAC3CgH,IAAchH,EAAI,EAAK,GACvBb,IAAUa,EAAc,EAAE,GAC1BP,IAASO,EAAI,EAAE,GACfiH,IAAOjH,EAAI,CAAC,GAEZkH,IAAgBtG,EAAS,MACtBjB,EAAM,MAAM,aAAa,SACjC,GAEKwH,IAAkBvG,EAAS,MACxBjB,EAAM,MAAM,qBAAqB,QAAQ,QAAQ,QACzD,GAEKyH,IAAOxG,EAAmB,MAAMzB,EAAQ,MAAM,OAAO,CAAAkI,MAAK,CAAC,CAACA,EAAE,SAAS,CAAC,GAExE3K,IAAckE,EAAS,MACpB,CAACnB,EAAO,SAASnC,GAAQ8J,EAAK,KAAK,KAAK,CAACJ,EAAY,QACvDrH,EAAM,MAAM,eAAe,qBAC5B,EACL;AAED,IAAA+B,EAAM,CAACjC,GAAQ,MAAME,EAAM,MAAM,OAAO,GAAG2H,GAAe;AAAA,MACxD,WAAW;AAAA,MACX,MAAM;AAAA,IAAA,CACP,GACK5F,EAAA,MAAM/B,EAAM,MAAM,OAAO4H,GAAY,EAAE,WAAW,IAAM,MAAM,IAAM;AAE1E,aAAS7C,IAAU;AACjB,MAAAvF,EAAQ,MAAM,QAAQ,CAAAkI,MAAK9H,GAAc8H,GAAGlI,EAAQ,KAAK,CAAC,GAC1DQ,EAAM,MAAM,QAAQ,IACpBF,EAAO,QAAQ,IACfwH,EAAK,QAAQ,GACbtH,EAAM,MAAM,QAAQA,EAAM,MAAM,WAAW,CAAA,IAAK;AAAA,IAAA;AAGlD,aAAS6H,EAAS1I,GAAc;AAC9B,UAAIA,EAAK,UAAW,QAAOS,GAAcT,GAAMK,EAAQ,KAAK;AACxD,MAAAQ,EAAM,MAAM,WACFN,EAAAP,GAAMK,EAAQ,KAAK,KAEvBuF,EAAA,GACIrF,EAAAP,GAAMK,EAAQ,KAAK,GACjBoF,EAAA,IAEhB9E,EAAO,QAAQ;AAAA,IAAA;AAGjB,aAASgI,IAAgB;AACvB,cAAQP,EAAc,OAAO;AAAA,QAC3B,KAAK;AACa,UAAAQ,EAAA;AAChB;AAAA,QACF,KAAK;AACO,UAAAC,EAAA;AACV;AAAA,QACF,KAAK;AAAA,QACL;AACE,UAAAX,EAAY,QAAQ;AACpB;AAAA,MAAA;AAAA,IACJ;AAGF,mBAAeU,IAAkB;AAG3B,UAFJ,MAAMJ,EAAc,GAEhB3H,EAAM,MAAM,UAAU;AAExB,QAAAqH,EAAY,QAAQ;AACpB;AAAA,MAAA;AAsBF,aAlBoB,MAAMY,GAAsB,OAAO;AAAA,QACrD,QAAQjI,EAAM,MAAM,SAAS;AAAA,QAC7B,SAAS;AAAA,UACP,GAAGR,EAAQ,MAAM,IAAI,CAAWD,OAAA;AAAA,YAC9B,MAAMA,EAAO;AAAA,YACb,UAAUA,EAAO,YAAY,oBAAoB;AAAA,YACjD,SAAS,OACPsI,EAAStI,CAAM,GACR;AAAA,UACT,EACA;AAAA,UACF;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,MACF,CACD,GAEiB,QAAQ;AAAA,IAAA;AAG5B,mBAAeyI,IAAY;AACzB,YAAML,EAAc;AAEpB,YAAMO,IAAuB1I,EAAQ,MAAM,IAAI,CAAWD,OAAA;AAAA,QACxD,OAAOA,EAAO;AAAA,QACd,MAAMS,EAAM,MAAM,WAAW,aAAa;AAAA,QAC1C,OAAOT;AAAA,QACP,SAASA,EAAO;AAAA,MAAA,EAChB;AAiCF,aA/Bc,MAAM4I,GAAgB,OAAO;AAAA,QACzC,QAAQnI,EAAM,MAAM,SAAS;AAAA,QAC7B,QAAAkI;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,SAAS,CAAmBE,MAAA;AACtB,kBAAApI,EAAM,MAAM;AAEd,gBAAAR,EAAQ,MAAM,QAAQ,CAAAkI,MAAK9H,GAAc8H,GAAGlI,EAAQ,KAAK,CAAC,GAG1C4I,EAAA,QAAQ,CAACC,MAAqB;AACtC,wBAAA9I,KAASC,EAAQ,MAAM,KAAK,QAAKkI,GAAE,UAAUW,EAAS,KAAK;AACjE,kBAAI9I,MAAQG,EAAYH,IAAQC,EAAQ,KAAK;AAAA,gBAAA,CAC9C;AAAA,mBACI;AACG,gBAAAuF,EAAA;AACF,sBAAAxF,IAASC,EAAQ,MAAM,KAAK,QAAKkI,GAAE,UAAUU,EAAgB,KAAK;AACxE,gBAAI7I,KAAQG,EAAYH,GAAQC,EAAQ,KAAK;AAAA,cAAA;AAEjC,cAAAoF,EAAA;AAAA,YAAA;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CACD,GAEW,QAAQ;AAAA,IAAA;AAItB,mBAAe0D,IAAoD;AAEjE,UAAItI,EAAM,MAAM,YAAYrC,GAAQ8J,EAAK,KAAK;AACrC,eAAA;AAIL,UAAAzH,EAAM,MAAM,YAAY;AACpB,cAAAO,IAAS,MAAMP,EAAM,MAAM,WAAWyH,EAAK,OAAOjG,KAAA,gBAAAA,EAAO,MAAM;AACjE,YAAAjB,KAAUA,EAAO;AACnB,iBAAOA,EAAO,KAAK;AAAA,MACrB;AAGK,aAAA;AAAA,IAAA;AAIT,UAAM,EAAE,SAASgI,GAAa,sBAAA9D,EAAyB,IAAAJ;AAAA,MACrD7D;AAAA,MACAR;AAAA,MACAiB,EAAS,MAAOjB,EAAM,MAAM,WAAWyH,EAAK,QAAQA,EAAK,MAAM,CAAC,CAAE;AAAA,MAClExG,EAAS,MAAMO,KAAA,gBAAAA,EAAO,MAAM;AAAA,MAC5B8G;AAAA,IACF;AAEA,aAASxD,EAAQ0D,GAAU;;AACzB,MAAIA,EAAI,aAAW1F,IAAAtC,EAAS,UAAT,gBAAAsC,EAAgB,SACvByF,EAAA,GAGRhB,EAAc,UAAU,cAC1BF,EAAY,QAAQ;AAAA,IACtB;AAGF,mBAAezC,EAAc4D,GAAW;;AACtC,WAAK1F,IAAA0F,KAAA,gBAAAA,EAAK,kBAAL,QAAA1F,EAAoC,QAAQ,qBAAsB;AACvE,MAAAuE,EAAY,QAAQ;AAGd,YAAAxC,IAAmB,MAAMyD,EAAuB;AAEtD,MAAIzD,MAAqB,MACvB7E,EAAM,MAAM,QAAQ,IACdA,EAAA,MAAM,QAAQA,EAAM,MAAM,WAAWyH,EAAK,QAAQA,EAAK,MAAM,CAAC,KAEpEzH,EAAM,MAAM,QACV,OAAO6E,KAAqB,WAAWA,IAAmB,qBAGxD,MAAAJ,EAAqBI,MAAqB,EAAI;AAAA,IAAA;AAGtD,mBAAe8C,IAAgB;AAC7B,YAAMc,IAA0B,CAAC;AAEjC,UAAI,OAAOzI,EAAM,MAAM,WAAY,YAAY;AAC7C,cAAM0I,IAAM,MAAM1I,EAAM,MAAM,QAAQF,EAAO,KAAK;AACzC,QAAA2I,EAAA,KAAK,GAAGC,EAAI,OAAO,OAAK,CAAC,CAAChB,EAAE,KAAK,CAAC;AAAA,MAAA;AAElC,QAAAe,EAAA,KAAK,GAAG5I,GAAmBG,EAAM,MAAM,WAAW,CAAC,GAAGF,EAAO,KAAK,CAAC;AAG9E,MAAA2H,EAAK,MAAM,QAAQ,CAAAkB,MAAOjJ,EAAYiJ,GAAKF,CAAQ,CAAC,GACpDjJ,EAAQ,QAAQiJ;AAAA,IAAA;AAGlB,aAASb,IAAa;AACd,YAAA5C,IAAehF,EAAM,MAAM;AACjC,MAAIgF,MACE,MAAM,QAAQA,CAAY,IAC5BA,EAAa,QAAQ,CAAOvF,MAAAC,EAAYD,GAAKD,EAAQ,KAAK,CAAC,IAE/CE,EADH,OAAOsF,KAAiB,WACrBA,IAGV;AAAA,QACE,OAAOA;AAAA,QACP,OAAOA;AAAA,MACT,GANwBxF,EAAQ,KAAK;AAAA,IAU3C;AAGW,WAAA2C,EAAA;AAAA,MACX,eAAAyC;AAAA,MACA,SAAAG;AAAA,MACA,WAAW,MAAO/E,EAAM,MAAM,QAAQ,CAACA,EAAM,MAAM,KAAK,IAAI,CAAA;AAAA,IAAC,CAC9D,mBA9SC0C,EA8CM,OAAA;AAAA,MA9CD,OAAM;AAAA,MAA0B,YAAUkC;AAAA,eAAmB;AAAA,MAAJ,KAAIwC;AAAA,IAAA;MAChE7E,EAiCYF,EAAAuD,EAAA,GAAA;AAAA,iBAhCN;AAAA,QAAJ,KAAIpF;AAAA,oBACKV,EAAM;AAAA,sDAANA,EAAM,QAAAsD;AAAA,QACd,MAAMpD,EAAK,MAAC,QAAI;AAAA,QAChB,mBAAiBA,EAAK,MAAC,kBAAc;AAAA,QACrC,MAAMvD,EAAI,QAAA;AAAA,QACV,UAAUuD,EAAK,MAAC;AAAA,QAChB,cAAYA,EAAK,MAAC;AAAA,QAClB,WAAWA,EAAK,MAAC;AAAA,QACjB,aAAajD,EAAW;AAAA,QACxB,UAAUiD,EAAK,MAAC;AAAA,QAChB,SAASA,EAAK,MAAC;AAAA,QACf,YAAW8E;AAAA,QACX,UAAU;AAAA,QACV,SAAOgD;AAAA,MAAA;mBAER,MAA6B;AAAA,UAA7BvF,EAA6BsD,IAAA,EAAhB,OAAO7F,EAAK,MAAA,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,UACRA,EAAA,MAAM,iBAAvBoC,EAIYC,EAAAkD,CAAA,GAAA;AAAA;YAJqB,OAAA,EAA0B,OAAA,cAAA;AAAA,YAAC,MAAK;AAAA,UAAA;uBACrD,MAA4B;AAAA,eAAtC9C,EAAA,EAAA,GAAAC,EAEWC,GAFsB,MAAAkB,EAAA4D,EAAA,OAAf,CAAAkB,GAAKhJ,YAAvByC,EAEWC,EAAAuG,EAAA,GAAA,EAF6B,KAAKjJ,KAAK;AAAA,2BAChD,MAAsC;AAAA,kBAAtC4C,EAAsCF,EAAAkD,CAAA,GAAA,MAAA;AAAA,+BAA3B,MAAe;AAAA,sBAAZvB,EAAAC,EAAA0E,EAAI,KAAK,GAAA,CAAA;AAAA,oBAAA;;;;;;;;sBAG3BvG,EAEYC,EAAAkD,CAAA,GAAA;AAAA;YAFD,MAAK;AAAA,YAAe,OAAM;AAAA,UAAA;uBACnC,MAA0B;;AAAA;AAAA,gBAAvBvB,EAAAC,IAAAnB,IAAA2E,EAAA,aAAA,gBAAA3E,EAAS,UAAK,EAAA,GAAA,CAAA;AAAA,cAAA;AAAA;;;UAEnBP,EAA2CF,EAAA6E,CAAA,GAAA;AAAA,YAAjC,MAAK;AAAA,YAAO,MAAM7E,EAAWwG,EAAA;AAAA;UAI/BpB,EAAI,MAAC,SAAM,KAAQ3H,EAAM,cAHjCsC,EAMEC,EAAA6E,CAAA,GAAA;AAAA;YALA,MAAK;AAAA,YACJ,MAAM7E,EAAKyG,EAAA;AAAA,YAEX,SAAO/D;AAAA,YACR,OAAA,EAAuB,WAAA,SAAA;AAAA,UAAA;;;;MAKnBsC,EAAA,SAAe7H,EAAA,MAAQ,cAAc+H,EAAa,UAAA,kBAD1DnF,EASWC,EAAA0G,EAAA,GAAA;AAAA;QAPT,OAAKC,GAAA,CAAC,oBACExB,EAAe,KAAA,CAAA;AAAA,MAAA;mBAEN,MAAyB;AAAA,kBAA1C9E,EAGWC,GAAA,MAAAkB,EAHuBrE,EAAO,OAAA,CAAjBD,YAAxB6C,EAGWC,EAAA4G,EAAA,GAAA;AAAA,YAHD,QAAA;AAAA,YAAkC,KAAK1J,EAAO;AAAA,YAAQ,SAAK,CAAA6D,MAAEyE,EAAStI,CAAM;AAAA,UAAA;uBACpF,MAA+E;AAAA,cAAlBS,EAAA,MAAM,iBAAnEoC,EAA+EC,EAAA6G,EAAA,GAAA;AAAA;gBAAjE,MAAK;AAAA,gBAAS,SAAS3J,EAAO;AAAA,cAAA;cAC5CgD,EAAyCF,EAAAkD,CAAA,GAAA,MAAA;AAAA,2BAA9B,MAAkB;AAAA,kBAAfvB,EAAAC,EAAA1E,EAAO,KAAK,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ACRlC,UAAMiC,IAAQC,GACRzB,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAAoC,IAAI,GACnDhE,IAAQgE,EAAIL,EAAM,MAAM,KAAe,GACvCuE,IAAStD,EAAS,MAAMO,EAAM,MAAM,GAGpC,EAAE,eAAAoD,GAAe,SAAAE,GAAS,SAAAC,GAAS,WAAAE,EAAc,IAAAZ;AAAA,MACrD7D;AAAA,MACAR;AAAA,MACA3D;AAAA,MACAkI;AAAA,IACF;AAEA,WAAAxC;AAAA,MACE,MAAM/B,EAAM,MAAM;AAAA,MAClB,CAAAuB,MAAMlF,EAAM,QAAQkF;AAAA,IACtB,GAEaY,EAAA;AAAA,MACX,SAAA4C;AAAA,MACA,eAAAH;AAAA,MACA,WAAAK;AAAA,IAAA,CACD,mBA1DC7C,EAyBeC,EAAA8G,EAAA,GAAA;AAAA,eAxBT;AAAA,MAAJ,KAAI3I;AAAA,kBACKnE,EAAK;AAAA,oDAALA,EAAK,QAAA+G;AAAA,MACb,eAAa;AAAA,MACb,MAAMpD,EAAK,MAAC,QAAI;AAAA,MAChB,mBAAiBA,EAAK,MAAC,kBAAc;AAAA,MACrC,UAAUA,EAAK,MAAC;AAAA,MAChB,cAAYA,EAAK,MAAC;AAAA,MAClB,WAAWA,EAAK,MAAC;AAAA,MACjB,aAAaA,EAAK,MAAC;AAAA,MACnB,UAAUA,EAAK,MAAC;AAAA,MAChB,SAASA,EAAK,MAAC;AAAA,MACf,KAAKA,EAAK,MAAC;AAAA,MACX,KAAKA,EAAK,MAAC;AAAA,MACX,MAAMA,EAAK,MAAC;AAAA,MACZ,MAAMA,EAAK,MAAC;AAAA,MACZ,aAAWA,EAAK,MAAC;AAAA,MACjB,cAAYA,EAAK,MAAC;AAAA,MAClB,cAAYA,EAAK,MAAC;AAAA,MAClB,SAASA,EAAK,MAAC;AAAA,MACf,YAAUqC,EAAOyC,CAAA;AAAA,MACjB,aAAWzC,EAAauC,CAAA;AAAA,MACxB,WAAUvC,EAAauC,CAAA;AAAA,IAAA;iBAExB,MAA6B;AAAA,QAA7BrC,EAA6BsD,IAAA,EAAhB,OAAO7F,EAAK,MAAA,GAAA,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;;;;;;;;AC2BvB,UAAAA,IAAQ0F,iBAAgE,GACxE0D,IAAY/I,EAAkB,EAAE,GAGhC,EAAE,aAAAD,GAAa,WAAAO,GAAW,eAAAC,GAAe,kBAAAC,EAAA,IAAqBV,GAAkB,GAEhFmE,IAAarD,EAAwB,MAClCmI,EAAU,MAAM,IAAI,CAACC,GAAO1J,OAAW;AAAA,MAC5C,OAAO,OAAOA,IAAQ,CAAC;AAAA,MACvB,OAAOA;AAAA,MACP,OAAO,OAAO,QAAQ0J,CAAK,EAAE;AAAA,QAC3B,CAACnI,GAAK,CAACI,GAAIxC,CAAK,OACVoC,EAAAI,CAAE,IAAIxC,EAAM,OACToC;AAAA,QAET,CAAA;AAAA,MAAC;AAAA,IACH,EACA,CACH;AAED,IAAAa;AAAA,MACEuC;AAAA,MACA,CAAS1G,MAAA;AACP,QAAAoC,EAAM,MAAM,QAAQpC;AAAA,MACtB;AAAA,MACA,EAAE,MAAM,IAAM,WAAW,GAAK;AAAA,IAChC,GAEAkJ,GAAUwC,CAAM;AAEhB,aAASA,IAAS;AACZ,MAAAtJ,EAAM,MAAM,YACdoJ,EAAU,MAAM,KAAKnK,GAAsBe,EAAM,MAAM,QAAQ,CAAC;AAAA,IAClE;AAGF,aAASuJ,EAAU5J,GAAe;AACtB,MAAAyJ,EAAA,MAAM,OAAOzJ,GAAO,CAAC;AAAA,IAAA;AAGjC,aAASoF,IAAU;AACP,MAAApE,EAAA;AAAA,IAAA;AAGZ,aAASsE,IAAY;AACnB,aAAOrE,EAAc;AAAA,IAAA;AAGvB,mBAAegE,IAAgB;AAC7B,YAAM/D,EAAiB;AAAA,IAAA;AAGZ,WAAAsB,EAAA;AAAA,MACX,eAAAyC;AAAA,MACA,SAAAG;AAAA,MACA,WAAAE;AAAA,IAAA,CACD,cA3GCxC,EAAA,EAAA,GAAAC,EAiCMC,GAjCwB,MAAAkB,EAAAuF,EAAA,OAAjB,CAAAC,GAAO1J,YAApB+C,EAiCM,OAAA;AAAA,MAjCmC,OAAM;AAAA,MAAwB,KAAK/C;AAAA,IAAA;MAC1E6J,GAuBM,OAvBNC,IAuBM;AAAA,QAtBJlH,EAqBUF,EAAAG,EAAA,GAAA,MAAA;AAAA,qBApBE,MAAoC;AAAA,aAA9CC,EAAA,EAAA,GAAAC,EAmBWC,WAnBgB,OAAO,KAAK0G,CAAK,IAA3BzG,MAAM;;;gBASbP,EAAAxD,EAAA,EAAewK,EAAMzG,CAAM,GAAG7D,EAAAA,MAAMC,EAAY,YAAA,UARxDoD,EAiBSC,EAAAQ,EAAA,GAAA;AAAA,kBAhBN,KAAG,GAAKlD,CAAK,IAAIiD,CAAM;AAAA,kBACvB,QAAME,IAAAuG,EAAMzG,CAAM,EAAE,SAAd,gBAAAE,EAAoB,OAAE;AAAA,kBAC5B,YAASC,IAAAsG,EAAMzG,CAAM,EAAE,SAAd,gBAAAG,EAAoB;AAAA,kBAC7B,YAASC,IAAAqG,EAAMzG,CAAM,EAAE,SAAd,gBAAAI,EAAoB;AAAA,kBAC7B,YAASC,IAAAoG,EAAMzG,CAAM,EAAE,SAAd,gBAAAK,EAAoB;AAAA,kBAC7B,YAASC,IAAAmG,EAAMzG,CAAM,EAAE,SAAd,gBAAAM,EAAoB;AAAA,kBAC9B,OAAM;AAAA,gBAAA;6BAGN,MAME;AAAA,qBANFT,EAAA,GAAAL,EAMEe,GALKkG,EAAMzG,CAAM,EAAE,IAAI,GAAA;AAAA,sBACd,YAAAyG,EAAMzG,CAAM;AAAA,sBAAZ,uBAAA,CAAAQ,MAAAiG,EAAMzG,CAAM,IAAAQ;AAAA,sBACpB,QAAQiG;AAAA,sBACR,WAAO,GAAK1J,CAAK,IAAIiD,CAAM;AAAA;+BACxB;AAAA,sBAAJ,KAAIxC;AAAA,oBAAA;;;;;;;;;;MAMdoJ,GAOM,OAPNE,IAOM;AAAA,QAN8C/J,MAAUyJ,EAAS,MAAC,SAAM,UAA5EhH,EAEaC,EAAAoB,CAAA,GAAA;AAAA;UAFA,SAAO6F;AAAA,UAAQ,OAAM;AAAA,QAAA;qBAChC,MAAkD;AAAA,YAAlD/G,EAAkDF,EAAA6E,CAAA,GAAA;AAAA,cAAxC,MAAK;AAAA,cAAa,MAAM7E,EAAGsH,EAAA;AAAA,YAAA;;;;QAEqBP,EAAA,MAAU,SAAM,UAA5EhH,EAEaC,EAAAoB,CAAA,GAAA;AAAA;UAFA,SAAK,CAAAL,MAAEmG,EAAU5J,CAAK;AAAA,UAAG,OAAM;AAAA,QAAA;qBAC1C,MAAqD;AAAA,YAArD4C,EAAqDF,EAAA6E,CAAA,GAAA;AAAA,cAA3C,MAAK;AAAA,cAAa,MAAM7E,EAAMuH,EAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;ACThD,UAAMpI,IAAQC,GACRzB,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAAoC,IAAI,GACnDhE,IAAQgE,EAAIL,EAAM,MAAM,KAAgB,GACxCuE,IAAStD,EAAS,MAAMO,EAAM,MAAM,GAGpCqI,IAAwB5I,EAAS,MAAMlB,GAAaC,EAAM,KAAK,CAAC,GAGhE,EAAE,eAAA4E,GAAe,SAAAE,GAAS,WAAAG,MAAcZ,EAAmB7D,GAAUR,GAAO3D,GAAOkI,CAAM;AAG/F,aAASQ,IAAU;AACjB,MAAA1I,EAAM,QAAQ,IACd2D,EAAM,MAAM,QAAQ,IACpBA,EAAM,MAAM,QAAQ;AAAA,IAAA;AAGtB,WAAA+B;AAAA,MACE,MAAM/B,EAAM,MAAM;AAAA,MAClB,CAAA,MAAM3D,EAAM,QAAQ;AAAA,IACtB,GAEa8F,EAAA;AAAA,MACX,eAAAyC;AAAA,MACA,SAAAG;AAAA,MACA,WAAAE;AAAA,IAAA,CACD,mBAjDC7C,EAWeC,EAAA6G,EAAA,GAAA;AAAA,kBAVJ7M,EAAK;AAAA,oDAALA,EAAK,QAAA+G;AAAA,eACV;AAAA,MAAJ,KAAI5C;AAAA,MACH,UAAUR,EAAK,MAAC;AAAA,MAChB,cAAYA,EAAK,MAAC;AAAA,MAClB,UAAUA,EAAK,MAAC;AAAA,MAChB,YAAUqC,EAAOyC,CAAA;AAAA,MACjB,aAAWzC,EAAauC,CAAA;AAAA,MACxB,WAAUvC,EAAauC,CAAA;AAAA,IAAA;iBAExB,MAA2B;AAAA,YAAxBiF,EAAqB,KAAA,GAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;;;ACoB5B,UAAMrI,IAAQC,GACRzB,IAAQ0F,iBAAgE,GACxElF,IAAWH,EAAoC,IAAI,GACnDhE,IAAQgE,EAAIL,EAAM,MAAM,KAA2B,GACnDuE,IAAStD,EAAS,MAAMO,EAAM,MAAM,GACpChC,IAAUa,EAAc,EAAE,GAE1ByJ,IAAW7I,EAAS,MAAMlB,GAAaC,EAAM,KAAK,CAAC,GAEnD+J,IAAiB9I,EAA0B,MACxCjB,EAAM,MAAM,iBAAkBA,EAAM,MAAM,iBAAqC,KACvF,GAGK,EAAE,eAAA4E,GAAe,SAAAE,GAAS,WAAAG,MAAcZ,EAAmB7D,GAAUR,GAAO3D,GAAOkI,CAAM;AAG/F,aAASQ,IAAU;AACjB,MAAA/E,EAAM,MAAM,QAAQ,IACpB3D,EAAM,QAAQ,QACd2D,EAAM,MAAM,QAAQ;AAAA,IAAA;AAIb,aAAAgK,EAAYC,GAAWC,GAAoB;AAC3C,aAAAD,EAAE,UAAUC,EAAE;AAAA,IAAA;AAGvB,mBAAeC,IAAoB;AACjC,MAAI,OAAOnK,EAAM,MAAM,WAAY,aACjCR,EAAQ,QAAQ,MAAMQ,EAAM,MAAM,QAAQ,IAElCR,EAAA,QAAQQ,EAAM,MAAM;AAAA,IAC9B;AAGF,WAAA+B;AAAA,MACE,MAAM/B,EAAM,MAAM;AAAA,MAClB,CAAAuB,MAAMlF,EAAM,QAAQkF;AAAA,IACtB,GAEaY,EAAA;AAAA,MACX,eAAAyC;AAAA,MACA,SAAAG;AAAA,MACA,WAAAE;AAAA,IAAA,CACD,GAED6B,GAAUqD,CAAiB,mBA7EzB/H,EAqBkBC,EAAA+H,EAAA,GAAA;AAAA,kBApBP/N,EAAK;AAAA,oDAALA,EAAK,QAAA+G;AAAA,eACV;AAAA,MAAJ,KAAI5C;AAAA,MACH,UAAUR,EAAK,MAAC;AAAA,MAChB,aAAW8J,EAAQ;AAAA,MACnB,cAAY9J,EAAK,MAAC;AAAA,MAClB,UAAUA,EAAK,MAAC;AAAA,MAChB,aAAAgK;AAAA,MACA,YAAU3H,EAAOyC,CAAA;AAAA,MACjB,aAAWzC,EAAauC,CAAA;AAAA,MACxB,WAASvC,EAAauC,CAAA;AAAA,IAAA;iBAGrB,MAAyB;AAAA,gBAD3BlC,EAQYC,GAAA,MAAAkB,EAPOrE,EAAO,OAAA,CAAjBD,YADT6C,EAQYC,EAAAgI,EAAA,GAAA;AAAA,UANT,KAAK9K,EAAO;AAAA,UACZ,OAAOA;AAAA,UACP,UAAUS,EAAK,MAAC;AAAA,UAChB,mBAAiB+J,EAAc;AAAA,QAAA;qBAEhC,MAAkB;AAAA,YAAf/F,EAAAC,EAAA1E,EAAO,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;ICNR+K,KAAgB;AAAA,EAC3B,QAAQC,GAAU;AACZ,IAAAA,EAAA,UAAU,SAASC,EAAI,GACvBD,EAAA,UAAU,aAAaE,EAAS,GAChCF,EAAA,UAAU,aAAaG,EAAS,GAChCH,EAAA,UAAU,eAAeI,EAAW,GACpCJ,EAAA,UAAU,cAAcK,EAAU,GAClCL,EAAA,UAAU,iBAAiBM,EAAa,GACxCN,EAAA,UAAU,eAAeO,EAAW,GACpCP,EAAA,UAAU,iBAAiBQ,EAAa,GACxCR,EAAA,UAAU,eAAeS,EAAW,GACpCT,EAAA,UAAU,iBAAiBU,EAAa,GACxCV,EAAA,UAAU,cAAcW,EAAU,GAClCX,EAAA,UAAU,WAAWY,EAAO;AAAA,EAAA;AAEpC;"}