@magnet-cms/plugin-playground 2.0.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/dist/backend/index.cjs +1023 -0
- package/dist/backend/index.d.cts +10 -0
- package/dist/backend/index.d.ts +10 -0
- package/dist/backend/index.js +1 -0
- package/dist/chunk-WY4YMBWZ.js +1044 -0
- package/dist/frontend/bundle.iife.js +2163 -0
- package/dist/frontend/bundle.iife.js.map +1 -0
- package/dist/index.cjs +1135 -0
- package/dist/index.d.cts +36 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +76 -0
- package/package.json +81 -0
- package/src/frontend/index.ts +110 -0
- package/src/frontend/pages/Playground/Editor/AddFieldDialog.tsx +187 -0
- package/src/frontend/pages/Playground/Editor/CodePreview.tsx +59 -0
- package/src/frontend/pages/Playground/Editor/FieldCard.tsx +161 -0
- package/src/frontend/pages/Playground/Editor/FieldList.tsx +121 -0
- package/src/frontend/pages/Playground/Editor/FieldSettingsPanel.tsx +652 -0
- package/src/frontend/pages/Playground/Editor/RelationConfigModal.tsx +292 -0
- package/src/frontend/pages/Playground/Editor/SchemaList.tsx +76 -0
- package/src/frontend/pages/Playground/Editor/SchemaOptionsDialog.tsx +109 -0
- package/src/frontend/pages/Playground/Editor/index.tsx +322 -0
- package/src/frontend/pages/Playground/constants/field-types.ts +384 -0
- package/src/frontend/pages/Playground/hooks/useSchemaBuilder.ts +280 -0
- package/src/frontend/pages/Playground/index.tsx +19 -0
- package/src/frontend/pages/Playground/types/builder.types.ts +191 -0
- package/src/frontend/pages/Playground/utils/code-generator.ts +319 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle.iife.js","sources":["../../src/frontend/index.ts","../../src/frontend/pages/Playground/index.tsx","../../src/frontend/pages/Playground/constants/field-types.ts","../../src/frontend/pages/Playground/types/builder.types.ts","../../src/frontend/pages/Playground/utils/code-generator.ts","../../src/frontend/pages/Playground/hooks/useSchemaBuilder.ts","../../src/frontend/pages/Playground/Editor/AddFieldDialog.tsx","../../src/frontend/pages/Playground/Editor/CodePreview.tsx","../../src/frontend/pages/Playground/Editor/FieldCard.tsx","../../src/frontend/pages/Playground/Editor/FieldList.tsx","../../src/frontend/pages/Playground/Editor/RelationConfigModal.tsx","../../src/frontend/pages/Playground/Editor/FieldSettingsPanel.tsx","../../src/frontend/pages/Playground/Editor/SchemaList.tsx","../../src/frontend/pages/Playground/Editor/SchemaOptionsDialog.tsx","../../src/frontend/pages/Playground/Editor/index.tsx"],"sourcesContent":["/**\n * Playground plugin — frontend entry\n *\n * This file automatically registers the plugin when loaded via script injection.\n * The admin app loads plugin bundles at runtime and plugins self-register\n * on window.__MAGNET_PLUGINS__.\n */\n\nimport type { ComponentType } from 'react'\n\n/**\n * Plugin manifest type (inline to avoid import issues in UMD bundle)\n */\ninterface FrontendPluginManifest {\n\tpluginName: string\n\troutes?: {\n\t\tpath: string\n\t\tcomponentId: string\n\t\tchildren?: { path: string; componentId: string }[]\n\t}[]\n\tsidebar?: {\n\t\tid: string\n\t\ttitle: string\n\t\turl: string\n\t\ticon: string\n\t\torder?: number\n\t}[]\n}\n\n/**\n * Plugin registration type\n */\ninterface PluginRegistration {\n\tmanifest: FrontendPluginManifest\n\tcomponents: Record<string, () => Promise<{ default: ComponentType<unknown> }>>\n}\n\n// Extend window for plugin registry\ndeclare global {\n\tinterface Window {\n\t\t__MAGNET_PLUGINS__?: PluginRegistration[]\n\t}\n}\n\n/**\n * Plugin manifest defining routes and sidebar items\n */\nconst manifest: FrontendPluginManifest = {\n\tpluginName: 'playground',\n\troutes: [\n\t\t{\n\t\t\tpath: 'playground',\n\t\t\tcomponentId: 'PlaygroundIndex',\n\t\t\tchildren: [\n\t\t\t\t{ path: '', componentId: 'PlaygroundIndex' },\n\t\t\t\t{ path: 'new', componentId: 'PlaygroundEditor' },\n\t\t\t\t{ path: ':schemaName', componentId: 'PlaygroundEditor' },\n\t\t\t],\n\t\t},\n\t],\n\tsidebar: [\n\t\t{\n\t\t\tid: 'playground',\n\t\t\ttitle: 'Playground',\n\t\t\turl: '/playground',\n\t\t\ticon: 'Boxes',\n\t\t\torder: 20,\n\t\t},\n\t],\n}\n\n/**\n * Component loaders for lazy loading\n */\nconst components: Record<\n\tstring,\n\t() => Promise<{ default: ComponentType<unknown> }>\n> = {\n\tPlaygroundIndex: () => import('./pages/Playground'),\n\tPlaygroundEditor: () => import('./pages/Playground/Editor'),\n}\n\n/**\n * Self-register the plugin when the script is loaded\n */\nfunction registerPlugin() {\n\t// Initialize registry if needed\n\tif (!window.__MAGNET_PLUGINS__) {\n\t\twindow.__MAGNET_PLUGINS__ = []\n\t}\n\n\t// Check if already registered\n\tconst alreadyRegistered = window.__MAGNET_PLUGINS__.some(\n\t\t(p) => p.manifest.pluginName === manifest.pluginName,\n\t)\n\n\tif (!alreadyRegistered) {\n\t\twindow.__MAGNET_PLUGINS__.push({ manifest, components })\n\t\tconsole.log(`[Magnet] Plugin registered: ${manifest.pluginName}`)\n\t}\n}\n\n// Auto-register on load\nregisterPlugin()\n\n/**\n * For `createMagnetAdmin({ plugins: [playgroundPlugin] })` (optional; admin usually loads the IIFE at runtime).\n */\nexport const playgroundPlugin = () => ({ manifest, components })\nexport default playgroundPlugin\n","import { useEffect } from 'react'\nimport { useNavigate } from 'react-router-dom'\n\n/**\n * Playground index - redirects to the editor with 3-column layout\n * The schema list is now integrated into the editor sidebar\n */\nconst Playground = () => {\n\tconst navigate = useNavigate()\n\n\tuseEffect(() => {\n\t\t// Redirect to new schema editor - the schema list is shown in the sidebar\n\t\tnavigate('/playground/new', { replace: true })\n\t}, [navigate])\n\n\treturn null\n}\n\nexport default Playground\n","import {\n\tCalendar,\n\tHash,\n\tLink2,\n\tList,\n\ttype LucideIcon,\n\tToggleLeft,\n\tType,\n} from 'lucide-react'\nimport type {\n\tFieldType,\n\tFieldUIConfig,\n\tValidationRule,\n} from '../types/builder.types'\n\n/**\n * Field type definition for the builder UI\n */\nexport interface FieldTypeDefinition {\n\tid: FieldType\n\tlabel: string\n\tdescription: string\n\ticon: LucideIcon\n\ttsType: string\n\tdefaultValidations: ValidationRule[]\n\tdefaultUI: FieldUIConfig\n\thasOptions?: boolean // For select fields\n\thasRelationConfig?: boolean // For relation fields\n\trequiresTransformer?: boolean // For Date fields\n}\n\n/**\n * All available field types in the schema builder\n */\nexport const FIELD_TYPES: FieldTypeDefinition[] = [\n\t{\n\t\tid: 'text',\n\t\tlabel: 'Text',\n\t\tdescription: 'Short or long text content',\n\t\ticon: Type,\n\t\ttsType: 'string',\n\t\tdefaultValidations: [{ type: 'IsString' }, { type: 'IsNotEmpty' }],\n\t\tdefaultUI: { type: 'text' },\n\t},\n\t{\n\t\tid: 'number',\n\t\tlabel: 'Number',\n\t\tdescription: 'Integer or decimal numbers',\n\t\ticon: Hash,\n\t\ttsType: 'number',\n\t\tdefaultValidations: [{ type: 'IsNumber' }],\n\t\tdefaultUI: { type: 'number' },\n\t},\n\t{\n\t\tid: 'date',\n\t\tlabel: 'Date',\n\t\tdescription: 'Date and time values',\n\t\ticon: Calendar,\n\t\ttsType: 'Date',\n\t\tdefaultValidations: [{ type: 'IsDate' }],\n\t\tdefaultUI: { type: 'date' },\n\t\trequiresTransformer: true,\n\t},\n\t{\n\t\tid: 'boolean',\n\t\tlabel: 'Boolean',\n\t\tdescription: 'True or false toggle',\n\t\ticon: ToggleLeft,\n\t\ttsType: 'boolean',\n\t\tdefaultValidations: [{ type: 'IsBoolean' }],\n\t\tdefaultUI: { type: 'switch' },\n\t},\n\t{\n\t\tid: 'select',\n\t\tlabel: 'Select',\n\t\tdescription: 'Dropdown with predefined options',\n\t\ticon: List,\n\t\ttsType: 'string',\n\t\tdefaultValidations: [{ type: 'IsString' }],\n\t\tdefaultUI: { type: 'select', options: [] },\n\t\thasOptions: true,\n\t},\n\t{\n\t\tid: 'relation',\n\t\tlabel: 'Relation',\n\t\tdescription: 'Reference to another schema',\n\t\ticon: Link2,\n\t\ttsType: 'string',\n\t\tdefaultValidations: [{ type: 'IsString' }],\n\t\tdefaultUI: { type: 'relationship' },\n\t\thasRelationConfig: true,\n\t},\n]\n\n/**\n * Get field type definition by ID\n */\nexport function getFieldTypeDefinition(\n\ttype: FieldType,\n): FieldTypeDefinition | undefined {\n\treturn FIELD_TYPES.find((ft) => ft.id === type)\n}\n\n/**\n * UI subtype definition for field type variations\n */\nexport interface UISubtypeDefinition {\n\tid: string\n\tlabel: string\n\tdescription: string\n}\n\n/**\n * Available UI subtypes for each base field type.\n * These map to the UITypes in @magnet-cms/common and are rendered by FormBuilder.\n */\nexport const UI_SUBTYPES: Record<FieldType, UISubtypeDefinition[]> = {\n\ttext: [\n\t\t{ id: 'text', label: 'Text Input', description: 'Single line text' },\n\t\t{ id: 'textarea', label: 'Text Area', description: 'Multi-line text' },\n\t\t{ id: 'email', label: 'Email', description: 'Email with validation' },\n\t\t{ id: 'phone', label: 'Phone', description: 'Phone number input' },\n\t\t{ id: 'richText', label: 'Rich Text', description: 'Rich text editor' },\n\t],\n\tnumber: [\n\t\t{\n\t\t\tid: 'number',\n\t\t\tlabel: 'Number Input',\n\t\t\tdescription: 'Standard number field',\n\t\t},\n\t\t{\n\t\t\tid: 'quantity',\n\t\t\tlabel: 'Quantity',\n\t\t\tdescription: 'Number with +/- buttons',\n\t\t},\n\t],\n\tdate: [\n\t\t{\n\t\t\tid: 'date',\n\t\t\tlabel: 'Date Picker',\n\t\t\tdescription: 'Calendar date selection',\n\t\t},\n\t],\n\tboolean: [\n\t\t{ id: 'switch', label: 'Switch', description: 'Toggle switch' },\n\t\t{ id: 'checkbox', label: 'Checkbox', description: 'Checkbox input' },\n\t],\n\tselect: [\n\t\t{ id: 'select', label: 'Dropdown', description: 'Single select dropdown' },\n\t\t{\n\t\t\tid: 'multiSelect',\n\t\t\tlabel: 'Multi Select',\n\t\t\tdescription: 'Select multiple options',\n\t\t},\n\t\t{ id: 'combobox', label: 'Combobox', description: 'Searchable dropdown' },\n\t\t{ id: 'radio', label: 'Radio Group', description: 'Radio button options' },\n\t],\n\trelation: [\n\t\t{\n\t\t\tid: 'relationship',\n\t\t\tlabel: 'Relationship',\n\t\t\tdescription: 'Link to another schema',\n\t\t},\n\t],\n}\n\n/**\n * Get UI subtypes for a field type\n */\nexport function getUISubtypes(type: FieldType): UISubtypeDefinition[] {\n\treturn UI_SUBTYPES[type] || []\n}\n\n/**\n * Get the icon component for a field type\n */\nexport function getFieldTypeIcon(type: FieldType): LucideIcon {\n\tconst definition = getFieldTypeDefinition(type)\n\treturn definition?.icon ?? Type\n}\n\n/**\n * Available validation rules for each field type\n */\nexport const VALIDATION_RULES_BY_TYPE: Record<FieldType, string[]> = {\n\ttext: [\n\t\t'IsString',\n\t\t'IsNotEmpty',\n\t\t'Length',\n\t\t'MinLength',\n\t\t'MaxLength',\n\t\t'IsEmail',\n\t\t'IsUrl',\n\t\t'IsUUID',\n\t\t'Matches',\n\t],\n\tnumber: ['IsNumber', 'IsInt', 'IsPositive', 'IsNegative', 'Min', 'Max'],\n\tdate: ['IsDate', 'IsNotEmpty', 'MinDate', 'MaxDate'],\n\tboolean: ['IsBoolean'],\n\tselect: ['IsString', 'IsNotEmpty', 'IsIn'],\n\trelation: ['IsString', 'IsNotEmpty', 'IsMongoId'],\n}\n\n/**\n * Validation rule definitions with constraint info\n */\nexport interface ValidationRuleDefinition {\n\ttype: string\n\tlabel: string\n\tdescription: string\n\tconstraintCount: number // 0 = no args, 1 = single arg, 2 = two args (min, max)\n\tconstraintLabels?: string[]\n}\n\nexport const VALIDATION_RULE_DEFINITIONS: ValidationRuleDefinition[] = [\n\t{\n\t\ttype: 'IsString',\n\t\tlabel: 'Is String',\n\t\tdescription: 'Must be a string',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsNumber',\n\t\tlabel: 'Is Number',\n\t\tdescription: 'Must be a number',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsInt',\n\t\tlabel: 'Is Integer',\n\t\tdescription: 'Must be an integer',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsBoolean',\n\t\tlabel: 'Is Boolean',\n\t\tdescription: 'Must be true or false',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsDate',\n\t\tlabel: 'Is Date',\n\t\tdescription: 'Must be a valid date',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsNotEmpty',\n\t\tlabel: 'Not Empty',\n\t\tdescription: 'Cannot be empty',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsEmail',\n\t\tlabel: 'Is Email',\n\t\tdescription: 'Must be a valid email',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsUrl',\n\t\tlabel: 'Is URL',\n\t\tdescription: 'Must be a valid URL',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsUUID',\n\t\tlabel: 'Is UUID',\n\t\tdescription: 'Must be a valid UUID',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsMongoId',\n\t\tlabel: 'Is MongoDB ID',\n\t\tdescription: 'Must be a valid MongoDB ObjectId',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsPositive',\n\t\tlabel: 'Is Positive',\n\t\tdescription: 'Must be a positive number',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'IsNegative',\n\t\tlabel: 'Is Negative',\n\t\tdescription: 'Must be a negative number',\n\t\tconstraintCount: 0,\n\t},\n\t{\n\t\ttype: 'Length',\n\t\tlabel: 'Length',\n\t\tdescription: 'String length between min and max',\n\t\tconstraintCount: 2,\n\t\tconstraintLabels: ['Min', 'Max'],\n\t},\n\t{\n\t\ttype: 'MinLength',\n\t\tlabel: 'Min Length',\n\t\tdescription: 'Minimum string length',\n\t\tconstraintCount: 1,\n\t\tconstraintLabels: ['Min'],\n\t},\n\t{\n\t\ttype: 'MaxLength',\n\t\tlabel: 'Max Length',\n\t\tdescription: 'Maximum string length',\n\t\tconstraintCount: 1,\n\t\tconstraintLabels: ['Max'],\n\t},\n\t{\n\t\ttype: 'Min',\n\t\tlabel: 'Minimum',\n\t\tdescription: 'Minimum number value',\n\t\tconstraintCount: 1,\n\t\tconstraintLabels: ['Min'],\n\t},\n\t{\n\t\ttype: 'Max',\n\t\tlabel: 'Maximum',\n\t\tdescription: 'Maximum number value',\n\t\tconstraintCount: 1,\n\t\tconstraintLabels: ['Max'],\n\t},\n\t{\n\t\ttype: 'Matches',\n\t\tlabel: 'Matches Pattern',\n\t\tdescription: 'Must match regex pattern',\n\t\tconstraintCount: 1,\n\t\tconstraintLabels: ['Pattern'],\n\t},\n\t{\n\t\ttype: 'IsIn',\n\t\tlabel: 'Is In List',\n\t\tdescription: 'Must be one of the allowed values',\n\t\tconstraintCount: 1,\n\t\tconstraintLabels: ['Values (comma-separated)'],\n\t},\n]\n\n/**\n * Get validation rule definition by type\n */\nexport function getValidationRuleDefinition(\n\ttype: string,\n): ValidationRuleDefinition | undefined {\n\treturn VALIDATION_RULE_DEFINITIONS.find((r) => r.type === type)\n}\n\n/**\n * Relation type options\n */\nexport const RELATION_TYPES = [\n\t{\n\t\tvalue: 'oneToOne',\n\t\tlabel: 'One to One',\n\t\tdescription: 'Each record relates to exactly one other',\n\t},\n\t{\n\t\tvalue: 'oneToMany',\n\t\tlabel: 'One to Many',\n\t\tdescription: 'One record relates to many others',\n\t},\n\t{\n\t\tvalue: 'manyToOne',\n\t\tlabel: 'Many to One',\n\t\tdescription: 'Many records relate to one',\n\t},\n\t{\n\t\tvalue: 'manyToMany',\n\t\tlabel: 'Many to Many',\n\t\tdescription: 'Many records relate to many others',\n\t},\n] as const\n\n/**\n * Color mapping for field type badges\n */\nexport const FIELD_TYPE_COLORS: Record<FieldType, string> = {\n\ttext: 'bg-blue-50 text-blue-700 border-blue-200',\n\tnumber: 'bg-amber-50 text-amber-700 border-amber-200',\n\tdate: 'bg-green-50 text-green-700 border-green-200',\n\tboolean: 'bg-purple-50 text-purple-700 border-purple-200',\n\tselect: 'bg-cyan-50 text-cyan-700 border-cyan-200',\n\trelation: 'bg-indigo-50 text-indigo-700 border-indigo-200',\n}\n","/**\n * Schema Playground Builder Types\n *\n * These types define the state structure for the visual schema builder.\n */\n\n/**\n * Supported field types in the schema builder\n */\nexport type FieldType =\n\t| 'text'\n\t| 'number'\n\t| 'date'\n\t| 'boolean'\n\t| 'select'\n\t| 'relation'\n\n/**\n * Select/dropdown option structure\n */\nexport interface SelectOption {\n\tkey: string\n\tvalue: string\n}\n\n/**\n * Relation field configuration\n */\nexport interface RelationConfig {\n\ttargetSchema: string\n\trelationType: 'oneToOne' | 'oneToMany' | 'manyToOne' | 'manyToMany'\n\tinverseSide?: string\n}\n\n/**\n * Validation rule structure (maps to class-validator decorators)\n */\nexport interface ValidationRule {\n\ttype: string // e.g., 'IsString', 'IsNotEmpty', 'Length', 'Min', 'Max'\n\tconstraints?: (string | number)[] // e.g., [10, 255] for Length\n\tmessage?: string // Custom error message\n}\n\n/**\n * UI configuration (maps to @UI() decorator options)\n */\nexport interface FieldUIConfig {\n\ttype?: string // UI type override (e.g., 'switch' for boolean)\n\tlabel?: string // Display label\n\tdescription?: string // Help text\n\tplaceholder?: string // Input placeholder\n\ttab?: string // Tab name for grouping\n\tside?: boolean // Show in side panel\n\trow?: boolean // Half-width layout\n\toptions?: SelectOption[] // For select/radio fields\n}\n\n/**\n * Property configuration (maps to @Prop() decorator options)\n */\nexport interface FieldPropConfig {\n\trequired?: boolean\n\tunique?: boolean\n\tdefault?: unknown\n\tintl?: boolean // Enable i18n for this field\n\thidden?: boolean // Hide from UI\n\treadonly?: boolean\n}\n\n/**\n * Complete field definition in the builder\n */\nexport interface SchemaField {\n\tid: string // Unique ID for React keys and drag-drop\n\tname: string // API ID / property name (e.g., 'firstName')\n\tdisplayName: string // Human-readable label (e.g., 'First Name')\n\ttype: FieldType // Field type\n\ttsType: string // TypeScript type (string, number, Date, boolean, etc.)\n\tprop: FieldPropConfig // @Prop() options\n\tui: FieldUIConfig // @UI() options\n\tvalidations: ValidationRule[] // @Validators() rules\n\trelationConfig?: RelationConfig // For relation fields\n}\n\n/**\n * Schema-level configuration (maps to @Schema() decorator options)\n */\nexport interface SchemaConfig {\n\tname: string // Class name (e.g., 'Cat')\n\tapiId?: string // API identifier (e.g., 'cat')\n\tversioning: boolean // Enable version history\n\ti18n: boolean // Enable internationalization\n\tdescription?: string // Schema description\n}\n\n/**\n * View modes for the editor\n */\nexport type ViewMode = 'builder' | 'json' | 'code'\n\n/**\n * Complete builder state\n */\nexport interface SchemaBuilderState {\n\tschema: SchemaConfig\n\tfields: SchemaField[]\n\tselectedFieldId: string | null\n\tviewMode: ViewMode\n\tisDirty: boolean\n\tlastSaved: Date | null\n\tisNew: boolean // Whether this is a new schema or editing existing\n}\n\n/**\n * Reducer action types\n */\nexport type SchemaBuilderAction =\n\t| { type: 'SET_SCHEMA'; payload: Partial<SchemaConfig> }\n\t| { type: 'ADD_FIELD'; payload: SchemaField }\n\t| {\n\t\t\ttype: 'UPDATE_FIELD'\n\t\t\tpayload: { id: string; changes: Partial<SchemaField> }\n\t }\n\t| { type: 'DELETE_FIELD'; payload: string }\n\t| { type: 'REORDER_FIELDS'; payload: SchemaField[] }\n\t| { type: 'SELECT_FIELD'; payload: string | null }\n\t| { type: 'SET_VIEW_MODE'; payload: ViewMode }\n\t| { type: 'MARK_DIRTY' }\n\t| { type: 'MARK_SAVED' }\n\t| { type: 'RESET'; payload: SchemaBuilderState }\n\t| {\n\t\t\ttype: 'LOAD_SCHEMA'\n\t\t\tpayload: { schema: SchemaConfig; fields: SchemaField[] }\n\t }\n\n/**\n * Default values for a new schema\n */\nexport const DEFAULT_SCHEMA_CONFIG: SchemaConfig = {\n\tname: '',\n\tversioning: true,\n\ti18n: true,\n}\n\n/**\n * Default builder state\n */\nexport const DEFAULT_BUILDER_STATE: SchemaBuilderState = {\n\tschema: DEFAULT_SCHEMA_CONFIG,\n\tfields: [],\n\tselectedFieldId: null,\n\tviewMode: 'builder',\n\tisDirty: false,\n\tlastSaved: null,\n\tisNew: true,\n}\n\n/**\n * Mapping from field type to TypeScript type\n */\nexport const FIELD_TYPE_TO_TS_TYPE: Record<FieldType, string> = {\n\ttext: 'string',\n\tnumber: 'number',\n\tdate: 'Date',\n\tboolean: 'boolean',\n\tselect: 'string',\n\trelation: 'string', // ObjectId reference\n}\n\n/**\n * Context type for the schema builder\n */\nexport interface SchemaBuilderContextType {\n\tstate: SchemaBuilderState\n\tdispatch: React.Dispatch<SchemaBuilderAction>\n\n\t// Convenience actions\n\taddField: (field: Partial<SchemaField>) => void\n\tupdateField: (id: string, changes: Partial<SchemaField>) => void\n\tdeleteField: (id: string) => void\n\tselectField: (id: string | null) => void\n\treorderFields: (fields: SchemaField[]) => void\n\tsetViewMode: (mode: ViewMode) => void\n\tupdateSchema: (changes: Partial<SchemaConfig>) => void\n\tresetState: (state?: SchemaBuilderState) => void\n\n\t// Computed values\n\tselectedField: SchemaField | null\n\tgeneratedCode: string\n\tgeneratedJSON: object\n}\n","import type {\n\tSchemaBuilderState,\n\tSchemaField,\n\tValidationRule,\n} from '../types/builder.types'\n\n/**\n * Generate TypeScript schema code from builder state\n */\nexport function generateSchemaCode(state: SchemaBuilderState): string {\n\tif (!state.schema.name) {\n\t\treturn '// Enter a schema name to generate code'\n\t}\n\n\tconst imports = generateImports(state.fields)\n\tconst classDecorator = generateSchemaDecorator(state.schema)\n\tconst properties = state.fields\n\t\t.map((field) => generateFieldCode(field))\n\t\t.join('\\n\\n')\n\n\treturn `${imports}\\n\\n${classDecorator}\\nexport class ${state.schema.name} {\\n${properties}\\n}\\n`\n}\n\n/**\n * Generate import statements based on used features\n */\nfunction generateImports(fields: SchemaField[]): string {\n\tconst magnetImports = new Set(['Schema', 'Prop', 'UI'])\n\tconst validatorImports = new Set<string>()\n\tlet needsTypeTransformer = false\n\n\tfor (const field of fields) {\n\t\t// Check if we need Validators decorator\n\t\tif (field.validations.length > 0) {\n\t\t\tmagnetImports.add('Validators')\n\t\t\tfor (const v of field.validations) {\n\t\t\t\tvalidatorImports.add(v.type)\n\t\t\t}\n\t\t}\n\n\t\t// Check if we need Type transformer (for Date fields)\n\t\tif (field.type === 'date') {\n\t\t\tneedsTypeTransformer = true\n\t\t}\n\t}\n\n\tconst lines: string[] = []\n\n\t// Magnet imports\n\tlines.push(\n\t\t`import { ${Array.from(magnetImports).sort().join(', ')} } from '@magnet-cms/common'`,\n\t)\n\n\t// Class-transformer imports\n\tif (needsTypeTransformer) {\n\t\tlines.push(`import { Type } from 'class-transformer'`)\n\t}\n\n\t// Class-validator imports\n\tif (validatorImports.size > 0) {\n\t\tlines.push(\n\t\t\t`import {\\n\\t${Array.from(validatorImports).sort().join(',\\n\\t')},\\n} from 'class-validator'`,\n\t\t)\n\t}\n\n\treturn lines.join('\\n')\n}\n\n/**\n * Generate @Schema() decorator\n */\nfunction generateSchemaDecorator(schema: SchemaBuilderState['schema']): string {\n\tconst options: string[] = []\n\n\t// Only add options if they differ from defaults or if we want to be explicit\n\tif (schema.versioning !== undefined) {\n\t\toptions.push(`versioning: ${schema.versioning}`)\n\t}\n\tif (schema.i18n !== undefined) {\n\t\toptions.push(`i18n: ${schema.i18n}`)\n\t}\n\n\tif (options.length === 0) {\n\t\treturn '@Schema()'\n\t}\n\n\treturn `@Schema({ ${options.join(', ')} })`\n}\n\n/**\n * Generate code for a single field\n */\nfunction generateFieldCode(field: SchemaField): string {\n\tconst decorators: string[] = []\n\tconst indent = '\\t'\n\n\t// @Type() decorator for Date fields (must come first)\n\tif (field.type === 'date') {\n\t\tdecorators.push(`${indent}@Type(() => Date)`)\n\t}\n\n\t// @Prop() decorator\n\tdecorators.push(`${indent}@Prop(${generatePropOptions(field)})`)\n\n\t// @Validators() decorator\n\tif (field.validations.length > 0) {\n\t\tconst validators = field.validations\n\t\t\t.map((v) => formatValidator(v))\n\t\t\t.join(', ')\n\t\tdecorators.push(`${indent}@Validators(${validators})`)\n\t}\n\n\t// @UI() decorator\n\tdecorators.push(`${indent}@UI(${generateUIOptions(field)})`)\n\n\t// Property declaration\n\tconst declaration = `${indent}${field.name}: ${field.tsType}`\n\n\treturn [...decorators, declaration].join('\\n')\n}\n\n/**\n * Generate @Prop() options object\n */\nfunction generatePropOptions(field: SchemaField): string {\n\tconst options: string[] = []\n\n\tif (field.prop.required) {\n\t\toptions.push('required: true')\n\t}\n\tif (field.prop.unique) {\n\t\toptions.push('unique: true')\n\t}\n\tif (field.prop.intl) {\n\t\toptions.push('intl: true')\n\t}\n\tif (field.prop.hidden) {\n\t\toptions.push('hidden: true')\n\t}\n\tif (field.prop.readonly) {\n\t\toptions.push('readonly: true')\n\t}\n\tif (field.prop.default !== undefined) {\n\t\toptions.push(`default: ${JSON.stringify(field.prop.default)}`)\n\t}\n\n\tif (options.length === 0) {\n\t\treturn ''\n\t}\n\n\treturn `{ ${options.join(', ')} }`\n}\n\n/**\n * Generate @UI() options object\n */\nfunction generateUIOptions(field: SchemaField): string {\n\tconst options: string[] = []\n\n\tif (field.ui.tab) {\n\t\toptions.push(`tab: '${field.ui.tab}'`)\n\t}\n\tif (field.ui.side) {\n\t\toptions.push('side: true')\n\t}\n\tif (field.ui.type) {\n\t\toptions.push(`type: '${field.ui.type}'`)\n\t}\n\tif (field.ui.label && field.ui.label !== field.displayName) {\n\t\toptions.push(`label: '${escapeString(field.ui.label)}'`)\n\t}\n\tif (field.ui.description) {\n\t\toptions.push(`description: '${escapeString(field.ui.description)}'`)\n\t}\n\tif (field.ui.placeholder) {\n\t\toptions.push(`placeholder: '${escapeString(field.ui.placeholder)}'`)\n\t}\n\tif (field.ui.row) {\n\t\toptions.push('row: true')\n\t}\n\tif (field.ui.options && field.ui.options.length > 0) {\n\t\tconst optionsStr = field.ui.options\n\t\t\t.map(\n\t\t\t\t(o) =>\n\t\t\t\t\t`{ key: '${escapeString(o.key)}', value: '${escapeString(o.value)}' }`,\n\t\t\t)\n\t\t\t.join(', ')\n\t\toptions.push(`options: [${optionsStr}]`)\n\t}\n\n\tif (options.length === 0) {\n\t\treturn '{}'\n\t}\n\n\treturn `{ ${options.join(', ')} }`\n}\n\n/**\n * Format a validator call\n */\nfunction formatValidator(rule: ValidationRule): string {\n\tif (!rule.constraints || rule.constraints.length === 0) {\n\t\treturn `${rule.type}()`\n\t}\n\n\tconst args = rule.constraints\n\t\t.map((c) => {\n\t\t\tif (typeof c === 'string') {\n\t\t\t\t// Check if it's a regex pattern\n\t\t\t\tif (rule.type === 'Matches') {\n\t\t\t\t\treturn c.startsWith('/') ? c : `/${c}/`\n\t\t\t\t}\n\t\t\t\treturn `'${escapeString(String(c))}'`\n\t\t\t}\n\t\t\treturn String(c)\n\t\t})\n\t\t.join(', ')\n\n\treturn `${rule.type}(${args})`\n}\n\n/**\n * Escape string for use in generated code\n */\nfunction escapeString(str: string): string {\n\treturn str\n\t\t.replace(/\\\\/g, '\\\\\\\\')\n\t\t.replace(/'/g, \"\\\\'\")\n\t\t.replace(/\\n/g, '\\\\n')\n\t\t.replace(/\\r/g, '\\\\r')\n\t\t.replace(/\\t/g, '\\\\t')\n}\n\n/**\n * Generate JSON representation of the schema\n */\nexport function generateSchemaJSON(state: SchemaBuilderState): object {\n\treturn {\n\t\tname: state.schema.name,\n\t\toptions: {\n\t\t\tversioning: state.schema.versioning,\n\t\t\ti18n: state.schema.i18n,\n\t\t},\n\t\tproperties: state.fields.map((field) => ({\n\t\t\tname: field.name,\n\t\t\tdisplayName: field.displayName,\n\t\t\ttype: field.type,\n\t\t\ttsType: field.tsType,\n\t\t\trequired: field.prop.required,\n\t\t\tunique: field.prop.unique,\n\t\t\tintl: field.prop.intl,\n\t\t\tui: field.ui,\n\t\t\tvalidations: field.validations,\n\t\t\t...(field.relationConfig && { relationConfig: field.relationConfig }),\n\t\t})),\n\t}\n}\n\n/**\n * Parse class name to ensure it's valid\n */\nexport function validateSchemaName(name: string): {\n\tvalid: boolean\n\terror?: string\n\tformatted?: string\n} {\n\tif (!name) {\n\t\treturn { valid: false, error: 'Schema name is required' }\n\t}\n\n\t// Must start with uppercase letter\n\tif (!/^[A-Z]/.test(name)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: 'Schema name must start with an uppercase letter',\n\t\t}\n\t}\n\n\t// Only alphanumeric characters\n\tif (!/^[A-Za-z][A-Za-z0-9]*$/.test(name)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: 'Schema name can only contain letters and numbers',\n\t\t}\n\t}\n\n\treturn { valid: true, formatted: name }\n}\n\n/**\n * Parse field name to ensure it's valid\n */\nexport function validateFieldName(name: string): {\n\tvalid: boolean\n\terror?: string\n\tformatted?: string\n} {\n\tif (!name) {\n\t\treturn { valid: false, error: 'Field name is required' }\n\t}\n\n\t// Must start with lowercase letter\n\tif (!/^[a-z]/.test(name)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: 'Field name must start with a lowercase letter',\n\t\t}\n\t}\n\n\t// Only alphanumeric characters\n\tif (!/^[a-z][a-zA-Z0-9]*$/.test(name)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terror: 'Field name can only contain letters and numbers (camelCase)',\n\t\t}\n\t}\n\n\treturn { valid: true, formatted: name }\n}\n","import {\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseMemo,\n\tuseReducer,\n} from 'react'\nimport { getFieldTypeDefinition } from '../constants/field-types'\nimport {\n\tDEFAULT_BUILDER_STATE,\n\tFIELD_TYPE_TO_TS_TYPE,\n\ttype SchemaBuilderAction,\n\ttype SchemaBuilderContextType,\n\ttype SchemaBuilderState,\n\ttype SchemaConfig,\n\ttype SchemaField,\n\ttype ViewMode,\n} from '../types/builder.types'\nimport { generateSchemaCode, generateSchemaJSON } from '../utils/code-generator'\n\n/**\n * Generate a unique ID for fields\n */\nfunction generateId(): string {\n\treturn `field_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`\n}\n\n/**\n * Convert display name to API ID (camelCase)\n */\nfunction toApiId(displayName: string): string {\n\treturn displayName\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9\\s]/g, '')\n\t\t.split(/\\s+/)\n\t\t.filter(Boolean)\n\t\t.map((word, index) =>\n\t\t\tindex === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1),\n\t\t)\n\t\t.join('')\n}\n\n/**\n * Schema builder reducer\n */\nfunction schemaBuilderReducer(\n\tstate: SchemaBuilderState,\n\taction: SchemaBuilderAction,\n): SchemaBuilderState {\n\tswitch (action.type) {\n\t\tcase 'SET_SCHEMA':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tschema: { ...state.schema, ...action.payload },\n\t\t\t\tisDirty: true,\n\t\t\t}\n\n\t\tcase 'ADD_FIELD':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfields: [...state.fields, action.payload],\n\t\t\t\tselectedFieldId: action.payload.id,\n\t\t\t\tisDirty: true,\n\t\t\t}\n\n\t\tcase 'UPDATE_FIELD':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfields: state.fields.map((field) =>\n\t\t\t\t\tfield.id === action.payload.id\n\t\t\t\t\t\t? { ...field, ...action.payload.changes }\n\t\t\t\t\t\t: field,\n\t\t\t\t),\n\t\t\t\tisDirty: true,\n\t\t\t}\n\n\t\tcase 'DELETE_FIELD':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfields: state.fields.filter((field) => field.id !== action.payload),\n\t\t\t\tselectedFieldId:\n\t\t\t\t\tstate.selectedFieldId === action.payload\n\t\t\t\t\t\t? null\n\t\t\t\t\t\t: state.selectedFieldId,\n\t\t\t\tisDirty: true,\n\t\t\t}\n\n\t\tcase 'REORDER_FIELDS':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfields: action.payload,\n\t\t\t\tisDirty: true,\n\t\t\t}\n\n\t\tcase 'SELECT_FIELD':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tselectedFieldId: action.payload,\n\t\t\t}\n\n\t\tcase 'SET_VIEW_MODE':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tviewMode: action.payload,\n\t\t\t}\n\n\t\tcase 'MARK_DIRTY':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisDirty: true,\n\t\t\t}\n\n\t\tcase 'MARK_SAVED':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisDirty: false,\n\t\t\t\tlastSaved: new Date(),\n\t\t\t}\n\n\t\tcase 'RESET':\n\t\t\treturn action.payload\n\n\t\tcase 'LOAD_SCHEMA':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tschema: action.payload.schema,\n\t\t\t\tfields: action.payload.fields,\n\t\t\t\tisDirty: false,\n\t\t\t\tisNew: false,\n\t\t\t}\n\n\t\tdefault:\n\t\t\treturn state\n\t}\n}\n\n/**\n * Schema builder context\n */\nexport const SchemaBuilderContext =\n\tcreateContext<SchemaBuilderContextType | null>(null)\n\n/**\n * Hook to access the schema builder context\n */\nexport function useSchemaBuilder(): SchemaBuilderContextType {\n\tconst context = useContext(SchemaBuilderContext)\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t'useSchemaBuilder must be used within a SchemaBuilderProvider',\n\t\t)\n\t}\n\treturn context\n}\n\n/**\n * Hook to create the schema builder state and actions\n */\nexport function useSchemaBuilderState(\n\tinitialState: SchemaBuilderState = DEFAULT_BUILDER_STATE,\n): SchemaBuilderContextType {\n\tconst [state, dispatch] = useReducer(schemaBuilderReducer, initialState)\n\n\t// Convenience actions\n\tconst addField = useCallback((partial: Partial<SchemaField>) => {\n\t\tconst fieldType = partial.type || 'text'\n\t\tconst definition = getFieldTypeDefinition(fieldType)\n\t\tconst displayName = partial.displayName || 'New Field'\n\t\tconst name = partial.name || toApiId(displayName)\n\n\t\tconst field: SchemaField = {\n\t\t\tid: generateId(),\n\t\t\tname,\n\t\t\tdisplayName,\n\t\t\ttype: fieldType,\n\t\t\ttsType:\n\t\t\t\tdefinition?.tsType || FIELD_TYPE_TO_TS_TYPE[fieldType] || 'string',\n\t\t\tprop: {\n\t\t\t\trequired: false,\n\t\t\t\tunique: false,\n\t\t\t\t...partial.prop,\n\t\t\t},\n\t\t\tui: {\n\t\t\t\ttab: 'General',\n\t\t\t\t...definition?.defaultUI,\n\t\t\t\t...partial.ui,\n\t\t\t},\n\t\t\tvalidations: partial.validations || definition?.defaultValidations || [],\n\t\t\trelationConfig: partial.relationConfig,\n\t\t}\n\n\t\tdispatch({ type: 'ADD_FIELD', payload: field })\n\t}, [])\n\n\tconst updateField = useCallback(\n\t\t(id: string, changes: Partial<SchemaField>) => {\n\t\t\tdispatch({ type: 'UPDATE_FIELD', payload: { id, changes } })\n\t\t},\n\t\t[],\n\t)\n\n\tconst deleteField = useCallback((id: string) => {\n\t\tdispatch({ type: 'DELETE_FIELD', payload: id })\n\t}, [])\n\n\tconst selectField = useCallback((id: string | null) => {\n\t\tdispatch({ type: 'SELECT_FIELD', payload: id })\n\t}, [])\n\n\tconst reorderFields = useCallback((fields: SchemaField[]) => {\n\t\tdispatch({ type: 'REORDER_FIELDS', payload: fields })\n\t}, [])\n\n\tconst setViewMode = useCallback((mode: ViewMode) => {\n\t\tdispatch({ type: 'SET_VIEW_MODE', payload: mode })\n\t}, [])\n\n\tconst updateSchema = useCallback((changes: Partial<SchemaConfig>) => {\n\t\tdispatch({ type: 'SET_SCHEMA', payload: changes })\n\t}, [])\n\n\tconst resetState = useCallback((newState?: SchemaBuilderState) => {\n\t\tdispatch({ type: 'RESET', payload: newState || DEFAULT_BUILDER_STATE })\n\t}, [])\n\n\t// Computed values\n\tconst selectedField = useMemo(\n\t\t() => state.fields.find((f) => f.id === state.selectedFieldId) ?? null,\n\t\t[state.fields, state.selectedFieldId],\n\t)\n\n\tconst generatedCode = useMemo(() => generateSchemaCode(state), [state])\n\n\tconst generatedJSON = useMemo(() => generateSchemaJSON(state), [state])\n\n\treturn {\n\t\tstate,\n\t\tdispatch,\n\t\taddField,\n\t\tupdateField,\n\t\tdeleteField,\n\t\tselectField,\n\t\treorderFields,\n\t\tsetViewMode,\n\t\tupdateSchema,\n\t\tresetState,\n\t\tselectedField,\n\t\tgeneratedCode,\n\t\tgeneratedJSON,\n\t}\n}\n\n/**\n * Create a field from a field type definition\n */\nexport function createFieldFromType(\n\ttype: SchemaField['type'],\n\tdisplayName: string,\n): Partial<SchemaField> {\n\tconst definition = getFieldTypeDefinition(type)\n\tif (!definition) {\n\t\treturn { type, displayName }\n\t}\n\n\treturn {\n\t\ttype,\n\t\tdisplayName,\n\t\tname: toApiId(displayName),\n\t\ttsType: definition.tsType,\n\t\tvalidations: [...definition.defaultValidations],\n\t\tui: { ...definition.defaultUI },\n\t\tprop: { required: false, unique: false },\n\t\t...(definition.hasRelationConfig && {\n\t\t\trelationConfig: {\n\t\t\t\ttargetSchema: '',\n\t\t\t\trelationType: 'manyToOne',\n\t\t\t},\n\t\t}),\n\t}\n}\n","import {\n\tButton,\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tInput,\n\tLabel,\n} from '@magnet-cms/ui/components'\nimport { cn } from '@magnet-cms/ui/lib'\nimport { useState } from 'react'\nimport {\n\tFIELD_TYPES,\n\tFIELD_TYPE_COLORS,\n\ttype FieldTypeDefinition,\n} from '../constants/field-types'\nimport {\n\tcreateFieldFromType,\n\tuseSchemaBuilder,\n} from '../hooks/useSchemaBuilder'\nimport type { FieldType } from '../types/builder.types'\n\ninterface AddFieldDialogProps {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n}\n\nexport function AddFieldDialog({ open, onOpenChange }: AddFieldDialogProps) {\n\tconst { addField } = useSchemaBuilder()\n\tconst [selectedType, setSelectedType] = useState<FieldType>('text')\n\tconst [displayName, setDisplayName] = useState('')\n\tconst [error, setError] = useState('')\n\n\tconst handleAdd = () => {\n\t\tif (!displayName.trim()) {\n\t\t\tsetError('Display name is required')\n\t\t\treturn\n\t\t}\n\n\t\tconst fieldData = createFieldFromType(selectedType, displayName.trim())\n\t\taddField(fieldData)\n\t\thandleClose()\n\t}\n\n\tconst handleClose = () => {\n\t\tsetSelectedType('text')\n\t\tsetDisplayName('')\n\t\tsetError('')\n\t\tonOpenChange(false)\n\t}\n\n\tconst handleQuickAdd = (type: FieldTypeDefinition) => {\n\t\tconst fieldData = createFieldFromType(type.id, type.label)\n\t\taddField(fieldData)\n\t\thandleClose()\n\t}\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"sm:max-w-lg\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Add New Field</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tChoose a field type and enter a display name for your new field.\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-6 py-4\">\n\t\t\t\t\t{/* Quick Add Section */}\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<Label className=\"text-xs text-muted-foreground uppercase tracking-wider mb-3 block\">\n\t\t\t\t\t\t\tQuick Add\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<div className=\"grid grid-cols-3 gap-2\">\n\t\t\t\t\t\t\t{FIELD_TYPES.map((type) => {\n\t\t\t\t\t\t\t\tconst Icon = type.icon\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tkey={type.id}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleQuickAdd(type)}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'p-3 rounded-lg border text-left hover:shadow-sm transition-all',\n\t\t\t\t\t\t\t\t\t\t\t'hover:border-muted-foreground/50',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'w-8 h-8 rounded-lg flex items-center justify-center mb-2',\n\t\t\t\t\t\t\t\t\t\t\t\tFIELD_TYPE_COLORS[type.id],\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Icon className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium\">{type.label}</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-[10px] text-muted-foreground line-clamp-1\">\n\t\t\t\t\t\t\t\t\t\t\t{type.description}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t<div className=\"absolute inset-0 flex items-center\">\n\t\t\t\t\t\t\t<span className=\"w-full border-t\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"relative flex justify-center text-xs uppercase\">\n\t\t\t\t\t\t\t<span className=\"bg-background px-2 text-muted-foreground\">\n\t\t\t\t\t\t\t\tOr customize\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Custom Field Section */}\n\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<Label htmlFor=\"fieldType\">Field Type</Label>\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-3 gap-2\">\n\t\t\t\t\t\t\t\t{FIELD_TYPES.map((type) => {\n\t\t\t\t\t\t\t\t\tconst Icon = type.icon\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={type.id}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setSelectedType(type.id)}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'p-2 rounded-lg border flex items-center gap-2 transition-all',\n\t\t\t\t\t\t\t\t\t\t\t\tselectedType === type.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'border-foreground bg-muted'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'hover:border-muted-foreground/50',\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'w-6 h-6 rounded flex items-center justify-center',\n\t\t\t\t\t\t\t\t\t\t\t\t\tFIELD_TYPE_COLORS[type.id],\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Icon className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm\">{type.label}</span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<Label htmlFor=\"displayName\">Display Name</Label>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tid=\"displayName\"\n\t\t\t\t\t\t\t\tplaceholder=\"e.g., First Name, Email Address, Birth Date...\"\n\t\t\t\t\t\t\t\tvalue={displayName}\n\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\tsetDisplayName(e.target.value)\n\t\t\t\t\t\t\t\t\tsetError('')\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' && displayName.trim()) {\n\t\t\t\t\t\t\t\t\t\thandleAdd()\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{error && <p className=\"text-xs text-destructive\">{error}</p>}\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tThe API ID will be automatically generated from the display name\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button variant=\"outline\" onClick={handleClose}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button onClick={handleAdd} disabled={!displayName.trim()}>\n\t\t\t\t\t\tAdd Field\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n","import { Button } from '@magnet-cms/ui/components'\nimport { Check, Copy } from 'lucide-react'\nimport { useState } from 'react'\nimport { useSchemaBuilder } from '../hooks/useSchemaBuilder'\nimport type { ViewMode } from '../types/builder.types'\n\ninterface CodePreviewProps {\n\tmode: ViewMode\n}\n\nexport function CodePreview({ mode }: CodePreviewProps) {\n\tconst { generatedCode, generatedJSON } = useSchemaBuilder()\n\tconst [copied, setCopied] = useState(false)\n\n\tconst content =\n\t\tmode === 'code' ? generatedCode : JSON.stringify(generatedJSON, null, 2)\n\n\tconst handleCopy = async () => {\n\t\tawait navigator.clipboard.writeText(content)\n\t\tsetCopied(true)\n\t\tsetTimeout(() => setCopied(false), 2000)\n\t}\n\n\treturn (\n\t\t<div className=\"h-full flex flex-col border rounded-xl overflow-hidden bg-muted/30\">\n\t\t\t{/* Header */}\n\t\t\t<div className=\"bg-muted/50 border-b px-4 py-2 flex items-center justify-between\">\n\t\t\t\t<h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n\t\t\t\t\t{mode === 'code' ? 'Generated TypeScript' : 'JSON Schema'}\n\t\t\t\t</h3>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tclassName=\"h-7 text-xs\"\n\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t>\n\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Check className=\"h-3 w-3 mr-1.5 text-green-500\" />\n\t\t\t\t\t\t\tCopied\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Copy className=\"h-3 w-3 mr-1.5\" />\n\t\t\t\t\t\t\tCopy\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{/* Code Content */}\n\t\t\t<div className=\"flex-1 overflow-auto p-4\">\n\t\t\t\t<pre className=\"text-xs font-mono text-muted-foreground whitespace-pre-wrap\">\n\t\t\t\t\t<code>{content}</code>\n\t\t\t\t</pre>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import { Badge, Button, SortableItemHandle } from '@magnet-cms/ui/components'\nimport { cn } from '@magnet-cms/ui/lib'\nimport { GripVertical, Pencil, Trash2 } from 'lucide-react'\nimport {\n\tFIELD_TYPE_COLORS,\n\tgetFieldTypeDefinition,\n} from '../constants/field-types'\nimport type { SchemaField } from '../types/builder.types'\n\ninterface FieldCardProps {\n\tfield: SchemaField\n\tisSelected?: boolean\n\tisDragging?: boolean\n\tonClick?: () => void\n\tonEdit?: () => void\n\tonDelete?: () => void\n\tshowActions?: boolean\n\tshowDragHandle?: boolean\n}\n\nexport function FieldCard({\n\tfield,\n\tisSelected,\n\tisDragging,\n\tonClick,\n\tonEdit,\n\tonDelete,\n\tshowActions = true,\n\tshowDragHandle = true,\n}: FieldCardProps) {\n\tconst definition = getFieldTypeDefinition(field.type)\n\tconst Icon = definition?.icon\n\n\tconst handleKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\te.preventDefault()\n\t\t\tonClick?.()\n\t\t}\n\t}\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useSemanticElements: Using div for drag-and-drop compatibility\n\t\t<div\n\t\t\trole=\"button\"\n\t\t\ttabIndex={0}\n\t\t\tclassName={cn(\n\t\t\t\t'group p-4 flex items-center justify-between transition-colors cursor-pointer border-l-2',\n\t\t\t\tisSelected\n\t\t\t\t\t? 'bg-muted/80 border-l-foreground'\n\t\t\t\t\t: 'hover:bg-muted/50 border-l-transparent hover:border-l-muted-foreground/50',\n\t\t\t\tisDragging && 'opacity-50',\n\t\t\t)}\n\t\t\tonClick={onClick}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t>\n\t\t\t{/* Left side: Icon + Field Info */}\n\t\t\t<div className=\"flex items-center gap-4\">\n\t\t\t\t{/* Drag Handle */}\n\t\t\t\t{showDragHandle ? (\n\t\t\t\t\t<SortableItemHandle className=\"text-muted-foreground/50 hover:text-muted-foreground touch-none\">\n\t\t\t\t\t\t<GripVertical className=\"h-4 w-4\" />\n\t\t\t\t\t</SortableItemHandle>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"text-muted-foreground/50\">\n\t\t\t\t\t\t<GripVertical className=\"h-4 w-4\" />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Field Type Icon */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'w-8 h-8 rounded-lg flex items-center justify-center border',\n\t\t\t\t\t\tFIELD_TYPE_COLORS[field.type] ||\n\t\t\t\t\t\t\t'bg-muted text-muted-foreground border-muted',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{Icon && <Icon className=\"h-4 w-4\" />}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Field Name & Type */}\n\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<span className=\"text-sm font-semibold\">{field.displayName}</span>\n\t\t\t\t\t\t<span className=\"text-[10px] font-mono text-muted-foreground bg-muted px-1.5 py-0.5 rounded border\">\n\t\t\t\t\t\t\t{field.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center gap-2 flex-wrap\">\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground capitalize\">\n\t\t\t\t\t\t\t{definition?.label || field.type}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{field.prop.required && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"w-0.5 h-0.5 rounded-full bg-muted-foreground/50\" />\n\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-[10px] px-1.5 py-0 h-4 bg-emerald-50 text-emerald-700 border-emerald-200\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tRequired\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{field.prop.unique && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"w-0.5 h-0.5 rounded-full bg-muted-foreground/50\" />\n\t\t\t\t\t\t\t\t<Badge\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tclassName=\"text-[10px] px-1.5 py-0 h-4 bg-amber-50 text-amber-700 border-amber-200\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tUnique\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{field.relationConfig && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"w-0.5 h-0.5 rounded-full bg-muted-foreground/50\" />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{field.relationConfig.relationType} (\n\t\t\t\t\t\t\t\t\t{field.relationConfig.targetSchema || '...'})\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Right side: Actions */}\n\t\t\t{showActions && (\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'flex items-center gap-1 transition-opacity',\n\t\t\t\t\t\tisSelected ? 'opacity-100' : 'opacity-0 group-hover:opacity-100',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\tonEdit?.()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Pencil className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName=\"h-8 w-8 text-muted-foreground hover:text-destructive hover:bg-destructive/10\"\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\tonDelete?.()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import type { UniqueIdentifier } from '@dnd-kit/core'\nimport {\n\tSortable,\n\tSortableContent,\n\tSortableItem,\n\tSortableOverlay,\n} from '@magnet-cms/ui/components'\nimport { AlertCircle, Plus } from 'lucide-react'\nimport { useSchemaBuilder } from '../hooks/useSchemaBuilder'\nimport type { SchemaField } from '../types/builder.types'\nimport { FieldCard } from './FieldCard'\n\ninterface FieldListProps {\n\tonAddField?: () => void\n\treadOnly?: boolean\n}\n\nexport function FieldList({ onAddField, readOnly = false }: FieldListProps) {\n\tconst { state, selectField, deleteField, reorderFields } = useSchemaBuilder()\n\n\tconst handleReorder = (reorderedFields: SchemaField[]) => {\n\t\treorderFields(reorderedFields)\n\t}\n\n\treturn (\n\t\t<div className=\"border rounded-xl overflow-hidden bg-background shadow-sm\">\n\t\t\t{/* Header */}\n\t\t\t<div className=\"bg-muted/50 border-b px-4 py-2 flex items-center justify-between\">\n\t\t\t\t<h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n\t\t\t\t\tFields ({state.fields.length})\n\t\t\t\t</h3>\n\t\t\t</div>\n\n\t\t\t{/* Field List */}\n\t\t\t{state.fields.length === 0 ? (\n\t\t\t\t<div className=\"p-8 text-center text-muted-foreground\">\n\t\t\t\t\t<AlertCircle className=\"mx-auto h-10 w-10 mb-3 opacity-50\" />\n\t\t\t\t\t<p className=\"text-sm font-medium mb-1\">No fields yet</p>\n\t\t\t\t\t<p className=\"text-xs\">\n\t\t\t\t\t\t{readOnly\n\t\t\t\t\t\t\t? 'This schema has no fields defined'\n\t\t\t\t\t\t\t: 'Add your first field to start building your schema'}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t) : readOnly ? (\n\t\t\t\t// Read-only mode: simple list without drag/drop\n\t\t\t\t<div className=\"divide-y\">\n\t\t\t\t\t{state.fields.map((field) => (\n\t\t\t\t\t\t<FieldCard\n\t\t\t\t\t\t\tkey={field.id}\n\t\t\t\t\t\t\tfield={field}\n\t\t\t\t\t\t\tisSelected={false}\n\t\t\t\t\t\t\tshowActions={false}\n\t\t\t\t\t\t\tshowDragHandle={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<Sortable\n\t\t\t\t\tvalue={state.fields}\n\t\t\t\t\tonValueChange={handleReorder}\n\t\t\t\t\tgetItemValue={(field) => field.id}\n\t\t\t\t>\n\t\t\t\t\t<SortableContent className=\"divide-y\">\n\t\t\t\t\t\t{state.fields.map((field) => (\n\t\t\t\t\t\t\t<SortableItem key={field.id} value={field.id}>\n\t\t\t\t\t\t\t\t<FieldCard\n\t\t\t\t\t\t\t\t\tfield={field}\n\t\t\t\t\t\t\t\t\tisSelected={field.id === state.selectedFieldId}\n\t\t\t\t\t\t\t\t\tonClick={() => selectField(field.id)}\n\t\t\t\t\t\t\t\t\tonEdit={() => selectField(field.id)}\n\t\t\t\t\t\t\t\t\tonDelete={() => {\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\twindow.confirm(\n\t\t\t\t\t\t\t\t\t\t\t\t`Are you sure you want to delete \"${field.displayName}\"?`,\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tdeleteField(field.id)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</SortableItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SortableContent>\n\n\t\t\t\t\t<SortableOverlay>\n\t\t\t\t\t\t{({ value }: { value: UniqueIdentifier }) => {\n\t\t\t\t\t\t\tconst field = state.fields.find((f) => f.id === value)\n\t\t\t\t\t\t\treturn field ? (\n\t\t\t\t\t\t\t\t<div className=\"bg-background border rounded-lg shadow-lg\">\n\t\t\t\t\t\t\t\t\t<FieldCard\n\t\t\t\t\t\t\t\t\t\tfield={field}\n\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\tshowActions={false}\n\t\t\t\t\t\t\t\t\t\tshowDragHandle={false}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}}\n\t\t\t\t\t</SortableOverlay>\n\t\t\t\t</Sortable>\n\t\t\t)}\n\n\t\t\t{/* Add Field Button - only show in edit mode */}\n\t\t\t{!readOnly && onAddField && (\n\t\t\t\t<div className=\"p-2 bg-muted/30 border-t\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onAddField}\n\t\t\t\t\t\tclassName=\"w-full py-2.5 rounded-lg border-2 border-dashed border-muted-foreground/25 hover:border-muted-foreground/50 hover:bg-muted/50 transition-all text-xs font-semibold text-muted-foreground hover:text-foreground flex items-center justify-center gap-2 group\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"bg-muted rounded p-0.5 group-hover:bg-muted-foreground/20 transition-colors\">\n\t\t\t\t\t\t\t<Plus className=\"h-3 w-3\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\tAdd new field\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import { useAdmin } from '@magnet-cms/admin'\nimport {\n\tButton,\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tInput,\n\tLabel,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from '@magnet-cms/ui/components'\nimport { cn } from '@magnet-cms/ui/lib'\nimport { useState } from 'react'\nimport type { RelationConfig } from '../types/builder.types'\n\ninterface RelationConfigModalProps {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n\tcurrentSchema: string\n\trelationConfig: RelationConfig | undefined\n\tonSave: (config: RelationConfig) => void\n}\n\ntype RelationType = 'oneToOne' | 'oneToMany' | 'manyToOne' | 'manyToMany'\n\ninterface RelationTypeOption {\n\tvalue: RelationType\n\tlabel: string\n\tdescription: string\n\tdiagram: {\n\t\tleftMultiple: boolean\n\t\trightMultiple: boolean\n\t}\n}\n\nconst RELATION_TYPE_OPTIONS: RelationTypeOption[] = [\n\t{\n\t\tvalue: 'oneToOne',\n\t\tlabel: 'One to One',\n\t\tdescription: 'Each record relates to exactly one other record',\n\t\tdiagram: { leftMultiple: false, rightMultiple: false },\n\t},\n\t{\n\t\tvalue: 'oneToMany',\n\t\tlabel: 'One to Many',\n\t\tdescription: 'One record can relate to many other records',\n\t\tdiagram: { leftMultiple: false, rightMultiple: true },\n\t},\n\t{\n\t\tvalue: 'manyToOne',\n\t\tlabel: 'Many to One',\n\t\tdescription: 'Many records can relate to one other record',\n\t\tdiagram: { leftMultiple: true, rightMultiple: false },\n\t},\n\t{\n\t\tvalue: 'manyToMany',\n\t\tlabel: 'Many to Many',\n\t\tdescription: 'Many records can relate to many other records',\n\t\tdiagram: { leftMultiple: true, rightMultiple: true },\n\t},\n]\n\nfunction RelationDiagram({\n\tleftLabel,\n\trightLabel,\n\tleftMultiple,\n\trightMultiple,\n\tsmall = false,\n}: {\n\tleftLabel: string\n\trightLabel: string\n\tleftMultiple: boolean\n\trightMultiple: boolean\n\tsmall?: boolean\n}) {\n\treturn (\n\t\t<div className=\"flex items-center justify-center gap-2\">\n\t\t\t{/* Left side */}\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t{leftMultiple && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'bg-background border rounded font-medium shadow-sm opacity-50 -mr-1',\n\t\t\t\t\t\t\tsmall ? 'px-1.5 py-0.5 text-[10px]' : 'px-2 py-1 text-xs',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{leftLabel}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-background border rounded font-medium shadow-sm relative z-10',\n\t\t\t\t\t\tsmall ? 'px-1.5 py-0.5 text-[10px]' : 'px-2 py-1 text-xs',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{leftLabel}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Connection line */}\n\t\t\t<div className=\"flex items-center\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-muted-foreground/60 rounded-full',\n\t\t\t\t\t\tsmall ? 'w-1.5 h-1.5' : 'w-2 h-2',\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn('h-px bg-muted-foreground/60', small ? 'w-6' : 'w-10')}\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'border-r-2 border-t-2 border-b-2 border-muted-foreground/60 rotate-45',\n\t\t\t\t\t\tsmall ? 'w-1.5 h-1.5 -ml-1' : 'w-2 h-2 -ml-1.5',\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Right side */}\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'bg-background border rounded font-medium shadow-sm relative z-10',\n\t\t\t\t\t\tsmall ? 'px-1.5 py-0.5 text-[10px]' : 'px-2 py-1 text-xs',\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{rightLabel}\n\t\t\t\t</div>\n\t\t\t\t{rightMultiple && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'bg-background border rounded font-medium shadow-sm opacity-50 -ml-1',\n\t\t\t\t\t\t\tsmall ? 'px-1.5 py-0.5 text-[10px]' : 'px-2 py-1 text-xs',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{rightLabel}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nexport function RelationConfigModal({\n\topen,\n\tonOpenChange,\n\tcurrentSchema,\n\trelationConfig,\n\tonSave,\n}: RelationConfigModalProps) {\n\tconst { schemas } = useAdmin()\n\tconst [config, setConfig] = useState<RelationConfig>({\n\t\ttargetSchema: relationConfig?.targetSchema || '',\n\t\trelationType: relationConfig?.relationType || 'manyToOne',\n\t\tinverseSide: relationConfig?.inverseSide,\n\t})\n\n\tconst handleSave = () => {\n\t\tonSave(config)\n\t\tonOpenChange(false)\n\t}\n\n\tconst selectedTypeOption = RELATION_TYPE_OPTIONS.find(\n\t\t(t) => t.value === config.relationType,\n\t)\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"sm:max-w-lg\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Configure Relation</DialogTitle>\n\t\t\t\t\t<DialogDescription>\n\t\t\t\t\t\tDefine how this field relates to another schema\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-6 py-4\">\n\t\t\t\t\t{/* Relation Type Picker */}\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t<Label className=\"text-sm font-medium\">Relation Type</Label>\n\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-3\">\n\t\t\t\t\t\t\t{RELATION_TYPE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\tsetConfig((c) => ({ ...c, relationType: option.value }))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t'p-3 rounded-lg border text-left transition-all',\n\t\t\t\t\t\t\t\t\t\tconfig.relationType === option.value\n\t\t\t\t\t\t\t\t\t\t\t? 'border-primary bg-primary/5 ring-1 ring-primary'\n\t\t\t\t\t\t\t\t\t\t\t: 'border-border hover:border-muted-foreground/50 hover:bg-muted/50',\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"mb-2\">\n\t\t\t\t\t\t\t\t\t\t<RelationDiagram\n\t\t\t\t\t\t\t\t\t\t\tleftLabel={currentSchema || 'A'}\n\t\t\t\t\t\t\t\t\t\t\trightLabel={config.targetSchema || 'B'}\n\t\t\t\t\t\t\t\t\t\t\tleftMultiple={option.diagram.leftMultiple}\n\t\t\t\t\t\t\t\t\t\t\trightMultiple={option.diagram.rightMultiple}\n\t\t\t\t\t\t\t\t\t\t\tsmall\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm font-medium\">{option.label}</p>\n\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t{option.description}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Preview */}\n\t\t\t\t\t{selectedTypeOption && (\n\t\t\t\t\t\t<div className=\"p-4 bg-muted/30 rounded-lg border\">\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mb-3 text-center\">\n\t\t\t\t\t\t\t\tPreview\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<RelationDiagram\n\t\t\t\t\t\t\t\tleftLabel={currentSchema || 'Current'}\n\t\t\t\t\t\t\t\trightLabel={config.targetSchema || 'Target'}\n\t\t\t\t\t\t\t\tleftMultiple={selectedTypeOption.diagram.leftMultiple}\n\t\t\t\t\t\t\t\trightMultiple={selectedTypeOption.diagram.rightMultiple}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Target Schema */}\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<Label className=\"text-sm font-medium\">Related Collection</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={config.targetSchema}\n\t\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\t\tsetConfig((c) => ({ ...c, targetSchema: value }))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select a schema...\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t{schemas?.map((schema) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={schema} value={schema}>\n\t\t\t\t\t\t\t\t\t\t{schema}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tThe schema this field will reference\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Inverse Field Name */}\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<Label className=\"text-sm font-medium\">\n\t\t\t\t\t\t\tInverse Field Name{' '}\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground font-normal\">\n\t\t\t\t\t\t\t\t(optional)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tvalue={config.inverseSide || ''}\n\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\tsetConfig((c) => ({ ...c, inverseSide: e.target.value }))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tplaceholder={`e.g., ${currentSchema?.toLowerCase() || 'items'}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tField name on the related schema for bidirectional access\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button onClick={handleSave} disabled={!config.targetSchema}>\n\t\t\t\t\t\tSave Configuration\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t)\n}\n","import { useAdmin } from '@magnet-cms/admin'\nimport {\n\tAccordion,\n\tAccordionContent,\n\tAccordionItem,\n\tAccordionTrigger,\n\tButton,\n\tInput,\n\tLabel,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n\tSwitch,\n\tTextarea,\n} from '@magnet-cms/ui/components'\nimport { ChevronRight, Lock, Plus, Trash2, X } from 'lucide-react'\nimport { useState } from 'react'\nimport {\n\tFIELD_TYPES,\n\tRELATION_TYPES,\n\tUI_SUBTYPES,\n\tVALIDATION_RULES_BY_TYPE,\n\tgetValidationRuleDefinition,\n} from '../constants/field-types'\nimport { useSchemaBuilder } from '../hooks/useSchemaBuilder'\nimport type {\n\tFieldType,\n\tRelationConfig,\n\tValidationRule,\n} from '../types/builder.types'\nimport { RelationConfigModal } from './RelationConfigModal'\n\nexport function FieldSettingsPanel() {\n\tconst { selectedField, updateField, selectField, state } = useSchemaBuilder()\n\tconst { schemas } = useAdmin()\n\tconst [newOptionKey, setNewOptionKey] = useState('')\n\tconst [newOptionValue, setNewOptionValue] = useState('')\n\tconst [relationModalOpen, setRelationModalOpen] = useState(false)\n\n\tif (!selectedField) {\n\t\treturn (\n\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground p-8 text-center\">\n\t\t\t\t<div>\n\t\t\t\t\t<p className=\"text-sm font-medium mb-1\">No field selected</p>\n\t\t\t\t\t<p className=\"text-xs\">Select a field to edit its settings</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}\n\n\tconst fieldTypeDef = FIELD_TYPES.find((t) => t.id === selectedField.type)\n\tconst availableValidations =\n\t\tVALIDATION_RULES_BY_TYPE[selectedField.type] || []\n\tconst uiSubtypes = UI_SUBTYPES[selectedField.type] || []\n\n\tconst handleAddOption = () => {\n\t\tif (!newOptionKey.trim() || !newOptionValue.trim()) return\n\t\tconst currentOptions = selectedField.ui.options || []\n\t\tupdateField(selectedField.id, {\n\t\t\tui: {\n\t\t\t\t...selectedField.ui,\n\t\t\t\toptions: [\n\t\t\t\t\t...currentOptions,\n\t\t\t\t\t{ key: newOptionKey.trim(), value: newOptionValue.trim() },\n\t\t\t\t],\n\t\t\t},\n\t\t})\n\t\tsetNewOptionKey('')\n\t\tsetNewOptionValue('')\n\t}\n\n\tconst handleRemoveOption = (index: number) => {\n\t\tconst currentOptions = selectedField.ui.options || []\n\t\tupdateField(selectedField.id, {\n\t\t\tui: {\n\t\t\t\t...selectedField.ui,\n\t\t\t\toptions: currentOptions.filter((_, i) => i !== index),\n\t\t\t},\n\t\t})\n\t}\n\n\tconst handleAddValidation = (type: string) => {\n\t\tconst currentValidations = selectedField.validations || []\n\t\tif (currentValidations.some((v) => v.type === type)) return\n\n\t\tconst ruleDef = getValidationRuleDefinition(type)\n\t\tconst newRule: ValidationRule = {\n\t\t\ttype,\n\t\t\tconstraints: ruleDef?.constraintCount ? [] : undefined,\n\t\t}\n\t\tupdateField(selectedField.id, {\n\t\t\tvalidations: [...currentValidations, newRule],\n\t\t})\n\t}\n\n\tconst handleRemoveValidation = (type: string) => {\n\t\tupdateField(selectedField.id, {\n\t\t\tvalidations: selectedField.validations.filter((v) => v.type !== type),\n\t\t})\n\t}\n\n\tconst handleUpdateValidationConstraints = (\n\t\ttype: string,\n\t\tconstraints: (string | number)[],\n\t) => {\n\t\tupdateField(selectedField.id, {\n\t\t\tvalidations: selectedField.validations.map((v) =>\n\t\t\t\tv.type === type ? { ...v, constraints } : v,\n\t\t\t),\n\t\t})\n\t}\n\n\tconst getRelationTypeLabel = (type: string | undefined) => {\n\t\treturn RELATION_TYPES.find((t) => t.value === type)?.label || 'Not Set'\n\t}\n\n\treturn (\n\t\t<div className=\"h-full flex flex-col\">\n\t\t\t{/* Header */}\n\t\t\t<div className=\"p-4 border-b flex items-center justify-between\">\n\t\t\t\t<h2 className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\tField Settings\n\t\t\t\t</h2>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\tonClick={() => selectField(null)}\n\t\t\t\t>\n\t\t\t\t\t<X className=\"h-4 w-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{/* Content */}\n\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t<Accordion\n\t\t\t\t\ttype=\"multiple\"\n\t\t\t\t\tdefaultValue={['basic-info', 'constraints']}\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t>\n\t\t\t\t\t{/* Basic Info */}\n\t\t\t\t\t<AccordionItem value=\"basic-info\" className=\"px-5\">\n\t\t\t\t\t\t<AccordionTrigger className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\t\t\tBasic Info\n\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t<AccordionContent className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Display Name</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tvalue={selectedField.displayName}\n\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tdisplayName: e.target.value,\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName=\"font-medium\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">API ID</Label>\n\t\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\tvalue={selectedField.name}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, { name: e.target.value })\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tclassName=\"font-mono text-muted-foreground pr-8\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Lock className=\"absolute right-2.5 top-2.5 h-3.5 w-3.5 text-muted-foreground/50\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Field Type</Label>\n\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\tvalue={selectedField.type}\n\t\t\t\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, { type: value as FieldType })\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t{FIELD_TYPES.map((type) => (\n\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={type.id} value={type.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<type.icon className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{type.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* UI Subtype Selector */}\n\t\t\t\t\t\t\t{uiSubtypes.length > 1 && (\n\t\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t<Label className=\"text-xs\">UI Type</Label>\n\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\tvalue={selectedField.ui.type || uiSubtypes[0]?.id}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, type: value },\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t{uiSubtypes.map((subtype) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={subtype.id} value={subtype.id}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>{subtype.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{uiSubtypes.find((s) => s.id === selectedField.ui.type)\n\t\t\t\t\t\t\t\t\t\t\t?.description || uiSubtypes[0]?.description}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t</AccordionItem>\n\n\t\t\t\t\t{/* UI Settings */}\n\t\t\t\t\t<AccordionItem value=\"ui-settings\" className=\"px-5\">\n\t\t\t\t\t\t<AccordionTrigger className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\t\t\tUI Settings\n\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t<AccordionContent className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Tab</Label>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tvalue={selectedField.ui.tab || ''}\n\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, tab: e.target.value },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tplaceholder=\"General\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Description</Label>\n\t\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\t\tvalue={selectedField.ui.description || ''}\n\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, description: e.target.value },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Help text for this field\"\n\t\t\t\t\t\t\t\t\trows={2}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Show in Side Panel</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.ui.side || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, side: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Half Width (Row)</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.ui.row || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, row: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t</AccordionItem>\n\n\t\t\t\t\t{/* Constraints */}\n\t\t\t\t\t<AccordionItem value=\"constraints\" className=\"px-5\">\n\t\t\t\t\t\t<AccordionTrigger className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\t\t\tConstraints\n\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t<AccordionContent className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Required</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.prop.required || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tprop: { ...selectedField.prop, required: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Unique</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.prop.unique || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tprop: { ...selectedField.prop, unique: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Hidden</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.prop.hidden || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tprop: { ...selectedField.prop, hidden: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Read Only</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.prop.readonly || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tprop: { ...selectedField.prop, readonly: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Enable i18n</Label>\n\t\t\t\t\t\t\t\t<Switch\n\t\t\t\t\t\t\t\t\tchecked={selectedField.prop.intl || false}\n\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) =>\n\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\tprop: { ...selectedField.prop, intl: checked },\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t</AccordionItem>\n\n\t\t\t\t\t{/* Select Options */}\n\t\t\t\t\t{fieldTypeDef?.hasOptions && (\n\t\t\t\t\t\t<AccordionItem value=\"select-options\" className=\"px-5\">\n\t\t\t\t\t\t\t<AccordionTrigger className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\t\t\t\tSelect Options\n\t\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t\t<AccordionContent className=\"space-y-4\">\n\t\t\t\t\t\t\t\t{(selectedField.ui.options || []).map((option, index) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={option.key || `option-${index}`}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\t\tvalue={option.key}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newOptions = [...(selectedField.ui.options || [])]\n\t\t\t\t\t\t\t\t\t\t\t\tnewOptions[index] = { ...option, key: e.target.value }\n\t\t\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, options: newOptions },\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Key\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newOptions = [...(selectedField.ui.options || [])]\n\t\t\t\t\t\t\t\t\t\t\t\tnewOptions[index] = { ...option, value: e.target.value }\n\t\t\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\t\t\tui: { ...selectedField.ui, options: newOptions },\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Label\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-8 w-8 text-muted-foreground hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleRemoveOption(index)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\tvalue={newOptionKey}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setNewOptionKey(e.target.value)}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Key\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\tvalue={newOptionValue}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setNewOptionValue(e.target.value)}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Label\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleAddOption}\n\t\t\t\t\t\t\t\t\t\tdisabled={!newOptionKey.trim() || !newOptionValue.trim()}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Plus className=\"h-3.5 w-3.5\" />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t\t</AccordionItem>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Relation Config */}\n\t\t\t\t\t{fieldTypeDef?.hasRelationConfig && (\n\t\t\t\t\t\t<AccordionItem value=\"relation-config\" className=\"px-5\">\n\t\t\t\t\t\t\t<AccordionTrigger className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\t\t\t\tRelation Configuration\n\t\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t\t<AccordionContent className=\"space-y-4\">\n\t\t\t\t\t\t\t\t{/* Visual Relation Preview */}\n\t\t\t\t\t\t\t\t<div className=\"p-3 bg-muted/50 rounded-lg border space-y-3\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between text-xs\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Relation Type</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t{getRelationTypeLabel(\n\t\t\t\t\t\t\t\t\t\t\t\tselectedField.relationConfig?.relationType,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t{/* Visual Diagram */}\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center py-3 gap-3\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"px-2 py-1 bg-background border rounded text-xs font-medium shadow-sm\">\n\t\t\t\t\t\t\t\t\t\t\t{state.schema.name || 'Current'}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"w-2 h-2 bg-muted-foreground/60 rounded-full\" />\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"w-8 h-px bg-muted-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t\t<ChevronRight className=\"w-3 h-3 text-muted-foreground/60\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"px-2 py-1 bg-background border rounded text-xs font-medium shadow-sm\">\n\t\t\t\t\t\t\t\t\t\t\t{selectedField.relationConfig?.targetSchema ||\n\t\t\t\t\t\t\t\t\t\t\t\t'Select...'}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setRelationModalOpen(true)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tChange Relation\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Related Collection</Label>\n\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\tvalue={selectedField.relationConfig?.targetSchema || ''}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\t\trelationConfig: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...selectedField.relationConfig,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttargetSchema: value,\n\t\t\t\t\t\t\t\t\t\t\t\t\trelationType:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedField.relationConfig?.relationType ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'manyToOne',\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select schema...\" />\n\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t{schemas?.map((schema) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={schema} value={schema}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{schema}\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t<Label className=\"text-xs\">Relation Type</Label>\n\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\t\t\t\tselectedField.relationConfig?.relationType || 'manyToOne'\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(value) =>\n\t\t\t\t\t\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\t\t\t\t\t\trelationConfig: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...selectedField.relationConfig,\n\t\t\t\t\t\t\t\t\t\t\t\t\ttargetSchema:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedField.relationConfig?.targetSchema || '',\n\t\t\t\t\t\t\t\t\t\t\t\t\trelationType: value as any,\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t{RELATION_TYPES.map((type) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={type.value} value={type.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{type.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t\t</AccordionItem>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Validations */}\n\t\t\t\t\t<AccordionItem value=\"validations\" className=\"px-5\">\n\t\t\t\t\t\t<AccordionTrigger className=\"text-xs font-semibold uppercase tracking-wide\">\n\t\t\t\t\t\t\tValidations\n\t\t\t\t\t\t</AccordionTrigger>\n\t\t\t\t\t\t<AccordionContent className=\"space-y-4\">\n\t\t\t\t\t\t\t{selectedField.validations.map((validation) => {\n\t\t\t\t\t\t\t\tconst ruleDef = getValidationRuleDefinition(validation.type)\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={validation.type}\n\t\t\t\t\t\t\t\t\t\tclassName=\"p-3 bg-muted/50 rounded-lg border space-y-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t{ruleDef?.label || validation.type}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 w-6 text-muted-foreground hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleRemoveValidation(validation.type)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{ruleDef?.constraintCount &&\n\t\t\t\t\t\t\t\t\t\t\truleDef.constraintCount > 0 && (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{Array.from({ length: ruleDef.constraintCount }).map(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(_, i) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={`${validation.type}-constraint-${i}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type.includes('Length') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type.includes('Min') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type.includes('Max')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'number'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\truleDef.constraintLabels?.[i] ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t`Arg ${i + 1}`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={validation.constraints?.[i] ?? ''}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst newConstraints = [\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...(validation.constraints || []),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnewConstraints[i] =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type.includes('Length') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type.includes('Min') ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type.includes('Max')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? Number(e.target.value)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: e.target.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleUpdateValidationConstraints(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalidation.type,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnewConstraints,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t\t<Select onValueChange={handleAddValidation}>\n\t\t\t\t\t\t\t\t<SelectTrigger>\n\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Add validation...\" />\n\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t{availableValidations\n\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t(v) =>\n\t\t\t\t\t\t\t\t\t\t\t\t!selectedField.validations.some((sv) => sv.type === v),\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t.map((validation) => {\n\t\t\t\t\t\t\t\t\t\t\tconst ruleDef = getValidationRuleDefinition(validation)\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={validation} value={validation}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ruleDef?.label || validation}\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t</AccordionContent>\n\t\t\t\t\t</AccordionItem>\n\t\t\t\t</Accordion>\n\t\t\t</div>\n\n\t\t\t{/* Relation Config Modal */}\n\t\t\t{fieldTypeDef?.hasRelationConfig && (\n\t\t\t\t<RelationConfigModal\n\t\t\t\t\topen={relationModalOpen}\n\t\t\t\t\tonOpenChange={setRelationModalOpen}\n\t\t\t\t\tcurrentSchema={state.schema.name}\n\t\t\t\t\trelationConfig={selectedField.relationConfig}\n\t\t\t\t\tonSave={(config: RelationConfig) => {\n\t\t\t\t\t\tupdateField(selectedField.id, {\n\t\t\t\t\t\t\trelationConfig: config,\n\t\t\t\t\t\t})\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import { useAdmin } from '@magnet-cms/admin'\nimport { Button, Spinner } from '@magnet-cms/ui/components'\nimport { names } from '@magnet-cms/utils'\nimport { Database, Plus } from 'lucide-react'\nimport { useNavigate, useParams } from 'react-router-dom'\n\nexport function SchemaList() {\n\tconst navigate = useNavigate()\n\tconst { schemaName } = useParams<{ schemaName: string }>()\n\tconst { schemas, isLoading, error } = useAdmin()\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"flex justify-center items-center h-32\">\n\t\t\t\t<Spinner className=\"h-5 w-5\" />\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (error) {\n\t\treturn <div className=\"p-3 text-xs text-red-600\">Error loading schemas</div>\n\t}\n\n\tconst isNewSchema = schemaName === 'new'\n\n\treturn (\n\t\t<div className=\"flex flex-col h-full\">\n\t\t\t{/* Header */}\n\t\t\t<div className=\"p-3 border-b\">\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\tvariant={isNewSchema ? 'default' : 'outline'}\n\t\t\t\t\tonClick={() => navigate('/playground/new')}\n\t\t\t\t>\n\t\t\t\t\t<Plus className=\"h-3.5 w-3.5 mr-1.5\" />\n\t\t\t\t\tNew Schema\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{/* Schema List */}\n\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t{!schemas || schemas.length === 0 ? (\n\t\t\t\t\t<div className=\"p-4 text-center text-muted-foreground\">\n\t\t\t\t\t\t<Database className=\"mx-auto h-8 w-8 mb-2 opacity-50\" />\n\t\t\t\t\t\t<p className=\"text-xs\">No schemas yet</p>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"py-1\">\n\t\t\t\t\t\t{schemas.map((schema) => {\n\t\t\t\t\t\t\tconst name = names(schema)\n\t\t\t\t\t\t\tconst isSelected = schemaName === name.key\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={schema}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => navigate(`/playground/${name.key}`)}\n\t\t\t\t\t\t\t\t\tclassName={`w-full text-left px-3 py-2 text-sm transition-colors ${\n\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t? 'bg-accent text-accent-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: 'hover:bg-muted/50 text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium truncate\">{name.title}</div>\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs opacity-70 font-mono truncate\">\n\t\t\t\t\t\t\t\t\t\t{name.key}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import { useDialog } from '@magnet-cms/admin'\nimport { Button, Switch } from '@magnet-cms/ui/components'\nimport { useEffect } from 'react'\nimport { useSchemaBuilder } from '../hooks/useSchemaBuilder'\n\n/**\n * Schema Options Content - rendered inside the dialog\n */\nfunction SchemaOptionsContent({ onClose }: { onClose: () => void }) {\n\tconst { state, updateSchema } = useSchemaBuilder()\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"space-y-0.5\">\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor=\"versioning\"\n\t\t\t\t\t\tclassName=\"text-sm font-medium cursor-pointer\"\n\t\t\t\t\t>\n\t\t\t\t\t\tEnable Versioning\n\t\t\t\t\t</label>\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\tTrack content changes with version history\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<Switch\n\t\t\t\t\tid=\"versioning\"\n\t\t\t\t\tchecked={state.schema.versioning}\n\t\t\t\t\tonCheckedChange={(checked) => updateSchema({ versioning: checked })}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"space-y-0.5\">\n\t\t\t\t\t<label htmlFor=\"i18n\" className=\"text-sm font-medium cursor-pointer\">\n\t\t\t\t\t\tEnable i18n\n\t\t\t\t\t</label>\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\tSupport multiple languages for content\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<Switch\n\t\t\t\t\tid=\"i18n\"\n\t\t\t\t\tchecked={state.schema.i18n}\n\t\t\t\t\tonCheckedChange={(checked) => updateSchema({ i18n: checked })}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex justify-end pt-2\">\n\t\t\t\t<Button variant=\"outline\" onClick={onClose}>\n\t\t\t\t\tClose\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n/**\n * Hook to show schema options dialog\n */\nexport function useSchemaOptionsDialog() {\n\tconst { showDialog, closeDialog } = useDialog()\n\n\treturn {\n\t\topen: () => {\n\t\t\tshowDialog({\n\t\t\t\ttitle: 'Schema Options',\n\t\t\t\tdescription:\n\t\t\t\t\t'Configure schema-level settings for versioning and internationalization.',\n\t\t\t\tsize: 'md',\n\t\t\t\tcontent: <SchemaOptionsContent onClose={closeDialog} />,\n\t\t\t})\n\t\t},\n\t\tclose: closeDialog,\n\t}\n}\n\n/**\n * Legacy component wrapper for backwards compatibility\n */\ninterface SchemaOptionsDialogProps {\n\topen: boolean\n\tonOpenChange: (open: boolean) => void\n}\n\nexport function SchemaOptionsDialog({\n\topen,\n\tonOpenChange,\n}: SchemaOptionsDialogProps) {\n\tconst schemaOptions = useSchemaOptionsDialog()\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\tschemaOptions.open()\n\t\t}\n\t}, [open, schemaOptions])\n\n\t// When dialog closes via the service, notify parent\n\tuseEffect(() => {\n\t\t// This is a simplified approach - the dialog service handles closing\n\t\treturn () => {\n\t\t\tif (open) {\n\t\t\t\tonOpenChange(false)\n\t\t\t}\n\t\t}\n\t}, [open, onOpenChange])\n\n\treturn null // Dialog is rendered by DialogProvider in admin\n}\n","import { PageContent, PageHeader, useSchema } from '@magnet-cms/admin'\nimport { Button, Spinner } from '@magnet-cms/ui/components'\nimport {\n\tAlertCircle,\n\tBoxes,\n\tCode2,\n\tFileJson,\n\tInfo,\n\tLock,\n\tPencilRuler,\n\tRocket,\n\tSettings2,\n} from 'lucide-react'\nimport { createContext, useContext, useState } from 'react'\nimport { useParams } from 'react-router-dom'\n\n// Context to track if schema is read-only (existing code-defined schema)\nconst ReadOnlyContext = createContext(false)\nimport {\n\tSchemaBuilderContext,\n\tuseSchemaBuilder,\n\tuseSchemaBuilderState,\n} from '../hooks/useSchemaBuilder'\nimport type { SchemaBuilderState, SchemaField } from '../types/builder.types'\nimport { DEFAULT_BUILDER_STATE } from '../types/builder.types'\nimport { AddFieldDialog } from './AddFieldDialog'\nimport { CodePreview } from './CodePreview'\nimport { FieldList } from './FieldList'\nimport { FieldSettingsPanel } from './FieldSettingsPanel'\nimport { SchemaList } from './SchemaList'\nimport { SchemaOptionsDialog } from './SchemaOptionsDialog'\n\n/**\n * Transform SchemaMetadata from discovery API to builder state\n */\nfunction schemaMetadataToBuilderState(\n\tname: string,\n\tmetadata: any,\n): SchemaBuilderState {\n\treturn {\n\t\tschema: {\n\t\t\tname: name.charAt(0).toUpperCase() + name.slice(1),\n\t\t\tapiId: name,\n\t\t\tversioning: metadata.options?.versioning ?? true,\n\t\t\ti18n: metadata.options?.i18n ?? true,\n\t\t},\n\t\tfields:\n\t\t\tmetadata.properties?.map((prop: any, index: number) => ({\n\t\t\t\tid: `field_${index}_${prop.name}`,\n\t\t\t\tname: prop.name,\n\t\t\t\tdisplayName: prop.ui?.label || prop.name,\n\t\t\t\ttype: inferFieldType(prop),\n\t\t\t\ttsType: prop.type || 'string',\n\t\t\t\tprop: {\n\t\t\t\t\trequired: prop.required || false,\n\t\t\t\t\tunique: prop.unique || false,\n\t\t\t\t\tintl: prop.intl || false,\n\t\t\t\t\thidden: prop.hidden || false,\n\t\t\t\t\treadonly: prop.readonly || false,\n\t\t\t\t},\n\t\t\t\tui: prop.ui || {},\n\t\t\t\tvalidations: (prop.validations || []).map((v: any) => ({\n\t\t\t\t\ttype: v.name || v.type,\n\t\t\t\t\tconstraints: v.constraints,\n\t\t\t\t})),\n\t\t\t})) || [],\n\t\tselectedFieldId: null,\n\t\tviewMode: 'builder',\n\t\tisDirty: false,\n\t\tlastSaved: null,\n\t\tisNew: false,\n\t}\n}\n\n/**\n * Infer field type from property metadata\n */\nfunction inferFieldType(prop: any): SchemaField['type'] {\n\tconst uiType = prop.ui?.type\n\tif (uiType === 'switch' || uiType === 'checkbox') return 'boolean'\n\tif (uiType === 'date') return 'date'\n\tif (uiType === 'number') return 'number'\n\tif (uiType === 'select' || uiType === 'radio') return 'select'\n\tif (uiType === 'relationship') return 'relation'\n\n\t// prop.type can be a string, object, or array - only process if string\n\tconst tsType = typeof prop.type === 'string' ? prop.type.toLowerCase() : null\n\tif (tsType === 'number') return 'number'\n\tif (tsType === 'boolean') return 'boolean'\n\tif (tsType === 'date') return 'date'\n\n\treturn 'text'\n}\n\nexport function SchemaPlaygroundEditor() {\n\tconst { schemaName } = useParams<{ schemaName: string }>()\n\tconst isNewSchema = !schemaName || schemaName === 'new'\n\n\t// For existing schemas, fetch metadata\n\tconst {\n\t\tdata: schemaMetadata,\n\t\tisLoading,\n\t\terror,\n\t} = useSchema(schemaName && schemaName !== 'new' ? schemaName : undefined)\n\n\tif (!isNewSchema && isLoading) {\n\t\treturn (\n\t\t\t<div className=\"flex justify-center items-center h-64\">\n\t\t\t\t<Spinner />\n\t\t\t</div>\n\t\t)\n\t}\n\n\tif (!isNewSchema && error) {\n\t\treturn (\n\t\t\t<div className=\"p-4 border-l-4 border-red-500 bg-red-50 text-red-700 rounded m-8\">\n\t\t\t\t<h3 className=\"font-medium flex items-center gap-2\">\n\t\t\t\t\t<AlertCircle className=\"h-4 w-4\" />\n\t\t\t\t\tError loading schema\n\t\t\t\t</h3>\n\t\t\t\t<p className=\"text-sm mt-1\">{error.message}</p>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// If editing existing schema, transform metadata to builder state\n\tconst initialState =\n\t\t!isNewSchema && schemaMetadata && schemaName && schemaName !== 'new'\n\t\t\t? schemaMetadataToBuilderState(schemaName, schemaMetadata)\n\t\t\t: { ...DEFAULT_BUILDER_STATE, isNew: true }\n\n\t// TODO: In the future, we need to track schema source (plugin/core vs user-defined)\n\t// to determine if a schema should be read-only. For now, all schemas are editable.\n\t// Plugin and core schemas should be read-only once we have a way to identify them.\n\tconst isReadOnly = false\n\n\treturn (\n\t\t<SchemaEditorContentWithState\n\t\t\tkey={schemaName || 'new'}\n\t\t\tinitialState={initialState}\n\t\t\tisReadOnly={isReadOnly}\n\t\t/>\n\t)\n}\n\nfunction SchemaEditorContentWithState({\n\tinitialState,\n\tisReadOnly,\n}: {\n\tinitialState: SchemaBuilderState\n\tisReadOnly: boolean\n}) {\n\tconst context = useSchemaBuilderState(initialState)\n\n\treturn (\n\t\t<ReadOnlyContext.Provider value={isReadOnly}>\n\t\t\t<SchemaBuilderContext.Provider value={context}>\n\t\t\t\t<SchemaEditorInner />\n\t\t\t</SchemaBuilderContext.Provider>\n\t\t</ReadOnlyContext.Provider>\n\t)\n}\n\nfunction SchemaEditorInner() {\n\tconst { state, setViewMode, updateSchema, generatedCode } = useSchemaBuilder()\n\tconst isReadOnly = useContext(ReadOnlyContext)\n\tconst [addFieldOpen, setAddFieldOpen] = useState(false)\n\tconst [optionsOpen, setOptionsOpen] = useState(false)\n\n\tconst handleDeploy = async () => {\n\t\t// TODO: Implement actual deployment\n\t\talert(\n\t\t\t`Deploy functionality will be implemented in the backend phase.\\n\\nGenerated code:\\n\\n${generatedCode}`,\n\t\t)\n\t}\n\n\tconst statusBadges: {\n\t\ttype: 'warning' | 'success' | 'error' | 'info'\n\t\tlabel: string\n\t\tdot?: boolean\n\t}[] = []\n\tif (isReadOnly) {\n\t\tstatusBadges.push({\n\t\t\ttype: 'info',\n\t\t\tlabel: 'Read-only',\n\t\t})\n\t} else if (state.isDirty) {\n\t\tstatusBadges.push({\n\t\t\ttype: 'warning',\n\t\t\tlabel: 'Unsaved changes',\n\t\t\tdot: true,\n\t\t})\n\t}\n\tif (!isReadOnly && state.lastSaved) {\n\t\tstatusBadges.push({ type: 'success', label: 'Saved', dot: true })\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col h-full\">\n\t\t\t<PageHeader\n\t\t\t\tstatus={statusBadges.length > 0 ? statusBadges : undefined}\n\t\t\t\ticon={isReadOnly ? Lock : Boxes}\n\t\t\t\ttitle={\n\t\t\t\t\tisReadOnly\n\t\t\t\t\t\t? state.schema.name || 'Schema'\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tvalue: state.schema.name,\n\t\t\t\t\t\t\t\tonChange: (name) => updateSchema({ name }),\n\t\t\t\t\t\t\t\tplaceholder: 'SchemaName',\n\t\t\t\t\t\t\t\teditable: true as const,\n\t\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdescription={`api::${state.schema.name?.toLowerCase() || 'schema'}.${state.schema.name?.toLowerCase() || 'schema'}`}\n\t\t\t\ttabs={{\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{ id: 'builder', label: 'Builder', icon: PencilRuler },\n\t\t\t\t\t\t{ id: 'json', label: 'JSON', icon: FileJson },\n\t\t\t\t\t\t{ id: 'code', label: 'Code', icon: Code2 },\n\t\t\t\t\t],\n\t\t\t\t\tvalue: state.viewMode,\n\t\t\t\t\tonChange: setViewMode,\n\t\t\t\t}}\n\t\t\t\tactions={\n\t\t\t\t\tisReadOnly ? undefined : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t\t\tonClick={() => setOptionsOpen(true)}\n\t\t\t\t\t\t\t\ttitle=\"Schema Options\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Settings2 className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" disabled>\n\t\t\t\t\t\t\t\tPreview API\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={handleDeploy}\n\t\t\t\t\t\t\t\tdisabled={!state.schema.name}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Rocket className=\"h-4 w-4 mr-2\" />\n\t\t\t\t\t\t\t\tDeploy Changes\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t{/* Read-only banner for existing schemas */}\n\t\t\t{isReadOnly && (\n\t\t\t\t<div className=\"px-6 py-2 border-b border-border bg-amber-50 dark:bg-amber-950/30 flex items-center gap-2\">\n\t\t\t\t\t<Lock className=\"h-3.5 w-3.5 text-amber-600 dark:text-amber-400\" />\n\t\t\t\t\t<span className=\"text-xs text-amber-700 dark:text-amber-400\">\n\t\t\t\t\t\tThis schema is defined in code and cannot be modified here. View the\n\t\t\t\t\t\tgenerated code in the Code tab to copy and customize.\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Content - 2x7x3 grid layout */}\n\t\t\t<div className=\"flex-1 overflow-hidden grid grid-cols-12 h-full\">\n\t\t\t\t{/* Schema List - 2 columns */}\n\t\t\t\t<div className=\"col-span-2 border-r bg-muted/30 overflow-y-auto\">\n\t\t\t\t\t<SchemaList />\n\t\t\t\t</div>\n\n\t\t\t\t{/* Editor Content - 7 columns */}\n\t\t\t\t<div className=\"col-span-7 overflow-hidden flex flex-col\">\n\t\t\t\t\t{state.viewMode === 'builder' ? (\n\t\t\t\t\t\t<PageContent className=\"p-6 overflow-y-auto flex-1\">\n\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t{/* Info Alert - only show for new schemas */}\n\t\t\t\t\t\t\t\t{!isReadOnly && (\n\t\t\t\t\t\t\t\t\t<div className=\"p-3 bg-blue-50 border border-blue-100 rounded-lg flex items-start gap-3\">\n\t\t\t\t\t\t\t\t\t\t<Info className=\"h-4 w-4 text-blue-500 mt-0.5 shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-blue-900\">\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Schema Guidelines:</span>{' '}\n\t\t\t\t\t\t\t\t\t\t\tKeep field names in camelCase for better compatibility.\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t{/* Field List */}\n\t\t\t\t\t\t\t\t<FieldList\n\t\t\t\t\t\t\t\t\tonAddField={\n\t\t\t\t\t\t\t\t\t\tisReadOnly ? undefined : () => setAddFieldOpen(true)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treadOnly={isReadOnly}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PageContent>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t/* Code/JSON View */\n\t\t\t\t\t\t<PageContent className=\"p-6 overflow-y-auto flex-1\">\n\t\t\t\t\t\t\t<CodePreview mode={state.viewMode} />\n\t\t\t\t\t\t</PageContent>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Settings Panel - 3 columns */}\n\t\t\t\t<div className=\"col-span-3 border-l bg-background overflow-y-auto\">\n\t\t\t\t\t<FieldSettingsPanel />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Dialogs - only for editable schemas */}\n\t\t\t{!isReadOnly && (\n\t\t\t\t<>\n\t\t\t\t\t<AddFieldDialog open={addFieldOpen} onOpenChange={setAddFieldOpen} />\n\t\t\t\t\t<SchemaOptionsDialog\n\t\t\t\t\t\topen={optionsOpen}\n\t\t\t\t\t\tonOpenChange={setOptionsOpen}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nexport default SchemaPlaygroundEditor\n"],"names":["useNavigate","useEffect","Type","Hash","Calendar","ToggleLeft","List","Link2","index","createContext","useContext","useReducer","useCallback","useMemo","useState","Dialog","jsxs","DialogContent","DialogHeader","jsx","DialogTitle","DialogDescription","Label","cn","Input","DialogFooter","Button","Fragment","Check","Copy","SortableItemHandle","GripVertical","Badge","Pencil","Trash2","AlertCircle","Sortable","SortableContent","SortableItem","SortableOverlay","Plus","useAdmin","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","_a","X","Accordion","AccordionItem","AccordionTrigger","AccordionContent","Lock","Textarea","Switch","ChevronRight","_b","useParams","Spinner","Database","names","useDialog","useSchema","PageHeader","Boxes","PencilRuler","FileJson","Code2","Settings2","Rocket","PageContent","Info"],"mappings":";;AA+CA,QAAM,WAAmC;AAAA,IACxC,YAAY;AAAA,IACZ,QAAQ;AAAA,MACP;AAAA,QACC,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,UACT,EAAE,MAAM,IAAI,aAAa,kBAAkB;AAAA,UAC3C,EAAE,MAAM,OAAO,aAAa,mBAAmB;AAAA,UAC/C,EAAE,MAAM,eAAe,aAAa,mBAAmB;AAAA,QAAA;AAAA,MACxD;AAAA,IAEF;AAAA,IACA,SAAS;AAAA,MACR;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACR;AAAA,EAEF;AAKA,QAAM,aAGF;AAAA,IACH,iBAAiB,MAAM,QAA2B,QAAA,EAAA,KAAA,MAAA,OAAA;AAAA,IAClD,kBAAkB,MAAM,QAAA,QAAA,EAAA,KAAA,MAAA,KAAA;AAAA,EACzB;AAKA,WAAS,iBAAiB;AAErB,QAAA,CAAC,OAAO,oBAAoB;AAC/B,aAAO,qBAAqB,CAAC;AAAA,IAAA;AAIxB,UAAA,oBAAoB,OAAO,mBAAmB;AAAA,MACnD,CAAC,MAAM,EAAE,SAAS,eAAe,SAAS;AAAA,IAC3C;AAEA,QAAI,CAAC,mBAAmB;AACvB,aAAO,mBAAmB,KAAK,EAAE,UAAU,YAAY;AACvD,cAAQ,IAAI,+BAA+B,SAAS,UAAU,EAAE;AAAA,IAAA;AAAA,EAElE;AAGA,iBAAe;AAKR,QAAM,mBAAmB,OAAO,EAAE,UAAU,WAAW;ACrG9D,QAAM,aAAa,MAAM;AACxB,UAAM,WAAWA,eAAAA,YAAY;AAE7BC,UAAAA,UAAU,MAAM;AAEf,eAAS,mBAAmB,EAAE,SAAS,KAAA,CAAM;AAAA,IAAA,GAC3C,CAAC,QAAQ,CAAC;AAEN,WAAA;AAAA,EACR;;;;;ACkBO,QAAM,cAAqC;AAAA,IACjD;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC,YAAA;AAAA,MACN,QAAQ;AAAA,MACR,oBAAoB,CAAC,EAAE,MAAM,WAAc,GAAA,EAAE,MAAM,cAAc;AAAA,MACjE,WAAW,EAAE,MAAM,OAAO;AAAA,IAC3B;AAAA,IACA;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC,YAAA;AAAA,MACN,QAAQ;AAAA,MACR,oBAAoB,CAAC,EAAE,MAAM,YAAY;AAAA,MACzC,WAAW,EAAE,MAAM,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC,YAAA;AAAA,MACN,QAAQ;AAAA,MACR,oBAAoB,CAAC,EAAE,MAAM,UAAU;AAAA,MACvC,WAAW,EAAE,MAAM,OAAO;AAAA,MAC1B,qBAAqB;AAAA,IACtB;AAAA,IACA;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC,YAAA;AAAA,MACN,QAAQ;AAAA,MACR,oBAAoB,CAAC,EAAE,MAAM,aAAa;AAAA,MAC1C,WAAW,EAAE,MAAM,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC,YAAA;AAAA,MACN,QAAQ;AAAA,MACR,oBAAoB,CAAC,EAAE,MAAM,YAAY;AAAA,MACzC,WAAW,EAAE,MAAM,UAAU,SAAS,CAAA,EAAG;AAAA,MACzC,YAAY;AAAA,IACb;AAAA,IACA;AAAA,MACC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAMC,YAAA;AAAA,MACN,QAAQ;AAAA,MACR,oBAAoB,CAAC,EAAE,MAAM,YAAY;AAAA,MACzC,WAAW,EAAE,MAAM,eAAe;AAAA,MAClC,mBAAmB;AAAA,IAAA;AAAA,EAErB;AAKO,WAAS,uBACf,MACkC;AAClC,WAAO,YAAY,KAAK,CAAC,OAAO,GAAG,OAAO,IAAI;AAAA,EAC/C;AAeO,QAAM,cAAwD;AAAA,IACpE,MAAM;AAAA,MACL,EAAE,IAAI,QAAQ,OAAO,cAAc,aAAa,mBAAmB;AAAA,MACnE,EAAE,IAAI,YAAY,OAAO,aAAa,aAAa,kBAAkB;AAAA,MACrE,EAAE,IAAI,SAAS,OAAO,SAAS,aAAa,wBAAwB;AAAA,MACpE,EAAE,IAAI,SAAS,OAAO,SAAS,aAAa,qBAAqB;AAAA,MACjE,EAAE,IAAI,YAAY,OAAO,aAAa,aAAa,mBAAmB;AAAA,IACvE;AAAA,IACA,QAAQ;AAAA,MACP;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MACd;AAAA,MACA;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEf;AAAA,IACA,MAAM;AAAA,MACL;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IAEf;AAAA,IACA,SAAS;AAAA,MACR,EAAE,IAAI,UAAU,OAAO,UAAU,aAAa,gBAAgB;AAAA,MAC9D,EAAE,IAAI,YAAY,OAAO,YAAY,aAAa,iBAAiB;AAAA,IACpE;AAAA,IACA,QAAQ;AAAA,MACP,EAAE,IAAI,UAAU,OAAO,YAAY,aAAa,yBAAyB;AAAA,MACzE;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MACd;AAAA,MACA,EAAE,IAAI,YAAY,OAAO,YAAY,aAAa,sBAAsB;AAAA,MACxE,EAAE,IAAI,SAAS,OAAO,eAAe,aAAa,uBAAuB;AAAA,IAC1E;AAAA,IACA,UAAU;AAAA,MACT;AAAA,QACC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,MAAA;AAAA,IACd;AAAA,EAEF;AAoBO,QAAM,2BAAwD;AAAA,IACpE,MAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,QAAQ,CAAC,YAAY,SAAS,cAAc,cAAc,OAAO,KAAK;AAAA,IACtE,MAAM,CAAC,UAAU,cAAc,WAAW,SAAS;AAAA,IACnD,SAAS,CAAC,WAAW;AAAA,IACrB,QAAQ,CAAC,YAAY,cAAc,MAAM;AAAA,IACzC,UAAU,CAAC,YAAY,cAAc,WAAW;AAAA,EACjD;AAaO,QAAM,8BAA0D;AAAA,IACtE;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,IAClB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,OAAO,KAAK;AAAA,IAChC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,KAAK;AAAA,IACzB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,KAAK;AAAA,IACzB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,KAAK;AAAA,IACzB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,KAAK;AAAA,IACzB;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,0BAA0B;AAAA,IAAA;AAAA,EAE/C;AAKO,WAAS,4BACf,MACuC;AACvC,WAAO,4BAA4B,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAC/D;AAKO,QAAM,iBAAiB;AAAA,IAC7B;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IACd;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,IAAA;AAAA,EAEf;AAKO,QAAM,oBAA+C;AAAA,IAC3D,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,EACX;ACrPO,QAAM,wBAAsC;AAAA,IAClD,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,EACP;AAKO,QAAM,wBAA4C;AAAA,IACxD,QAAQ;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,OAAO;AAAA,EACR;AAKO,QAAM,wBAAmD;AAAA,IAC/D,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA;AAAA,EACX;AC9JO,WAAS,mBAAmB,OAAmC;AACjE,QAAA,CAAC,MAAM,OAAO,MAAM;AAChB,aAAA;AAAA,IAAA;AAGF,UAAA,UAAU,gBAAgB,MAAM,MAAM;AACtC,UAAA,iBAAiB,wBAAwB,MAAM,MAAM;AACrD,UAAA,aAAa,MAAM,OACvB,IAAI,CAAC,UAAU,kBAAkB,KAAK,CAAC,EACvC,KAAK,MAAM;AAEb,WAAO,GAAG,OAAO;AAAA;AAAA,EAAO,cAAc;AAAA,eAAkB,MAAM,OAAO,IAAI;AAAA,EAAO,UAAU;AAAA;AAAA;AAAA,EAC3F;AAKA,WAAS,gBAAgB,QAA+B;AACvD,UAAM,gBAAoB,oBAAA,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC;AAChD,UAAA,uCAAuB,IAAY;AACzC,QAAI,uBAAuB;AAE3B,eAAW,SAAS,QAAQ;AAEvB,UAAA,MAAM,YAAY,SAAS,GAAG;AACjC,sBAAc,IAAI,YAAY;AACnB,mBAAA,KAAK,MAAM,aAAa;AACjB,2BAAA,IAAI,EAAE,IAAI;AAAA,QAAA;AAAA,MAC5B;AAIG,UAAA,MAAM,SAAS,QAAQ;AACH,+BAAA;AAAA,MAAA;AAAA,IACxB;AAGD,UAAM,QAAkB,CAAC;AAGnB,UAAA;AAAA,MACL,YAAY,MAAM,KAAK,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IACxD;AAGA,QAAI,sBAAsB;AACzB,YAAM,KAAK,0CAA0C;AAAA,IAAA;AAIlD,QAAA,iBAAiB,OAAO,GAAG;AACxB,YAAA;AAAA,QACL;AAAA,GAAe,MAAM,KAAK,gBAAgB,EAAE,OAAO,KAAK,MAAO,CAAC;AAAA;AAAA,MACjE;AAAA,IAAA;AAGM,WAAA,MAAM,KAAK,IAAI;AAAA,EACvB;AAKA,WAAS,wBAAwB,QAA8C;AAC9E,UAAM,UAAoB,CAAC;AAGvB,QAAA,OAAO,eAAe,QAAW;AACpC,cAAQ,KAAK,eAAe,OAAO,UAAU,EAAE;AAAA,IAAA;AAE5C,QAAA,OAAO,SAAS,QAAW;AAC9B,cAAQ,KAAK,SAAS,OAAO,IAAI,EAAE;AAAA,IAAA;AAGhC,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAGR,WAAO,aAAa,QAAQ,KAAK,IAAI,CAAC;AAAA,EACvC;AAKA,WAAS,kBAAkB,OAA4B;AACtD,UAAM,aAAuB,CAAC;AAC9B,UAAM,SAAS;AAGX,QAAA,MAAM,SAAS,QAAQ;AACf,iBAAA,KAAK,GAAG,MAAM,mBAAmB;AAAA,IAAA;AAI7C,eAAW,KAAK,GAAG,MAAM,SAAS,oBAAoB,KAAK,CAAC,GAAG;AAG3D,QAAA,MAAM,YAAY,SAAS,GAAG;AAC3B,YAAA,aAAa,MAAM,YACvB,IAAI,CAAC,MAAM,gBAAgB,CAAC,CAAC,EAC7B,KAAK,IAAI;AACX,iBAAW,KAAK,GAAG,MAAM,eAAe,UAAU,GAAG;AAAA,IAAA;AAItD,eAAW,KAAK,GAAG,MAAM,OAAO,kBAAkB,KAAK,CAAC,GAAG;AAGrD,UAAA,cAAc,GAAG,MAAM,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM;AAE3D,WAAO,CAAC,GAAG,YAAY,WAAW,EAAE,KAAK,IAAI;AAAA,EAC9C;AAKA,WAAS,oBAAoB,OAA4B;AACxD,UAAM,UAAoB,CAAC;AAEvB,QAAA,MAAM,KAAK,UAAU;AACxB,cAAQ,KAAK,gBAAgB;AAAA,IAAA;AAE1B,QAAA,MAAM,KAAK,QAAQ;AACtB,cAAQ,KAAK,cAAc;AAAA,IAAA;AAExB,QAAA,MAAM,KAAK,MAAM;AACpB,cAAQ,KAAK,YAAY;AAAA,IAAA;AAEtB,QAAA,MAAM,KAAK,QAAQ;AACtB,cAAQ,KAAK,cAAc;AAAA,IAAA;AAExB,QAAA,MAAM,KAAK,UAAU;AACxB,cAAQ,KAAK,gBAAgB;AAAA,IAAA;AAE1B,QAAA,MAAM,KAAK,YAAY,QAAW;AAC7B,cAAA,KAAK,YAAY,KAAK,UAAU,MAAM,KAAK,OAAO,CAAC,EAAE;AAAA,IAAA;AAG1D,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAGR,WAAO,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC/B;AAKA,WAAS,kBAAkB,OAA4B;AACtD,UAAM,UAAoB,CAAC;AAEvB,QAAA,MAAM,GAAG,KAAK;AACjB,cAAQ,KAAK,SAAS,MAAM,GAAG,GAAG,GAAG;AAAA,IAAA;AAElC,QAAA,MAAM,GAAG,MAAM;AAClB,cAAQ,KAAK,YAAY;AAAA,IAAA;AAEtB,QAAA,MAAM,GAAG,MAAM;AAClB,cAAQ,KAAK,UAAU,MAAM,GAAG,IAAI,GAAG;AAAA,IAAA;AAExC,QAAI,MAAM,GAAG,SAAS,MAAM,GAAG,UAAU,MAAM,aAAa;AAC3D,cAAQ,KAAK,WAAW,aAAa,MAAM,GAAG,KAAK,CAAC,GAAG;AAAA,IAAA;AAEpD,QAAA,MAAM,GAAG,aAAa;AACzB,cAAQ,KAAK,iBAAiB,aAAa,MAAM,GAAG,WAAW,CAAC,GAAG;AAAA,IAAA;AAEhE,QAAA,MAAM,GAAG,aAAa;AACzB,cAAQ,KAAK,iBAAiB,aAAa,MAAM,GAAG,WAAW,CAAC,GAAG;AAAA,IAAA;AAEhE,QAAA,MAAM,GAAG,KAAK;AACjB,cAAQ,KAAK,WAAW;AAAA,IAAA;AAEzB,QAAI,MAAM,GAAG,WAAW,MAAM,GAAG,QAAQ,SAAS,GAAG;AAC9C,YAAA,aAAa,MAAM,GAAG,QAC1B;AAAA,QACA,CAAC,MACA,WAAW,aAAa,EAAE,GAAG,CAAC,cAAc,aAAa,EAAE,KAAK,CAAC;AAAA,MAAA,EAElE,KAAK,IAAI;AACH,cAAA,KAAK,aAAa,UAAU,GAAG;AAAA,IAAA;AAGpC,QAAA,QAAQ,WAAW,GAAG;AAClB,aAAA;AAAA,IAAA;AAGR,WAAO,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,EAC/B;AAKA,WAAS,gBAAgB,MAA8B;AACtD,QAAI,CAAC,KAAK,eAAe,KAAK,YAAY,WAAW,GAAG;AAChD,aAAA,GAAG,KAAK,IAAI;AAAA,IAAA;AAGpB,UAAM,OAAO,KAAK,YAChB,IAAI,CAAC,MAAM;AACP,UAAA,OAAO,MAAM,UAAU;AAEtB,YAAA,KAAK,SAAS,WAAW;AAC5B,iBAAO,EAAE,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC;AAAA,QAAA;AAErC,eAAO,IAAI,aAAa,OAAO,CAAC,CAAC,CAAC;AAAA,MAAA;AAEnC,aAAO,OAAO,CAAC;AAAA,IAAA,CACf,EACA,KAAK,IAAI;AAEX,WAAO,GAAG,KAAK,IAAI,IAAI,IAAI;AAAA,EAC5B;AAKA,WAAS,aAAa,KAAqB;AAC1C,WAAO,IACL,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAM,KAAK,EACnB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK;AAAA,EACvB;AAKO,WAAS,mBAAmB,OAAmC;AAC9D,WAAA;AAAA,MACN,MAAM,MAAM,OAAO;AAAA,MACnB,SAAS;AAAA,QACR,YAAY,MAAM,OAAO;AAAA,QACzB,MAAM,MAAM,OAAO;AAAA,MACpB;AAAA,MACA,YAAY,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,QACxC,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,QACnB,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM,KAAK;AAAA,QACrB,QAAQ,MAAM,KAAK;AAAA,QACnB,MAAM,MAAM,KAAK;AAAA,QACjB,IAAI,MAAM;AAAA,QACV,aAAa,MAAM;AAAA,QACnB,GAAI,MAAM,kBAAkB,EAAE,gBAAgB,MAAM,eAAe;AAAA,MAAA,EAClE;AAAA,IACH;AAAA,EACD;ACzOA,WAAS,aAAqB;AAC7B,WAAO,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAS,EAAA,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EACzE;AAKA,WAAS,QAAQ,aAA6B;AAC7C,WAAO,YACL,cACA,QAAQ,gBAAgB,EAAE,EAC1B,MAAM,KAAK,EACX,OAAO,OAAO,EACd;AAAA,MAAI,CAAC,MAAMC,WACXA,WAAU,IAAI,OAAO,KAAK,OAAO,CAAC,EAAE,YAAgB,IAAA,KAAK,MAAM,CAAC;AAAA,IAAA,EAEhE,KAAK,EAAE;AAAA,EACV;AAKA,WAAS,qBACR,OACA,QACqB;AACrB,YAAQ,OAAO,MAAM;AAAA,MACpB,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,EAAE,GAAG,MAAM,QAAQ,GAAG,OAAO,QAAQ;AAAA,UAC7C,SAAS;AAAA,QACV;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,CAAC,GAAG,MAAM,QAAQ,OAAO,OAAO;AAAA,UACxC,iBAAiB,OAAO,QAAQ;AAAA,UAChC,SAAS;AAAA,QACV;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,MAAM,OAAO;AAAA,YAAI,CAAC,UACzB,MAAM,OAAO,OAAO,QAAQ,KACzB,EAAE,GAAG,OAAO,GAAG,OAAO,QAAQ,YAC9B;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,QACV;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,MAAM,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO,OAAO,OAAO;AAAA,UAClE,iBACC,MAAM,oBAAoB,OAAO,UAC9B,OACA,MAAM;AAAA,UACV,SAAS;AAAA,QACV;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,OAAO;AAAA,UACf,SAAS;AAAA,QACV;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,iBAAiB,OAAO;AAAA,QACzB;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,UAAU,OAAO;AAAA,QAClB;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,SAAS;AAAA,QACV;AAAA,MAED,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,SAAS;AAAA,UACT,+BAAe,KAAK;AAAA,QACrB;AAAA,MAED,KAAK;AACJ,eAAO,OAAO;AAAA,MAEf,KAAK;AACG,eAAA;AAAA,UACN,GAAG;AAAA,UACH,QAAQ,OAAO,QAAQ;AAAA,UACvB,QAAQ,OAAO,QAAQ;AAAA,UACvB,SAAS;AAAA,UACT,OAAO;AAAA,QACR;AAAA,MAED;AACQ,eAAA;AAAA,IAAA;AAAA,EAEV;AAKa,QAAA,uBACZC,oBAA+C,IAAI;AAK7C,WAAS,mBAA6C;AACtD,UAAA,UAAUC,iBAAW,oBAAoB;AAC/C,QAAI,CAAC,SAAS;AACb,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IAAA;AAEM,WAAA;AAAA,EACR;AAKgB,WAAA,sBACf,eAAmC,uBACR;AAC3B,UAAM,CAAC,OAAO,QAAQ,IAAIC,MAAAA,WAAW,sBAAsB,YAAY;AAGjE,UAAA,WAAWC,kBAAY,CAAC,YAAkC;AACzD,YAAA,YAAY,QAAQ,QAAQ;AAC5B,YAAA,aAAa,uBAAuB,SAAS;AAC7C,YAAA,cAAc,QAAQ,eAAe;AAC3C,YAAM,OAAO,QAAQ,QAAQ,QAAQ,WAAW;AAEhD,YAAM,QAAqB;AAAA,QAC1B,IAAI,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,SACC,yCAAY,WAAU,sBAAsB,SAAS,KAAK;AAAA,QAC3D,MAAM;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,GAAG,QAAQ;AAAA,QACZ;AAAA,QACA,IAAI;AAAA,UACH,KAAK;AAAA,UACL,GAAG,yCAAY;AAAA,UACf,GAAG,QAAQ;AAAA,QACZ;AAAA,QACA,aAAa,QAAQ,gBAAe,yCAAY,uBAAsB,CAAC;AAAA,QACvE,gBAAgB,QAAQ;AAAA,MACzB;AAEA,eAAS,EAAE,MAAM,aAAa,SAAS,OAAO;AAAA,IAC/C,GAAG,EAAE;AAEL,UAAM,cAAcA,MAAA;AAAA,MACnB,CAAC,IAAY,YAAkC;AACrC,iBAAA,EAAE,MAAM,gBAAgB,SAAS,EAAE,IAAI,QAAA,GAAW;AAAA,MAC5D;AAAA,MACA,CAAA;AAAA,IACD;AAEM,UAAA,cAAcA,kBAAY,CAAC,OAAe;AAC/C,eAAS,EAAE,MAAM,gBAAgB,SAAS,IAAI;AAAA,IAC/C,GAAG,EAAE;AAEC,UAAA,cAAcA,kBAAY,CAAC,OAAsB;AACtD,eAAS,EAAE,MAAM,gBAAgB,SAAS,IAAI;AAAA,IAC/C,GAAG,EAAE;AAEC,UAAA,gBAAgBA,kBAAY,CAAC,WAA0B;AAC5D,eAAS,EAAE,MAAM,kBAAkB,SAAS,QAAQ;AAAA,IACrD,GAAG,EAAE;AAEC,UAAA,cAAcA,kBAAY,CAAC,SAAmB;AACnD,eAAS,EAAE,MAAM,iBAAiB,SAAS,MAAM;AAAA,IAClD,GAAG,EAAE;AAEC,UAAA,eAAeA,kBAAY,CAAC,YAAmC;AACpE,eAAS,EAAE,MAAM,cAAc,SAAS,SAAS;AAAA,IAClD,GAAG,EAAE;AAEC,UAAA,aAAaA,kBAAY,CAAC,aAAkC;AACjE,eAAS,EAAE,MAAM,SAAS,SAAS,YAAY,uBAAuB;AAAA,IACvE,GAAG,EAAE;AAGL,UAAM,gBAAgBC,MAAA;AAAA,MACrB,MAAM,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,eAAe,KAAK;AAAA,MAClE,CAAC,MAAM,QAAQ,MAAM,eAAe;AAAA,IACrC;AAEM,UAAA,gBAAgBA,MAAAA,QAAQ,MAAM,mBAAmB,KAAK,GAAG,CAAC,KAAK,CAAC;AAEhE,UAAA,gBAAgBA,MAAAA,QAAQ,MAAM,mBAAmB,KAAK,GAAG,CAAC,KAAK,CAAC;AAE/D,WAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAKgB,WAAA,oBACf,MACA,aACuB;AACjB,UAAA,aAAa,uBAAuB,IAAI;AAC9C,QAAI,CAAC,YAAY;AACT,aAAA,EAAE,MAAM,YAAY;AAAA,IAAA;AAGrB,WAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM,QAAQ,WAAW;AAAA,MACzB,QAAQ,WAAW;AAAA,MACnB,aAAa,CAAC,GAAG,WAAW,kBAAkB;AAAA,MAC9C,IAAI,EAAE,GAAG,WAAW,UAAU;AAAA,MAC9B,MAAM,EAAE,UAAU,OAAO,QAAQ,MAAM;AAAA,MACvC,GAAI,WAAW,qBAAqB;AAAA,QACnC,gBAAgB;AAAA,UACf,cAAc;AAAA,UACd,cAAc;AAAA,QAAA;AAAA,MACf;AAAA,IAEF;AAAA,EACD;AC1PO,WAAS,eAAe,EAAE,MAAM,gBAAqC;AACrE,UAAA,EAAE,SAAS,IAAI,iBAAiB;AACtC,UAAM,CAAC,cAAc,eAAe,IAAIC,MAAAA,SAAoB,MAAM;AAClE,UAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,EAAE;AACjD,UAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AAErC,UAAM,YAAY,MAAM;AACnB,UAAA,CAAC,YAAY,QAAQ;AACxB,iBAAS,0BAA0B;AACnC;AAAA,MAAA;AAGD,YAAM,YAAY,oBAAoB,cAAc,YAAY,MAAM;AACtE,eAAS,SAAS;AACN,kBAAA;AAAA,IACb;AAEA,UAAM,cAAc,MAAM;AACzB,sBAAgB,MAAM;AACtB,qBAAe,EAAE;AACjB,eAAS,EAAE;AACX,mBAAa,KAAK;AAAA,IACnB;AAEM,UAAA,iBAAiB,CAAC,SAA8B;AACrD,YAAM,YAAY,oBAAoB,KAAK,IAAI,KAAK,KAAK;AACzD,eAAS,SAAS;AACN,kBAAA;AAAA,IACb;AAEA,0CACEC,aAAAA,QAAO,EAAA,MAAY,cACnB,UAACC,2BAAA,KAAAC,4BAAA,EAAc,WAAU,eACxB,UAAA;AAAA,MAAAD,gCAACE,aAAAA,cACA,EAAA,UAAA;AAAA,QAAAC,2BAAAA,IAACC,4BAAY,UAAa,gBAAA,CAAA;AAAA,QAC1BD,2BAAAA,IAACE,kCAAkB,UAEnB,mEAAA,CAAA;AAAA,MAAA,GACD;AAAA,MAEAL,2BAAAA,KAAC,OAAI,EAAA,WAAU,kBAEd,UAAA;AAAA,QAAAA,gCAAC,OACA,EAAA,UAAA;AAAA,UAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,qEAAoE,UAErF,aAAA;AAAA,yCACC,OAAI,EAAA,WAAU,0BACb,UAAY,YAAA,IAAI,CAAC,SAAS;AAC1B,kBAAM,OAAO,KAAK;AAEjB,mBAAAN,2BAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEA,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,IAAI;AAAA,gBAClC,WAAWO,IAAA;AAAA,kBACV;AAAA,kBACA;AAAA,gBACD;AAAA,gBAEA,UAAA;AAAA,kBAAAJ,2BAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACA,WAAWI,IAAA;AAAA,wBACV;AAAA,wBACA,kBAAkB,KAAK,EAAE;AAAA,sBAC1B;AAAA,sBAEA,UAAAJ,2BAAAA,IAAC,MAAK,EAAA,WAAU,UAAU,CAAA;AAAA,oBAAA;AAAA,kBAC3B;AAAA,kBACCA,2BAAA,IAAA,OAAA,EAAI,WAAU,uBAAuB,eAAK,OAAM;AAAA,kBAChDA,2BAAA,IAAA,OAAA,EAAI,WAAU,kDACb,eAAK,YACP,CAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAnBK,KAAK;AAAA,YAoBX;AAAA,UAAA,CAED,EACF,CAAA;AAAA,QAAA,GACD;AAAA,QAEAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,YACd,UAAA;AAAA,UAAAG,2BAAAA,IAAC,SAAI,WAAU,sCACd,yCAAC,QAAK,EAAA,WAAU,mBAAkB,EACnC,CAAA;AAAA,UACAA,2BAAAA,IAAC,SAAI,WAAU,kDACd,yCAAC,QAAK,EAAA,WAAU,4CAA2C,UAAA,eAE3D,CAAA,EACD,CAAA;AAAA,QAAA,GACD;AAAA,QAGAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,aACd,UAAA;AAAA,UAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,aACd,UAAA;AAAA,YAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,SAAQ,aAAY,UAAU,cAAA;AAAA,2CACpC,OAAI,EAAA,WAAU,0BACb,UAAY,YAAA,IAAI,CAAC,SAAS;AAC1B,oBAAM,OAAO,KAAK;AAEjB,qBAAAN,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEA,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,KAAK,EAAE;AAAA,kBACtC,WAAWO,IAAA;AAAA,oBACV;AAAA,oBACA,iBAAiB,KAAK,KACnB,+BACA;AAAA,kBACJ;AAAA,kBAEA,UAAA;AAAA,oBAAAJ,2BAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACA,WAAWI,IAAA;AAAA,0BACV;AAAA,0BACA,kBAAkB,KAAK,EAAE;AAAA,wBAC1B;AAAA,wBAEA,UAAAJ,2BAAAA,IAAC,MAAK,EAAA,WAAU,UAAU,CAAA;AAAA,sBAAA;AAAA,oBAC3B;AAAA,oBACCA,2BAAA,IAAA,QAAA,EAAK,WAAU,WAAW,eAAK,MAAM,CAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAlBjC,KAAK;AAAA,cAmBX;AAAA,YAAA,CAED,EACF,CAAA;AAAA,UAAA,GACD;AAAA,UAEAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,aACd,UAAA;AAAA,YAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,SAAQ,eAAc,UAAY,gBAAA;AAAA,YACzCH,2BAAA;AAAA,cAACK,aAAA;AAAA,cAAA;AAAA,gBACA,IAAG;AAAA,gBACH,aAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM;AACD,iCAAA,EAAE,OAAO,KAAK;AAC7B,2BAAS,EAAE;AAAA,gBACZ;AAAA,gBACA,WAAW,CAAC,MAAM;AACjB,sBAAI,EAAE,QAAQ,WAAW,YAAY,QAAQ;AAClC,8BAAA;AAAA,kBAAA;AAAA,gBACX;AAAA,cACD;AAAA,YACD;AAAA,YACC,SAASL,2BAAA,IAAC,KAAE,EAAA,WAAU,4BAA4B,UAAM,OAAA;AAAA,YACxDA,2BAAA,IAAA,KAAA,EAAE,WAAU,iCAAgC,UAE7C,mEAAA,CAAA;AAAA,UAAA,EACD,CAAA;AAAA,QAAA,EACD,CAAA;AAAA,MAAA,GACD;AAAA,sCAECM,aAAAA,cACA,EAAA,UAAA;AAAA,QAAAN,+BAACO,aAAAA,QAAO,EAAA,SAAQ,WAAU,SAAS,aAAa,UAEhD,UAAA;AAAA,QACAP,2BAAAA,IAACO,uBAAO,SAAS,WAAW,UAAU,CAAC,YAAY,KAAK,GAAG,UAE3D,YAAA,CAAA;AAAA,MAAA,EACD,CAAA;AAAA,IAAA,EAAA,CACD,EACD,CAAA;AAAA,EAEF;AChLgB,WAAA,YAAY,EAAE,QAA0B;AACvD,UAAM,EAAE,eAAe,cAAc,IAAI,iBAAiB;AAC1D,UAAM,CAAC,QAAQ,SAAS,IAAIZ,MAAAA,SAAS,KAAK;AAEpC,UAAA,UACL,SAAS,SAAS,gBAAgB,KAAK,UAAU,eAAe,MAAM,CAAC;AAExE,UAAM,aAAa,YAAY;AACxB,YAAA,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACxC;AAGC,WAAAE,2BAAA,KAAC,OAAI,EAAA,WAAU,sEAEd,UAAA;AAAA,MAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,oEACd,UAAA;AAAA,QAAAG,+BAAC,QAAG,WAAU,wEACZ,UAAS,SAAA,SAAS,yBAAyB,eAC7C;AAAA,QACAA,2BAAA;AAAA,UAACO,aAAA;AAAA,UAAA;AAAA,YACA,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS;AAAA,YAER,mBAECV,2BAAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,cAACR,2BAAAA,IAAAS,YAAA,OAAA,EAAM,WAAU,gCAAgC,CAAA;AAAA,cAAE;AAAA,YAAA,EAAA,CAEpD,IAGCZ,2BAAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,cAACR,2BAAAA,IAAAU,YAAA,MAAA,EAAK,WAAU,iBAAiB,CAAA;AAAA,cAAE;AAAA,YAAA,EAEpC,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAEF,GACD;AAAA,MAGCV,2BAAA,IAAA,OAAA,EAAI,WAAU,4BACd,UAACA,2BAAAA,IAAA,OAAA,EAAI,WAAU,+DACd,UAACA,2BAAAA,IAAA,QAAA,EAAM,UAAQ,QAAA,CAAA,EAAA,CAChB,EACD,CAAA;AAAA,IAAA,GACD;AAAA,EAEF;ACtCO,WAAS,UAAU;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,iBAAiB;AAAA,EAClB,GAAmB;AACZ,UAAA,aAAa,uBAAuB,MAAM,IAAI;AACpD,UAAM,OAAO,yCAAY;AAEnB,UAAA,gBAAgB,CAAC,MAA2B;AACjD,UAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,UAAE,eAAe;AACP;AAAA,MAAA;AAAA,IAEZ;AAEA;AAAA;AAAA,MAECH,2BAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,UAAU;AAAA,UACV,WAAWO,IAAA;AAAA,YACV;AAAA,YACA,aACG,oCACA;AAAA,YACH,cAAc;AAAA,UACf;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UAGX,UAAA;AAAA,YAACP,2BAAAA,KAAA,OAAA,EAAI,WAAU,2BAEb,UAAA;AAAA,cAAA,gDACCc,iCAAmB,EAAA,WAAU,mEAC7B,UAACX,2BAAAA,IAAAY,YAAA,cAAA,EAAa,WAAU,UAAU,CAAA,EAAA,CACnC,IAEAZ,2BAAAA,IAAC,SAAI,WAAU,4BACd,yCAACY,YAAAA,cAAa,EAAA,WAAU,WAAU,EACnC,CAAA;AAAA,cAIDZ,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACA,WAAWI,IAAA;AAAA,oBACV;AAAA,oBACA,kBAAkB,MAAM,IAAI,KAC3B;AAAA,kBACF;AAAA,kBAEC,UAAQ,QAAAJ,2BAAA,IAAC,MAAK,EAAA,WAAU,UAAU,CAAA;AAAA,gBAAA;AAAA,cACpC;AAAA,cAGAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,aACd,UAAA;AAAA,gBAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,2BACd,UAAA;AAAA,kBAAAG,2BAAA,IAAC,QAAK,EAAA,WAAU,yBAAyB,UAAA,MAAM,aAAY;AAAA,kBAC1DA,2BAAA,IAAA,QAAA,EAAK,WAAU,qFACd,gBAAM,KACR,CAAA;AAAA,gBAAA,GACD;AAAA,gBACAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAAAG,+BAAC,UAAK,WAAU,4CACd,WAAY,yCAAA,UAAS,MAAM,MAC7B;AAAA,kBACC,MAAM,KAAK,YAEVH,2BAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,oBAACR,2BAAAA,IAAA,QAAA,EAAK,WAAU,kDAAkD,CAAA;AAAA,oBAClEA,2BAAA;AAAA,sBAACa,aAAA;AAAA,sBAAA;AAAA,wBACA,SAAQ;AAAA,wBACR,WAAU;AAAA,wBACV,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAED,GACD;AAAA,kBAEA,MAAM,KAAK,UAEVhB,2BAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,oBAACR,2BAAAA,IAAA,QAAA,EAAK,WAAU,kDAAkD,CAAA;AAAA,oBAClEA,2BAAA;AAAA,sBAACa,aAAA;AAAA,sBAAA;AAAA,wBACA,SAAQ;AAAA,wBACR,WAAU;AAAA,wBACV,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAED,GACD;AAAA,kBAEA,MAAM,kBAELhB,2BAAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,oBAACR,2BAAAA,IAAA,QAAA,EAAK,WAAU,kDAAkD,CAAA;AAAA,oBAClEH,2BAAAA,KAAC,QAAK,EAAA,WAAU,iCACd,UAAA;AAAA,sBAAA,MAAM,eAAe;AAAA,sBAAa;AAAA,sBAClC,MAAM,eAAe,gBAAgB;AAAA,sBAAM;AAAA,oBAAA,EAC7C,CAAA;AAAA,kBAAA,EACD,CAAA;AAAA,gBAAA,EAEF,CAAA;AAAA,cAAA,EACD,CAAA;AAAA,YAAA,GACD;AAAA,YAGC,eACAA,2BAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA,WAAWO,IAAA;AAAA,kBACV;AAAA,kBACA,aAAa,gBAAgB;AAAA,gBAC9B;AAAA,gBAEA,UAAA;AAAA,kBAAAJ,2BAAA;AAAA,oBAACO,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,CAAC,MAAM;AACf,0BAAE,gBAAgB;AACT;AAAA,sBACV;AAAA,sBAEA,UAAAP,2BAAAA,IAACc,YAAAA,QAAO,EAAA,WAAU,cAAc,CAAA;AAAA,oBAAA;AAAA,kBACjC;AAAA,kBACAd,2BAAA;AAAA,oBAACO,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,CAAC,MAAM;AACf,0BAAE,gBAAgB;AACP;AAAA,sBACZ;AAAA,sBAEA,UAAAP,2BAAAA,IAACe,YAAAA,QAAO,EAAA,WAAU,cAAc,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACjC;AAAA,cAAA;AAAA,YAAA;AAAA,UACD;AAAA,QAAA;AAAA,MAAA;AAAA;AAAA,EAIJ;AC/IO,WAAS,UAAU,EAAE,YAAY,WAAW,SAAyB;AAC3E,UAAM,EAAE,OAAO,aAAa,aAAa,cAAA,IAAkB,iBAAiB;AAEtE,UAAA,gBAAgB,CAAC,oBAAmC;AACzD,oBAAc,eAAe;AAAA,IAC9B;AAGC,WAAAlB,2BAAA,KAAC,OAAI,EAAA,WAAU,6DAEd,UAAA;AAAA,MAAAG,2BAAAA,IAAC,SAAI,WAAU,oEACd,UAACH,2BAAA,KAAA,MAAA,EAAG,WAAU,wEAAuE,UAAA;AAAA,QAAA;AAAA,QAC3E,MAAM,OAAO;AAAA,QAAO;AAAA,MAAA,EAAA,CAC9B,EACD,CAAA;AAAA,MAGC,MAAM,OAAO,WAAW,IACvBA,2BAAAA,KAAA,OAAA,EAAI,WAAU,yCACd,UAAA;AAAA,QAACG,2BAAAA,IAAAgB,YAAA,aAAA,EAAY,WAAU,oCAAoC,CAAA;AAAA,QAC1DhB,2BAAA,IAAA,KAAA,EAAE,WAAU,4BAA2B,UAAa,iBAAA;AAAA,uCACpD,KAAE,EAAA,WAAU,WACX,UAAA,WACE,sCACA,qDACJ,CAAA;AAAA,MAAA,EAAA,CACD,IACG;AAAA;AAAA,QAEHA,2BAAAA,IAAC,SAAI,WAAU,YACb,gBAAM,OAAO,IAAI,CAAC,UAClBA,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEA;AAAA,YACA,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,gBAAgB;AAAA,UAAA;AAAA,UAJX,MAAM;AAAA,QAAA,CAMZ,EACF,CAAA;AAAA,UAEAH,2BAAA;AAAA,QAACoB,aAAA;AAAA,QAAA;AAAA,UACA,OAAO,MAAM;AAAA,UACb,eAAe;AAAA,UACf,cAAc,CAAC,UAAU,MAAM;AAAA,UAE/B,UAAA;AAAA,YAAAjB,2BAAA,IAACkB,aAAgB,iBAAA,EAAA,WAAU,YACzB,UAAA,MAAM,OAAO,IAAI,CAAC,UACjBlB,2BAAA,IAAAmB,2BAAA,EAA4B,OAAO,MAAM,IACzC,UAAAnB,2BAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACA;AAAA,gBACA,YAAY,MAAM,OAAO,MAAM;AAAA,gBAC/B,SAAS,MAAM,YAAY,MAAM,EAAE;AAAA,gBACnC,QAAQ,MAAM,YAAY,MAAM,EAAE;AAAA,gBAClC,UAAU,MAAM;AACf,sBACC,OAAO;AAAA,oBACN,oCAAoC,MAAM,WAAW;AAAA,kBAAA,GAErD;AACD,gCAAY,MAAM,EAAE;AAAA,kBAAA;AAAA,gBACrB;AAAA,cACD;AAAA,YAdiB,EAAA,GAAA,MAAM,EAgBzB,CACA,GACF;AAAA,YAECA,2BAAAA,IAAAoB,aAAAA,iBAAA,EACC,UAAC,CAAA,EAAE,YAAyC;AACtC,oBAAA,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AACrD,qBAAO,QACNpB,2BAAAA,IAAC,OAAI,EAAA,WAAU,6CACd,UAAAA,2BAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACA;AAAA,kBACA,YAAU;AAAA,kBACV,aAAa;AAAA,kBACb,gBAAgB;AAAA,gBAAA;AAAA,iBAElB,IACG;AAAA,YAAA,EAEN,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACD;AAAA,MAIA,CAAC,YAAY,cACZA,+BAAA,OAAA,EAAI,WAAU,4BACd,UAAAH,2BAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAEV,UAAA;AAAA,YAAAG,2BAAAA,IAAC,SAAI,WAAU,+EACd,yCAACqB,YAAAA,MAAK,EAAA,WAAU,WAAU,EAC3B,CAAA;AAAA,YAAM;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAGR,CAAA;AAAA,IAAA,GAEF;AAAA,EAEF;AC/EA,QAAM,wBAA8C;AAAA,IACnD;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS,EAAE,cAAc,OAAO,eAAe,MAAM;AAAA,IACtD;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS,EAAE,cAAc,OAAO,eAAe,KAAK;AAAA,IACrD;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS,EAAE,cAAc,MAAM,eAAe,MAAM;AAAA,IACrD;AAAA,IACA;AAAA,MACC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS,EAAE,cAAc,MAAM,eAAe,KAAK;AAAA,IAAA;AAAA,EAErD;AAEA,WAAS,gBAAgB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACT,GAMG;AAED,WAAAxB,2BAAA,KAAC,OAAI,EAAA,WAAU,0CAEd,UAAA;AAAA,MAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QACA,gBAAAG,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAA;AAAA,cACV;AAAA,cACA,QAAQ,8BAA8B;AAAA,YACvC;AAAA,YAEC,UAAA;AAAA,UAAA;AAAA,QACF;AAAA,QAEDJ,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAA;AAAA,cACV;AAAA,cACA,QAAQ,8BAA8B;AAAA,YACvC;AAAA,YAEC,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,GACD;AAAA,MAGAP,2BAAAA,KAAC,OAAI,EAAA,WAAU,qBACd,UAAA;AAAA,QAAAG,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAA;AAAA,cACV;AAAA,cACA,QAAQ,gBAAgB;AAAA,YAAA;AAAA,UACzB;AAAA,QACD;AAAA,QACAJ,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAAA,GAAG,+BAA+B,QAAQ,QAAQ,MAAM;AAAA,UAAA;AAAA,QACpE;AAAA,QACAJ,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAA;AAAA,cACV;AAAA,cACA,QAAQ,sBAAsB;AAAA,YAAA;AAAA,UAC/B;AAAA,QAAA;AAAA,MACD,GACD;AAAA,MAGAP,2BAAAA,KAAC,OAAI,EAAA,WAAU,2BACd,UAAA;AAAA,QAAAG,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAA;AAAA,cACV;AAAA,cACA,QAAQ,8BAA8B;AAAA,YACvC;AAAA,YAEC,UAAA;AAAA,UAAA;AAAA,QACF;AAAA,QACC,iBACAJ,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,WAAWI,IAAA;AAAA,cACV;AAAA,cACA,QAAQ,8BAA8B;AAAA,YACvC;AAAA,YAEC,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,EAEF,CAAA;AAAA,IAAA,GACD;AAAA,EAEF;AAEO,WAAS,oBAAoB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,GAA6B;AACtB,UAAA,EAAE,QAAQ,IAAIkB,eAAS;AAC7B,UAAM,CAAC,QAAQ,SAAS,IAAI3B,eAAyB;AAAA,MACpD,eAAc,iDAAgB,iBAAgB;AAAA,MAC9C,eAAc,iDAAgB,iBAAgB;AAAA,MAC9C,aAAa,iDAAgB;AAAA,IAAA,CAC7B;AAED,UAAM,aAAa,MAAM;AACxB,aAAO,MAAM;AACb,mBAAa,KAAK;AAAA,IACnB;AAEA,UAAM,qBAAqB,sBAAsB;AAAA,MAChD,CAAC,MAAM,EAAE,UAAU,OAAO;AAAA,IAC3B;AAEA,0CACEC,aAAAA,QAAO,EAAA,MAAY,cACnB,UAACC,2BAAA,KAAAC,4BAAA,EAAc,WAAU,eACxB,UAAA;AAAA,MAAAD,gCAACE,aAAAA,cACA,EAAA,UAAA;AAAA,QAAAC,2BAAAA,IAACC,4BAAY,UAAkB,qBAAA,CAAA;AAAA,QAC/BD,2BAAAA,IAACE,kCAAkB,UAEnB,kDAAA,CAAA;AAAA,MAAA,GACD;AAAA,MAEAL,2BAAAA,KAAC,OAAI,EAAA,WAAU,kBAEd,UAAA;AAAA,QAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,aACd,UAAA;AAAA,UAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,uBAAsB,UAAa,iBAAA;AAAA,yCACnD,OAAI,EAAA,WAAU,0BACb,UAAsB,sBAAA,IAAI,CAAC,WAC3BN,2BAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cAEA,MAAK;AAAA,cACL,SAAS,MACR,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,cAAc,OAAO,MAAA,EAAQ;AAAA,cAExD,WAAWO,IAAA;AAAA,gBACV;AAAA,gBACA,OAAO,iBAAiB,OAAO,QAC5B,oDACA;AAAA,cACJ;AAAA,cAEA,UAAA;AAAA,gBAACJ,2BAAAA,IAAA,OAAA,EAAI,WAAU,QACd,UAAAA,2BAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACA,WAAW,iBAAiB;AAAA,oBAC5B,YAAY,OAAO,gBAAgB;AAAA,oBACnC,cAAc,OAAO,QAAQ;AAAA,oBAC7B,eAAe,OAAO,QAAQ;AAAA,oBAC9B,OAAK;AAAA,kBAAA;AAAA,gBAAA,GAEP;AAAA,gBACCA,2BAAA,IAAA,KAAA,EAAE,WAAU,uBAAuB,iBAAO,OAAM;AAAA,gBAChDA,2BAAA,IAAA,KAAA,EAAE,WAAU,wCACX,iBAAO,YACT,CAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAxBK,OAAO;AAAA,UAAA,CA0Bb,EACF,CAAA;AAAA,QAAA,GACD;AAAA,QAGC,sBACAH,2BAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,UAACG,2BAAA,IAAA,KAAA,EAAE,WAAU,kDAAiD,UAE9D,WAAA;AAAA,UACAA,2BAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,WAAW,iBAAiB;AAAA,cAC5B,YAAY,OAAO,gBAAgB;AAAA,cACnC,cAAc,mBAAmB,QAAQ;AAAA,cACzC,eAAe,mBAAmB,QAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAC3C,GACD;AAAA,QAIDH,2BAAAA,KAAC,OAAI,EAAA,WAAU,aACd,UAAA;AAAA,UAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,uBAAsB,UAAkB,sBAAA;AAAA,UACzDN,2BAAA;AAAA,YAAC0B,aAAA;AAAA,YAAA;AAAA,cACA,OAAO,OAAO;AAAA,cACd,eAAe,CAAC,UACf,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,cAAc,MAAA,EAAQ;AAAA,cAGjD,UAAA;AAAA,gBAAAvB,+BAACwB,aAAAA,eACA,EAAA,UAAAxB,2BAAA,IAACyB,aAAY,aAAA,EAAA,aAAY,qBAAqB,CAAA,GAC/C;AAAA,gBACCzB,2BAAA,IAAA0B,aAAA,eAAA,EACC,UAAS,mCAAA,IAAI,CAAC,WACb1B,2BAAAA,IAAA2B,aAAAA,YAAA,EAAwB,OAAO,QAC9B,UADe,OAAA,GAAA,MAEjB,GAEF,CAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACD;AAAA,UACC3B,2BAAA,IAAA,KAAA,EAAE,WAAU,iCAAgC,UAE7C,uCAAA,CAAA;AAAA,QAAA,GACD;AAAA,QAGAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,aACd,UAAA;AAAA,UAACA,2BAAAA,KAAAM,aAAAA,OAAA,EAAM,WAAU,uBAAsB,UAAA;AAAA,YAAA;AAAA,YACnB;AAAA,YAClBH,2BAAA,IAAA,QAAA,EAAK,WAAU,qCAAoC,UAEpD,aAAA,CAAA;AAAA,UAAA,GACD;AAAA,UACAA,2BAAA;AAAA,YAACK,aAAA;AAAA,YAAA;AAAA,cACA,OAAO,OAAO,eAAe;AAAA,cAC7B,UAAU,CAAC,MACV,UAAU,CAAC,OAAO,EAAE,GAAG,GAAG,aAAa,EAAE,OAAO,MAAQ,EAAA;AAAA,cAEzD,aAAa,UAAS,+CAAe,kBAAiB,OAAO;AAAA,YAAA;AAAA,UAC9D;AAAA,UACCL,2BAAA,IAAA,KAAA,EAAE,WAAU,iCAAgC,UAE7C,4DAAA,CAAA;AAAA,QAAA,EACD,CAAA;AAAA,MAAA,GACD;AAAA,sCAECM,aAAAA,cACA,EAAA,UAAA;AAAA,QAACN,2BAAAA,IAAAO,aAAA,QAAA,EAAO,SAAQ,WAAU,SAAS,MAAM,aAAa,KAAK,GAAG,UAE9D,SAAA,CAAA;AAAA,QACAP,+BAACO,aAAAA,UAAO,SAAS,YAAY,UAAU,CAAC,OAAO,cAAc,UAE7D,qBAAA,CAAA;AAAA,MAAA,EACD,CAAA;AAAA,IAAA,EAAA,CACD,EACD,CAAA;AAAA,EAEF;ACjQO,WAAS,qBAAqB;;AACpC,UAAM,EAAE,eAAe,aAAa,aAAa,MAAA,IAAU,iBAAiB;AACtE,UAAA,EAAE,QAAQ,IAAIe,eAAS;AAC7B,UAAM,CAAC,cAAc,eAAe,IAAI3B,MAAAA,SAAS,EAAE;AACnD,UAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,EAAE;AACvD,UAAM,CAAC,mBAAmB,oBAAoB,IAAIA,MAAAA,SAAS,KAAK;AAEhE,QAAI,CAAC,eAAe;AACnB,aACEK,2BAAA,IAAA,OAAA,EAAI,WAAU,iFACd,0CAAC,OACA,EAAA,UAAA;AAAA,QAACA,2BAAA,IAAA,KAAA,EAAE,WAAU,4BAA2B,UAAiB,qBAAA;AAAA,QACxDA,2BAAA,IAAA,KAAA,EAAE,WAAU,WAAU,UAAmC,sCAAA,CAAA;AAAA,MAAA,EAAA,CAC3D,EACD,CAAA;AAAA,IAAA;AAII,UAAA,eAAe,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,IAAI;AACxE,UAAM,uBACL,yBAAyB,cAAc,IAAI,KAAK,CAAC;AAClD,UAAM,aAAa,YAAY,cAAc,IAAI,KAAK,CAAC;AAEvD,UAAM,kBAAkB,MAAM;AAC7B,UAAI,CAAC,aAAa,KAAA,KAAU,CAAC,eAAe,OAAQ;AACpD,YAAM,iBAAiB,cAAc,GAAG,WAAW,CAAC;AACpD,kBAAY,cAAc,IAAI;AAAA,QAC7B,IAAI;AAAA,UACH,GAAG,cAAc;AAAA,UACjB,SAAS;AAAA,YACR,GAAG;AAAA,YACH,EAAE,KAAK,aAAa,QAAQ,OAAO,eAAe,KAAO,EAAA;AAAA,UAAA;AAAA,QAC1D;AAAA,MACD,CACA;AACD,sBAAgB,EAAE;AAClB,wBAAkB,EAAE;AAAA,IACrB;AAEM,UAAA,qBAAqB,CAACX,WAAkB;AAC7C,YAAM,iBAAiB,cAAc,GAAG,WAAW,CAAC;AACpD,kBAAY,cAAc,IAAI;AAAA,QAC7B,IAAI;AAAA,UACH,GAAG,cAAc;AAAA,UACjB,SAAS,eAAe,OAAO,CAAC,GAAG,MAAM,MAAMA,MAAK;AAAA,QAAA;AAAA,MACrD,CACA;AAAA,IACF;AAEM,UAAA,sBAAsB,CAAC,SAAiB;AACvC,YAAA,qBAAqB,cAAc,eAAe,CAAC;AACzD,UAAI,mBAAmB,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,EAAG;AAE/C,YAAA,UAAU,4BAA4B,IAAI;AAChD,YAAM,UAA0B;AAAA,QAC/B;AAAA,QACA,cAAa,mCAAS,mBAAkB,KAAK;AAAA,MAC9C;AACA,kBAAY,cAAc,IAAI;AAAA,QAC7B,aAAa,CAAC,GAAG,oBAAoB,OAAO;AAAA,MAAA,CAC5C;AAAA,IACF;AAEM,UAAA,yBAAyB,CAAC,SAAiB;AAChD,kBAAY,cAAc,IAAI;AAAA,QAC7B,aAAa,cAAc,YAAY,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,MAAA,CACpE;AAAA,IACF;AAEM,UAAA,oCAAoC,CACzC,MACA,gBACI;AACJ,kBAAY,cAAc,IAAI;AAAA,QAC7B,aAAa,cAAc,YAAY;AAAA,UAAI,CAAC,MAC3C,EAAE,SAAS,OAAO,EAAE,GAAG,GAAG,gBAAgB;AAAA,QAAA;AAAA,MAC3C,CACA;AAAA,IACF;AAEM,UAAA,uBAAuB,CAAC,SAA6B;;AACnD,eAAAuC,MAAA,eAAe,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI,MAA3C,gBAAAA,IAA8C,UAAS;AAAA,IAC/D;AAGC,WAAA/B,2BAAA,KAAC,OAAI,EAAA,WAAU,wBAEd,UAAA;AAAA,MAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,kDACd,UAAA;AAAA,QAACG,2BAAA,IAAA,MAAA,EAAG,WAAU,iDAAgD,UAE9D,kBAAA;AAAA,QACAA,2BAAA;AAAA,UAACO,aAAA;AAAA,UAAA;AAAA,YACA,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,YAAY,IAAI;AAAA,YAE/B,UAAAP,2BAAAA,IAAC6B,YAAAA,GAAE,EAAA,WAAU,UAAU,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACxB,GACD;AAAA,MAGA7B,2BAAAA,IAAC,OAAI,EAAA,WAAU,0BACd,UAAAH,2BAAA;AAAA,QAACiC,aAAA;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,cAAc,CAAC,cAAc,aAAa;AAAA,UAC1C,WAAU;AAAA,UAGV,UAAA;AAAA,YAAAjC,2BAAA,KAACkC,aAAc,eAAA,EAAA,OAAM,cAAa,WAAU,QAC3C,UAAA;AAAA,cAAC/B,2BAAA,IAAAgC,aAAA,kBAAA,EAAiB,WAAU,iDAAgD,UAE5E,cAAA;AAAA,cACAnC,2BAAAA,KAACoC,aAAAA,kBAAiB,EAAA,WAAU,aAC3B,UAAA;AAAA,gBAACpC,2BAAAA,KAAA,OAAA,EAAI,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAY,gBAAA;AAAA,kBACvCH,2BAAA;AAAA,oBAACK,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO,cAAc;AAAA,sBACrB,UAAU,CAAC,MACV,YAAY,cAAc,IAAI;AAAA,wBAC7B,aAAa,EAAE,OAAO;AAAA,sBAAA,CACtB;AAAA,sBAEF,WAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACX,GACD;AAAA,gBAEAR,2BAAAA,KAAC,OAAI,EAAA,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAM,UAAA;AAAA,kBACjCN,2BAAAA,KAAC,OAAI,EAAA,WAAU,YACd,UAAA;AAAA,oBAAAG,2BAAA;AAAA,sBAACK,aAAA;AAAA,sBAAA;AAAA,wBACA,OAAO,cAAc;AAAA,wBACrB,UAAU,CAAC,MACV,YAAY,cAAc,IAAI,EAAE,MAAM,EAAE,OAAO,OAAO;AAAA,wBAEvD,WAAU;AAAA,sBAAA;AAAA,oBACX;AAAA,oBACAL,2BAAAA,IAACkC,YAAK,MAAA,EAAA,WAAU,kEAAkE,CAAA;AAAA,kBAAA,EACnF,CAAA;AAAA,gBAAA,GACD;AAAA,gBAEArC,2BAAAA,KAAC,OAAI,EAAA,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAU,cAAA;AAAA,kBACrCN,2BAAA;AAAA,oBAAC0B,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO,cAAc;AAAA,sBACrB,eAAe,CAAC,UACf,YAAY,cAAc,IAAI,EAAE,MAAM,OAAoB;AAAA,sBAG3D,UAAA;AAAA,wBAACvB,2BAAA,IAAAwB,aAAA,eAAA,EACA,UAACxB,2BAAA,IAAAyB,aAAA,aAAA,CAAY,CAAA,GACd;AAAA,wBACCzB,+BAAA0B,aAAAA,eAAA,EACC,UAAY,YAAA,IAAI,CAAC,SACjB1B,2BAAAA,IAAC2B,aAAyB,YAAA,EAAA,OAAO,KAAK,IACrC,UAAC9B,2BAAAA,KAAA,OAAA,EAAI,WAAU,2BACd,UAAA;AAAA,0BAAAG,2BAAAA,IAAC,KAAK,MAAL,EAAU,WAAU,UAAU,CAAA;AAAA,0BAC9B,KAAK;AAAA,wBAAA,EAAA,CACP,EAJgB,GAAA,KAAK,EAKtB,CACA,EACF,CAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACD,GACD;AAAA,gBAGC,WAAW,SAAS,KACnBH,2BAAA,KAAA,OAAA,EAAI,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAO,WAAA;AAAA,kBAClCN,2BAAA;AAAA,oBAAC0B,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO,cAAc,GAAG,UAAQ,gBAAW,CAAC,MAAZ,mBAAe;AAAA,sBAC/C,eAAe,CAAC,UACf,YAAY,cAAc,IAAI;AAAA,wBAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,MAAM,MAAM;AAAA,sBAAA,CACvC;AAAA,sBAGF,UAAA;AAAA,wBAACvB,2BAAA,IAAAwB,aAAA,eAAA,EACA,UAACxB,2BAAA,IAAAyB,aAAA,aAAA,CAAY,CAAA,GACd;AAAA,wBACAzB,2BAAAA,IAAC0B,aAAAA,eACC,EAAA,UAAA,WAAW,IAAI,CAAC,YACf1B,2BAAAA,IAAA2B,aAAAA,YAAA,EAA4B,OAAO,QAAQ,IAC3C,UAAA3B,2BAAA,IAAC,SAAI,WAAU,iBACd,UAACA,2BAAAA,IAAA,QAAA,EAAM,UAAQ,QAAA,MAAA,CAAM,GACtB,EAHgB,GAAA,QAAQ,EAIzB,CACA,EACF,CAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACD;AAAA,iDACC,KAAE,EAAA,WAAU,iCACX,YAAW,gBAAA,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,GAAG,IAAI,MAA1C,mBACT,kBAAe,gBAAW,CAAC,MAAZ,mBAAe,aAClC,CAAA;AAAA,gBAAA,EACD,CAAA;AAAA,cAAA,EAEF,CAAA;AAAA,YAAA,GACD;AAAA,YAGCH,2BAAA,KAAAkC,aAAA,eAAA,EAAc,OAAM,eAAc,WAAU,QAC5C,UAAA;AAAA,cAAC/B,2BAAA,IAAAgC,aAAA,kBAAA,EAAiB,WAAU,iDAAgD,UAE5E,eAAA;AAAA,cACAnC,2BAAAA,KAACoC,aAAAA,kBAAiB,EAAA,WAAU,aAC3B,UAAA;AAAA,gBAACpC,2BAAAA,KAAA,OAAA,EAAI,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAG,OAAA;AAAA,kBAC9BH,2BAAA;AAAA,oBAACK,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO,cAAc,GAAG,OAAO;AAAA,sBAC/B,UAAU,CAAC,MACV,YAAY,cAAc,IAAI;AAAA,wBAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,KAAK,EAAE,OAAO,MAAM;AAAA,sBAAA,CAC/C;AAAA,sBAEF,aAAY;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACb,GACD;AAAA,gBAEAR,2BAAAA,KAAC,OAAI,EAAA,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAW,eAAA;AAAA,kBACtCH,2BAAA;AAAA,oBAACmC,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO,cAAc,GAAG,eAAe;AAAA,sBACvC,UAAU,CAAC,MACV,YAAY,cAAc,IAAI;AAAA,wBAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,aAAa,EAAE,OAAO,MAAM;AAAA,sBAAA,CACvD;AAAA,sBAEF,aAAY;AAAA,sBACZ,MAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACP,GACD;AAAA,gBAEAtC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAkB,sBAAA;AAAA,kBAC7CH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,GAAG,QAAQ;AAAA,sBAClC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,MAAM,QAAQ;AAAA,sBACzC,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,GACD;AAAA,gBAEAvC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAgB,oBAAA;AAAA,kBAC3CH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,GAAG,OAAO;AAAA,sBACjC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,KAAK,QAAQ;AAAA,sBACxC,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,EACD,CAAA;AAAA,cAAA,EACD,CAAA;AAAA,YAAA,GACD;AAAA,YAGCvC,2BAAA,KAAAkC,aAAA,eAAA,EAAc,OAAM,eAAc,WAAU,QAC5C,UAAA;AAAA,cAAC/B,2BAAA,IAAAgC,aAAA,kBAAA,EAAiB,WAAU,iDAAgD,UAE5E,eAAA;AAAA,cACAnC,2BAAAA,KAACoC,aAAAA,kBAAiB,EAAA,WAAU,aAC3B,UAAA;AAAA,gBAACpC,2BAAAA,KAAA,OAAA,EAAI,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAQ,YAAA;AAAA,kBACnCH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,KAAK,YAAY;AAAA,sBACxC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,MAAM,EAAE,GAAG,cAAc,MAAM,UAAU,QAAQ;AAAA,sBACjD,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,GACD;AAAA,gBAEAvC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAM,UAAA;AAAA,kBACjCH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,KAAK,UAAU;AAAA,sBACtC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,MAAM,EAAE,GAAG,cAAc,MAAM,QAAQ,QAAQ;AAAA,sBAC/C,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,GACD;AAAA,gBAEAvC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAM,UAAA;AAAA,kBACjCH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,KAAK,UAAU;AAAA,sBACtC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,MAAM,EAAE,GAAG,cAAc,MAAM,QAAQ,QAAQ;AAAA,sBAC/C,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,GACD;AAAA,gBAEAvC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAS,aAAA;AAAA,kBACpCH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,KAAK,YAAY;AAAA,sBACxC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,MAAM,EAAE,GAAG,cAAc,MAAM,UAAU,QAAQ;AAAA,sBACjD,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,GACD;AAAA,gBAEAvC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAW,eAAA;AAAA,kBACtCH,2BAAA;AAAA,oBAACoC,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAS,cAAc,KAAK,QAAQ;AAAA,sBACpC,iBAAiB,CAAC,YACjB,YAAY,cAAc,IAAI;AAAA,wBAC7B,MAAM,EAAE,GAAG,cAAc,MAAM,MAAM,QAAQ;AAAA,sBAC7C,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEH,EACD,CAAA;AAAA,cAAA,EACD,CAAA;AAAA,YAAA,GACD;AAAA,aAGC,6CAAc,eACdvC,2BAAA,KAACkC,8BAAc,OAAM,kBAAiB,WAAU,QAC/C,UAAA;AAAA,cAAC/B,2BAAA,IAAAgC,aAAA,kBAAA,EAAiB,WAAU,iDAAgD,UAE5E,kBAAA;AAAA,cACAnC,2BAAAA,KAACoC,aAAAA,kBAAiB,EAAA,WAAU,aACzB,UAAA;AAAA,iBAAA,cAAc,GAAG,WAAW,CAAA,GAAI,IAAI,CAAC,QAAQ5C,WAC9CQ,2BAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEA,WAAU;AAAA,oBAEV,UAAA;AAAA,sBAAAG,2BAAA;AAAA,wBAACK,aAAA;AAAA,wBAAA;AAAA,0BACA,OAAO,OAAO;AAAA,0BACd,UAAU,CAAC,MAAM;AAChB,kCAAM,aAAa,CAAC,GAAI,cAAc,GAAG,WAAW,CAAA,CAAG;AAC5C,uCAAAhB,MAAK,IAAI,EAAE,GAAG,QAAQ,KAAK,EAAE,OAAO,MAAM;AACrD,wCAAY,cAAc,IAAI;AAAA,8BAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,SAAS,WAAW;AAAA,4BAAA,CAC/C;AAAA,0BACF;AAAA,0BACA,aAAY;AAAA,0BACZ,WAAU;AAAA,wBAAA;AAAA,sBACX;AAAA,sBACAW,2BAAA;AAAA,wBAACK,aAAA;AAAA,wBAAA;AAAA,0BACA,OAAO,OAAO;AAAA,0BACd,UAAU,CAAC,MAAM;AAChB,kCAAM,aAAa,CAAC,GAAI,cAAc,GAAG,WAAW,CAAA,CAAG;AAC5C,uCAAAhB,MAAK,IAAI,EAAE,GAAG,QAAQ,OAAO,EAAE,OAAO,MAAM;AACvD,wCAAY,cAAc,IAAI;AAAA,8BAC7B,IAAI,EAAE,GAAG,cAAc,IAAI,SAAS,WAAW;AAAA,4BAAA,CAC/C;AAAA,0BACF;AAAA,0BACA,aAAY;AAAA,0BACZ,WAAU;AAAA,wBAAA;AAAA,sBACX;AAAA,sBACAW,2BAAA;AAAA,wBAACO,aAAA;AAAA,wBAAA;AAAA,0BACA,SAAQ;AAAA,0BACR,MAAK;AAAA,0BACL,WAAU;AAAA,0BACV,SAAS,MAAM,mBAAmBlB,MAAK;AAAA,0BAEvC,UAAAW,2BAAAA,IAACe,YAAAA,QAAO,EAAA,WAAU,cAAc,CAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACjC;AAAA,kBAAA;AAAA,kBAlCK,OAAO,OAAO,UAAU1B,MAAK;AAAA,gBAAA,CAoCnC;AAAA,gBAEDQ,2BAAAA,KAAC,OAAI,EAAA,WAAU,2BACd,UAAA;AAAA,kBAAAG,2BAAA;AAAA,oBAACK,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,sBAC/C,aAAY;AAAA,sBACZ,WAAU;AAAA,oBAAA;AAAA,kBACX;AAAA,kBACAL,2BAAA;AAAA,oBAACK,aAAA;AAAA,oBAAA;AAAA,sBACA,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,sBACjD,aAAY;AAAA,sBACZ,WAAU;AAAA,oBAAA;AAAA,kBACX;AAAA,kBACAL,2BAAA;AAAA,oBAACO,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS;AAAA,sBACT,UAAU,CAAC,aAAa,KAAU,KAAA,CAAC,eAAe,KAAK;AAAA,sBAEvD,UAAAP,2BAAAA,IAACqB,YAAAA,MAAK,EAAA,WAAU,cAAc,CAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC/B,EACD,CAAA;AAAA,cAAA,EACD,CAAA;AAAA,YAAA,GACD;AAAA,aAIA,6CAAc,sBACdxB,2BAAA,KAACkC,8BAAc,OAAM,mBAAkB,WAAU,QAChD,UAAA;AAAA,cAAC/B,2BAAA,IAAAgC,aAAA,kBAAA,EAAiB,WAAU,iDAAgD,UAE5E,0BAAA;AAAA,cACAnC,2BAAAA,KAACoC,aAAAA,kBAAiB,EAAA,WAAU,aAE3B,UAAA;AAAA,gBAACpC,2BAAAA,KAAA,OAAA,EAAI,WAAU,+CACd,UAAA;AAAA,kBAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,6CACd,UAAA;AAAA,oBAACG,2BAAA,IAAA,QAAA,EAAK,WAAU,yBAAwB,UAAa,iBAAA;AAAA,oBACrDA,2BAAAA,IAAC,QAAK,EAAA,WAAU,eACd,UAAA;AAAA,uBACA,mBAAc,mBAAd,mBAA8B;AAAA,oBAAA,EAEhC,CAAA;AAAA,kBAAA,GACD;AAAA,kBAGAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,+CACd,UAAA;AAAA,oBAAAG,+BAAC,SAAI,WAAU,wEACb,UAAM,MAAA,OAAO,QAAQ,WACvB;AAAA,oBACAH,2BAAAA,KAAC,OAAI,EAAA,WAAU,6BACd,UAAA;AAAA,sBAACG,2BAAAA,IAAA,OAAA,EAAI,WAAU,8CAA8C,CAAA;AAAA,sBAC7DA,2BAAAA,IAAC,OAAI,EAAA,WAAU,kCAAkC,CAAA;AAAA,sBACjDA,2BAAAA,IAACqC,YAAa,cAAA,EAAA,WAAU,mCAAmC,CAAA;AAAA,oBAAA,GAC5D;AAAA,mDACC,OAAI,EAAA,WAAU,wEACb,YAAc,mBAAA,mBAAA,mBAAgB,iBAC9B,YACF,CAAA;AAAA,kBAAA,GACD;AAAA,kBAEArC,2BAAA;AAAA,oBAACO,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,WAAU;AAAA,sBACV,SAAS,MAAM,qBAAqB,IAAI;AAAA,sBACxC,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAED,GACD;AAAA,gBAEAV,2BAAAA,KAAC,OAAI,EAAA,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAkB,sBAAA;AAAA,kBAC7CN,2BAAA;AAAA,oBAAC0B,aAAA;AAAA,oBAAA;AAAA,sBACA,SAAO,mBAAc,mBAAd,mBAA8B,iBAAgB;AAAA,sBACrD,eAAe,CAAC,UACf;;AAAA,2CAAY,cAAc,IAAI;AAAA,0BAC7B,gBAAgB;AAAA,4BACf,GAAG,cAAc;AAAA,4BACjB,cAAc;AAAA,4BACd,gBACCK,MAAA,cAAc,mBAAd,gBAAAA,IAA8B,iBAC9B;AAAA,0BAAA;AAAA,wBACF,CACA;AAAA;AAAA,sBAGF,UAAA;AAAA,wBAAA5B,+BAACwB,aAAAA,eACA,EAAA,UAAAxB,2BAAA,IAACyB,aAAY,aAAA,EAAA,aAAY,mBAAmB,CAAA,GAC7C;AAAA,wBACCzB,2BAAA,IAAA0B,aAAA,eAAA,EACC,UAAS,mCAAA,IAAI,CAAC,WACb1B,2BAAAA,IAAA2B,aAAAA,YAAA,EAAwB,OAAO,QAC9B,UADe,OAAA,GAAA,MAEjB,GAEF,CAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACD,GACD;AAAA,gBAEA9B,2BAAAA,KAAC,OAAI,EAAA,WAAU,eACd,UAAA;AAAA,kBAACG,2BAAA,IAAAG,aAAA,OAAA,EAAM,WAAU,WAAU,UAAa,iBAAA;AAAA,kBACxCN,2BAAA;AAAA,oBAAC0B,aAAA;AAAA,oBAAA;AAAA,sBACA,SACC,mBAAc,mBAAd,mBAA8B,iBAAgB;AAAA,sBAE/C,eAAe,CAAC,UACf;;AAAA,2CAAY,cAAc,IAAI;AAAA,0BAC7B,gBAAgB;AAAA,4BACf,GAAG,cAAc;AAAA,4BACjB,gBACCK,MAAA,cAAc,mBAAd,gBAAAA,IAA8B,iBAAgB;AAAA,4BAC/C,cAAc;AAAA,0BAAA;AAAA,wBACf,CACA;AAAA;AAAA,sBAGF,UAAA;AAAA,wBAAC5B,2BAAA,IAAAwB,aAAA,eAAA,EACA,UAACxB,2BAAA,IAAAyB,aAAA,aAAA,CAAY,CAAA,GACd;AAAA,uDACCC,aAAAA,eACC,EAAA,UAAA,eAAe,IAAI,CAAC,SACnB1B,2BAAAA,IAAA2B,aAAA,YAAA,EAA4B,OAAO,KAAK,OACvC,UAAK,KAAA,SADU,KAAK,KAEtB,CACA,EACF,CAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACD,EACD,CAAA;AAAA,cAAA,EACD,CAAA;AAAA,YAAA,GACD;AAAA,YAIA9B,2BAAA,KAAAkC,aAAA,eAAA,EAAc,OAAM,eAAc,WAAU,QAC5C,UAAA;AAAA,cAAC/B,2BAAA,IAAAgC,aAAA,kBAAA,EAAiB,WAAU,iDAAgD,UAE5E,eAAA;AAAA,cACAnC,2BAAAA,KAACoC,aAAAA,kBAAiB,EAAA,WAAU,aAC1B,UAAA;AAAA,gBAAc,cAAA,YAAY,IAAI,CAAC,eAAe;AACxC,wBAAA,UAAU,4BAA4B,WAAW,IAAI;AAE1D,yBAAApC,2BAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEA,WAAU;AAAA,sBAEV,UAAA;AAAA,wBAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,qCACd,UAAA;AAAA,0BAAAG,+BAAC,UAAK,WAAU,uBACd,WAAS,mCAAA,UAAS,WAAW,MAC/B;AAAA,0BACAA,2BAAA;AAAA,4BAACO,aAAA;AAAA,4BAAA;AAAA,8BACA,SAAQ;AAAA,8BACR,MAAK;AAAA,8BACL,WAAU;AAAA,8BACV,SAAS,MAAM,uBAAuB,WAAW,IAAI;AAAA,8BAErD,UAAAP,2BAAAA,IAACe,YAAAA,QAAO,EAAA,WAAU,UAAU,CAAA;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBAC7B,GACD;AAAA,yBACC,mCAAS,oBACT,QAAQ,kBAAkB,oCACxB,OAAI,EAAA,WAAU,cACb,UAAA,MAAM,KAAK,EAAE,QAAQ,QAAQ,gBAAiB,CAAA,EAAE;AAAA,0BAChD,CAAC,GAAG;;AACHf,8DAAA;AAAA,8BAACK,aAAA;AAAA,8BAAA;AAAA,gCAEA,MACC,WAAW,KAAK,SAAS,QAAQ,KACjC,WAAW,KAAK,SAAS,KAAK,KAC9B,WAAW,KAAK,SAAS,KAAK,IAC3B,WACA;AAAA,gCAEJ,eACCuB,MAAA,QAAQ,qBAAR,gBAAAA,IAA2B,OAC3B,OAAO,IAAI,CAAC;AAAA,gCAEb,SAAOU,MAAA,WAAW,gBAAX,gBAAAA,IAAyB,OAAM;AAAA,gCACtC,UAAU,CAAC,MAAM;AAChB,wCAAM,iBAAiB;AAAA,oCACtB,GAAI,WAAW,eAAe,CAAA;AAAA,kCAC/B;AACe,iDAAA,CAAC,IACf,WAAW,KAAK,SAAS,QAAQ,KACjC,WAAW,KAAK,SAAS,KAAK,KAC9B,WAAW,KAAK,SAAS,KAAK,IAC3B,OAAO,EAAE,OAAO,KAAK,IACrB,EAAE,OAAO;AACb;AAAA,oCACC,WAAW;AAAA,oCACX;AAAA,kCACD;AAAA,gCACD;AAAA,gCACA,WAAU;AAAA,8BAAA;AAAA,8BA5BL,GAAG,WAAW,IAAI,eAAe,CAAC;AAAA,4BAAA;AAAA;AAAA,wBA6BxC,EAGH,CAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAtDG,WAAW;AAAA,kBAwDjB;AAAA,gBAAA,CAED;AAAA,gBAEDzC,2BAAAA,KAAC0B,aAAAA,QAAO,EAAA,eAAe,qBACtB,UAAA;AAAA,kBAAAvB,+BAACwB,aAAAA,eACA,EAAA,UAAAxB,2BAAA,IAACyB,aAAY,aAAA,EAAA,aAAY,oBAAoB,CAAA,GAC9C;AAAA,kBACAzB,2BAAAA,IAAC0B,8BACC,UACC,qBAAA;AAAA,oBACA,CAAC,MACA,CAAC,cAAc,YAAY,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;AAAA,kBAAA,EAEtD,IAAI,CAAC,eAAe;AACd,0BAAA,UAAU,4BAA4B,UAAU;AACtD,0DACEC,aAAAA,YAA4B,EAAA,OAAO,YAClC,WAAS,mCAAA,UAAS,cADH,UAEjB;AAAA,kBAAA,CAED,EACH,CAAA;AAAA,gBAAA,EACD,CAAA;AAAA,cAAA,EACD,CAAA;AAAA,YAAA,EACD,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAEF;AAAA,OAGC,6CAAc,sBACd3B,2BAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACA,MAAM;AAAA,UACN,cAAc;AAAA,UACd,eAAe,MAAM,OAAO;AAAA,UAC5B,gBAAgB,cAAc;AAAA,UAC9B,QAAQ,CAAC,WAA2B;AACnC,wBAAY,cAAc,IAAI;AAAA,cAC7B,gBAAgB;AAAA,YAAA,CAChB;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACD,GAEF;AAAA,EAEF;ACroBO,WAAS,aAAa;AAC5B,UAAM,WAAWnB,eAAAA,YAAY;AACvB,UAAA,EAAE,WAAW,IAAI0D,yBAAkC;AACzD,UAAM,EAAE,SAAS,WAAW,MAAA,IAAUjB,MAAAA,SAAS;AAE/C,QAAI,WAAW;AAEb,aAAAtB,+BAAC,SAAI,WAAU,yCACd,yCAACwC,aAAQ,SAAA,EAAA,WAAU,WAAU,EAC9B,CAAA;AAAA,IAAA;AAIF,QAAI,OAAO;AACV,aAAQxC,2BAAAA,IAAA,OAAA,EAAI,WAAU,4BAA2B,UAAqB,yBAAA;AAAA,IAAA;AAGvE,UAAM,cAAc,eAAe;AAGlC,WAAAH,2BAAA,KAAC,OAAI,EAAA,WAAU,wBAEd,UAAA;AAAA,MAACG,2BAAAA,IAAA,OAAA,EAAI,WAAU,gBACd,UAAAH,2BAAA;AAAA,QAACU,aAAA;AAAA,QAAA;AAAA,UACA,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,cAAc,YAAY;AAAA,UACnC,SAAS,MAAM,SAAS,iBAAiB;AAAA,UAEzC,UAAA;AAAA,YAACP,2BAAAA,IAAAqB,YAAA,MAAA,EAAK,WAAU,qBAAqB,CAAA;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,GAGzC;AAAA,MAGCrB,2BAAA,IAAA,OAAA,EAAI,WAAU,0BACb,UAAC,CAAA,WAAW,QAAQ,WAAW,IAC/BH,2BAAAA,KAAC,OAAI,EAAA,WAAU,yCACd,UAAA;AAAA,QAACG,2BAAAA,IAAAyC,YAAA,UAAA,EAAS,WAAU,kCAAkC,CAAA;AAAA,QACrDzC,2BAAA,IAAA,KAAA,EAAE,WAAU,WAAU,UAAc,iBAAA,CAAA;AAAA,MACtC,EAAA,CAAA,mCAEC,OAAI,EAAA,WAAU,QACb,UAAQ,QAAA,IAAI,CAAC,WAAW;AAClB,cAAA,OAAO0C,YAAM,MAAM;AACnB,cAAA,aAAa,eAAe,KAAK;AAEtC,eAAA7C,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEA,MAAK;AAAA,YACL,SAAS,MAAM,SAAS,eAAe,KAAK,GAAG,EAAE;AAAA,YACjD,WAAW,wDACV,aACG,qCACA,+DACJ;AAAA,YAEA,UAAA;AAAA,cAAAG,2BAAA,IAAC,OAAI,EAAA,WAAU,wBAAwB,UAAA,KAAK,OAAM;AAAA,cACjDA,2BAAA,IAAA,OAAA,EAAI,WAAU,yCACb,eAAK,IACP,CAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAZK;AAAA,QAaN;AAAA,MAED,CAAA,EACF,CAAA,EAEF,CAAA;AAAA,IAAA,GACD;AAAA,EAEF;ACnEA,WAAS,qBAAqB,EAAE,WAAoC;AACnE,UAAM,EAAE,OAAO,aAAa,IAAI,iBAAiB;AAGhD,WAAAH,2BAAA,KAAC,OAAI,EAAA,WAAU,aACd,UAAA;AAAA,MAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,qCACd,UAAA;AAAA,QAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,eACd,UAAA;AAAA,UAAAG,2BAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAED;AAAA,UACCA,2BAAA,IAAA,KAAA,EAAE,WAAU,iCAAgC,UAE7C,6CAAA,CAAA;AAAA,QAAA,GACD;AAAA,QACAA,2BAAA;AAAA,UAACoC,aAAA;AAAA,UAAA;AAAA,YACA,IAAG;AAAA,YACH,SAAS,MAAM,OAAO;AAAA,YACtB,iBAAiB,CAAC,YAAY,aAAa,EAAE,YAAY,QAAS,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACnE,GACD;AAAA,MAEAvC,2BAAAA,KAAC,OAAI,EAAA,WAAU,qCACd,UAAA;AAAA,QAACA,2BAAAA,KAAA,OAAA,EAAI,WAAU,eACd,UAAA;AAAA,UAAAG,+BAAC,SAAM,EAAA,SAAQ,QAAO,WAAU,sCAAqC,UAErE,eAAA;AAAA,UACCA,2BAAA,IAAA,KAAA,EAAE,WAAU,iCAAgC,UAE7C,yCAAA,CAAA;AAAA,QAAA,GACD;AAAA,QACAA,2BAAA;AAAA,UAACoC,aAAA;AAAA,UAAA;AAAA,YACA,IAAG;AAAA,YACH,SAAS,MAAM,OAAO;AAAA,YACtB,iBAAiB,CAAC,YAAY,aAAa,EAAE,MAAM,QAAS,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7D,GACD;AAAA,MAEApC,2BAAA,IAAC,OAAI,EAAA,WAAU,yBACd,UAAAA,2BAAAA,IAACO,aAAAA,QAAO,EAAA,SAAQ,WAAU,SAAS,SAAS,UAAA,QAAA,CAE5C,EACD,CAAA;AAAA,IAAA,GACD;AAAA,EAEF;AAKO,WAAS,yBAAyB;AACxC,UAAM,EAAE,YAAY,YAAY,IAAIoC,gBAAU;AAEvC,WAAA;AAAA,MACN,MAAM,MAAM;AACA,mBAAA;AAAA,UACV,OAAO;AAAA,UACP,aACC;AAAA,UACD,MAAM;AAAA,UACN,SAAS3C,2BAAAA,IAAC,sBAAqB,EAAA,SAAS,YAAa,CAAA;AAAA,QAAA,CACrD;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACR;AAAA,EACD;AAUO,WAAS,oBAAoB;AAAA,IACnC;AAAA,IACA;AAAA,EACD,GAA6B;AAC5B,UAAM,gBAAgB,uBAAuB;AAE7ClB,UAAAA,UAAU,MAAM;AACf,UAAI,MAAM;AACT,sBAAc,KAAK;AAAA,MAAA;AAAA,IACpB,GACE,CAAC,MAAM,aAAa,CAAC;AAGxBA,UAAAA,UAAU,MAAM;AAEf,aAAO,MAAM;AACZ,YAAI,MAAM;AACT,uBAAa,KAAK;AAAA,QAAA;AAAA,MAEpB;AAAA,IAAA,GACE,CAAC,MAAM,YAAY,CAAC;AAEhB,WAAA;AAAA,EACR;AC3FA,QAAM,kBAAkBQ,oBAAc,KAAK;AAkB3C,WAAS,6BACR,MACA,UACqB;;AACd,WAAA;AAAA,MACN,QAAQ;AAAA,QACP,MAAM,KAAK,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;AAAA,QACjD,OAAO;AAAA,QACP,cAAY,cAAS,YAAT,mBAAkB,eAAc;AAAA,QAC5C,QAAM,cAAS,YAAT,mBAAkB,SAAQ;AAAA,MACjC;AAAA,MACA,UACC,cAAS,eAAT,mBAAqB,IAAI,CAAC,MAAWD,WAAmB;;AAAA;AAAA,UACvD,IAAI,SAASA,MAAK,IAAI,KAAK,IAAI;AAAA,UAC/B,MAAM,KAAK;AAAA,UACX,eAAauC,MAAA,KAAK,OAAL,gBAAAA,IAAS,UAAS,KAAK;AAAA,UACpC,MAAM,eAAe,IAAI;AAAA,UACzB,QAAQ,KAAK,QAAQ;AAAA,UACrB,MAAM;AAAA,YACL,UAAU,KAAK,YAAY;AAAA,YAC3B,QAAQ,KAAK,UAAU;AAAA,YACvB,MAAM,KAAK,QAAQ;AAAA,YACnB,QAAQ,KAAK,UAAU;AAAA,YACvB,UAAU,KAAK,YAAY;AAAA,UAC5B;AAAA,UACA,IAAI,KAAK,MAAM,CAAC;AAAA,UAChB,cAAc,KAAK,eAAe,CAAA,GAAI,IAAI,CAAC,OAAY;AAAA,YACtD,MAAM,EAAE,QAAQ,EAAE;AAAA,YAClB,aAAa,EAAE;AAAA,UAAA,EACd;AAAA,QACH;AAAA,aAAO,CAAC;AAAA,MACT,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,IACR;AAAA,EACD;AAKA,WAAS,eAAe,MAAgC;;AACjD,UAAA,UAAS,UAAK,OAAL,mBAAS;AACxB,QAAI,WAAW,YAAY,WAAW,WAAmB,QAAA;AACrD,QAAA,WAAW,OAAe,QAAA;AAC1B,QAAA,WAAW,SAAiB,QAAA;AAChC,QAAI,WAAW,YAAY,WAAW,QAAgB,QAAA;AAClD,QAAA,WAAW,eAAuB,QAAA;AAGhC,UAAA,SAAS,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,gBAAgB;AACrE,QAAA,WAAW,SAAiB,QAAA;AAC5B,QAAA,WAAW,UAAkB,QAAA;AAC7B,QAAA,WAAW,OAAe,QAAA;AAEvB,WAAA;AAAA,EACR;AAEO,WAAS,yBAAyB;AAClC,UAAA,EAAE,WAAW,IAAIW,yBAAkC;AACnD,UAAA,cAAc,CAAC,cAAc,eAAe;AAG5C,UAAA;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IAAA,IACGK,MAAAA,UAAU,cAAc,eAAe,QAAQ,aAAa,MAAS;AAErE,QAAA,CAAC,eAAe,WAAW;AAC9B,4CACE,OAAI,EAAA,WAAU,yCACd,UAAA5C,+BAACwC,aAAAA,UAAQ,CAAA,GACV;AAAA,IAAA;AAIE,QAAA,CAAC,eAAe,OAAO;AAEzB,aAAA3C,2BAAA,KAAC,OAAI,EAAA,WAAU,oEACd,UAAA;AAAA,QAACA,2BAAAA,KAAA,MAAA,EAAG,WAAU,uCACb,UAAA;AAAA,UAACG,2BAAAA,IAAAgB,YAAA,aAAA,EAAY,WAAU,UAAU,CAAA;AAAA,UAAE;AAAA,QAAA,GAEpC;AAAA,QACChB,2BAAA,IAAA,KAAA,EAAE,WAAU,gBAAgB,gBAAM,QAAQ,CAAA;AAAA,MAAA,GAC5C;AAAA,IAAA;AAKF,UAAM,eACL,CAAC,eAAe,kBAAkB,cAAc,eAAe,QAC5D,6BAA6B,YAAY,cAAc,IACvD,EAAE,GAAG,uBAAuB,OAAO,KAAK;AAK5C,UAAM,aAAa;AAGlB,WAAAA,2BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QAEA;AAAA,QACA;AAAA,MAAA;AAAA,MAFK,cAAc;AAAA,IAGpB;AAAA,EAEF;AAEA,WAAS,6BAA6B;AAAA,IACrC;AAAA,IACA;AAAA,EACD,GAGG;AACI,UAAA,UAAU,sBAAsB,YAAY;AAElD,WACEA,2BAAA,IAAA,gBAAgB,UAAhB,EAAyB,OAAO,YAChC,UAAAA,2BAAAA,IAAC,qBAAqB,UAArB,EAA8B,OAAO,SACrC,UAACA,2BAAAA,IAAA,mBAAA,CAAkB,CAAA,EACpB,CAAA,GACD;AAAA,EAEF;AAEA,WAAS,oBAAoB;;AAC5B,UAAM,EAAE,OAAO,aAAa,cAAc,cAAA,IAAkB,iBAAiB;AACvE,UAAA,aAAaT,iBAAW,eAAe;AAC7C,UAAM,CAAC,cAAc,eAAe,IAAII,MAAAA,SAAS,KAAK;AACtD,UAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,KAAK;AAEpD,UAAM,eAAe,YAAY;AAEhC;AAAA,QACC;AAAA;AAAA;AAAA;AAAA,EAAwF,aAAa;AAAA,MACtG;AAAA,IACD;AAEA,UAAM,eAIA,CAAC;AACP,QAAI,YAAY;AACf,mBAAa,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,OAAO;AAAA,MAAA,CACP;AAAA,IAAA,WACS,MAAM,SAAS;AACzB,mBAAa,KAAK;AAAA,QACjB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MAAA,CACL;AAAA,IAAA;AAEE,QAAA,CAAC,cAAc,MAAM,WAAW;AACtB,mBAAA,KAAK,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,MAAM;AAAA,IAAA;AAIhE,WAAAE,2BAAA,KAAC,OAAI,EAAA,WAAU,wBACd,UAAA;AAAA,MAAAG,2BAAA;AAAA,QAAC6C,MAAA;AAAA,QAAA;AAAA,UACA,QAAQ,aAAa,SAAS,IAAI,eAAe;AAAA,UACjD,MAAM,aAAaX,YAAAA,OAAOY,YAAA;AAAA,UAC1B,OACC,aACG,MAAM,OAAO,QAAQ,WACrB;AAAA,YACA,OAAO,MAAM,OAAO;AAAA,YACpB,UAAU,CAAC,SAAS,aAAa,EAAE,MAAM;AAAA,YACzC,aAAa;AAAA,YACb,UAAU;AAAA,UACX;AAAA,UAEH,aAAa,UAAQ,WAAM,OAAO,SAAb,mBAAmB,kBAAiB,QAAQ,MAAI,WAAM,OAAO,SAAb,mBAAmB,kBAAiB,QAAQ;AAAA,UACjH,MAAM;AAAA,YACL,OAAO;AAAA,cACN,EAAE,IAAI,WAAW,OAAO,WAAW,MAAMC,YAAAA,YAAY;AAAA,cACrD,EAAE,IAAI,QAAQ,OAAO,QAAQ,MAAMC,YAAAA,SAAS;AAAA,cAC5C,EAAE,IAAI,QAAQ,OAAO,QAAQ,MAAMC,YAAM,MAAA;AAAA,YAC1C;AAAA,YACA,OAAO,MAAM;AAAA,YACb,UAAU;AAAA,UACX;AAAA,UACA,SACC,aAAa,SAEXpD,2BAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,YAAAR,2BAAA;AAAA,cAACO,aAAA;AAAA,cAAA;AAAA,gBACA,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM,eAAe,IAAI;AAAA,gBAClC,OAAM;AAAA,gBAEN,UAAAP,2BAAAA,IAACkD,YAAAA,WAAU,EAAA,WAAU,UAAU,CAAA;AAAA,cAAA;AAAA,YAChC;AAAA,YACAlD,2BAAAA,IAACO,uBAAO,SAAQ,WAAU,MAAK,MAAK,UAAQ,MAAC,UAE7C,cAAA,CAAA;AAAA,YACAV,2BAAA;AAAA,cAACU,aAAA;AAAA,cAAA;AAAA,gBACA,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU,CAAC,MAAM,OAAO;AAAA,gBAExB,UAAA;AAAA,kBAACP,2BAAAA,IAAAmD,YAAA,QAAA,EAAO,WAAU,eAAe,CAAA;AAAA,kBAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAEpC,EACD,CAAA;AAAA,QAAA;AAAA,MAGH;AAAA,MAGC,cACAtD,2BAAA,KAAC,OAAI,EAAA,WAAU,6FACd,UAAA;AAAA,QAACG,2BAAAA,IAAAkC,YAAA,MAAA,EAAK,WAAU,iDAAiD,CAAA;AAAA,QAChElC,2BAAA,IAAA,QAAA,EAAK,WAAU,8CAA6C,UAG7D,6HAAA,CAAA;AAAA,MAAA,GACD;AAAA,MAIDH,2BAAAA,KAAC,OAAI,EAAA,WAAU,mDAEd,UAAA;AAAA,QAAAG,+BAAC,OAAI,EAAA,WAAU,mDACd,UAAAA,+BAAC,aAAW,CAAA,GACb;AAAA,QAGCA,+BAAA,OAAA,EAAI,WAAU,4CACb,gBAAM,aAAa,YAClBA,2BAAA,IAAAoD,MAAA,aAAA,EAAY,WAAU,8BACtB,UAACvD,2BAAAA,KAAA,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,UAAA,CAAC,cACDA,2BAAAA,KAAC,OAAI,EAAA,WAAU,2EACd,UAAA;AAAA,YAACG,2BAAAA,IAAAqD,YAAA,MAAA,EAAK,WAAU,wCAAwC,CAAA;AAAA,YACxDxD,2BAAAA,KAAC,OAAI,EAAA,WAAU,yBACd,UAAA;AAAA,cAACG,2BAAA,IAAA,QAAA,EAAK,WAAU,eAAc,UAAkB,sBAAA;AAAA,cAAQ;AAAA,cAAI;AAAA,YAAA,EAE7D,CAAA;AAAA,UAAA,GACD;AAAA,UAIDA,2BAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACA,YACC,aAAa,SAAY,MAAM,gBAAgB,IAAI;AAAA,cAEpD,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACX,EAAA,CACD,EACD,CAAA;AAAA;AAAA,UAGAA,2BAAAA,IAACoD,qBAAY,WAAU,8BACtB,yCAAC,aAAY,EAAA,MAAM,MAAM,SAAU,CAAA,EACpC,CAAA;AAAA,WAEF;AAAA,uCAGC,OAAI,EAAA,WAAU,qDACd,UAAApD,2BAAA,IAAC,sBAAmB,EACrB,CAAA;AAAA,MAAA,GACD;AAAA,MAGC,CAAC,cAEAH,2BAAAA,KAAAW,WAAA,UAAA,EAAA,UAAA;AAAA,QAAAR,2BAAA,IAAC,gBAAe,EAAA,MAAM,cAAc,cAAc,iBAAiB;AAAA,QACnEA,2BAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACA,MAAM;AAAA,YACN,cAAc;AAAA,UAAA;AAAA,QAAA;AAAA,MACf,EACD,CAAA;AAAA,IAAA,GAEF;AAAA,EAEF;;;;;;;;;;;"}
|