@pupt/react 0.0.1 → 1.2.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.
- package/LICENSE +21 -0
- package/README.md +806 -28
- package/dist/index.cjs +1092 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +922 -0
- package/dist/index.js +1060 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/hooks/usePuptLibrary.ts","../src/components/PuptLibraryProvider.tsx","../src/context/PuptContext.tsx","../src/utils/transform.ts","../src/utils/validation.ts","../src/hooks/useAskIterator.ts","../src/components/AskHandler.tsx","../src/components/PromptEditor.tsx","../src/hooks/usePupt.ts","../src/hooks/usePromptRender.ts","../src/components/PromptRenderer.tsx","../src/components/PuptProvider.tsx","../src/hooks/useFormula.ts","../src/hooks/usePostActions.ts","../src/hooks/usePromptSearch.ts","../src/hooks/usePuptLibraryContext.ts","../src/index.ts"],"sourcesContent":["/**\n * usePuptLibrary - Hook wrapping the Pupt class for prompt library management\n */\n\nimport {\n type DiscoveredPromptWithMethods,\n type ModuleEntry,\n Pupt,\n type PuptInitConfig,\n type SearchEngineConfig,\n} from \"@pupt/lib\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { UsePuptLibraryOptions, UsePuptLibraryReturn } from \"../types/hooks\";\n\n/**\n * Hook that wraps the Pupt class with React state management.\n *\n * Creates a Pupt instance, loads modules, and exposes discovered prompts.\n * Re-initializes when the modules list changes.\n *\n * @example\n * ```tsx\n * const { prompts, isLoading, addModule } = usePuptLibrary({\n * modules: [\"@my-org/prompts\"],\n * });\n * ```\n */\nexport function usePuptLibrary(options: UsePuptLibraryOptions = {}): UsePuptLibraryReturn {\n const { modules: initialModules = [], searchConfig } = options;\n\n const [modules, setModules] = useState<ModuleEntry[]>(initialModules);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [prompts, setPrompts] = useState<DiscoveredPromptWithMethods[]>([]);\n const [tags, setTags] = useState<string[]>([]);\n\n const puptRef = useRef<Pupt | null>(null);\n const searchConfigRef = useRef<SearchEngineConfig | undefined>(searchConfig);\n searchConfigRef.current = searchConfig;\n\n // Initialize/re-initialize Pupt when modules change\n useEffect(() => {\n let cancelled = false;\n\n async function init(): Promise<void> {\n setIsLoading(true);\n setError(null);\n\n try {\n const config: PuptInitConfig = { modules };\n if (searchConfigRef.current) {\n config.searchConfig = searchConfigRef.current;\n }\n const pupt = new Pupt(config);\n await pupt.init();\n\n if (cancelled) {\n return;\n }\n\n puptRef.current = pupt;\n setPrompts(pupt.getPrompts());\n setTags(pupt.getTags());\n } catch (err) {\n if (cancelled) {\n return;\n }\n setError(err instanceof Error ? err : new Error(String(err)));\n setPrompts([]);\n setTags([]);\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n void init();\n\n return () => {\n cancelled = true;\n };\n }, [modules]);\n\n const getPrompt = useCallback(\n (name: string): DiscoveredPromptWithMethods | undefined => {\n return puptRef.current?.getPrompt(name);\n },\n [prompts],\n );\n\n const getPromptsByTag = useCallback(\n (tag: string): DiscoveredPromptWithMethods[] => {\n return puptRef.current?.getPromptsByTag(tag) ?? [];\n },\n [prompts],\n );\n\n const addModule = useCallback((source: ModuleEntry): void => {\n setModules((prev) => {\n if (prev.includes(source)) {\n return prev;\n }\n return [...prev, source];\n });\n }, []);\n\n const removeModule = useCallback((source: ModuleEntry): void => {\n setModules((prev) => prev.filter((m) => m !== source));\n }, []);\n\n return {\n isLoading,\n error,\n prompts,\n tags,\n getPrompt,\n getPromptsByTag,\n addModule,\n removeModule,\n modules,\n };\n}\n","/**\n * PuptLibraryProvider - Context provider for prompt library management\n */\n\nimport { createContext, useMemo } from \"react\";\n\nimport { usePuptLibrary } from \"../hooks/usePuptLibrary\";\nimport type { UsePuptLibraryOptions, UsePuptLibraryReturn } from \"../types/hooks\";\n\n/**\n * Context value for PuptLibraryProvider\n */\nexport const PuptLibraryContext = createContext<UsePuptLibraryReturn | null>(null);\nPuptLibraryContext.displayName = \"PuptLibraryContext\";\n\n/**\n * Props for PuptLibraryProvider\n */\ninterface PuptLibraryProviderProps extends UsePuptLibraryOptions {\n children: React.ReactNode;\n}\n\n/**\n * Provider component that wraps usePuptLibrary and provides library state via context.\n *\n * @example\n * ```tsx\n * <PuptLibraryProvider modules={[\"@my-org/prompts\"]}>\n * <MyApp />\n * </PuptLibraryProvider>\n * ```\n */\nexport function PuptLibraryProvider({ children, modules, searchConfig }: PuptLibraryProviderProps): React.ReactElement {\n const opts: UsePuptLibraryOptions = {};\n if (modules) {\n opts.modules = modules;\n }\n if (searchConfig) {\n opts.searchConfig = searchConfig;\n }\n const library = usePuptLibrary(opts);\n\n const value = useMemo(\n () => library,\n [library.isLoading, library.error, library.prompts, library.tags, library.modules],\n );\n\n return <PuptLibraryContext.Provider value={value}>{children}</PuptLibraryContext.Provider>;\n}\n","/**\n * PuptContext - React context for pupt-lib integration\n */\n\nimport { createContext } from \"react\";\n\nimport type { PuptContextValue } from \"../types/context\";\n\n/**\n * Default context value when no provider is present\n */\nconst defaultContextValue: PuptContextValue = {\n _initialized: false,\n searchEngine: null,\n prompts: [],\n renderOptions: {},\n environment: {},\n isLoading: false,\n error: null,\n};\n\n/**\n * React context for pupt-lib functionality\n *\n * Provides access to:\n * - SearchEngine for prompt searching\n * - Default render options\n * - Environment context\n *\n * @example\n * ```tsx\n * import { useContext } from 'react';\n * import { PuptContext } from '@pupt/react';\n *\n * function MyComponent() {\n * const { searchEngine, isLoading, error } = useContext(PuptContext);\n * // ...\n * }\n * ```\n */\nexport const PuptContext = createContext<PuptContextValue>(defaultContextValue);\n\n// Set display name for React DevTools\nPuptContext.displayName = \"PuptContext\";\n","/**\n * Utility functions for prompt transformation and rendering\n */\n\nimport {\n CHILDREN,\n createInputIterator,\n createPromptFromSource,\n type InputRequirement,\n isPuptElement,\n type PuptElement,\n} from \"@pupt/lib\";\n\n/**\n * Options for transformSource function\n */\nexport interface TransformOptions {\n /** Filename for error messages (default: \"prompt.tsx\") */\n filename?: string;\n}\n\n/**\n * Transform source code string into a PuptElement.\n * Delegates to pupt-lib's createPromptFromSource.\n *\n * @param source - TSX/JSX source code (should export default a PuptElement)\n * @param options - Transform options including filename\n * @returns Promise resolving to the transformed PuptElement\n */\nexport async function transformSource(source: string, options: TransformOptions = {}): Promise<PuptElement> {\n const { filename = \"prompt.tsx\" } = options;\n return createPromptFromSource(source, filename);\n}\n\n/**\n * Options for extractInputRequirements\n */\nexport interface ExtractOptions {\n /** Pre-supply values to skip during iteration */\n values?: Record<string, unknown>;\n}\n\n/**\n * Extract input requirements from a PuptElement by traversing its tree\n * and finding Ask components.\n *\n * Uses createInputIterator with validation disabled, submitting placeholder\n * values to advance through all requirements.\n *\n * @param element - The PuptElement to extract requirements from\n * @param options - Optional configuration including pre-supplied values\n * @returns Array of InputRequirement objects\n */\nexport async function extractInputRequirements(\n element: PuptElement,\n options?: ExtractOptions,\n): Promise<InputRequirement[]> {\n try {\n const iteratorOpts: Parameters<typeof createInputIterator>[1] = {\n validateOnSubmit: false,\n environment: \"browser\",\n };\n if (options?.values) {\n iteratorOpts.values = options.values;\n }\n const iterator = createInputIterator(element, iteratorOpts);\n\n const requirements: InputRequirement[] = [];\n\n // start() is async - must await\n await iterator.start();\n\n while (!iterator.isDone()) {\n const current = iterator.current();\n if (current) {\n requirements.push(current);\n // Submit a placeholder value to advance (validation is disabled)\n await iterator.submit(undefined);\n }\n // advance() is async - must await\n await iterator.advance();\n }\n\n return requirements;\n } catch {\n // If input iterator fails, return empty array\n // This can happen if the element has no Ask components\n return [];\n }\n}\n\n/**\n * Check if a PuptElement type represents an Ask component\n */\nexport function isAskComponent(type: string | symbol): boolean {\n if (typeof type === \"string\") {\n return type.startsWith(\"Ask.\") || type === \"Ask\";\n }\n return false;\n}\n\n/**\n * Recursively traverse a PuptElement tree and call a visitor function\n * for each element.\n */\nexport function traverseElement(element: PuptElement, visitor: (element: PuptElement) => void): void {\n visitor(element);\n\n // Use CHILDREN symbol to access children (pupt-lib uses symbol keys)\n const children = element[CHILDREN];\n if (children) {\n if (Array.isArray(children)) {\n for (const child of children) {\n if (isElement(child)) {\n traverseElement(child, visitor);\n }\n }\n } else if (isElement(children)) {\n traverseElement(children as PuptElement, visitor);\n }\n }\n}\n\n/**\n * Type guard to check if a value is a PuptElement\n */\nexport function isElement(value: unknown): value is PuptElement {\n return isPuptElement(value);\n}\n","/**\n * Input validation utilities for Ask components\n */\n\nimport type { InputRequirement, ValidationError, ValidationResult } from \"@pupt/lib\";\n\n/**\n * Validate a value against an InputRequirement's constraints.\n *\n * @param requirement - The input requirement to validate against\n * @param value - The value to validate\n * @returns A ValidationResult indicating success or failure\n */\nexport function validateInput(requirement: InputRequirement, value: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n\n // Type-specific validation\n switch (requirement.type) {\n case \"number\":\n if (typeof value !== \"number\" || isNaN(value)) {\n errors.push({\n field: requirement.name,\n message: `Expected a number, got ${typeof value}`,\n code: \"INVALID_TYPE\",\n });\n } else {\n if (requirement.min !== undefined && value < requirement.min) {\n errors.push({\n field: requirement.name,\n message: `Value ${value} is below minimum ${requirement.min}`,\n code: \"BELOW_MIN\",\n });\n }\n if (requirement.max !== undefined && value > requirement.max) {\n errors.push({\n field: requirement.name,\n message: `Value ${value} exceeds maximum ${requirement.max}`,\n code: \"ABOVE_MAX\",\n });\n }\n }\n break;\n\n case \"boolean\":\n if (typeof value !== \"boolean\") {\n errors.push({\n field: requirement.name,\n message: `Expected a boolean, got ${typeof value}`,\n code: \"INVALID_TYPE\",\n });\n }\n break;\n\n case \"select\":\n if (requirement.options && requirement.options.length > 0) {\n const validValues = requirement.options.map((o) => o.value);\n if (!validValues.includes(String(value))) {\n errors.push({\n field: requirement.name,\n message: `Invalid selection. Valid options: ${validValues.join(\", \")}`,\n code: \"INVALID_OPTION\",\n });\n }\n }\n break;\n\n case \"multiselect\":\n if (!Array.isArray(value)) {\n errors.push({\n field: requirement.name,\n message: \"Expected an array for multiselect\",\n code: \"INVALID_TYPE\",\n });\n }\n break;\n\n case \"string\":\n case \"secret\":\n if (typeof value !== \"string\" && value !== undefined && value !== null) {\n errors.push({\n field: requirement.name,\n message: `Expected a string, got ${typeof value}`,\n code: \"INVALID_TYPE\",\n });\n }\n if (typeof value === \"string\") {\n if (requirement.min !== undefined && value.length < requirement.min) {\n errors.push({\n field: requirement.name,\n message: `Value must be at least ${requirement.min} characters`,\n code: \"TOO_SHORT\",\n });\n }\n if (requirement.max !== undefined && value.length > requirement.max) {\n errors.push({\n field: requirement.name,\n message: `Value must be at most ${requirement.max} characters`,\n code: \"TOO_LONG\",\n });\n }\n }\n break;\n default:\n break;\n }\n\n // Required field check (applies to all types)\n if (requirement.required && (value === undefined || value === null || value === \"\")) {\n errors.push({\n field: requirement.name,\n message: `${requirement.label || requirement.name} is required`,\n code: \"REQUIRED\",\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings: [],\n };\n}\n","/**\n * useAskIterator hook - Iterates through Ask components and collects user input\n */\n\nimport { createInputIterator, type InputRequirement, type ValidationResult } from \"@pupt/lib\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { UseAskIteratorOptions, UseAskIteratorReturn } from \"../types/hooks\";\nimport { extractInputRequirements } from \"../utils/transform\";\nimport { validateInput } from \"../utils/validation\";\n\n/**\n * Hook for iterating through Ask components in a PuptElement and collecting\n * validated user input.\n *\n * Provides a wizard-like interface for stepping through input requirements,\n * validating submissions, and navigating back to previous inputs.\n *\n * @param options - Configuration including the element to iterate and callbacks\n * @returns Object containing current state, navigation, and submission functions\n *\n * @example\n * ```tsx\n * function InputCollector({ element }) {\n * const { current, submit, isDone, inputs } = useAskIterator({ element });\n *\n * if (isDone) return <div>All inputs collected!</div>;\n * if (!current) return <div>Loading...</div>;\n *\n * return (\n * <div>\n * <label>{current.label}</label>\n * <input onKeyDown={(e) => {\n * if (e.key === 'Enter') submit(e.currentTarget.value);\n * }} />\n * </div>\n * );\n * }\n * ```\n */\nexport function useAskIterator(options: UseAskIteratorOptions): UseAskIteratorReturn {\n const { element, onComplete, initialValues, preSuppliedValues, onMissingDefault } = options;\n\n // State\n const [requirements, setRequirements] = useState<InputRequirement[]>([]);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [values, setValues] = useState<Map<string, unknown>>(() => new Map(initialValues));\n const [isLoading, setIsLoading] = useState(false);\n\n // Ref for onComplete to avoid re-triggering effects on callback change\n const onCompleteRef = useRef(onComplete);\n onCompleteRef.current = onComplete;\n\n // Track whether onComplete has been called for the current set of values\n const completedRef = useRef(false);\n\n // Extract requirements when element changes\n useEffect(() => {\n if (!element) {\n setRequirements([]);\n setCurrentIndex(0);\n setValues(new Map(initialValues));\n completedRef.current = false;\n return undefined;\n }\n\n let cancelled = false;\n setIsLoading(true);\n\n const extractOpts = preSuppliedValues ? { values: preSuppliedValues } : undefined;\n void extractInputRequirements(element, extractOpts).then((reqs) => {\n if (!cancelled) {\n setRequirements(reqs);\n setCurrentIndex(0);\n setValues(new Map(initialValues));\n completedRef.current = false;\n setIsLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [element, initialValues, preSuppliedValues]);\n\n // Derived state\n const totalInputs = requirements.length;\n const isDone = totalInputs > 0 ? currentIndex >= totalInputs : !isLoading;\n const current: InputRequirement | null = currentIndex < totalInputs ? (requirements[currentIndex] ?? null) : null;\n\n // Call onComplete when done\n useEffect(() => {\n if (isDone && totalInputs > 0 && !completedRef.current) {\n completedRef.current = true;\n onCompleteRef.current?.(new Map(values));\n }\n }, [isDone, totalInputs, values]);\n\n // Submit value for current requirement\n const submit = useCallback(\n (value: unknown): Promise<ValidationResult> => {\n if (!current) {\n return Promise.resolve({\n valid: false,\n errors: [{ field: \"\", message: \"No current requirement\", code: \"NO_REQUIREMENT\" }],\n warnings: [],\n });\n }\n\n const result = validateInput(current, value);\n\n if (result.valid) {\n setValues((prev) => {\n const next = new Map(prev);\n next.set(current.name, value);\n return next;\n });\n setCurrentIndex((prev) => prev + 1);\n }\n\n return Promise.resolve(result);\n },\n [current],\n );\n\n // Navigate to previous input\n const previous = useCallback(() => {\n setCurrentIndex((prev) => Math.max(0, prev - 1));\n completedRef.current = false;\n }, []);\n\n // Navigate to a specific index\n const goTo = useCallback(\n (index: number) => {\n if (index >= 0 && index < totalInputs) {\n setCurrentIndex(index);\n completedRef.current = false;\n }\n },\n [totalInputs],\n );\n\n // Reset all state\n const reset = useCallback(() => {\n setCurrentIndex(0);\n setValues(new Map());\n completedRef.current = false;\n }, []);\n\n // Set a value directly by name\n const setValue = useCallback((name: string, value: unknown) => {\n setValues((prev) => {\n const next = new Map(prev);\n next.set(name, value);\n return next;\n });\n }, []);\n\n // Get a value by name\n const getValue = useCallback(\n (name: string): unknown => {\n return values.get(name);\n },\n [values],\n );\n\n // Run all inputs non-interactively using defaults and pre-supplied values\n const runNonInteractive = useCallback(async () => {\n if (!element) {\n return new Map<string, unknown>();\n }\n const iteratorOpts: Parameters<typeof createInputIterator>[1] = {\n validateOnSubmit: false,\n environment: \"browser\",\n nonInteractive: true,\n onMissingDefault: onMissingDefault ?? \"error\",\n };\n if (preSuppliedValues) {\n iteratorOpts.values = preSuppliedValues;\n }\n const iterator = createInputIterator(element, iteratorOpts);\n await iterator.start();\n const result = await iterator.runNonInteractive();\n setValues(result);\n setCurrentIndex(requirements.length);\n return result;\n }, [element, preSuppliedValues, onMissingDefault, requirements.length]);\n\n return {\n requirements,\n current,\n currentIndex,\n totalInputs,\n isDone,\n isLoading,\n inputs: values,\n submit,\n previous,\n goTo,\n reset,\n setValue,\n getValue,\n runNonInteractive,\n };\n}\n","/**\n * AskHandler - Headless render-prop component for collecting user input\n */\n\nimport { useCallback } from \"react\";\n\nimport { useAskIterator } from \"../hooks/useAskIterator\";\nimport type { AskHandlerProps, AskInputProps } from \"../types/components\";\n\nconst INPUT_TYPE_MAP: Record<string, string> = {\n string: \"text\",\n number: \"number\",\n boolean: \"checkbox\",\n secret: \"password\",\n date: \"date\",\n path: \"text\",\n select: \"text\",\n multiselect: \"text\",\n rating: \"number\",\n};\n\n/**\n * Headless component for collecting user input through Ask components.\n *\n * Wraps the useAskIterator hook and adds getInputProps for generating\n * accessible input element props.\n *\n * @example\n * ```tsx\n * <AskHandler element={element} onComplete={(values) => console.log(values)}>\n * {({ current, submit, progress, getInputProps }) => {\n * if (!current) return <div>Loading...</div>;\n * const { inputProps } = getInputProps(current.name);\n * return (\n * <div>\n * <label>{current.label}</label>\n * <input {...inputProps} />\n * <span>{progress}% complete</span>\n * </div>\n * );\n * }}\n * </AskHandler>\n * ```\n */\nexport function AskHandler({ children, element, onComplete, initialValues }: AskHandlerProps): React.ReactElement {\n const {\n requirements,\n current,\n currentIndex,\n totalInputs,\n isDone,\n isLoading,\n inputs: values,\n submit,\n previous,\n goTo,\n reset,\n setValue,\n getValue,\n } = useAskIterator({\n element,\n ...(onComplete !== undefined && { onComplete }),\n ...(initialValues !== undefined && { initialValues }),\n });\n\n let progress: number;\n if (totalInputs === 0) {\n progress = isDone ? 100 : 0;\n } else {\n progress = Math.round((currentIndex / totalInputs) * 100);\n }\n\n const getInputProps = useCallback(\n (name: string): AskInputProps => {\n const requirement = requirements.find((r) => r.name === name) ?? {\n name,\n label: name,\n type: \"string\" as const,\n description: name,\n required: false,\n };\n\n const inputType = INPUT_TYPE_MAP[requirement.type] ?? \"text\";\n\n return {\n inputProps: {\n id: `ask-${name}`,\n name,\n type: inputType,\n required: requirement.required ?? false,\n \"aria-label\": requirement.label,\n },\n requirement,\n value: getValue(name),\n setValue: (value: unknown) => {\n setValue(name, value);\n },\n errors: [],\n };\n },\n [requirements, getValue, setValue],\n );\n\n return (\n <>\n {children({\n requirements,\n current,\n currentIndex,\n totalInputs,\n progress,\n isDone,\n isLoading,\n values,\n submit,\n previous,\n goTo,\n reset,\n getInputProps,\n })}\n </>\n );\n}\n","/**\n * PromptEditor - Headless render-prop component for editing prompt source\n */\n\nimport type { PuptElement } from \"@pupt/lib\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { PromptEditorProps } from \"../types/components\";\nimport { transformSource } from \"../utils/transform\";\n\nconst DEFAULT_DEBOUNCE = 300;\n\n/**\n * Headless component that provides state and props for a prompt source editor.\n *\n * Uses the render-prop pattern to give consumers full control over the UI\n * while managing source value state and transformation.\n *\n * @example\n * ```tsx\n * <PromptEditor defaultValue=\"<Prompt>Hello</Prompt>\">\n * {({ inputProps, error, isTransforming }) => (\n * <div>\n * <textarea {...inputProps} />\n * {isTransforming && <span>Transforming...</span>}\n * {error && <span>{error.message}</span>}\n * </div>\n * )}\n * </PromptEditor>\n * ```\n */\nexport function PromptEditor({\n children,\n defaultValue = \"\",\n onChange,\n debounce = DEFAULT_DEBOUNCE,\n}: PromptEditorProps): React.ReactElement {\n const [value, setValueState] = useState(defaultValue);\n const [element, setElement] = useState<PuptElement | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isTransforming, setIsTransforming] = useState(false);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n // Transform the source after debounce\n const scheduleTransform = useCallback(\n (source: string) => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n if (source.trim() === \"\") {\n setElement(null);\n setError(null);\n setIsTransforming(false);\n return;\n }\n\n const doTransform = async (): Promise<void> => {\n timerRef.current = null;\n if (!mountedRef.current) {\n return;\n }\n setIsTransforming(true);\n try {\n const result = await transformSource(source);\n if (mountedRef.current) {\n setElement(result);\n setError(null);\n }\n } catch (err) {\n if (mountedRef.current) {\n setElement(null);\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setIsTransforming(false);\n }\n }\n };\n\n if (debounce <= 0) {\n void doTransform();\n } else {\n setIsTransforming(true);\n timerRef.current = setTimeout(() => {\n void doTransform();\n }, debounce);\n }\n },\n [debounce],\n );\n\n // Transform initial value\n useEffect(() => {\n if (defaultValue.trim() !== \"\") {\n scheduleTransform(defaultValue);\n }\n // Only run on mount\n }, []);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {\n const newValue = e.target.value;\n setValueState(newValue);\n onChange?.(newValue);\n scheduleTransform(newValue);\n },\n [onChange, scheduleTransform],\n );\n\n const setValue = useCallback(\n (newValue: string) => {\n setValueState(newValue);\n onChange?.(newValue);\n scheduleTransform(newValue);\n },\n [onChange, scheduleTransform],\n );\n\n return (\n <>\n {children({\n inputProps: {\n value,\n onChange: handleChange,\n },\n value,\n setValue,\n element,\n error,\n isTransforming,\n })}\n </>\n );\n}\n","/**\n * usePupt - Hook for accessing pupt-lib context\n */\n\nimport { useContext } from \"react\";\n\nimport { PuptContext } from \"../context/PuptContext\";\nimport type { PuptContextValue } from \"../types/context\";\n\n/**\n * Hook to access the pupt-lib context\n *\n * Must be used within a PuptProvider component.\n * Throws an error if used outside of provider.\n *\n * @returns The pupt context value containing searchEngine, renderOptions, etc.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { searchEngine, isLoading, error } = usePupt();\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n *\n * // Use searchEngine for finding prompts...\n * }\n * ```\n *\n * @throws {Error} When used outside of PuptProvider\n */\nexport function usePupt(): PuptContextValue {\n const context = useContext(PuptContext);\n\n // Check if we're outside a provider using the internal _initialized marker\n if (!context._initialized) {\n throw new Error(\"usePupt must be used within a PuptProvider\");\n }\n\n return context;\n}\n","/**\n * usePromptRender hook - Core hook for transforming and rendering prompts\n */\n\nimport {\n createEnvironment,\n type InputRequirement,\n type PostExecutionAction,\n type PuptElement,\n render as renderPrompt,\n type RenderError,\n type RenderOptions,\n} from \"@pupt/lib\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { PromptSource, UsePromptRenderOptions, UsePromptRenderReturn } from \"../types/hooks\";\nimport { extractInputRequirements, transformSource } from \"../utils/transform\";\nimport { usePupt } from \"./usePupt\";\n\n/**\n * Hook for transforming JSX/prompt source into rendered text output.\n *\n * Provides functionality to:\n * - Transform source code strings into PuptElement trees\n * - Render elements to text output\n * - Extract input requirements from Ask components\n * - Track loading and error states\n *\n * @param options - Configuration options for the hook\n * @returns Object containing element, output, loading states, and control functions\n *\n * @example\n * ```tsx\n * function PromptDemo() {\n * const { output, error, isLoading } = usePromptRender({\n * source: { type: 'source', value: '<Prompt><Task>Hello</Task></Prompt>' },\n * autoRender: true,\n * });\n *\n * if (isLoading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error.message}</div>;\n * return <pre>{output}</pre>;\n * }\n * ```\n */\nexport function usePromptRender(options: UsePromptRenderOptions = {}): UsePromptRenderReturn {\n const {\n source: initialSource,\n inputs,\n environment,\n renderOptions: customRenderOptions,\n autoRender = false,\n filename,\n } = options;\n\n // Get context values\n const { renderOptions: contextRenderOptions, environment: contextEnvironment } = usePupt();\n\n // State\n const [source, setSourceState] = useState<PromptSource | null>(initialSource ?? null);\n const [element, setElement] = useState<PuptElement | null>(null);\n const [output, setOutput] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isTransforming, setIsTransforming] = useState(false);\n const [isRendering, setIsRendering] = useState(false);\n const [inputRequirements, setInputRequirements] = useState<InputRequirement[]>([]);\n const [postActions, setPostActions] = useState<PostExecutionAction[]>([]);\n const [renderErrors, setRenderErrors] = useState<RenderError[]>([]);\n\n // Ref to track mounted state\n const mountedRef = useRef(true);\n\n // Cleanup on unmount\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // Transform source code to element\n const doTransform = useCallback(\n async (sourceToTransform: PromptSource): Promise<PuptElement | null> => {\n setIsTransforming(true);\n setError(null);\n\n try {\n let newElement: PuptElement;\n\n if (sourceToTransform.type === \"element\") {\n // Source is already an element, use directly\n newElement = sourceToTransform.value;\n } else {\n // Transform source code to element\n newElement = await transformSource(sourceToTransform.value, filename ? { filename } : undefined);\n }\n\n if (mountedRef.current) {\n setElement(newElement);\n\n // Extract input requirements from the element\n const requirements = await extractInputRequirements(newElement);\n setInputRequirements(requirements);\n }\n\n return newElement;\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setElement(null);\n setInputRequirements([]);\n }\n return null;\n } finally {\n if (mountedRef.current) {\n setIsTransforming(false);\n }\n }\n },\n [filename],\n );\n\n // Render element to text\n const doRender = useCallback(\n async (elementToRender: PuptElement): Promise<void> => {\n setIsRendering(true);\n setError(null);\n setRenderErrors([]);\n\n try {\n // Build render options, merging context and custom options\n const mergedOptions: RenderOptions = {\n ...contextRenderOptions,\n ...customRenderOptions,\n inputs: inputs ?? new Map(),\n };\n\n // Build environment context from partials\n const envOverrides = { ...contextEnvironment, ...environment };\n if (Object.keys(envOverrides).length > 0) {\n mergedOptions.env = createEnvironment(envOverrides);\n }\n\n const result = await renderPrompt(elementToRender, mergedOptions);\n\n if (mountedRef.current) {\n setOutput(result.text);\n setPostActions(result.postExecution ?? []);\n\n // Check for render errors (result.ok === false means there were errors)\n if (!result.ok && \"errors\" in result) {\n setRenderErrors(result.errors);\n // Create an error from the first render error for the UI\n const firstError = result.errors[0];\n if (firstError) {\n setError(new Error(`${firstError.component}: ${firstError.message}`));\n }\n } else {\n setRenderErrors([]);\n }\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setOutput(null);\n setPostActions([]);\n }\n } finally {\n if (mountedRef.current) {\n setIsRendering(false);\n }\n }\n },\n [contextRenderOptions, contextEnvironment, customRenderOptions, environment, inputs],\n );\n\n // Public transform function\n const transform = useCallback(\n async (sourceCode?: string): Promise<PuptElement | null> => {\n const sourceToUse = sourceCode ? { type: \"source\" as const, value: sourceCode } : source;\n\n if (!sourceToUse) {\n return null;\n }\n\n if (sourceCode) {\n setSourceState({ type: \"source\", value: sourceCode });\n }\n\n return doTransform(sourceToUse);\n },\n [source, doTransform],\n );\n\n // Public render function\n const render = useCallback(async (): Promise<void> => {\n if (element) {\n await doRender(element);\n }\n }, [element, doRender]);\n\n // Public setSource function\n const setSource = useCallback((newSource: PromptSource) => {\n setSourceState(newSource);\n }, []);\n\n // Effect: Sync external source prop to internal state.\n // Track by the string value to avoid infinite loops when callers create a\n // new PromptSource object on every render.\n const externalSourceValue = initialSource?.type === \"source\" ? initialSource.value : null;\n const prevExternalSourceValue = useRef(externalSourceValue);\n useEffect(() => {\n if (externalSourceValue !== prevExternalSourceValue.current) {\n prevExternalSourceValue.current = externalSourceValue;\n if (initialSource) {\n setSourceState(initialSource);\n }\n }\n }, [externalSourceValue, initialSource]);\n\n // Effect: Transform when source changes\n useEffect(() => {\n if (source) {\n void doTransform(source);\n } else {\n setElement(null);\n setInputRequirements([]);\n setError(null);\n }\n }, [source, doTransform]);\n\n // Effect: Auto-render when element changes and autoRender is true\n useEffect(() => {\n if (autoRender && element) {\n void doRender(element);\n }\n }, [autoRender, element, doRender]);\n\n // Effect: Re-render when inputs change\n useEffect(() => {\n if (autoRender && element && inputs) {\n void doRender(element);\n }\n }, [autoRender, element, inputs, doRender]);\n\n return {\n source,\n setSource,\n element,\n output,\n error,\n renderErrors,\n isTransforming,\n isRendering,\n isLoading: isTransforming || isRendering,\n inputRequirements,\n postActions,\n render,\n transform,\n };\n}\n","/**\n * PromptRenderer - Headless render-prop component for rendering prompts\n */\n\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport { usePromptRender } from \"../hooks/usePromptRender\";\nimport type { PromptRendererProps } from \"../types/components\";\nimport type { PromptSource } from \"../types/hooks\";\n\n/**\n * Headless component that renders a prompt and provides the result via render props.\n *\n * Wraps the usePromptRender hook and adds clipboard copy functionality.\n *\n * @example\n * ```tsx\n * <PromptRenderer source=\"<Prompt><Task>Hello</Task></Prompt>\" autoRender>\n * {({ output, copyToClipboard, isCopied }) => (\n * <div>\n * <pre>{output}</pre>\n * <button onClick={copyToClipboard}>\n * {isCopied ? 'Copied!' : 'Copy'}\n * </button>\n * </div>\n * )}\n * </PromptRenderer>\n * ```\n */\nexport function PromptRenderer({\n children,\n source,\n autoRender = true,\n inputs,\n renderOptions,\n environment,\n filename,\n}: PromptRendererProps): React.ReactElement {\n const [isCopied, setIsCopied] = useState(false);\n\n // Normalize source to PromptSource (memoized to prevent unnecessary re-renders)\n const normalizedSource = useMemo<PromptSource>(\n () => (typeof source === \"string\" ? { type: \"source\", value: source } : source),\n [source],\n );\n\n const {\n output,\n error,\n isLoading,\n inputRequirements,\n postActions,\n render: doRender,\n } = usePromptRender({\n source: normalizedSource,\n autoRender,\n ...(inputs !== undefined && { inputs }),\n ...(renderOptions !== undefined && { renderOptions }),\n ...(environment !== undefined && { environment }),\n ...(filename !== undefined && { filename }),\n });\n\n const isReady = output !== null && inputRequirements.length === 0;\n\n const copyToClipboard = useCallback(async () => {\n if (output === null) {\n return;\n }\n try {\n await navigator.clipboard.writeText(output);\n setIsCopied(true);\n // Reset after 2 seconds\n setTimeout(() => {\n setIsCopied(false);\n }, 2000);\n } catch {\n // Clipboard API not available\n }\n }, [output]);\n\n const render = useCallback(async () => {\n await doRender();\n }, [doRender]);\n\n return (\n <>\n {children({\n output,\n isReady,\n isLoading,\n error,\n pendingInputs: inputRequirements,\n postActions,\n copyToClipboard,\n isCopied,\n render,\n })}\n </>\n );\n}\n","/**\n * PuptProvider - React context provider for pupt-lib integration\n */\n\nimport { createSearchEngine, type SearchEngine } from \"@pupt/lib\";\nimport { useMemo, useState } from \"react\";\n\nimport { PuptContext } from \"../context/PuptContext\";\nimport type { PuptContextValue, PuptProviderProps } from \"../types/context\";\n\n/**\n * Provider component that initializes pupt-lib and provides context to children\n *\n * @example\n * ```tsx\n * import { PuptProvider } from '@pupt/react';\n *\n * function App() {\n * return (\n * <PuptProvider>\n * <MyComponent />\n * </PuptProvider>\n * );\n * }\n * ```\n *\n * @example\n * With prompts for search:\n * ```tsx\n * const prompts = [\n * { name: 'greeting', description: 'A greeting prompt', tags: ['hello'] }\n * ];\n *\n * function App() {\n * return (\n * <PuptProvider prompts={prompts}>\n * <MyComponent />\n * </PuptProvider>\n * );\n * }\n * ```\n */\nexport function PuptProvider({\n children,\n prompts,\n searchConfig,\n renderOptions = {},\n environment = {},\n}: PuptProviderProps): React.ReactElement {\n const [isLoading] = useState(false);\n const [error] = useState<Error | null>(null);\n\n // Create search engine if prompts provided\n const searchEngine: SearchEngine | null = useMemo(() => {\n if (!prompts || prompts.length === 0) {\n return null;\n }\n try {\n const engine = createSearchEngine(searchConfig);\n engine.index(prompts);\n return engine;\n } catch (err) {\n console.error(\"Failed to initialize search engine:\", err);\n return null;\n }\n }, [prompts, searchConfig]);\n\n // Memoize context value to prevent unnecessary re-renders\n const contextValue: PuptContextValue = useMemo(\n () => ({\n _initialized: true,\n searchEngine,\n prompts: prompts ?? [],\n renderOptions,\n environment,\n isLoading,\n error,\n }),\n [searchEngine, prompts, renderOptions, environment, isLoading, error],\n );\n\n return <PuptContext.Provider value={contextValue}>{children}</PuptContext.Provider>;\n}\n","/**\n * useFormula hook - Reactive formula evaluation\n */\n\nimport { evaluateFormula } from \"@pupt/lib\";\nimport { useMemo } from \"react\";\n\nimport type { UseFormulaOptions, UseFormulaReturn } from \"../types/hooks\";\n\n/**\n * Hook for evaluating Excel-style formulas reactively against input values.\n *\n * Re-evaluates automatically when the formula string or inputs Map changes.\n *\n * @param options - Formula string and input values\n * @returns Object containing the boolean result and any evaluation error\n *\n * @example\n * ```tsx\n * function ConditionalSection({ inputs }) {\n * const { result } = useFormula({\n * formula: \"=count>5\",\n * inputs,\n * });\n *\n * if (!result) return null;\n * return <div>Count exceeds threshold!</div>;\n * }\n * ```\n */\nexport function useFormula(options: UseFormulaOptions): UseFormulaReturn {\n const { formula, inputs } = options;\n\n return useMemo(() => {\n try {\n return { result: evaluateFormula(formula, inputs), error: null };\n } catch (err) {\n return {\n result: false,\n error: err instanceof Error ? err : new Error(String(err)),\n };\n }\n }, [formula, inputs]);\n}\n","/**\n * usePostActions hook - Manage post-execution actions from rendered prompts\n */\n\nimport type { PostExecutionAction } from \"@pupt/lib\";\nimport { useCallback, useRef, useState } from \"react\";\n\nimport type { UsePostActionsOptions, UsePostActionsReturn } from \"../types/hooks\";\n\n/**\n * Hook for managing post-execution actions extracted from rendered prompts.\n *\n * Tracks pending, executed, and dismissed actions. Supports custom handlers\n * per action type and bulk operations.\n *\n * @param options - Configuration including actions and optional handlers\n * @returns Object containing action lists and control functions\n *\n * @example\n * ```tsx\n * function PostActions({ actions }) {\n * const { pendingActions, execute, dismiss, allDone } = usePostActions({\n * actions,\n * handlers: {\n * openUrl: (action) => window.open(action.url),\n * },\n * });\n *\n * if (allDone) return <div>All actions handled!</div>;\n *\n * return (\n * <ul>\n * {pendingActions.map((action, i) => (\n * <li key={i}>\n * {action.type}\n * <button onClick={() => execute(action)}>Execute</button>\n * <button onClick={() => dismiss(action)}>Dismiss</button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function usePostActions(options: UsePostActionsOptions): UsePostActionsReturn {\n const { actions, handlers } = options;\n\n const [executedSet, setExecutedSet] = useState<Set<PostExecutionAction>>(() => new Set());\n const [dismissedSet, setDismissedSet] = useState<Set<PostExecutionAction>>(() => new Set());\n\n // Track the previous actions reference to reset state on change\n const prevActionsRef = useRef(actions);\n if (prevActionsRef.current !== actions) {\n prevActionsRef.current = actions;\n // Reset state when actions change - this is intentional synchronous state\n // update during render (React supports this pattern for derived state)\n setExecutedSet(new Set());\n setDismissedSet(new Set());\n }\n\n const pendingActions = actions.filter((a) => !executedSet.has(a) && !dismissedSet.has(a));\n const executedActions = actions.filter((a) => executedSet.has(a));\n const dismissedActions = actions.filter((a) => dismissedSet.has(a));\n const allDone = pendingActions.length === 0;\n\n const execute = useCallback(\n async (action: PostExecutionAction) => {\n // Skip already-executed actions\n if (executedSet.has(action)) {\n return;\n }\n\n const handler = handlers?.[action.type];\n if (handler) {\n await handler(action);\n }\n\n setExecutedSet((prev) => {\n const next = new Set(prev);\n next.add(action);\n return next;\n });\n },\n [handlers, executedSet],\n );\n\n const dismiss = useCallback((action: PostExecutionAction) => {\n setDismissedSet((prev) => {\n const next = new Set(prev);\n next.add(action);\n return next;\n });\n }, []);\n\n const executeAll = useCallback(async () => {\n for (const action of pendingActions) {\n const handler = handlers?.[action.type];\n if (handler) {\n await handler(action);\n }\n }\n\n setExecutedSet((prev) => {\n const next = new Set(prev);\n for (const action of pendingActions) {\n next.add(action);\n }\n return next;\n });\n }, [pendingActions, handlers]);\n\n const dismissAll = useCallback(() => {\n setDismissedSet((prev) => {\n const next = new Set(prev);\n for (const action of pendingActions) {\n next.add(action);\n }\n return next;\n });\n }, [pendingActions]);\n\n const reset = useCallback(() => {\n setExecutedSet(new Set());\n setDismissedSet(new Set());\n }, []);\n\n return {\n pendingActions,\n executedActions,\n dismissedActions,\n allDone,\n execute,\n dismiss,\n executeAll,\n dismissAll,\n reset,\n };\n}\n","/**\n * usePromptSearch hook - Search through indexed prompts with debouncing\n */\n\nimport type { SearchResult } from \"@pupt/lib\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { UsePromptSearchOptions, UsePromptSearchReturn } from \"../types/hooks\";\nimport { usePupt } from \"./usePupt\";\n\nconst DEFAULT_DEBOUNCE = 200;\n\n/**\n * Hook for searching through prompts indexed in the PuptProvider.\n *\n * Uses the search engine from PuptContext and provides debounced searching\n * with query state management.\n *\n * @param options - Configuration including debounce delay and result limit\n * @returns Object containing query state, results, and search controls\n *\n * @example\n * ```tsx\n * function SearchBar() {\n * const { query, setQuery, results, isSearching } = usePromptSearch();\n *\n * return (\n * <div>\n * <input value={query} onChange={e => setQuery(e.target.value)} />\n * {isSearching && <span>Searching...</span>}\n * <ul>{results.map(r => <li key={r.prompt.name}>{r.prompt.name}</li>)}</ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function usePromptSearch(options: UsePromptSearchOptions = {}): UsePromptSearchReturn {\n const { debounce = DEFAULT_DEBOUNCE, limit } = options;\n const { searchEngine } = usePupt();\n\n const [query, setQueryState] = useState(\"\");\n const [results, setResults] = useState<SearchResult[]>([]);\n const [isSearching, setIsSearching] = useState(false);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Perform the actual search\n const performSearch = useCallback(\n (searchQuery: string) => {\n if (!searchEngine || searchQuery.trim() === \"\") {\n setResults([]);\n setIsSearching(false);\n return;\n }\n\n setIsSearching(true);\n try {\n const searchOptions = limit !== undefined ? { limit } : {};\n const searchResults = searchEngine.search(searchQuery, searchOptions);\n setResults(searchResults);\n } finally {\n setIsSearching(false);\n }\n },\n [searchEngine, limit],\n );\n\n // Set query with debouncing\n const setQuery = useCallback(\n (newQuery: string) => {\n setQueryState(newQuery);\n\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n if (newQuery.trim() === \"\") {\n setResults([]);\n setIsSearching(false);\n return;\n }\n\n if (debounce <= 0) {\n performSearch(newQuery);\n } else {\n setIsSearching(true);\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n performSearch(newQuery);\n }, debounce);\n }\n },\n [debounce, performSearch],\n );\n\n // Clear search\n const clear = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n setQueryState(\"\");\n setResults([]);\n setIsSearching(false);\n }, []);\n\n // Get all tags\n const allTags = searchEngine ? searchEngine.getAllTags() : [];\n\n // Cleanup timer on unmount\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return {\n query,\n setQuery,\n results,\n isSearching,\n allTags,\n clear,\n };\n}\n","/**\n * usePuptLibraryContext - Hook to access PuptLibraryProvider context\n */\n\nimport { useContext } from \"react\";\n\nimport { PuptLibraryContext } from \"../components/PuptLibraryProvider\";\nimport type { UsePuptLibraryReturn } from \"../types/hooks\";\n\n/**\n * Hook to access the PuptLibraryProvider context.\n *\n * Must be used within a PuptLibraryProvider.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { prompts, addModule, isLoading } = usePuptLibraryContext();\n * // ...\n * }\n * ```\n */\nexport function usePuptLibraryContext(): UsePuptLibraryReturn {\n const ctx = useContext(PuptLibraryContext);\n if (!ctx) {\n throw new Error(\"usePuptLibraryContext must be used within a PuptLibraryProvider\");\n }\n return ctx;\n}\n","/**\n * pupt-react - Headless React component library for pupt-lib integration\n *\n * This library provides hooks and render-prop components for:\n * - Prompt searching and transformation\n * - Rendering prompts to text output\n * - User input collection through the Ask system\n */\n\n// Export all types\nexport * from \"./types/index\";\n\n// Export context\nexport { PuptContext, PuptLibraryContext } from \"./context\";\n\n// Export components\nexport { AskHandler, PromptEditor, PromptRenderer, PuptLibraryProvider, PuptProvider } from \"./components\";\n\n// Export hooks\nexport {\n useAskIterator,\n useFormula,\n usePostActions,\n usePromptRender,\n usePromptSearch,\n usePupt,\n usePuptLibrary,\n usePuptLibraryContext,\n} from \"./hooks\";\n\n// Export utility functions\nexport {\n createRuntimeConfig,\n evaluateFormula,\n extractInputRequirements,\n isAskComponent,\n isElement,\n transformSource,\n traverseElement,\n validateInput,\n} from \"./utils\";\n\n// Re-export pupt-lib element symbols\nexport { CHILDREN, DEFERRED_REF, PROPS, TYPE } from \"@pupt/lib\";\n\n// Re-export pupt-lib type guards\nexport { isComponentClass, isDeferredRef, isPuptElement } from \"@pupt/lib\";\n\n// Re-export pupt-lib Component base class for custom components\nexport { Component, COMPONENT_MARKER } from \"@pupt/lib\";\n\n// Version constant\nexport const VERSION = \"1.0.0\";\n"],"names":["useState","useRef","useEffect","Pupt","useCallback","createContext","useMemo","jsx","createPromptFromSource","createInputIterator","CHILDREN","isPuptElement","DEFAULT_DEBOUNCE","useContext","createEnvironment","renderPrompt","createSearchEngine","evaluateFormula"],"mappings":";;;;;AA4BO,SAAS,eAAe,UAAiC,IAA0B;AACtF,QAAM,EAAE,SAAS,iBAAiB,CAAA,GAAI,iBAAiB;AAEvD,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAwB,cAAc;AACpE,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAuB,IAAI;AACrD,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAwC,CAAA,CAAE;AACxE,QAAM,CAAC,MAAM,OAAO,IAAIA,MAAAA,SAAmB,CAAA,CAAE;AAE7C,QAAM,UAAUC,MAAAA,OAAoB,IAAI;AACxC,QAAM,kBAAkBA,MAAAA,OAAuC,YAAY;AAC3E,kBAAgB,UAAU;AAG1BC,QAAAA,UAAU,MAAM;AACZ,QAAI,YAAY;AAEhB,mBAAe,OAAsB;AACjC,mBAAa,IAAI;AACjB,eAAS,IAAI;AAEb,UAAI;AACA,cAAM,SAAyB,EAAE,QAAA;AACjC,YAAI,gBAAgB,SAAS;AACzB,iBAAO,eAAe,gBAAgB;AAAA,QAC1C;AACA,cAAM,OAAO,IAAIC,IAAAA,KAAK,MAAM;AAC5B,cAAM,KAAK,KAAA;AAEX,YAAI,WAAW;AACX;AAAA,QACJ;AAEA,gBAAQ,UAAU;AAClB,mBAAW,KAAK,YAAY;AAC5B,gBAAQ,KAAK,SAAS;AAAA,MAC1B,SAAS,KAAK;AACV,YAAI,WAAW;AACX;AAAA,QACJ;AACA,iBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC5D,mBAAW,CAAA,CAAE;AACb,gBAAQ,CAAA,CAAE;AAAA,MACd,UAAA;AACI,YAAI,CAAC,WAAW;AACZ,uBAAa,KAAK;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,KAAA;AAEL,WAAO,MAAM;AACT,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,YAAYC,MAAAA;AAAAA,IACd,CAAC,SAA0D;;AACvD,cAAO,aAAQ,YAAR,mBAAiB,UAAU;AAAA,IACtC;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAGZ,QAAM,kBAAkBA,MAAAA;AAAAA,IACpB,CAAC,QAA+C;;AAC5C,eAAO,aAAQ,YAAR,mBAAiB,gBAAgB,SAAQ,CAAA;AAAA,IACpD;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAGZ,QAAM,YAAYA,kBAAY,CAAC,WAA8B;AACzD,eAAW,CAAC,SAAS;AACjB,UAAI,KAAK,SAAS,MAAM,GAAG;AACvB,eAAO;AAAA,MACX;AACA,aAAO,CAAC,GAAG,MAAM,MAAM;AAAA,IAC3B,CAAC;AAAA,EACL,GAAG,CAAA,CAAE;AAEL,QAAM,eAAeA,kBAAY,CAAC,WAA8B;AAC5D,eAAW,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA,EACzD,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;AC/GO,MAAM,qBAAqBC,MAAAA,cAA2C,IAAI;AACjF,mBAAmB,cAAc;AAmB1B,SAAS,oBAAoB,EAAE,UAAU,SAAS,gBAA8D;AACnH,QAAM,OAA8B,CAAA;AACpC,MAAI,SAAS;AACT,SAAK,UAAU;AAAA,EACnB;AACA,MAAI,cAAc;AACd,SAAK,eAAe;AAAA,EACxB;AACA,QAAM,UAAU,eAAe,IAAI;AAEnC,QAAM,QAAQC,MAAAA;AAAAA,IACV,MAAM;AAAA,IACN,CAAC,QAAQ,WAAW,QAAQ,OAAO,QAAQ,SAAS,QAAQ,MAAM,QAAQ,OAAO;AAAA,EAAA;AAGrF,SAAOC,2BAAAA,IAAC,mBAAmB,UAAnB,EAA4B,OAAe,SAAA,CAAS;AAChE;ACrCA,MAAM,sBAAwC;AAAA,EAC1C,cAAc;AAAA,EACd,cAAc;AAAA,EACd,SAAS,CAAA;AAAA,EACT,eAAe,CAAA;AAAA,EACf,aAAa,CAAA;AAAA,EACb,WAAW;AAAA,EACX,OAAO;AACX;AAqBO,MAAM,cAAcF,MAAAA,cAAgC,mBAAmB;AAG9E,YAAY,cAAc;ACd1B,eAAsB,gBAAgB,QAAgB,UAA4B,IAA0B;AACxG,QAAM,EAAE,WAAW,aAAA,IAAiB;AACpC,SAAOG,IAAAA,uBAAuB,QAAQ,QAAQ;AAClD;AAqBA,eAAsB,yBAClB,SACA,SAC2B;AAC3B,MAAI;AACA,UAAM,eAA0D;AAAA,MAC5D,kBAAkB;AAAA,MAClB,aAAa;AAAA,IAAA;AAEjB,QAAI,mCAAS,QAAQ;AACjB,mBAAa,SAAS,QAAQ;AAAA,IAClC;AACA,UAAM,WAAWC,IAAAA,oBAAoB,SAAS,YAAY;AAE1D,UAAM,eAAmC,CAAA;AAGzC,UAAM,SAAS,MAAA;AAEf,WAAO,CAAC,SAAS,UAAU;AACvB,YAAM,UAAU,SAAS,QAAA;AACzB,UAAI,SAAS;AACT,qBAAa,KAAK,OAAO;AAEzB,cAAM,SAAS,OAAO,MAAS;AAAA,MACnC;AAEA,YAAM,SAAS,QAAA;AAAA,IACnB;AAEA,WAAO;AAAA,EACX,QAAQ;AAGJ,WAAO,CAAA;AAAA,EACX;AACJ;AAKO,SAAS,eAAe,MAAgC;AAC3D,MAAI,OAAO,SAAS,UAAU;AAC1B,WAAO,KAAK,WAAW,MAAM,KAAK,SAAS;AAAA,EAC/C;AACA,SAAO;AACX;AAMO,SAAS,gBAAgB,SAAsB,SAA+C;AACjG,UAAQ,OAAO;AAGf,QAAM,WAAW,QAAQC,YAAQ;AACjC,MAAI,UAAU;AACV,QAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,iBAAW,SAAS,UAAU;AAC1B,YAAI,UAAU,KAAK,GAAG;AAClB,0BAAgB,OAAO,OAAO;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ,WAAW,UAAU,QAAQ,GAAG;AAC5B,sBAAgB,UAAyB,OAAO;AAAA,IACpD;AAAA,EACJ;AACJ;AAKO,SAAS,UAAU,OAAsC;AAC5D,SAAOC,IAAAA,cAAc,KAAK;AAC9B;ACnHO,SAAS,cAAc,aAA+B,OAAkC;AAC3F,QAAM,SAA4B,CAAA;AAGlC,UAAQ,YAAY,MAAA;AAAA,IAChB,KAAK;AACD,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAC3C,eAAO,KAAK;AAAA,UACR,OAAO,YAAY;AAAA,UACnB,SAAS,0BAA0B,OAAO,KAAK;AAAA,UAC/C,MAAM;AAAA,QAAA,CACT;AAAA,MACL,OAAO;AACH,YAAI,YAAY,QAAQ,UAAa,QAAQ,YAAY,KAAK;AAC1D,iBAAO,KAAK;AAAA,YACR,OAAO,YAAY;AAAA,YACnB,SAAS,SAAS,KAAK,qBAAqB,YAAY,GAAG;AAAA,YAC3D,MAAM;AAAA,UAAA,CACT;AAAA,QACL;AACA,YAAI,YAAY,QAAQ,UAAa,QAAQ,YAAY,KAAK;AAC1D,iBAAO,KAAK;AAAA,YACR,OAAO,YAAY;AAAA,YACnB,SAAS,SAAS,KAAK,oBAAoB,YAAY,GAAG;AAAA,YAC1D,MAAM;AAAA,UAAA,CACT;AAAA,QACL;AAAA,MACJ;AACA;AAAA,IAEJ,KAAK;AACD,UAAI,OAAO,UAAU,WAAW;AAC5B,eAAO,KAAK;AAAA,UACR,OAAO,YAAY;AAAA,UACnB,SAAS,2BAA2B,OAAO,KAAK;AAAA,UAChD,MAAM;AAAA,QAAA,CACT;AAAA,MACL;AACA;AAAA,IAEJ,KAAK;AACD,UAAI,YAAY,WAAW,YAAY,QAAQ,SAAS,GAAG;AACvD,cAAM,cAAc,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AAC1D,YAAI,CAAC,YAAY,SAAS,OAAO,KAAK,CAAC,GAAG;AACtC,iBAAO,KAAK;AAAA,YACR,OAAO,YAAY;AAAA,YACnB,SAAS,qCAAqC,YAAY,KAAK,IAAI,CAAC;AAAA,YACpE,MAAM;AAAA,UAAA,CACT;AAAA,QACL;AAAA,MACJ;AACA;AAAA,IAEJ,KAAK;AACD,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACvB,eAAO,KAAK;AAAA,UACR,OAAO,YAAY;AAAA,UACnB,SAAS;AAAA,UACT,MAAM;AAAA,QAAA,CACT;AAAA,MACL;AACA;AAAA,IAEJ,KAAK;AAAA,IACL,KAAK;AACD,UAAI,OAAO,UAAU,YAAY,UAAU,UAAa,UAAU,MAAM;AACpE,eAAO,KAAK;AAAA,UACR,OAAO,YAAY;AAAA,UACnB,SAAS,0BAA0B,OAAO,KAAK;AAAA,UAC/C,MAAM;AAAA,QAAA,CACT;AAAA,MACL;AACA,UAAI,OAAO,UAAU,UAAU;AAC3B,YAAI,YAAY,QAAQ,UAAa,MAAM,SAAS,YAAY,KAAK;AACjE,iBAAO,KAAK;AAAA,YACR,OAAO,YAAY;AAAA,YACnB,SAAS,0BAA0B,YAAY,GAAG;AAAA,YAClD,MAAM;AAAA,UAAA,CACT;AAAA,QACL;AACA,YAAI,YAAY,QAAQ,UAAa,MAAM,SAAS,YAAY,KAAK;AACjE,iBAAO,KAAK;AAAA,YACR,OAAO,YAAY;AAAA,YACnB,SAAS,yBAAyB,YAAY,GAAG;AAAA,YACjD,MAAM;AAAA,UAAA,CACT;AAAA,QACL;AAAA,MACJ;AACA;AAAA,EAEA;AAIR,MAAI,YAAY,aAAa,UAAU,UAAa,UAAU,QAAQ,UAAU,KAAK;AACjF,WAAO,KAAK;AAAA,MACR,OAAO,YAAY;AAAA,MACnB,SAAS,GAAG,YAAY,SAAS,YAAY,IAAI;AAAA,MACjD,MAAM;AAAA,IAAA,CACT;AAAA,EACL;AAEA,SAAO;AAAA,IACH,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA,UAAU,CAAA;AAAA,EAAC;AAEnB;AChFO,SAAS,eAAe,SAAsD;AACjF,QAAM,EAAE,SAAS,YAAY,eAAe,mBAAmB,qBAAqB;AAGpF,QAAM,CAAC,cAAc,eAAe,IAAIX,MAAAA,SAA6B,CAAA,CAAE;AACvE,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAS,CAAC;AAClD,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAA+B,MAAM,IAAI,IAAI,aAAa,CAAC;AACvF,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,KAAK;AAGhD,QAAM,gBAAgBC,MAAAA,OAAO,UAAU;AACvC,gBAAc,UAAU;AAGxB,QAAM,eAAeA,MAAAA,OAAO,KAAK;AAGjCC,QAAAA,UAAU,MAAM;AACZ,QAAI,CAAC,SAAS;AACV,sBAAgB,CAAA,CAAE;AAClB,sBAAgB,CAAC;AACjB,gBAAU,IAAI,IAAI,aAAa,CAAC;AAChC,mBAAa,UAAU;AACvB,aAAO;AAAA,IACX;AAEA,QAAI,YAAY;AAChB,iBAAa,IAAI;AAEjB,UAAM,cAAc,oBAAoB,EAAE,QAAQ,sBAAsB;AACxE,SAAK,yBAAyB,SAAS,WAAW,EAAE,KAAK,CAAC,SAAS;AAC/D,UAAI,CAAC,WAAW;AACZ,wBAAgB,IAAI;AACpB,wBAAgB,CAAC;AACjB,kBAAU,IAAI,IAAI,aAAa,CAAC;AAChC,qBAAa,UAAU;AACvB,qBAAa,KAAK;AAAA,MACtB;AAAA,IACJ,CAAC;AAED,WAAO,MAAM;AACT,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,SAAS,eAAe,iBAAiB,CAAC;AAG9C,QAAM,cAAc,aAAa;AACjC,QAAM,SAAS,cAAc,IAAI,gBAAgB,cAAc,CAAC;AAChE,QAAM,UAAmC,eAAe,cAAe,aAAa,YAAY,KAAK,OAAQ;AAG7GA,QAAAA,UAAU,MAAM;;AACZ,QAAI,UAAU,cAAc,KAAK,CAAC,aAAa,SAAS;AACpD,mBAAa,UAAU;AACvB,0BAAc,YAAd,uCAAwB,IAAI,IAAI,MAAM;AAAA,IAC1C;AAAA,EACJ,GAAG,CAAC,QAAQ,aAAa,MAAM,CAAC;AAGhC,QAAM,SAASE,MAAAA;AAAAA,IACX,CAAC,UAA8C;AAC3C,UAAI,CAAC,SAAS;AACV,eAAO,QAAQ,QAAQ;AAAA,UACnB,OAAO;AAAA,UACP,QAAQ,CAAC,EAAE,OAAO,IAAI,SAAS,0BAA0B,MAAM,kBAAkB;AAAA,UACjF,UAAU,CAAA;AAAA,QAAC,CACd;AAAA,MACL;AAEA,YAAM,SAAS,cAAc,SAAS,KAAK;AAE3C,UAAI,OAAO,OAAO;AACd,kBAAU,CAAC,SAAS;AAChB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,eAAK,IAAI,QAAQ,MAAM,KAAK;AAC5B,iBAAO;AAAA,QACX,CAAC;AACD,wBAAgB,CAAC,SAAS,OAAO,CAAC;AAAA,MACtC;AAEA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IACjC;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAIZ,QAAM,WAAWA,MAAAA,YAAY,MAAM;AAC/B,oBAAgB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAC/C,iBAAa,UAAU;AAAA,EAC3B,GAAG,CAAA,CAAE;AAGL,QAAM,OAAOA,MAAAA;AAAAA,IACT,CAAC,UAAkB;AACf,UAAI,SAAS,KAAK,QAAQ,aAAa;AACnC,wBAAgB,KAAK;AACrB,qBAAa,UAAU;AAAA,MAC3B;AAAA,IACJ;AAAA,IACA,CAAC,WAAW;AAAA,EAAA;AAIhB,QAAM,QAAQA,MAAAA,YAAY,MAAM;AAC5B,oBAAgB,CAAC;AACjB,cAAU,oBAAI,KAAK;AACnB,iBAAa,UAAU;AAAA,EAC3B,GAAG,CAAA,CAAE;AAGL,QAAM,WAAWA,MAAAA,YAAY,CAAC,MAAc,UAAmB;AAC3D,cAAU,CAAC,SAAS;AAChB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,MAAM,KAAK;AACpB,aAAO;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE;AAGL,QAAM,WAAWA,MAAAA;AAAAA,IACb,CAAC,SAA0B;AACvB,aAAO,OAAO,IAAI,IAAI;AAAA,IAC1B;AAAA,IACA,CAAC,MAAM;AAAA,EAAA;AAIX,QAAM,oBAAoBA,MAAAA,YAAY,YAAY;AAC9C,QAAI,CAAC,SAAS;AACV,iCAAW,IAAA;AAAA,IACf;AACA,UAAM,eAA0D;AAAA,MAC5D,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,kBAAkB,oBAAoB;AAAA,IAAA;AAE1C,QAAI,mBAAmB;AACnB,mBAAa,SAAS;AAAA,IAC1B;AACA,UAAM,WAAWK,IAAAA,oBAAoB,SAAS,YAAY;AAC1D,UAAM,SAAS,MAAA;AACf,UAAM,SAAS,MAAM,SAAS,kBAAA;AAC9B,cAAU,MAAM;AAChB,oBAAgB,aAAa,MAAM;AACnC,WAAO;AAAA,EACX,GAAG,CAAC,SAAS,mBAAmB,kBAAkB,aAAa,MAAM,CAAC;AAEtE,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;ACnMA,MAAM,iBAAyC;AAAA,EAC3C,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,QAAQ;AACZ;AAyBO,SAAS,WAAW,EAAE,UAAU,SAAS,YAAY,iBAAsD;AAC9G,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,GAAI,eAAe,UAAa,EAAE,WAAA;AAAA,IAClC,GAAI,kBAAkB,UAAa,EAAE,cAAA;AAAA,EAAc,CACtD;AAED,MAAI;AACJ,MAAI,gBAAgB,GAAG;AACnB,eAAW,SAAS,MAAM;AAAA,EAC9B,OAAO;AACH,eAAW,KAAK,MAAO,eAAe,cAAe,GAAG;AAAA,EAC5D;AAEA,QAAM,gBAAgBL,MAAAA;AAAAA,IAClB,CAAC,SAAgC;AAC7B,YAAM,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK;AAAA,QAC7D;AAAA,QACA,OAAO;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MAAA;AAGd,YAAM,YAAY,eAAe,YAAY,IAAI,KAAK;AAEtD,aAAO;AAAA,QACH,YAAY;AAAA,UACR,IAAI,OAAO,IAAI;AAAA,UACf;AAAA,UACA,MAAM;AAAA,UACN,UAAU,YAAY,YAAY;AAAA,UAClC,cAAc,YAAY;AAAA,QAAA;AAAA,QAE9B;AAAA,QACA,OAAO,SAAS,IAAI;AAAA,QACpB,UAAU,CAAC,UAAmB;AAC1B,mBAAS,MAAM,KAAK;AAAA,QACxB;AAAA,QACA,QAAQ,CAAA;AAAA,MAAC;AAAA,IAEjB;AAAA,IACA,CAAC,cAAc,UAAU,QAAQ;AAAA,EAAA;AAGrC,+DAES,UAAA,SAAS;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACH,GACL;AAER;AChHA,MAAMQ,qBAAmB;AAqBlB,SAAS,aAAa;AAAA,EACzB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,WAAWA;AACf,GAA0C;AACtC,QAAM,CAAC,OAAO,aAAa,IAAIZ,MAAAA,SAAS,YAAY;AACpD,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAA6B,IAAI;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAuB,IAAI;AACrD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,KAAK;AAE1D,QAAM,WAAWC,MAAAA,OAA6C,IAAI;AAClE,QAAM,aAAaA,MAAAA,OAAO,IAAI;AAE9BC,QAAAA,UAAU,MAAM;AACZ,eAAW,UAAU;AACrB,WAAO,MAAM;AACT,iBAAW,UAAU;AACrB,UAAI,SAAS,YAAY,MAAM;AAC3B,qBAAa,SAAS,OAAO;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAA,CAAE;AAGL,QAAM,oBAAoBE,MAAAA;AAAAA,IACtB,CAAC,WAAmB;AAChB,UAAI,SAAS,YAAY,MAAM;AAC3B,qBAAa,SAAS,OAAO;AAC7B,iBAAS,UAAU;AAAA,MACvB;AAEA,UAAI,OAAO,KAAA,MAAW,IAAI;AACtB,mBAAW,IAAI;AACf,iBAAS,IAAI;AACb,0BAAkB,KAAK;AACvB;AAAA,MACJ;AAEA,YAAM,cAAc,YAA2B;AAC3C,iBAAS,UAAU;AACnB,YAAI,CAAC,WAAW,SAAS;AACrB;AAAA,QACJ;AACA,0BAAkB,IAAI;AACtB,YAAI;AACA,gBAAM,SAAS,MAAM,gBAAgB,MAAM;AAC3C,cAAI,WAAW,SAAS;AACpB,uBAAW,MAAM;AACjB,qBAAS,IAAI;AAAA,UACjB;AAAA,QACJ,SAAS,KAAK;AACV,cAAI,WAAW,SAAS;AACpB,uBAAW,IAAI;AACf,qBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,UAChE;AAAA,QACJ,UAAA;AACI,cAAI,WAAW,SAAS;AACpB,8BAAkB,KAAK;AAAA,UAC3B;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,YAAY,GAAG;AACf,aAAK,YAAA;AAAA,MACT,OAAO;AACH,0BAAkB,IAAI;AACtB,iBAAS,UAAU,WAAW,MAAM;AAChC,eAAK,YAAA;AAAA,QACT,GAAG,QAAQ;AAAA,MACf;AAAA,IACJ;AAAA,IACA,CAAC,QAAQ;AAAA,EAAA;AAIbF,QAAAA,UAAU,MAAM;AACZ,QAAI,aAAa,KAAA,MAAW,IAAI;AAC5B,wBAAkB,YAAY;AAAA,IAClC;AAAA,EAEJ,GAAG,CAAA,CAAE;AAEL,QAAM,eAAeE,MAAAA;AAAAA,IACjB,CAAC,MAAiE;AAC9D,YAAM,WAAW,EAAE,OAAO;AAC1B,oBAAc,QAAQ;AACtB,2CAAW;AACX,wBAAkB,QAAQ;AAAA,IAC9B;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,EAAA;AAGhC,QAAM,WAAWA,MAAAA;AAAAA,IACb,CAAC,aAAqB;AAClB,oBAAc,QAAQ;AACtB,2CAAW;AACX,wBAAkB,QAAQ;AAAA,IAC9B;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,EAAA;AAGhC,+DAES,UAAA,SAAS;AAAA,IACN,YAAY;AAAA,MACR;AAAA,MACA,UAAU;AAAA,IAAA;AAAA,IAEd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACH,GACL;AAER;ACrHO,SAAS,UAA4B;AACxC,QAAM,UAAUS,MAAAA,WAAW,WAAW;AAGtC,MAAI,CAAC,QAAQ,cAAc;AACvB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAChE;AAEA,SAAO;AACX;ACKO,SAAS,gBAAgB,UAAkC,IAA2B;AACzF,QAAM;AAAA,IACF,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,aAAa;AAAA,IACb;AAAA,EAAA,IACA;AAGJ,QAAM,EAAE,eAAe,sBAAsB,aAAa,mBAAA,IAAuB,QAAA;AAGjF,QAAM,CAAC,QAAQ,cAAc,IAAIb,MAAAA,SAA8B,iBAAiB,IAAI;AACpF,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAA6B,IAAI;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAwB,IAAI;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAuB,IAAI;AACrD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,KAAK;AAC1D,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,KAAK;AACpD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,MAAAA,SAA6B,CAAA,CAAE;AACjF,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAgC,CAAA,CAAE;AACxE,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAwB,CAAA,CAAE;AAGlE,QAAM,aAAaC,MAAAA,OAAO,IAAI;AAG9BC,QAAAA,UAAU,MAAM;AACZ,eAAW,UAAU;AACrB,WAAO,MAAM;AACT,iBAAW,UAAU;AAAA,IACzB;AAAA,EACJ,GAAG,CAAA,CAAE;AAGL,QAAM,cAAcE,MAAAA;AAAAA,IAChB,OAAO,sBAAiE;AACpE,wBAAkB,IAAI;AACtB,eAAS,IAAI;AAEb,UAAI;AACA,YAAI;AAEJ,YAAI,kBAAkB,SAAS,WAAW;AAEtC,uBAAa,kBAAkB;AAAA,QACnC,OAAO;AAEH,uBAAa,MAAM,gBAAgB,kBAAkB,OAAO,WAAW,EAAE,aAAa,MAAS;AAAA,QACnG;AAEA,YAAI,WAAW,SAAS;AACpB,qBAAW,UAAU;AAGrB,gBAAM,eAAe,MAAM,yBAAyB,UAAU;AAC9D,+BAAqB,YAAY;AAAA,QACrC;AAEA,eAAO;AAAA,MACX,SAAS,KAAK;AACV,YAAI,WAAW,SAAS;AACpB,mBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC5D,qBAAW,IAAI;AACf,+BAAqB,CAAA,CAAE;AAAA,QAC3B;AACA,eAAO;AAAA,MACX,UAAA;AACI,YAAI,WAAW,SAAS;AACpB,4BAAkB,KAAK;AAAA,QAC3B;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,QAAQ;AAAA,EAAA;AAIb,QAAM,WAAWA,MAAAA;AAAAA,IACb,OAAO,oBAAgD;AACnD,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,sBAAgB,CAAA,CAAE;AAElB,UAAI;AAEA,cAAM,gBAA+B;AAAA,UACjC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,QAAQ,UAAU,oBAAI,IAAA;AAAA,QAAI;AAI9B,cAAM,eAAe,EAAE,GAAG,oBAAoB,GAAG,YAAA;AACjD,YAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACtC,wBAAc,MAAMU,IAAAA,kBAAkB,YAAY;AAAA,QACtD;AAEA,cAAM,SAAS,MAAMC,WAAa,iBAAiB,aAAa;AAEhE,YAAI,WAAW,SAAS;AACpB,oBAAU,OAAO,IAAI;AACrB,yBAAe,OAAO,iBAAiB,EAAE;AAGzC,cAAI,CAAC,OAAO,MAAM,YAAY,QAAQ;AAClC,4BAAgB,OAAO,MAAM;AAE7B,kBAAM,aAAa,OAAO,OAAO,CAAC;AAClC,gBAAI,YAAY;AACZ,uBAAS,IAAI,MAAM,GAAG,WAAW,SAAS,KAAK,WAAW,OAAO,EAAE,CAAC;AAAA,YACxE;AAAA,UACJ,OAAO;AACH,4BAAgB,CAAA,CAAE;AAAA,UACtB;AAAA,QACJ;AAAA,MACJ,SAAS,KAAK;AACV,YAAI,WAAW,SAAS;AACpB,mBAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAC5D,oBAAU,IAAI;AACd,yBAAe,CAAA,CAAE;AAAA,QACrB;AAAA,MACJ,UAAA;AACI,YAAI,WAAW,SAAS;AACpB,yBAAe,KAAK;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,sBAAsB,oBAAoB,qBAAqB,aAAa,MAAM;AAAA,EAAA;AAIvF,QAAM,YAAYX,MAAAA;AAAAA,IACd,OAAO,eAAqD;AACxD,YAAM,cAAc,aAAa,EAAE,MAAM,UAAmB,OAAO,eAAe;AAElF,UAAI,CAAC,aAAa;AACd,eAAO;AAAA,MACX;AAEA,UAAI,YAAY;AACZ,uBAAe,EAAE,MAAM,UAAU,OAAO,YAAY;AAAA,MACxD;AAEA,aAAO,YAAY,WAAW;AAAA,IAClC;AAAA,IACA,CAAC,QAAQ,WAAW;AAAA,EAAA;AAIxB,QAAM,SAASA,MAAAA,YAAY,YAA2B;AAClD,QAAI,SAAS;AACT,YAAM,SAAS,OAAO;AAAA,IAC1B;AAAA,EACJ,GAAG,CAAC,SAAS,QAAQ,CAAC;AAGtB,QAAM,YAAYA,kBAAY,CAAC,cAA4B;AACvD,mBAAe,SAAS;AAAA,EAC5B,GAAG,CAAA,CAAE;AAKL,QAAM,uBAAsB,+CAAe,UAAS,WAAW,cAAc,QAAQ;AACrF,QAAM,0BAA0BH,MAAAA,OAAO,mBAAmB;AAC1DC,QAAAA,UAAU,MAAM;AACZ,QAAI,wBAAwB,wBAAwB,SAAS;AACzD,8BAAwB,UAAU;AAClC,UAAI,eAAe;AACf,uBAAe,aAAa;AAAA,MAChC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,qBAAqB,aAAa,CAAC;AAGvCA,QAAAA,UAAU,MAAM;AACZ,QAAI,QAAQ;AACR,WAAK,YAAY,MAAM;AAAA,IAC3B,OAAO;AACH,iBAAW,IAAI;AACf,2BAAqB,CAAA,CAAE;AACvB,eAAS,IAAI;AAAA,IACjB;AAAA,EACJ,GAAG,CAAC,QAAQ,WAAW,CAAC;AAGxBA,QAAAA,UAAU,MAAM;AACZ,QAAI,cAAc,SAAS;AACvB,WAAK,SAAS,OAAO;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,YAAY,SAAS,QAAQ,CAAC;AAGlCA,QAAAA,UAAU,MAAM;AACZ,QAAI,cAAc,WAAW,QAAQ;AACjC,WAAK,SAAS,OAAO;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,YAAY,SAAS,QAAQ,QAAQ,CAAC;AAE1C,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,kBAAkB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;ACvOO,SAAS,eAAe;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAA4C;AACxC,QAAM,CAAC,UAAU,WAAW,IAAIF,MAAAA,SAAS,KAAK;AAG9C,QAAM,mBAAmBM,MAAAA;AAAAA,IACrB,MAAO,OAAO,WAAW,WAAW,EAAE,MAAM,UAAU,OAAO,OAAA,IAAW;AAAA,IACxE,CAAC,MAAM;AAAA,EAAA;AAGX,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EAAA,IACR,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR;AAAA,IACA,GAAI,WAAW,UAAa,EAAE,OAAA;AAAA,IAC9B,GAAI,kBAAkB,UAAa,EAAE,cAAA;AAAA,IACrC,GAAI,gBAAgB,UAAa,EAAE,YAAA;AAAA,IACnC,GAAI,aAAa,UAAa,EAAE,SAAA;AAAA,EAAS,CAC5C;AAED,QAAM,UAAU,WAAW,QAAQ,kBAAkB,WAAW;AAEhE,QAAM,kBAAkBF,MAAAA,YAAY,YAAY;AAC5C,QAAI,WAAW,MAAM;AACjB;AAAA,IACJ;AACA,QAAI;AACA,YAAM,UAAU,UAAU,UAAU,MAAM;AAC1C,kBAAY,IAAI;AAEhB,iBAAW,MAAM;AACb,oBAAY,KAAK;AAAA,MACrB,GAAG,GAAI;AAAA,IACX,QAAQ;AAAA,IAER;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,SAASA,MAAAA,YAAY,YAAY;AACnC,UAAM,SAAA;AAAA,EACV,GAAG,CAAC,QAAQ,CAAC;AAEb,+DAES,UAAA,SAAS;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACH,GACL;AAER;ACzDO,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,CAAA;AAAA,EAChB,cAAc,CAAA;AAClB,GAA0C;AACtC,QAAM,CAAC,SAAS,IAAIJ,MAAAA,SAAS,KAAK;AAClC,QAAM,CAAC,KAAK,IAAIA,MAAAA,SAAuB,IAAI;AAG3C,QAAM,eAAoCM,MAAAA,QAAQ,MAAM;AACpD,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AAClC,aAAO;AAAA,IACX;AACA,QAAI;AACA,YAAM,SAASU,IAAAA,mBAAmB,YAAY;AAC9C,aAAO,MAAM,OAAO;AACpB,aAAO;AAAA,IACX,SAAS,KAAK;AACV,cAAQ,MAAM,uCAAuC,GAAG;AACxD,aAAO;AAAA,IACX;AAAA,EACJ,GAAG,CAAC,SAAS,YAAY,CAAC;AAG1B,QAAM,eAAiCV,MAAAA;AAAAA,IACnC,OAAO;AAAA,MACH,cAAc;AAAA,MACd;AAAA,MACA,SAAS,WAAW,CAAA;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEJ,CAAC,cAAc,SAAS,eAAe,aAAa,WAAW,KAAK;AAAA,EAAA;AAGxE,wCAAQ,YAAY,UAAZ,EAAqB,OAAO,cAAe,UAAS;AAChE;ACpDO,SAAS,WAAW,SAA8C;AACrE,QAAM,EAAE,SAAS,OAAA,IAAW;AAE5B,SAAOA,MAAAA,QAAQ,MAAM;AACjB,QAAI;AACA,aAAO,EAAE,QAAQW,oBAAgB,SAAS,MAAM,GAAG,OAAO,KAAA;AAAA,IAC9D,SAAS,KAAK;AACV,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,OAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,MAAA;AAAA,IAEjE;AAAA,EACJ,GAAG,CAAC,SAAS,MAAM,CAAC;AACxB;ACCO,SAAS,eAAe,SAAsD;AACjF,QAAM,EAAE,SAAS,SAAA,IAAa;AAE9B,QAAM,CAAC,aAAa,cAAc,IAAIjB,MAAAA,SAAmC,MAAM,oBAAI,KAAK;AACxF,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAmC,MAAM,oBAAI,KAAK;AAG1F,QAAM,iBAAiBC,MAAAA,OAAO,OAAO;AACrC,MAAI,eAAe,YAAY,SAAS;AACpC,mBAAe,UAAU;AAGzB,mBAAe,oBAAI,KAAK;AACxB,oBAAgB,oBAAI,KAAK;AAAA,EAC7B;AAEA,QAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;AACxF,QAAM,kBAAkB,QAAQ,OAAO,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AAChE,QAAM,mBAAmB,QAAQ,OAAO,CAAC,MAAM,aAAa,IAAI,CAAC,CAAC;AAClE,QAAM,UAAU,eAAe,WAAW;AAE1C,QAAM,UAAUG,MAAAA;AAAAA,IACZ,OAAO,WAAgC;AAEnC,UAAI,YAAY,IAAI,MAAM,GAAG;AACzB;AAAA,MACJ;AAEA,YAAM,UAAU,qCAAW,OAAO;AAClC,UAAI,SAAS;AACT,cAAM,QAAQ,MAAM;AAAA,MACxB;AAEA,qBAAe,CAAC,SAAS;AACrB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,IAAI,MAAM;AACf,eAAO;AAAA,MACX,CAAC;AAAA,IACL;AAAA,IACA,CAAC,UAAU,WAAW;AAAA,EAAA;AAG1B,QAAM,UAAUA,kBAAY,CAAC,WAAgC;AACzD,oBAAgB,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,WAAK,IAAI,MAAM;AACf,aAAO;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAA,CAAE;AAEL,QAAM,aAAaA,MAAAA,YAAY,YAAY;AACvC,eAAW,UAAU,gBAAgB;AACjC,YAAM,UAAU,qCAAW,OAAO;AAClC,UAAI,SAAS;AACT,cAAM,QAAQ,MAAM;AAAA,MACxB;AAAA,IACJ;AAEA,mBAAe,CAAC,SAAS;AACrB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,iBAAW,UAAU,gBAAgB;AACjC,aAAK,IAAI,MAAM;AAAA,MACnB;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAC,gBAAgB,QAAQ,CAAC;AAE7B,QAAM,aAAaA,MAAAA,YAAY,MAAM;AACjC,oBAAgB,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,iBAAW,UAAU,gBAAgB;AACjC,aAAK,IAAI,MAAM;AAAA,MACnB;AACA,aAAO;AAAA,IACX,CAAC;AAAA,EACL,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,QAAQA,MAAAA,YAAY,MAAM;AAC5B,mBAAe,oBAAI,KAAK;AACxB,oBAAgB,oBAAI,KAAK;AAAA,EAC7B,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;AC/HA,MAAM,mBAAmB;AA0BlB,SAAS,gBAAgB,UAAkC,IAA2B;AACzF,QAAM,EAAE,WAAW,kBAAkB,MAAA,IAAU;AAC/C,QAAM,EAAE,aAAA,IAAiB,QAAA;AAEzB,QAAM,CAAC,OAAO,aAAa,IAAIJ,MAAAA,SAAS,EAAE;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAyB,CAAA,CAAE;AACzD,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,KAAK;AAEpD,QAAM,WAAWC,MAAAA,OAA6C,IAAI;AAGlE,QAAM,gBAAgBG,MAAAA;AAAAA,IAClB,CAAC,gBAAwB;AACrB,UAAI,CAAC,gBAAgB,YAAY,KAAA,MAAW,IAAI;AAC5C,mBAAW,CAAA,CAAE;AACb,uBAAe,KAAK;AACpB;AAAA,MACJ;AAEA,qBAAe,IAAI;AACnB,UAAI;AACA,cAAM,gBAAgB,UAAU,SAAY,EAAE,MAAA,IAAU,CAAA;AACxD,cAAM,gBAAgB,aAAa,OAAO,aAAa,aAAa;AACpE,mBAAW,aAAa;AAAA,MAC5B,UAAA;AACI,uBAAe,KAAK;AAAA,MACxB;AAAA,IACJ;AAAA,IACA,CAAC,cAAc,KAAK;AAAA,EAAA;AAIxB,QAAM,WAAWA,MAAAA;AAAAA,IACb,CAAC,aAAqB;AAClB,oBAAc,QAAQ;AAEtB,UAAI,SAAS,YAAY,MAAM;AAC3B,qBAAa,SAAS,OAAO;AAC7B,iBAAS,UAAU;AAAA,MACvB;AAEA,UAAI,SAAS,KAAA,MAAW,IAAI;AACxB,mBAAW,CAAA,CAAE;AACb,uBAAe,KAAK;AACpB;AAAA,MACJ;AAEA,UAAI,YAAY,GAAG;AACf,sBAAc,QAAQ;AAAA,MAC1B,OAAO;AACH,uBAAe,IAAI;AACnB,iBAAS,UAAU,WAAW,MAAM;AAChC,mBAAS,UAAU;AACnB,wBAAc,QAAQ;AAAA,QAC1B,GAAG,QAAQ;AAAA,MACf;AAAA,IACJ;AAAA,IACA,CAAC,UAAU,aAAa;AAAA,EAAA;AAI5B,QAAM,QAAQA,MAAAA,YAAY,MAAM;AAC5B,QAAI,SAAS,YAAY,MAAM;AAC3B,mBAAa,SAAS,OAAO;AAC7B,eAAS,UAAU;AAAA,IACvB;AACA,kBAAc,EAAE;AAChB,eAAW,CAAA,CAAE;AACb,mBAAe,KAAK;AAAA,EACxB,GAAG,CAAA,CAAE;AAGL,QAAM,UAAU,eAAe,aAAa,WAAA,IAAe,CAAA;AAG3DF,QAAAA,UAAU,MAAM;AACZ,WAAO,MAAM;AACT,UAAI,SAAS,YAAY,MAAM;AAC3B,qBAAa,SAAS,OAAO;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;ACzGO,SAAS,wBAA8C;AAC1D,QAAM,MAAMW,MAAAA,WAAW,kBAAkB;AACzC,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACrF;AACA,SAAO;AACX;ACwBO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|