@revisium/schema-toolkit-ui 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +64 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +64 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["React","ChakraTooltip","Portal","Flex","Box","Text","Button","Flex","Box","Text","PiPlusBold","Button","Icon","PiX","Button","Icon","PiCaretLeft","IconButton","PiGear","IconButton","PiCopy","Flex","Box","CodeMirror","EditorView","githubLight","Text","PiTreeViewThin","PiBracketsCurlyThin","PiLinkThin","Menu","Button","Icon","PiCaretDownLight","Portal","observable","createDefaultRegistry","observable","observable","computed","action","observable","override","computed","action","observable","computed","action","override","computed","action","observable","computed","action","observable","computed","action","Flex","Box","PiDotOutlineFill","IconButton","MdOutlineChevronRight","Menu","Box","LuChevronRight","Portal","Fragment","Flex","Icon","PiDotsSixVerticalBold","Text","Box","PiWarningCircle","PiWarning","PiFunction","Flex","Box","PiTextT","Menu","PiTextT","Box","PiCaretRight","Portal","Textarea","Menu","PiFunction","Box","PiCaretRight","Portal","Input","Menu","PiEquals","Box","PiCaretRight","Portal","Input","Menu","Box","PiCaretRight","Portal","Menu","Portal","Box","PiTrash","Flex","Box","Flex","Box","ForeignKeyValue","PiDotOutlineFill","Text","Flex","Box","PiDotOutlineFill","Text","PiPlusLight","PiMinusLight","PiArrowsLeftRightLight","PiPencilSimpleLight","Box","Badge","VStack","Flex","Text","Icon","PiArrowRight","PiWarningCircle","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","SegmentGroup","DialogFooter","IconButton","PiArrowCounterClockwiseBold","Button","DialogCloseTrigger","Flex","Box","Button","observable","computed","action","observable","computed","action","observable","computed","action","NodeFactory","computed","action"],"sources":["../src/components/Tooltip/Tooltip.tsx","../src/components/ContentEditable/ContentEditable.tsx","../src/components/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/schema-editor/types.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/schema-editor/model/node/NodeType.ts","../src/schema-editor/model/node/NodeMetadata.ts","../src/schema-editor/model/node/NullNode.ts","../src/schema-editor/model/node/ObjectNode.ts","../src/schema-editor/model/node/ArrayNode.ts","../src/schema-editor/model/node/StringNode.ts","../src/schema-editor/model/node/NumberNode.ts","../src/schema-editor/model/node/BooleanNode.ts","../src/schema-editor/model/node/RefNode.ts","../src/schema-editor/model/node/NodeFactory.ts","../src/schema-editor/model/path/PathSegment.ts","../src/schema-editor/model/path/Path.ts","../src/schema-editor/model/path/PathParser.ts","../src/schema-editor/model/formula/core/FormulaDependency.ts","../src/schema-editor/model/formula/core/FormulaError.ts","../src/schema-editor/model/formula/parsing/RelativePath.ts","../src/schema-editor/model/formula/parsing/ParsedFormula.ts","../src/schema-editor/model/formula/serialization/RelativePathBuilder.ts","../src/schema-editor/model/formula/serialization/FormulaSerializer.ts","../src/schema-editor/model/formula/store/FormulaDependencyIndex.ts","../src/schema-editor/model/tree/TreeNodeIndex.ts","../src/schema-editor/model/tree/TreeMutator.ts","../src/schema-editor/model/tree/SchemaTree.ts","../src/schema-editor/model/parsing/descriptors/TypeRegistry.ts","../src/schema-editor/model/parsing/descriptors/TypeCapabilities.ts","../src/schema-editor/model/parsing/descriptors/StringDescriptor.ts","../src/schema-editor/model/parsing/descriptors/NumberDescriptor.ts","../src/schema-editor/model/parsing/descriptors/BooleanDescriptor.ts","../src/schema-editor/model/parsing/descriptors/ObjectDescriptor.ts","../src/schema-editor/model/parsing/descriptors/ArrayDescriptor.ts","../src/schema-editor/model/parsing/descriptors/RefDescriptor.ts","../src/schema-editor/model/parsing/descriptors/index.ts","../src/schema-editor/model/schema/SchemaParser.ts","../src/schema-editor/model/schema/SchemaSerializer.ts","../src/schema-editor/model/diff/SchemaComparator.ts","../src/schema-editor/model/diff/index/NodePathIndex.ts","../src/schema-editor/model/diff/changes/ChangeCollector.ts","../src/schema-editor/model/diff/changes/ChangeCoalescer.ts","../src/schema-editor/model/diff/changes/PatchGenerator.ts","../src/schema-editor/model/diff/changes/FormulaChangeDetector.ts","../src/schema-editor/model/diff/enricher/NodeMetadataExtractor.ts","../src/schema-editor/model/diff/enricher/PatchEnricher.ts","../src/schema-editor/model/diff/PatchBuilder.ts","../src/schema-editor/model/diff/SchemaDiff.ts","../src/schema-editor/model/validation/FieldNameValidator.ts","../src/schema-editor/model/validation/SchemaValidator.ts","../src/schema-editor/model/validation/FormulaValidator.ts","../src/schema-editor/model/validation/DefaultValueParser.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/engine/SchemaEngine.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/config/system-schemas.ts","../src/schema-editor/vm/createNodeVM.ts","../src/schema-editor/vm/BaseNodeVM.ts","../src/schema-editor/vm/PrimitiveNodeVM.ts","../src/schema-editor/vm/ArrayNodeVM.ts","../src/schema-editor/vm/ForeignKeyNodeVM.ts","../src/schema-editor/vm/RefNodeVM.ts","../src/schema-editor/vm/SchemaEditorVM.ts","../src/schema-editor/vm/ObjectNodeVM.ts","../src/schema-editor/ui/NodeWrapper/NodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/hooks/useDragAndDrop.ts","../src/schema-editor/ui/FieldEditor/FieldEditor.tsx","../src/schema-editor/ui/NodeIndicators/NodeIndicators.tsx","../src/schema-editor/ui/hooks/useFixZagNestedMenuDismiss.ts","../src/schema-editor/ui/NodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/UsedByFormulasSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/NodeContextMenu.tsx","../src/schema-editor/ui/NodeRightContent/NodeRightContent.tsx","../src/schema-editor/ui/CollapsibleNodeView/CollapsibleNodeView.tsx","../src/schema-editor/ui/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/LeafNodeView/LeafNodeView.tsx","../src/schema-editor/ui/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/NodeView/NodeView.tsx","../src/schema-editor/ui/ChangesPreviewDialog/ChangesPreviewDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.tsx","../src/value-model/node/BaseValueNode.ts","../src/value-model/node/BasePrimitiveValueNode.ts","../src/value-model/core/types.ts","../src/value-model/node/StringValueNode.ts","../src/value-model/node/NumberValueNode.ts","../src/value-model/node/BooleanValueNode.ts","../src/value-model/node/ObjectValueNode.ts","../src/value-model/node/ArrayValueNode.ts","../src/value-model/node/NodeFactory.ts","../src/value-model/core/Path.ts","../src/value-model/tree/TreeIndex.ts","../src/value-model/tree/ChangeTracker.ts","../src/value-model/tree/ValueTree.ts","../src/value-model/formula/FormulaCollector.ts","../src/value-model/formula/DependencyGraph.ts","../src/value-model/formula/FormulaEvaluator.ts","../src/value-model/formula/FormulaEngine.ts","../src/value-model/factory.ts"],"sourcesContent":["import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react';\nimport * as React from 'react';\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) {\n return <>{children}</>;\n }\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, {\n DependencyList,\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { useUpdateEffect } from 'react-use';\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\ninterface ContentEditableBoxProps {\n initValue: string;\n placeholder?: string;\n autoFocus?: boolean;\n onBlur?: () => void;\n onFocus?: () => void;\n onChange?: (value: string) => void;\n onEscape?: () => void;\n onEnter?: () => void;\n focusIfDependencyList?: DependencyList;\n restrict?: RegExp;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport const ContentEditable: React.FC<ContentEditableBoxProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusIfDependencyList,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n\n useEffect(() => {\n if (autoFocus) {\n ref.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && ref.current) {\n const maxPosition = (ref.current.textContent || '').length;\n const position = Math.min(maxPosition, cursorPosition.current);\n\n const range = document.createRange();\n const sel = globalThis.getSelection();\n const firstChild = ref.current.childNodes[0];\n const node: Node = firstChild ?? ref.current;\n range.setStart(node, position);\n range.collapse(true);\n\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n });\n\n useUpdateEffect(() => {\n if (focusIfDependencyList) {\n ref.current?.focus();\n const selection = globalThis.getSelection();\n\n if (ref.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(ref.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [...(focusIfDependencyList ?? [])]);\n\n const handleChange: React.FormEventHandler<HTMLDivElement> = useCallback(\n (event) => {\n const selection = globalThis.getSelection();\n if (selection && selection.rangeCount > 0) {\n cursorPosition.current = selection.getRangeAt(0).startOffset;\n }\n\n const textValue = event.currentTarget.innerText;\n onChange?.(textValue === '\\n' ? '' : textValue);\n },\n [onChange],\n );\n\n const handleBlur: React.FormEventHandler<HTMLDivElement> = useCallback(() => {\n onBlur?.();\n cursorPosition.current = null;\n }, [onBlur]);\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = useCallback(\n (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (initValue) {\n ref.current?.blur();\n onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n if (initValue) {\n ref.current?.blur();\n }\n onEscape?.();\n }\n\n if (restrict && !allowed.has(event.key) && !restrict.test(event.key)) {\n event.preventDefault();\n }\n },\n [initValue, onEnter, onEscape, restrict],\n );\n\n const handleParentClick = useCallback(() => {\n ref.current?.focus();\n }, []);\n\n const showPlaceholder = !initValue && placeholder;\n\n return (\n <Flex\n minWidth={0}\n width={showPlaceholder ? '100%' : undefined}\n position=\"relative\"\n onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={ref}\n contentEditable\n spellCheck={'false'}\n dangerouslySetInnerHTML={{ __html: escapeHtml(initValue) }}\n outline={0}\n width=\"100%\"\n onBlur={handleBlur}\n onFocus={onFocus}\n onInput={handleChange}\n onKeyDown={handleKeyDown}\n ></Box>\n {!showPlaceholder && postfix}\n {showPlaceholder && (\n <Text\n cursor=\"text\"\n userSelect=\"none\"\n pointerEvents=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n position=\"absolute\"\n >\n {placeholder}\n </Text>\n )}\n </Flex>\n );\n};\n","import { Box, Button, Flex, Text } from '@chakra-ui/react';\nimport React from 'react';\n\ninterface GrayButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n isLoading?: boolean;\n icon?: React.ReactNode;\n height?: string;\n dataTestId?: string;\n}\n\nexport const GrayButton: React.FC<GrayButtonProps> = ({\n height = '2.5rem',\n title,\n onClick,\n disabled,\n isSelected,\n isLoading,\n icon,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n _hover={{ color: 'gray.400', backgroundColor: 'white' }}\n _disabled={\n isSelected\n ? { backgroundColor: 'gray.50', cursor: 'not-allowed' }\n : undefined\n }\n alignSelf=\"flex-start\"\n color=\"gray.300\"\n fontWeight=\"500\"\n fontSize={16}\n height={height}\n disabled={disabled || isSelected}\n loading={isLoading}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Flex alignItems=\"center\" gap=\"0.5rem\">\n {icon && <Box fontSize=\"sm\">{icon}</Box>}\n <Text>{title}</Text>\n </Flex>\n </Button>\n );\n};\n","import React from 'react';\nimport { PiPlusBold } from 'react-icons/pi';\nimport { GrayButton } from '../GrayButton/GrayButton';\n\ninterface CreateButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CreateButton: React.FC<CreateButtonProps> = (props) => {\n return <GrayButton {...props} icon={<PiPlusBold />} />;\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiX } from 'react-icons/pi';\n\ninterface CloseButtonProps {\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CloseButton: React.FC<CloseButtonProps> = ({\n height = '2.5rem',\n onClick,\n disabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={disabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n color=\"gray.400\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n width=\"48px\"\n >\n <Icon size=\"md\">\n <PiX />\n </Icon>\n </Button>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiCaretLeft } from 'react-icons/pi';\n\ninterface BackButtonProps {\n onClick?: () => void;\n isDisabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({\n height = '2.5rem',\n onClick,\n isDisabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={isDisabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Icon boxSize={4} color=\"gray.500\">\n <PiCaretLeft />\n </Icon>\n </Button>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiGear } from 'react-icons/pi';\n\ninterface SettingsButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const SettingsButton: FC<SettingsButtonProps> = ({\n dataTestId,\n ...props\n}) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.50' }}\n color=\"gray.400\"\n variant=\"ghost\"\n size=\"sm\"\n {...props}\n >\n <PiGear />\n </IconButton>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCopy } from 'react-icons/pi';\n\ninterface CopyButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const CopyButton: FC<CopyButtonProps> = ({ dataTestId, ...props }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.100' }}\n color=\"gray.400\"\n variant=\"ghost\"\n {...props}\n >\n <PiCopy />\n </IconButton>\n );\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton/CopyButton';\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ninterface JsonCardProps {\n data: JsonValue;\n readonly?: boolean;\n onChange?: (data: JsonValue) => void;\n onBlur?: () => void;\n onCopy?: () => void;\n}\n\nexport const JsonCard: React.FC<JsonCardProps> = ({\n data,\n readonly,\n onChange,\n onBlur,\n onCopy,\n}) => {\n const [error, setError] = useState('');\n const externalText = JSON.stringify(data, null, 3);\n const [internalText, setInternalText] = useState(externalText);\n const isFocusedRef = useRef(false);\n\n const displayText = isFocusedRef.current ? internalText : externalText;\n\n const handleClick = useCallback(() => {\n void navigator.clipboard.writeText(displayText).then(() => {\n onCopy?.();\n });\n }, [displayText, onCopy]);\n\n const handleChange = useCallback(\n (value: string) => {\n setInternalText(value);\n\n try {\n const parsedData = JSON.parse(value) as JsonValue;\n setError('');\n onChange?.(parsedData);\n } catch (e) {\n console.error(e);\n setError('Invalid JSON');\n }\n },\n [onChange],\n );\n\n const handleFocus = useCallback(() => {\n isFocusedRef.current = true;\n setInternalText(externalText);\n }, [externalText]);\n\n const handleBlur = useCallback(() => {\n isFocusedRef.current = false;\n setInternalText(externalText);\n onBlur?.();\n }, [onBlur, externalText]);\n\n const hoverStyles = {\n '&:hover .copy-button': { visibility: 'visible' as const },\n };\n\n return (\n <Flex\n position=\"relative\"\n width=\"100%\"\n flex={1}\n direction=\"column\"\n gap=\"1rem\"\n css={hoverStyles}\n >\n <Box p={1} flex={1}>\n <CodeMirror\n value={displayText}\n extensions={[EditorView.lineWrapping, json()]}\n editable={!readonly}\n theme={githubLight}\n maxWidth=\"100%\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <CopyButton\n dataTestId=\"json-card-copy-button\"\n aria-label=\"\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n className=\"copy-button\"\n visibility=\"hidden\"\n onClick={handleClick}\n />\n </Box>\n <Flex\n height=\"40px\"\n paddingBottom=\"8px\"\n alignItems=\"flex-end\"\n backgroundColor=\"white\"\n width=\"100%\"\n position=\"sticky\"\n bottom={0}\n justifyContent=\"center\"\n >\n <Text color=\"gray\">{error}</Text>\n </Flex>\n </Flex>\n );\n};\n","export type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport enum JsonSchemaTypeName {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Object = 'object',\n Array = 'array',\n}\n\nexport type JsonPatch =\n | { op: 'add'; path: string; value: JsonValue }\n | { op: 'remove'; path: string }\n | { op: 'replace'; path: string; value: JsonValue }\n | { op: 'move'; from: string; path: string }\n | { op: 'copy'; from: string; path: string }\n | { op: 'test'; path: string; value: JsonValue };\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n\nexport enum SystemSchemaIds {\n RowId = 'urn:jsonschema:io:revisium:row-id-schema:1.0.0',\n RowCreatedId = 'urn:jsonschema:io:revisium:row-created-id-schema:1.0.0',\n RowVersionId = 'urn:jsonschema:io:revisium:row-version-id-schema:1.0.0',\n RowCreatedAt = 'urn:jsonschema:io:revisium:row-created-at-schema:1.0.0',\n RowPublishedAt = 'urn:jsonschema:io:revisium:row-published-at-schema:1.0.0',\n RowUpdatedAt = 'urn:jsonschema:io:revisium:row-updated-at-schema:1.0.0',\n RowHash = 'urn:jsonschema:io:revisium:row-hash-schema:1.0.0',\n RowSchemaHash = 'urn:jsonschema:io:revisium:row-schema-hash-schema:1.0.0',\n File = 'urn:jsonschema:io:revisium:file-schema:1.0.0',\n}\n\nexport const getLabelByRef = (ref: string): string => {\n const refMap: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\n [SystemSchemaIds.RowCreatedAt]: 'createdAt',\n [SystemSchemaIds.RowPublishedAt]: 'publishedAt',\n [SystemSchemaIds.RowUpdatedAt]: 'updatedAt',\n [SystemSchemaIds.RowHash]: 'hash',\n [SystemSchemaIds.RowSchemaHash]: 'schemaHash',\n [SystemSchemaIds.File]: 'File',\n };\n return refMap[ref] ?? ref;\n};\n","import { Button, Icon, Menu, Portal } from '@chakra-ui/react';\nimport React, { useMemo, useState } from 'react';\nimport {\n PiBracketsCurlyThin,\n PiCaretDownLight,\n PiLinkThin,\n PiTreeViewThin,\n} from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { ViewerSwitcherMode } from '../../schema-editor/types';\n\nconst modes: {\n mode: ViewerSwitcherMode;\n label: string;\n icon: React.ReactNode;\n dataTestId?: string;\n}[] = [\n {\n mode: ViewerSwitcherMode.Tree,\n label: 'Tree',\n icon: <PiTreeViewThin />,\n dataTestId: 'row-editor-mode-tree',\n },\n {\n mode: ViewerSwitcherMode.Json,\n label: 'JSON',\n icon: <PiBracketsCurlyThin />,\n dataTestId: 'row-editor-mode-json',\n },\n {\n mode: ViewerSwitcherMode.RefBy,\n label: 'References',\n icon: <PiLinkThin />,\n dataTestId: 'row-editor-mode-refs',\n },\n];\n\ninterface ViewerSwitcherProps {\n mode: ViewerSwitcherMode;\n availableRefByMode?: boolean;\n onChange?: (mode: ViewerSwitcherMode) => void;\n}\n\nexport const ViewerSwitcher: React.FC<ViewerSwitcherProps> = ({\n mode,\n onChange,\n availableRefByMode,\n}) => {\n const [menuOpen, setMenuOpen] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const currentModes = useMemo(\n () =>\n modes.filter(\n (item) =>\n !(item.mode === ViewerSwitcherMode.RefBy && !availableRefByMode),\n ),\n [availableRefByMode],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentMode = modes.find((m) => m.mode === mode) ?? modes[0]!;\n\n const handleValueChange = (details: { value: string }) => {\n const selectedMode = modes.find(\n (m) => m.mode === (details.value as ViewerSwitcherMode),\n );\n if (selectedMode) {\n onChange?.(selectedMode.mode);\n }\n };\n\n return (\n <Menu.Root onOpenChange={({ open }) => setMenuOpen(open)}>\n <Menu.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n height=\"2.5rem\"\n color=\"gray.500\"\n _hover={{ backgroundColor: 'gray.50', '& .caret': { opacity: 1 } }}\n _focus={{ outline: 'none', boxShadow: 'none' }}\n _focusVisible={{ outline: 'none', boxShadow: 'none' }}\n data-testid=\"view-mode-switcher\"\n px=\"8px\"\n gap=\"2px\"\n >\n <Tooltip\n open={!menuOpen && tooltipOpen}\n onOpenChange={(details) => setTooltipOpen(details.open)}\n content=\"View mode\"\n openDelay={500}\n closeDelay={0}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <Icon boxSize={4}>{currentMode.icon}</Icon>\n <Icon\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n >\n <PiCaretDownLight />\n </Icon>\n </span>\n </Tooltip>\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minWidth=\"140px\">\n <Menu.RadioItemGroup value={mode} onValueChange={handleValueChange}>\n {currentModes.map((item) => (\n <Menu.RadioItem\n key={item.mode}\n value={item.mode}\n data-testid={item.dataTestId}\n cursor=\"pointer\"\n >\n <Menu.ItemIndicator />\n <Icon boxSize={4} mr=\"8px\">\n {item.icon}\n </Icon>\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","export enum NodeType {\n Object = 'object',\n Array = 'array',\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Ref = 'ref',\n}\n","export interface NodeMetadata {\n title?: string;\n description?: string;\n deprecated?: boolean;\n}\n\nexport const EMPTY_METADATA: NodeMetadata = {};\n","import type { SchemaNode } from './SchemaNode';\nimport type { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\n\nclass NullNodeImpl implements SchemaNode {\n id(): string {\n return '';\n }\n\n name(): string {\n throw new Error('Null node has no name');\n }\n\n nodeType(): NodeType {\n throw new Error('Null node has no type');\n }\n\n metadata(): NodeMetadata {\n return EMPTY_METADATA;\n }\n\n property(): SchemaNode {\n return this;\n }\n\n items(): SchemaNode {\n return this;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return true;\n }\n\n ref(): string {\n throw new Error('Null node has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(): void {\n throw new Error('Cannot modify null node');\n }\n\n setMetadata(): void {\n throw new Error('Cannot modify null node');\n }\n\n addProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n removeProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n removePropertyById(): void {\n throw new Error('Cannot modify null node');\n }\n\n replaceProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n setItems(): void {\n throw new Error('Cannot modify null node');\n }\n\n setFormula(): void {\n throw new Error('Cannot modify null node');\n }\n\n setDefaultValue(): void {\n throw new Error('Cannot modify null node');\n }\n\n clone(): SchemaNode {\n return this;\n }\n}\n\nexport const NULL_NODE: SchemaNode = new NullNodeImpl();\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class ObjectNode implements SchemaNode {\n private _name: string;\n private _children: SchemaNode[];\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n children: SchemaNode[] = [],\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('ObjectNode requires nodeId');\n }\n this._name = name;\n this._children = children;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Object;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n property(name: string): SchemaNode {\n for (const prop of this._children) {\n if (prop.name() === name) {\n return prop;\n }\n }\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return this._children;\n }\n\n isObject(): boolean {\n return true;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('ObjectNode has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n addProperty(node: SchemaNode): void {\n this._children.push(node);\n }\n\n removeProperty(name: string): void {\n const index = this._children.findIndex((c) => c.name() === name);\n if (index >= 0) {\n this._children.splice(index, 1);\n }\n }\n\n removePropertyById(id: string): void {\n const index = this._children.findIndex((c) => c.id() === id);\n if (index >= 0) {\n this._children.splice(index, 1);\n }\n }\n\n replaceProperty(name: string, node: SchemaNode): void {\n const index = this._children.findIndex((c) => c.name() === name);\n if (index >= 0) {\n this._children[index] = node;\n }\n }\n\n setItems(): void {\n // No-op for ObjectNode\n }\n\n setFormula(): void {\n // No-op for ObjectNode\n }\n\n setDefaultValue(): void {\n // No-op for ObjectNode\n }\n\n setChildren(children: SchemaNode[]): void {\n this._children = children;\n }\n\n clone(): ObjectNode {\n const clonedChildren = this._children.map((child) => child.clone());\n return new ObjectNode(this._id, this._name, clonedChildren, {\n ...this._metadata,\n });\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class ArrayNode implements SchemaNode {\n private _name: string;\n private _items: SchemaNode;\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n items: SchemaNode,\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('ArrayNode requires nodeId');\n }\n this._name = name;\n this._items = items;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Array;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return this._items;\n }\n\n properties(): readonly SchemaNode[] {\n return [this._items];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return true;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('ArrayNode has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n addProperty(): void {\n // No-op for ArrayNode\n }\n\n removeProperty(): void {\n // No-op for ArrayNode\n }\n\n removePropertyById(): void {\n // No-op for ArrayNode\n }\n\n replaceProperty(): void {\n // No-op for ArrayNode\n }\n\n setItems(node: SchemaNode): void {\n this._items = node;\n }\n\n setFormula(): void {\n // No-op for ArrayNode\n }\n\n setDefaultValue(): void {\n // No-op for ArrayNode\n }\n\n clone(): ArrayNode {\n return new ArrayNode(this._id, this._name, this._items.clone(), {\n ...this._metadata,\n });\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport type StringFormat = 'date-time' | 'date' | 'time' | 'email' | 'regex';\n\nexport type ContentMediaType =\n | 'text/plain'\n | 'text/markdown'\n | 'text/html'\n | 'application/json'\n | 'application/schema+json'\n | 'application/yaml';\n\nexport interface StringNodeOptions {\n defaultValue?: string;\n foreignKey?: string;\n format?: StringFormat;\n contentMediaType?: ContentMediaType;\n enumValues?: string[];\n formula?: Formula;\n}\n\nexport class StringNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: string | undefined;\n private _foreignKey: string | undefined;\n private _format: StringFormat | undefined;\n private _contentMediaType: ContentMediaType | undefined;\n private _enumValues: string[] | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: StringNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('StringNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._foreignKey = options.foreignKey;\n this._format = options.format;\n this._contentMediaType = options.contentMediaType;\n this._enumValues = options.enumValues;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.String;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): string | undefined {\n return this._defaultValue;\n }\n\n foreignKey(): string | undefined {\n return this._foreignKey;\n }\n\n format(): StringFormat | undefined {\n return this._format;\n }\n\n contentMediaType(): ContentMediaType | undefined {\n return this._contentMediaType;\n }\n\n enumValues(): string[] | undefined {\n return this._enumValues;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('StringNode has no ref');\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: string | undefined): void {\n this._defaultValue = value;\n }\n\n setForeignKey(value: string | undefined): void {\n this._foreignKey = value;\n }\n\n setFormat(value: StringFormat | undefined): void {\n this._format = value;\n }\n\n setContentMediaType(value: ContentMediaType | undefined): void {\n this._contentMediaType = value;\n }\n\n setEnumValues(values: string[] | undefined): void {\n this._enumValues = values;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for StringNode\n }\n\n removeProperty(): void {\n // No-op for StringNode\n }\n\n removePropertyById(): void {\n // No-op for StringNode\n }\n\n replaceProperty(): void {\n // No-op for StringNode\n }\n\n setItems(): void {\n // No-op for StringNode\n }\n\n clone(): StringNode {\n return new StringNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n foreignKey: this._foreignKey,\n format: this._format,\n contentMediaType: this._contentMediaType,\n enumValues: this._enumValues ? [...this._enumValues] : undefined,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport interface NumberNodeOptions {\n defaultValue?: number;\n formula?: Formula;\n}\n\nexport class NumberNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: number | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: NumberNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('NumberNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Number;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): number | undefined {\n return this._defaultValue;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('NumberNode has no ref');\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: number | undefined): void {\n this._defaultValue = value;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for NumberNode\n }\n\n removeProperty(): void {\n // No-op for NumberNode\n }\n\n removePropertyById(): void {\n // No-op for NumberNode\n }\n\n replaceProperty(): void {\n // No-op for NumberNode\n }\n\n setItems(): void {\n // No-op for NumberNode\n }\n\n clone(): NumberNode {\n return new NumberNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport interface BooleanNodeOptions {\n defaultValue?: boolean;\n formula?: Formula;\n}\n\nexport class BooleanNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: boolean | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: BooleanNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('BooleanNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Boolean;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): boolean | undefined {\n return this._defaultValue;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('BooleanNode has no ref');\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: boolean | undefined): void {\n this._defaultValue = value;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for BooleanNode\n }\n\n removeProperty(): void {\n // No-op for BooleanNode\n }\n\n removePropertyById(): void {\n // No-op for BooleanNode\n }\n\n replaceProperty(): void {\n // No-op for BooleanNode\n }\n\n setItems(): void {\n // No-op for BooleanNode\n }\n\n clone(): BooleanNode {\n return new BooleanNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class RefNode implements SchemaNode {\n private _name: string;\n private _ref: string;\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n ref: string,\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('RefNode requires nodeId');\n }\n if (!ref) {\n throw new Error('RefNode requires ref');\n }\n this._name = name;\n this._ref = ref;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Ref;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n ref(): string {\n return this._ref;\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return true;\n }\n\n isNull(): boolean {\n return false;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setRef(ref: string): void {\n this._ref = ref;\n }\n\n addProperty(): void {\n // No-op for RefNode\n }\n\n removeProperty(): void {\n // No-op for RefNode\n }\n\n removePropertyById(): void {\n // No-op for RefNode\n }\n\n replaceProperty(): void {\n // No-op for RefNode\n }\n\n setItems(): void {\n // No-op for RefNode\n }\n\n setFormula(): void {\n // No-op for RefNode\n }\n\n setDefaultValue(): void {\n // No-op for RefNode\n }\n\n clone(): RefNode {\n return new RefNode(this._id, this._name, this._ref, { ...this._metadata });\n }\n}\n","import { nanoid } from 'nanoid';\nimport { StringNode, type ContentMediaType } from './StringNode';\nimport { NumberNode } from './NumberNode';\nimport { BooleanNode } from './BooleanNode';\nimport { ObjectNode } from './ObjectNode';\nimport { ArrayNode } from './ArrayNode';\nimport { RefNode } from './RefNode';\nimport type { SchemaNode } from './SchemaNode';\n\nexport interface StringNodeFactoryOptions {\n foreignKey?: string;\n contentMediaType?: ContentMediaType;\n}\n\nexport interface RefNodeOptions {\n $ref: string;\n}\n\nexport class NodeFactory {\n static string(name: string, options?: StringNodeFactoryOptions): StringNode {\n const node = new StringNode(nanoid(), name);\n if (options?.foreignKey !== undefined) {\n node.setForeignKey(options.foreignKey);\n }\n if (options?.contentMediaType !== undefined) {\n node.setContentMediaType(options.contentMediaType);\n }\n return node;\n }\n\n static number(name: string): NumberNode {\n return new NumberNode(nanoid(), name);\n }\n\n static boolean(name: string): BooleanNode {\n return new BooleanNode(nanoid(), name);\n }\n\n static object(name: string, children: SchemaNode[] = []): ObjectNode {\n return new ObjectNode(nanoid(), name, children);\n }\n\n static array(name: string, items: SchemaNode): ArrayNode {\n return new ArrayNode(nanoid(), name, items);\n }\n\n static ref(name: string, options: RefNodeOptions): RefNode {\n return new RefNode(nanoid(), name, options.$ref);\n }\n}\n","import type { PathSegment } from './types';\n\nexport class PropertySegment implements PathSegment {\n constructor(private readonly name: string) {}\n\n isProperty(): boolean {\n return true;\n }\n\n isItems(): boolean {\n return false;\n }\n\n propertyName(): string {\n return this.name;\n }\n\n equals(other: PathSegment): boolean {\n return other.isProperty() && other.propertyName() === this.name;\n }\n}\n\nexport class ItemsSegment implements PathSegment {\n isProperty(): boolean {\n return false;\n }\n\n isItems(): boolean {\n return true;\n }\n\n propertyName(): string {\n throw new Error('Items segment has no property name');\n }\n\n equals(other: PathSegment): boolean {\n return other.isItems();\n }\n}\n","import type { Path, PathSegment } from './types';\nimport { PropertySegment, ItemsSegment } from './PathSegment';\n\nclass PathImpl implements Path {\n constructor(private readonly segs: readonly PathSegment[]) {}\n\n segments(): readonly PathSegment[] {\n return this.segs;\n }\n\n asJsonPointer(): string {\n return this.segs\n .map((seg) =>\n seg.isProperty() ? `/properties/${seg.propertyName()}` : '/items',\n )\n .join('');\n }\n\n asSimple(): string {\n const parts: string[] = [];\n\n for (const seg of this.segs) {\n if (seg.isProperty()) {\n parts.push(seg.propertyName());\n } else if (seg.isItems() && parts.length > 0) {\n parts[parts.length - 1] += '[*]';\n }\n }\n\n return parts.join('.');\n }\n\n parent(): Path {\n if (this.segs.length <= 1) {\n return EMPTY_PATH;\n }\n return new PathImpl(this.segs.slice(0, -1));\n }\n\n child(name: string): Path {\n return new PathImpl([...this.segs, new PropertySegment(name)]);\n }\n\n childItems(): Path {\n return new PathImpl([...this.segs, new ItemsSegment()]);\n }\n\n equals(other: Path): boolean {\n const otherSegs = other.segments();\n if (this.segs.length !== otherSegs.length) {\n return false;\n }\n for (let i = 0; i < this.segs.length; i++) {\n const a = this.segs[i];\n const b = otherSegs[i];\n if (!a || !b || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n isEmpty(): boolean {\n return this.segs.length === 0;\n }\n\n length(): number {\n return this.segs.length;\n }\n\n isChildOf(parent: Path): boolean {\n const parentSegs = parent.segments();\n if (this.segs.length <= parentSegs.length) {\n return false;\n }\n for (let i = 0; i < parentSegs.length; i++) {\n const a = this.segs[i];\n const b = parentSegs[i];\n if (!a || !b || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport const EMPTY_PATH: Path = new PathImpl([]);\n\nexport function createPath(segments: readonly PathSegment[]): Path {\n return segments.length === 0 ? EMPTY_PATH : new PathImpl(segments);\n}\n","import type { Path, PathSegment } from './types';\nimport { createPath } from './Path';\nimport { PropertySegment, ItemsSegment } from './PathSegment';\n\nexport function jsonPointerToSegments(pointer: string): PathSegment[] {\n if (pointer === '' || pointer === '/') {\n return [];\n }\n\n const parts = pointer.split('/').filter(Boolean);\n const segments: PathSegment[] = [];\n\n let i = 0;\n while (i < parts.length) {\n const part = parts[i];\n if (part === 'properties') {\n if (i + 1 < parts.length) {\n const name = parts[i + 1];\n if (name !== undefined) {\n segments.push(new PropertySegment(name));\n }\n i += 2;\n } else {\n i += 1;\n }\n } else if (part === 'items') {\n segments.push(new ItemsSegment());\n i += 1;\n } else {\n throw new Error(`Invalid path segment: ${part} in path ${pointer}`);\n }\n }\n\n return segments;\n}\n\nexport function jsonPointerToPath(pointer: string): Path {\n return createPath(jsonPointerToSegments(pointer));\n}\n\nexport function jsonPointerToSimplePath(pointer: string): string {\n return jsonPointerToPath(pointer).asSimple();\n}\n","export interface FormulaDependency {\n targetNodeId(): string;\n}\n\nexport class ResolvedDependency implements FormulaDependency {\n constructor(private readonly nodeId: string) {\n if (!nodeId) {\n throw new Error('FormulaDependency requires targetNodeId');\n }\n }\n\n targetNodeId(): string {\n return this.nodeId;\n }\n}\n","export class FormulaError extends Error {\n constructor(\n message: string,\n private readonly nodeId: string,\n private readonly details?: string,\n ) {\n super(message);\n this.name = 'FormulaError';\n }\n\n formulaNodeId(): string {\n return this.nodeId;\n }\n\n errorDetails(): string | undefined {\n return this.details;\n }\n}\n","import { parseFormula, type ASTNode } from '@revisium/formula';\nimport type { Path } from '../../path';\nimport { EMPTY_PATH } from '../../path';\n\nconst ARRAY_NOTATION_REGEX = /^([^[]+)\\[(?:\\d+|\\*)?\\]$/;\n\nexport class RelativePath {\n constructor(\n private readonly basePath: Path,\n private readonly relativePath: string,\n ) {}\n\n resolve(): Path | null {\n let ast: ASTNode;\n try {\n const parseResult = parseFormula(this.relativePath);\n ast = parseResult.ast;\n } catch {\n return null;\n }\n\n return this.astToPath(ast, this.basePath);\n }\n\n private astToPath(ast: ASTNode, base: Path): Path | null {\n switch (ast.type) {\n case 'Identifier':\n return base.child(ast.name);\n\n case 'MemberExpression': {\n const objectPath = this.astToPath(ast.object, base);\n if (!objectPath) {\n return null;\n }\n return objectPath.child(ast.property);\n }\n\n case 'IndexExpression':\n case 'WildcardExpression': {\n const objectPath = this.astToPath(ast.object, base);\n if (!objectPath) {\n return null;\n }\n return objectPath.childItems();\n }\n\n case 'RelativePath':\n return this.resolveRelativePathString(base, ast.path);\n\n case 'RootPath':\n return this.resolveRootPath(ast.path);\n\n default:\n return null;\n }\n }\n\n private resolveRelativePathString(base: Path, path: string): Path | null {\n const parts = path.split('/');\n let result = base;\n\n for (const part of parts) {\n if (part === '..') {\n if (result.isEmpty()) {\n return null;\n }\n result = result.parent();\n } else if (part === '.') {\n continue;\n } else if (part) {\n result = result.child(part);\n }\n }\n\n return result;\n }\n\n private resolveRootPath(rootPath: string): Path | null {\n const path = rootPath.startsWith('/') ? rootPath.slice(1) : rootPath;\n if (!path) {\n return EMPTY_PATH;\n }\n\n try {\n return this.parseFormulaPath(path);\n } catch {\n return null;\n }\n }\n\n private parseFormulaPath(formulaPath: string): Path {\n const parts = formulaPath.split('.');\n let result: Path = EMPTY_PATH;\n\n for (const part of parts) {\n if (!part) {\n throw new Error(`Invalid path: empty segment`);\n }\n\n const match = ARRAY_NOTATION_REGEX.exec(part);\n if (match?.[1]) {\n result = result.child(match[1]).childItems();\n } else {\n result = result.child(part);\n }\n }\n\n return result;\n }\n}\n","import { parseFormula, type ASTNode } from '@revisium/formula';\nimport type { Formula } from '../core/Formula';\nimport type { FormulaDependency } from '../core/FormulaDependency';\nimport { ResolvedDependency } from '../core/FormulaDependency';\nimport { FormulaError } from '../core/FormulaError';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport type { Path } from '../../path';\nimport { RelativePath } from './RelativePath';\n\nexport class ParsedFormula implements Formula {\n private readonly astNode: ASTNode;\n private readonly deps: readonly FormulaDependency[];\n private readonly astPathToNodeId: ReadonlyMap<string, string>;\n\n constructor(tree: NodeTree, formulaNodeId: string, expression: string) {\n const parseResult = parseFormula(expression);\n this.astNode = parseResult.ast;\n\n const formulaPath = tree.pathOf(formulaNodeId);\n if (formulaPath.isEmpty() && tree.root().id() !== formulaNodeId) {\n throw new FormulaError('Formula node not found in tree', formulaNodeId);\n }\n\n const deps: FormulaDependency[] = [];\n const astPathToNodeId = new Map<string, string>();\n\n for (const depPath of parseResult.dependencies) {\n const targetNodeId = this.resolveDependencyPath(\n tree,\n formulaPath,\n depPath,\n );\n if (!targetNodeId) {\n throw new FormulaError(\n `Cannot resolve formula dependency: ${depPath}`,\n formulaNodeId,\n 'Path not found in schema',\n );\n }\n if (targetNodeId === formulaNodeId) {\n throw new FormulaError(\n 'Formula cannot reference itself',\n formulaNodeId,\n 'Self-reference detected',\n );\n }\n deps.push(new ResolvedDependency(targetNodeId));\n astPathToNodeId.set(depPath, targetNodeId);\n }\n\n this.deps = deps;\n this.astPathToNodeId = astPathToNodeId;\n }\n\n version(): number {\n return 1;\n }\n\n ast(): ASTNode {\n return this.astNode;\n }\n\n dependencies(): readonly FormulaDependency[] {\n return this.deps;\n }\n\n getNodeIdForAstPath(astPath: string): string | null {\n return this.astPathToNodeId.get(astPath) ?? null;\n }\n\n astPaths(): readonly string[] {\n return Array.from(this.astPathToNodeId.keys());\n }\n\n private resolveDependencyPath(\n tree: NodeTree,\n formulaPath: Path,\n depPath: string,\n ): string | null {\n const basePath = this.getFormulaBasePath(formulaPath);\n const relativePath = new RelativePath(basePath, depPath);\n const targetPath = relativePath.resolve();\n\n if (!targetPath) {\n return null;\n }\n\n const targetNode = tree.nodeAt(targetPath);\n if (targetNode.isNull()) {\n return null;\n }\n\n return targetNode.id();\n }\n\n private getFormulaBasePath(formulaPath: Path): Path {\n let basePath = formulaPath;\n\n while (!basePath.isEmpty()) {\n const segs = basePath.segments();\n const lastSeg = segs[segs.length - 1];\n basePath = basePath.parent();\n if (!lastSeg?.isItems()) {\n break;\n }\n }\n\n return basePath;\n }\n}\n","import type { Path, PathSegment } from '../../path';\n\nexport class RelativePathBuilder {\n public buildWithArrayNotation(fromPath: Path, toPath: Path): string {\n const fromSegments = fromPath.parent().segments();\n const toSegments = toPath.segments();\n\n const commonLength = this.findCommonPrefixLength(fromSegments, toSegments);\n const upCount = fromSegments.length - commonLength;\n\n const parts = this.buildPartsWithArrayNotation(\n upCount,\n toSegments,\n commonLength,\n );\n\n return this.formatPartsWithArrayNotation(parts, toSegments);\n }\n\n private findCommonPrefixLength(\n fromSegments: readonly PathSegment[],\n toSegments: readonly PathSegment[],\n ): number {\n const minLen = Math.min(fromSegments.length, toSegments.length);\n let commonPrefixLen = 0;\n\n for (let i = 0; i < minLen; i++) {\n const fromSeg = fromSegments[i];\n const toSeg = toSegments[i];\n\n if (!fromSeg || !toSeg) {\n break;\n }\n\n if (fromSeg.isItems() && toSeg.isItems()) {\n commonPrefixLen++;\n } else if (\n fromSeg.isProperty() &&\n toSeg.isProperty() &&\n fromSeg.propertyName() === toSeg.propertyName()\n ) {\n commonPrefixLen++;\n } else {\n break;\n }\n }\n\n return commonPrefixLen;\n }\n\n private buildPartsWithArrayNotation(\n upCount: number,\n toSegments: readonly PathSegment[],\n startIndex: number,\n ): string[] {\n const parts: string[] = [];\n\n for (let i = 0; i < upCount; i++) {\n parts.push('..');\n }\n\n for (let i = startIndex; i < toSegments.length; i++) {\n const seg = toSegments[i];\n if (seg) {\n if (seg.isProperty()) {\n parts.push(seg.propertyName());\n } else if (seg.isItems() && parts.length > 0) {\n const lastPart = parts.at(-1);\n if (lastPart && lastPart !== '..') {\n parts[parts.length - 1] = lastPart + '[*]';\n }\n }\n }\n }\n\n return parts;\n }\n\n private formatPartsWithArrayNotation(\n parts: string[],\n toSegments: readonly PathSegment[],\n ): string {\n if (parts.length === 0) {\n const lastSeg = toSegments.at(-1);\n if (lastSeg?.isProperty()) {\n return lastSeg.propertyName();\n }\n return '';\n }\n\n if (parts[0] === '..') {\n return parts.join('/');\n }\n\n return parts.join('.');\n }\n}\n","import { serializeAst, replaceDependencies } from '@revisium/formula';\nimport type { Formula } from '../core/Formula';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport { FormulaError } from '../core/FormulaError';\nimport type { XFormula } from '../../schema/JsonSchema';\nimport { RelativePathBuilder } from './RelativePathBuilder';\n\nexport class FormulaSerializer {\n private readonly relativePathBuilder = new RelativePathBuilder();\n\n constructor(\n private readonly tree: NodeTree,\n private readonly formulaNodeId: string,\n private readonly formula: Formula,\n ) {}\n\n static toXFormula(\n tree: NodeTree,\n formulaNodeId: string,\n formula: Formula,\n ): XFormula {\n const serializer = new FormulaSerializer(tree, formulaNodeId, formula);\n return {\n version: 1,\n expression: serializer.serialize(),\n };\n }\n\n serialize(): string {\n const replacements = this.buildPathReplacements();\n const updatedAst = replaceDependencies(this.formula.ast(), replacements);\n return serializeAst(updatedAst);\n }\n\n private buildPathReplacements(): Record<string, string> {\n const replacements: Record<string, string> = {};\n const formulaPath = this.tree.pathOf(this.formulaNodeId);\n\n for (const astPath of this.formula.astPaths()) {\n const nodeId = this.formula.getNodeIdForAstPath(astPath);\n if (!nodeId) {\n continue;\n }\n\n const targetNode = this.tree.nodeById(nodeId);\n if (targetNode.isNull()) {\n throw new FormulaError(\n `Cannot serialize formula: target node not found`,\n this.formulaNodeId,\n `Target nodeId: ${nodeId}`,\n );\n }\n\n const targetPath = this.tree.pathOf(nodeId);\n const newPath = this.relativePathBuilder.buildWithArrayNotation(\n formulaPath,\n targetPath,\n );\n\n if (this.needsReplacement(astPath, newPath)) {\n replacements[astPath] = newPath;\n }\n }\n\n return replacements;\n }\n\n private needsReplacement(astPath: string, newPath: string): boolean {\n if (astPath === newPath) {\n return false;\n }\n\n const normalizedAstPath = this.normalizeArrayNotation(astPath);\n const normalizedNewPath = this.normalizeArrayNotation(newPath);\n\n return normalizedAstPath !== normalizedNewPath;\n }\n\n private normalizeArrayNotation(path: string): string {\n return path.replaceAll(/\\[\\d+\\]/g, '[*]');\n }\n}\n","import { makeAutoObservable, observable } from 'mobx';\nimport type { Formula } from '../core/Formula';\n\nexport interface FormulaDependent {\n formulaNodeId: string;\n fieldName: string;\n expression: string;\n}\n\nexport class FormulaDependencyIndex {\n private readonly dependentsMap = observable.map<string, Set<string>>();\n private readonly formulasByNodeId = observable.map<string, Formula>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n registerFormula(formulaNodeId: string, formula: Formula): void {\n this.unregisterFormula(formulaNodeId);\n\n this.formulasByNodeId.set(formulaNodeId, formula);\n\n for (const dep of formula.dependencies()) {\n const targetId = dep.targetNodeId();\n let dependents = this.dependentsMap.get(targetId);\n if (!dependents) {\n dependents = observable.set<string>();\n this.dependentsMap.set(targetId, dependents);\n }\n dependents.add(formulaNodeId);\n }\n }\n\n unregisterFormula(formulaNodeId: string): void {\n this.formulasByNodeId.delete(formulaNodeId);\n\n for (const [targetId, dependents] of this.dependentsMap) {\n dependents.delete(formulaNodeId);\n if (dependents.size === 0) {\n this.dependentsMap.delete(targetId);\n }\n }\n }\n\n getDependents(nodeId: string): readonly string[] {\n const dependents = this.dependentsMap.get(nodeId);\n return dependents ? Array.from(dependents) : [];\n }\n\n getFormula(nodeId: string): Formula | null {\n return this.formulasByNodeId.get(nodeId) ?? null;\n }\n\n clear(): void {\n this.dependentsMap.clear();\n this.formulasByNodeId.clear();\n }\n\n forEachFormula(callback: (nodeId: string, formula: Formula) => void): void {\n for (const [nodeId, formula] of this.formulasByNodeId) {\n callback(nodeId, formula);\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { Path } from '../path';\nimport { EMPTY_PATH } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\n\nexport class TreeNodeIndex {\n private readonly nodeIndex = new Map<string, SchemaNode>();\n private readonly pathIndex = new Map<string, Path>();\n\n public rebuild(rootNode: SchemaNode): void {\n this.nodeIndex.clear();\n this.pathIndex.clear();\n this.collectNodes(rootNode, EMPTY_PATH);\n }\n\n public getNode(id: string): SchemaNode {\n return this.nodeIndex.get(id) ?? NULL_NODE;\n }\n\n public getPath(id: string): Path {\n return this.pathIndex.get(id) ?? EMPTY_PATH;\n }\n\n public countNodes(): number {\n return this.nodeIndex.size;\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIndex.keys();\n }\n\n private collectNodes(node: SchemaNode, path: Path): void {\n if (node.isNull()) {\n return;\n }\n\n this.nodeIndex.set(node.id(), node);\n this.pathIndex.set(node.id(), path);\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectNodes(child, path.child(child.name()));\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectNodes(items, path.childItems());\n }\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { Path, PathSegment } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\n\nexport class TreeMutator {\n public setNodeAt(\n rootNode: SchemaNode,\n path: Path,\n newNode: SchemaNode,\n ): void {\n if (path.isEmpty()) {\n throw new Error('Cannot replace root node');\n }\n this.updateNodeAt(rootNode, path.segments(), 0, newNode);\n }\n\n public removeNodeAt(rootNode: SchemaNode, path: Path): void {\n if (path.isEmpty()) {\n throw new Error('Cannot remove root node');\n }\n this.removeNodeAtInternal(rootNode, path.segments(), 0);\n }\n\n public removeNodeAtInternal(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n ): void {\n const segment = segments[index];\n if (!segment) {\n return;\n }\n\n const isLastSegment = index === segments.length - 1;\n\n if (segment.isProperty()) {\n this.removePropertySegment(\n current,\n segment.propertyName(),\n segments,\n index,\n isLastSegment,\n );\n } else if (segment.isItems()) {\n this.removeItemsSegment(current, segments, index, isLastSegment);\n }\n }\n\n private removePropertySegment(\n current: SchemaNode,\n childName: string,\n segments: readonly PathSegment[],\n index: number,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.removeProperty(childName);\n return;\n }\n\n const existingChild = current.property(childName);\n if (!existingChild.isNull()) {\n this.removeNodeAtInternal(existingChild, segments, index + 1);\n }\n }\n\n private removeItemsSegment(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.setItems(NULL_NODE);\n return;\n }\n\n const existingItems = current.items();\n if (!existingItems.isNull()) {\n this.removeNodeAtInternal(existingItems, segments, index + 1);\n }\n }\n\n private updateNodeAt(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n ): void {\n if (index >= segments.length) {\n return;\n }\n\n const segment = segments[index];\n if (!segment) {\n return;\n }\n\n const isLastSegment = index === segments.length - 1;\n\n if (segment.isProperty()) {\n this.updatePropertySegment(\n current,\n segment.propertyName(),\n segments,\n index,\n newNode,\n isLastSegment,\n );\n } else if (segment.isItems()) {\n this.updateItemsSegment(current, segments, index, newNode, isLastSegment);\n }\n }\n\n private updatePropertySegment(\n current: SchemaNode,\n childName: string,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n newNode.setName(childName);\n const existingChild = current.property(childName);\n if (existingChild.isNull()) {\n current.addProperty(newNode);\n } else {\n current.replaceProperty(childName, newNode);\n }\n return;\n }\n\n const existingChild = current.property(childName);\n if (!existingChild.isNull()) {\n this.updateNodeAt(existingChild, segments, index + 1, newNode);\n }\n }\n\n private updateItemsSegment(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.setItems(newNode);\n return;\n }\n\n const existingItems = current.items();\n if (!existingItems.isNull()) {\n this.updateNodeAt(existingItems, segments, index + 1, newNode);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { NodeTree } from './NodeTree';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { Path, PathSegment } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\nimport {\n FormulaDependencyIndex,\n FormulaSerializer,\n type FormulaDependent,\n type Formula,\n} from '../formula';\nimport { TreeNodeIndex } from './TreeNodeIndex';\nimport { TreeMutator } from './TreeMutator';\n\nexport class SchemaTree implements NodeTree {\n private readonly nodeIndex: TreeNodeIndex;\n private readonly mutator: TreeMutator;\n private readonly formulaIndex: FormulaDependencyIndex;\n private _rootNode: SchemaNode;\n\n constructor(rootNode: SchemaNode) {\n this._rootNode = rootNode;\n this.nodeIndex = new TreeNodeIndex();\n this.mutator = new TreeMutator();\n this.formulaIndex = new FormulaDependencyIndex();\n this.rebuildIndex();\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public root(): SchemaNode {\n return this._rootNode;\n }\n\n public countNodes(): number {\n return this.nodeIndex.countNodes();\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIndex.nodeIds();\n }\n\n public nodeById(id: string): SchemaNode {\n return this.nodeIndex.getNode(id);\n }\n\n public pathOf(id: string): Path {\n return this.nodeIndex.getPath(id);\n }\n\n public nodeAt(path: Path): SchemaNode {\n if (path.isEmpty()) {\n return this._rootNode;\n }\n\n let current: SchemaNode = this._rootNode;\n for (const segment of path.segments()) {\n if (segment.isProperty()) {\n current = current.property(segment.propertyName());\n } else {\n current = current.items();\n }\n if (current.isNull()) {\n return NULL_NODE;\n }\n }\n return current;\n }\n\n public replaceRoot(newRoot: SchemaNode): void {\n this._rootNode = newRoot;\n this.rebuildIndex();\n }\n\n public setNodeAt(path: Path, node: SchemaNode): void {\n this.mutator.setNodeAt(this._rootNode, path, node);\n this.rebuildIndex();\n }\n\n public removeNodeAt(path: Path): void {\n this.mutator.removeNodeAt(this._rootNode, path);\n this.rebuildIndex();\n }\n\n public renameNode(id: string, newName: string): void {\n const node = this.nodeById(id);\n if (node.isNull()) {\n return;\n }\n\n node.setName(newName);\n this.rebuildIndex();\n }\n\n public addChildTo(parentId: string, node: SchemaNode): void {\n const parent = this.nodeById(parentId);\n if (parent.isNull() || !parent.isObject()) {\n return;\n }\n parent.addProperty(node);\n this.rebuildIndex();\n }\n\n public canMoveNode(fromNodeId: string, toNodeId: string): boolean {\n if (fromNodeId === toNodeId) {\n return false;\n }\n const fromNode = this.nodeById(fromNodeId);\n const toNode = this.nodeById(toNodeId);\n if (fromNode.isNull() || toNode.isNull()) {\n return false;\n }\n if (!toNode.isObject()) {\n return false;\n }\n const toPath = this.pathOf(toNodeId);\n const fromPath = this.pathOf(fromNodeId);\n if (toPath.equals(fromPath) || toPath.isChildOf(fromPath)) {\n return false;\n }\n if (fromPath.parent().equals(toPath)) {\n return false;\n }\n if (this.isMovingOutOfArray(fromPath, toPath)) {\n return false;\n }\n return true;\n }\n\n private isMovingOutOfArray(fromPath: Path, toPath: Path): boolean {\n const fromSegments = fromPath.segments();\n const toSegments = toPath.segments();\n\n for (let i = 0; i < fromSegments.length; i++) {\n const fromSeg = fromSegments[i];\n if (fromSeg?.isItems()) {\n if (!toSegments[i]?.isItems()) {\n return true;\n }\n if (this.hasPathPrefixMismatch(fromSegments, toSegments, i)) {\n return true;\n }\n }\n }\n return false;\n }\n\n private hasPathPrefixMismatch(\n fromSegments: readonly PathSegment[],\n toSegments: readonly PathSegment[],\n endIndex: number,\n ): boolean {\n for (let j = 0; j < endIndex; j++) {\n const fromSeg = fromSegments[j];\n const toSeg = toSegments[j];\n if (!fromSeg || !toSeg || !fromSeg.equals(toSeg)) {\n return true;\n }\n }\n return false;\n }\n\n public hasValidDropTarget(nodeId: string): boolean {\n return this.findValidDropTarget(this._rootNode, nodeId);\n }\n\n private findValidDropTarget(current: SchemaNode, nodeId: string): boolean {\n if (current.isObject() && this.canMoveNode(nodeId, current.id())) {\n return true;\n }\n\n if (current.isObject()) {\n for (const child of current.properties()) {\n if (this.findValidDropTarget(child, nodeId)) {\n return true;\n }\n }\n }\n\n if (current.isArray()) {\n const items = current.items();\n if (!items.isNull() && this.findValidDropTarget(items, nodeId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public moveNode(nodeId: string, targetParentId: string): void {\n const node = this.nodeById(nodeId);\n const targetParent = this.nodeById(targetParentId);\n if (node.isNull() || targetParent.isNull() || !targetParent.isObject()) {\n return;\n }\n\n const sourcePath = this.pathOf(nodeId);\n if (sourcePath.isEmpty()) {\n return;\n }\n\n this.mutator.removeNodeAtInternal(this._rootNode, sourcePath.segments(), 0);\n targetParent.addProperty(node);\n this.rebuildIndex();\n }\n\n public registerFormula(formulaNodeId: string, formula: Formula): void {\n const node = this.nodeById(formulaNodeId);\n if (node.isNull()) {\n return;\n }\n this.formulaIndex.registerFormula(formulaNodeId, formula);\n }\n\n public unregisterFormula(formulaNodeId: string): void {\n this.formulaIndex.unregisterFormula(formulaNodeId);\n }\n\n public getFormulaDependents(nodeId: string): FormulaDependent[] {\n const result: FormulaDependent[] = [];\n this.collectFormulaDependents(nodeId, result, new Set());\n return result;\n }\n\n public getDirectFormulaDependents(nodeId: string): FormulaDependent[] {\n const result: FormulaDependent[] = [];\n this.collectDirectDependents(nodeId, result, new Set());\n return result;\n }\n\n public hasFormulaDependents(nodeId: string): boolean {\n return this.getFormulaDependents(nodeId).length > 0;\n }\n\n public getFormulaByNodeId(nodeId: string): Formula | null {\n return this.formulaIndex.getFormula(nodeId);\n }\n\n public clearFormulaIndex(): void {\n this.formulaIndex.clear();\n }\n\n public forEachFormula(callback: (nodeId: string) => void): void {\n this.formulaIndex.forEachFormula(callback);\n }\n\n private rebuildIndex(): void {\n this.nodeIndex.rebuild(this._rootNode);\n }\n\n public clone(): SchemaTree {\n const clonedRoot = this._rootNode.clone();\n const clonedTree = new SchemaTree(clonedRoot);\n this.cloneFormulas(clonedTree);\n return clonedTree;\n }\n\n private cloneFormulas(targetTree: SchemaTree): void {\n this.formulaIndex.forEachFormula((nodeId) => {\n const targetNode = targetTree.nodeById(nodeId);\n const formula = targetNode.formula();\n if (!targetNode.isNull() && formula) {\n targetTree.registerFormula(nodeId, formula);\n }\n });\n }\n\n private collectFormulaDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n this.collectDirectDependents(nodeId, result, seen);\n this.collectChildDependents(nodeId, result, seen);\n }\n\n private collectDirectDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n const directDependentIds = this.formulaIndex.getDependents(nodeId);\n\n for (const formulaNodeId of directDependentIds) {\n if (seen.has(formulaNodeId)) {\n continue;\n }\n seen.add(formulaNodeId);\n\n const dependent = this.createFormulaDependent(formulaNodeId);\n if (dependent) {\n result.push(dependent);\n }\n }\n }\n\n private createFormulaDependent(\n formulaNodeId: string,\n ): FormulaDependent | null {\n const formulaNode = this.nodeById(formulaNodeId);\n const formula = this.formulaIndex.getFormula(formulaNodeId);\n\n if (formulaNode.isNull() || !formula) {\n return null;\n }\n\n const expression = new FormulaSerializer(\n this,\n formulaNodeId,\n formula,\n ).serialize();\n\n return {\n formulaNodeId,\n fieldName: formulaNode.name(),\n expression,\n };\n }\n\n private collectChildDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n const node = this.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectFormulaDependents(child.id(), result, seen);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectFormulaDependents(items.id(), result, seen);\n }\n }\n }\n}\n","import type { JsonSchemaType } from '../../schema/JsonSchema';\nimport type { TypeDescriptor } from './TypeDescriptor';\n\nexport class TypeRegistry {\n private readonly descriptors: Map<string, TypeDescriptor> = new Map();\n private readonly parseOrder: TypeDescriptor[] = [];\n\n register(descriptor: TypeDescriptor): void {\n if (this.descriptors.has(descriptor.type)) {\n throw new Error(`Type \"${descriptor.type}\" is already registered`);\n }\n this.descriptors.set(descriptor.type, descriptor);\n this.parseOrder.push(descriptor);\n }\n\n getDescriptor(type: string): TypeDescriptor | undefined {\n return this.descriptors.get(type);\n }\n\n findDescriptorForSchema(schema: JsonSchemaType): TypeDescriptor | undefined {\n for (const descriptor of this.parseOrder) {\n if (descriptor.canParse(schema)) {\n return descriptor;\n }\n }\n return undefined;\n }\n\n getAllDescriptors(): readonly TypeDescriptor[] {\n return this.parseOrder;\n }\n\n getTypes(): readonly string[] {\n return Array.from(this.descriptors.keys());\n }\n}\n","export interface TypeCapabilities {\n readonly hasChildren: boolean;\n readonly hasItems: boolean;\n readonly hasFormula: boolean;\n readonly isPrimitive: boolean;\n readonly isContainer: boolean;\n}\n\nexport const PRIMITIVE_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: false,\n hasFormula: true,\n isPrimitive: true,\n isContainer: false,\n};\n\nexport const OBJECT_CAPABILITIES: TypeCapabilities = {\n hasChildren: true,\n hasItems: false,\n hasFormula: false,\n isPrimitive: false,\n isContainer: true,\n};\n\nexport const ARRAY_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: true,\n hasFormula: false,\n isPrimitive: false,\n isContainer: true,\n};\n\nexport const REF_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: false,\n hasFormula: false,\n isPrimitive: false,\n isContainer: false,\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonStringSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport {\n StringNode,\n type StringNodeOptions,\n type StringFormat,\n type ContentMediaType,\n} from '../../node/StringNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isStringSchema(schema: JsonSchemaType): schema is JsonStringSchema {\n return 'type' in schema && schema.type === 'string';\n}\n\nexport const stringDescriptor: TypeDescriptor<JsonStringSchema, StringNode> = {\n type: 'string',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isStringSchema,\n\n parse(\n schema: JsonStringSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): StringNode {\n const options: StringNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n if (schema.foreignKey) {\n options.foreignKey = schema.foreignKey;\n }\n if (schema.format) {\n options.format = schema.format as StringFormat;\n }\n if (schema.contentMediaType) {\n options.contentMediaType = schema.contentMediaType as ContentMediaType;\n }\n if (schema.enum && schema.enum.length > 0) {\n options.enumValues = schema.enum;\n }\n\n const node = new StringNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: StringNode, context: SerializeContext): JsonStringSchema {\n const result: JsonStringSchema = {\n type: 'string',\n default: node.defaultValue() ?? '',\n };\n\n if (node.foreignKey()) {\n result.foreignKey = node.foreignKey();\n }\n if (node.format()) {\n result.format = node.format();\n }\n if (node.contentMediaType()) {\n result.contentMediaType = node.contentMediaType();\n }\n const enumValues = node.enumValues();\n if (enumValues && enumValues.length > 0) {\n result.enum = [...enumValues];\n }\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonStringSchema): string {\n return 'default' in schema ? schema.default : '';\n },\n\n parseDefaultValueString(valueStr: string): string {\n return valueStr;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonNumberSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { NumberNode, type NumberNodeOptions } from '../../node/NumberNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isNumberSchema(schema: JsonSchemaType): schema is JsonNumberSchema {\n return 'type' in schema && schema.type === 'number';\n}\n\nexport const numberDescriptor: TypeDescriptor<JsonNumberSchema, NumberNode> = {\n type: 'number',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isNumberSchema,\n\n parse(\n schema: JsonNumberSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): NumberNode {\n const options: NumberNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n\n const node = new NumberNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: NumberNode, context: SerializeContext): JsonNumberSchema {\n const result: JsonNumberSchema = {\n type: 'number',\n default: node.defaultValue() ?? 0,\n };\n\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonNumberSchema): number {\n return 'default' in schema ? schema.default : 0;\n },\n\n parseDefaultValueString(valueStr: string): number | undefined {\n if (!valueStr) {\n return undefined;\n }\n const num = Number(valueStr);\n if (!Number.isNaN(num)) {\n return num;\n }\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type {\n JsonBooleanSchema,\n JsonSchemaType,\n} from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { BooleanNode, type BooleanNodeOptions } from '../../node/BooleanNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isBooleanSchema(schema: JsonSchemaType): schema is JsonBooleanSchema {\n return 'type' in schema && schema.type === 'boolean';\n}\n\nexport const booleanDescriptor: TypeDescriptor<JsonBooleanSchema, BooleanNode> =\n {\n type: 'boolean',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isBooleanSchema,\n\n parse(\n schema: JsonBooleanSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): BooleanNode {\n const options: BooleanNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n\n const node = new BooleanNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: BooleanNode, context: SerializeContext): JsonBooleanSchema {\n const result: JsonBooleanSchema = {\n type: 'boolean',\n default: node.defaultValue() ?? false,\n };\n\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonBooleanSchema): boolean {\n return 'default' in schema ? schema.default : false;\n },\n\n parseDefaultValueString(valueStr: string): boolean | undefined {\n if (!valueStr) {\n return undefined;\n }\n const lower = valueStr.toLowerCase();\n if (lower === 'true') {\n return true;\n }\n if (lower === 'false') {\n return false;\n }\n return undefined;\n },\n };\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonObjectSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport type { SchemaNode } from '../../node/SchemaNode';\nimport { ObjectNode } from '../../node/ObjectNode';\nimport { OBJECT_CAPABILITIES } from './TypeCapabilities';\n\nfunction isObjectSchema(schema: JsonSchemaType): schema is JsonObjectSchema {\n return 'type' in schema && schema.type === 'object';\n}\n\nexport const objectDescriptor: TypeDescriptor<JsonObjectSchema, ObjectNode> = {\n type: 'object',\n\n capabilities: OBJECT_CAPABILITIES,\n\n canParse: isObjectSchema,\n\n parse(\n schema: JsonObjectSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): ObjectNode {\n const children: SchemaNode[] = [];\n\n const orderedKeys = schema.required ?? Object.keys(schema.properties);\n\n for (const propName of orderedKeys) {\n const propSchema = schema.properties[propName];\n if (propSchema) {\n children.push(context.parseNode(propSchema, propName));\n }\n }\n\n const node = new ObjectNode(context.generateId(), name, children);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: ObjectNode, context: SerializeContext): JsonObjectSchema {\n const properties: Record<string, JsonSchemaType> = {};\n const required: string[] = [];\n\n for (const child of node.properties()) {\n const childName = child.name();\n properties[childName] = context.serialize(child);\n required.push(childName);\n }\n\n return {\n type: 'object',\n required,\n properties,\n additionalProperties: false,\n };\n },\n\n getDefaultValue(_schema: JsonObjectSchema): Record<string, unknown> {\n return {};\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonArraySchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { ArrayNode } from '../../node/ArrayNode';\nimport { ARRAY_CAPABILITIES } from './TypeCapabilities';\n\nfunction isArraySchema(schema: JsonSchemaType): schema is JsonArraySchema {\n return 'type' in schema && schema.type === 'array';\n}\n\nexport const arrayDescriptor: TypeDescriptor<JsonArraySchema, ArrayNode> = {\n type: 'array',\n\n capabilities: ARRAY_CAPABILITIES,\n\n canParse: isArraySchema,\n\n parse(\n schema: JsonArraySchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): ArrayNode {\n const items = context.parseNode(schema.items, '');\n const node = new ArrayNode(context.generateId(), name, items);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: ArrayNode, context: SerializeContext): JsonArraySchema {\n const items = node.items();\n\n return {\n type: 'array',\n items: items.isNull()\n ? { type: 'string', default: '' }\n : context.serialize(items),\n };\n },\n\n getDefaultValue(_schema: JsonArraySchema): unknown[] {\n return [];\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonRefSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { RefNode } from '../../node/RefNode';\nimport { REF_CAPABILITIES } from './TypeCapabilities';\n\nfunction isRefSchema(schema: JsonSchemaType): schema is JsonRefSchema {\n return '$ref' in schema;\n}\n\nexport const refDescriptor: TypeDescriptor<JsonRefSchema, RefNode> = {\n type: 'ref',\n\n capabilities: REF_CAPABILITIES,\n\n canParse: isRefSchema,\n\n parse(\n schema: JsonRefSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): RefNode {\n const node = new RefNode(context.generateId(), name, schema.$ref);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: RefNode, _context: SerializeContext): JsonRefSchema {\n const result: JsonRefSchema = {\n $ref: node.ref(),\n };\n\n const meta = node.metadata();\n if (meta.title) {\n result.title = meta.title;\n }\n if (meta.description) {\n result.description = meta.description;\n }\n if (meta.deprecated) {\n result.deprecated = meta.deprecated;\n }\n\n return result;\n },\n\n getDefaultValue(_schema: JsonRefSchema): null {\n return null;\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","export { TypeRegistry } from './TypeRegistry';\nexport type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nexport type { TypeCapabilities } from './TypeCapabilities';\nexport {\n PRIMITIVE_CAPABILITIES,\n OBJECT_CAPABILITIES,\n ARRAY_CAPABILITIES,\n REF_CAPABILITIES,\n} from './TypeCapabilities';\n\nexport { stringDescriptor } from './StringDescriptor';\nexport { numberDescriptor } from './NumberDescriptor';\nexport { booleanDescriptor } from './BooleanDescriptor';\nexport { objectDescriptor } from './ObjectDescriptor';\nexport { arrayDescriptor } from './ArrayDescriptor';\nexport { refDescriptor } from './RefDescriptor';\n\nimport { TypeRegistry } from './TypeRegistry';\nimport { refDescriptor } from './RefDescriptor';\nimport { objectDescriptor } from './ObjectDescriptor';\nimport { arrayDescriptor } from './ArrayDescriptor';\nimport { stringDescriptor } from './StringDescriptor';\nimport { numberDescriptor } from './NumberDescriptor';\nimport { booleanDescriptor } from './BooleanDescriptor';\n\nexport function createDefaultRegistry(): TypeRegistry {\n const registry = new TypeRegistry();\n\n registry.register(refDescriptor);\n registry.register(objectDescriptor);\n registry.register(arrayDescriptor);\n registry.register(stringDescriptor);\n registry.register(numberDescriptor);\n registry.register(booleanDescriptor);\n\n return registry;\n}\n\nexport const defaultRegistry = createDefaultRegistry();\n","import type { JsonSchemaType } from './JsonSchema';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { NodeMetadata } from '../node/NodeMetadata';\nimport {\n type TypeRegistry,\n type ParseContext,\n defaultRegistry,\n} from '../parsing/index';\n\nlet idCounter = 0;\n\nfunction generateId(): string {\n idCounter++;\n return `node-${idCounter}`;\n}\n\nexport function resetIdCounter(): void {\n idCounter = 0;\n}\n\ninterface PendingFormula {\n nodeId: string;\n expression: string;\n}\n\nexport class SchemaParser {\n private pendingFormulas: PendingFormula[] = [];\n private readonly registry: TypeRegistry;\n\n constructor(registry: TypeRegistry = defaultRegistry) {\n this.registry = registry;\n }\n\n parse(schema: JsonSchemaType): SchemaNode {\n this.pendingFormulas = [];\n return this.parseNode(schema, '');\n }\n\n parseWithRootName(schema: JsonSchemaType, name: string): SchemaNode {\n this.pendingFormulas = [];\n return this.parseNode(schema, name);\n }\n\n getPendingFormulas(): PendingFormula[] {\n return this.pendingFormulas;\n }\n\n private parseNode(schema: JsonSchemaType, name: string): SchemaNode {\n const metadata = this.extractMetadata(schema);\n const descriptor = this.registry.findDescriptorForSchema(schema);\n\n if (!descriptor) {\n throw new Error(\n `No type descriptor found for schema: ${JSON.stringify(schema)}`,\n );\n }\n\n const context: ParseContext = {\n generateId,\n parseNode: (s, n) => this.parseNode(s, n),\n addPendingFormula: (nodeId, expression) => {\n this.pendingFormulas.push({ nodeId, expression });\n },\n };\n\n return descriptor.parse(schema, name, metadata, context);\n }\n\n private extractMetadata(schema: JsonSchemaType): NodeMetadata {\n return {\n title: 'title' in schema ? schema.title : undefined,\n description: 'description' in schema ? schema.description : undefined,\n deprecated: 'deprecated' in schema ? schema.deprecated : undefined,\n };\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { NodeTree } from '../tree/NodeTree';\nimport type { JsonSchemaType, JsonObjectSchema } from './JsonSchema';\nimport {\n type TypeRegistry,\n type SerializeContext,\n defaultRegistry,\n} from '../parsing/index';\nimport { FormulaSerializer } from '../formula';\n\nexport interface SerializeOptions {\n excludeNodeIds?: Set<string>;\n}\n\nexport class SchemaSerializer {\n private readonly registry: TypeRegistry;\n private tree: NodeTree | null = null;\n private excludeNodeIds: Set<string> = new Set();\n\n constructor(registry: TypeRegistry = defaultRegistry) {\n this.registry = registry;\n }\n\n serializeWithTree(\n node: SchemaNode,\n tree: NodeTree,\n options?: SerializeOptions,\n ): JsonSchemaType {\n this.tree = tree;\n this.excludeNodeIds = options?.excludeNodeIds ?? new Set();\n try {\n return this.serialize(node);\n } finally {\n this.tree = null;\n this.excludeNodeIds = new Set();\n }\n }\n\n serialize(node: SchemaNode): JsonSchemaType {\n if (node.isNull()) {\n throw new Error('Cannot serialize null node');\n }\n\n if (this.excludeNodeIds.size > 0 && node.isObject()) {\n return this.serializeObjectWithExclusions(node);\n }\n\n const descriptor = this.registry.getDescriptor(node.nodeType());\n\n if (!descriptor) {\n throw new Error(\n `No type descriptor found for node type: ${node.nodeType()}`,\n );\n }\n\n const context: SerializeContext = {\n serialize: (n) => this.serialize(n),\n serializeFormula: (nodeId, formula) => {\n if (!this.tree) {\n throw new Error(\n 'Cannot serialize formula without tree context. Use serializeWithTree.',\n );\n }\n return FormulaSerializer.toXFormula(this.tree, nodeId, formula);\n },\n };\n\n const result = descriptor.serialize(node, context);\n return this.addMetadata(result, node);\n }\n\n private serializeObjectWithExclusions(node: SchemaNode): JsonObjectSchema {\n const properties: Record<string, JsonSchemaType> = {};\n const required: string[] = [];\n\n for (const child of node.properties()) {\n if (this.excludeNodeIds.has(child.id())) {\n continue;\n }\n properties[child.name()] = this.serialize(child);\n required.push(child.name());\n }\n\n const result: JsonObjectSchema = {\n type: 'object',\n properties,\n additionalProperties: false,\n required,\n };\n\n return this.addMetadata(result, node);\n }\n\n private addMetadata<\n T extends { title?: string; description?: string; deprecated?: boolean },\n >(schema: T, node: SchemaNode): T {\n const meta = node.metadata();\n\n if (meta.title) {\n schema.title = meta.title;\n }\n if (meta.description) {\n schema.description = meta.description;\n }\n if (meta.deprecated) {\n schema.deprecated = meta.deprecated;\n }\n\n return schema;\n }\n}\n","export class SchemaComparator {\n public areEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (\n a === null ||\n b === null ||\n typeof a !== 'object' ||\n typeof b !== 'object'\n ) {\n return a === b;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return this.arraysEqual(a, b);\n }\n\n return this.objectsEqual(\n a as Record<string, unknown>,\n b as Record<string, unknown>,\n );\n }\n\n private arraysEqual(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((item, i) => this.areEqual(item, b[i]));\n }\n\n private objectsEqual(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n ): boolean {\n const aKeys = Object.keys(a).sort((x, y) => x.localeCompare(y));\n const bKeys = Object.keys(b).sort((x, y) => x.localeCompare(y));\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n if (!aKeys.every((k, i) => k === bKeys[i])) {\n return false;\n }\n\n return aKeys.every((key) => this.areEqual(a[key], b[key]));\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { Path } from '../../path';\nimport { EMPTY_PATH } from '../../path';\n\nexport class NodePathIndex {\n private readonly nodeIdToPath = new Map<string, Path>();\n private readonly oldToNewNodeId = new Map<string, string>();\n private readonly newToOldNodeId = new Map<string, string>();\n private readonly replacedPaths = new Set<Path>();\n private tree: SchemaTree;\n\n constructor(tree: SchemaTree) {\n this.tree = tree;\n this.rebuild();\n }\n\n public rebuild(): void {\n this.nodeIdToPath.clear();\n this.oldToNewNodeId.clear();\n this.newToOldNodeId.clear();\n this.replacedPaths.clear();\n this.collectNodePaths(this.tree.root(), EMPTY_PATH);\n }\n\n public rebuildFrom(tree: SchemaTree): void {\n this.tree = tree;\n this.rebuild();\n }\n\n public getPath(nodeId: string): Path | undefined {\n return this.nodeIdToPath.get(nodeId);\n }\n\n public hasNode(nodeId: string): boolean {\n return this.nodeIdToPath.has(nodeId);\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIdToPath.keys();\n }\n\n public trackReplacement(oldNodeId: string, newNodeId: string): void {\n const basePath = this.nodeIdToPath.get(oldNodeId);\n if (basePath !== undefined) {\n this.removeChildPaths(basePath);\n this.nodeIdToPath.delete(oldNodeId);\n this.nodeIdToPath.set(newNodeId, basePath);\n this.replacedPaths.add(basePath);\n }\n this.oldToNewNodeId.set(oldNodeId, newNodeId);\n this.newToOldNodeId.set(newNodeId, oldNodeId);\n }\n\n public getOriginalNodeId(newNodeId: string): string | undefined {\n return this.newToOldNodeId.get(newNodeId);\n }\n\n public isChildOfReplacedPath(path: Path): boolean {\n for (const replacedPath of this.replacedPaths) {\n if (path.isChildOf(replacedPath)) {\n return true;\n }\n }\n return false;\n }\n\n private removeChildPaths(parentPath: Path): void {\n for (const [nodeId, path] of this.nodeIdToPath) {\n if (path.isChildOf(parentPath)) {\n this.nodeIdToPath.delete(nodeId);\n }\n }\n }\n\n private collectNodePaths(node: SchemaNode, path: Path): void {\n if (node.isNull()) {\n return;\n }\n\n this.nodeIdToPath.set(node.id(), path);\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectNodePaths(child, path.child(child.name()));\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectNodePaths(items, path.childItems());\n }\n }\n }\n}\n","import type { SchemaTree } from '../../tree/SchemaTree';\nimport type { NodePathIndex } from '../index/NodePathIndex';\nimport type { RawChange } from './RawChange';\n\nexport class ChangeCollector {\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n private readonly baseIndex: NodePathIndex,\n ) {}\n\n public collect(): RawChange[] {\n const changes: RawChange[] = [];\n const processedBaseNodeIds = new Set<string>();\n\n this.collectCurrentTreeChanges(changes, processedBaseNodeIds);\n this.collectRemovedNodes(changes, processedBaseNodeIds);\n\n return changes;\n }\n\n private collectCurrentTreeChanges(\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n for (const nodeId of this.currentTree.nodeIds()) {\n const currentPath = this.currentTree.pathOf(nodeId);\n const currentNode = this.currentTree.nodeById(nodeId);\n\n if (this.baseIndex.hasNode(nodeId)) {\n this.collectExistingNodeChange(\n nodeId,\n currentNode,\n currentPath,\n changes,\n processedBaseNodeIds,\n );\n } else {\n changes.push({\n type: 'added',\n baseNode: null,\n currentNode,\n });\n }\n }\n }\n\n private collectExistingNodeChange(\n nodeId: string,\n currentNode: ReturnType<SchemaTree['nodeById']>,\n currentPath: ReturnType<SchemaTree['pathOf']>,\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n processedBaseNodeIds.add(nodeId);\n\n const originalNodeId = this.baseIndex.getOriginalNodeId(nodeId);\n const baseNodeId = originalNodeId ?? nodeId;\n const baseNode = this.baseTree.nodeById(baseNodeId);\n\n if (originalNodeId) {\n processedBaseNodeIds.add(originalNodeId);\n }\n\n const basePath = this.baseIndex.getPath(nodeId);\n const isMoved = !basePath || !currentPath.equals(basePath);\n\n changes.push({\n type: isMoved ? 'moved' : 'modified',\n baseNode,\n currentNode,\n });\n }\n\n private collectRemovedNodes(\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n for (const nodeId of this.baseIndex.nodeIds()) {\n if (processedBaseNodeIds.has(nodeId)) {\n continue;\n }\n\n const baseNode = this.baseTree.nodeById(nodeId);\n changes.push({\n type: 'removed',\n baseNode,\n currentNode: null,\n });\n }\n }\n}\n","import { type Path, EMPTY_PATH } from '../../path';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { NodePathIndex } from '../index/NodePathIndex';\nimport type { RawChange } from './RawChange';\n\nexport interface CoalescedChanges {\n moved: RawChange[];\n added: RawChange[];\n removed: RawChange[];\n modified: RawChange[];\n}\n\nexport class ChangeCoalescer {\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n private readonly baseIndex: NodePathIndex,\n ) {}\n\n public coalesce(changes: RawChange[]): CoalescedChanges {\n const moved = changes.filter((c) => c.type === 'moved');\n const added = changes.filter((c) => c.type === 'added');\n const removed = changes.filter((c) => c.type === 'removed');\n const modified = changes.filter((c) => c.type === 'modified');\n\n const topLevelMoves = this.filterTopLevelMoves(moved);\n const movedBaseNodes = new Set(moved.map((c) => c.baseNode));\n const moveAffectedTopLevelNodeIds =\n this.collectMoveAffectedTopLevelNodeIds(topLevelMoves);\n\n return {\n moved: topLevelMoves,\n added: this.filterTopLevelAdds(added),\n removed: this.filterTopLevelRemoves(removed, movedBaseNodes),\n modified: this.filterModified(modified, moveAffectedTopLevelNodeIds),\n };\n }\n\n private collectMoveAffectedTopLevelNodeIds(\n topLevelMoves: RawChange[],\n ): Set<string> {\n const nodeIds = new Set<string>();\n for (const change of topLevelMoves) {\n if (change.baseNode) {\n const topLevelNodeId = this.getTopLevelNodeId(\n this.baseTree,\n change.baseNode.id(),\n );\n if (topLevelNodeId) {\n nodeIds.add(topLevelNodeId);\n }\n }\n if (change.currentNode) {\n const topLevelNodeId = this.getTopLevelNodeId(\n this.currentTree,\n change.currentNode.id(),\n );\n if (topLevelNodeId) {\n nodeIds.add(topLevelNodeId);\n }\n }\n }\n return nodeIds;\n }\n\n private getTopLevelNodeId(tree: SchemaTree, nodeId: string): string | null {\n const path = tree.pathOf(nodeId);\n const firstSeg = path.segments()[0];\n if (!firstSeg?.isProperty()) {\n return null;\n }\n const topLevelNode = tree.nodeAt(EMPTY_PATH.child(firstSeg.propertyName()));\n return topLevelNode.isNull() ? null : topLevelNode.id();\n }\n\n private filterTopLevelMoves(moved: RawChange[]): RawChange[] {\n return moved.filter((change) => !this.isChildOfMovedPath(change, moved));\n }\n\n private isChildOfMovedPath(\n change: RawChange,\n allMoved: RawChange[],\n ): boolean {\n if (!change.baseNode) {\n return false;\n }\n const changeBaseNodeId = change.baseNode.id();\n const basePath = this.baseTree.pathOf(changeBaseNodeId);\n return allMoved.some(\n (other) =>\n other.baseNode &&\n other.baseNode.id() !== changeBaseNodeId &&\n basePath.isChildOf(this.baseTree.pathOf(other.baseNode.id())),\n );\n }\n\n private filterTopLevelAdds(added: RawChange[]): RawChange[] {\n const changesWithPaths = added\n .flatMap((change) => {\n if (!change.currentNode) {\n return [];\n }\n return [\n {\n change,\n path: this.currentTree.pathOf(change.currentNode.id()),\n },\n ];\n })\n .sort((a, b) => a.path.length() - b.path.length());\n\n const addedPaths: Path[] = [];\n const result: RawChange[] = [];\n\n for (const { change, path } of changesWithPaths) {\n if (this.baseIndex.isChildOfReplacedPath(path)) {\n continue;\n }\n\n if (this.isChildOfAnyPath(path, addedPaths)) {\n continue;\n }\n\n result.push(change);\n addedPaths.push(path);\n }\n\n return result;\n }\n\n private filterTopLevelRemoves(\n removed: RawChange[],\n movedBaseNodes: Set<RawChange['baseNode']>,\n ): RawChange[] {\n const changesWithPaths = removed\n .flatMap((change) => {\n if (!change.baseNode || movedBaseNodes.has(change.baseNode)) {\n return [];\n }\n return [\n {\n change,\n path: this.baseTree.pathOf(change.baseNode.id()),\n },\n ];\n })\n .sort((a, b) => a.path.length() - b.path.length());\n\n const removedPaths: Path[] = [];\n const result: RawChange[] = [];\n\n for (const { change, path } of changesWithPaths) {\n if (this.isChildOfAnyPath(path, removedPaths)) {\n continue;\n }\n\n result.push(change);\n removedPaths.push(path);\n }\n\n return result;\n }\n\n private filterModified(\n modified: RawChange[],\n moveAffectedTopLevelNodeIds: Set<string>,\n ): RawChange[] {\n return modified.filter((change) => {\n if (!change.currentNode) {\n return false;\n }\n\n const topLevelNodeId = this.getTopLevelNodeId(\n this.currentTree,\n change.currentNode.id(),\n );\n if (topLevelNodeId && moveAffectedTopLevelNodeIds.has(topLevelNodeId)) {\n return false;\n }\n\n return true;\n });\n }\n\n private isChildOfAnyPath(path: Path, parents: Path[]): boolean {\n for (const parent of parents) {\n if (path.isChildOf(parent)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { Path } from '../../path';\nimport { jsonPointerToPath } from '../../path';\nimport { SchemaSerializer } from '../../schema/SchemaSerializer';\nimport { SchemaComparator } from '../SchemaComparator';\nimport type { JsonPatch } from '../SchemaPatch';\nimport type { RawChange } from './RawChange';\nimport type { CoalescedChanges } from './ChangeCoalescer';\n\nexport class PatchGenerator {\n private readonly serializer = new SchemaSerializer();\n private readonly comparator = new SchemaComparator();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public generate(coalesced: CoalescedChanges): JsonPatch[] {\n const movedNodeIds = this.collectMovedNodeIds(coalesced.moved);\n const movePatches = this.generateMovePatches(coalesced.moved);\n const addPatches = this.generateAddPatches(coalesced.added, movedNodeIds);\n const removePatches = this.generateRemovePatches(coalesced.removed);\n\n const { prerequisiteAdds, regularAdds } = this.partitionAddPatches(\n addPatches,\n movePatches,\n );\n\n const childChangePaths = new Set([\n ...addPatches.map((p) => p.path),\n ...removePatches.map((p) => p.path),\n ...movePatches.flatMap((p) => [p.path, p.from ?? '']).filter(Boolean),\n ]);\n\n const replacePatches = this.generateReplacePatches(\n coalesced.modified,\n childChangePaths,\n );\n\n return [\n ...prerequisiteAdds,\n ...movePatches,\n ...replacePatches,\n ...regularAdds,\n ...removePatches,\n ];\n }\n\n private collectMovedNodeIds(moved: RawChange[]): Set<string> {\n const nodeIds = new Set<string>();\n for (const change of moved) {\n if (change.currentNode) {\n nodeIds.add(change.currentNode.id());\n }\n }\n return nodeIds;\n }\n\n private partitionAddPatches(\n addPatches: JsonPatch[],\n movePatches: JsonPatch[],\n ): { prerequisiteAdds: JsonPatch[]; regularAdds: JsonPatch[] } {\n const moveDestinations = movePatches.map((p) => jsonPointerToPath(p.path));\n\n const prerequisiteAdds: JsonPatch[] = [];\n const regularAdds: JsonPatch[] = [];\n\n for (const addPatch of addPatches) {\n const addPath = jsonPointerToPath(addPatch.path);\n const isPrerequisite = moveDestinations.some((moveDest) =>\n moveDest.isChildOf(addPath),\n );\n\n if (isPrerequisite) {\n prerequisiteAdds.push(addPatch);\n } else {\n regularAdds.push(addPatch);\n }\n }\n\n return { prerequisiteAdds, regularAdds };\n }\n\n private generateMovePatches(moved: RawChange[]): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of moved) {\n if (!change.baseNode || !change.currentNode) {\n continue;\n }\n\n const basePath = this.baseTree.pathOf(change.baseNode.id());\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n\n patches.push({\n op: 'move',\n from: basePath.asJsonPointer(),\n path: currentPath.asJsonPointer(),\n });\n\n const modifyPatch = this.generateModifyAfterMove(\n change.baseNode,\n change.currentNode,\n currentPath.asJsonPointer(),\n );\n if (modifyPatch) {\n patches.push(modifyPatch);\n }\n }\n\n return patches;\n }\n\n private generateModifyAfterMove(\n baseNode: SchemaNode,\n currentNode: SchemaNode,\n currentPath: string,\n ): JsonPatch | null {\n const currentSchema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n const baseSchema = this.serializer.serializeWithTree(\n baseNode,\n this.baseTree,\n );\n\n if (!this.comparator.areEqual(currentSchema, baseSchema)) {\n return {\n op: 'replace',\n path: currentPath,\n value: currentSchema,\n };\n }\n\n return null;\n }\n\n private generateAddPatches(\n added: RawChange[],\n movedNodeIds: Set<string>,\n ): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of added) {\n if (!change.currentNode) {\n continue;\n }\n\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n const schema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n { excludeNodeIds: movedNodeIds },\n );\n patches.push({\n op: 'add',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n }\n\n return patches;\n }\n\n private generateRemovePatches(removed: RawChange[]): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of removed) {\n if (!change.baseNode) {\n continue;\n }\n\n const basePath = this.baseTree.pathOf(change.baseNode.id());\n patches.push({\n op: 'remove',\n path: basePath.asJsonPointer(),\n });\n }\n\n return patches;\n }\n\n private generateReplacePatches(\n modified: RawChange[],\n childChangePaths: Set<string>,\n ): JsonPatch[] {\n const patches: JsonPatch[] = [];\n const replacedPaths: Path[] = [];\n const childChangePathObjects = [...childChangePaths].map(jsonPointerToPath);\n\n for (const change of modified) {\n if (!change.currentNode || !change.baseNode) {\n continue;\n }\n\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n\n if (this.isChildOfAny(currentPath, replacedPaths)) {\n continue;\n }\n\n if (this.hasChildIn(currentPath, childChangePathObjects)) {\n continue;\n }\n\n if (!this.isActuallyModified(change)) {\n continue;\n }\n\n const schema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n replacedPaths.push(currentPath);\n }\n\n return patches;\n }\n\n private isChildOfAny(path: Path, parents: Path[]): boolean {\n return parents.some((parent) => path.isChildOf(parent));\n }\n\n private hasChildIn(path: Path, candidates: Path[]): boolean {\n return candidates.some((candidate) => candidate.isChildOf(path));\n }\n\n private isActuallyModified(change: RawChange): boolean {\n if (!change.currentNode || !change.baseNode) {\n return false;\n }\n\n const currentSchema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n );\n const baseSchema = this.serializer.serializeWithTree(\n change.baseNode,\n this.baseTree,\n );\n\n if (this.comparator.areEqual(currentSchema, baseSchema)) {\n return false;\n }\n\n if (\n change.currentNode.isObject() &&\n this.hasOnlyChildChanges(change.currentNode, change.baseNode)\n ) {\n return false;\n }\n\n if (\n change.currentNode.isArray() &&\n this.hasOnlyItemsChanges(change.currentNode, change.baseNode)\n ) {\n return false;\n }\n\n return true;\n }\n\n private hasOnlyChildChanges(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n if (!baseNode.isObject()) {\n return false;\n }\n\n if (this.hasMetadataChanged(currentNode, baseNode)) {\n return false;\n }\n\n return true;\n }\n\n private hasMetadataChanged(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n const currentMeta = currentNode.metadata();\n const baseMeta = baseNode.metadata();\n\n return (\n currentMeta.title !== baseMeta.title ||\n currentMeta.description !== baseMeta.description ||\n currentMeta.deprecated !== baseMeta.deprecated\n );\n }\n\n private hasOnlyItemsChanges(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n if (!baseNode.isArray()) {\n return false;\n }\n\n if (this.hasMetadataChanged(currentNode, baseNode)) {\n return false;\n }\n\n const items = currentNode.items();\n const baseItems = baseNode.items();\n\n if (items.isNull() || baseItems.isNull()) {\n return false;\n }\n\n return items.id() === baseItems.id();\n }\n}\n","import type { SchemaTree } from '../../tree/SchemaTree';\nimport { FormulaSerializer } from '../../formula';\nimport { SchemaSerializer } from '../../schema/SchemaSerializer';\nimport type { JsonPatch } from '../SchemaPatch';\n\nexport class FormulaChangeDetector {\n private readonly serializer = new SchemaSerializer();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public detectIndirectFormulaChanges(\n existingPatches: JsonPatch[],\n ): JsonPatch[] {\n const patchedPaths = new Set(existingPatches.map((p) => p.path));\n const result: JsonPatch[] = [];\n\n this.baseTree.forEachFormula((formulaNodeId) => {\n const currentNode = this.currentTree.nodeById(formulaNodeId);\n if (currentNode.isNull()) {\n return;\n }\n\n const currentPath = this.currentTree\n .pathOf(formulaNodeId)\n .asJsonPointer();\n if (patchedPaths.has(currentPath)) {\n return;\n }\n\n const baseFormula = this.baseTree.getFormulaByNodeId(formulaNodeId);\n const currentFormula = currentNode.formula();\n\n if (!baseFormula || !currentFormula) {\n return;\n }\n\n const baseExpression = new FormulaSerializer(\n this.baseTree,\n formulaNodeId,\n baseFormula,\n ).serialize();\n\n const currentExpression = new FormulaSerializer(\n this.currentTree,\n formulaNodeId,\n currentFormula,\n ).serialize();\n\n if (baseExpression !== currentExpression) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n result.push({\n op: 'replace',\n path: currentPath,\n value: schema,\n });\n }\n });\n\n return result;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport { FormulaSerializer } from '../../formula/serialization/FormulaSerializer';\nimport type {\n DefaultValueType,\n MetadataChangeType,\n MetadataChangesResult,\n} from '../SchemaPatch';\n\nexport class NodeMetadataExtractor {\n public getNodeType(node: SchemaNode | null): string {\n if (!node || node.isNull()) {\n return 'unknown';\n }\n\n if (node.isRef()) {\n return node.ref();\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n const itemsType = this.getNodeType(items);\n return `array<${itemsType}>`;\n }\n return 'array';\n }\n\n return node.nodeType();\n }\n\n public getFormulaExpression(\n tree: NodeTree,\n node: SchemaNode | null,\n ): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n const formula = node.formula();\n if (!formula) {\n return undefined;\n }\n return new FormulaSerializer(tree, node.id(), formula).serialize();\n }\n\n public getDefaultValue(node: SchemaNode | null): DefaultValueType {\n if (!node || node.isNull()) {\n return undefined;\n }\n const def = node.defaultValue();\n if (\n typeof def === 'string' ||\n typeof def === 'number' ||\n typeof def === 'boolean'\n ) {\n return def;\n }\n return undefined;\n }\n\n public getDescription(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.metadata().description;\n }\n\n public getDeprecated(node: SchemaNode | null): boolean | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.metadata().deprecated;\n }\n\n public getForeignKey(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.foreignKey();\n }\n\n public getContentMediaType(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.contentMediaType?.();\n }\n\n public computeMetadataChanges(\n baseTree: NodeTree,\n baseNode: SchemaNode | null,\n currentTree: NodeTree,\n currentNode: SchemaNode | null,\n ): MetadataChangesResult {\n const changes: MetadataChangeType[] = [];\n let formulaChange: MetadataChangesResult['formulaChange'];\n let defaultChange: MetadataChangesResult['defaultChange'];\n let descriptionChange: MetadataChangesResult['descriptionChange'];\n let deprecatedChange: MetadataChangesResult['deprecatedChange'];\n let foreignKeyChange: MetadataChangesResult['foreignKeyChange'];\n let contentMediaTypeChange: MetadataChangesResult['contentMediaTypeChange'];\n\n const effectiveCurrentNode = this.getEffectiveNodeForComparison(\n baseNode,\n currentNode,\n );\n\n const baseDesc = this.getDescription(baseNode);\n const currentDesc = this.getDescription(effectiveCurrentNode);\n if (baseDesc !== currentDesc) {\n changes.push('description');\n descriptionChange = {\n fromDescription: baseDesc,\n toDescription: currentDesc,\n };\n }\n\n const baseDeprecated = this.getDeprecated(baseNode);\n const currentDeprecated = this.getDeprecated(effectiveCurrentNode);\n if (baseDeprecated !== currentDeprecated) {\n changes.push('deprecated');\n deprecatedChange = {\n fromDeprecated: baseDeprecated,\n toDeprecated: currentDeprecated,\n };\n }\n\n const baseFormula = this.getFormulaExpression(baseTree, baseNode);\n const currentFormula = this.getFormulaExpression(\n currentTree,\n effectiveCurrentNode,\n );\n if (baseFormula !== currentFormula) {\n changes.push('formula');\n formulaChange = { fromFormula: baseFormula, toFormula: currentFormula };\n }\n\n const baseForeignKey = this.getForeignKey(baseNode);\n const currentForeignKey = this.getForeignKey(effectiveCurrentNode);\n if (baseForeignKey !== currentForeignKey) {\n changes.push('foreignKey');\n foreignKeyChange = {\n fromForeignKey: baseForeignKey,\n toForeignKey: currentForeignKey,\n };\n }\n\n const baseDefault = this.getDefaultValue(baseNode);\n const currentDefault = this.getDefaultValue(effectiveCurrentNode);\n if (baseDefault !== currentDefault) {\n changes.push('default');\n defaultChange = { fromDefault: baseDefault, toDefault: currentDefault };\n }\n\n const baseContentMediaType = this.getContentMediaType(baseNode);\n const currentContentMediaType =\n this.getContentMediaType(effectiveCurrentNode);\n if (baseContentMediaType !== currentContentMediaType) {\n changes.push('contentMediaType');\n contentMediaTypeChange = {\n fromContentMediaType: baseContentMediaType,\n toContentMediaType: currentContentMediaType,\n };\n }\n\n return {\n metadataChanges: changes,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private getEffectiveNodeForComparison(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): SchemaNode | null {\n if (\n baseNode &&\n !baseNode.isNull() &&\n baseNode.isPrimitive() &&\n currentNode &&\n !currentNode.isNull() &&\n currentNode.isArray()\n ) {\n const items = currentNode.items();\n return items.isNull() ? null : items;\n }\n return currentNode;\n }\n\n public hasTypeChanged(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n const baseType = this.getNodeType(baseNode);\n const currentType = this.getNodeType(currentNode);\n return baseType !== currentType;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport { jsonPointerToPath } from '../../path';\nimport { NodeMetadataExtractor } from './NodeMetadataExtractor';\nimport type { JsonPatch, SchemaPatch } from '../SchemaPatch';\n\nexport class PatchEnricher {\n private readonly metadataExtractor = new NodeMetadataExtractor();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public enrich(patch: JsonPatch): SchemaPatch {\n const fieldName = this.getFieldNameFromPath(patch.path);\n\n if (patch.op === 'add') {\n return this.enrichAddPatch(patch, fieldName);\n }\n\n if (patch.op === 'remove') {\n return { patch, fieldName, metadataChanges: [] };\n }\n\n if (patch.op === 'move') {\n return this.enrichMovePatch(patch, fieldName);\n }\n\n return this.enrichReplacePatch(patch, fieldName);\n }\n\n private enrichAddPatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const {\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = this.metadataExtractor.computeMetadataChanges(\n this.baseTree,\n null,\n this.currentTree,\n currentNode,\n );\n\n return {\n patch,\n fieldName,\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private enrichMovePatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const fromPath = patch.from || '';\n const isRename = this.isRenameMove(fromPath, patch.path);\n const movesIntoArray = this.movesIntoArrayBoundary(fromPath, patch.path);\n\n const baseNode = this.getNodeAtPath(this.baseTree, fromPath);\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const baseFormula = this.metadataExtractor.getFormulaExpression(\n this.baseTree,\n baseNode,\n );\n const currentFormula = this.metadataExtractor.getFormulaExpression(\n this.currentTree,\n currentNode,\n );\n\n const formulaChange =\n baseFormula !== currentFormula\n ? { fromFormula: baseFormula, toFormula: currentFormula }\n : undefined;\n\n return {\n patch,\n fieldName,\n metadataChanges: formulaChange ? ['formula'] : [],\n isRename: isRename || undefined,\n movesIntoArray: movesIntoArray || undefined,\n formulaChange,\n };\n }\n\n private enrichReplacePatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const baseNode = this.getNodeAtPath(this.baseTree, patch.path);\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const {\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = this.metadataExtractor.computeMetadataChanges(\n this.baseTree,\n baseNode,\n this.currentTree,\n currentNode,\n );\n\n const typeChanged = this.metadataExtractor.hasTypeChanged(\n baseNode,\n currentNode,\n );\n\n return {\n patch,\n fieldName,\n metadataChanges,\n typeChange: typeChanged\n ? {\n fromType: this.metadataExtractor.getNodeType(baseNode),\n toType: this.metadataExtractor.getNodeType(currentNode),\n }\n : undefined,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private getFieldNameFromPath(jsonPointer: string): string {\n try {\n return jsonPointerToPath(jsonPointer).asSimple();\n } catch {\n return '';\n }\n }\n\n private isRenameMove(fromPointer: string, toPointer: string): boolean {\n try {\n const fromParent = jsonPointerToPath(fromPointer).parent();\n const toParent = jsonPointerToPath(toPointer).parent();\n return fromParent.equals(toParent);\n } catch {\n return false;\n }\n }\n\n private movesIntoArrayBoundary(\n fromPointer: string,\n toPointer: string,\n ): boolean {\n try {\n const fromPath = jsonPointerToPath(fromPointer);\n const toPath = jsonPointerToPath(toPointer);\n const fromArrayDepth = this.countArrayDepth(fromPath);\n const toArrayDepth = this.countArrayDepth(toPath);\n return toArrayDepth > fromArrayDepth;\n } catch {\n return false;\n }\n }\n\n private countArrayDepth(path: import('../../path').Path): number {\n return path.segments().filter((seg) => seg.isItems()).length;\n }\n\n private getNodeAtPath(\n tree: SchemaTree,\n jsonPointer: string,\n ): SchemaNode | null {\n try {\n const path = jsonPointerToPath(jsonPointer);\n const node = tree.nodeAt(path);\n return node.isNull() ? null : node;\n } catch {\n return null;\n }\n }\n}\n","import type { SchemaTree } from '../tree/SchemaTree';\nimport type { NodePathIndex } from './index/NodePathIndex';\nimport type { SchemaPatch } from './SchemaPatch';\nimport { ChangeCollector } from './changes/ChangeCollector';\nimport { ChangeCoalescer } from './changes/ChangeCoalescer';\nimport { PatchGenerator } from './changes/PatchGenerator';\nimport { FormulaChangeDetector } from './changes/FormulaChangeDetector';\nimport { PatchEnricher } from './enricher/PatchEnricher';\n\nexport class PatchBuilder {\n private readonly collector: ChangeCollector;\n private readonly coalescer: ChangeCoalescer;\n private readonly generator: PatchGenerator;\n private readonly formulaDetector: FormulaChangeDetector;\n private readonly enricher: PatchEnricher;\n\n constructor(\n currentTree: SchemaTree,\n baseTree: SchemaTree,\n baseIndex: NodePathIndex,\n ) {\n this.collector = new ChangeCollector(currentTree, baseTree, baseIndex);\n this.coalescer = new ChangeCoalescer(currentTree, baseTree, baseIndex);\n this.generator = new PatchGenerator(currentTree, baseTree);\n this.formulaDetector = new FormulaChangeDetector(currentTree, baseTree);\n this.enricher = new PatchEnricher(currentTree, baseTree);\n }\n\n public build(): SchemaPatch[] {\n const rawChanges = this.collector.collect();\n const coalesced = this.coalescer.coalesce(rawChanges);\n const jsonPatches = this.generator.generate(coalesced);\n const formulaPatches =\n this.formulaDetector.detectIndirectFormulaChanges(jsonPatches);\n const allPatches = [...jsonPatches, ...formulaPatches];\n return allPatches.map((patch) => this.enricher.enrich(patch));\n }\n}\n","import { makeAutoObservable, observable } from 'mobx';\nimport type { SchemaTree } from '../tree/SchemaTree';\nimport type { JsonObjectSchema } from '../schema/JsonSchema';\nimport { SchemaSerializer } from '../schema/SchemaSerializer';\nimport type { SchemaPatch } from './SchemaPatch';\nimport { SchemaComparator } from './SchemaComparator';\nimport { NodePathIndex } from './index/NodePathIndex';\nimport { PatchBuilder } from './PatchBuilder';\n\nexport class SchemaDiff {\n private readonly serializer = new SchemaSerializer();\n private readonly comparator = new SchemaComparator();\n private readonly baseIndex: NodePathIndex;\n private baseTree: SchemaTree;\n\n constructor(private readonly tree: SchemaTree) {\n this.baseTree = tree.clone();\n this.baseIndex = new NodePathIndex(this.baseTree);\n makeAutoObservable<SchemaDiff, 'baseTree'>(\n this,\n { baseTree: observable.ref },\n { autoBind: true },\n );\n }\n\n public markAsSaved(): void {\n this.baseTree = this.tree.clone();\n this.baseIndex.rebuildFrom(this.baseTree);\n }\n\n public getBaseSchema(): JsonObjectSchema {\n return this.serializer.serializeWithTree(\n this.baseTree.root(),\n this.baseTree,\n ) as JsonObjectSchema;\n }\n\n public trackReplacement(oldNodeId: string, newNodeId: string): void {\n this.baseIndex.trackReplacement(oldNodeId, newNodeId);\n }\n\n public getPatches(): SchemaPatch[] {\n return this.createPatchBuilder().build();\n }\n\n public isDirty(): boolean {\n const currentSchema = this.getCurrentSchema();\n const baseSchema = this.getBaseSchema();\n return !this.comparator.areEqual(currentSchema, baseSchema);\n }\n\n public getCurrentSchema(): JsonObjectSchema {\n return this.serializer.serializeWithTree(\n this.tree.root(),\n this.tree,\n ) as JsonObjectSchema;\n }\n\n private createPatchBuilder(): PatchBuilder {\n return new PatchBuilder(this.tree, this.baseTree, this.baseIndex);\n }\n}\n","const FIELD_NAME_PATTERN = /^(?!__)[a-zA-Z_][a-zA-Z0-9-_]*$/;\nconst FIELD_NAME_MAX_LENGTH = 64;\n\nexport const FIELD_NAME_ERROR_MESSAGE =\n 'Must start with a letter or underscore, cannot start with __, and can only include letters, numbers, hyphens, and underscores (max 64 chars)';\n\nexport function isValidFieldName(name: string): boolean {\n if (name.length < 1 || name.length > FIELD_NAME_MAX_LENGTH) {\n return false;\n }\n return FIELD_NAME_PATTERN.test(name);\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport {\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from './FieldNameValidator';\n\nexport type ValidationErrorType =\n | 'empty-name'\n | 'duplicate-name'\n | 'invalid-name';\n\nexport interface ValidationError {\n nodeId: string;\n type: ValidationErrorType;\n message: string;\n}\n\nexport class SchemaValidator {\n validate(root: SchemaNode): ValidationError[] {\n const errors: ValidationError[] = [];\n this.collectValidationErrors(root, errors);\n return errors;\n }\n\n private collectValidationErrors(\n node: SchemaNode,\n errors: ValidationError[],\n ): void {\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const children = node.properties();\n const nameSet = new Set<string>();\n for (const child of children) {\n const name = child.name();\n if (!name) {\n errors.push({\n nodeId: child.id(),\n type: 'empty-name',\n message: 'Field name is required',\n });\n } else if (nameSet.has(name)) {\n errors.push({\n nodeId: child.id(),\n type: 'duplicate-name',\n message: `Duplicate field name: ${name}`,\n });\n } else if (!isValidFieldName(name)) {\n errors.push({\n nodeId: child.id(),\n type: 'invalid-name',\n message: FIELD_NAME_ERROR_MESSAGE,\n });\n }\n nameSet.add(name);\n this.collectValidationErrors(child, errors);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectValidationErrors(items, errors);\n }\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { SchemaTree } from '../tree/SchemaTree';\n\nexport interface FormulaValidationError {\n nodeId: string;\n message: string;\n fieldPath?: string;\n}\n\nexport class FormulaValidator {\n constructor(private readonly tree: SchemaTree) {}\n\n validate(): FormulaValidationError[] {\n const errors: FormulaValidationError[] = [];\n this.collectErrors(this.tree.root(), '', errors);\n return errors;\n }\n\n validateNode(\n nodeId: string,\n fieldPath?: string,\n ): FormulaValidationError | null {\n const formula = this.tree.getFormulaByNodeId(nodeId);\n if (!formula) {\n return null;\n }\n\n for (const dep of formula.dependencies()) {\n const targetNode = this.tree.nodeById(dep.targetNodeId());\n if (targetNode.isNull()) {\n return {\n nodeId,\n message: `Cannot resolve formula dependency: target node not found`,\n fieldPath: fieldPath || undefined,\n };\n }\n }\n\n return null;\n }\n\n private collectErrors(\n node: SchemaNode,\n currentPath: string,\n errors: FormulaValidationError[],\n ): void {\n if (node.isNull()) {\n return;\n }\n\n if (node.isPrimitive()) {\n const error = this.validateNode(node.id(), currentPath);\n if (error) {\n errors.push(error);\n }\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n const childPath = currentPath\n ? `${currentPath}.${child.name()}`\n : child.name();\n this.collectErrors(child, childPath, errors);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n const itemsPath = `${currentPath}[*]`;\n this.collectErrors(items, itemsPath, errors);\n }\n }\n }\n}\n","import { NodeType } from '../node/NodeType';\nimport { defaultRegistry } from '../parsing/index';\n\nexport type ParsedDefaultValue = string | number | boolean | undefined;\n\nexport function parseDefaultValue(\n valueStr: string,\n nodeType: NodeType,\n): ParsedDefaultValue {\n if (!valueStr) {\n return undefined;\n }\n\n const descriptor = defaultRegistry.getDescriptor(nodeType);\n if (descriptor) {\n return descriptor.parseDefaultValueString(valueStr) as ParsedDefaultValue;\n }\n\n return undefined;\n}\n","export type DataLossSeverity = 'none' | 'possible' | 'certain';\n\nexport interface TransformationStep {\n name: string;\n dataLossSeverity: DataLossSeverity;\n}\n\nexport interface TransformationInfo {\n fromType: string;\n toType: string;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n steps: TransformationStep[];\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface TransformationRule {\n fromType: SchemaType;\n toType: SchemaType;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n stepName: string;\n}\n\ninterface TransformationContext {\n fromType: SchemaType;\n toType: SchemaType;\n fromItemsType?: SchemaType;\n toItemsType?: SchemaType;\n}\n\nconst transformationRules: TransformationRule[] = [\n {\n fromType: 'number',\n toType: 'string',\n example: { before: 123, after: '123' },\n dataLossSeverity: 'none',\n stepName: 'number → string',\n },\n {\n fromType: 'boolean',\n toType: 'string',\n example: { before: true, after: 'true' },\n dataLossSeverity: 'none',\n stepName: 'boolean → string',\n },\n {\n fromType: 'boolean',\n toType: 'number',\n example: { before: true, after: 1 },\n dataLossSeverity: 'none',\n stepName: 'boolean → number',\n },\n {\n fromType: 'string',\n toType: 'number',\n example: { before: '123', after: 123 },\n dataLossSeverity: 'possible',\n stepName: 'string → number',\n },\n {\n fromType: 'string',\n toType: 'boolean',\n example: { before: 'hello', after: true },\n dataLossSeverity: 'possible',\n stepName: 'string → boolean',\n },\n {\n fromType: 'number',\n toType: 'boolean',\n example: { before: 42, after: true },\n dataLossSeverity: 'possible',\n stepName: 'number → boolean',\n },\n {\n fromType: 'object',\n toType: 'string',\n example: { before: { a: 1 }, after: '' },\n dataLossSeverity: 'certain',\n stepName: 'object → string',\n },\n {\n fromType: 'object',\n toType: 'number',\n example: { before: { a: 1 }, after: 0 },\n dataLossSeverity: 'certain',\n stepName: 'object → number',\n },\n {\n fromType: 'object',\n toType: 'boolean',\n example: { before: { a: 1 }, after: false },\n dataLossSeverity: 'certain',\n stepName: 'object → boolean',\n },\n {\n fromType: 'array',\n toType: 'string',\n example: { before: ['a', 'b'], after: 'a' },\n dataLossSeverity: 'possible',\n stepName: 'array → string (first element)',\n },\n {\n fromType: 'array',\n toType: 'number',\n example: { before: [1, 2], after: 1 },\n dataLossSeverity: 'possible',\n stepName: 'array → number (first element)',\n },\n {\n fromType: 'array',\n toType: 'boolean',\n example: { before: [true, false], after: true },\n dataLossSeverity: 'possible',\n stepName: 'array → boolean (first element)',\n },\n {\n fromType: 'string',\n toType: 'object',\n example: { before: 'hello', after: {} },\n dataLossSeverity: 'certain',\n stepName: 'string → object',\n },\n {\n fromType: 'number',\n toType: 'object',\n example: { before: 42, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'number → object',\n },\n {\n fromType: 'boolean',\n toType: 'object',\n example: { before: true, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'boolean → object',\n },\n {\n fromType: 'string',\n toType: 'array',\n example: { before: 'hello', after: ['hello'] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'number',\n toType: 'array',\n example: { before: 42, after: [42] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'boolean',\n toType: 'array',\n example: { before: true, after: [true] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'object',\n toType: 'array',\n example: { before: { a: 1 }, after: [] },\n dataLossSeverity: 'certain',\n stepName: 'object → array',\n },\n {\n fromType: 'array',\n toType: 'object',\n example: { before: [1, 2], after: {} },\n dataLossSeverity: 'certain',\n stepName: 'array → object',\n },\n];\n\nconst sampleValues: Record<SchemaType, unknown> = {\n string: 'hello',\n number: 42,\n boolean: true,\n object: { a: 1 },\n array: [1, 2],\n ref: null,\n unknown: null,\n};\n\nconst validSchemaTypes = new Set<SchemaType>([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'ref',\n 'unknown',\n]);\n\nfunction toSchemaType(typeStr: string): SchemaType {\n return validSchemaTypes.has(typeStr as SchemaType)\n ? (typeStr as SchemaType)\n : 'unknown';\n}\n\nfunction parseTypeString(typeStr: string): {\n baseType: SchemaType;\n itemsType?: SchemaType;\n} {\n const arrayMatch = /^array<(.+)>$/.exec(typeStr);\n if (arrayMatch?.[1]) {\n return { baseType: 'array', itemsType: toSchemaType(arrayMatch[1]) };\n }\n return { baseType: toSchemaType(typeStr) };\n}\n\nfunction findTransformationRule(\n fromType: SchemaType,\n toType: SchemaType,\n): TransformationRule | null {\n if (fromType === toType) {\n return null;\n }\n return (\n transformationRules.find(\n (rule) => rule.fromType === fromType && rule.toType === toType,\n ) ?? null\n );\n}\n\nfunction transformValue(\n value: unknown,\n fromType: SchemaType,\n toType: SchemaType,\n): unknown {\n if (fromType === toType) {\n return value;\n }\n switch (toType) {\n case 'string':\n return String(value);\n case 'number':\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return typeof value === 'number' ? value : 0;\n case 'boolean':\n return Boolean(value);\n default:\n return value;\n }\n}\n\nfunction getConversionSeverity(\n fromType: SchemaType,\n toType: SchemaType,\n): DataLossSeverity {\n if (fromType === toType) {\n return 'none';\n }\n const rule = findTransformationRule(fromType, toType);\n return rule ? rule.dataLossSeverity : 'certain';\n}\n\nfunction maxSeverity(\n a: DataLossSeverity,\n b: DataLossSeverity,\n): DataLossSeverity {\n const order: DataLossSeverity[] = ['none', 'possible', 'certain'];\n return order[Math.max(order.indexOf(a), order.indexOf(b))] ?? 'certain';\n}\n\nfunction computeOverallSeverity(steps: TransformationStep[]): DataLossSeverity {\n return steps.reduce<DataLossSeverity>(\n (acc, step) => maxSeverity(acc, step.dataLossSeverity),\n 'none',\n );\n}\n\nfunction buildTransformationSteps(\n ctx: TransformationContext,\n): TransformationStep[] {\n const { fromType, toType, fromItemsType, toItemsType } = ctx;\n const steps: TransformationStep[] = [];\n\n if (\n toType === 'array' &&\n toItemsType !== undefined &&\n fromType !== 'array' &&\n fromType !== 'object'\n ) {\n steps.push({ name: 'wrap in array', dataLossSeverity: 'none' });\n if (fromType !== toItemsType) {\n const severity = getConversionSeverity(fromType, toItemsType);\n steps.push({\n name: `${fromType} → ${toItemsType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'array' &&\n fromItemsType !== undefined &&\n toType !== 'array' &&\n toType !== 'object'\n ) {\n steps.push({\n name: 'unwrap array (first element)',\n dataLossSeverity: 'possible',\n });\n if (fromItemsType !== toType) {\n const severity = getConversionSeverity(fromItemsType, toType);\n steps.push({\n name: `${fromItemsType} → ${toType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'object' ||\n toType === 'object' ||\n fromType === 'array' ||\n toType === 'array'\n ) {\n steps.push({\n name: `${fromType} → ${toType}`,\n dataLossSeverity: 'certain',\n });\n } else {\n const severity = getConversionSeverity(fromType, toType);\n steps.push({ name: `${fromType} → ${toType}`, dataLossSeverity: severity });\n }\n\n return steps;\n}\n\nfunction computeArrayTransformationExample(\n fromType: SchemaType,\n itemsType: SchemaType,\n): { before: unknown; after: unknown } {\n const before = sampleValues[fromType];\n const transformedValue = transformValue(before, fromType, itemsType);\n return { before, after: [transformedValue] };\n}\n\nfunction computeArrayToPrimitiveExample(\n fromItemsType: SchemaType,\n toType: SchemaType,\n): { before: unknown; after: unknown } {\n const itemValue = sampleValues[fromItemsType];\n const before = [itemValue, itemValue];\n const after = transformValue(itemValue, fromItemsType, toType);\n return { before, after };\n}\n\nexport function getTransformationInfoFromTypeChange(\n fromType: string,\n toType: string,\n): TransformationInfo | null {\n if (fromType === toType) {\n return null;\n }\n\n const from = parseTypeString(fromType);\n const to = parseTypeString(toType);\n\n if (from.baseType === 'unknown' || to.baseType === 'unknown') {\n return null;\n }\n\n if (\n to.baseType === 'array' &&\n to.itemsType &&\n from.baseType !== 'array' &&\n from.baseType !== 'object'\n ) {\n const example = computeArrayTransformationExample(\n from.baseType,\n to.itemsType,\n );\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n toItemsType: to.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n if (\n from.baseType === 'array' &&\n from.itemsType &&\n to.baseType !== 'array' &&\n to.baseType !== 'object'\n ) {\n const example = computeArrayToPrimitiveExample(from.itemsType, to.baseType);\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n fromItemsType: from.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n const rule = findTransformationRule(from.baseType, to.baseType);\n if (rule) {\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n });\n return {\n fromType,\n toType,\n example: rule.example,\n dataLossSeverity: rule.dataLossSeverity,\n steps,\n };\n }\n\n return {\n fromType,\n toType,\n example: { before: '?', after: '?' },\n dataLossSeverity: 'certain',\n steps: [\n {\n name: `${from.baseType} → ${to.baseType}`,\n dataLossSeverity: 'certain',\n },\n ],\n };\n}\n","import type { JsonSchemaType } from '../schema/JsonSchema';\n\nexport interface DefaultValueExample {\n value: unknown;\n type: string;\n foreignKeyTableId?: string;\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\nfunction getTypeFromSchema(schema: JsonSchemaType): SchemaType {\n if ('$ref' in schema) {\n return 'ref';\n }\n if ('type' in schema) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: JsonSchemaType): string | undefined {\n if ('type' in schema && schema.type === 'string' && 'foreignKey' in schema) {\n const fk = (schema as { foreignKey?: string }).foreignKey;\n return fk || undefined;\n }\n return undefined;\n}\n\nfunction getDefaultForPrimitive(\n schema: JsonSchemaType,\n fallback: unknown,\n): unknown {\n return 'default' in schema ? schema.default : fallback;\n}\n\nfunction getDefaultForArray(schema: JsonSchemaType): unknown {\n if ('default' in schema) {\n return schema.default;\n }\n const arrSchema = schema as { items?: JsonSchemaType };\n if (arrSchema.items) {\n return [getDefaultValueFromSchema(arrSchema.items)];\n }\n return [];\n}\n\nfunction getDefaultForObject(schema: JsonSchemaType): unknown {\n if ('default' in schema) {\n return schema.default;\n }\n const objSchema = schema as { properties?: Record<string, JsonSchemaType> };\n if (!objSchema.properties) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(objSchema.properties).map(([key, propSchema]) => [\n key,\n getDefaultValueFromSchema(propSchema),\n ]),\n );\n}\n\nconst typeHandlers: Record<string, (schema: JsonSchemaType) => unknown> = {\n string: (schema) => getDefaultForPrimitive(schema, ''),\n number: (schema) => getDefaultForPrimitive(schema, 0),\n boolean: (schema) => getDefaultForPrimitive(schema, false),\n array: getDefaultForArray,\n object: getDefaultForObject,\n};\n\nexport function getDefaultValueFromSchema(schema: JsonSchemaType): unknown {\n if ('$ref' in schema) {\n return null;\n }\n\n if (!('type' in schema)) {\n return null;\n }\n\n const handler = typeHandlers[schema.type];\n return handler ? handler(schema) : null;\n}\n\ninterface AddPatch {\n op: 'add';\n path: string;\n value: JsonSchemaType;\n}\n\nexport function getDefaultValueExample(\n patch: AddPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add') {\n return null;\n }\n\n const value = getDefaultValueFromSchema(patch.value);\n const type = getTypeFromSchema(patch.value);\n const foreignKeyTableId = getForeignKeyTableId(patch.value);\n\n return { value, type, foreignKeyTableId };\n}\n","import { makeAutoObservable } from 'mobx';\nimport { SchemaTree } from '../tree/SchemaTree';\nimport { SchemaDiff } from '../diff/SchemaDiff';\nimport { SchemaParser } from '../schema/SchemaParser';\nimport { SchemaValidator } from '../validation/SchemaValidator';\nimport { FormulaValidator } from '../validation/FormulaValidator';\nimport { ParsedFormula, FormulaError } from '../formula';\nimport { NodeFactory } from '../node/NodeFactory';\nimport { NodeType } from '../node/NodeType';\nimport { NULL_NODE } from '../node/NullNode';\nimport type { JsonObjectSchema } from '../schema/JsonSchema';\nimport type { SchemaPatch } from '../diff/index';\nimport type { ValidationError } from '../validation/SchemaValidator';\nimport type { FormulaValidationError } from '../validation/FormulaValidator';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { FormulaDependent } from '../formula';\nimport type { StringNode } from '../node/StringNode';\n\nexport interface ReplaceResult {\n replacedNodeId: string;\n newNodeId: string;\n}\n\nexport interface FormulaUpdateResult {\n success: boolean;\n error?: string;\n}\n\ninterface FormulaParseError {\n nodeId: string;\n expression: string;\n message: string;\n}\n\nexport class SchemaEngine {\n private readonly _tree: SchemaTree;\n private readonly _diff: SchemaDiff;\n private readonly _schemaValidator = new SchemaValidator();\n private readonly _formulaValidator: FormulaValidator;\n private _formulaParseErrors: FormulaParseError[] = [];\n\n constructor(jsonSchema: JsonObjectSchema) {\n const parser = new SchemaParser();\n const root = parser.parse(jsonSchema);\n this._tree = new SchemaTree(root);\n this._formulaValidator = new FormulaValidator(this._tree);\n\n this._formulaParseErrors = this.applyPendingFormulas(\n parser.getPendingFormulas(),\n );\n\n this._diff = new SchemaDiff(this._tree);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private applyPendingFormulas(\n pending: { nodeId: string; expression: string }[],\n ): FormulaParseError[] {\n const errors: FormulaParseError[] = [];\n\n for (const { nodeId, expression } of pending) {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n continue;\n }\n\n try {\n const formula = new ParsedFormula(this._tree, nodeId, expression);\n node.setFormula(formula);\n this._tree.registerFormula(nodeId, formula);\n } catch (error) {\n const message = this.extractErrorMessage(error);\n errors.push({ nodeId, expression, message });\n }\n }\n\n return errors;\n }\n\n private extractErrorMessage(error: unknown): string {\n if (error instanceof FormulaError) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'Unknown formula error';\n }\n\n public get tree(): SchemaTree {\n return this._tree;\n }\n\n public get diff(): SchemaDiff {\n return this._diff;\n }\n\n public root(): SchemaNode {\n return this._tree.root();\n }\n\n public nodeById(nodeId: string): SchemaNode {\n return this._tree.nodeById(nodeId);\n }\n\n public countNodes(): number {\n return this._tree.countNodes();\n }\n\n public getFormulaDependents(nodeId: string): FormulaDependent[] {\n return this._tree.getDirectFormulaDependents(nodeId);\n }\n\n public get isDirty(): boolean {\n return this._diff.isDirty();\n }\n\n public get isValid(): boolean {\n const root = this._tree.root();\n if (root.isNull()) {\n return false;\n }\n if (root.isObject()) {\n return root.properties().length > 0;\n }\n return true;\n }\n\n public get validationErrors(): readonly ValidationError[] {\n return this._schemaValidator.validate(this._tree.root());\n }\n\n public validateFormulas(): FormulaValidationError[] {\n const validatorErrors = this._formulaValidator.validate();\n const parseErrors: FormulaValidationError[] = this._formulaParseErrors.map(\n (e) => ({\n nodeId: e.nodeId,\n message: e.message,\n }),\n );\n return [...parseErrors, ...validatorErrors];\n }\n\n public markAsSaved(): void {\n this._diff.markAsSaved();\n }\n\n public revert(): void {\n const baseSchema = this._diff.getBaseSchema();\n const parser = new SchemaParser();\n const root = parser.parse(baseSchema);\n\n this._tree.clearFormulaIndex();\n this._tree.replaceRoot(root);\n this._formulaParseErrors = this.applyPendingFormulas(\n parser.getPendingFormulas(),\n );\n\n this._diff.markAsSaved();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._diff.getPatches();\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._diff.getCurrentSchema();\n }\n\n public canMoveNode(fromNodeId: string, toNodeId: string): boolean {\n return this._tree.canMoveNode(fromNodeId, toNodeId);\n }\n\n public hasValidDropTarget(nodeId: string): boolean {\n return this._tree.hasValidDropTarget(nodeId);\n }\n\n public moveNode(nodeId: string, targetObjectId: string): void {\n if (!this.canMoveNode(nodeId, targetObjectId)) {\n return;\n }\n this._tree.moveNode(nodeId, targetObjectId);\n }\n\n public renameNode(nodeId: string, newName: string): void {\n this._tree.renameNode(nodeId, newName);\n }\n\n public updateNodeMetadata(\n nodeId: string,\n metadata: { description?: string; deprecated?: boolean },\n ): void {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n const currentMeta = node.metadata();\n node.setMetadata({\n description:\n 'description' in metadata\n ? metadata.description || undefined\n : currentMeta.description,\n deprecated:\n 'deprecated' in metadata ? metadata.deprecated : currentMeta.deprecated,\n });\n }\n\n public updateDefaultValue(\n nodeId: string,\n value: string | number | boolean | undefined,\n ): void {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n node.setDefaultValue(value);\n }\n\n public addChild(parentId: string, name: string): SchemaNode {\n const parent = this._tree.nodeById(parentId);\n if (parent.isNull() || !parent.isObject()) {\n return NULL_NODE;\n }\n const newNode = NodeFactory.string(name);\n this._tree.addChildTo(parentId, newNode);\n return newNode;\n }\n\n public removeNode(nodeId: string): boolean {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return false;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return false;\n }\n this._tree.removeNodeAt(path);\n return true;\n }\n\n public replaceNode(\n nodeId: string,\n newNode: SchemaNode,\n ): ReplaceResult | null {\n const currentNode = this._tree.nodeById(nodeId);\n if (currentNode.isNull()) {\n return null;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return null;\n }\n this._tree.setNodeAt(path, newNode);\n this._diff.trackReplacement(nodeId, newNode.id());\n return {\n replacedNodeId: nodeId,\n newNodeId: newNode.id(),\n };\n }\n\n public wrapInArray(nodeId: string): ReplaceResult | null {\n const currentNode = this._tree.nodeById(nodeId);\n if (currentNode.isNull()) {\n return null;\n }\n if (currentNode.isArray()) {\n return null;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return null;\n }\n const name = currentNode.name();\n const arrayNode = NodeFactory.array(name, currentNode);\n this._tree.setNodeAt(path, arrayNode);\n currentNode.setName('');\n this._diff.trackReplacement(nodeId, arrayNode.id());\n return {\n replacedNodeId: nodeId,\n newNodeId: arrayNode.id(),\n };\n }\n\n public replaceRootWith(newNode: SchemaNode): ReplaceResult | null {\n const currentRoot = this._tree.root();\n if (currentRoot.isNull()) {\n return null;\n }\n const oldId = currentRoot.id();\n newNode.setName(currentRoot.name());\n this._tree.replaceRoot(newNode);\n this._diff.trackReplacement(oldId, newNode.id());\n return {\n replacedNodeId: oldId,\n newNodeId: newNode.id(),\n };\n }\n\n public wrapRootInArray(): ReplaceResult | null {\n const currentRoot = this._tree.root();\n if (currentRoot.isNull() || currentRoot.isArray()) {\n return null;\n }\n const oldId = currentRoot.id();\n const name = currentRoot.name();\n const arrayNode = NodeFactory.array(name, currentRoot);\n currentRoot.setName('');\n this._tree.replaceRoot(arrayNode);\n this._diff.trackReplacement(oldId, arrayNode.id());\n return {\n replacedNodeId: oldId,\n newNodeId: arrayNode.id(),\n };\n }\n\n public updateForeignKey(nodeId: string, tableId: string): boolean {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull() || node.nodeType() !== NodeType.String) {\n return false;\n }\n (node as StringNode).setForeignKey(tableId || undefined);\n return true;\n }\n\n public updateFormula(\n nodeId: string,\n expression: string | undefined,\n ): FormulaUpdateResult {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return { success: false, error: 'Node not found' };\n }\n try {\n const formula = expression\n ? new ParsedFormula(this._tree, nodeId, expression)\n : undefined;\n node.setFormula(formula);\n if (formula) {\n this._tree.registerFormula(nodeId, formula);\n } else {\n this._tree.unregisterFormula(nodeId);\n }\n this._formulaParseErrors = this._formulaParseErrors.filter(\n (e) => e.nodeId !== nodeId,\n );\n return { success: true };\n } catch (error) {\n const errorMessage =\n error instanceof FormulaError ? error.message : String(error);\n return { success: false, error: errorMessage };\n }\n }\n\n public createStringNode(name: string): SchemaNode {\n return NodeFactory.string(name);\n }\n\n public createNumberNode(name: string): SchemaNode {\n return NodeFactory.number(name);\n }\n}\n","import { SystemSchemaIds, getLabelByRef } from '../types';\nimport { NodeFactory, type SchemaNode } from '../model';\n\nexport enum SchemaTypeIds {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n Object = 'Object',\n Array = 'Array',\n ForeignKeyString = 'ForeignKeyString',\n File = 'File',\n RowId = 'RowId',\n RowVersionId = 'RowVersionId',\n RowCreatedId = 'RowCreatedId',\n RowCreatedAt = 'RowCreatedAt',\n RowPublishedAt = 'RowPublishedAt',\n RowUpdatedAt = 'RowUpdatedAt',\n RowHash = 'RowHash',\n RowSchemaHash = 'RowSchemaHash',\n Markdown = 'Markdown',\n}\n\nexport function createNodeByTypeId(\n typeId: SchemaTypeIds | string,\n name: string,\n): SchemaNode | null {\n switch (typeId as SchemaTypeIds) {\n case SchemaTypeIds.String:\n return NodeFactory.string(name);\n case SchemaTypeIds.Number:\n return NodeFactory.number(name);\n case SchemaTypeIds.Boolean:\n return NodeFactory.boolean(name);\n case SchemaTypeIds.Object:\n return NodeFactory.object(name);\n case SchemaTypeIds.Array:\n return NodeFactory.array(name, NodeFactory.string(''));\n case SchemaTypeIds.ForeignKeyString:\n return NodeFactory.string(name, { foreignKey: '' });\n case SchemaTypeIds.File:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.File });\n case SchemaTypeIds.RowId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowId });\n case SchemaTypeIds.RowVersionId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowVersionId });\n case SchemaTypeIds.RowCreatedId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowCreatedId });\n case SchemaTypeIds.RowCreatedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowCreatedAt });\n case SchemaTypeIds.RowPublishedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowPublishedAt });\n case SchemaTypeIds.RowUpdatedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowUpdatedAt });\n case SchemaTypeIds.RowHash:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowHash });\n case SchemaTypeIds.RowSchemaHash:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowSchemaHash });\n case SchemaTypeIds.Markdown:\n return NodeFactory.string(name, { contentMediaType: 'text/markdown' });\n default:\n return null;\n }\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\ntype MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\ntype MenuGroup = {\n id: string;\n options: MenuOptionItem[];\n addDividerAfter?: boolean;\n};\n\nconst typesOptions: MenuOptionItem[] = [\n { id: SchemaTypeIds.String, label: 'string' },\n { id: SchemaTypeIds.Number, label: 'number' },\n { id: SchemaTypeIds.Boolean, label: 'boolean' },\n { id: SchemaTypeIds.Object, label: 'object' },\n { id: SchemaTypeIds.Array, label: 'array' },\n { id: SchemaTypeIds.ForeignKeyString, label: 'foreign key' },\n];\n\nconst schemasOptions: MenuOptionItem[] = [\n {\n id: 'schemas-submenu',\n label: 'Schemas',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.File, label: getLabelByRef(SystemSchemaIds.File) },\n { id: SchemaTypeIds.Markdown, label: 'Markdown' },\n ],\n },\n];\n\nconst systemFieldsOptions: MenuOptionItem[] = [\n {\n id: 'system-fields-submenu',\n label: 'System fields',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.RowId, label: getLabelByRef(SystemSchemaIds.RowId) },\n {\n id: SchemaTypeIds.RowVersionId,\n label: getLabelByRef(SystemSchemaIds.RowVersionId),\n },\n {\n id: SchemaTypeIds.RowCreatedId,\n label: getLabelByRef(SystemSchemaIds.RowCreatedId),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowCreatedAt,\n label: getLabelByRef(SystemSchemaIds.RowCreatedAt),\n },\n {\n id: SchemaTypeIds.RowPublishedAt,\n label: getLabelByRef(SystemSchemaIds.RowPublishedAt),\n },\n {\n id: SchemaTypeIds.RowUpdatedAt,\n label: getLabelByRef(SystemSchemaIds.RowUpdatedAt),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowHash,\n label: getLabelByRef(SystemSchemaIds.RowHash),\n },\n {\n id: SchemaTypeIds.RowSchemaHash,\n label: getLabelByRef(SystemSchemaIds.RowSchemaHash),\n },\n ],\n },\n];\n\nexport const typeMenuGroups: MenuGroup[] = [\n { id: 'types', options: typesOptions, addDividerAfter: true },\n { id: 'schemas', options: schemasOptions, addDividerAfter: true },\n { id: 'system-fields', options: systemFieldsOptions },\n];\n\nexport type { MenuOptionItem, MenuGroup };\n","import { JsonSchemaTypeName, SystemSchemaIds } from '../types';\nimport type { JsonObjectSchema } from '../model';\n\nexport const fileSchema: JsonObjectSchema = {\n type: JsonSchemaTypeName.Object,\n properties: {\n status: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n fileId: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n url: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n fileName: { type: JsonSchemaTypeName.String, default: '' },\n hash: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n extension: {\n type: JsonSchemaTypeName.String,\n default: '',\n readOnly: true,\n },\n mimeType: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n size: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n width: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n height: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n },\n required: [\n 'status',\n 'fileId',\n 'url',\n 'fileName',\n 'hash',\n 'extension',\n 'mimeType',\n 'size',\n 'width',\n 'height',\n ],\n additionalProperties: false,\n};\n\nexport const systemSchemaRegistry: Record<string, JsonObjectSchema> = {\n [SystemSchemaIds.File]: fileSchema,\n};\n\nexport const getResolvedSchema = (ref: string): JsonObjectSchema | null => {\n if (Object.hasOwn(systemSchemaRegistry, ref)) {\n return systemSchemaRegistry[ref] ?? null;\n }\n return null;\n};\n\nexport const isResolvableRef = (ref: string): boolean => {\n return Object.hasOwn(systemSchemaRegistry, ref);\n};\n","import type { SchemaNode } from '../model';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM as ObjectNodeVMType } from './ObjectNodeVM';\nimport type { ArrayNodeVM as ArrayNodeVMType } from './ArrayNodeVM';\nimport type { PrimitiveNodeVM as PrimitiveNodeVMType } from './PrimitiveNodeVM';\nimport type { RefNodeVM as RefNodeVMType } from './RefNodeVM';\nimport type { ForeignKeyNodeVM as ForeignKeyNodeVMType } from './ForeignKeyNodeVM';\n\nexport type NodeVM =\n | ObjectNodeVMType\n | ArrayNodeVMType\n | PrimitiveNodeVMType\n | RefNodeVMType\n | ForeignKeyNodeVMType;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NodeVMClass = new (...args: any[]) => NodeVM;\n\ninterface VMRegistry {\n ObjectNodeVM?: NodeVMClass;\n ArrayNodeVM?: NodeVMClass;\n PrimitiveNodeVM?: NodeVMClass;\n RefNodeVM?: NodeVMClass;\n ForeignKeyNodeVM?: NodeVMClass;\n}\n\nconst registry: VMRegistry = {};\n\nexport function registerVMClass(\n name: keyof VMRegistry,\n VMClass: NodeVMClass,\n): void {\n registry[name] = VMClass;\n}\n\nexport function createNodeVM(\n node: SchemaNode,\n editor: SchemaEditorVM,\n parent: ObjectNodeVMType | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n): NodeVM {\n if (node.isObject()) {\n const VMClass = registry.ObjectNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ObjectNodeVM not registered. Import ObjectNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(node, editor, parent, isRoot, isReadonly);\n }\n\n if (node.isArray()) {\n const VMClass = registry.ArrayNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ArrayNodeVM not registered. Import ArrayNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(node, editor, parent, isRoot, isReadonly);\n }\n\n if (node.isRef()) {\n const VMClass = registry.RefNodeVM;\n if (!VMClass) {\n throw new Error(\n 'RefNodeVM not registered. Import RefNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n }\n\n if (node.foreignKey() !== undefined) {\n const VMClass = registry.ForeignKeyNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ForeignKeyNodeVM not registered. Import ForeignKeyNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n }\n\n const VMClass = registry.PrimitiveNodeVM;\n if (!VMClass) {\n throw new Error(\n 'PrimitiveNodeVM not registered. Import PrimitiveNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { getLabelByRef } from '../types';\nimport { NodeType, type SchemaNode, type FormulaDependent } from '../model';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\n\nexport abstract class BaseNodeVM {\n public isFocusedState = false;\n public isMenuOpenState = false;\n public isSettingsOpenState = false;\n\n constructor(\n protected readonly _node: SchemaNode,\n protected readonly _editor: SchemaEditorVM,\n protected readonly _isRoot: boolean = false,\n protected readonly _isReadonly: boolean = false,\n ) {\n makeObservable(this, {\n isFocusedState: observable,\n isMenuOpenState: observable,\n isSettingsOpenState: observable,\n nodeId: computed,\n name: computed,\n path: computed,\n type: computed,\n label: computed,\n isFocused: computed,\n isMenuOpen: computed,\n isSettingsOpen: computed,\n shouldApplyFieldStyles: computed,\n isCollapsible: computed,\n isObject: computed,\n isArray: computed,\n isPrimitive: computed,\n isString: computed,\n isNumber: computed,\n isBoolean: computed,\n showTypeSelector: computed,\n showMenu: computed,\n hasDescription: computed,\n isDeprecated: computed,\n description: computed,\n hasFormula: computed,\n formula: computed,\n formulaDependents: computed,\n canDelete: computed,\n deleteBlockedReason: computed,\n defaultValue: computed,\n defaultValueAsString: computed,\n validationError: computed,\n hasError: computed,\n errorMessage: computed,\n canDrag: computed,\n isValidDropTarget: computed,\n isReadonly: computed,\n setFocused: action.bound,\n setMenuOpen: action.bound,\n setSettingsOpen: action.bound,\n rename: action.bound,\n setDescription: action.bound,\n setDeprecated: action.bound,\n setFormula: action.bound,\n setDefault: action.bound,\n handleFieldBlur: action.bound,\n });\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get node(): SchemaNode {\n return this._node;\n }\n\n public get nodeId(): string {\n return this._node.id();\n }\n\n public get isRoot(): boolean {\n return this._isRoot;\n }\n\n public get name(): string {\n if (this._isRoot) {\n return this._editor.tableId;\n }\n return this._node.name();\n }\n\n public get path(): string {\n return this._node.name();\n }\n\n public get type(): string {\n if (this._node.isRef()) {\n return 'ref';\n }\n return this._node.nodeType();\n }\n\n public get label(): string {\n if (this._node.isRef()) {\n const ref = this._node.ref();\n return getLabelByRef(ref) ?? ref;\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n return this._node.nodeType();\n }\n\n public get isFocused(): boolean {\n return this.isFocusedState;\n }\n\n public get isMenuOpen(): boolean {\n return this.isMenuOpenState;\n }\n\n public get isSettingsOpen(): boolean {\n return this.isSettingsOpenState;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.isFocusedState && !this.isMenuOpenState && !this.isSettingsOpenState\n );\n }\n\n public setFocused(value: boolean): void {\n this.isFocusedState = value;\n }\n\n public setMenuOpen(value: boolean): void {\n this.isMenuOpenState = value;\n }\n\n public setSettingsOpen(value: boolean): void {\n this.isSettingsOpenState = value;\n }\n\n public get isCollapsible(): boolean {\n return false;\n }\n\n public get isObject(): boolean {\n return this._node.isObject();\n }\n\n public get isArray(): boolean {\n return this._node.isArray();\n }\n\n public get isPrimitive(): boolean {\n return this._node.isPrimitive();\n }\n\n public get isString(): boolean {\n return this._node.nodeType() === NodeType.String;\n }\n\n public get isNumber(): boolean {\n return this._node.nodeType() === NodeType.Number;\n }\n\n public get isBoolean(): boolean {\n return this._node.nodeType() === NodeType.Boolean;\n }\n\n public get showTypeSelector(): boolean {\n return !this._isReadonly;\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public get hasDescription(): boolean {\n return Boolean(this._node.metadata().description);\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get description(): string {\n return this._node.metadata().description ?? '';\n }\n\n public get hasFormula(): boolean {\n return false;\n }\n\n public get formula(): string {\n return '';\n }\n\n public get formulaDependents(): FormulaDependent[] {\n return [];\n }\n\n public get canDelete(): boolean {\n return true;\n }\n\n public get deleteBlockedReason(): string | null {\n return null;\n }\n\n public get defaultValue(): unknown {\n return undefined;\n }\n\n public get defaultValueAsString(): string {\n return '';\n }\n\n public get validationError(): string | null {\n if (this._isRoot && this._editor.tableIdError) {\n return this._editor.tableIdError;\n }\n const errors = this._editor.engine.validationErrors;\n const error = errors.find((e) => e.nodeId === this.nodeId);\n return error?.message ?? null;\n }\n\n public get hasError(): boolean {\n return this.validationError !== null;\n }\n\n public get errorMessage(): string | null {\n return this.validationError;\n }\n\n public get canDrag(): boolean {\n if (this._isReadonly || this._isRoot || !this._node.name()) {\n return false;\n }\n return this._editor.engine.hasValidDropTarget(this.nodeId);\n }\n\n public get isValidDropTarget(): boolean {\n return false;\n }\n\n public rename(newName: string): void {\n if (newName !== this.name) {\n if (this._isRoot) {\n this._editor.setTableId(newName);\n } else {\n this._editor.engine.renameNode(this.nodeId, newName);\n }\n }\n }\n\n public setDescription(value: string): void {\n this._editor.engine.updateNodeMetadata(this.nodeId, { description: value });\n }\n\n public setDeprecated(value: boolean): void {\n this._editor.engine.updateNodeMetadata(this.nodeId, { deprecated: value });\n }\n\n public setFormula(_expression: string): void {\n // Override in subclasses that support formulas\n }\n\n public setDefault(_value: string): void {\n // Override in subclasses that support default values\n }\n\n public handleFieldBlur(): void {\n this.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.removeSelf();\n }\n }\n\n public canAcceptDrop(fromNodeId: string): boolean {\n return this._editor.engine.canMoveNode(fromNodeId, this.nodeId);\n }\n\n public remove(): void {\n this.removeSelf();\n }\n\n public abstract removeSelf(): void;\n public abstract changeType(typeId: string): void;\n}\n","import { makeObservable, observable, computed, action, override } from 'mobx';\nimport {\n parseDefaultValue,\n FormulaSerializer,\n type SchemaNode,\n type FormulaDependent,\n} from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { registerVMClass } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\ntype PrimitiveValue = string | number | boolean | undefined;\n\nexport class PrimitiveNodeVM extends BaseNodeVM {\n public formulaInputValue: string | null = null;\n public formulaErrorValue: string | null = null;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n makeObservable(this, {\n formulaInputValue: observable,\n formulaErrorValue: observable,\n hasFormula: override,\n formula: override,\n defaultValue: override,\n defaultValueAsString: override,\n formulaError: computed,\n formulaDependents: override,\n canDelete: override,\n deleteBlockedReason: override,\n setFormula: override,\n setDefault: override,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get formula(): string {\n if (this.formulaInputValue !== null) {\n return this.formulaInputValue;\n }\n const formula = this._node.formula();\n if (!formula) {\n return '';\n }\n return new FormulaSerializer(\n this._editor.engine.tree,\n this.nodeId,\n formula,\n ).serialize();\n }\n\n public get defaultValue(): PrimitiveValue {\n return this._node.defaultValue() as PrimitiveValue;\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined) {\n return '';\n }\n return String(value);\n }\n\n public get formulaError(): string | null {\n if (this.formulaErrorValue) {\n return this.formulaErrorValue;\n }\n const errors = this._editor.engine.validateFormulas();\n const error = errors.find((e) => e.nodeId === this.nodeId);\n return error?.message ?? null;\n }\n\n public override get hasError(): boolean {\n return this.validationError !== null || this.formulaError !== null;\n }\n\n public override get errorMessage(): string | null {\n return this.validationError ?? this.formulaError ?? null;\n }\n\n public get formulaDependents(): FormulaDependent[] {\n return this._editor.engine.getFormulaDependents(this.nodeId);\n }\n\n public get canDelete(): boolean {\n return this._parent !== null && this.formulaDependents.length === 0;\n }\n\n public get deleteBlockedReason(): string | null {\n const dependents = this.formulaDependents;\n if (dependents.length === 0) {\n return null;\n }\n const fieldNames = dependents.map((d) => d.fieldName).join(', ');\n return `Used by formulas: ${fieldNames}`;\n }\n\n public setFormula(expression: string): void {\n this.formulaInputValue = expression || null;\n const result = this._editor.engine.updateFormula(\n this.nodeId,\n expression || undefined,\n );\n if (result.success) {\n this.formulaErrorValue = null;\n } else if (result.error) {\n this.formulaErrorValue = result.error;\n }\n }\n\n public setDefault(valueStr: string): void {\n const value = parseDefaultValue(valueStr, this._node.nodeType());\n this._editor.engine.updateDefaultValue(this.nodeId, value);\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('PrimitiveNodeVM', PrimitiveNodeVM);\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class ArrayNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean;\n public itemsVMRef: NodeVM | null = null;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this.isCollapsedState = editor.shouldCollapseAll && !isRoot;\n\n makeObservable(this, {\n isCollapsedState: observable,\n itemsVMRef: observable.ref,\n isCollapsed: computed,\n itemsVM: computed,\n toggleCollapsed: action.bound,\n changeItemsType: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n this.initItemsVM();\n }\n\n private initItemsVM(): void {\n const items = this._node.items();\n if (!items.isNull()) {\n this.itemsVMRef = createNodeVM(items, this._editor, null);\n }\n }\n\n public override get isCollapsible(): boolean {\n return !this._isRoot;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get itemsVM(): NodeVM | null {\n return this.itemsVMRef;\n }\n\n public changeItemsType(typeId: string): void {\n if (!this.itemsVMRef) {\n return;\n }\n\n const currentItems = this._node.items();\n if (currentItems.isNull()) {\n return;\n }\n\n const newNode = this._editor.createNodeByTypeId(typeId, '');\n if (!newNode) {\n return;\n }\n\n const result = this._editor.engine.replaceNode(currentItems.id(), newNode);\n if (result) {\n this.itemsVMRef = createNodeVM(newNode, this._editor, null);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('ArrayNodeVM', ArrayNodeVM);\n","import { makeObservable, computed, action, override } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { registerVMClass } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class ForeignKeyNodeVM extends BaseNodeVM {\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n makeObservable(this, {\n label: override,\n foreignKeyValue: computed,\n setForeignKey: action.bound,\n selectForeignKey: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n }\n\n public override get label(): string {\n return 'foreign key';\n }\n\n public get foreignKeyValue(): string {\n return this._node.foreignKey() ?? '';\n }\n\n public setForeignKey(tableId: string | null): void {\n this._editor.engine.updateForeignKey(this.nodeId, tableId ?? '');\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._editor.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('ForeignKeyNodeVM', ForeignKeyNodeVM);\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode, SchemaParser } from '../model';\nimport { isResolvableRef, getResolvedSchema } from '../config/system-schemas';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class RefNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean = true;\n public childrenList: NodeVM[] = [];\n private readonly _isResolvable: boolean;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this._isResolvable = isResolvableRef(node.ref());\n\n makeObservable(this, {\n isCollapsedState: observable,\n childrenList: observable.shallow,\n isCollapsed: computed,\n children: computed,\n toggleCollapsed: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n if (this._isResolvable) {\n this.initResolvedChildren();\n }\n }\n\n private initResolvedChildren(): void {\n const resolvedSchema = getResolvedSchema(this._node.ref());\n if (!resolvedSchema) {\n return;\n }\n\n const parser = new SchemaParser();\n const resolvedRoot = parser.parse(resolvedSchema);\n\n this.childrenList = resolvedRoot\n .properties()\n .map((child) => createNodeVM(child, this._editor, null, false, true));\n }\n\n public get ref(): string {\n return this._node.ref();\n }\n\n public override get isCollapsible(): boolean {\n return this._isResolvable;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get children(): readonly NodeVM[] {\n return this.childrenList;\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('RefNodeVM', RefNodeVM);\n","import { makeAutoObservable } from 'mobx';\nimport { ViewerSwitcherMode } from '../types';\nimport {\n SchemaEngine,\n getDefaultValueFromSchema,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type ValidationError,\n type FormulaValidationError,\n type SchemaNode,\n} from '../model';\nimport {\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '../model/validation/FieldNameValidator';\nimport { createNodeByTypeId, SchemaTypeIds } from '../config';\nimport { createNodeVM, type NodeVM } from './createNodeVM';\nimport { PrimitiveNodeVM } from './PrimitiveNodeVM';\n\n// Import all VM classes to ensure they are registered\nimport './ArrayNodeVM';\nimport './ForeignKeyNodeVM';\nimport './RefNodeVM';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type SchemaEditorMode = 'creating' | 'updating';\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorOptions {\n tableId?: string;\n mode?: SchemaEditorMode;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onApprove?: () => Promise<boolean>;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorVM {\n private readonly _engine: SchemaEngine;\n private _rootNodeVM: NodeVM;\n\n private _tableId: string;\n private _initialTableId: string;\n private readonly _shouldCollapseAll: boolean;\n private readonly _mode: SchemaEditorMode;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n private _loading = false;\n private _viewMode: ViewerSwitcherMode = ViewerSwitcherMode.Tree;\n private _isChangesDialogOpen = false;\n private _createDialogViewMode: 'Example' | 'Schema' = 'Example';\n\n constructor(jsonSchema: JsonObjectSchema, options: SchemaEditorOptions = {}) {\n this._engine = new SchemaEngine(jsonSchema);\n\n this._tableId = options.tableId ?? '';\n this._initialTableId = this._tableId;\n this._mode = options.mode ?? 'creating';\n this._onApprove = options.onApprove ?? null;\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n const nodeCount = this._engine.countNodes();\n this._shouldCollapseAll = shouldCollapse && nodeCount >= complexity;\n\n this._rootNodeVM = createNodeVM(this._engine.root(), this, null, true);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get mode(): SchemaEditorMode {\n return this._mode;\n }\n\n public get engine(): SchemaEngine {\n return this._engine;\n }\n\n public get shouldCollapseAll(): boolean {\n return this._shouldCollapseAll;\n }\n\n public get tableId(): string {\n return this._tableId;\n }\n\n public get initialTableId(): string {\n return this._initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableId !== this._initialTableId;\n }\n\n public get tableIdError(): string | null {\n if (!isValidFieldName(this._tableId)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableId = value;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public setLoading(value: boolean): void {\n this._loading = value;\n }\n\n public get viewMode(): ViewerSwitcherMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewerSwitcherMode): void {\n this._viewMode = mode;\n }\n\n public get isChangesDialogOpen(): boolean {\n return this._isChangesDialogOpen;\n }\n\n public openChangesDialog(): void {\n this._isChangesDialogOpen = true;\n }\n\n public closeChangesDialog(): void {\n this._isChangesDialogOpen = false;\n }\n\n public get createDialogViewMode(): 'Example' | 'Schema' {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: 'Example' | 'Schema'): void {\n this._createDialogViewMode = mode;\n }\n\n public get rootNodeVM(): NodeVM {\n return this._rootNodeVM;\n }\n\n public get isDirty(): boolean {\n return this._engine.isDirty || this.isTableIdChanged;\n }\n\n public get isValid(): boolean {\n return this._engine.isValid;\n }\n\n public get isApproveDisabled(): boolean {\n return !this.isValid || !this.isDirty;\n }\n\n public get patchesCount(): number {\n return this.getPatches().length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public get validationErrors(): readonly ValidationError[] {\n return this._engine.validationErrors;\n }\n\n public get formulaErrors(): FormulaValidationError[] {\n const engineErrors = this._engine.validateFormulas();\n const inputErrors = this.collectFormulaInputErrors(this._rootNodeVM);\n return [...engineErrors, ...inputErrors];\n }\n\n private collectFormulaInputErrors(nodeVM: NodeVM): FormulaValidationError[] {\n const errors: FormulaValidationError[] = [];\n\n if (nodeVM instanceof PrimitiveNodeVM && nodeVM.formulaErrorValue) {\n errors.push({\n nodeId: nodeVM.nodeId,\n fieldPath: nodeVM.name || undefined,\n message: nodeVM.formulaErrorValue,\n });\n }\n\n if ('children' in nodeVM && Array.isArray(nodeVM.children)) {\n for (const child of nodeVM.children as NodeVM[]) {\n errors.push(...this.collectFormulaInputErrors(child));\n }\n }\n\n if ('itemsVM' in nodeVM && nodeVM.itemsVM) {\n errors.push(...this.collectFormulaInputErrors(nodeVM.itemsVM));\n }\n\n return errors;\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public markAsSaved(): void {\n this._engine.markAsSaved();\n this._initialTableId = this._tableId;\n }\n\n public revert(): void {\n this._engine.revert();\n this._tableId = this._initialTableId;\n this._rootNodeVM = createNodeVM(this._engine.root(), this, null, true);\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._engine.root();\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === SchemaTypeIds.Array && !currentRoot.isArray()) {\n const result = this._engine.wrapRootInArray();\n if (result) {\n const arrayNode = this._engine.nodeById(result.newNodeId);\n this._rootNodeVM = createNodeVM(arrayNode, this, null, true);\n }\n return;\n }\n\n const newNode = this.createNodeByTypeId(typeId, currentRoot.name());\n if (newNode) {\n const result = this._engine.replaceRootWith(newNode);\n if (result) {\n this._rootNodeVM = createNodeVM(newNode, this, null, true);\n }\n }\n }\n\n public async selectForeignKey(): Promise<string | null> {\n if (!this._onSelectForeignKey) {\n return null;\n }\n return this._onSelectForeignKey();\n }\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._loading = true;\n try {\n const success = await this._onApprove();\n if (success) {\n this.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._loading = false;\n }\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._engine.getPatches();\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._engine.getPatches().map((p) => p.patch);\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._engine.getPlainSchema() as unknown as JsonObjectSchema;\n }\n\n public getExampleData(): unknown {\n return getDefaultValueFromSchema(this.getPlainSchema());\n }\n\n public createNodeByTypeId(typeId: string, name: string): SchemaNode | null {\n return createNodeByTypeId(typeId, name);\n }\n\n public dispose(): void {\n // Nothing to clean up now\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { SchemaTypeIds } from '../config';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\n\nexport class ObjectNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean;\n public propertyList: NodeVM[] = [];\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this.isCollapsedState = editor.shouldCollapseAll && !isRoot;\n\n makeObservable(this, {\n isCollapsedState: observable,\n propertyList: observable.shallow,\n isCollapsed: computed,\n children: computed,\n showAddButton: computed,\n toggleCollapsed: action.bound,\n addProperty: action.bound,\n removeProperty: action.bound,\n replaceProperty: action.bound,\n moveNodeHere: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n this.initChildren();\n }\n\n private initChildren(): void {\n this.propertyList = this._node\n .properties()\n .map((child) => createNodeVM(child, this._editor, this));\n }\n\n public override get isCollapsible(): boolean {\n return !this._isRoot;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get children(): readonly NodeVM[] {\n return this.propertyList;\n }\n\n public get showAddButton(): boolean {\n return this._node.isObject();\n }\n\n public override get isValidDropTarget(): boolean {\n return true;\n }\n\n public addProperty(name: string): void {\n const newNode = this._editor.engine.addChild(this.nodeId, name);\n if (!newNode.isNull()) {\n const childVM = createNodeVM(newNode, this._editor, this);\n this.propertyList.push(childVM);\n }\n }\n\n public removeProperty(childVM: NodeVM): void {\n const removed = this._editor.engine.removeNode(childVM.nodeId);\n if (removed) {\n const index = this.propertyList.indexOf(childVM);\n if (index >= 0) {\n this.propertyList.splice(index, 1);\n }\n }\n }\n\n public replaceProperty(childVM: NodeVM, typeId: string): void {\n const currentNode = childVM.node;\n if (currentNode.isNull()) {\n return;\n }\n\n if (typeId === SchemaTypeIds.Array && !currentNode.isArray()) {\n const result = this._editor.engine.wrapInArray(childVM.nodeId);\n if (result) {\n const arrayNode = this._editor.engine.nodeById(result.newNodeId);\n const newVM = createNodeVM(arrayNode, this._editor, this);\n this.replacePropertyVM(childVM, newVM);\n }\n return;\n }\n\n const newNode = this._editor.createNodeByTypeId(typeId, currentNode.name());\n if (newNode) {\n const result = this._editor.engine.replaceNode(childVM.nodeId, newNode);\n if (result) {\n const newVM = createNodeVM(newNode, this._editor, this);\n this.replacePropertyVM(childVM, newVM);\n }\n }\n }\n\n private replacePropertyVM(oldVM: NodeVM, newVM: NodeVM): void {\n const index = this.propertyList.indexOf(oldVM);\n if (index >= 0) {\n this.propertyList[index] = newVM;\n }\n }\n\n public moveNodeHere(fromNodeId: string): void {\n const fromNode = this._editor.engine.nodeById(fromNodeId);\n if (fromNode.isNull()) {\n return;\n }\n\n this._editor.engine.moveNode(fromNodeId, this.nodeId);\n\n const movedNode = this._editor.engine.nodeById(fromNodeId);\n if (!movedNode.isNull()) {\n const rootVM = this._editor.rootNodeVM;\n if (rootVM instanceof ObjectNodeVM) {\n rootVM.removePropertyVMByNodeId(fromNodeId);\n }\n const movedVM = createNodeVM(movedNode, this._editor, this);\n this.propertyList.push(movedVM);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n\n public removePropertyVMByNodeId(nodeId: string): boolean {\n const index = this.propertyList.findIndex((vm) => vm.nodeId === nodeId);\n if (index >= 0) {\n this.propertyList.splice(index, 1);\n return true;\n }\n for (const child of this.propertyList) {\n if (child instanceof ObjectNodeVM) {\n const found = child.removePropertyVMByNodeId(nodeId);\n if (found) {\n return true;\n }\n }\n }\n return false;\n }\n}\n\nregisterVMClass('ObjectNodeVM', ObjectNodeVM);\n","import { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface NodeWrapperProps {\n viewModel: BaseNodeVM;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n children?: ReactNode;\n}\n\nexport const NodeWrapper: FC<NodeWrapperProps> = observer(\n ({\n viewModel,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${viewModel.nodeId}`;\n const collapseButtonClass = `collapse-button-${viewModel.nodeId}`;\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n }\n : {};\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\n >\n <Flex\n gap=\"4px\"\n alignItems=\"center\"\n height=\"30px\"\n mt=\"2px\"\n mb=\"2px\"\n position=\"relative\"\n css={fieldHoverStyles}\n >\n <Box position=\"absolute\" ml=\"-60px\" height=\"100%\" width=\"60px\" />\n <Box\n className={dotOutlineClass}\n color=\"gray.300\"\n visibility={isCollapsed ? 'hidden' : 'visible'}\n >\n <PiDotOutlineFill />\n </Box>\n {isCollapsible && (\n <IconButton\n className={collapseButtonClass}\n visibility={isCollapsed ? 'visible' : 'hidden'}\n _hover={{ backgroundColor: 'transparent' }}\n ml=\"-8px\"\n position=\"absolute\"\n size=\"xs\"\n color=\"gray.400\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n width=\"26px\"\n height=\"26px\"\n >\n <Box rotate={isCollapsed ? '0' : '90deg'}>\n <MdOutlineChevronRight />\n </Box>\n </IconButton>\n )}\n {field}\n </Flex>\n {children && !isCollapsed && (\n <Flex\n ml=\"7px\"\n pl=\"18px\"\n borderLeftWidth={1}\n borderLeftStyle=\"solid\"\n borderLeftColor=\"white\"\n _hover={{ borderLeftColor: 'blackAlpha.200' }}\n >\n {children}\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Portal } from '@chakra-ui/react';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { FC, Fragment, ReactElement } from 'react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { typeMenuGroups, type MenuOptionItem } from '../../config/index';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <Box flex=\"1\">{label}</Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {options.map((option) => (\n <Fragment key={option.id}>\n <Menu.Item\n value={option.id}\n data-testid={`${dataTestIdPrefix}-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n {option.type !== 'submenu' && option.addDividerAfter && (\n <Menu.Separator />\n )}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\ninterface TypeMenuProps {\n menuButton: ReactElement;\n onSelect: (typeId: string) => void;\n dataTestId?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const TypeMenu: FC<TypeMenuProps> = ({\n menuButton,\n onSelect,\n dataTestId,\n open,\n onOpenChange,\n}) => {\n const handleOpenChange = (details: { open: boolean }) => {\n onOpenChange?.(details.open);\n };\n\n return (\n <Menu.Root open={open} onOpenChange={handleOpenChange}>\n <Menu.Trigger asChild>{menuButton}</Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {typeMenuGroups.map((group) => (\n <Fragment key={group.id}>\n {group.options.map((option) =>\n option.type === 'submenu' ? (\n <SubMenu\n key={option.id}\n label={option.label}\n options={option.items}\n onSelect={onSelect}\n dataTestIdPrefix={`${dataTestId}-menu-sub`}\n />\n ) : (\n <Menu.Item\n key={option.id}\n value={option.id}\n data-testid={`${dataTestId}-menu-type-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n ),\n )}\n {group.addDividerAfter && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import {\n draggable,\n dropTargetForElements,\n monitorForElements,\n type ElementEventBasePayload,\n type ElementDropTargetEventPayloadMap,\n} from '@atlaskit/drag-and-drop/adapter/element';\nimport type { CleanupFn } from '@atlaskit/drag-and-drop/types';\nimport { useEffect, useRef, useState } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport type { ObjectNodeVM } from '../../vm/ObjectNodeVM';\n\ntype DragAndDropData = Record<string, unknown> & {\n viewModel: BaseNodeVM;\n};\n\nconst getDragData = (data: Record<string, unknown>): BaseNodeVM | null => {\n const viewModel = data.viewModel;\n if (viewModel && typeof viewModel === 'object' && 'nodeId' in viewModel) {\n return viewModel as BaseNodeVM;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n viewModel: BaseNodeVM;\n onDrop?: (fromNodeId: string) => void;\n}\n\nexport const useDragAndDrop = ({\n viewModel,\n onDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n const [isDrop, setIsDrop] = useState(false);\n const [isDisabledDrop, setIsDisabledDrop] = useState(false);\n const [isDraggedOver, setIsDraggedOver] = useState(false);\n\n const isDraggable = viewModel.canDrag;\n const isDropTarget = viewModel.isValidDropTarget;\n\n useEffect(() => {\n if (!isDraggable || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ viewModel }),\n });\n\n return () => cleanup();\n }, [viewModel, isDraggable]);\n\n useEffect(() => {\n if (!isDropTarget || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = dropTargetForElements({\n element: dragAndDropRef.current,\n onDrop: (e: ElementDropTargetEventPayloadMap['onDrop']) => {\n const draggingViewModel = getDragData(e.source.data);\n\n if (\n draggingViewModel &&\n viewModel.canAcceptDrop(draggingViewModel.nodeId)\n ) {\n if (onDrop) {\n onDrop(draggingViewModel.nodeId);\n } else if ('moveNodeHere' in viewModel) {\n (viewModel as ObjectNodeVM).moveNodeHere(draggingViewModel.nodeId);\n }\n }\n\n setIsDraggedOver(false);\n setIsDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingViewModel = getDragData(e.source.data);\n if (draggingViewModel) {\n setIsDraggedOver(viewModel.canAcceptDrop(draggingViewModel.nodeId));\n }\n },\n onDragLeave: () => setIsDraggedOver(false),\n });\n\n return () => cleanup();\n }, [viewModel, isDropTarget, onDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingViewModel = getDragData(e.source.data);\n\n if (!draggingViewModel) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = viewModel.canAcceptDrop(draggingViewModel.nodeId);\n\n if (canAccept) {\n setIsDrop(true);\n } else {\n setIsDisabledDrop(true);\n }\n } else {\n setIsDisabledDrop(true);\n }\n },\n onDrop: () => {\n setIsDrop(false);\n setIsDisabledDrop(false);\n },\n });\n }, [viewModel, isDropTarget]);\n\n return {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDisabledDrop,\n isDraggedOver,\n };\n};\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport {\n PiDotsSixVerticalBold,\n PiWarningCircle,\n PiWarning,\n PiFunction,\n} from 'react-icons/pi';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { ContentEditable } from '../../../components/ContentEditable';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { TypeMenu } from '../TypeMenu/TypeMenu';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\n\ninterface FieldEditorProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const FieldEditor: FC<FieldEditorProps> = observer(\n ({ viewModel, dataTestId, hoverTargetClass, onChangeType, rightContent }) => {\n const applyHoverStyles = viewModel.shouldApplyFieldStyles;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(viewModel.name);\n const showTypeAndMenu = hasName || viewModel.isRoot;\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({ viewModel });\n\n return (\n <Flex gap=\"0.5rem\" width=\"100%\" justifyContent=\"flex-start\" outline={0}>\n <Flex\n data-testid={isDrop ? `${dataTestId}-drop` : undefined}\n ref={dragAndDropRef}\n flex={hasName ? 0 : 1}\n position=\"relative\"\n whiteSpace=\"nowrap\"\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n >\n {isDraggable && (\n <Tooltip\n content=\"Drag to move field to another object\"\n positioning={{ placement: 'left' }}\n >\n <Flex\n data-testid={`${dataTestId}-drag-button`}\n className={hoverClass}\n position=\"absolute\"\n left=\"-34px\"\n opacity={applyHoverStyles ? 0 : 1}\n cursor=\"grab\"\n _hover={{ backgroundColor: 'gray.50' }}\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"4px\"\n marginLeft=\"-6px\"\n >\n <Icon size=\"md\" color=\"gray.300\">\n <PiDotsSixVerticalBold />\n </Icon>\n </Flex>\n </Tooltip>\n )}\n {viewModel.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {viewModel.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!viewModel.name}\n initValue={viewModel.name}\n placeholder={\n viewModel.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={viewModel.handleFieldBlur}\n onFocus={() => viewModel.setFocused(true)}\n onChange={viewModel.rename}\n />\n )}\n {hasName && viewModel.hasError && (\n <Tooltip\n content={viewModel.errorMessage ?? ''}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\n color=\"red.500\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n ml=\"4px\"\n >\n <PiWarningCircle />\n </Box>\n </Tooltip>\n )}\n </Flex>\n {showTypeAndMenu && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {viewModel.isDeprecated && (\n <Tooltip content=\"Deprecated\" positioning={{ placement: 'top' }}>\n <Box\n color=\"orange.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiWarning />\n </Box>\n </Tooltip>\n )}\n {viewModel.hasFormula && (\n <Tooltip\n content={`Formula: ${viewModel.formula}`}\n positioning={{ placement: 'top' }}\n >\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiFunction />\n </Box>\n </Tooltip>\n )}\n <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {viewModel.showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={viewModel.isMenuOpen}\n onOpenChange={viewModel.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {viewModel.label}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {viewModel.label}\n </Text>\n )}\n {rightContent}\n </Flex>\n </Box>\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiTextT } from 'react-icons/pi';\nimport { Tooltip } from '../../../components';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface NodeIndicatorsProps {\n viewModel: BaseNodeVM;\n}\n\nexport const NodeIndicators: FC<NodeIndicatorsProps> = observer(\n ({ viewModel }) => {\n if (!viewModel.hasDescription) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\" color=\"gray.400\">\n <Tooltip\n content={viewModel.description}\n positioning={{ placement: 'top' }}\n >\n <Box cursor=\"default\">\n <PiTextT />\n </Box>\n </Tooltip>\n </Flex>\n );\n },\n);\n","import { RefObject, useCallback } from 'react';\n\n/**\n * Workaround for zag-js dismissable layer race condition bug.\n *\n * When a submenu closes, focus can briefly move to submenu content element.\n * The parent menu's onFocusOutside handler sees this as \"focus outside\"\n * and incorrectly closes the parent menu.\n *\n * This hook provides an onInteractOutside handler that prevents the parent\n * menu from closing when the interaction target is a submenu content element.\n *\n * @see https://github.com/chakra-ui/zag/commit/9817e4cb3b18d93408b95e7c827d35801b01a267\n * @see https://github.com/chakra-ui/zag/blob/main/.changeset/fix-nested-layer-dismissal.md\n *\n * This workaround can be removed when @zag-js/dismissable >= 1.34.0 is released\n * and included in @chakra-ui/react (current: 1.31.1). The fix adds recentlyRemoved\n * tracking to layerStack.isInNestedLayer() to ignore focus events during layer cleanup.\n *\n * @param contentRef - Ref to the parent menu content element\n * @returns onInteractOutside handler to pass to Menu.Root\n */\nexport function useFixZagNestedMenuDismiss(\n contentRef: RefObject<HTMLDivElement | null>,\n) {\n return useCallback(\n (e: { preventDefault: () => void }) => {\n const target = (e as unknown as { detail?: { originalEvent?: Event } })\n .detail?.originalEvent?.target;\n\n if (target instanceof Element) {\n const isSubmenuContent =\n target.closest('[data-scope=\"menu\"][data-part=\"content\"]') &&\n !contentRef.current?.contains(target);\n\n if (isSubmenuContent) {\n e.preventDefault();\n }\n }\n },\n [contentRef],\n );\n}\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiTextT, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface DescriptionSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(viewModel.description);\n\n const handleBlur = () => {\n viewModel.setDescription(localValue);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {viewModel.hasDescription && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.description}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Textarea\n size=\"sm\"\n placeholder=\"Add description...\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n rows={3}\n autoFocus\n data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface FormulaSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(viewModel.formula);\n\n const handleBlur = () => {\n viewModel.setFormula(localValue);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {viewModel.hasFormula && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Input\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n autoFocus\n data-testid={`${dataTestId}-formula-input`}\n />\n {localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt=\"1\">\n Field will be readOnly\n </Box>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiEquals, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface DefaultValueSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n viewModel.defaultValueAsString,\n );\n\n const handleBlur = () => {\n viewModel.setDefault(localValue);\n };\n\n const handleBooleanChange = (checked: boolean) => {\n viewModel.setDefault(checked ? 'true' : 'false');\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {viewModel.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {viewModel.isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={viewModel.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(viewModel.defaultValue !== true)\n }\n data-testid={`${dataTestId}-default-checkbox`}\n >\n true\n <Menu.ItemIndicator />\n </Menu.CheckboxItem>\n ) : (\n <Input\n size=\"sm\"\n type={viewModel.isNumber ? 'number' : 'text'}\n placeholder={viewModel.isNumber ? '0' : 'default value'}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n autoFocus\n data-testid={`${dataTestId}-default-input`}\n />\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCaretRight } from 'react-icons/pi';\nimport type { FormulaDependent } from '../../model';\n\ninterface UsedByFormulasSubmenuProps {\n formulaDependents: FormulaDependent[];\n}\n\nexport const UsedByFormulasSubmenu: FC<UsedByFormulasSubmenuProps> = ({\n formulaDependents,\n}) => {\n if (formulaDependents.length === 0) {\n return null;\n }\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <Box w=\"16px\" />\n <Box flex=\"1\">Used by formulas</Box>\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n bg=\"gray.100\"\n px=\"1.5\"\n borderRadius=\"full\"\n >\n {formulaDependents.length}\n </Box>\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"240px\">\n {formulaDependents.map((dep) => (\n <Box\n key={dep.formulaNodeId}\n py=\"1\"\n borderBottomWidth={1}\n borderColor=\"gray.100\"\n _last={{ borderBottomWidth: 0 }}\n >\n <Box fontSize=\"sm\" fontWeight=\"medium\">\n {dep.fieldName}\n </Box>\n <Box fontSize=\"xs\" color=\"gray.500\" fontFamily=\"mono\">\n {dep.expression}\n </Box>\n </Box>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useRef } from 'react';\nimport { PiTrash } from 'react-icons/pi';\nimport { SettingsButton } from '../../../components';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { useFixZagNestedMenuDismiss } from '../hooks/useFixZagNestedMenuDismiss';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\nimport { UsedByFormulasSubmenu } from './UsedByFormulasSubmenu';\n\ninterface NodeContextMenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const NodeContextMenu: FC<NodeContextMenuProps> = observer(\n ({\n viewModel,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const handleInteractOutside = useFixZagNestedMenuDismiss(contentRef);\n\n const handleOpenChange = (details: { open: boolean }) => {\n viewModel.setSettingsOpen(details.open);\n };\n\n return (\n <Menu.Root\n open={viewModel.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n onInteractOutside={handleInteractOutside}\n >\n <Menu.Trigger asChild>\n <SettingsButton\n height=\"26px\"\n color=\"gray.300\"\n _hover={{ color: 'gray.400' }}\n dataTestId={dataTestId}\n />\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content ref={contentRef} minW=\"220px\">\n <DescriptionSubmenu\n viewModel={viewModel}\n dataTestId={dataTestId}\n />\n\n {showFormula && (\n <FormulaSubmenu viewModel={viewModel} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n viewModel={viewModel}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() => viewModel.setDeprecated(!viewModel.isDeprecated)}\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {viewModel.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n <UsedByFormulasSubmenu\n formulaDependents={viewModel.formulaDependents}\n />\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={viewModel.canDelete ? 'fg.error' : 'gray.400'}\n disabled={!viewModel.canDelete}\n onClick={viewModel.canDelete ? onDelete : undefined}\n title={viewModel.deleteBlockedReason ?? undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n viewModel.canDelete\n ? { bg: 'bg.error', color: 'fg.error' }\n : undefined\n }\n >\n <PiTrash />\n <Box flex=\"1\">Delete field</Box>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface NodeRightContentProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n showDelete?: boolean;\n onDelete?: () => void;\n}\n\nexport const NodeRightContent: FC<NodeRightContentProps> = observer(\n ({ viewModel, dataTestId, showDelete = true, onDelete }) => {\n return (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeRightContent } from '../NodeRightContent';\nimport { NodeView } from '../NodeView/NodeView';\n\ninterface CollapsibleNodeViewProps {\n viewModel: BaseNodeVM & {\n isCollapsible: boolean;\n isCollapsed: boolean;\n toggleCollapsed: () => void;\n children: readonly NodeVM[];\n };\n dataTestId: string;\n footer?: ReactNode;\n}\n\nexport const CollapsibleNodeView: FC<CollapsibleNodeViewProps> = observer(\n ({ viewModel, dataTestId, footer }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={viewModel.isCollapsible}\n isCollapsed={viewModel.isCollapsed}\n onToggleCollapse={viewModel.toggleCollapsed}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={\n <NodeRightContent\n viewModel={viewModel}\n dataTestId={dataTestId}\n showDelete={!viewModel.isRoot}\n onDelete={viewModel.removeSelf}\n />\n }\n />\n }\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {viewModel.children.map((childVm, index) => (\n <NodeView\n key={childVm.nodeId}\n viewModel={childVm}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {footer}\n </Flex>\n </NodeWrapper>\n );\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../components';\nimport type { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { CollapsibleNodeView } from '../CollapsibleNodeView';\n\ninterface ObjectNodeViewProps {\n viewModel: ObjectNodeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n return (\n <CollapsibleNodeView\n viewModel={viewModel}\n dataTestId={dataTestId}\n footer={\n viewModel.showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => viewModel.addProperty('')}\n />\n </Box>\n )\n }\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { CreateButton } from '../../../components';\nimport { ArrayNodeVM } from '../../vm/ArrayNodeVM';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeRightContent } from '../NodeRightContent';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\nimport { TypeMenu } from '../TypeMenu/TypeMenu';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { NodeView } from '../NodeView/NodeView';\n\ninterface ArrayNodeViewProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={viewModel.isCollapsible}\n isCollapsed={viewModel.isCollapsed}\n onToggleCollapse={viewModel.toggleCollapsed}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={\n <NodeRightContent\n viewModel={viewModel}\n dataTestId={dataTestId}\n onDelete={viewModel.removeSelf}\n />\n }\n />\n }\n >\n {viewModel.itemsVM && (\n <Flex flexDirection=\"column\" width=\"100%\">\n <ArrayItemsView viewModel={viewModel} dataTestId={dataTestId} />\n </Flex>\n )}\n </NodeWrapper>\n );\n },\n);\n\ninterface ArrayItemsViewProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n}\n\nconst ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const itemsVm = viewModel.itemsVM;\n if (!itemsVm) {\n return null;\n }\n\n const hoverTargetClass = `hover-target-${itemsVm.nodeId}`;\n const applyHoverStyles = itemsVm.shouldApplyFieldStyles;\n\n return (\n <NodeWrapper\n viewModel={itemsVm}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <ArrayItemsField\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n applyHoverStyles={applyHoverStyles}\n />\n }\n >\n <ArrayItemsChildren itemsVm={itemsVm} dataTestId={`${dataTestId}-0`} />\n </NodeWrapper>\n );\n },\n);\n\ninterface ArrayItemsFieldProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n hoverTargetClass: string;\n applyHoverStyles: boolean;\n}\n\ninterface ArrayItemsChildrenProps {\n itemsVm: NodeVM;\n dataTestId: string;\n}\n\nconst ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ itemsVm, dataTestId }) => {\n if (itemsVm instanceof ObjectNodeVM) {\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {itemsVm.children.map((childVm, index) => (\n <NodeView\n key={childVm.nodeId}\n viewModel={childVm}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {itemsVm.showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => itemsVm.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (itemsVm instanceof ArrayNodeVM) {\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n <ArrayItemsView viewModel={itemsVm} dataTestId={dataTestId} />\n </Flex>\n );\n }\n\n if (itemsVm instanceof ForeignKeyNodeVM) {\n return <ForeignKeyValue viewModel={itemsVm} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n\ninterface ForeignKeyValueProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nconst ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ viewModel, dataTestId }) => {\n const value = viewModel.foreignKeyValue;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={viewModel.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n\nconst ArrayItemsField: FC<ArrayItemsFieldProps> = observer(\n ({ viewModel, dataTestId, hoverTargetClass, applyHoverStyles }) => {\n const itemsVm = viewModel.itemsVM;\n if (!itemsVm) {\n return null;\n }\n\n const { dragAndDropRef, isDrop, isDraggedOver, isDisabledDrop } =\n useDragAndDrop({ viewModel: itemsVm });\n\n return (\n <Flex\n ref={dragAndDropRef}\n data-testid={isDrop ? `${dataTestId}-items-drop` : undefined}\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n gap=\"0.5rem\"\n alignItems=\"center\"\n >\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={viewModel.changeItemsType}\n open={itemsVm.isMenuOpen}\n onOpenChange={itemsVm.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n cursor=\"pointer\"\n textDecoration=\"underline\"\n outline={0}\n >\n {itemsVm.label}\n </Text>\n }\n />\n <Box\n className={applyHoverStyles ? hoverTargetClass : undefined}\n opacity={applyHoverStyles ? 0 : 1}\n >\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <NodeIndicators viewModel={itemsVm} />\n {itemsVm.showMenu && (\n <NodeContextMenu\n viewModel={itemsVm}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { PrimitiveNodeVM } from '../../vm/PrimitiveNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface PrimitiveNodeViewProps {\n viewModel: PrimitiveNodeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n const rightContent = (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete\n showFormula\n showDefault\n onDelete={viewModel.removeSelf}\n />\n )}\n </>\n );\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={rightContent}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface LeafNodeViewProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n children?: ReactNode;\n}\n\nexport const LeafNodeView: FC<LeafNodeViewProps> = observer(\n ({ viewModel, dataTestId, children }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n const rightContent = (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete\n onDelete={viewModel.removeSelf}\n />\n )}\n </>\n );\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={rightContent}\n />\n }\n >\n {children}\n </NodeWrapper>\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { LeafNodeView } from '../LeafNodeView/LeafNodeView';\n\ninterface ForeignKeyNodeViewProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n return (\n <LeafNodeView viewModel={viewModel} dataTestId={dataTestId}>\n <ForeignKeyValue viewModel={viewModel} dataTestId={dataTestId} />\n </LeafNodeView>\n );\n },\n);\n\ninterface ForeignKeyValueProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nconst ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ viewModel, dataTestId }) => {\n const value = viewModel.foreignKeyValue;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={viewModel.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { RefNodeVM } from '../../vm/RefNodeVM';\nimport { LeafNodeView } from '../LeafNodeView/LeafNodeView';\nimport { CollapsibleNodeView } from '../CollapsibleNodeView';\n\ninterface RefNodeViewProps {\n viewModel: RefNodeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n if (!viewModel.isCollapsible) {\n return <LeafNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n return (\n <CollapsibleNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { ArrayNodeVM } from '../../vm/ArrayNodeVM';\nimport { PrimitiveNodeVM } from '../../vm/PrimitiveNodeVM';\nimport { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { RefNodeVM } from '../../vm/RefNodeVM';\nimport { ObjectNodeView } from '../ObjectNodeView/ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView/ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView/PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView/ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView/RefNodeView';\n\ninterface NodeViewProps {\n viewModel: NodeVM;\n dataTestId: string;\n}\n\nexport const NodeView: FC<NodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n if (viewModel instanceof ObjectNodeVM) {\n return <ObjectNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof ArrayNodeVM) {\n return <ArrayNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof ForeignKeyNodeVM) {\n return (\n <ForeignKeyNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n }\n\n if (viewModel instanceof RefNodeVM) {\n return <RefNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof PrimitiveNodeVM) {\n return (\n <PrimitiveNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n }\n\n return null;\n },\n);\n","import {\n Badge,\n Box,\n Button,\n Flex,\n Icon,\n IconButton,\n Portal,\n SegmentGroup,\n Text,\n VStack,\n} from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport {\n PiArrowCounterClockwiseBold,\n PiArrowRight,\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n PiWarningCircle,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport type {\n SchemaPatch,\n MetadataChangeType,\n TransformationInfo,\n DataLossSeverity,\n DefaultValueExample,\n SchemaValidationError,\n FormulaErrorInfo,\n} from '../../model';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n jsonPointerToSimplePath,\n} from '../../model';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { JsonValue } from '../../types';\n\ninterface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\ninterface ChangesPreviewDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onApprove: () => void;\n onRevert: () => void;\n patches: SchemaPatch[];\n isLoading?: boolean;\n tableId: string;\n tableIdChange?: TableIdChangeInfo;\n tableIdError?: string | null;\n validationErrors?: SchemaValidationError[];\n formulaErrors?: FormulaErrorInfo[];\n mode: 'creating' | 'updating';\n createDialogViewMode?: 'Example' | 'Schema';\n onCreateDialogViewModeChange?: (mode: 'Example' | 'Schema') => void;\n exampleData?: JsonValue;\n schemaData?: JsonValue;\n}\n\ntype PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nconst operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nconst Highlight: FC<{ children: React.ReactNode }> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n\nconst DataLossBadge: FC<{ severity: DataLossSeverity }> = ({ severity }) => {\n if (severity === 'none') {\n return null;\n }\n\n if (severity === 'possible') {\n return (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data may be lost\n </Badge>\n );\n }\n\n return (\n <Badge size=\"sm\" colorPalette=\"red\" variant=\"subtle\">\n data loss\n </Badge>\n );\n};\n\nconst TransformationInfoRow: FC<{ info: TransformationInfo }> = ({ info }) => {\n return (\n <VStack align=\"stretch\" gap={1} pl={2}>\n <Flex align=\"center\" gap={2} fontSize=\"xs\" flexWrap=\"wrap\">\n {info.steps.map((step, stepIndex) => (\n <Flex key={step.name} align=\"center\" gap={1}>\n {stepIndex > 0 && <Text color=\"gray.400\">+</Text>}\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {step.name}\n </Badge>\n </Flex>\n ))}\n <DataLossBadge severity={info.dataLossSeverity} />\n </Flex>\n\n <Flex align=\"center\" gap={2} fontSize=\"xs\" color=\"gray.500\">\n <Text color=\"gray.400\">example:</Text>\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {JSON.stringify(info.example.before)}\n </Box>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {JSON.stringify(info.example.after)}\n </Box>\n </Flex>\n </VStack>\n );\n};\n\nconst formatDefaultValue = (value: unknown): string => {\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return JSON.stringify(value);\n};\n\nconst DefaultValueRow: FC<{ example: DefaultValueExample }> = ({ example }) => {\n const { value, type, foreignKeyTableId } = example;\n\n if (foreignKeyTableId) {\n return null;\n }\n\n const formattedValue = formatDefaultValue(value);\n const isMultiline = formattedValue.includes('\\n');\n\n return (\n <Flex\n align={isMultiline ? 'flex-start' : 'center'}\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n >\n <Text color=\"gray.400\">default:</Text>\n <Box\n as=\"code\"\n px={isMultiline ? 2 : 1}\n py={isMultiline ? 1.5 : 0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n whiteSpace={isMultiline ? 'pre' : 'nowrap'}\n >\n {formattedValue}\n </Box>\n <Text color=\"gray.400\">({type})</Text>\n </Flex>\n );\n};\n\nconst MetadataChangesRow: FC<{ changes: MetadataChangeType[] }> = ({\n changes,\n}) => {\n const filteredChanges = changes.filter(\n (change) =>\n change !== 'formula' &&\n change !== 'default' &&\n change !== 'description' &&\n change !== 'deprecated' &&\n change !== 'foreignKey' &&\n change !== 'contentMediaType',\n );\n\n if (filteredChanges.length === 0) {\n return null;\n }\n\n return (\n <Flex align=\"center\" gap={2} fontSize=\"xs\" pl={2} flexWrap=\"wrap\">\n {filteredChanges.map((change) => (\n <Badge key={change} size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {change}\n </Badge>\n ))}\n </Flex>\n );\n};\n\nconst CodeBox: FC<{ children: React.ReactNode }> = ({ children }) => (\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {children}\n </Box>\n);\n\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nconst ValueChangeRow: FC<ValueChangeRowProps> = ({\n label,\n fromValue,\n toValue,\n}) => (\n <Flex\n align=\"center\"\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n flexWrap=\"wrap\"\n >\n <Text color=\"gray.400\">{label}:</Text>\n <CodeBox>{fromValue}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{toValue}</CodeBox>\n </Flex>\n);\n\nconst formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '(none)';\n }\n return JSON.stringify(value);\n};\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nconst getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nconst OperationDescription: FC<{ schemaPatch: SchemaPatch }> = ({\n schemaPatch,\n}) => {\n const { patch, fieldName } = schemaPatch;\n const IconComponent = operationIcons[patch.op as PatchOp];\n\n switch (patch.op) {\n case 'add':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was added\n </Text>\n </Flex>\n );\n case 'remove':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was removed\n </Text>\n </Flex>\n );\n case 'move': {\n const fromField = getFromFieldName(patch);\n if (schemaPatch.isRename) {\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Renamed field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n </Flex>\n );\n }\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Moved field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n {schemaPatch.movesIntoArray && (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data will be cloned\n </Badge>\n )}\n </Flex>\n );\n }\n case 'replace':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was modified\n </Text>\n </Flex>\n );\n default:\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiPencilSimpleLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was changed\n </Text>\n </Flex>\n );\n }\n};\n\nconst PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const {\n patch,\n metadataChanges,\n typeChange,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = schemaPatch;\n\n const transformationInfo = useMemo(\n () =>\n typeChange\n ? getTransformationInfoFromTypeChange(\n typeChange.fromType,\n typeChange.toType,\n )\n : null,\n [typeChange],\n );\n const defaultExample = useMemo(() => {\n if (patch.op === 'add' && patch.value) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\n\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <OperationDescription schemaPatch={schemaPatch} />\n\n {defaultExample && (\n <Box mt={2} ml={8}>\n <DefaultValueRow example={defaultExample} />\n </Box>\n )}\n\n {transformationInfo && (\n <Box mt={2} ml={8}>\n <TransformationInfoRow info={transformationInfo} />\n </Box>\n )}\n\n {formulaChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"formula\"\n fromValue={formatChangeValue(formulaChange.fromFormula)}\n toValue={formatChangeValue(formulaChange.toFormula)}\n />\n </Box>\n )}\n\n {defaultChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"default\"\n fromValue={formatChangeValue(defaultChange.fromDefault)}\n toValue={formatChangeValue(defaultChange.toDefault)}\n />\n </Box>\n )}\n\n {descriptionChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"description\"\n fromValue={formatChangeValue(descriptionChange.fromDescription)}\n toValue={formatChangeValue(descriptionChange.toDescription)}\n />\n </Box>\n )}\n\n {deprecatedChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"deprecated\"\n fromValue={formatChangeValue(deprecatedChange.fromDeprecated)}\n toValue={formatChangeValue(deprecatedChange.toDeprecated)}\n />\n </Box>\n )}\n\n {foreignKeyChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"foreignKey\"\n fromValue={formatChangeValue(foreignKeyChange.fromForeignKey)}\n toValue={formatChangeValue(foreignKeyChange.toForeignKey)}\n />\n </Box>\n )}\n\n {contentMediaTypeChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"contentMediaType\"\n fromValue={formatChangeValue(\n contentMediaTypeChange.fromContentMediaType,\n )}\n toValue={formatChangeValue(\n contentMediaTypeChange.toContentMediaType,\n )}\n />\n </Box>\n )}\n\n {!transformationInfo && metadataChanges.length > 0 && (\n <Box mt={2} ml={8}>\n <MetadataChangesRow changes={metadataChanges} />\n </Box>\n )}\n </Box>\n );\n});\n\nconst TableIdChangeRow: FC<{ change: TableIdChangeInfo }> = ({ change }) => {\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiArrowsLeftRightLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Table renamed from <Highlight>{change.initialTableId}</Highlight> to{' '}\n <Highlight>{change.currentTableId}</Highlight>\n </Text>\n </Flex>\n </Box>\n );\n};\n\ninterface ErrorItemProps {\n message: string;\n type?: 'validation' | 'formula' | 'tableId';\n fieldPath?: string;\n}\n\nconst ErrorItem: FC<ErrorItemProps> = ({ message, type, fieldPath }) => (\n <Box py={2} px={4}>\n <Flex align=\"center\" gap={2}>\n <Icon as={PiWarningCircle} color=\"gray.400\" boxSize={4} flexShrink={0} />\n <Text fontSize=\"sm\" color=\"gray.600\">\n {type === 'formula' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n formula\n </Badge>\n )}\n {type === 'tableId' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n table name\n </Badge>\n )}\n {fieldPath && (\n <Box as=\"span\" fontWeight=\"medium\">\n {fieldPath}:{' '}\n </Box>\n )}\n {message}\n </Text>\n </Flex>\n </Box>\n);\n\ninterface ErrorsListProps {\n validationErrors: SchemaValidationError[];\n formulaErrors: FormulaErrorInfo[];\n tableIdError?: string | null;\n}\n\nconst ErrorsList: FC<ErrorsListProps> = ({\n validationErrors,\n formulaErrors,\n tableIdError,\n}) => (\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"gray.50\"\n overflow=\"hidden\"\n >\n <Box\n py={2}\n px={4}\n bg=\"gray.100\"\n borderBottom=\"1px solid\"\n borderColor=\"gray.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.600\">\n Please fix the following errors before applying changes:\n </Text>\n </Box>\n <VStack align=\"stretch\" gap={0} divideY=\"1px\" divideColor=\"gray.100\">\n {tableIdError && (\n <ErrorItem key=\"tableId-error\" message={tableIdError} type=\"tableId\" />\n )}\n {validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {formulaErrors.map((error) => (\n <ErrorItem\n key={`formula-${error.fieldPath ?? ''}-${error.message}`}\n message={error.message}\n type=\"formula\"\n fieldPath={error.fieldPath}\n />\n ))}\n </VStack>\n </Box>\n);\n\nexport const ChangesPreviewDialog: FC<ChangesPreviewDialogProps> = observer(\n ({\n isOpen,\n onClose,\n onApprove,\n onRevert,\n patches,\n isLoading,\n tableId,\n tableIdChange,\n tableIdError,\n validationErrors = [],\n formulaErrors = [],\n mode,\n createDialogViewMode = 'Example',\n onCreateDialogViewModeChange,\n exampleData,\n schemaData,\n }) => {\n const isCreating = mode === 'creating';\n const hasSchemaChanges = patches.length > 0;\n const hasTableIdChange = Boolean(tableIdChange);\n const hasChanges = hasSchemaChanges || hasTableIdChange;\n const hasErrors =\n validationErrors.length > 0 ||\n formulaErrors.length > 0 ||\n Boolean(tableIdError);\n const canCreate = !hasErrors;\n const canUpdate = hasChanges && !hasErrors;\n const canApply = isCreating ? canCreate : canUpdate;\n const totalChangesCount = patches.length + (hasTableIdChange ? 1 : 0);\n const applyButtonText = isCreating\n ? 'Create Table'\n : `Apply Changes (${totalChangesCount})`;\n\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => !open && onClose()}\n size=\"lg\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth=\"700px\">\n <DialogHeader>\n <DialogTitle>\n {isCreating\n ? `Create Table \"${tableId}\"`\n : `Review Changes for \"${tableId}\"`}\n </DialogTitle>\n </DialogHeader>\n\n <DialogBody>\n <VStack align=\"stretch\" gap={4}>\n {hasErrors && (\n <ErrorsList\n validationErrors={validationErrors}\n formulaErrors={formulaErrors}\n tableIdError={tableIdError}\n />\n )}\n\n {!hasErrors && hasChanges && !isCreating && (\n <>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {tableIdChange && (\n <TableIdChangeRow change={tableIdChange} />\n )}\n {patches.map((schemaPatch) => (\n <PatchRow\n key={schemaPatch.patch.path}\n schemaPatch={schemaPatch}\n />\n ))}\n </Box>\n\n <Text fontSize=\"xs\" color=\"gray.500\">\n Data in existing rows will be automatically transformed\n according to the new schema.\n </Text>\n </>\n )}\n {!hasErrors && !hasChanges && !isCreating && (\n <Flex justify=\"center\" align=\"center\" minHeight=\"100px\">\n <Text color=\"gray.400\" fontSize=\"sm\">\n No changes to apply\n </Text>\n </Flex>\n )}\n {!hasErrors && isCreating && (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={createDialogViewMode}\n onValueChange={(details) =>\n onCreateDialogViewModeChange?.(\n details.value as 'Example' | 'Schema',\n )\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Example', 'Schema']} />\n </SegmentGroup.Root>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {createDialogViewMode === 'Example' ? (\n <JsonCard readonly data={exampleData ?? null} />\n ) : (\n <JsonCard readonly data={schemaData ?? null} />\n )}\n </Box>\n </>\n )}\n </VStack>\n </DialogBody>\n\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {isCreating ? (\n <Box />\n ) : (\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRevert}\n disabled={!hasChanges && !hasErrors}\n title=\"Revert all changes\"\n >\n <PiArrowCounterClockwiseBold />\n </IconButton>\n )}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n {!hasErrors && (\n <Button\n variant=\"outline\"\n onClick={onApprove}\n disabled={!canApply}\n loading={isLoading}\n >\n {applyButtonText}\n </Button>\n )}\n </Flex>\n </Flex>\n </DialogFooter>\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { ViewerSwitcherMode, type JsonValue } from '../../types';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { CloseButton } from '../../../components';\nimport { BackButton } from '../../../components/BackButton';\nimport { JsonCard } from '../../../components/JsonCard';\nimport { SchemaEditorVM } from '../../vm';\nimport { NodeView } from '../NodeView/NodeView';\nimport { ChangesPreviewDialog } from '../ChangesPreviewDialog/ChangesPreviewDialog';\n\nexport interface SchemaEditorProps {\n model: SchemaEditorVM;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(({ model }) => {\n const handleApproveClick = () => {\n model.openChangesDialog();\n };\n\n const handleRevert = () => {\n model.revert();\n model.closeChangesDialog();\n };\n\n const editorHoverStyles = {\n '&:hover .editor-hover-target': { opacity: 1 },\n };\n\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={editorHoverStyles}\n data-testid=\"schema-editor-v2\"\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {model.mode === 'creating' ? (\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={model.cancel}\n />\n ) : (\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={model.cancel}\n />\n )}\n {model.mode === 'creating' ? (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleApproveClick}\n disabled={model.isApproveDisabled && !model.hasErrors}\n loading={model.loading}\n data-testid=\"schema-editor-create-button\"\n >\n {model.hasErrors ? 'Review Errors' : 'Create Table'}\n </Button>\n ) : (\n (model.isDirty || model.hasErrors) && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleApproveClick}\n disabled={model.isApproveDisabled && !model.hasErrors}\n loading={model.loading}\n data-testid=\"schema-editor-approve-button\"\n >\n {model.hasErrors\n ? 'Review Errors'\n : `Apply Changes (${model.totalChangesCount})`}\n </Button>\n )\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={model.viewMode}\n onChange={model.setViewMode}\n />\n </Box>\n </Flex>\n {model.viewMode === ViewerSwitcherMode.Tree && (\n <Box paddingBottom=\"4rem\">\n <NodeView viewModel={model.rootNodeVM} dataTestId=\"root\" />\n </Box>\n )}\n {model.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={model.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ChangesPreviewDialog\n isOpen={model.isChangesDialogOpen}\n onClose={model.closeChangesDialog}\n onApprove={model.approve}\n onRevert={handleRevert}\n patches={model.getPatches()}\n isLoading={model.loading}\n tableId={model.tableId}\n tableIdChange={\n model.isTableIdChanged\n ? {\n initialTableId: model.initialTableId,\n currentTableId: model.tableId,\n }\n : undefined\n }\n tableIdError={model.tableIdError}\n validationErrors={model.validationErrors as never}\n formulaErrors={model.formulaErrors as never}\n mode={model.mode}\n createDialogViewMode={model.createDialogViewMode}\n onCreateDialogViewModeChange={model.setCreateDialogViewMode}\n exampleData={model.getExampleData() as JsonValue}\n schemaData={model.getPlainSchema() as unknown as JsonValue}\n />\n </Flex>\n );\n});\n","import type { Diagnostic, SchemaDefinition, ValueType } from '../core/types';\nimport type {\n ArrayValueNode,\n ObjectValueNode,\n PrimitiveValueNode,\n ValueNode,\n} from './types';\n\nlet nodeIdCounter = 0;\n\nexport function generateNodeId(): string {\n return `node-${++nodeIdCounter}`;\n}\n\nexport function resetNodeIdCounter(): void {\n nodeIdCounter = 0;\n}\n\nexport abstract class BaseValueNode implements ValueNode {\n readonly id: string;\n abstract readonly type: ValueType;\n readonly schema: SchemaDefinition;\n\n private _parent: ValueNode | null = null;\n private readonly _name: string;\n\n constructor(id: string | undefined, name: string, schema: SchemaDefinition) {\n this.id = id ?? generateNodeId();\n this._name = name;\n this.schema = schema;\n }\n\n get parent(): ValueNode | null {\n return this._parent;\n }\n\n set parent(value: ValueNode | null) {\n this._parent = value;\n }\n\n get name(): string {\n return this._name;\n }\n\n abstract get value(): unknown;\n abstract getPlainValue(): unknown;\n\n isObject(): this is ObjectValueNode {\n return false;\n }\n\n isArray(): this is ArrayValueNode {\n return false;\n }\n\n isPrimitive(): this is PrimitiveValueNode {\n return false;\n }\n\n get errors(): readonly Diagnostic[] {\n return [];\n }\n\n get warnings(): readonly Diagnostic[] {\n return [];\n }\n\n get isValid(): boolean {\n return this.errors.length === 0;\n }\n\n get hasWarnings(): boolean {\n return this.warnings.length > 0;\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type {\n Diagnostic,\n FormulaDefinition,\n FormulaWarning,\n SchemaDefinition,\n} from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { PrimitiveValueNode } from './types';\n\nexport abstract class BasePrimitiveValueNode<\n T extends string | number | boolean,\n>\n extends BaseValueNode\n implements PrimitiveValueNode\n{\n protected _value: T;\n protected _baseValue: T;\n protected _formulaWarning: FormulaWarning | null = null;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value: T | undefined,\n defaultValue: T,\n ) {\n super(id, name, schema);\n const initialValue = value ?? (schema.default as T) ?? defaultValue;\n this._value = initialValue;\n this._baseValue = initialValue;\n }\n\n protected initObservable(): void {\n makeObservable<\n BasePrimitiveValueNode<T>,\n '_value' | '_baseValue' | '_formulaWarning'\n >(this, {\n _value: observable,\n _baseValue: observable,\n _formulaWarning: observable,\n value: computed,\n baseValue: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n setValue: action,\n setFormulaWarning: action,\n commit: action,\n revert: action,\n });\n }\n\n get value(): T {\n return this._value;\n }\n\n set value(newValue: T) {\n if (this.isReadOnly) {\n throw new Error(`Cannot set value on read-only field: ${this.name}`);\n }\n this._value = newValue;\n }\n\n get baseValue(): T {\n return this._baseValue;\n }\n\n get isDirty(): boolean {\n return this._value !== this._baseValue;\n }\n\n abstract get defaultValue(): T;\n\n get formula(): FormulaDefinition | undefined {\n const xFormula = this.schema['x-formula'];\n if (xFormula) {\n return { expression: xFormula.expression, version: xFormula.version };\n }\n return undefined;\n }\n\n get formulaWarning(): FormulaWarning | null {\n return this._formulaWarning;\n }\n\n get isReadOnly(): boolean {\n return this.schema.readOnly === true || this.formula !== undefined;\n }\n\n getPlainValue(): T {\n return this._value;\n }\n\n setValue(value: unknown, options?: { internal?: boolean }): void {\n if (this.isReadOnly && !options?.internal) {\n throw new Error(`Cannot set value on read-only field: ${this.name}`);\n }\n this._value = this.coerceValue(value);\n }\n\n protected abstract coerceValue(value: unknown): T;\n\n setFormulaWarning(warning: FormulaWarning | null): void {\n this._formulaWarning = warning;\n }\n\n commit(): void {\n this._baseValue = this._value;\n }\n\n revert(): void {\n this._value = this._baseValue;\n }\n\n override isPrimitive(): this is PrimitiveValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n return this.computeErrors();\n }\n\n protected computeErrors(): readonly Diagnostic[] {\n return [];\n }\n\n override get warnings(): readonly Diagnostic[] {\n if (!this._formulaWarning) {\n return [];\n }\n\n return [\n {\n severity: 'warning',\n type: this._formulaWarning.type,\n message: this._formulaWarning.message,\n path: this.name,\n params: {\n expression: this._formulaWarning.expression,\n computedValue: this._formulaWarning.computedValue,\n },\n },\n ];\n }\n}\n","export type DiagnosticSeverity = 'error' | 'warning' | 'info';\n\nexport interface Diagnostic {\n readonly severity: DiagnosticSeverity;\n readonly type: string;\n readonly message: string;\n readonly path: string;\n readonly params?: Record<string, unknown>;\n}\n\nexport interface SchemaDefinition {\n readonly type?: string;\n readonly $ref?: string;\n readonly default?: unknown;\n readonly readOnly?: boolean;\n readonly required?: boolean;\n readonly format?: string;\n readonly properties?: Record<string, SchemaDefinition>;\n readonly items?: SchemaDefinition;\n readonly additionalProperties?: boolean;\n readonly foreignKey?: string;\n readonly 'x-formula'?: { version: number; expression: string };\n readonly minimum?: number;\n readonly maximum?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly pattern?: string;\n readonly enum?: readonly unknown[];\n}\n\nexport enum ValueType {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Object = 'object',\n Array = 'array',\n Ref = 'ref',\n}\n\nexport interface FormulaDefinition {\n readonly expression: string;\n readonly version?: number;\n}\n\nexport interface FormulaWarning {\n readonly type:\n | 'nan'\n | 'infinity'\n | 'type-coercion'\n | 'division-by-zero'\n | 'null-reference'\n | 'runtime-error';\n readonly message: string;\n readonly expression: string;\n readonly computedValue: unknown;\n}\n\nexport type ChangeType =\n | 'setValue'\n | 'addProperty'\n | 'removeProperty'\n | 'arrayPush'\n | 'arrayInsert'\n | 'arrayRemove'\n | 'arrayMove'\n | 'arrayReplace'\n | 'arrayClear';\n\nimport type { Path } from './Path';\n\nexport interface Change {\n readonly type: ChangeType;\n readonly path: Path;\n readonly value?: unknown;\n readonly oldValue?: unknown;\n readonly fromIndex?: number;\n readonly toIndex?: number;\n readonly index?: number;\n}\n\nexport type JsonPatchOp =\n | 'add'\n | 'remove'\n | 'replace'\n | 'move'\n | 'copy'\n | 'test';\n\nexport interface JsonPatch {\n readonly op: JsonPatchOp;\n readonly path: string;\n readonly value?: unknown;\n readonly from?: string;\n}\n","import type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class StringValueNode extends BasePrimitiveValueNode<string> {\n readonly type = ValueType.String;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: string,\n ) {\n super(id, name, schema, value, '');\n this.initObservable();\n }\n\n get defaultValue(): string {\n return (this.schema.default as string) ?? '';\n }\n\n protected coerceValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (value === null || value === undefined) {\n return '';\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n }\n\n protected override computeErrors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n this.validateRequired(errors);\n this.validateForeignKey(errors);\n this.validateMinLength(errors);\n this.validateMaxLength(errors);\n this.validatePattern(errors);\n this.validateEnum(errors);\n\n return errors;\n }\n\n private validateRequired(errors: Diagnostic[]): void {\n if (this.schema.required && this._value === '') {\n errors.push({\n severity: 'error',\n type: 'required',\n message: 'Field is required',\n path: this.name,\n });\n }\n }\n\n private validateForeignKey(errors: Diagnostic[]): void {\n const foreignKey = this.schema.foreignKey;\n if (foreignKey && this._value === '') {\n errors.push({\n severity: 'error',\n type: 'foreignKey',\n message: `Reference to ${foreignKey} is required`,\n path: this.name,\n params: { table: foreignKey },\n });\n }\n }\n\n private validateMinLength(errors: Diagnostic[]): void {\n const minLength = this.schema.minLength;\n if (\n minLength !== undefined &&\n this._value.length > 0 &&\n this._value.length < minLength\n ) {\n errors.push({\n severity: 'error',\n type: 'minLength',\n message: `Minimum length is ${minLength}`,\n path: this.name,\n params: { min: minLength, actual: this._value.length },\n });\n }\n }\n\n private validateMaxLength(errors: Diagnostic[]): void {\n const maxLength = this.schema.maxLength;\n if (maxLength !== undefined && this._value.length > maxLength) {\n errors.push({\n severity: 'error',\n type: 'maxLength',\n message: `Maximum length is ${maxLength}`,\n path: this.name,\n params: { max: maxLength, actual: this._value.length },\n });\n }\n }\n\n private validatePattern(errors: Diagnostic[]): void {\n const pattern = this.schema.pattern;\n if (!pattern || this._value.length === 0) {\n return;\n }\n\n try {\n if (!new RegExp(pattern).test(this._value)) {\n errors.push({\n severity: 'error',\n type: 'pattern',\n message: 'Value does not match pattern',\n path: this.name,\n params: { pattern },\n });\n }\n } catch {\n errors.push({\n severity: 'error',\n type: 'invalidPattern',\n message: 'Invalid regex pattern in schema',\n path: this.name,\n params: { pattern },\n });\n }\n }\n\n private validateEnum(errors: Diagnostic[]): void {\n const enumValues = this.schema.enum;\n if (\n enumValues &&\n enumValues.length > 0 &&\n !enumValues.includes(this._value)\n ) {\n errors.push({\n severity: 'error',\n type: 'enum',\n message: 'Value is not in allowed list',\n path: this.name,\n params: { allowed: enumValues, actual: this._value },\n });\n }\n }\n}\n","import type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class NumberValueNode extends BasePrimitiveValueNode<number> {\n readonly type = ValueType.Number;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: number,\n ) {\n super(id, name, schema, value, 0);\n this.initObservable();\n }\n\n get defaultValue(): number {\n return (this.schema.default as number) ?? 0;\n }\n\n protected coerceValue(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n return Number(value) || 0;\n }\n\n protected override computeErrors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n const minimum = this.schema.minimum;\n if (minimum !== undefined && this._value < minimum) {\n errors.push({\n severity: 'error',\n type: 'min',\n message: `Value must be at least ${minimum}`,\n path: this.name,\n params: { min: minimum, actual: this._value },\n });\n }\n\n const maximum = this.schema.maximum;\n if (maximum !== undefined && this._value > maximum) {\n errors.push({\n severity: 'error',\n type: 'max',\n message: `Value must be at most ${maximum}`,\n path: this.name,\n params: { max: maximum, actual: this._value },\n });\n }\n\n const enumValues = this.schema.enum;\n if (\n enumValues &&\n enumValues.length > 0 &&\n !enumValues.includes(this._value)\n ) {\n errors.push({\n severity: 'error',\n type: 'enum',\n message: 'Value is not in allowed list',\n path: this.name,\n params: { allowed: enumValues, actual: this._value },\n });\n }\n\n return errors;\n }\n}\n","import type { SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class BooleanValueNode extends BasePrimitiveValueNode<boolean> {\n readonly type = ValueType.Boolean;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: boolean,\n ) {\n super(id, name, schema, value, false);\n this.initObservable();\n }\n\n get defaultValue(): boolean {\n return (this.schema.default as boolean) ?? false;\n }\n\n protected coerceValue(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n return Boolean(value);\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { ObjectValueNode as IObjectValueNode, ValueNode } from './types';\n\nexport class ObjectValueNode extends BaseValueNode implements IObjectValueNode {\n readonly type = ValueType.Object;\n\n private _children: Map<string, ValueNode> = new Map();\n private _baseChildren: Map<string, ValueNode> = new Map();\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n children?: ValueNode[],\n ) {\n super(id, name, schema);\n\n if (children) {\n for (const child of children) {\n this._children.set(child.name, child);\n child.parent = this;\n }\n }\n\n this._baseChildren = new Map(this._children);\n\n makeObservable<ObjectValueNode, '_children' | '_baseChildren'>(this, {\n _children: observable,\n _baseChildren: observable,\n value: computed,\n children: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n addChild: action,\n removeChild: action,\n commit: action,\n revert: action,\n });\n }\n\n get value(): Record<string, ValueNode> {\n return Object.fromEntries(this._children);\n }\n\n get children(): readonly ValueNode[] {\n return Array.from(this._children.values());\n }\n\n getPlainValue(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, node] of this._children) {\n result[key] = node.getPlainValue();\n }\n return result;\n }\n\n child(name: string): ValueNode | undefined {\n return this._children.get(name);\n }\n\n hasChild(name: string): boolean {\n return this._children.has(name);\n }\n\n addChild(node: ValueNode): void {\n const existing = this._children.get(node.name);\n if (existing) {\n existing.parent = null;\n }\n node.parent = this;\n this._children.set(node.name, node);\n }\n\n removeChild(name: string): void {\n const node = this._children.get(name);\n if (node) {\n node.parent = null;\n this._children.delete(name);\n }\n }\n\n get isDirty(): boolean {\n if (this._children.size !== this._baseChildren.size) {\n return true;\n }\n\n for (const [key, child] of this._children) {\n if (this._baseChildren.get(key) !== child) {\n return true;\n }\n }\n\n for (const child of this._children.values()) {\n if ('isDirty' in child && (child as { isDirty: boolean }).isDirty) {\n return true;\n }\n }\n\n return false;\n }\n\n commit(): void {\n this._baseChildren = new Map(this._children);\n for (const child of this._children.values()) {\n if ('commit' in child && typeof child.commit === 'function') {\n (child as { commit: () => void }).commit();\n }\n }\n }\n\n revert(): void {\n for (const child of this._children.values()) {\n child.parent = null;\n }\n\n this._children = new Map(this._baseChildren);\n\n for (const child of this._children.values()) {\n child.parent = this;\n if ('revert' in child && typeof child.revert === 'function') {\n (child as { revert: () => void }).revert();\n }\n }\n }\n\n override isObject(): this is IObjectValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n for (const child of this._children.values()) {\n errors.push(...child.errors);\n }\n\n return errors;\n }\n\n override get warnings(): readonly Diagnostic[] {\n const warnings: Diagnostic[] = [];\n\n for (const child of this._children.values()) {\n warnings.push(...child.warnings);\n }\n\n return warnings;\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { ArrayValueNode as IArrayValueNode, ValueNode } from './types';\nimport type { NodeFactory } from './NodeFactory';\n\nexport class ArrayValueNode extends BaseValueNode implements IArrayValueNode {\n readonly type = ValueType.Array;\n\n private _items: ValueNode[] = [];\n private _baseItems: ValueNode[] = [];\n private _nodeFactory: NodeFactory | null = null;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n items?: ValueNode[],\n ) {\n super(id, name, schema);\n\n if (items) {\n for (const item of items) {\n item.parent = this;\n this._items.push(item);\n }\n }\n\n this._baseItems = [...this._items];\n\n makeObservable<ArrayValueNode, '_items' | '_baseItems'>(this, {\n _items: observable,\n _baseItems: observable,\n value: computed,\n length: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n push: action,\n insertAt: action,\n removeAt: action,\n move: action,\n replaceAt: action,\n clear: action,\n commit: action,\n revert: action,\n pushValue: action,\n insertValueAt: action,\n });\n }\n\n get value(): readonly ValueNode[] {\n return this._items;\n }\n\n get length(): number {\n return this._items.length;\n }\n\n getPlainValue(): unknown[] {\n return this._items.map((item) => item.getPlainValue());\n }\n\n at(index: number): ValueNode | undefined {\n if (index < 0) {\n return this._items[this._items.length + index];\n }\n return this._items[index];\n }\n\n push(node: ValueNode): void {\n node.parent = this;\n this._items.push(node);\n }\n\n insertAt(index: number, node: ValueNode): void {\n if (index < 0 || index > this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n node.parent = this;\n this._items.splice(index, 0, node);\n }\n\n removeAt(index: number): void {\n if (index < 0 || index >= this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n const removed = this._items.splice(index, 1)[0];\n if (removed) {\n removed.parent = null;\n }\n }\n\n move(fromIndex: number, toIndex: number): void {\n if (fromIndex < 0 || fromIndex >= this._items.length) {\n throw new Error(`Source index out of bounds: ${fromIndex}`);\n }\n if (toIndex < 0 || toIndex >= this._items.length) {\n throw new Error(`Target index out of bounds: ${toIndex}`);\n }\n if (fromIndex === toIndex) {\n return;\n }\n\n const [item] = this._items.splice(fromIndex, 1);\n if (item) {\n this._items.splice(toIndex, 0, item);\n }\n }\n\n replaceAt(index: number, node: ValueNode): void {\n if (index < 0 || index >= this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n const oldNode = this._items[index];\n if (oldNode) {\n oldNode.parent = null;\n }\n node.parent = this;\n this._items[index] = node;\n }\n\n clear(): void {\n for (const item of this._items) {\n item.parent = null;\n }\n this._items.length = 0;\n }\n\n setNodeFactory(factory: NodeFactory): void {\n this._nodeFactory = factory;\n }\n\n pushValue(value?: unknown): void {\n const node = this.createItemNode(this._items.length, value);\n this.push(node);\n }\n\n insertValueAt(index: number, value?: unknown): void {\n const node = this.createItemNode(index, value);\n this.insertAt(index, node);\n }\n\n private createItemNode(index: number, value?: unknown): ValueNode {\n if (!this._nodeFactory) {\n throw new Error('NodeFactory not set');\n }\n\n const itemSchema = this.schema.items;\n if (!itemSchema) {\n throw new Error('No items schema');\n }\n\n const itemValue = value === undefined ? itemSchema.default : value;\n const node = this._nodeFactory.create(String(index), itemSchema, itemValue);\n\n this.propagateFactory(node);\n\n return node;\n }\n\n private propagateFactory(node: ValueNode): void {\n if (!this._nodeFactory) {\n return;\n }\n\n if (node.isArray()) {\n node.setNodeFactory(this._nodeFactory);\n for (const item of node.value) {\n this.propagateFactory(item);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.propagateFactory(child);\n }\n }\n }\n\n get isDirty(): boolean {\n if (this._items.length !== this._baseItems.length) {\n return true;\n }\n\n for (let i = 0; i < this._items.length; i++) {\n if (this._items[i] !== this._baseItems[i]) {\n return true;\n }\n }\n\n for (const item of this._items) {\n if ('isDirty' in item && (item as { isDirty: boolean }).isDirty) {\n return true;\n }\n }\n\n return false;\n }\n\n commit(): void {\n this._baseItems = [...this._items];\n for (const item of this._items) {\n if ('commit' in item && typeof item.commit === 'function') {\n (item as { commit: () => void }).commit();\n }\n }\n }\n\n revert(): void {\n for (const item of this._items) {\n item.parent = null;\n }\n\n this._items = [...this._baseItems];\n\n for (const item of this._items) {\n item.parent = this;\n if ('revert' in item && typeof item.revert === 'function') {\n (item as { revert: () => void }).revert();\n }\n }\n }\n\n override isArray(): this is IArrayValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n for (const item of this._items) {\n errors.push(...item.errors);\n }\n\n return errors;\n }\n\n override get warnings(): readonly Diagnostic[] {\n const warnings: Diagnostic[] = [];\n\n for (const item of this._items) {\n warnings.push(...item.warnings);\n }\n\n return warnings;\n }\n}\n","import type { SchemaDefinition } from '../core/types';\nimport type { ValueNode } from './types';\nimport { StringValueNode } from './StringValueNode';\nimport { NumberValueNode } from './NumberValueNode';\nimport { BooleanValueNode } from './BooleanValueNode';\nimport { ObjectValueNode } from './ObjectValueNode';\nimport { ArrayValueNode } from './ArrayValueNode';\n\nexport type NodeFactoryFn = (\n name: string,\n schema: SchemaDefinition,\n value: unknown,\n id?: string,\n) => ValueNode;\n\nexport class NodeFactoryRegistry {\n private readonly factories = new Map<string, NodeFactoryFn>();\n\n register(schemaType: string, factory: NodeFactoryFn): this {\n this.factories.set(schemaType, factory);\n return this;\n }\n\n get(schemaType: string): NodeFactoryFn | undefined {\n return this.factories.get(schemaType);\n }\n\n has(schemaType: string): boolean {\n return this.factories.has(schemaType);\n }\n}\n\nexport class NodeFactory {\n constructor(private readonly registry: NodeFactoryRegistry) {}\n\n create(\n name: string,\n schema: SchemaDefinition,\n value: unknown,\n id?: string,\n ): ValueNode {\n const schemaType = schema.type ?? 'object';\n const factory = this.registry.get(schemaType);\n\n if (!factory) {\n throw new Error(`Unknown schema type: ${schemaType}`);\n }\n\n return factory(name, schema, value, id);\n }\n\n createTree(schema: SchemaDefinition, value: unknown): ValueNode {\n return this.create('', schema, value);\n }\n}\n\nconst stringFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new StringValueNode(id, name, schema, value as string | undefined);\n};\n\nconst numberFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new NumberValueNode(id, name, schema, value as number | undefined);\n};\n\nconst booleanFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new BooleanValueNode(id, name, schema, value as boolean | undefined);\n};\n\nfunction createObjectFactory(nodeFactory: NodeFactory): NodeFactoryFn {\n return (name, schema, value, id) => {\n const objValue = (value ?? {}) as Record<string, unknown>;\n const children: ValueNode[] = [];\n\n const properties = schema.properties ?? {};\n for (const [propName, propSchema] of Object.entries(properties)) {\n const propValue = objValue[propName];\n const childNode = nodeFactory.create(propName, propSchema, propValue);\n children.push(childNode);\n }\n\n return new ObjectValueNode(id, name, schema, children);\n };\n}\n\nfunction createArrayFactory(nodeFactory: NodeFactory): NodeFactoryFn {\n return (name, schema, value, id) => {\n const arrValue = (value ?? []) as unknown[];\n const itemSchema = schema.items ?? { type: 'string' };\n const items: ValueNode[] = [];\n\n for (let i = 0; i < arrValue.length; i++) {\n const itemValue = arrValue[i];\n const itemNode = nodeFactory.create(String(i), itemSchema, itemValue);\n items.push(itemNode);\n }\n\n return new ArrayValueNode(id, name, schema, items);\n };\n}\n\nexport function createDefaultRegistry(): NodeFactoryRegistry {\n const registry = new NodeFactoryRegistry();\n\n registry.register('string', stringFactory);\n registry.register('number', numberFactory);\n registry.register('boolean', booleanFactory);\n\n return registry;\n}\n\nexport function createNodeFactory(): NodeFactory {\n const registry = createDefaultRegistry();\n const factory = new NodeFactory(registry);\n\n registry.register('object', createObjectFactory(factory));\n registry.register('array', createArrayFactory(factory));\n\n return factory;\n}\n","export type PathSegment =\n | { type: 'property'; name: string }\n | { type: 'index'; index: number }\n | { type: 'items' };\n\nexport class Path {\n private constructor(private readonly _segments: readonly PathSegment[]) {}\n\n static empty(): Path {\n return new Path([]);\n }\n\n private static readonly INDEX_REGEX = /^\\[(\\d+)\\]/;\n private static readonly PROP_REGEX = /^\\.?([a-zA-Z_]\\w*)/;\n\n static fromString(path: string): Path {\n if (!path || path === '') {\n return Path.empty();\n }\n\n const segments: PathSegment[] = [];\n let current = path;\n\n while (current.length > 0) {\n const indexMatch = Path.INDEX_REGEX.exec(current);\n if (indexMatch?.[1] !== undefined) {\n segments.push({\n type: 'index',\n index: Number.parseInt(indexMatch[1], 10),\n });\n current = current.slice(indexMatch[0].length);\n continue;\n }\n\n if (current.startsWith('[*]')) {\n segments.push({ type: 'items' });\n current = current.slice(3);\n continue;\n }\n\n const propMatch = Path.PROP_REGEX.exec(current);\n if (propMatch?.[1] !== undefined) {\n segments.push({ type: 'property', name: propMatch[1] });\n current = current.slice(propMatch[0].length);\n continue;\n }\n\n throw new Error(`Invalid path segment: ${current}`);\n }\n\n return new Path(segments);\n }\n\n static fromSegments(segments: readonly PathSegment[]): Path {\n return new Path([...segments]);\n }\n\n segments(): readonly PathSegment[] {\n return this._segments;\n }\n\n isEmpty(): boolean {\n return this._segments.length === 0;\n }\n\n length(): number {\n return this._segments.length;\n }\n\n first(): PathSegment | undefined {\n return this._segments[0];\n }\n\n last(): PathSegment | undefined {\n return this._segments.at(-1);\n }\n\n parent(): Path {\n if (this._segments.length === 0) {\n return this;\n }\n return new Path(this._segments.slice(0, -1));\n }\n\n child(name: string): Path {\n return new Path([...this._segments, { type: 'property', name }]);\n }\n\n childIndex(index: number): Path {\n return new Path([...this._segments, { type: 'index', index }]);\n }\n\n childItems(): Path {\n return new Path([...this._segments, { type: 'items' }]);\n }\n\n isChildOf(parent: Path): boolean {\n if (parent._segments.length >= this._segments.length) {\n return false;\n }\n\n for (let i = 0; i < parent._segments.length; i++) {\n const parentSeg = parent._segments[i];\n const thisSeg = this._segments[i];\n if (!parentSeg || !thisSeg || !this.segmentEquals(parentSeg, thisSeg)) {\n return false;\n }\n }\n\n return true;\n }\n\n equals(other: Path): boolean {\n if (this._segments.length !== other._segments.length) {\n return false;\n }\n\n for (let i = 0; i < this._segments.length; i++) {\n const thisSeg = this._segments[i];\n const otherSeg = other._segments[i];\n if (!thisSeg || !otherSeg || !this.segmentEquals(thisSeg, otherSeg)) {\n return false;\n }\n }\n\n return true;\n }\n\n asSimple(): string {\n let result = '';\n\n for (const segment of this._segments) {\n if (segment.type === 'property') {\n if (result.length > 0) {\n result += '.';\n }\n result += segment.name;\n } else if (segment.type === 'index') {\n result += `[${segment.index}]`;\n } else if (segment.type === 'items') {\n result += '[*]';\n }\n }\n\n return result;\n }\n\n asJsonPointer(): string {\n if (this._segments.length === 0) {\n return '';\n }\n\n let result = '';\n\n for (const segment of this._segments) {\n if (segment.type === 'property') {\n result += '/' + segment.name;\n } else if (segment.type === 'index') {\n result += '/' + segment.index;\n } else if (segment.type === 'items') {\n result += '/-';\n }\n }\n\n return result;\n }\n\n private segmentEquals(a: PathSegment, b: PathSegment): boolean {\n if (a.type !== b.type) {\n return false;\n }\n\n if (a.type === 'property' && b.type === 'property') {\n return a.name === b.name;\n }\n\n if (a.type === 'index' && b.type === 'index') {\n return a.index === b.index;\n }\n\n return true;\n }\n}\n","import { Path } from '../core/Path';\nimport type { ValueNode } from '../node/types';\n\nexport class TreeIndex {\n private readonly nodesById = new Map<string, ValueNode>();\n private readonly pathCache = new Map<string, Path>();\n\n constructor(private readonly root: ValueNode) {\n this.rebuild();\n }\n\n nodeById(id: string): ValueNode | undefined {\n const node = this.nodesById.get(id);\n if (node) {\n return node;\n }\n\n this.rebuild();\n return this.nodesById.get(id);\n }\n\n pathOf(node: ValueNode): Path {\n if (this.isInsideArray(node)) {\n return this.computePath(node);\n }\n\n const cached = this.pathCache.get(node.id);\n if (cached) {\n return cached;\n }\n\n const path = this.computePath(node);\n this.pathCache.set(node.id, path);\n return path;\n }\n\n private isInsideArray(node: ValueNode): boolean {\n let current: ValueNode | null = node.parent;\n while (current) {\n if (current.isArray()) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n rebuild(): void {\n this.nodesById.clear();\n this.pathCache.clear();\n this.indexNode(this.root);\n }\n\n registerNode(node: ValueNode): void {\n this.indexNode(node);\n }\n\n invalidatePathsUnder(node: ValueNode): void {\n this.pathCache.delete(node.id);\n this.invalidateChildPaths(node);\n }\n\n private indexNode(node: ValueNode): void {\n this.nodesById.set(node.id, node);\n\n if (node.isObject()) {\n for (const child of node.children) {\n this.indexNode(child);\n }\n } else if (node.isArray()) {\n for (const item of node.value) {\n this.indexNode(item);\n }\n }\n }\n\n private computePath(node: ValueNode): Path {\n const segments: Array<\n { type: 'property'; name: string } | { type: 'index'; index: number }\n > = [];\n let current: ValueNode | null = node;\n\n while (current?.parent) {\n const parent: ValueNode = current.parent;\n\n if (parent.isObject()) {\n segments.unshift({ type: 'property', name: current.name });\n } else if (parent.isArray()) {\n const index = parent.value.indexOf(current);\n if (index >= 0) {\n segments.unshift({ type: 'index', index });\n }\n }\n\n current = parent;\n }\n\n return Path.fromSegments(segments);\n }\n\n private invalidateChildPaths(node: ValueNode): void {\n if (node.isObject()) {\n for (const child of node.children) {\n this.pathCache.delete(child.id);\n this.invalidateChildPaths(child);\n }\n } else if (node.isArray()) {\n for (const item of node.value) {\n this.pathCache.delete(item.id);\n this.invalidateChildPaths(item);\n }\n }\n }\n}\n","import type { Change, JsonPatch } from '../core/types';\n\nexport class ChangeTracker {\n private _changes: Change[] = [];\n\n get changes(): readonly Change[] {\n return this._changes;\n }\n\n get hasChanges(): boolean {\n return this._changes.length > 0;\n }\n\n track(change: Change): void {\n this._changes.push(change);\n }\n\n clear(): void {\n this._changes = [];\n }\n\n toPatches(): readonly JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of this._changes) {\n const patch = this.changeToPatches(change);\n patches.push(...patch);\n }\n\n return patches;\n }\n\n private changeToPatches(change: Change): JsonPatch[] {\n const path = change.path.asJsonPointer();\n\n switch (change.type) {\n case 'setValue':\n return [{ op: 'replace', path, value: change.value }];\n\n case 'addProperty':\n return [{ op: 'add', path, value: change.value }];\n\n case 'removeProperty':\n return [{ op: 'remove', path }];\n\n case 'arrayPush':\n return [{ op: 'add', path: `${path}/-`, value: change.value }];\n\n case 'arrayInsert':\n return [\n { op: 'add', path: `${path}/${change.index}`, value: change.value },\n ];\n\n case 'arrayRemove':\n return [{ op: 'remove', path: `${path}/${change.index}` }];\n\n case 'arrayMove': {\n const fromIndex = change.fromIndex ?? 0;\n const toIndex = change.toIndex ?? 0;\n return [\n {\n op: 'move',\n from: `${path}/${fromIndex}`,\n path: `${path}/${toIndex}`,\n },\n ];\n }\n\n case 'arrayReplace':\n return [\n {\n op: 'replace',\n path: `${path}/${change.index}`,\n value: change.value,\n },\n ];\n\n case 'arrayClear':\n return [{ op: 'replace', path, value: [] }];\n\n default:\n return [];\n }\n }\n}\n","import { makeObservable, computed, action } from 'mobx';\nimport type { Diagnostic, Change, JsonPatch } from '../core/types';\nimport { Path } from '../core/Path';\nimport type { PathSegment } from '../core/Path';\nimport type { ValueNode, DirtyTrackable } from '../node/types';\nimport { TreeIndex } from './TreeIndex';\nimport { ChangeTracker } from './ChangeTracker';\nimport type { FormulaEngine } from '../formula/FormulaEngine';\n\nexport class ValueTree {\n private readonly index: TreeIndex;\n private readonly changeTracker: ChangeTracker;\n private _formulaEngine: FormulaEngine | null = null;\n\n constructor(private readonly _root: ValueNode) {\n this.index = new TreeIndex(_root);\n this.changeTracker = new ChangeTracker();\n\n makeObservable(this, {\n allErrors: computed,\n allWarnings: computed,\n allDiagnostics: computed,\n isValid: computed,\n hasDiagnostics: computed,\n isDirty: computed,\n commit: action,\n revert: action,\n });\n }\n\n get root(): ValueNode {\n return this._root;\n }\n\n nodeById(id: string): ValueNode | undefined {\n return this.index.nodeById(id);\n }\n\n get(path: string): ValueNode | undefined {\n return this.getByPath(Path.fromString(path));\n }\n\n getByPath(path: Path): ValueNode | undefined {\n if (path.isEmpty()) {\n return this._root;\n }\n\n let current: ValueNode | undefined = this._root;\n\n for (const segment of path.segments()) {\n if (!current) {\n return undefined;\n }\n\n current = this.resolveSegment(current, segment);\n }\n\n return current;\n }\n\n private resolveSegment(\n node: ValueNode,\n segment: PathSegment,\n ): ValueNode | undefined {\n if (segment.type === 'property' && node.isObject()) {\n return node.child(segment.name);\n }\n if (segment.type === 'index' && node.isArray()) {\n return node.at(segment.index);\n }\n return undefined;\n }\n\n pathOf(nodeOrId: ValueNode | string): Path {\n const node =\n typeof nodeOrId === 'string' ? this.nodeById(nodeOrId) : nodeOrId;\n if (!node) {\n return Path.empty();\n }\n return this.index.pathOf(node);\n }\n\n get allErrors(): readonly Diagnostic[] {\n return this._root.errors;\n }\n\n get allWarnings(): readonly Diagnostic[] {\n return this._root.warnings;\n }\n\n get allDiagnostics(): readonly Diagnostic[] {\n return [...this.allErrors, ...this.allWarnings];\n }\n\n get isValid(): boolean {\n return this.allErrors.length === 0;\n }\n\n get hasDiagnostics(): boolean {\n return this.allDiagnostics.length > 0;\n }\n\n get errorsByPath(): ReadonlyMap<string, readonly Diagnostic[]> {\n const map = new Map<string, Diagnostic[]>();\n for (const error of this.allErrors) {\n const list = map.get(error.path) ?? [];\n list.push(error);\n map.set(error.path, list);\n }\n return map;\n }\n\n getValue(path: string): unknown {\n return this.get(path)?.getPlainValue();\n }\n\n setValue(path: string, value: unknown): void {\n const parsedPath = Path.fromString(path);\n const node = this.getByPath(parsedPath);\n if (!node) {\n throw new Error(`Path not found: ${path}`);\n }\n if (!node.isPrimitive()) {\n throw new Error(`Cannot set value on non-primitive node: ${path}`);\n }\n\n const oldValue = node.value;\n node.setValue(value);\n\n this.changeTracker.track({\n type: 'setValue',\n path: parsedPath,\n value,\n oldValue,\n });\n }\n\n getPlainValue(): unknown {\n return this._root.getPlainValue();\n }\n\n get changes(): readonly Change[] {\n return this.changeTracker.changes;\n }\n\n get hasChanges(): boolean {\n return this.changeTracker.hasChanges;\n }\n\n clearChanges(): void {\n this.changeTracker.clear();\n }\n\n getPatches(): readonly JsonPatch[] {\n return this.changeTracker.toPatches();\n }\n\n trackChange(change: Change): void {\n this.changeTracker.track(change);\n }\n\n rebuildIndex(): void {\n this.index.rebuild();\n }\n\n invalidatePathsUnder(node: ValueNode): void {\n this.index.invalidatePathsUnder(node);\n }\n\n get isDirty(): boolean {\n const root = this._root as unknown as DirtyTrackable;\n if ('isDirty' in root) {\n return root.isDirty;\n }\n return false;\n }\n\n commit(): void {\n const root = this._root as unknown as DirtyTrackable;\n if ('commit' in root && typeof root.commit === 'function') {\n root.commit();\n }\n this.changeTracker.clear();\n }\n\n revert(): void {\n const root = this._root as unknown as DirtyTrackable;\n if ('revert' in root && typeof root.revert === 'function') {\n root.revert();\n }\n this.changeTracker.clear();\n }\n\n setFormulaEngine(engine: FormulaEngine): void {\n this._formulaEngine = engine;\n }\n\n get formulaEngine(): FormulaEngine | null {\n return this._formulaEngine;\n }\n\n dispose(): void {\n this._formulaEngine?.dispose();\n this._formulaEngine = null;\n }\n}\n","import { parseExpression } from '@revisium/formula';\nimport type {\n ValueNode,\n PrimitiveValueNode,\n ObjectValueNode,\n} from '../node/types';\nimport type { FormulaField, FormulaArrayLevel } from './types';\n\ninterface TraverseContext {\n parent: ObjectValueNode | null;\n arrayLevels: FormulaArrayLevel[];\n}\n\ntype PathSegment =\n | { type: 'property'; name: string }\n | { type: 'index'; index: number };\n\nconst INDEX_REGEX = /^\\[(-?\\d+)\\]/;\nconst PROP_REGEX = /^\\.?([a-zA-Z_]\\w*)/;\n\nexport class FormulaCollector {\n private root: ValueNode | null = null;\n\n collect(root: ValueNode): FormulaField[] {\n this.root = root;\n const formulas: FormulaField[] = [];\n this.traverse(root, { parent: null, arrayLevels: [] }, formulas);\n return formulas;\n }\n\n private traverse(\n node: ValueNode,\n context: TraverseContext,\n formulas: FormulaField[],\n ): void {\n if (node.isPrimitive()) {\n this.collectPrimitive(node, context, formulas);\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.traverse(child, { ...context, parent: node }, formulas);\n }\n } else if (node.isArray()) {\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n this.traverse(\n item,\n {\n ...context,\n arrayLevels: [...context.arrayLevels, { array: node, index: i }],\n },\n formulas,\n );\n }\n }\n }\n }\n\n private collectPrimitive(\n node: PrimitiveValueNode,\n context: TraverseContext,\n formulas: FormulaField[],\n ): void {\n const formula = node.formula;\n if (!formula) {\n return;\n }\n\n const rawDependencies = this.extractDependencies(formula.expression);\n const dependencyNodes = this.resolveDependencies(\n rawDependencies,\n node,\n context,\n );\n\n formulas.push({\n node,\n expression: formula.expression,\n parent: context.parent,\n dependencyNodes,\n arrayLevels: context.arrayLevels,\n });\n }\n\n private extractDependencies(expression: string): readonly string[] {\n try {\n const parsed = parseExpression(expression);\n return parsed.dependencies;\n } catch {\n return [];\n }\n }\n\n private resolveDependencies(\n rawDeps: readonly string[],\n formulaNode: PrimitiveValueNode,\n context: TraverseContext,\n ): PrimitiveValueNode[] {\n const nodes: PrimitiveValueNode[] = [];\n\n for (const dep of rawDeps) {\n const node = this.resolveOneDependency(dep, formulaNode, context);\n if (node) {\n this.collectPrimitiveNodes(node, nodes);\n }\n }\n\n return nodes;\n }\n\n private collectPrimitiveNodes(\n node: ValueNode,\n result: PrimitiveValueNode[],\n ): void {\n if (node.isPrimitive()) {\n result.push(node);\n } else if (node.isArray()) {\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n this.collectPrimitiveNodes(item, result);\n }\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.collectPrimitiveNodes(child, result);\n }\n }\n }\n\n private resolveOneDependency(\n dep: string,\n _formulaNode: PrimitiveValueNode,\n context: TraverseContext,\n ): ValueNode | null {\n if (dep.startsWith('/')) {\n return this.resolveFromRoot(dep.slice(1));\n }\n\n if (dep.startsWith('../')) {\n return this.resolveRelative(dep, context);\n }\n\n if (context.parent) {\n return this.resolveFromNode(context.parent, dep);\n }\n\n return this.resolveFromRoot(dep);\n }\n\n private resolveFromRoot(pathStr: string): ValueNode | null {\n if (!this.root) {\n return null;\n }\n return this.resolveFromNode(this.root, pathStr);\n }\n\n private resolveFromNode(\n startNode: ValueNode,\n pathStr: string,\n ): ValueNode | null {\n const segments = this.parsePathSegments(pathStr);\n let current: ValueNode | null = startNode;\n\n for (const segment of segments) {\n if (!current) {\n return null;\n }\n\n if (segment.type === 'property') {\n if (current.isObject()) {\n current =\n current.children.find((c) => c.name === segment.name) ?? null;\n } else {\n return null;\n }\n } else if (segment.type === 'index') {\n if (current.isArray()) {\n current = current.at(segment.index) ?? null;\n } else {\n return null;\n }\n }\n }\n\n return current;\n }\n\n private resolveRelative(\n dep: string,\n context: TraverseContext,\n ): ValueNode | null {\n let upLevels = 0;\n let remaining = dep;\n\n while (remaining.startsWith('../')) {\n upLevels++;\n remaining = remaining.slice(3);\n }\n\n let current: ValueNode | null = context.parent;\n\n for (let i = 0; i < upLevels && current; i++) {\n current = this.findParent(current);\n if (current?.isArray()) {\n current = this.findParent(current);\n }\n }\n\n if (!current) {\n return null;\n }\n\n if (remaining) {\n return this.resolveFromNode(current, remaining);\n }\n\n return current;\n }\n\n private findParent(node: ValueNode): ValueNode | null {\n if (!this.root || node === this.root) {\n return null;\n }\n\n return this.findParentRecursive(this.root, node);\n }\n\n private findParentRecursive(\n current: ValueNode,\n target: ValueNode,\n ): ValueNode | null {\n const children = this.getChildNodes(current);\n\n for (const child of children) {\n if (child === target) {\n return current;\n }\n const found = this.findParentRecursive(child, target);\n if (found) {\n return found;\n }\n }\n\n return null;\n }\n\n private getChildNodes(node: ValueNode): ValueNode[] {\n if (node.isObject()) {\n return [...node.children];\n }\n if (node.isArray()) {\n const items: ValueNode[] = [];\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n items.push(item);\n }\n }\n return items;\n }\n return [];\n }\n\n private parsePathSegments(pathStr: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = pathStr;\n\n while (current.length > 0) {\n const indexMatch = INDEX_REGEX.exec(current);\n if (indexMatch?.[1]) {\n segments.push({\n type: 'index',\n index: Number.parseInt(indexMatch[1], 10),\n });\n current = current.slice(indexMatch[0].length);\n continue;\n }\n\n const propMatch = PROP_REGEX.exec(current);\n if (propMatch?.[1]) {\n segments.push({ type: 'property', name: propMatch[1] });\n current = current.slice(propMatch[0].length);\n continue;\n }\n\n break;\n }\n\n return segments;\n }\n}\n","import type { PrimitiveValueNode } from '../node/types';\nimport type { FormulaField, DependencyMap } from './types';\n\nexport class DependencyGraph {\n buildDependencyMap(formulas: readonly FormulaField[]): DependencyMap {\n const map: DependencyMap = new Map();\n\n for (const field of formulas) {\n for (const depNode of field.dependencyNodes) {\n let depSet = map.get(depNode);\n if (!depSet) {\n depSet = new Set();\n map.set(depNode, depSet);\n }\n depSet.add(field);\n }\n }\n\n return map;\n }\n\n buildEvaluationOrder(\n formulas: readonly FormulaField[],\n ): readonly FormulaField[] {\n const formulaNodes = new Set(formulas.map((f) => f.node));\n const visited = new Set<PrimitiveValueNode>();\n const order: FormulaField[] = [];\n\n const formulaByNode = new Map<PrimitiveValueNode, FormulaField>();\n for (const field of formulas) {\n formulaByNode.set(field.node, field);\n }\n\n const visit = (\n field: FormulaField,\n stack: Set<PrimitiveValueNode>,\n ): void => {\n if (visited.has(field.node)) {\n return;\n }\n\n if (stack.has(field.node)) {\n return;\n }\n\n stack.add(field.node);\n\n for (const depNode of field.dependencyNodes) {\n if (formulaNodes.has(depNode)) {\n const depFormula = formulaByNode.get(depNode);\n if (depFormula) {\n visit(depFormula, stack);\n }\n }\n }\n\n stack.delete(field.node);\n visited.add(field.node);\n order.push(field);\n };\n\n for (const field of formulas) {\n visit(field, new Set());\n }\n\n return order;\n }\n\n getAffectedFormulas(\n changedNode: PrimitiveValueNode,\n dependencyMap: DependencyMap,\n evaluationOrder: readonly FormulaField[],\n ): readonly FormulaField[] {\n const affected = new Set<FormulaField>();\n const queue: PrimitiveValueNode[] = [changedNode];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const dependents = dependencyMap.get(current);\n\n if (dependents) {\n for (const field of dependents) {\n if (!affected.has(field)) {\n affected.add(field);\n queue.push(field.node);\n }\n }\n }\n }\n\n return evaluationOrder.filter((field) => affected.has(field));\n }\n}\n","import { evaluateWithContext } from '@revisium/formula';\nimport type { ValueTree } from '../tree/ValueTree';\nimport type { ValueNode, ObjectValueNode } from '../node/types';\nimport type { FormulaField, FormulaEngineOptions } from './types';\n\nexport class FormulaEvaluator {\n constructor(\n private readonly tree: ValueTree,\n private readonly options: FormulaEngineOptions = {},\n ) {}\n\n evaluate(field: FormulaField): void {\n try {\n const context = this.buildContext(field);\n const result = evaluateWithContext(field.expression, context);\n\n this.setNodeValue(field, result);\n this.checkForWarnings(field, result);\n } catch (error) {\n this.handleError(field, error as Error);\n }\n }\n\n evaluateAll(fields: Iterable<FormulaField>): void {\n for (const field of fields) {\n this.evaluate(field);\n }\n }\n\n private buildContext(field: FormulaField) {\n const rootData = this.tree.getPlainValue() as Record<string, unknown>;\n\n const context: {\n rootData: Record<string, unknown>;\n itemData?: Record<string, unknown>;\n currentPath?: string;\n arrayContext?: {\n levels: Array<{\n index: number;\n length: number;\n prev: unknown;\n next: unknown;\n }>;\n };\n } = { rootData };\n\n if (field.parent) {\n const itemData = this.getPlainObjectValue(field.parent);\n if (itemData) {\n context.itemData = itemData;\n }\n }\n\n if (field.arrayLevels.length > 0) {\n context.arrayContext = { levels: this.buildArrayLevels(field) };\n }\n\n return context;\n }\n\n private buildArrayLevels(field: FormulaField) {\n const levels: Array<{\n index: number;\n length: number;\n prev: unknown;\n next: unknown;\n }> = [];\n\n // Build levels from innermost to outermost (reverse order)\n // levels[0] = current (innermost), levels[1] = parent, levels[2] = root, etc.\n for (let i = field.arrayLevels.length - 1; i >= 0; i--) {\n const level = field.arrayLevels[i];\n if (!level) {\n continue;\n }\n const { array, index } = level;\n\n levels.push({\n index,\n length: array.length,\n prev: this.getPrevItemValue(array, index),\n next: this.getNextItemValue(array, index),\n });\n }\n\n return levels;\n }\n\n private getPrevItemValue(\n array: { at(i: number): ValueNode | undefined; length: number },\n index: number,\n ): unknown {\n if (index <= 0) {\n return null;\n }\n const prevItem = array.at(index - 1);\n return prevItem ? this.getPlainNodeValue(prevItem) : null;\n }\n\n private getNextItemValue(\n array: { at(i: number): ValueNode | undefined; length: number },\n index: number,\n ): unknown {\n if (index >= array.length - 1) {\n return null;\n }\n const nextItem = array.at(index + 1);\n return nextItem ? this.getPlainNodeValue(nextItem) : null;\n }\n\n private getPlainObjectValue(node: ObjectValueNode): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const child of node.children) {\n result[child.name] = this.getPlainNodeValue(child);\n }\n return result;\n }\n\n private getPlainNodeValue(node: ValueNode): unknown {\n if (node.isPrimitive()) {\n return node.value;\n }\n if (node.isObject()) {\n return this.getPlainObjectValue(node);\n }\n if (node.isArray()) {\n const result: unknown[] = [];\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n result.push(this.getPlainNodeValue(item));\n }\n }\n return result;\n }\n return null;\n }\n\n private setNodeValue(field: FormulaField, result: unknown): void {\n const { node } = field;\n const defaultValue = node.defaultValue;\n\n if (result === null || result === undefined) {\n node.setValue(defaultValue, { internal: true });\n return;\n }\n\n if (\n typeof result === 'number' &&\n (Number.isNaN(result) || !Number.isFinite(result))\n ) {\n node.setValue(defaultValue, { internal: true });\n return;\n }\n\n node.setValue(result, { internal: true });\n }\n\n private checkForWarnings(field: FormulaField, result: unknown): void {\n const { node } = field;\n\n if (typeof result === 'number') {\n if (Number.isNaN(result)) {\n node.setFormulaWarning({\n type: 'nan',\n message: 'Formula result is NaN',\n expression: field.expression,\n computedValue: result,\n });\n return;\n }\n\n if (!Number.isFinite(result)) {\n node.setFormulaWarning({\n type: 'infinity',\n message: 'Formula result is Infinity',\n expression: field.expression,\n computedValue: result,\n });\n return;\n }\n }\n\n node.setFormulaWarning(null);\n }\n\n private handleError(field: FormulaField, error: Error): void {\n const { node } = field;\n\n node.setValue(node.defaultValue, { internal: true });\n\n node.setFormulaWarning({\n type: 'runtime-error',\n message: error.message,\n expression: field.expression,\n computedValue: undefined,\n });\n\n if (this.options.onError) {\n this.options.onError(node, error);\n }\n }\n}\n","import { reaction, runInAction, IReactionDisposer } from 'mobx';\nimport type { ValueTree } from '../tree/ValueTree';\nimport type { ValueNode, PrimitiveValueNode } from '../node/types';\nimport type {\n FormulaField,\n DependencyMap,\n FormulaEngineOptions,\n} from './types';\nimport { FormulaCollector } from './FormulaCollector';\nimport { DependencyGraph } from './DependencyGraph';\nimport { FormulaEvaluator } from './FormulaEvaluator';\n\nexport class FormulaEngine {\n private readonly collector: FormulaCollector;\n private readonly graph: DependencyGraph;\n private readonly evaluator: FormulaEvaluator;\n\n private formulas: FormulaField[] = [];\n private dependencyMap: DependencyMap = new Map();\n private evaluationOrder: readonly FormulaField[] = [];\n private disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly tree: ValueTree,\n options: FormulaEngineOptions = {},\n ) {\n this.collector = new FormulaCollector();\n this.graph = new DependencyGraph();\n this.evaluator = new FormulaEvaluator(tree, options);\n\n this.initialize();\n }\n\n reinitialize(): void {\n this.disposeReactions();\n this.initialize();\n }\n\n dispose(): void {\n this.disposeReactions();\n this.formulas = [];\n this.dependencyMap = new Map();\n this.evaluationOrder = [];\n }\n\n getFormulas(): readonly FormulaField[] {\n return this.formulas;\n }\n\n getEvaluationOrder(): readonly FormulaField[] {\n return this.evaluationOrder;\n }\n\n private initialize(): void {\n this.formulas = this.collector.collect(this.tree.root);\n\n this.dependencyMap = this.graph.buildDependencyMap(this.formulas);\n this.evaluationOrder = this.graph.buildEvaluationOrder(this.formulas);\n\n this.evaluateAll();\n\n this.setupReactions();\n }\n\n private evaluateAll(): void {\n runInAction(() => {\n for (const field of this.evaluationOrder) {\n this.evaluator.evaluate(field);\n }\n });\n }\n\n private setupReactions(): void {\n const watchedNodes = new Set<PrimitiveValueNode>();\n\n for (const [depNode] of this.dependencyMap) {\n if (watchedNodes.has(depNode)) {\n continue;\n }\n watchedNodes.add(depNode);\n\n const disposer = reaction(\n () => depNode.value,\n () => this.handleDependencyChange(depNode),\n );\n this.disposers.push(disposer);\n }\n\n this.setupArrayReactions(this.tree.root);\n }\n\n private setupArrayReactions(node: ValueNode): void {\n if (node.isArray()) {\n const disposer = reaction(\n () => node.length,\n () => this.handleStructureChange(),\n );\n this.disposers.push(disposer);\n\n for (const item of node.value) {\n this.setupArrayReactions(item);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.setupArrayReactions(child);\n }\n }\n }\n\n private handleDependencyChange(changedNode: PrimitiveValueNode): void {\n const affected = this.graph.getAffectedFormulas(\n changedNode,\n this.dependencyMap,\n this.evaluationOrder,\n );\n\n runInAction(() => {\n for (const field of affected) {\n this.evaluator.evaluate(field);\n }\n });\n }\n\n private handleStructureChange(): void {\n this.reinitialize();\n }\n\n private disposeReactions(): void {\n for (const disposer of this.disposers) {\n disposer();\n }\n this.disposers = [];\n }\n}\n","import type { SchemaDefinition } from './core/types';\nimport { createNodeFactory, NodeFactory } from './node/NodeFactory';\nimport type { ValueNode } from './node/types';\nimport { ValueTree } from './tree/ValueTree';\nimport { FormulaEngine } from './formula/FormulaEngine';\nimport type { FormulaEngineOptions } from './formula/types';\n\nexport interface CreateValueModelOptions {\n nodeFactory?: NodeFactory;\n formulaEngine?: boolean | FormulaEngineOptions;\n}\n\nexport function createValueModel(\n schema: SchemaDefinition,\n initialValue: unknown,\n options?: CreateValueModelOptions,\n): ValueTree {\n const nodeFactory = options?.nodeFactory ?? createNodeFactory();\n const rootNode = nodeFactory.createTree(schema, initialValue);\n\n propagateFactoryToArrays(rootNode, nodeFactory);\n\n const tree = new ValueTree(rootNode);\n\n if (options?.formulaEngine !== false) {\n const formulaOptions =\n typeof options?.formulaEngine === 'object' ? options.formulaEngine : {};\n const engine = new FormulaEngine(tree, formulaOptions);\n tree.setFormulaEngine(engine);\n }\n\n return tree;\n}\n\nfunction propagateFactoryToArrays(node: ValueNode, factory: NodeFactory): void {\n if (node.isArray()) {\n node.setNodeFactory(factory);\n for (const item of node.value) {\n propagateFactoryToArrays(item, factory);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n propagateFactoryToArrays(child, factory);\n }\n }\n}\n\nexport function createEmptyValueModel(\n schema: SchemaDefinition,\n options?: CreateValueModelOptions,\n): ValueTree {\n return createValueModel(schema, undefined, options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAa,UAAUA,MAAM,WAC3B,SAAS,QAAQ,OAAO,KAAK;CAC3B,MAAM,EACJ,WACA,UACA,UACA,YAAY,MACZ,SACA,cACA,WACA,GAAG,SACD;AAEJ,KAAI,SACF,QAAO,yEAAG,WAAY;AAGxB,QACE,4CAACC,yBAAc;EAAK,GAAI;aACtB,2CAACA,yBAAc;GAAQ;GAAS;IAAiC,EACjE,2CAACC;GAAO,UAAU,CAAC;GAAW,WAAW;aACvC,2CAACD,yBAAc,wBACb,4CAACA,yBAAc;IAAa;IAAK,GAAI;eAClC,aACC,2CAACA,yBAAc,mBACb,2CAACA,yBAAc,aAAW,GACN,EAEvB;KACqB,GACC;IACpB;GACU;EAG1B;;;;ACpCD,SAAS,WAAW,MAAsB;AACxC,QAAO,KACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,SAAS;;AAoB9B,MAAM,UAAU,IAAI,IAAI;CACtB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAa,mBAAsD,EACjE,WACA,aACA,WACA,QACA,UACA,UACA,SACA,SACA,uBACA,UACA,QACA,SACA,YACA,qBACI;CACJ,MAAM,wBAAoC,KAAK;CAC/C,MAAM,mCAAuC,KAAK;AAElD,4BAAgB;AACd,MAAI,UACF,KAAI,SAAS,OAAO;IAErB,CAAC,UAAU,CAAC;AAEf,kCAAsB;AAEpB,MADkB,WAAW,cAAc,IAC1B,eAAe,YAAY,QAAQ,IAAI,SAAS;GAC/D,MAAM,eAAe,IAAI,QAAQ,eAAe,IAAI;GACpD,MAAM,WAAW,KAAK,IAAI,aAAa,eAAe,QAAQ;GAE9D,MAAM,QAAQ,SAAS,aAAa;GACpC,MAAM,MAAM,WAAW,cAAc;GAErC,MAAM,OADa,IAAI,QAAQ,WAAW,MACT,IAAI;AACrC,SAAM,SAAS,MAAM,SAAS;AAC9B,SAAM,SAAS,KAAK;AAEpB,OAAI,KAAK;AACP,QAAI,iBAAiB;AACrB,QAAI,SAAS,MAAM;;;GAGvB;AAEF,sCAAsB;AACpB,MAAI,uBAAuB;AACzB,OAAI,SAAS,OAAO;GACpB,MAAM,YAAY,WAAW,cAAc;AAE3C,OAAI,IAAI,WAAW,WAAW;IAC5B,MAAM,QAAQ,SAAS,aAAa;AACpC,UAAM,mBAAmB,IAAI,QAAQ;AACrC,UAAM,SAAS,MAAM;AACrB,cAAU,iBAAiB;AAC3B,cAAU,SAAS,MAAM;;;IAG5B,CAAC,GAAI,yBAAyB,EAAE,CAAE,CAAC;CAEtC,MAAM,uCACH,UAAU;EACT,MAAM,YAAY,WAAW,cAAc;AAC3C,MAAI,aAAa,UAAU,aAAa,EACtC,gBAAe,UAAU,UAAU,WAAW,EAAE,CAAC;EAGnD,MAAM,YAAY,MAAM,cAAc;AACtC,aAAW,cAAc,OAAO,KAAK,UAAU;IAEjD,CAAC,SAAS,CACX;CAED,MAAM,0CAAuE;AAC3E,YAAU;AACV,iBAAe,UAAU;IACxB,CAAC,OAAO,CAAC;CAEZ,MAAM,wCACH,UAAU;AACT,MAAI,MAAM,QAAQ,SAAS;AACzB,SAAM,gBAAgB;AAEtB,OAAI,WAAW;AACb,QAAI,SAAS,MAAM;AACnB,eAAW;;;AAGf,MAAI,MAAM,QAAQ,UAAU;AAC1B,SAAM,gBAAgB;AACtB,OAAI,UACF,KAAI,SAAS,MAAM;AAErB,eAAY;;AAGd,MAAI,YAAY,CAAC,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAClE,OAAM,gBAAgB;IAG1B;EAAC;EAAW;EAAS;EAAU;EAAS,CACzC;CAED,MAAM,iDAAsC;AAC1C,MAAI,SAAS,OAAO;IACnB,EAAE,CAAC;CAEN,MAAM,kBAAkB,CAAC,aAAa;AAEtC,QACE,4CAACE;EACC,UAAU;EACV,OAAO,kBAAkB,SAAS;EAClC,UAAS;EACT,SAAS;;GAER,CAAC,mBAAmB;GACrB,2CAACC;IACC,OAAM;IACU;IAChB,eAAa;IACR;IACL;IACA,YAAY;IACZ,yBAAyB,EAAE,QAAQ,WAAW,UAAU,EAAE;IAC1D,SAAS;IACT,OAAM;IACN,QAAQ;IACC;IACT,SAAS;IACT,WAAW;KACN;GACN,CAAC,mBAAmB;GACpB,mBACC,2CAACC;IACC,QAAO;IACP,YAAW;IACX,eAAc;IACd,YAAW;IACX,OAAM;IACN,UAAS;cAER;KACI;;GAEJ;;;;;ACjLX,MAAa,cAAyC,EACpD,SAAS,UACT,OACA,SACA,UACA,YACA,WACA,MACA,iBACI;AACJ,QACE,2CAACC;EACC,eAAa;EACb,QAAQ;GAAE,OAAO;GAAY,iBAAiB;GAAS;EACvD,WACE,aACI;GAAE,iBAAiB;GAAW,QAAQ;GAAe,GACrD;EAEN,WAAU;EACV,OAAM;EACN,YAAW;EACX,UAAU;EACF;EACR,UAAU,YAAY;EACtB,SAAS;EACT,SAAQ;EACC;YAET,4CAACC;GAAK,YAAW;GAAS,KAAI;cAC3B,QAAQ,2CAACC;IAAI,UAAS;cAAM;KAAW,EACxC,2CAACC,mCAAM,QAAa;IACf;GACA;;;;;ACnCb,MAAa,gBAA6C,UAAU;AAClE,QAAO,2CAAC;EAAW,GAAI;EAAO,MAAM,2CAACC,8BAAa;GAAI;;;;;ACFxD,MAAa,eAA2C,EACtD,SAAS,UACT,SACA,UACA,iBACI;AACJ,QACE,2CAACC;EACC,eAAa;EACH;EACV,QAAQ,EAAE,iBAAiB,WAAW;EACtC,WAAU;EACV,OAAM;EACE;EACR,SAAQ;EACC;EACT,OAAM;YAEN,2CAACC;GAAK,MAAK;aACT,2CAACC,uBAAM;IACF;GACA;;;;;ACrBb,MAAa,cAAyC,EACpD,SAAS,UACT,SACA,YACA,iBACI;AACJ,QACE,2CAACC;EACC,eAAa;EACb,UAAU;EACV,QAAQ,EAAE,iBAAiB,WAAW;EACtC,WAAU;EACF;EACR,SAAQ;EACC;YAET,2CAACC;GAAK,SAAS;GAAG,OAAM;aACtB,2CAACC,+BAAc;IACV;GACA;;;;;ACtBb,MAAa,kBAA2C,EACtD,YACA,GAAG,YACC;AACJ,QACE,2CAACC;EACC,eAAa;EACb,QAAQ,EAAE,iBAAiB,WAAW;EACtC,OAAM;EACN,SAAQ;EACR,MAAK;EACL,GAAI;YAEJ,2CAACC,0BAAS;GACC;;;;;ACdjB,MAAa,cAAmC,EAAE,YAAY,GAAG,YAAY;AAC3E,QACE,2CAACC;EACC,eAAa;EACb,QAAQ,EAAE,iBAAiB,YAAY;EACvC,OAAM;EACN,SAAQ;EACR,GAAI;YAEJ,2CAACC,0BAAS;GACC;;;;;ACKjB,MAAa,YAAqC,EAChD,MACA,UACA,UACA,QACA,aACI;CACJ,MAAM,CAAC,OAAO,gCAAqB,GAAG;CACtC,MAAM,eAAe,KAAK,UAAU,MAAM,MAAM,EAAE;CAClD,MAAM,CAAC,cAAc,uCAA4B,aAAa;CAC9D,MAAM,iCAAsB,MAAM;CAElC,MAAM,cAAc,aAAa,UAAU,eAAe;CAE1D,MAAM,2CAAgC;AACpC,EAAK,UAAU,UAAU,UAAU,YAAY,CAAC,WAAW;AACzD,aAAU;IACV;IACD,CAAC,aAAa,OAAO,CAAC;CAEzB,MAAM,uCACH,UAAkB;AACjB,kBAAgB,MAAM;AAEtB,MAAI;GACF,MAAM,aAAa,KAAK,MAAM,MAAM;AACpC,YAAS,GAAG;AACZ,cAAW,WAAW;WACf,GAAG;AACV,WAAQ,MAAM,EAAE;AAChB,YAAS,eAAe;;IAG5B,CAAC,SAAS,CACX;CAED,MAAM,2CAAgC;AACpC,eAAa,UAAU;AACvB,kBAAgB,aAAa;IAC5B,CAAC,aAAa,CAAC;CAElB,MAAM,0CAA+B;AACnC,eAAa,UAAU;AACvB,kBAAgB,aAAa;AAC7B,YAAU;IACT,CAAC,QAAQ,aAAa,CAAC;AAM1B,QACE,4CAACC;EACC,UAAS;EACT,OAAM;EACN,MAAM;EACN,WAAU;EACV,KAAI;EACJ,KAXgB,EAClB,wBAAwB,EAAE,YAAY,WAAoB,EAC3D;aAWG,4CAACC;GAAI,GAAG;GAAG,MAAM;cACf,2CAACC;IACC,OAAO;IACP,YAAY,CAACC,iCAAW,+CAAoB,CAAC;IAC7C,UAAU,CAAC;IACX,OAAOC;IACP,UAAS;IACT,YAAY;KACV,aAAa;KACb,YAAY;KACb;IACD,UAAU;IACV,SAAS;IACT,QAAQ;KACR,EACF,2CAAC;IACC,YAAW;IACX,cAAW;IACX,UAAS;IACT,KAAI;IACJ,OAAM;IACN,WAAU;IACV,YAAW;IACX,SAAS;KACT;IACE,EACN,2CAACJ;GACC,QAAO;GACP,eAAc;GACd,YAAW;GACX,iBAAgB;GAChB,OAAM;GACN,UAAS;GACT,QAAQ;GACR,gBAAe;aAEf,2CAACK;IAAK,OAAM;cAAQ;KAAa;IAC5B;GACF;;;;;ACjHX,IAAY,kEAAL;AACL;AACA;AACA;AACA;AACA;;;AAWF,IAAY,kEAAL;AACL;AACA;AACA;;;AAGF,IAAY,4DAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,MAAa,iBAAiB,QAAwB;AAYpD,QAXuC;GACpC,gBAAgB,QAAQ;GACxB,gBAAgB,eAAe;GAC/B,gBAAgB,eAAe;GAC/B,gBAAgB,eAAe;GAC/B,gBAAgB,iBAAiB;GACjC,gBAAgB,eAAe;GAC/B,gBAAgB,UAAU;GAC1B,gBAAgB,gBAAgB;GAChC,gBAAgB,OAAO;EACzB,CACa,QAAQ;;;;;AC3CxB,MAAM,QAKA;CACJ;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM,2CAACC,kCAAiB;EACxB,YAAY;EACb;CACD;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM,2CAACC,uCAAsB;EAC7B,YAAY;EACb;CACD;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM,2CAACC,8BAAa;EACpB,YAAY;EACb;CACF;AAQD,MAAa,kBAAiD,EAC5D,MACA,UACA,yBACI;CACJ,MAAM,CAAC,UAAU,mCAAwB,MAAM;CAC/C,MAAM,CAAC,aAAa,sCAA2B,MAAM;CAErD,MAAM,wCAEF,MAAM,QACH,SACC,EAAE,KAAK,SAAS,mBAAmB,SAAS,CAAC,oBAChD,EACH,CAAC,mBAAmB,CACrB;CAGD,MAAM,cAAc,MAAM,MAAM,MAAM,EAAE,SAAS,KAAK,IAAI,MAAM;CAEhE,MAAM,qBAAqB,YAA+B;EACxD,MAAM,eAAe,MAAM,MACxB,MAAM,EAAE,SAAU,QAAQ,MAC5B;AACD,MAAI,aACF,YAAW,aAAa,KAAK;;AAIjC,QACE,4CAACC,sBAAK;EAAK,eAAe,EAAE,WAAW,YAAY,KAAK;aACtD,2CAACA,sBAAK;GAAQ;aACZ,2CAACC;IACC,SAAQ;IACR,MAAK;IACL,QAAO;IACP,OAAM;IACN,QAAQ;KAAE,iBAAiB;KAAW,YAAY,EAAE,SAAS,GAAG;KAAE;IAClE,QAAQ;KAAE,SAAS;KAAQ,WAAW;KAAQ;IAC9C,eAAe;KAAE,SAAS;KAAQ,WAAW;KAAQ;IACrD,eAAY;IACZ,IAAG;IACH,KAAI;cAEJ,2CAAC;KACC,MAAM,CAAC,YAAY;KACnB,eAAe,YAAY,eAAe,QAAQ,KAAK;KACvD,SAAQ;KACR,WAAW;KACX,YAAY;eAEZ,4CAAC;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAO;iBAChE,2CAACC;OAAK,SAAS;iBAAI,YAAY;QAAY,EAC3C,2CAACA;OACC,SAAS;OACT,OAAM;OACN,WAAU;OACV,SAAS;OACT,YAAW;iBAEX,2CAACC,oCAAmB;QACf;OACF;MACC;KACH;IACI,EACf,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,UAAS;aACrB,2CAACA,sBAAK;IAAe,OAAO;IAAM,eAAe;cAC9C,aAAa,KAAK,SACjB,4CAACA,sBAAK;KAEJ,OAAO,KAAK;KACZ,eAAa,KAAK;KAClB,QAAO;;MAEP,2CAACA,sBAAK,kBAAgB;MACtB,2CAACE;OAAK,SAAS;OAAG,IAAG;iBAClB,KAAK;QACD;MACN,KAAK;;OATD,KAAK,KAUK,CACjB;KACkB;IACT,GACC,GACX;GACC;;;;;ACnIhB,IAAY,8CAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;ACAF,MAAa,iBAA+B,EAAE;;;;ACD9C,IAAM,eAAN,MAAyC;CACvC,KAAa;AACX,SAAO;;CAGT,OAAe;AACb,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,WAAqB;AACnB,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,WAAyB;AACvB,SAAO;;CAGT,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,uBAAuB;;CAGzC,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,UAAgB;AACd,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,cAAoB;AAClB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,cAAoB;AAClB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,iBAAuB;AACrB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,qBAA2B;AACzB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,kBAAwB;AACtB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,WAAiB;AACf,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,aAAmB;AACjB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,kBAAwB;AACtB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,QAAoB;AAClB,SAAO;;;AAIX,MAAa,YAAwB,IAAI,cAAc;;;;AC5GvD,IAAa,aAAb,MAAa,WAAiC;CAC5C,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,WAAyB,EAAE,EAC3B,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,YAAY;AAEjB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,SAAS,MAA0B;AACjC,OAAK,MAAM,QAAQ,KAAK,UACtB,KAAI,KAAK,MAAM,KAAK,KAClB,QAAO;AAGX,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,KAAK;;CAGd,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,YAAY,MAAwB;AAClC,OAAK,UAAU,KAAK,KAAK;;CAG3B,eAAe,MAAoB;EACjC,MAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,EAAE,MAAM,KAAK,KAAK;AAChE,MAAI,SAAS,EACX,MAAK,UAAU,OAAO,OAAO,EAAE;;CAInC,mBAAmB,IAAkB;EACnC,MAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,EAAE,IAAI,KAAK,GAAG;AAC5D,MAAI,SAAS,EACX,MAAK,UAAU,OAAO,OAAO,EAAE;;CAInC,gBAAgB,MAAc,MAAwB;EACpD,MAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,EAAE,MAAM,KAAK,KAAK;AAChE,MAAI,SAAS,EACX,MAAK,UAAU,SAAS;;CAI5B,WAAiB;CAIjB,aAAmB;CAInB,kBAAwB;CAIxB,YAAY,UAA8B;AACxC,OAAK,YAAY;;CAGnB,QAAoB;EAClB,MAAM,iBAAiB,KAAK,UAAU,KAAK,UAAU,MAAM,OAAO,CAAC;AACnE,SAAO,IAAI,WAAW,KAAK,KAAK,KAAK,OAAO,gBAAgB,EAC1D,GAAG,KAAK,WACT,CAAC;;;;;;ACnJN,IAAa,YAAb,MAAa,UAAgC;CAC3C,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,OACA,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,4BAA4B;AAE9C,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,YAAY;AAEjB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO,KAAK;;CAGd,aAAoC;AAClC,SAAO,CAAC,KAAK,OAAO;;CAGtB,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,uBAAuB;;CAGzC,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,SAAS,MAAwB;AAC/B,OAAK,SAAS;;CAGhB,aAAmB;CAInB,kBAAwB;CAIxB,QAAmB;AACjB,SAAO,IAAI,UAAU,KAAK,KAAK,KAAK,OAAO,KAAK,OAAO,OAAO,EAAE,EAC9D,GAAG,KAAK,WACT,CAAC;;;;;;AC5GN,IAAa,aAAb,MAAa,WAAiC;CAC5C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,UAA6B,EAAE,EAC/B,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,cAAc,QAAQ;AAC3B,OAAK,UAAU,QAAQ;AACvB,OAAK,oBAAoB,QAAQ;AACjC,OAAK,cAAc,QAAQ;AAC3B,OAAK,WAAW,QAAQ;AAExB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,eAAmC;AACjC,SAAO,KAAK;;CAGd,aAAiC;AAC/B,SAAO,KAAK;;CAGd,SAAmC;AACjC,SAAO,KAAK;;CAGd,mBAAiD;AAC/C,SAAO,KAAK;;CAGd,aAAmC;AACjC,SAAO,KAAK;;CAGd,UAA+B;AAC7B,SAAO,KAAK;;CAGd,aAAsB;AACpB,SAAO,KAAK,aAAa;;CAG3B,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,gBAAgB,OAAiC;AAC/C,OAAK,gBAAgB;;CAGvB,cAAc,OAAiC;AAC7C,OAAK,cAAc;;CAGrB,UAAU,OAAuC;AAC/C,OAAK,UAAU;;CAGjB,oBAAoB,OAA2C;AAC7D,OAAK,oBAAoB;;CAG3B,cAAc,QAAoC;AAChD,OAAK,cAAc;;CAGrB,WAAW,SAAoC;AAC7C,OAAK,WAAW;;CAGlB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,QAAoB;AAClB,SAAO,IAAI,WACT,KAAK,KACL,KAAK,OACL;GACE,cAAc,KAAK;GACnB,YAAY,KAAK;GACjB,QAAQ,KAAK;GACb,kBAAkB,KAAK;GACvB,YAAY,KAAK,cAAc,CAAC,GAAG,KAAK,YAAY,GAAG;GACvD,SAAS,KAAK;GACf,EACD,EAAE,GAAG,KAAK,WAAW,CACtB;;;;;;AC9LL,IAAa,aAAb,MAAa,WAAiC;CAC5C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,UAA6B,EAAE,EAC/B,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,WAAW,QAAQ;AAExB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,eAAmC;AACjC,SAAO,KAAK;;CAGd,UAA+B;AAC7B,SAAO,KAAK;;CAGd,aAAsB;AACpB,SAAO,KAAK,aAAa;;CAG3B,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,gBAAgB,OAAiC;AAC/C,OAAK,gBAAgB;;CAGvB,WAAW,SAAoC;AAC7C,OAAK,WAAW;;CAGlB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,QAAoB;AAClB,SAAO,IAAI,WACT,KAAK,KACL,KAAK,OACL;GACE,cAAc,KAAK;GACnB,SAAS,KAAK;GACf,EACD,EAAE,GAAG,KAAK,WAAW,CACtB;;;;;;ACxIL,IAAa,cAAb,MAAa,YAAkC;CAC7C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,UAA8B,EAAE,EAChC,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,8BAA8B;AAEhD,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,WAAW,QAAQ;AAExB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,eAAoC;AAClC,SAAO,KAAK;;CAGd,UAA+B;AAC7B,SAAO,KAAK;;CAGd,aAAsB;AACpB,SAAO,KAAK,aAAa;;CAG3B,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,yBAAyB;;CAG3C,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,gBAAgB,OAAkC;AAChD,OAAK,gBAAgB;;CAGvB,WAAW,SAAoC;AAC7C,OAAK,WAAW;;CAGlB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,QAAqB;AACnB,SAAO,IAAI,YACT,KAAK,KACL,KAAK,OACL;GACE,cAAc,KAAK;GACnB,SAAS,KAAK;GACf,EACD,EAAE,GAAG,KAAK,WAAW,CACtB;;;;;;AC9IL,IAAa,UAAb,MAAa,QAA8B;CACzC,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,KACA,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,0BAA0B;AAE5C,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,uBAAuB;AAEzC,OAAK,QAAQ;AACb,OAAK,OAAO;AACZ,OAAK,YAAY;AAEjB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,MAAc;AACZ,SAAO,KAAK;;CAGd,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,OAAO,KAAmB;AACxB,OAAK,OAAO;;CAGd,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,aAAmB;CAInB,kBAAwB;CAIxB,QAAiB;AACf,SAAO,IAAI,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,EAAE,GAAG,KAAK,WAAW,CAAC;;;;;;AC1H9E,IAAa,cAAb,MAAyB;CACvB,OAAO,OAAO,MAAc,SAAgD;EAC1E,MAAM,OAAO,IAAI,+BAAmB,EAAE,KAAK;AAC3C,MAAI,SAAS,eAAe,OAC1B,MAAK,cAAc,QAAQ,WAAW;AAExC,MAAI,SAAS,qBAAqB,OAChC,MAAK,oBAAoB,QAAQ,iBAAiB;AAEpD,SAAO;;CAGT,OAAO,OAAO,MAA0B;AACtC,SAAO,IAAI,+BAAmB,EAAE,KAAK;;CAGvC,OAAO,QAAQ,MAA2B;AACxC,SAAO,IAAI,gCAAoB,EAAE,KAAK;;CAGxC,OAAO,OAAO,MAAc,WAAyB,EAAE,EAAc;AACnE,SAAO,IAAI,+BAAmB,EAAE,MAAM,SAAS;;CAGjD,OAAO,MAAM,MAAc,OAA8B;AACvD,SAAO,IAAI,8BAAkB,EAAE,MAAM,MAAM;;CAG7C,OAAO,IAAI,MAAc,SAAkC;AACzD,SAAO,IAAI,4BAAgB,EAAE,MAAM,QAAQ,KAAK;;;;;;AC7CpD,IAAa,kBAAb,MAAoD;CAClD,YAAY,AAAiB,MAAc;EAAd;;CAE7B,aAAsB;AACpB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,eAAuB;AACrB,SAAO,KAAK;;CAGd,OAAO,OAA6B;AAClC,SAAO,MAAM,YAAY,IAAI,MAAM,cAAc,KAAK,KAAK;;;AAI/D,IAAa,eAAb,MAAiD;CAC/C,aAAsB;AACpB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,eAAuB;AACrB,QAAM,IAAI,MAAM,qCAAqC;;CAGvD,OAAO,OAA6B;AAClC,SAAO,MAAM,SAAS;;;;;;ACjC1B,IAAM,WAAN,MAAM,SAAyB;CAC7B,YAAY,AAAiB,MAA8B;EAA9B;;CAE7B,WAAmC;AACjC,SAAO,KAAK;;CAGd,gBAAwB;AACtB,SAAO,KAAK,KACT,KAAK,QACJ,IAAI,YAAY,GAAG,eAAe,IAAI,cAAc,KAAK,SAC1D,CACA,KAAK,GAAG;;CAGb,WAAmB;EACjB,MAAM,QAAkB,EAAE;AAE1B,OAAK,MAAM,OAAO,KAAK,KACrB,KAAI,IAAI,YAAY,CAClB,OAAM,KAAK,IAAI,cAAc,CAAC;WACrB,IAAI,SAAS,IAAI,MAAM,SAAS,EACzC,OAAM,MAAM,SAAS,MAAM;AAI/B,SAAO,MAAM,KAAK,IAAI;;CAGxB,SAAe;AACb,MAAI,KAAK,KAAK,UAAU,EACtB,QAAO;AAET,SAAO,IAAI,SAAS,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;;CAG7C,MAAM,MAAoB;AACxB,SAAO,IAAI,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI,gBAAgB,KAAK,CAAC,CAAC;;CAGhE,aAAmB;AACjB,SAAO,IAAI,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC;;CAGzD,OAAO,OAAsB;EAC3B,MAAM,YAAY,MAAM,UAAU;AAClC,MAAI,KAAK,KAAK,WAAW,UAAU,OACjC,QAAO;AAET,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK;GACzC,MAAM,IAAI,KAAK,KAAK;GACpB,MAAM,IAAI,UAAU;AACpB,OAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAC1B,QAAO;;AAGX,SAAO;;CAGT,UAAmB;AACjB,SAAO,KAAK,KAAK,WAAW;;CAG9B,SAAiB;AACf,SAAO,KAAK,KAAK;;CAGnB,UAAU,QAAuB;EAC/B,MAAM,aAAa,OAAO,UAAU;AACpC,MAAI,KAAK,KAAK,UAAU,WAAW,OACjC,QAAO;AAET,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;GAC1C,MAAM,IAAI,KAAK,KAAK;GACpB,MAAM,IAAI,WAAW;AACrB,OAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAC1B,QAAO;;AAGX,SAAO;;;AAIX,MAAa,aAAmB,IAAI,SAAS,EAAE,CAAC;AAEhD,SAAgB,WAAW,UAAwC;AACjE,QAAO,SAAS,WAAW,IAAI,aAAa,IAAI,SAAS,SAAS;;;;;ACrFpE,SAAgB,sBAAsB,SAAgC;AACpE,KAAI,YAAY,MAAM,YAAY,IAChC,QAAO,EAAE;CAGX,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ;CAChD,MAAM,WAA0B,EAAE;CAElC,IAAI,IAAI;AACR,QAAO,IAAI,MAAM,QAAQ;EACvB,MAAM,OAAO,MAAM;AACnB,MAAI,SAAS,aACX,KAAI,IAAI,IAAI,MAAM,QAAQ;GACxB,MAAM,OAAO,MAAM,IAAI;AACvB,OAAI,SAAS,OACX,UAAS,KAAK,IAAI,gBAAgB,KAAK,CAAC;AAE1C,QAAK;QAEL,MAAK;WAEE,SAAS,SAAS;AAC3B,YAAS,KAAK,IAAI,cAAc,CAAC;AACjC,QAAK;QAEL,OAAM,IAAI,MAAM,yBAAyB,KAAK,WAAW,UAAU;;AAIvE,QAAO;;AAGT,SAAgB,kBAAkB,SAAuB;AACvD,QAAO,WAAW,sBAAsB,QAAQ,CAAC;;AAGnD,SAAgB,wBAAwB,SAAyB;AAC/D,QAAO,kBAAkB,QAAQ,CAAC,UAAU;;;;;ACrC9C,IAAa,qBAAb,MAA6D;CAC3D,YAAY,AAAiB,QAAgB;EAAhB;AAC3B,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,0CAA0C;;CAI9D,eAAuB;AACrB,SAAO,KAAK;;;;;;ACZhB,IAAa,eAAb,cAAkC,MAAM;CACtC,YACE,SACA,AAAiB,QACjB,AAAiB,SACjB;AACA,QAAM,QAAQ;EAHG;EACA;AAGjB,OAAK,OAAO;;CAGd,gBAAwB;AACtB,SAAO,KAAK;;CAGd,eAAmC;AACjC,SAAO,KAAK;;;;;;ACXhB,MAAM,uBAAuB;AAE7B,IAAa,eAAb,MAA0B;CACxB,YACE,AAAiB,UACjB,AAAiB,cACjB;EAFiB;EACA;;CAGnB,UAAuB;EACrB,IAAI;AACJ,MAAI;AAEF,6CADiC,KAAK,aAAa,CACjC;UACZ;AACN,UAAO;;AAGT,SAAO,KAAK,UAAU,KAAK,KAAK,SAAS;;CAG3C,AAAQ,UAAU,KAAc,MAAyB;AACvD,UAAQ,IAAI,MAAZ;GACE,KAAK,aACH,QAAO,KAAK,MAAM,IAAI,KAAK;GAE7B,KAAK,oBAAoB;IACvB,MAAM,aAAa,KAAK,UAAU,IAAI,QAAQ,KAAK;AACnD,QAAI,CAAC,WACH,QAAO;AAET,WAAO,WAAW,MAAM,IAAI,SAAS;;GAGvC,KAAK;GACL,KAAK,sBAAsB;IACzB,MAAM,aAAa,KAAK,UAAU,IAAI,QAAQ,KAAK;AACnD,QAAI,CAAC,WACH,QAAO;AAET,WAAO,WAAW,YAAY;;GAGhC,KAAK,eACH,QAAO,KAAK,0BAA0B,MAAM,IAAI,KAAK;GAEvD,KAAK,WACH,QAAO,KAAK,gBAAgB,IAAI,KAAK;GAEvC,QACE,QAAO;;;CAIb,AAAQ,0BAA0B,MAAY,MAA2B;EACvE,MAAM,QAAQ,KAAK,MAAM,IAAI;EAC7B,IAAI,SAAS;AAEb,OAAK,MAAM,QAAQ,MACjB,KAAI,SAAS,MAAM;AACjB,OAAI,OAAO,SAAS,CAClB,QAAO;AAET,YAAS,OAAO,QAAQ;aACf,SAAS,IAClB;WACS,KACT,UAAS,OAAO,MAAM,KAAK;AAI/B,SAAO;;CAGT,AAAQ,gBAAgB,UAA+B;EACrD,MAAM,OAAO,SAAS,WAAW,IAAI,GAAG,SAAS,MAAM,EAAE,GAAG;AAC5D,MAAI,CAAC,KACH,QAAO;AAGT,MAAI;AACF,UAAO,KAAK,iBAAiB,KAAK;UAC5B;AACN,UAAO;;;CAIX,AAAQ,iBAAiB,aAA2B;EAClD,MAAM,QAAQ,YAAY,MAAM,IAAI;EACpC,IAAI,SAAe;AAEnB,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,CAAC,KACH,OAAM,IAAI,MAAM,8BAA8B;GAGhD,MAAM,QAAQ,qBAAqB,KAAK,KAAK;AAC7C,OAAI,QAAQ,GACV,UAAS,OAAO,MAAM,MAAM,GAAG,CAAC,YAAY;OAE5C,UAAS,OAAO,MAAM,KAAK;;AAI/B,SAAO;;;;;;AClGX,IAAa,gBAAb,MAA8C;CAC5C,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,MAAgB,eAAuB,YAAoB;EACrE,MAAM,kDAA2B,WAAW;AAC5C,OAAK,UAAU,YAAY;EAE3B,MAAM,cAAc,KAAK,OAAO,cAAc;AAC9C,MAAI,YAAY,SAAS,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,cAChD,OAAM,IAAI,aAAa,kCAAkC,cAAc;EAGzE,MAAM,OAA4B,EAAE;EACpC,MAAM,kCAAkB,IAAI,KAAqB;AAEjD,OAAK,MAAM,WAAW,YAAY,cAAc;GAC9C,MAAM,eAAe,KAAK,sBACxB,MACA,aACA,QACD;AACD,OAAI,CAAC,aACH,OAAM,IAAI,aACR,sCAAsC,WACtC,eACA,2BACD;AAEH,OAAI,iBAAiB,cACnB,OAAM,IAAI,aACR,mCACA,eACA,0BACD;AAEH,QAAK,KAAK,IAAI,mBAAmB,aAAa,CAAC;AAC/C,mBAAgB,IAAI,SAAS,aAAa;;AAG5C,OAAK,OAAO;AACZ,OAAK,kBAAkB;;CAGzB,UAAkB;AAChB,SAAO;;CAGT,MAAe;AACb,SAAO,KAAK;;CAGd,eAA6C;AAC3C,SAAO,KAAK;;CAGd,oBAAoB,SAAgC;AAClD,SAAO,KAAK,gBAAgB,IAAI,QAAQ,IAAI;;CAG9C,WAA8B;AAC5B,SAAO,MAAM,KAAK,KAAK,gBAAgB,MAAM,CAAC;;CAGhD,AAAQ,sBACN,MACA,aACA,SACe;EAGf,MAAM,aADe,IAAI,aADR,KAAK,mBAAmB,YAAY,EACL,QAAQ,CACxB,SAAS;AAEzC,MAAI,CAAC,WACH,QAAO;EAGT,MAAM,aAAa,KAAK,OAAO,WAAW;AAC1C,MAAI,WAAW,QAAQ,CACrB,QAAO;AAGT,SAAO,WAAW,IAAI;;CAGxB,AAAQ,mBAAmB,aAAyB;EAClD,IAAI,WAAW;AAEf,SAAO,CAAC,SAAS,SAAS,EAAE;GAC1B,MAAM,OAAO,SAAS,UAAU;GAChC,MAAM,UAAU,KAAK,KAAK,SAAS;AACnC,cAAW,SAAS,QAAQ;AAC5B,OAAI,CAAC,SAAS,SAAS,CACrB;;AAIJ,SAAO;;;;;;ACzGX,IAAa,sBAAb,MAAiC;CAC/B,AAAO,uBAAuB,UAAgB,QAAsB;EAClE,MAAM,eAAe,SAAS,QAAQ,CAAC,UAAU;EACjD,MAAM,aAAa,OAAO,UAAU;EAEpC,MAAM,eAAe,KAAK,uBAAuB,cAAc,WAAW;EAC1E,MAAM,UAAU,aAAa,SAAS;EAEtC,MAAM,QAAQ,KAAK,4BACjB,SACA,YACA,aACD;AAED,SAAO,KAAK,6BAA6B,OAAO,WAAW;;CAG7D,AAAQ,uBACN,cACA,YACQ;EACR,MAAM,SAAS,KAAK,IAAI,aAAa,QAAQ,WAAW,OAAO;EAC/D,IAAI,kBAAkB;AAEtB,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,UAAU,aAAa;GAC7B,MAAM,QAAQ,WAAW;AAEzB,OAAI,CAAC,WAAW,CAAC,MACf;AAGF,OAAI,QAAQ,SAAS,IAAI,MAAM,SAAS,CACtC;YAEA,QAAQ,YAAY,IACpB,MAAM,YAAY,IAClB,QAAQ,cAAc,KAAK,MAAM,cAAc,CAE/C;OAEA;;AAIJ,SAAO;;CAGT,AAAQ,4BACN,SACA,YACA,YACU;EACV,MAAM,QAAkB,EAAE;AAE1B,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,IAC3B,OAAM,KAAK,KAAK;AAGlB,OAAK,IAAI,IAAI,YAAY,IAAI,WAAW,QAAQ,KAAK;GACnD,MAAM,MAAM,WAAW;AACvB,OAAI,KACF;QAAI,IAAI,YAAY,CAClB,OAAM,KAAK,IAAI,cAAc,CAAC;aACrB,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;KAC5C,MAAM,WAAW,MAAM,GAAG,GAAG;AAC7B,SAAI,YAAY,aAAa,KAC3B,OAAM,MAAM,SAAS,KAAK,WAAW;;;;AAM7C,SAAO;;CAGT,AAAQ,6BACN,OACA,YACQ;AACR,MAAI,MAAM,WAAW,GAAG;GACtB,MAAM,UAAU,WAAW,GAAG,GAAG;AACjC,OAAI,SAAS,YAAY,CACvB,QAAO,QAAQ,cAAc;AAE/B,UAAO;;AAGT,MAAI,MAAM,OAAO,KACf,QAAO,MAAM,KAAK,IAAI;AAGxB,SAAO,MAAM,KAAK,IAAI;;;;;;ACvF1B,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,AAAiB,sBAAsB,IAAI,qBAAqB;CAEhE,YACE,AAAiB,MACjB,AAAiB,eACjB,AAAiB,SACjB;EAHiB;EACA;EACA;;CAGnB,OAAO,WACL,MACA,eACA,SACU;AAEV,SAAO;GACL,SAAS;GACT,YAHiB,IAAI,kBAAkB,MAAM,eAAe,QAAQ,CAG7C,WAAW;GACnC;;CAGH,YAAoB;EAClB,MAAM,eAAe,KAAK,uBAAuB;AAEjD,wFADuC,KAAK,QAAQ,KAAK,EAAE,aAAa,CACzC;;CAGjC,AAAQ,wBAAgD;EACtD,MAAM,eAAuC,EAAE;EAC/C,MAAM,cAAc,KAAK,KAAK,OAAO,KAAK,cAAc;AAExD,OAAK,MAAM,WAAW,KAAK,QAAQ,UAAU,EAAE;GAC7C,MAAM,SAAS,KAAK,QAAQ,oBAAoB,QAAQ;AACxD,OAAI,CAAC,OACH;AAIF,OADmB,KAAK,KAAK,SAAS,OAAO,CAC9B,QAAQ,CACrB,OAAM,IAAI,aACR,mDACA,KAAK,eACL,kBAAkB,SACnB;GAGH,MAAM,aAAa,KAAK,KAAK,OAAO,OAAO;GAC3C,MAAM,UAAU,KAAK,oBAAoB,uBACvC,aACA,WACD;AAED,OAAI,KAAK,iBAAiB,SAAS,QAAQ,CACzC,cAAa,WAAW;;AAI5B,SAAO;;CAGT,AAAQ,iBAAiB,SAAiB,SAA0B;AAClE,MAAI,YAAY,QACd,QAAO;AAMT,SAH0B,KAAK,uBAAuB,QAAQ,KACpC,KAAK,uBAAuB,QAAQ;;CAKhE,AAAQ,uBAAuB,MAAsB;AACnD,SAAO,KAAK,WAAW,YAAY,MAAM;;;;;;ACtE7C,IAAa,yBAAb,MAAoC;CAClC,AAAiB,gBAAgBG,gBAAW,KAA0B;CACtE,AAAiB,mBAAmBA,gBAAW,KAAsB;CAErE,cAAc;AACZ,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,gBAAgB,eAAuB,SAAwB;AAC7D,OAAK,kBAAkB,cAAc;AAErC,OAAK,iBAAiB,IAAI,eAAe,QAAQ;AAEjD,OAAK,MAAM,OAAO,QAAQ,cAAc,EAAE;GACxC,MAAM,WAAW,IAAI,cAAc;GACnC,IAAI,aAAa,KAAK,cAAc,IAAI,SAAS;AACjD,OAAI,CAAC,YAAY;AACf,iBAAaA,gBAAW,KAAa;AACrC,SAAK,cAAc,IAAI,UAAU,WAAW;;AAE9C,cAAW,IAAI,cAAc;;;CAIjC,kBAAkB,eAA6B;AAC7C,OAAK,iBAAiB,OAAO,cAAc;AAE3C,OAAK,MAAM,CAAC,UAAU,eAAe,KAAK,eAAe;AACvD,cAAW,OAAO,cAAc;AAChC,OAAI,WAAW,SAAS,EACtB,MAAK,cAAc,OAAO,SAAS;;;CAKzC,cAAc,QAAmC;EAC/C,MAAM,aAAa,KAAK,cAAc,IAAI,OAAO;AACjD,SAAO,aAAa,MAAM,KAAK,WAAW,GAAG,EAAE;;CAGjD,WAAW,QAAgC;AACzC,SAAO,KAAK,iBAAiB,IAAI,OAAO,IAAI;;CAG9C,QAAc;AACZ,OAAK,cAAc,OAAO;AAC1B,OAAK,iBAAiB,OAAO;;CAG/B,eAAe,UAA4D;AACzE,OAAK,MAAM,CAAC,QAAQ,YAAY,KAAK,iBACnC,UAAS,QAAQ,QAAQ;;;;;;ACvD/B,IAAa,gBAAb,MAA2B;CACzB,AAAiB,4BAAY,IAAI,KAAyB;CAC1D,AAAiB,4BAAY,IAAI,KAAmB;CAEpD,AAAO,QAAQ,UAA4B;AACzC,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,aAAa,UAAU,WAAW;;CAGzC,AAAO,QAAQ,IAAwB;AACrC,SAAO,KAAK,UAAU,IAAI,GAAG,IAAI;;CAGnC,AAAO,QAAQ,IAAkB;AAC/B,SAAO,KAAK,UAAU,IAAI,GAAG,IAAI;;CAGnC,AAAO,aAAqB;AAC1B,SAAO,KAAK,UAAU;;CAGxB,AAAO,UAAoC;AACzC,SAAO,KAAK,UAAU,MAAM;;CAG9B,AAAQ,aAAa,MAAkB,MAAkB;AACvD,MAAI,KAAK,QAAQ,CACf;AAGF,OAAK,UAAU,IAAI,KAAK,IAAI,EAAE,KAAK;AACnC,OAAK,UAAU,IAAI,KAAK,IAAI,EAAE,KAAK;AAEnC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,aAAa,OAAO,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC;WAE3C,KAAK,SAAS,EAAE;GACzB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,aAAa,OAAO,KAAK,YAAY,CAAC;;;;;;;AC1CnD,IAAa,cAAb,MAAyB;CACvB,AAAO,UACL,UACA,MACA,SACM;AACN,MAAI,KAAK,SAAS,CAChB,OAAM,IAAI,MAAM,2BAA2B;AAE7C,OAAK,aAAa,UAAU,KAAK,UAAU,EAAE,GAAG,QAAQ;;CAG1D,AAAO,aAAa,UAAsB,MAAkB;AAC1D,MAAI,KAAK,SAAS,CAChB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,OAAK,qBAAqB,UAAU,KAAK,UAAU,EAAE,EAAE;;CAGzD,AAAO,qBACL,SACA,UACA,OACM;EACN,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH;EAGF,MAAM,gBAAgB,UAAU,SAAS,SAAS;AAElD,MAAI,QAAQ,YAAY,CACtB,MAAK,sBACH,SACA,QAAQ,cAAc,EACtB,UACA,OACA,cACD;WACQ,QAAQ,SAAS,CAC1B,MAAK,mBAAmB,SAAS,UAAU,OAAO,cAAc;;CAIpE,AAAQ,sBACN,SACA,WACA,UACA,OACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,eAAe,UAAU;AACjC;;EAGF,MAAM,gBAAgB,QAAQ,SAAS,UAAU;AACjD,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,qBAAqB,eAAe,UAAU,QAAQ,EAAE;;CAIjE,AAAQ,mBACN,SACA,UACA,OACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,SAAS,UAAU;AAC3B;;EAGF,MAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,qBAAqB,eAAe,UAAU,QAAQ,EAAE;;CAIjE,AAAQ,aACN,SACA,UACA,OACA,SACM;AACN,MAAI,SAAS,SAAS,OACpB;EAGF,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH;EAGF,MAAM,gBAAgB,UAAU,SAAS,SAAS;AAElD,MAAI,QAAQ,YAAY,CACtB,MAAK,sBACH,SACA,QAAQ,cAAc,EACtB,UACA,OACA,SACA,cACD;WACQ,QAAQ,SAAS,CAC1B,MAAK,mBAAmB,SAAS,UAAU,OAAO,SAAS,cAAc;;CAI7E,AAAQ,sBACN,SACA,WACA,UACA,OACA,SACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,QAAQ,UAAU;AAE1B,OADsB,QAAQ,SAAS,UAAU,CAC/B,QAAQ,CACxB,SAAQ,YAAY,QAAQ;OAE5B,SAAQ,gBAAgB,WAAW,QAAQ;AAE7C;;EAGF,MAAM,gBAAgB,QAAQ,SAAS,UAAU;AACjD,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,aAAa,eAAe,UAAU,QAAQ,GAAG,QAAQ;;CAIlE,AAAQ,mBACN,SACA,UACA,OACA,SACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,SAAS,QAAQ;AACzB;;EAGF,MAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,aAAa,eAAe,UAAU,QAAQ,GAAG,QAAQ;;;;;;AC3IpE,IAAa,aAAb,MAAa,WAA+B;CAC1C,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAQ;CAER,YAAY,UAAsB;AAChC,OAAK,YAAY;AACjB,OAAK,YAAY,IAAI,eAAe;AACpC,OAAK,UAAU,IAAI,aAAa;AAChC,OAAK,eAAe,IAAI,wBAAwB;AAChD,OAAK,cAAc;AAEnB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,AAAO,OAAmB;AACxB,SAAO,KAAK;;CAGd,AAAO,aAAqB;AAC1B,SAAO,KAAK,UAAU,YAAY;;CAGpC,AAAO,UAAoC;AACzC,SAAO,KAAK,UAAU,SAAS;;CAGjC,AAAO,SAAS,IAAwB;AACtC,SAAO,KAAK,UAAU,QAAQ,GAAG;;CAGnC,AAAO,OAAO,IAAkB;AAC9B,SAAO,KAAK,UAAU,QAAQ,GAAG;;CAGnC,AAAO,OAAO,MAAwB;AACpC,MAAI,KAAK,SAAS,CAChB,QAAO,KAAK;EAGd,IAAI,UAAsB,KAAK;AAC/B,OAAK,MAAM,WAAW,KAAK,UAAU,EAAE;AACrC,OAAI,QAAQ,YAAY,CACtB,WAAU,QAAQ,SAAS,QAAQ,cAAc,CAAC;OAElD,WAAU,QAAQ,OAAO;AAE3B,OAAI,QAAQ,QAAQ,CAClB,QAAO;;AAGX,SAAO;;CAGT,AAAO,YAAY,SAA2B;AAC5C,OAAK,YAAY;AACjB,OAAK,cAAc;;CAGrB,AAAO,UAAU,MAAY,MAAwB;AACnD,OAAK,QAAQ,UAAU,KAAK,WAAW,MAAM,KAAK;AAClD,OAAK,cAAc;;CAGrB,AAAO,aAAa,MAAkB;AACpC,OAAK,QAAQ,aAAa,KAAK,WAAW,KAAK;AAC/C,OAAK,cAAc;;CAGrB,AAAO,WAAW,IAAY,SAAuB;EACnD,MAAM,OAAO,KAAK,SAAS,GAAG;AAC9B,MAAI,KAAK,QAAQ,CACf;AAGF,OAAK,QAAQ,QAAQ;AACrB,OAAK,cAAc;;CAGrB,AAAO,WAAW,UAAkB,MAAwB;EAC1D,MAAM,SAAS,KAAK,SAAS,SAAS;AACtC,MAAI,OAAO,QAAQ,IAAI,CAAC,OAAO,UAAU,CACvC;AAEF,SAAO,YAAY,KAAK;AACxB,OAAK,cAAc;;CAGrB,AAAO,YAAY,YAAoB,UAA2B;AAChE,MAAI,eAAe,SACjB,QAAO;EAET,MAAM,WAAW,KAAK,SAAS,WAAW;EAC1C,MAAM,SAAS,KAAK,SAAS,SAAS;AACtC,MAAI,SAAS,QAAQ,IAAI,OAAO,QAAQ,CACtC,QAAO;AAET,MAAI,CAAC,OAAO,UAAU,CACpB,QAAO;EAET,MAAM,SAAS,KAAK,OAAO,SAAS;EACpC,MAAM,WAAW,KAAK,OAAO,WAAW;AACxC,MAAI,OAAO,OAAO,SAAS,IAAI,OAAO,UAAU,SAAS,CACvD,QAAO;AAET,MAAI,SAAS,QAAQ,CAAC,OAAO,OAAO,CAClC,QAAO;AAET,MAAI,KAAK,mBAAmB,UAAU,OAAO,CAC3C,QAAO;AAET,SAAO;;CAGT,AAAQ,mBAAmB,UAAgB,QAAuB;EAChE,MAAM,eAAe,SAAS,UAAU;EACxC,MAAM,aAAa,OAAO,UAAU;AAEpC,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IAEvC,KADgB,aAAa,IAChB,SAAS,EAAE;AACtB,OAAI,CAAC,WAAW,IAAI,SAAS,CAC3B,QAAO;AAET,OAAI,KAAK,sBAAsB,cAAc,YAAY,EAAE,CACzD,QAAO;;AAIb,SAAO;;CAGT,AAAQ,sBACN,cACA,YACA,UACS;AACT,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;GACjC,MAAM,UAAU,aAAa;GAC7B,MAAM,QAAQ,WAAW;AACzB,OAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,OAAO,MAAM,CAC9C,QAAO;;AAGX,SAAO;;CAGT,AAAO,mBAAmB,QAAyB;AACjD,SAAO,KAAK,oBAAoB,KAAK,WAAW,OAAO;;CAGzD,AAAQ,oBAAoB,SAAqB,QAAyB;AACxE,MAAI,QAAQ,UAAU,IAAI,KAAK,YAAY,QAAQ,QAAQ,IAAI,CAAC,CAC9D,QAAO;AAGT,MAAI,QAAQ,UAAU,EACpB;QAAK,MAAM,SAAS,QAAQ,YAAY,CACtC,KAAI,KAAK,oBAAoB,OAAO,OAAO,CACzC,QAAO;;AAKb,MAAI,QAAQ,SAAS,EAAE;GACrB,MAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,oBAAoB,OAAO,OAAO,CAC5D,QAAO;;AAIX,SAAO;;CAGT,AAAO,SAAS,QAAgB,gBAA8B;EAC5D,MAAM,OAAO,KAAK,SAAS,OAAO;EAClC,MAAM,eAAe,KAAK,SAAS,eAAe;AAClD,MAAI,KAAK,QAAQ,IAAI,aAAa,QAAQ,IAAI,CAAC,aAAa,UAAU,CACpE;EAGF,MAAM,aAAa,KAAK,OAAO,OAAO;AACtC,MAAI,WAAW,SAAS,CACtB;AAGF,OAAK,QAAQ,qBAAqB,KAAK,WAAW,WAAW,UAAU,EAAE,EAAE;AAC3E,eAAa,YAAY,KAAK;AAC9B,OAAK,cAAc;;CAGrB,AAAO,gBAAgB,eAAuB,SAAwB;AAEpE,MADa,KAAK,SAAS,cAAc,CAChC,QAAQ,CACf;AAEF,OAAK,aAAa,gBAAgB,eAAe,QAAQ;;CAG3D,AAAO,kBAAkB,eAA6B;AACpD,OAAK,aAAa,kBAAkB,cAAc;;CAGpD,AAAO,qBAAqB,QAAoC;EAC9D,MAAM,SAA6B,EAAE;AACrC,OAAK,yBAAyB,QAAQ,wBAAQ,IAAI,KAAK,CAAC;AACxD,SAAO;;CAGT,AAAO,2BAA2B,QAAoC;EACpE,MAAM,SAA6B,EAAE;AACrC,OAAK,wBAAwB,QAAQ,wBAAQ,IAAI,KAAK,CAAC;AACvD,SAAO;;CAGT,AAAO,qBAAqB,QAAyB;AACnD,SAAO,KAAK,qBAAqB,OAAO,CAAC,SAAS;;CAGpD,AAAO,mBAAmB,QAAgC;AACxD,SAAO,KAAK,aAAa,WAAW,OAAO;;CAG7C,AAAO,oBAA0B;AAC/B,OAAK,aAAa,OAAO;;CAG3B,AAAO,eAAe,UAA0C;AAC9D,OAAK,aAAa,eAAe,SAAS;;CAG5C,AAAQ,eAAqB;AAC3B,OAAK,UAAU,QAAQ,KAAK,UAAU;;CAGxC,AAAO,QAAoB;EAEzB,MAAM,aAAa,IAAI,WADJ,KAAK,UAAU,OAAO,CACI;AAC7C,OAAK,cAAc,WAAW;AAC9B,SAAO;;CAGT,AAAQ,cAAc,YAA8B;AAClD,OAAK,aAAa,gBAAgB,WAAW;GAC3C,MAAM,aAAa,WAAW,SAAS,OAAO;GAC9C,MAAM,UAAU,WAAW,SAAS;AACpC,OAAI,CAAC,WAAW,QAAQ,IAAI,QAC1B,YAAW,gBAAgB,QAAQ,QAAQ;IAE7C;;CAGJ,AAAQ,yBACN,QACA,QACA,MACM;AACN,OAAK,wBAAwB,QAAQ,QAAQ,KAAK;AAClD,OAAK,uBAAuB,QAAQ,QAAQ,KAAK;;CAGnD,AAAQ,wBACN,QACA,QACA,MACM;EACN,MAAM,qBAAqB,KAAK,aAAa,cAAc,OAAO;AAElE,OAAK,MAAM,iBAAiB,oBAAoB;AAC9C,OAAI,KAAK,IAAI,cAAc,CACzB;AAEF,QAAK,IAAI,cAAc;GAEvB,MAAM,YAAY,KAAK,uBAAuB,cAAc;AAC5D,OAAI,UACF,QAAO,KAAK,UAAU;;;CAK5B,AAAQ,uBACN,eACyB;EACzB,MAAM,cAAc,KAAK,SAAS,cAAc;EAChD,MAAM,UAAU,KAAK,aAAa,WAAW,cAAc;AAE3D,MAAI,YAAY,QAAQ,IAAI,CAAC,QAC3B,QAAO;EAGT,MAAM,aAAa,IAAI,kBACrB,MACA,eACA,QACD,CAAC,WAAW;AAEb,SAAO;GACL;GACA,WAAW,YAAY,MAAM;GAC7B;GACD;;CAGH,AAAQ,uBACN,QACA,QACA,MACM;EACN,MAAM,OAAO,KAAK,SAAS,OAAO;AAClC,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,yBAAyB,MAAM,IAAI,EAAE,QAAQ,KAAK;AAI3D,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,yBAAyB,MAAM,IAAI,EAAE,QAAQ,KAAK;;;;;;;AC/U/D,IAAa,eAAb,MAA0B;CACxB,AAAiB,8BAA2C,IAAI,KAAK;CACrE,AAAiB,aAA+B,EAAE;CAElD,SAAS,YAAkC;AACzC,MAAI,KAAK,YAAY,IAAI,WAAW,KAAK,CACvC,OAAM,IAAI,MAAM,SAAS,WAAW,KAAK,yBAAyB;AAEpE,OAAK,YAAY,IAAI,WAAW,MAAM,WAAW;AACjD,OAAK,WAAW,KAAK,WAAW;;CAGlC,cAAc,MAA0C;AACtD,SAAO,KAAK,YAAY,IAAI,KAAK;;CAGnC,wBAAwB,QAAoD;AAC1E,OAAK,MAAM,cAAc,KAAK,WAC5B,KAAI,WAAW,SAAS,OAAO,CAC7B,QAAO;;CAMb,oBAA+C;AAC7C,SAAO,KAAK;;CAGd,WAA8B;AAC5B,SAAO,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC;;;;;;ACzB9C,MAAa,yBAA2C;CACtD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,sBAAwC;CACnD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,qBAAuC;CAClD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,mBAAqC;CAChD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;;;;ACvBD,SAAS,eAAe,QAAoD;AAC1E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,mBAAiE;CAC5E,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACY;EACZ,MAAM,UAA6B,EAAE;AAErC,MAAI,OAAO,YAAY,OACrB,SAAQ,eAAe,OAAO;AAEhC,MAAI,OAAO,WACT,SAAQ,aAAa,OAAO;AAE9B,MAAI,OAAO,OACT,SAAQ,SAAS,OAAO;AAE1B,MAAI,OAAO,iBACT,SAAQ,mBAAmB,OAAO;AAEpC,MAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,EACtC,SAAQ,aAAa,OAAO;EAG9B,MAAM,OAAO,IAAI,WAAW,QAAQ,YAAY,EAAE,MAAM,QAAQ;AAChE,OAAK,YAAY,SAAS;AAE1B,MAAI,OAAO,cAAc,WACvB,SAAQ,kBAAkB,KAAK,IAAI,EAAE,OAAO,aAAa,WAAW;AAGtE,SAAO;;CAGT,UAAU,MAAkB,SAA6C;EACvE,MAAM,SAA2B;GAC/B,MAAM;GACN,SAAS,KAAK,cAAc,IAAI;GACjC;AAED,MAAI,KAAK,YAAY,CACnB,QAAO,aAAa,KAAK,YAAY;AAEvC,MAAI,KAAK,QAAQ,CACf,QAAO,SAAS,KAAK,QAAQ;AAE/B,MAAI,KAAK,kBAAkB,CACzB,QAAO,mBAAmB,KAAK,kBAAkB;EAEnD,MAAM,aAAa,KAAK,YAAY;AACpC,MAAI,cAAc,WAAW,SAAS,EACpC,QAAO,OAAO,CAAC,GAAG,WAAW;EAE/B,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,SAAS;AACX,UAAO,WAAW;AAClB,UAAO,eAAe,QAAQ,iBAAiB,KAAK,IAAI,EAAE,QAAQ;;AAGpE,SAAO;;CAGT,gBAAgB,QAAkC;AAChD,SAAO,aAAa,SAAS,OAAO,UAAU;;CAGhD,wBAAwB,UAA0B;AAChD,SAAO;;CAEV;;;;ACrFD,SAAS,eAAe,QAAoD;AAC1E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,mBAAiE;CAC5E,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACY;EACZ,MAAM,UAA6B,EAAE;AAErC,MAAI,OAAO,YAAY,OACrB,SAAQ,eAAe,OAAO;EAGhC,MAAM,OAAO,IAAI,WAAW,QAAQ,YAAY,EAAE,MAAM,QAAQ;AAChE,OAAK,YAAY,SAAS;AAE1B,MAAI,OAAO,cAAc,WACvB,SAAQ,kBAAkB,KAAK,IAAI,EAAE,OAAO,aAAa,WAAW;AAGtE,SAAO;;CAGT,UAAU,MAAkB,SAA6C;EACvE,MAAM,SAA2B;GAC/B,MAAM;GACN,SAAS,KAAK,cAAc,IAAI;GACjC;EAED,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,SAAS;AACX,UAAO,WAAW;AAClB,UAAO,eAAe,QAAQ,iBAAiB,KAAK,IAAI,EAAE,QAAQ;;AAGpE,SAAO;;CAGT,gBAAgB,QAAkC;AAChD,SAAO,aAAa,SAAS,OAAO,UAAU;;CAGhD,wBAAwB,UAAsC;AAC5D,MAAI,CAAC,SACH;EAEF,MAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,CAAC,OAAO,MAAM,IAAI,CACpB,QAAO;;CAIZ;;;;AC3DD,SAAS,gBAAgB,QAAqD;AAC5E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,oBACX;CACE,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACa;EACb,MAAM,UAA8B,EAAE;AAEtC,MAAI,OAAO,YAAY,OACrB,SAAQ,eAAe,OAAO;EAGhC,MAAM,OAAO,IAAI,YAAY,QAAQ,YAAY,EAAE,MAAM,QAAQ;AACjE,OAAK,YAAY,SAAS;AAE1B,MAAI,OAAO,cAAc,WACvB,SAAQ,kBAAkB,KAAK,IAAI,EAAE,OAAO,aAAa,WAAW;AAGtE,SAAO;;CAGT,UAAU,MAAmB,SAA8C;EACzE,MAAM,SAA4B;GAChC,MAAM;GACN,SAAS,KAAK,cAAc,IAAI;GACjC;EAED,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,SAAS;AACX,UAAO,WAAW;AAClB,UAAO,eAAe,QAAQ,iBAAiB,KAAK,IAAI,EAAE,QAAQ;;AAGpE,SAAO;;CAGT,gBAAgB,QAAoC;AAClD,SAAO,aAAa,SAAS,OAAO,UAAU;;CAGhD,wBAAwB,UAAuC;AAC7D,MAAI,CAAC,SACH;EAEF,MAAM,QAAQ,SAAS,aAAa;AACpC,MAAI,UAAU,OACZ,QAAO;AAET,MAAI,UAAU,QACZ,QAAO;;CAIZ;;;;ACpEH,SAAS,eAAe,QAAoD;AAC1E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,mBAAiE;CAC5E,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACY;EACZ,MAAM,WAAyB,EAAE;EAEjC,MAAM,cAAc,OAAO,YAAY,OAAO,KAAK,OAAO,WAAW;AAErE,OAAK,MAAM,YAAY,aAAa;GAClC,MAAM,aAAa,OAAO,WAAW;AACrC,OAAI,WACF,UAAS,KAAK,QAAQ,UAAU,YAAY,SAAS,CAAC;;EAI1D,MAAM,OAAO,IAAI,WAAW,QAAQ,YAAY,EAAE,MAAM,SAAS;AACjE,OAAK,YAAY,SAAS;AAC1B,SAAO;;CAGT,UAAU,MAAkB,SAA6C;EACvE,MAAM,aAA6C,EAAE;EACrD,MAAM,WAAqB,EAAE;AAE7B,OAAK,MAAM,SAAS,KAAK,YAAY,EAAE;GACrC,MAAM,YAAY,MAAM,MAAM;AAC9B,cAAW,aAAa,QAAQ,UAAU,MAAM;AAChD,YAAS,KAAK,UAAU;;AAG1B,SAAO;GACL,MAAM;GACN;GACA;GACA,sBAAsB;GACvB;;CAGH,gBAAgB,SAAoD;AAClE,SAAO,EAAE;;CAGX,wBAAwB,WAA8B;CAGvD;;;;AC3DD,SAAS,cAAc,QAAmD;AACxE,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,kBAA8D;CACzE,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACW;EACX,MAAM,QAAQ,QAAQ,UAAU,OAAO,OAAO,GAAG;EACjD,MAAM,OAAO,IAAI,UAAU,QAAQ,YAAY,EAAE,MAAM,MAAM;AAC7D,OAAK,YAAY,SAAS;AAC1B,SAAO;;CAGT,UAAU,MAAiB,SAA4C;EACrE,MAAM,QAAQ,KAAK,OAAO;AAE1B,SAAO;GACL,MAAM;GACN,OAAO,MAAM,QAAQ,GACjB;IAAE,MAAM;IAAU,SAAS;IAAI,GAC/B,QAAQ,UAAU,MAAM;GAC7B;;CAGH,gBAAgB,SAAqC;AACnD,SAAO,EAAE;;CAGX,wBAAwB,WAA8B;CAGvD;;;;ACzCD,SAAS,YAAY,QAAiD;AACpE,QAAO,UAAU;;AAGnB,MAAa,gBAAwD;CACnE,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACS;EACT,MAAM,OAAO,IAAI,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,KAAK;AACjE,OAAK,YAAY,SAAS;AAC1B,SAAO;;CAGT,UAAU,MAAe,UAA2C;EAClE,MAAM,SAAwB,EAC5B,MAAM,KAAK,KAAK,EACjB;EAED,MAAM,OAAO,KAAK,UAAU;AAC5B,MAAI,KAAK,MACP,QAAO,QAAQ,KAAK;AAEtB,MAAI,KAAK,YACP,QAAO,cAAc,KAAK;AAE5B,MAAI,KAAK,WACP,QAAO,aAAa,KAAK;AAG3B,SAAO;;CAGT,gBAAgB,SAA8B;AAC5C,SAAO;;CAGT,wBAAwB,WAA8B;CAGvD;;;;AC7BD,SAAgBC,0BAAsC;CACpD,MAAM,WAAW,IAAI,cAAc;AAEnC,UAAS,SAAS,cAAc;AAChC,UAAS,SAAS,iBAAiB;AACnC,UAAS,SAAS,gBAAgB;AAClC,UAAS,SAAS,iBAAiB;AACnC,UAAS,SAAS,iBAAiB;AACnC,UAAS,SAAS,kBAAkB;AAEpC,QAAO;;AAGT,MAAa,kBAAkBA,yBAAuB;;;;ACjCtD,IAAI,YAAY;AAEhB,SAAS,aAAqB;AAC5B;AACA,QAAO,QAAQ;;AAGjB,SAAgB,iBAAuB;AACrC,aAAY;;AAQd,IAAa,eAAb,MAA0B;CACxB,AAAQ,kBAAoC,EAAE;CAC9C,AAAiB;CAEjB,YAAY,WAAyB,iBAAiB;AACpD,OAAK,WAAW;;CAGlB,MAAM,QAAoC;AACxC,OAAK,kBAAkB,EAAE;AACzB,SAAO,KAAK,UAAU,QAAQ,GAAG;;CAGnC,kBAAkB,QAAwB,MAA0B;AAClE,OAAK,kBAAkB,EAAE;AACzB,SAAO,KAAK,UAAU,QAAQ,KAAK;;CAGrC,qBAAuC;AACrC,SAAO,KAAK;;CAGd,AAAQ,UAAU,QAAwB,MAA0B;EAClE,MAAM,WAAW,KAAK,gBAAgB,OAAO;EAC7C,MAAM,aAAa,KAAK,SAAS,wBAAwB,OAAO;AAEhE,MAAI,CAAC,WACH,OAAM,IAAI,MACR,wCAAwC,KAAK,UAAU,OAAO,GAC/D;EAGH,MAAM,UAAwB;GAC5B;GACA,YAAY,GAAG,MAAM,KAAK,UAAU,GAAG,EAAE;GACzC,oBAAoB,QAAQ,eAAe;AACzC,SAAK,gBAAgB,KAAK;KAAE;KAAQ;KAAY,CAAC;;GAEpD;AAED,SAAO,WAAW,MAAM,QAAQ,MAAM,UAAU,QAAQ;;CAG1D,AAAQ,gBAAgB,QAAsC;AAC5D,SAAO;GACL,OAAO,WAAW,SAAS,OAAO,QAAQ;GAC1C,aAAa,iBAAiB,SAAS,OAAO,cAAc;GAC5D,YAAY,gBAAgB,SAAS,OAAO,aAAa;GAC1D;;;;;;AC3DL,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAQ,OAAwB;CAChC,AAAQ,iCAA8B,IAAI,KAAK;CAE/C,YAAY,WAAyB,iBAAiB;AACpD,OAAK,WAAW;;CAGlB,kBACE,MACA,MACA,SACgB;AAChB,OAAK,OAAO;AACZ,OAAK,iBAAiB,SAAS,kCAAkB,IAAI,KAAK;AAC1D,MAAI;AACF,UAAO,KAAK,UAAU,KAAK;YACnB;AACR,QAAK,OAAO;AACZ,QAAK,iCAAiB,IAAI,KAAK;;;CAInC,UAAU,MAAkC;AAC1C,MAAI,KAAK,QAAQ,CACf,OAAM,IAAI,MAAM,6BAA6B;AAG/C,MAAI,KAAK,eAAe,OAAO,KAAK,KAAK,UAAU,CACjD,QAAO,KAAK,8BAA8B,KAAK;EAGjD,MAAM,aAAa,KAAK,SAAS,cAAc,KAAK,UAAU,CAAC;AAE/D,MAAI,CAAC,WACH,OAAM,IAAI,MACR,2CAA2C,KAAK,UAAU,GAC3D;EAeH,MAAM,SAAS,WAAW,UAAU,MAZF;GAChC,YAAY,MAAM,KAAK,UAAU,EAAE;GACnC,mBAAmB,QAAQ,YAAY;AACrC,QAAI,CAAC,KAAK,KACR,OAAM,IAAI,MACR,wEACD;AAEH,WAAO,kBAAkB,WAAW,KAAK,MAAM,QAAQ,QAAQ;;GAElE,CAEiD;AAClD,SAAO,KAAK,YAAY,QAAQ,KAAK;;CAGvC,AAAQ,8BAA8B,MAAoC;EACxE,MAAM,aAA6C,EAAE;EACrD,MAAM,WAAqB,EAAE;AAE7B,OAAK,MAAM,SAAS,KAAK,YAAY,EAAE;AACrC,OAAI,KAAK,eAAe,IAAI,MAAM,IAAI,CAAC,CACrC;AAEF,cAAW,MAAM,MAAM,IAAI,KAAK,UAAU,MAAM;AAChD,YAAS,KAAK,MAAM,MAAM,CAAC;;EAG7B,MAAM,SAA2B;GAC/B,MAAM;GACN;GACA,sBAAsB;GACtB;GACD;AAED,SAAO,KAAK,YAAY,QAAQ,KAAK;;CAGvC,AAAQ,YAEN,QAAW,MAAqB;EAChC,MAAM,OAAO,KAAK,UAAU;AAE5B,MAAI,KAAK,MACP,QAAO,QAAQ,KAAK;AAEtB,MAAI,KAAK,YACP,QAAO,cAAc,KAAK;AAE5B,MAAI,KAAK,WACP,QAAO,aAAa,KAAK;AAG3B,SAAO;;;;;;AC5GX,IAAa,mBAAb,MAA8B;CAC5B,AAAO,SAAS,GAAY,GAAqB;AAC/C,MAAI,MAAM,EACR,QAAO;AAGT,MACE,MAAM,QACN,MAAM,QACN,OAAO,MAAM,YACb,OAAO,MAAM,SAEb,QAAO,MAAM;AAGf,MAAI,MAAM,QAAQ,EAAE,KAAK,MAAM,QAAQ,EAAE,CACvC,QAAO;AAGT,MAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,CACtC,QAAO,KAAK,YAAY,GAAG,EAAE;AAG/B,SAAO,KAAK,aACV,GACA,EACD;;CAGH,AAAQ,YAAY,GAAc,GAAuB;AACvD,MAAI,EAAE,WAAW,EAAE,OACjB,QAAO;AAET,SAAO,EAAE,OAAO,MAAM,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,CAAC;;CAGxD,AAAQ,aACN,GACA,GACS;EACT,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;EAC/D,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;AAE/D,MAAI,MAAM,WAAW,MAAM,OACzB,QAAO;AAGT,MAAI,CAAC,MAAM,OAAO,GAAG,MAAM,MAAM,MAAM,GAAG,CACxC,QAAO;AAGT,SAAO,MAAM,OAAO,QAAQ,KAAK,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;;;;;;AC9C9D,IAAa,gBAAb,MAA2B;CACzB,AAAiB,+BAAe,IAAI,KAAmB;CACvD,AAAiB,iCAAiB,IAAI,KAAqB;CAC3D,AAAiB,iCAAiB,IAAI,KAAqB;CAC3D,AAAiB,gCAAgB,IAAI,KAAW;CAChD,AAAQ;CAER,YAAY,MAAkB;AAC5B,OAAK,OAAO;AACZ,OAAK,SAAS;;CAGhB,AAAO,UAAgB;AACrB,OAAK,aAAa,OAAO;AACzB,OAAK,eAAe,OAAO;AAC3B,OAAK,eAAe,OAAO;AAC3B,OAAK,cAAc,OAAO;AAC1B,OAAK,iBAAiB,KAAK,KAAK,MAAM,EAAE,WAAW;;CAGrD,AAAO,YAAY,MAAwB;AACzC,OAAK,OAAO;AACZ,OAAK,SAAS;;CAGhB,AAAO,QAAQ,QAAkC;AAC/C,SAAO,KAAK,aAAa,IAAI,OAAO;;CAGtC,AAAO,QAAQ,QAAyB;AACtC,SAAO,KAAK,aAAa,IAAI,OAAO;;CAGtC,AAAO,UAAoC;AACzC,SAAO,KAAK,aAAa,MAAM;;CAGjC,AAAO,iBAAiB,WAAmB,WAAyB;EAClE,MAAM,WAAW,KAAK,aAAa,IAAI,UAAU;AACjD,MAAI,aAAa,QAAW;AAC1B,QAAK,iBAAiB,SAAS;AAC/B,QAAK,aAAa,OAAO,UAAU;AACnC,QAAK,aAAa,IAAI,WAAW,SAAS;AAC1C,QAAK,cAAc,IAAI,SAAS;;AAElC,OAAK,eAAe,IAAI,WAAW,UAAU;AAC7C,OAAK,eAAe,IAAI,WAAW,UAAU;;CAG/C,AAAO,kBAAkB,WAAuC;AAC9D,SAAO,KAAK,eAAe,IAAI,UAAU;;CAG3C,AAAO,sBAAsB,MAAqB;AAChD,OAAK,MAAM,gBAAgB,KAAK,cAC9B,KAAI,KAAK,UAAU,aAAa,CAC9B,QAAO;AAGX,SAAO;;CAGT,AAAQ,iBAAiB,YAAwB;AAC/C,OAAK,MAAM,CAAC,QAAQ,SAAS,KAAK,aAChC,KAAI,KAAK,UAAU,WAAW,CAC5B,MAAK,aAAa,OAAO,OAAO;;CAKtC,AAAQ,iBAAiB,MAAkB,MAAkB;AAC3D,MAAI,KAAK,QAAQ,CACf;AAGF,OAAK,aAAa,IAAI,KAAK,IAAI,EAAE,KAAK;AAEtC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,iBAAiB,OAAO,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC;AAI1D,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,iBAAiB,OAAO,KAAK,YAAY,CAAC;;;;;;;ACvFvD,IAAa,kBAAb,MAA6B;CAC3B,YACE,AAAiB,aACjB,AAAiB,UACjB,AAAiB,WACjB;EAHiB;EACA;EACA;;CAGnB,AAAO,UAAuB;EAC5B,MAAM,UAAuB,EAAE;EAC/B,MAAM,uCAAuB,IAAI,KAAa;AAE9C,OAAK,0BAA0B,SAAS,qBAAqB;AAC7D,OAAK,oBAAoB,SAAS,qBAAqB;AAEvD,SAAO;;CAGT,AAAQ,0BACN,SACA,sBACM;AACN,OAAK,MAAM,UAAU,KAAK,YAAY,SAAS,EAAE;GAC/C,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO;GACnD,MAAM,cAAc,KAAK,YAAY,SAAS,OAAO;AAErD,OAAI,KAAK,UAAU,QAAQ,OAAO,CAChC,MAAK,0BACH,QACA,aACA,aACA,SACA,qBACD;OAED,SAAQ,KAAK;IACX,MAAM;IACN,UAAU;IACV;IACD,CAAC;;;CAKR,AAAQ,0BACN,QACA,aACA,aACA,SACA,sBACM;AACN,uBAAqB,IAAI,OAAO;EAEhC,MAAM,iBAAiB,KAAK,UAAU,kBAAkB,OAAO;EAC/D,MAAM,aAAa,kBAAkB;EACrC,MAAM,WAAW,KAAK,SAAS,SAAS,WAAW;AAEnD,MAAI,eACF,sBAAqB,IAAI,eAAe;EAG1C,MAAM,WAAW,KAAK,UAAU,QAAQ,OAAO;EAC/C,MAAM,UAAU,CAAC,YAAY,CAAC,YAAY,OAAO,SAAS;AAE1D,UAAQ,KAAK;GACX,MAAM,UAAU,UAAU;GAC1B;GACA;GACD,CAAC;;CAGJ,AAAQ,oBACN,SACA,sBACM;AACN,OAAK,MAAM,UAAU,KAAK,UAAU,SAAS,EAAE;AAC7C,OAAI,qBAAqB,IAAI,OAAO,CAClC;GAGF,MAAM,WAAW,KAAK,SAAS,SAAS,OAAO;AAC/C,WAAQ,KAAK;IACX,MAAM;IACN;IACA,aAAa;IACd,CAAC;;;;;;;AC5ER,IAAa,kBAAb,MAA6B;CAC3B,YACE,AAAiB,aACjB,AAAiB,UACjB,AAAiB,WACjB;EAHiB;EACA;EACA;;CAGnB,AAAO,SAAS,SAAwC;EACtD,MAAM,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ;EACvD,MAAM,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ;EACvD,MAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE,SAAS,UAAU;EAC3D,MAAM,WAAW,QAAQ,QAAQ,MAAM,EAAE,SAAS,WAAW;EAE7D,MAAM,gBAAgB,KAAK,oBAAoB,MAAM;EACrD,MAAM,iBAAiB,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,SAAS,CAAC;EAC5D,MAAM,8BACJ,KAAK,mCAAmC,cAAc;AAExD,SAAO;GACL,OAAO;GACP,OAAO,KAAK,mBAAmB,MAAM;GACrC,SAAS,KAAK,sBAAsB,SAAS,eAAe;GAC5D,UAAU,KAAK,eAAe,UAAU,4BAA4B;GACrE;;CAGH,AAAQ,mCACN,eACa;EACb,MAAM,0BAAU,IAAI,KAAa;AACjC,OAAK,MAAM,UAAU,eAAe;AAClC,OAAI,OAAO,UAAU;IACnB,MAAM,iBAAiB,KAAK,kBAC1B,KAAK,UACL,OAAO,SAAS,IAAI,CACrB;AACD,QAAI,eACF,SAAQ,IAAI,eAAe;;AAG/B,OAAI,OAAO,aAAa;IACtB,MAAM,iBAAiB,KAAK,kBAC1B,KAAK,aACL,OAAO,YAAY,IAAI,CACxB;AACD,QAAI,eACF,SAAQ,IAAI,eAAe;;;AAIjC,SAAO;;CAGT,AAAQ,kBAAkB,MAAkB,QAA+B;EAEzE,MAAM,WADO,KAAK,OAAO,OAAO,CACV,UAAU,CAAC;AACjC,MAAI,CAAC,UAAU,YAAY,CACzB,QAAO;EAET,MAAM,eAAe,KAAK,OAAO,WAAW,MAAM,SAAS,cAAc,CAAC,CAAC;AAC3E,SAAO,aAAa,QAAQ,GAAG,OAAO,aAAa,IAAI;;CAGzD,AAAQ,oBAAoB,OAAiC;AAC3D,SAAO,MAAM,QAAQ,WAAW,CAAC,KAAK,mBAAmB,QAAQ,MAAM,CAAC;;CAG1E,AAAQ,mBACN,QACA,UACS;AACT,MAAI,CAAC,OAAO,SACV,QAAO;EAET,MAAM,mBAAmB,OAAO,SAAS,IAAI;EAC7C,MAAM,WAAW,KAAK,SAAS,OAAO,iBAAiB;AACvD,SAAO,SAAS,MACb,UACC,MAAM,YACN,MAAM,SAAS,IAAI,KAAK,oBACxB,SAAS,UAAU,KAAK,SAAS,OAAO,MAAM,SAAS,IAAI,CAAC,CAAC,CAChE;;CAGH,AAAQ,mBAAmB,OAAiC;EAC1D,MAAM,mBAAmB,MACtB,SAAS,WAAW;AACnB,OAAI,CAAC,OAAO,YACV,QAAO,EAAE;AAEX,UAAO,CACL;IACE;IACA,MAAM,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;IACvD,CACF;IACD,CACD,MAAM,GAAG,MAAM,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;EAEpD,MAAM,aAAqB,EAAE;EAC7B,MAAM,SAAsB,EAAE;AAE9B,OAAK,MAAM,EAAE,QAAQ,UAAU,kBAAkB;AAC/C,OAAI,KAAK,UAAU,sBAAsB,KAAK,CAC5C;AAGF,OAAI,KAAK,iBAAiB,MAAM,WAAW,CACzC;AAGF,UAAO,KAAK,OAAO;AACnB,cAAW,KAAK,KAAK;;AAGvB,SAAO;;CAGT,AAAQ,sBACN,SACA,gBACa;EACb,MAAM,mBAAmB,QACtB,SAAS,WAAW;AACnB,OAAI,CAAC,OAAO,YAAY,eAAe,IAAI,OAAO,SAAS,CACzD,QAAO,EAAE;AAEX,UAAO,CACL;IACE;IACA,MAAM,KAAK,SAAS,OAAO,OAAO,SAAS,IAAI,CAAC;IACjD,CACF;IACD,CACD,MAAM,GAAG,MAAM,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;EAEpD,MAAM,eAAuB,EAAE;EAC/B,MAAM,SAAsB,EAAE;AAE9B,OAAK,MAAM,EAAE,QAAQ,UAAU,kBAAkB;AAC/C,OAAI,KAAK,iBAAiB,MAAM,aAAa,CAC3C;AAGF,UAAO,KAAK,OAAO;AACnB,gBAAa,KAAK,KAAK;;AAGzB,SAAO;;CAGT,AAAQ,eACN,UACA,6BACa;AACb,SAAO,SAAS,QAAQ,WAAW;AACjC,OAAI,CAAC,OAAO,YACV,QAAO;GAGT,MAAM,iBAAiB,KAAK,kBAC1B,KAAK,aACL,OAAO,YAAY,IAAI,CACxB;AACD,OAAI,kBAAkB,4BAA4B,IAAI,eAAe,CACnE,QAAO;AAGT,UAAO;IACP;;CAGJ,AAAQ,iBAAiB,MAAY,SAA0B;AAC7D,OAAK,MAAM,UAAU,QACnB,KAAI,KAAK,UAAU,OAAO,CACxB,QAAO;AAGX,SAAO;;;;;;ACpLX,IAAa,iBAAb,MAA4B;CAC1B,AAAiB,aAAa,IAAI,kBAAkB;CACpD,AAAiB,aAAa,IAAI,kBAAkB;CAEpD,YACE,AAAiB,aACjB,AAAiB,UACjB;EAFiB;EACA;;CAGnB,AAAO,SAAS,WAA0C;EACxD,MAAM,eAAe,KAAK,oBAAoB,UAAU,MAAM;EAC9D,MAAM,cAAc,KAAK,oBAAoB,UAAU,MAAM;EAC7D,MAAM,aAAa,KAAK,mBAAmB,UAAU,OAAO,aAAa;EACzE,MAAM,gBAAgB,KAAK,sBAAsB,UAAU,QAAQ;EAEnE,MAAM,EAAE,kBAAkB,gBAAgB,KAAK,oBAC7C,YACA,YACD;EAED,MAAM,mBAAmB,IAAI,IAAI;GAC/B,GAAG,WAAW,KAAK,MAAM,EAAE,KAAK;GAChC,GAAG,cAAc,KAAK,MAAM,EAAE,KAAK;GACnC,GAAG,YAAY,SAAS,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,OAAO,QAAQ;GACtE,CAAC;EAEF,MAAM,iBAAiB,KAAK,uBAC1B,UAAU,UACV,iBACD;AAED,SAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACJ;;CAGH,AAAQ,oBAAoB,OAAiC;EAC3D,MAAM,0BAAU,IAAI,KAAa;AACjC,OAAK,MAAM,UAAU,MACnB,KAAI,OAAO,YACT,SAAQ,IAAI,OAAO,YAAY,IAAI,CAAC;AAGxC,SAAO;;CAGT,AAAQ,oBACN,YACA,aAC6D;EAC7D,MAAM,mBAAmB,YAAY,KAAK,MAAM,kBAAkB,EAAE,KAAK,CAAC;EAE1E,MAAM,mBAAgC,EAAE;EACxC,MAAM,cAA2B,EAAE;AAEnC,OAAK,MAAM,YAAY,YAAY;GACjC,MAAM,UAAU,kBAAkB,SAAS,KAAK;AAKhD,OAJuB,iBAAiB,MAAM,aAC5C,SAAS,UAAU,QAAQ,CAC5B,CAGC,kBAAiB,KAAK,SAAS;OAE/B,aAAY,KAAK,SAAS;;AAI9B,SAAO;GAAE;GAAkB;GAAa;;CAG1C,AAAQ,oBAAoB,OAAiC;EAC3D,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,OAAO;AAC1B,OAAI,CAAC,OAAO,YAAY,CAAC,OAAO,YAC9B;GAGF,MAAM,WAAW,KAAK,SAAS,OAAO,OAAO,SAAS,IAAI,CAAC;GAC3D,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;AAEpE,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,SAAS,eAAe;IAC9B,MAAM,YAAY,eAAe;IAClC,CAAC;GAEF,MAAM,cAAc,KAAK,wBACvB,OAAO,UACP,OAAO,aACP,YAAY,eAAe,CAC5B;AACD,OAAI,YACF,SAAQ,KAAK,YAAY;;AAI7B,SAAO;;CAGT,AAAQ,wBACN,UACA,aACA,aACkB;EAClB,MAAM,gBAAgB,KAAK,WAAW,kBACpC,aACA,KAAK,YACN;EACD,MAAM,aAAa,KAAK,WAAW,kBACjC,UACA,KAAK,SACN;AAED,MAAI,CAAC,KAAK,WAAW,SAAS,eAAe,WAAW,CACtD,QAAO;GACL,IAAI;GACJ,MAAM;GACN,OAAO;GACR;AAGH,SAAO;;CAGT,AAAQ,mBACN,OACA,cACa;EACb,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,OAAO;AAC1B,OAAI,CAAC,OAAO,YACV;GAGF,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;GACpE,MAAM,SAAS,KAAK,WAAW,kBAC7B,OAAO,aACP,KAAK,aACL,EAAE,gBAAgB,cAAc,CACjC;AACD,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,YAAY,eAAe;IACjC,OAAO;IACR,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,sBAAsB,SAAmC;EAC/D,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,CAAC,OAAO,SACV;GAGF,MAAM,WAAW,KAAK,SAAS,OAAO,OAAO,SAAS,IAAI,CAAC;AAC3D,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,SAAS,eAAe;IAC/B,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,uBACN,UACA,kBACa;EACb,MAAM,UAAuB,EAAE;EAC/B,MAAM,gBAAwB,EAAE;EAChC,MAAM,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,IAAI,kBAAkB;AAE3E,OAAK,MAAM,UAAU,UAAU;AAC7B,OAAI,CAAC,OAAO,eAAe,CAAC,OAAO,SACjC;GAGF,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;AAEpE,OAAI,KAAK,aAAa,aAAa,cAAc,CAC/C;AAGF,OAAI,KAAK,WAAW,aAAa,uBAAuB,CACtD;AAGF,OAAI,CAAC,KAAK,mBAAmB,OAAO,CAClC;GAGF,MAAM,SAAS,KAAK,WAAW,kBAC7B,OAAO,aACP,KAAK,YACN;AACD,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,YAAY,eAAe;IACjC,OAAO;IACR,CAAC;AACF,iBAAc,KAAK,YAAY;;AAGjC,SAAO;;CAGT,AAAQ,aAAa,MAAY,SAA0B;AACzD,SAAO,QAAQ,MAAM,WAAW,KAAK,UAAU,OAAO,CAAC;;CAGzD,AAAQ,WAAW,MAAY,YAA6B;AAC1D,SAAO,WAAW,MAAM,cAAc,UAAU,UAAU,KAAK,CAAC;;CAGlE,AAAQ,mBAAmB,QAA4B;AACrD,MAAI,CAAC,OAAO,eAAe,CAAC,OAAO,SACjC,QAAO;EAGT,MAAM,gBAAgB,KAAK,WAAW,kBACpC,OAAO,aACP,KAAK,YACN;EACD,MAAM,aAAa,KAAK,WAAW,kBACjC,OAAO,UACP,KAAK,SACN;AAED,MAAI,KAAK,WAAW,SAAS,eAAe,WAAW,CACrD,QAAO;AAGT,MACE,OAAO,YAAY,UAAU,IAC7B,KAAK,oBAAoB,OAAO,aAAa,OAAO,SAAS,CAE7D,QAAO;AAGT,MACE,OAAO,YAAY,SAAS,IAC5B,KAAK,oBAAoB,OAAO,aAAa,OAAO,SAAS,CAE7D,QAAO;AAGT,SAAO;;CAGT,AAAQ,oBACN,aACA,UACS;AACT,MAAI,CAAC,SAAS,UAAU,CACtB,QAAO;AAGT,MAAI,KAAK,mBAAmB,aAAa,SAAS,CAChD,QAAO;AAGT,SAAO;;CAGT,AAAQ,mBACN,aACA,UACS;EACT,MAAM,cAAc,YAAY,UAAU;EAC1C,MAAM,WAAW,SAAS,UAAU;AAEpC,SACE,YAAY,UAAU,SAAS,SAC/B,YAAY,gBAAgB,SAAS,eACrC,YAAY,eAAe,SAAS;;CAIxC,AAAQ,oBACN,aACA,UACS;AACT,MAAI,CAAC,SAAS,SAAS,CACrB,QAAO;AAGT,MAAI,KAAK,mBAAmB,aAAa,SAAS,CAChD,QAAO;EAGT,MAAM,QAAQ,YAAY,OAAO;EACjC,MAAM,YAAY,SAAS,OAAO;AAElC,MAAI,MAAM,QAAQ,IAAI,UAAU,QAAQ,CACtC,QAAO;AAGT,SAAO,MAAM,IAAI,KAAK,UAAU,IAAI;;;;;;ACzTxC,IAAa,wBAAb,MAAmC;CACjC,AAAiB,aAAa,IAAI,kBAAkB;CAEpD,YACE,AAAiB,aACjB,AAAiB,UACjB;EAFiB;EACA;;CAGnB,AAAO,6BACL,iBACa;EACb,MAAM,eAAe,IAAI,IAAI,gBAAgB,KAAK,MAAM,EAAE,KAAK,CAAC;EAChE,MAAM,SAAsB,EAAE;AAE9B,OAAK,SAAS,gBAAgB,kBAAkB;GAC9C,MAAM,cAAc,KAAK,YAAY,SAAS,cAAc;AAC5D,OAAI,YAAY,QAAQ,CACtB;GAGF,MAAM,cAAc,KAAK,YACtB,OAAO,cAAc,CACrB,eAAe;AAClB,OAAI,aAAa,IAAI,YAAY,CAC/B;GAGF,MAAM,cAAc,KAAK,SAAS,mBAAmB,cAAc;GACnE,MAAM,iBAAiB,YAAY,SAAS;AAE5C,OAAI,CAAC,eAAe,CAAC,eACnB;AAeF,OAZuB,IAAI,kBACzB,KAAK,UACL,eACA,YACD,CAAC,WAAW,KAEa,IAAI,kBAC5B,KAAK,aACL,eACA,eACD,CAAC,WAAW,EAE6B;IACxC,MAAM,SAAS,KAAK,WAAW,kBAC7B,aACA,KAAK,YACN;AACD,WAAO,KAAK;KACV,IAAI;KACJ,MAAM;KACN,OAAO;KACR,CAAC;;IAEJ;AAEF,SAAO;;;;;;ACvDX,IAAa,wBAAb,MAAmC;CACjC,AAAO,YAAY,MAAiC;AAClD,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB,QAAO;AAGT,MAAI,KAAK,OAAO,CACd,QAAO,KAAK,KAAK;AAGnB,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CAEjB,QAAO,SADW,KAAK,YAAY,MAAM,CACf;AAE5B,UAAO;;AAGT,SAAO,KAAK,UAAU;;CAGxB,AAAO,qBACL,MACA,MACoB;AACpB,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;EAEF,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,CAAC,QACH;AAEF,SAAO,IAAI,kBAAkB,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC,WAAW;;CAGpE,AAAO,gBAAgB,MAA2C;AAChE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;EAEF,MAAM,MAAM,KAAK,cAAc;AAC/B,MACE,OAAO,QAAQ,YACf,OAAO,QAAQ,YACf,OAAO,QAAQ,UAEf,QAAO;;CAKX,AAAO,eAAe,MAA6C;AACjE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,UAAU,CAAC;;CAGzB,AAAO,cAAc,MAA8C;AACjE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,UAAU,CAAC;;CAGzB,AAAO,cAAc,MAA6C;AAChE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,YAAY;;CAG1B,AAAO,oBAAoB,MAA6C;AACtE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,oBAAoB;;CAGlC,AAAO,uBACL,UACA,UACA,aACA,aACuB;EACvB,MAAM,UAAgC,EAAE;EACxC,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EAEJ,MAAM,uBAAuB,KAAK,8BAChC,UACA,YACD;EAED,MAAM,WAAW,KAAK,eAAe,SAAS;EAC9C,MAAM,cAAc,KAAK,eAAe,qBAAqB;AAC7D,MAAI,aAAa,aAAa;AAC5B,WAAQ,KAAK,cAAc;AAC3B,uBAAoB;IAClB,iBAAiB;IACjB,eAAe;IAChB;;EAGH,MAAM,iBAAiB,KAAK,cAAc,SAAS;EACnD,MAAM,oBAAoB,KAAK,cAAc,qBAAqB;AAClE,MAAI,mBAAmB,mBAAmB;AACxC,WAAQ,KAAK,aAAa;AAC1B,sBAAmB;IACjB,gBAAgB;IAChB,cAAc;IACf;;EAGH,MAAM,cAAc,KAAK,qBAAqB,UAAU,SAAS;EACjE,MAAM,iBAAiB,KAAK,qBAC1B,aACA,qBACD;AACD,MAAI,gBAAgB,gBAAgB;AAClC,WAAQ,KAAK,UAAU;AACvB,mBAAgB;IAAE,aAAa;IAAa,WAAW;IAAgB;;EAGzE,MAAM,iBAAiB,KAAK,cAAc,SAAS;EACnD,MAAM,oBAAoB,KAAK,cAAc,qBAAqB;AAClE,MAAI,mBAAmB,mBAAmB;AACxC,WAAQ,KAAK,aAAa;AAC1B,sBAAmB;IACjB,gBAAgB;IAChB,cAAc;IACf;;EAGH,MAAM,cAAc,KAAK,gBAAgB,SAAS;EAClD,MAAM,iBAAiB,KAAK,gBAAgB,qBAAqB;AACjE,MAAI,gBAAgB,gBAAgB;AAClC,WAAQ,KAAK,UAAU;AACvB,mBAAgB;IAAE,aAAa;IAAa,WAAW;IAAgB;;EAGzE,MAAM,uBAAuB,KAAK,oBAAoB,SAAS;EAC/D,MAAM,0BACJ,KAAK,oBAAoB,qBAAqB;AAChD,MAAI,yBAAyB,yBAAyB;AACpD,WAAQ,KAAK,mBAAmB;AAChC,4BAAyB;IACvB,sBAAsB;IACtB,oBAAoB;IACrB;;AAGH,SAAO;GACL,iBAAiB;GACjB;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,AAAQ,8BACN,UACA,aACmB;AACnB,MACE,YACA,CAAC,SAAS,QAAQ,IAClB,SAAS,aAAa,IACtB,eACA,CAAC,YAAY,QAAQ,IACrB,YAAY,SAAS,EACrB;GACA,MAAM,QAAQ,YAAY,OAAO;AACjC,UAAO,MAAM,QAAQ,GAAG,OAAO;;AAEjC,SAAO;;CAGT,AAAO,eACL,UACA,aACS;AAGT,SAFiB,KAAK,YAAY,SAAS,KACvB,KAAK,YAAY,YAAY;;;;;;ACjMrD,IAAa,gBAAb,MAA2B;CACzB,AAAiB,oBAAoB,IAAI,uBAAuB;CAEhE,YACE,AAAiB,aACjB,AAAiB,UACjB;EAFiB;EACA;;CAGnB,AAAO,OAAO,OAA+B;EAC3C,MAAM,YAAY,KAAK,qBAAqB,MAAM,KAAK;AAEvD,MAAI,MAAM,OAAO,MACf,QAAO,KAAK,eAAe,OAAO,UAAU;AAG9C,MAAI,MAAM,OAAO,SACf,QAAO;GAAE;GAAO;GAAW,iBAAiB,EAAE;GAAE;AAGlD,MAAI,MAAM,OAAO,OACf,QAAO,KAAK,gBAAgB,OAAO,UAAU;AAG/C,SAAO,KAAK,mBAAmB,OAAO,UAAU;;CAGlD,AAAQ,eAAe,OAAkB,WAAgC;EACvE,MAAM,cAAc,KAAK,cAAc,KAAK,aAAa,MAAM,KAAK;EAEpE,MAAM,EACJ,iBACA,eACA,eACA,mBACA,kBACA,kBACA,2BACE,KAAK,kBAAkB,uBACzB,KAAK,UACL,MACA,KAAK,aACL,YACD;AAED,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,AAAQ,gBAAgB,OAAkB,WAAgC;EACxE,MAAM,WAAW,MAAM,QAAQ;EAC/B,MAAM,WAAW,KAAK,aAAa,UAAU,MAAM,KAAK;EACxD,MAAM,iBAAiB,KAAK,uBAAuB,UAAU,MAAM,KAAK;EAExE,MAAM,WAAW,KAAK,cAAc,KAAK,UAAU,SAAS;EAC5D,MAAM,cAAc,KAAK,cAAc,KAAK,aAAa,MAAM,KAAK;EAEpE,MAAM,cAAc,KAAK,kBAAkB,qBACzC,KAAK,UACL,SACD;EACD,MAAM,iBAAiB,KAAK,kBAAkB,qBAC5C,KAAK,aACL,YACD;EAED,MAAM,gBACJ,gBAAgB,iBACZ;GAAE,aAAa;GAAa,WAAW;GAAgB,GACvD;AAEN,SAAO;GACL;GACA;GACA,iBAAiB,gBAAgB,CAAC,UAAU,GAAG,EAAE;GACjD,UAAU,YAAY;GACtB,gBAAgB,kBAAkB;GAClC;GACD;;CAGH,AAAQ,mBAAmB,OAAkB,WAAgC;EAC3E,MAAM,WAAW,KAAK,cAAc,KAAK,UAAU,MAAM,KAAK;EAC9D,MAAM,cAAc,KAAK,cAAc,KAAK,aAAa,MAAM,KAAK;EAEpE,MAAM,EACJ,iBACA,eACA,eACA,mBACA,kBACA,kBACA,2BACE,KAAK,kBAAkB,uBACzB,KAAK,UACL,UACA,KAAK,aACL,YACD;AAOD,SAAO;GACL;GACA;GACA;GACA,YATkB,KAAK,kBAAkB,eACzC,UACA,YACD,GAOK;IACE,UAAU,KAAK,kBAAkB,YAAY,SAAS;IACtD,QAAQ,KAAK,kBAAkB,YAAY,YAAY;IACxD,GACD;GACJ;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,AAAQ,qBAAqB,aAA6B;AACxD,MAAI;AACF,UAAO,kBAAkB,YAAY,CAAC,UAAU;UAC1C;AACN,UAAO;;;CAIX,AAAQ,aAAa,aAAqB,WAA4B;AACpE,MAAI;GACF,MAAM,aAAa,kBAAkB,YAAY,CAAC,QAAQ;GAC1D,MAAM,WAAW,kBAAkB,UAAU,CAAC,QAAQ;AACtD,UAAO,WAAW,OAAO,SAAS;UAC5B;AACN,UAAO;;;CAIX,AAAQ,uBACN,aACA,WACS;AACT,MAAI;GACF,MAAM,WAAW,kBAAkB,YAAY;GAC/C,MAAM,SAAS,kBAAkB,UAAU;GAC3C,MAAM,iBAAiB,KAAK,gBAAgB,SAAS;AAErD,UADqB,KAAK,gBAAgB,OAAO,GAC3B;UAChB;AACN,UAAO;;;CAIX,AAAQ,gBAAgB,MAAyC;AAC/D,SAAO,KAAK,UAAU,CAAC,QAAQ,QAAQ,IAAI,SAAS,CAAC,CAAC;;CAGxD,AAAQ,cACN,MACA,aACmB;AACnB,MAAI;GACF,MAAM,OAAO,kBAAkB,YAAY;GAC3C,MAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,UAAO,KAAK,QAAQ,GAAG,OAAO;UACxB;AACN,UAAO;;;;;;;AC/Kb,IAAa,eAAb,MAA0B;CACxB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YACE,aACA,UACA,WACA;AACA,OAAK,YAAY,IAAI,gBAAgB,aAAa,UAAU,UAAU;AACtE,OAAK,YAAY,IAAI,gBAAgB,aAAa,UAAU,UAAU;AACtE,OAAK,YAAY,IAAI,eAAe,aAAa,SAAS;AAC1D,OAAK,kBAAkB,IAAI,sBAAsB,aAAa,SAAS;AACvE,OAAK,WAAW,IAAI,cAAc,aAAa,SAAS;;CAG1D,AAAO,QAAuB;EAC5B,MAAM,aAAa,KAAK,UAAU,SAAS;EAC3C,MAAM,YAAY,KAAK,UAAU,SAAS,WAAW;EACrD,MAAM,cAAc,KAAK,UAAU,SAAS,UAAU;EACtD,MAAM,iBACJ,KAAK,gBAAgB,6BAA6B,YAAY;AAEhE,SADmB,CAAC,GAAG,aAAa,GAAG,eAAe,CACpC,KAAK,UAAU,KAAK,SAAS,OAAO,MAAM,CAAC;;;;;;AC1BjE,IAAa,aAAb,MAAwB;CACtB,AAAiB,aAAa,IAAI,kBAAkB;CACpD,AAAiB,aAAa,IAAI,kBAAkB;CACpD,AAAiB;CACjB,AAAQ;CAER,YAAY,AAAiB,MAAkB;EAAlB;AAC3B,OAAK,WAAW,KAAK,OAAO;AAC5B,OAAK,YAAY,IAAI,cAAc,KAAK,SAAS;AACjD,+BACE,MACA,EAAE,UAAUC,gBAAW,KAAK,EAC5B,EAAE,UAAU,MAAM,CACnB;;CAGH,AAAO,cAAoB;AACzB,OAAK,WAAW,KAAK,KAAK,OAAO;AACjC,OAAK,UAAU,YAAY,KAAK,SAAS;;CAG3C,AAAO,gBAAkC;AACvC,SAAO,KAAK,WAAW,kBACrB,KAAK,SAAS,MAAM,EACpB,KAAK,SACN;;CAGH,AAAO,iBAAiB,WAAmB,WAAyB;AAClE,OAAK,UAAU,iBAAiB,WAAW,UAAU;;CAGvD,AAAO,aAA4B;AACjC,SAAO,KAAK,oBAAoB,CAAC,OAAO;;CAG1C,AAAO,UAAmB;EACxB,MAAM,gBAAgB,KAAK,kBAAkB;EAC7C,MAAM,aAAa,KAAK,eAAe;AACvC,SAAO,CAAC,KAAK,WAAW,SAAS,eAAe,WAAW;;CAG7D,AAAO,mBAAqC;AAC1C,SAAO,KAAK,WAAW,kBACrB,KAAK,KAAK,MAAM,EAChB,KAAK,KACN;;CAGH,AAAQ,qBAAmC;AACzC,SAAO,IAAI,aAAa,KAAK,MAAM,KAAK,UAAU,KAAK,UAAU;;;;;;AC3DrE,MAAM,qBAAqB;AAC3B,MAAM,wBAAwB;AAE9B,MAAa,2BACX;AAEF,SAAgB,iBAAiB,MAAuB;AACtD,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,sBACnC,QAAO;AAET,QAAO,mBAAmB,KAAK,KAAK;;;;;ACOtC,IAAa,kBAAb,MAA6B;CAC3B,SAAS,MAAqC;EAC5C,MAAM,SAA4B,EAAE;AACpC,OAAK,wBAAwB,MAAM,OAAO;AAC1C,SAAO;;CAGT,AAAQ,wBACN,MACA,QACM;AACN,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,UAAU,EAAE;GACnB,MAAM,WAAW,KAAK,YAAY;GAClC,MAAM,0BAAU,IAAI,KAAa;AACjC,QAAK,MAAM,SAAS,UAAU;IAC5B,MAAM,OAAO,MAAM,MAAM;AACzB,QAAI,CAAC,KACH,QAAO,KAAK;KACV,QAAQ,MAAM,IAAI;KAClB,MAAM;KACN,SAAS;KACV,CAAC;aACO,QAAQ,IAAI,KAAK,CAC1B,QAAO,KAAK;KACV,QAAQ,MAAM,IAAI;KAClB,MAAM;KACN,SAAS,yBAAyB;KACnC,CAAC;aACO,CAAC,iBAAiB,KAAK,CAChC,QAAO,KAAK;KACV,QAAQ,MAAM,IAAI;KAClB,MAAM;KACN,SAAS;KACV,CAAC;AAEJ,YAAQ,IAAI,KAAK;AACjB,SAAK,wBAAwB,OAAO,OAAO;;;AAI/C,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,wBAAwB,OAAO,OAAO;;;;;;;ACvDnD,IAAa,mBAAb,MAA8B;CAC5B,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,WAAqC;EACnC,MAAM,SAAmC,EAAE;AAC3C,OAAK,cAAc,KAAK,KAAK,MAAM,EAAE,IAAI,OAAO;AAChD,SAAO;;CAGT,aACE,QACA,WAC+B;EAC/B,MAAM,UAAU,KAAK,KAAK,mBAAmB,OAAO;AACpD,MAAI,CAAC,QACH,QAAO;AAGT,OAAK,MAAM,OAAO,QAAQ,cAAc,CAEtC,KADmB,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,CAC1C,QAAQ,CACrB,QAAO;GACL;GACA,SAAS;GACT,WAAW,aAAa;GACzB;AAIL,SAAO;;CAGT,AAAQ,cACN,MACA,aACA,QACM;AACN,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,aAAa,EAAE;GACtB,MAAM,QAAQ,KAAK,aAAa,KAAK,IAAI,EAAE,YAAY;AACvD,OAAI,MACF,QAAO,KAAK,MAAM;;AAItB,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,EAAE;GACrC,MAAM,YAAY,cACd,GAAG,YAAY,GAAG,MAAM,MAAM,KAC9B,MAAM,MAAM;AAChB,QAAK,cAAc,OAAO,WAAW,OAAO;;AAIhD,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,EAAE;IACnB,MAAM,YAAY,GAAG,YAAY;AACjC,SAAK,cAAc,OAAO,WAAW,OAAO;;;;;;;;ACjEpD,SAAgB,kBACd,UACA,UACoB;AACpB,KAAI,CAAC,SACH;CAGF,MAAM,aAAa,gBAAgB,cAAc,SAAS;AAC1D,KAAI,WACF,QAAO,WAAW,wBAAwB,SAAS;;;;;ACwBvD,MAAM,sBAA4C;CAChD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAK,OAAO;GAAO;EACtC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO;GAAQ;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO;GAAG;EACnC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAO,OAAO;GAAK;EACtC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO;GAAM;EACzC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO;GAAM;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAI;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAG;EACvC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAO;EAC3C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,KAAK,IAAI;GAAE,OAAO;GAAK;EAC3C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,GAAG,EAAE;GAAE,OAAO;GAAG;EACrC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,MAAM,MAAM;GAAE,OAAO;GAAM;EAC/C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO,EAAE;GAAE;EACvC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO,EAAE;GAAE;EAClC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO,EAAE;GAAE;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO,CAAC,QAAQ;GAAE;EAC9C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO,CAAC,GAAG;GAAE;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO,CAAC,KAAK;GAAE;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO,EAAE;GAAE;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,GAAG,EAAE;GAAE,OAAO,EAAE;GAAE;EACtC,kBAAkB;EAClB,UAAU;EACX;CACF;AAED,MAAM,eAA4C;CAChD,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ,EAAE,GAAG,GAAG;CAChB,OAAO,CAAC,GAAG,EAAE;CACb,KAAK;CACL,SAAS;CACV;AAED,MAAM,mBAAmB,IAAI,IAAgB;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,aAAa,SAA6B;AACjD,QAAO,iBAAiB,IAAI,QAAsB,GAC7C,UACD;;AAGN,SAAS,gBAAgB,SAGvB;CACA,MAAM,aAAa,gBAAgB,KAAK,QAAQ;AAChD,KAAI,aAAa,GACf,QAAO;EAAE,UAAU;EAAS,WAAW,aAAa,WAAW,GAAG;EAAE;AAEtE,QAAO,EAAE,UAAU,aAAa,QAAQ,EAAE;;AAG5C,SAAS,uBACP,UACA,QAC2B;AAC3B,KAAI,aAAa,OACf,QAAO;AAET,QACE,oBAAoB,MACjB,SAAS,KAAK,aAAa,YAAY,KAAK,WAAW,OACzD,IAAI;;AAIT,SAAS,eACP,OACA,UACA,QACS;AACT,KAAI,aAAa,OACf,QAAO;AAET,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,OAAO,MAAM;EACtB,KAAK;AACH,OAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,IAAI;AAErB,UAAO,OAAO,UAAU,WAAW,QAAQ;EAC7C,KAAK,UACH,QAAO,QAAQ,MAAM;EACvB,QACE,QAAO;;;AAIb,SAAS,sBACP,UACA,QACkB;AAClB,KAAI,aAAa,OACf,QAAO;CAET,MAAM,OAAO,uBAAuB,UAAU,OAAO;AACrD,QAAO,OAAO,KAAK,mBAAmB;;AAGxC,SAAS,YACP,GACA,GACkB;CAClB,MAAM,QAA4B;EAAC;EAAQ;EAAY;EAAU;AACjE,QAAO,MAAM,KAAK,IAAI,MAAM,QAAQ,EAAE,EAAE,MAAM,QAAQ,EAAE,CAAC,KAAK;;AAGhE,SAAS,uBAAuB,OAA+C;AAC7E,QAAO,MAAM,QACV,KAAK,SAAS,YAAY,KAAK,KAAK,iBAAiB,EACtD,OACD;;AAGH,SAAS,yBACP,KACsB;CACtB,MAAM,EAAE,UAAU,QAAQ,eAAe,gBAAgB;CACzD,MAAM,QAA8B,EAAE;AAEtC,KACE,WAAW,WACX,gBAAgB,UAChB,aAAa,WACb,aAAa,UACb;AACA,QAAM,KAAK;GAAE,MAAM;GAAiB,kBAAkB;GAAQ,CAAC;AAC/D,MAAI,aAAa,aAAa;GAC5B,MAAM,WAAW,sBAAsB,UAAU,YAAY;AAC7D,SAAM,KAAK;IACT,MAAM,GAAG,SAAS,KAAK;IACvB,kBAAkB;IACnB,CAAC;;YAGJ,aAAa,WACb,kBAAkB,UAClB,WAAW,WACX,WAAW,UACX;AACA,QAAM,KAAK;GACT,MAAM;GACN,kBAAkB;GACnB,CAAC;AACF,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,WAAW,sBAAsB,eAAe,OAAO;AAC7D,SAAM,KAAK;IACT,MAAM,GAAG,cAAc,KAAK;IAC5B,kBAAkB;IACnB,CAAC;;YAGJ,aAAa,YACb,WAAW,YACX,aAAa,WACb,WAAW,QAEX,OAAM,KAAK;EACT,MAAM,GAAG,SAAS,KAAK;EACvB,kBAAkB;EACnB,CAAC;MACG;EACL,MAAM,WAAW,sBAAsB,UAAU,OAAO;AACxD,QAAM,KAAK;GAAE,MAAM,GAAG,SAAS,KAAK;GAAU,kBAAkB;GAAU,CAAC;;AAG7E,QAAO;;AAGT,SAAS,kCACP,UACA,WACqC;CACrC,MAAM,SAAS,aAAa;AAE5B,QAAO;EAAE;EAAQ,OAAO,CADC,eAAe,QAAQ,UAAU,UAAU,CAC1B;EAAE;;AAG9C,SAAS,+BACP,eACA,QACqC;CACrC,MAAM,YAAY,aAAa;AAG/B,QAAO;EAAE,QAFM,CAAC,WAAW,UAAU;EAEpB,OADH,eAAe,WAAW,eAAe,OAAO;EACtC;;AAG1B,SAAgB,oCACd,UACA,QAC2B;AAC3B,KAAI,aAAa,OACf,QAAO;CAGT,MAAM,OAAO,gBAAgB,SAAS;CACtC,MAAM,KAAK,gBAAgB,OAAO;AAElC,KAAI,KAAK,aAAa,aAAa,GAAG,aAAa,UACjD,QAAO;AAGT,KACE,GAAG,aAAa,WAChB,GAAG,aACH,KAAK,aAAa,WAClB,KAAK,aAAa,UAClB;EACA,MAAM,UAAU,kCACd,KAAK,UACL,GAAG,UACJ;EACD,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACX,aAAa,GAAG;GACjB,CAAC;AACF,SAAO;GACL;GACA;GACA;GACA,kBAAkB,uBAAuB,MAAM;GAC/C;GACD;;AAGH,KACE,KAAK,aAAa,WAClB,KAAK,aACL,GAAG,aAAa,WAChB,GAAG,aAAa,UAChB;EACA,MAAM,UAAU,+BAA+B,KAAK,WAAW,GAAG,SAAS;EAC3E,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACX,eAAe,KAAK;GACrB,CAAC;AACF,SAAO;GACL;GACA;GACA;GACA,kBAAkB,uBAAuB,MAAM;GAC/C;GACD;;CAGH,MAAM,OAAO,uBAAuB,KAAK,UAAU,GAAG,SAAS;AAC/D,KAAI,MAAM;EACR,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACZ,CAAC;AACF,SAAO;GACL;GACA;GACA,SAAS,KAAK;GACd,kBAAkB,KAAK;GACvB;GACD;;AAGH,QAAO;EACL;EACA;EACA,SAAS;GAAE,QAAQ;GAAK,OAAO;GAAK;EACpC,kBAAkB;EAClB,OAAO,CACL;GACE,MAAM,GAAG,KAAK,SAAS,KAAK,GAAG;GAC/B,kBAAkB;GACnB,CACF;EACF;;;;;ACzaH,SAAS,kBAAkB,QAAoC;AAC7D,KAAI,UAAU,OACZ,QAAO;AAET,KAAI,UAAU,OACZ,QAAO,OAAO;AAEhB,QAAO;;AAGT,SAAS,qBAAqB,QAA4C;AACxE,KAAI,UAAU,UAAU,OAAO,SAAS,YAAY,gBAAgB,OAElE,QADY,OAAmC,cAClC;;AAKjB,SAAS,uBACP,QACA,UACS;AACT,QAAO,aAAa,SAAS,OAAO,UAAU;;AAGhD,SAAS,mBAAmB,QAAiC;AAC3D,KAAI,aAAa,OACf,QAAO,OAAO;CAEhB,MAAM,YAAY;AAClB,KAAI,UAAU,MACZ,QAAO,CAAC,0BAA0B,UAAU,MAAM,CAAC;AAErD,QAAO,EAAE;;AAGX,SAAS,oBAAoB,QAAiC;AAC5D,KAAI,aAAa,OACf,QAAO,OAAO;CAEhB,MAAM,YAAY;AAClB,KAAI,CAAC,UAAU,WACb,QAAO,EAAE;AAEX,QAAO,OAAO,YACZ,OAAO,QAAQ,UAAU,WAAW,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAC9D,KACA,0BAA0B,WAAW,CACtC,CAAC,CACH;;AAGH,MAAM,eAAoE;CACxE,SAAS,WAAW,uBAAuB,QAAQ,GAAG;CACtD,SAAS,WAAW,uBAAuB,QAAQ,EAAE;CACrD,UAAU,WAAW,uBAAuB,QAAQ,MAAM;CAC1D,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,0BAA0B,QAAiC;AACzE,KAAI,UAAU,OACZ,QAAO;AAGT,KAAI,EAAE,UAAU,QACd,QAAO;CAGT,MAAM,UAAU,aAAa,OAAO;AACpC,QAAO,UAAU,QAAQ,OAAO,GAAG;;AASrC,SAAgB,uBACd,OAC4B;AAC5B,KAAI,MAAM,OAAO,MACf,QAAO;AAOT,QAAO;EAAE,OAJK,0BAA0B,MAAM,MAAM;EAIpC,MAHH,kBAAkB,MAAM,MAAM;EAGrB,mBAFI,qBAAqB,MAAM,MAAM;EAElB;;;;;ACzE3C,IAAa,eAAb,MAA0B;CACxB,AAAiB;CACjB,AAAiB;CACjB,AAAiB,mBAAmB,IAAI,iBAAiB;CACzD,AAAiB;CACjB,AAAQ,sBAA2C,EAAE;CAErD,YAAY,YAA8B;EACxC,MAAM,SAAS,IAAI,cAAc;AAEjC,OAAK,QAAQ,IAAI,WADJ,OAAO,MAAM,WAAW,CACJ;AACjC,OAAK,oBAAoB,IAAI,iBAAiB,KAAK,MAAM;AAEzD,OAAK,sBAAsB,KAAK,qBAC9B,OAAO,oBAAoB,CAC5B;AAED,OAAK,QAAQ,IAAI,WAAW,KAAK,MAAM;AAEvC,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,AAAQ,qBACN,SACqB;EACrB,MAAM,SAA8B,EAAE;AAEtC,OAAK,MAAM,EAAE,QAAQ,gBAAgB,SAAS;GAC5C,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,OAAI,KAAK,QAAQ,CACf;AAGF,OAAI;IACF,MAAM,UAAU,IAAI,cAAc,KAAK,OAAO,QAAQ,WAAW;AACjE,SAAK,WAAW,QAAQ;AACxB,SAAK,MAAM,gBAAgB,QAAQ,QAAQ;YACpC,OAAO;IACd,MAAM,UAAU,KAAK,oBAAoB,MAAM;AAC/C,WAAO,KAAK;KAAE;KAAQ;KAAY;KAAS,CAAC;;;AAIhD,SAAO;;CAGT,AAAQ,oBAAoB,OAAwB;AAClD,MAAI,iBAAiB,aACnB,QAAO,MAAM;AAEf,MAAI,iBAAiB,MACnB,QAAO,MAAM;AAEf,SAAO;;CAGT,IAAW,OAAmB;AAC5B,SAAO,KAAK;;CAGd,IAAW,OAAmB;AAC5B,SAAO,KAAK;;CAGd,AAAO,OAAmB;AACxB,SAAO,KAAK,MAAM,MAAM;;CAG1B,AAAO,SAAS,QAA4B;AAC1C,SAAO,KAAK,MAAM,SAAS,OAAO;;CAGpC,AAAO,aAAqB;AAC1B,SAAO,KAAK,MAAM,YAAY;;CAGhC,AAAO,qBAAqB,QAAoC;AAC9D,SAAO,KAAK,MAAM,2BAA2B,OAAO;;CAGtD,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,SAAS;;CAG7B,IAAW,UAAmB;EAC5B,MAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,MAAI,KAAK,QAAQ,CACf,QAAO;AAET,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,YAAY,CAAC,SAAS;AAEpC,SAAO;;CAGT,IAAW,mBAA+C;AACxD,SAAO,KAAK,iBAAiB,SAAS,KAAK,MAAM,MAAM,CAAC;;CAG1D,AAAO,mBAA6C;EAClD,MAAM,kBAAkB,KAAK,kBAAkB,UAAU;AAOzD,SAAO,CAAC,GANsC,KAAK,oBAAoB,KACpE,OAAO;GACN,QAAQ,EAAE;GACV,SAAS,EAAE;GACZ,EACF,EACuB,GAAG,gBAAgB;;CAG7C,AAAO,cAAoB;AACzB,OAAK,MAAM,aAAa;;CAG1B,AAAO,SAAe;EACpB,MAAM,aAAa,KAAK,MAAM,eAAe;EAC7C,MAAM,SAAS,IAAI,cAAc;EACjC,MAAM,OAAO,OAAO,MAAM,WAAW;AAErC,OAAK,MAAM,mBAAmB;AAC9B,OAAK,MAAM,YAAY,KAAK;AAC5B,OAAK,sBAAsB,KAAK,qBAC9B,OAAO,oBAAoB,CAC5B;AAED,OAAK,MAAM,aAAa;;CAG1B,AAAO,aAA4B;AACjC,SAAO,KAAK,MAAM,YAAY;;CAGhC,AAAO,iBAAmC;AACxC,SAAO,KAAK,MAAM,kBAAkB;;CAGtC,AAAO,YAAY,YAAoB,UAA2B;AAChE,SAAO,KAAK,MAAM,YAAY,YAAY,SAAS;;CAGrD,AAAO,mBAAmB,QAAyB;AACjD,SAAO,KAAK,MAAM,mBAAmB,OAAO;;CAG9C,AAAO,SAAS,QAAgB,gBAA8B;AAC5D,MAAI,CAAC,KAAK,YAAY,QAAQ,eAAe,CAC3C;AAEF,OAAK,MAAM,SAAS,QAAQ,eAAe;;CAG7C,AAAO,WAAW,QAAgB,SAAuB;AACvD,OAAK,MAAM,WAAW,QAAQ,QAAQ;;CAGxC,AAAO,mBACL,QACA,UACM;EACN,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,CACf;EAEF,MAAM,cAAc,KAAK,UAAU;AACnC,OAAK,YAAY;GACf,aACE,iBAAiB,WACb,SAAS,eAAe,SACxB,YAAY;GAClB,YACE,gBAAgB,WAAW,SAAS,aAAa,YAAY;GAChE,CAAC;;CAGJ,AAAO,mBACL,QACA,OACM;EACN,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,CACf;AAEF,OAAK,gBAAgB,MAAM;;CAG7B,AAAO,SAAS,UAAkB,MAA0B;EAC1D,MAAM,SAAS,KAAK,MAAM,SAAS,SAAS;AAC5C,MAAI,OAAO,QAAQ,IAAI,CAAC,OAAO,UAAU,CACvC,QAAO;EAET,MAAM,UAAU,YAAY,OAAO,KAAK;AACxC,OAAK,MAAM,WAAW,UAAU,QAAQ;AACxC,SAAO;;CAGT,AAAO,WAAW,QAAyB;AAEzC,MADa,KAAK,MAAM,SAAS,OAAO,CAC/B,QAAQ,CACf,QAAO;EAET,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACtC,MAAI,KAAK,SAAS,CAChB,QAAO;AAET,OAAK,MAAM,aAAa,KAAK;AAC7B,SAAO;;CAGT,AAAO,YACL,QACA,SACsB;AAEtB,MADoB,KAAK,MAAM,SAAS,OAAO,CAC/B,QAAQ,CACtB,QAAO;EAET,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACtC,MAAI,KAAK,SAAS,CAChB,QAAO;AAET,OAAK,MAAM,UAAU,MAAM,QAAQ;AACnC,OAAK,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,CAAC;AACjD,SAAO;GACL,gBAAgB;GAChB,WAAW,QAAQ,IAAI;GACxB;;CAGH,AAAO,YAAY,QAAsC;EACvD,MAAM,cAAc,KAAK,MAAM,SAAS,OAAO;AAC/C,MAAI,YAAY,QAAQ,CACtB,QAAO;AAET,MAAI,YAAY,SAAS,CACvB,QAAO;EAET,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACtC,MAAI,KAAK,SAAS,CAChB,QAAO;EAET,MAAM,OAAO,YAAY,MAAM;EAC/B,MAAM,YAAY,YAAY,MAAM,MAAM,YAAY;AACtD,OAAK,MAAM,UAAU,MAAM,UAAU;AACrC,cAAY,QAAQ,GAAG;AACvB,OAAK,MAAM,iBAAiB,QAAQ,UAAU,IAAI,CAAC;AACnD,SAAO;GACL,gBAAgB;GAChB,WAAW,UAAU,IAAI;GAC1B;;CAGH,AAAO,gBAAgB,SAA2C;EAChE,MAAM,cAAc,KAAK,MAAM,MAAM;AACrC,MAAI,YAAY,QAAQ,CACtB,QAAO;EAET,MAAM,QAAQ,YAAY,IAAI;AAC9B,UAAQ,QAAQ,YAAY,MAAM,CAAC;AACnC,OAAK,MAAM,YAAY,QAAQ;AAC/B,OAAK,MAAM,iBAAiB,OAAO,QAAQ,IAAI,CAAC;AAChD,SAAO;GACL,gBAAgB;GAChB,WAAW,QAAQ,IAAI;GACxB;;CAGH,AAAO,kBAAwC;EAC7C,MAAM,cAAc,KAAK,MAAM,MAAM;AACrC,MAAI,YAAY,QAAQ,IAAI,YAAY,SAAS,CAC/C,QAAO;EAET,MAAM,QAAQ,YAAY,IAAI;EAC9B,MAAM,OAAO,YAAY,MAAM;EAC/B,MAAM,YAAY,YAAY,MAAM,MAAM,YAAY;AACtD,cAAY,QAAQ,GAAG;AACvB,OAAK,MAAM,YAAY,UAAU;AACjC,OAAK,MAAM,iBAAiB,OAAO,UAAU,IAAI,CAAC;AAClD,SAAO;GACL,gBAAgB;GAChB,WAAW,UAAU,IAAI;GAC1B;;CAGH,AAAO,iBAAiB,QAAgB,SAA0B;EAChE,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,IAAI,KAAK,UAAU,KAAK,SAAS,OAChD,QAAO;AAET,EAAC,KAAoB,cAAc,WAAW,OAAU;AACxD,SAAO;;CAGT,AAAO,cACL,QACA,YACqB;EACrB,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,CACf,QAAO;GAAE,SAAS;GAAO,OAAO;GAAkB;AAEpD,MAAI;GACF,MAAM,UAAU,aACZ,IAAI,cAAc,KAAK,OAAO,QAAQ,WAAW,GACjD;AACJ,QAAK,WAAW,QAAQ;AACxB,OAAI,QACF,MAAK,MAAM,gBAAgB,QAAQ,QAAQ;OAE3C,MAAK,MAAM,kBAAkB,OAAO;AAEtC,QAAK,sBAAsB,KAAK,oBAAoB,QACjD,MAAM,EAAE,WAAW,OACrB;AACD,UAAO,EAAE,SAAS,MAAM;WACjB,OAAO;AAGd,UAAO;IAAE,SAAS;IAAO,OADvB,iBAAiB,eAAe,MAAM,UAAU,OAAO,MAAM;IACjB;;;CAIlD,AAAO,iBAAiB,MAA0B;AAChD,SAAO,YAAY,OAAO,KAAK;;CAGjC,AAAO,iBAAiB,MAA0B;AAChD,SAAO,YAAY,OAAO,KAAK;;;;;;ACrWnC,IAAY,wDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,SAAgB,mBACd,QACA,MACmB;AACnB,SAAQ,QAAR;EACE,KAAK,cAAc,OACjB,QAAO,YAAY,OAAO,KAAK;EACjC,KAAK,cAAc,OACjB,QAAO,YAAY,OAAO,KAAK;EACjC,KAAK,cAAc,QACjB,QAAO,YAAY,QAAQ,KAAK;EAClC,KAAK,cAAc,OACjB,QAAO,YAAY,OAAO,KAAK;EACjC,KAAK,cAAc,MACjB,QAAO,YAAY,MAAM,MAAM,YAAY,OAAO,GAAG,CAAC;EACxD,KAAK,cAAc,iBACjB,QAAO,YAAY,OAAO,MAAM,EAAE,YAAY,IAAI,CAAC;EACrD,KAAK,cAAc,KACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,MAAM,CAAC;EAC9D,KAAK,cAAc,MACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,OAAO,CAAC;EAC/D,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,eACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,gBAAgB,CAAC;EACxE,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,QACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,SAAS,CAAC;EACjE,KAAK,cAAc,cACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,eAAe,CAAC;EACvE,KAAK,cAAc,SACjB,QAAO,YAAY,OAAO,MAAM,EAAE,kBAAkB,iBAAiB,CAAC;EACxE,QACE,QAAO;;;AA0Bb,MAAM,eAAiC;CACrC;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAS,OAAO;EAAW;CAC/C;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAO,OAAO;EAAS;CAC3C;EAAE,IAAI,cAAc;EAAkB,OAAO;EAAe;CAC7D;AAED,MAAM,iBAAmC,CACvC;CACE,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO,CACL;EAAE,IAAI,cAAc;EAAM,OAAO,cAAc,gBAAgB,KAAK;EAAE,EACtE;EAAE,IAAI,cAAc;EAAU,OAAO;EAAY,CAClD;CACF,CACF;AAED,MAAM,sBAAwC,CAC5C;CACE,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO;EACL;GAAE,IAAI,cAAc;GAAO,OAAO,cAAc,gBAAgB,MAAM;GAAE;EACxE;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GACnD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GAClD,iBAAiB;GAClB;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GACnD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,eAAe;GACrD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GAClD,iBAAiB;GAClB;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,QAAQ;GAC9C;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,cAAc;GACpD;EACF;CACF,CACF;AAED,MAAa,iBAA8B;CACzC;EAAE,IAAI;EAAS,SAAS;EAAc,iBAAiB;EAAM;CAC7D;EAAE,IAAI;EAAW,SAAS;EAAgB,iBAAiB;EAAM;CACjE;EAAE,IAAI;EAAiB,SAAS;EAAqB;CACtD;;;;ACrJD,MAAa,aAA+B;CAC1C,MAAM,mBAAmB;CACzB,YAAY;EACV,QAAQ;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACxE,QAAQ;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACxE,KAAK;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACrE,UAAU;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI;EAC1D,MAAM;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACtE,WAAW;GACT,MAAM,mBAAmB;GACzB,SAAS;GACT,UAAU;GACX;EACD,UAAU;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EAC1E,MAAM;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAG,UAAU;GAAM;EACrE,OAAO;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAG,UAAU;GAAM;EACtE,QAAQ;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAG,UAAU;GAAM;EACxE;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,sBAAsB;CACvB;AAED,MAAa,uBAAyD,GACnE,gBAAgB,OAAO,YACzB;AAED,MAAa,qBAAqB,QAAyC;AACzE,KAAI,OAAO,OAAO,sBAAsB,IAAI,CAC1C,QAAO,qBAAqB,QAAQ;AAEtC,QAAO;;AAGT,MAAa,mBAAmB,QAAyB;AACvD,QAAO,OAAO,OAAO,sBAAsB,IAAI;;;;;ACtBjD,MAAM,WAAuB,EAAE;AAE/B,SAAgB,gBACd,MACA,SACM;AACN,UAAS,QAAQ;;AAGnB,SAAgB,aACd,MACA,QACA,QACA,SAAkB,OAClB,aAAsB,OACd;AACR,KAAI,KAAK,UAAU,EAAE;EACnB,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,8EACD;AAEH,SAAO,IAAI,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,WAAW;;AAG9D,KAAI,KAAK,SAAS,EAAE;EAClB,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,4EACD;AAEH,SAAO,IAAI,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,WAAW;;AAG9D,KAAI,KAAK,OAAO,EAAE;EAChB,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,wEACD;AAEH,SAAO,IAAI,QACT,MACA,QACA,QACA,QACA,WACD;;AAGH,KAAI,KAAK,YAAY,KAAK,QAAW;EACnC,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,sFACD;AAEH,SAAO,IAAI,QACT,MACA,QACA,QACA,QACA,WACD;;CAGH,MAAM,UAAU,SAAS;AACzB,KAAI,CAAC,QACH,OAAM,IAAI,MACR,oFACD;AAEH,QAAO,IAAI,QACT,MACA,QACA,QACA,QACA,WACD;;;;;ACrGH,IAAsB,aAAtB,MAAiC;CAC/B,AAAO,iBAAiB;CACxB,AAAO,kBAAkB;CACzB,AAAO,sBAAsB;CAE7B,YACE,AAAmB,OACnB,AAAmB,SACnB,AAAmB,UAAmB,OACtC,AAAmB,cAAuB,OAC1C;EAJmB;EACA;EACA;EACA;AAEnB,2BAAe,MAAM;GACnB,gBAAgBC;GAChB,iBAAiBA;GACjB,qBAAqBA;GACrB,QAAQC;GACR,MAAMA;GACN,MAAMA;GACN,MAAMA;GACN,OAAOA;GACP,WAAWA;GACX,YAAYA;GACZ,gBAAgBA;GAChB,wBAAwBA;GACxB,eAAeA;GACf,UAAUA;GACV,SAASA;GACT,aAAaA;GACb,UAAUA;GACV,UAAUA;GACV,WAAWA;GACX,kBAAkBA;GAClB,UAAUA;GACV,gBAAgBA;GAChB,cAAcA;GACd,aAAaA;GACb,YAAYA;GACZ,SAASA;GACT,mBAAmBA;GACnB,WAAWA;GACX,qBAAqBA;GACrB,cAAcA;GACd,sBAAsBA;GACtB,iBAAiBA;GACjB,UAAUA;GACV,cAAcA;GACd,SAASA;GACT,mBAAmBA;GACnB,YAAYA;GACZ,YAAYC,YAAO;GACnB,aAAaA,YAAO;GACpB,iBAAiBA,YAAO;GACxB,QAAQA,YAAO;GACf,gBAAgBA,YAAO;GACvB,eAAeA,YAAO;GACtB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACnB,iBAAiBA,YAAO;GACzB,CAAC;;CAGJ,IAAW,aAAsB;AAC/B,SAAO,KAAK;;CAGd,IAAW,OAAmB;AAC5B,SAAO,KAAK;;CAGd,IAAW,SAAiB;AAC1B,SAAO,KAAK,MAAM,IAAI;;CAGxB,IAAW,SAAkB;AAC3B,SAAO,KAAK;;CAGd,IAAW,OAAe;AACxB,MAAI,KAAK,QACP,QAAO,KAAK,QAAQ;AAEtB,SAAO,KAAK,MAAM,MAAM;;CAG1B,IAAW,OAAe;AACxB,SAAO,KAAK,MAAM,MAAM;;CAG1B,IAAW,OAAe;AACxB,MAAI,KAAK,MAAM,OAAO,CACpB,QAAO;AAET,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,QAAgB;AACzB,MAAI,KAAK,MAAM,OAAO,EAAE;GACtB,MAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,UAAO,cAAc,IAAI,IAAI;;AAE/B,MAAI,KAAK,MAAM,UAAU,CACvB,QAAO;AAET,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO;AAET,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,YAAqB;AAC9B,SAAO,KAAK;;CAGd,IAAW,aAAsB;AAC/B,SAAO,KAAK;;CAGd,IAAW,iBAA0B;AACnC,SAAO,KAAK;;CAGd,IAAW,yBAAkC;AAC3C,SACE,CAAC,KAAK,kBAAkB,CAAC,KAAK,mBAAmB,CAAC,KAAK;;CAI3D,AAAO,WAAW,OAAsB;AACtC,OAAK,iBAAiB;;CAGxB,AAAO,YAAY,OAAsB;AACvC,OAAK,kBAAkB;;CAGzB,AAAO,gBAAgB,OAAsB;AAC3C,OAAK,sBAAsB;;CAG7B,IAAW,gBAAyB;AAClC,SAAO;;CAGT,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,SAAS;;CAG7B,IAAW,cAAuB;AAChC,SAAO,KAAK,MAAM,aAAa;;CAGjC,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU,KAAK,SAAS;;CAG5C,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU,KAAK,SAAS;;CAG5C,IAAW,YAAqB;AAC9B,SAAO,KAAK,MAAM,UAAU,KAAK,SAAS;;CAG5C,IAAW,mBAA4B;AACrC,SAAO,CAAC,KAAK;;CAGf,IAAW,WAAoB;AAC7B,SAAO,CAAC,KAAK;;CAGf,IAAW,iBAA0B;AACnC,SAAO,QAAQ,KAAK,MAAM,UAAU,CAAC,YAAY;;CAGnD,IAAW,eAAwB;AACjC,SAAO,KAAK,MAAM,UAAU,CAAC,cAAc;;CAG7C,IAAW,cAAsB;AAC/B,SAAO,KAAK,MAAM,UAAU,CAAC,eAAe;;CAG9C,IAAW,aAAsB;AAC/B,SAAO;;CAGT,IAAW,UAAkB;AAC3B,SAAO;;CAGT,IAAW,oBAAwC;AACjD,SAAO,EAAE;;CAGX,IAAW,YAAqB;AAC9B,SAAO;;CAGT,IAAW,sBAAqC;AAC9C,SAAO;;CAGT,IAAW,eAAwB;CAInC,IAAW,uBAA+B;AACxC,SAAO;;CAGT,IAAW,kBAAiC;AAC1C,MAAI,KAAK,WAAW,KAAK,QAAQ,aAC/B,QAAO,KAAK,QAAQ;AAItB,SAFe,KAAK,QAAQ,OAAO,iBACd,MAAM,MAAM,EAAE,WAAW,KAAK,OAAO,EAC5C,WAAW;;CAG3B,IAAW,WAAoB;AAC7B,SAAO,KAAK,oBAAoB;;CAGlC,IAAW,eAA8B;AACvC,SAAO,KAAK;;CAGd,IAAW,UAAmB;AAC5B,MAAI,KAAK,eAAe,KAAK,WAAW,CAAC,KAAK,MAAM,MAAM,CACxD,QAAO;AAET,SAAO,KAAK,QAAQ,OAAO,mBAAmB,KAAK,OAAO;;CAG5D,IAAW,oBAA6B;AACtC,SAAO;;CAGT,AAAO,OAAO,SAAuB;AACnC,MAAI,YAAY,KAAK,KACnB,KAAI,KAAK,QACP,MAAK,QAAQ,WAAW,QAAQ;MAEhC,MAAK,QAAQ,OAAO,WAAW,KAAK,QAAQ,QAAQ;;CAK1D,AAAO,eAAe,OAAqB;AACzC,OAAK,QAAQ,OAAO,mBAAmB,KAAK,QAAQ,EAAE,aAAa,OAAO,CAAC;;CAG7E,AAAO,cAAc,OAAsB;AACzC,OAAK,QAAQ,OAAO,mBAAmB,KAAK,QAAQ,EAAE,YAAY,OAAO,CAAC;;CAG5E,AAAO,WAAW,aAA2B;CAI7C,AAAO,WAAW,QAAsB;CAIxC,AAAO,kBAAwB;AAC7B,OAAK,WAAW,MAAM;AACtB,MAAI,CAAC,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,QAC9B,MAAK,YAAY;;CAIrB,AAAO,cAAc,YAA6B;AAChD,SAAO,KAAK,QAAQ,OAAO,YAAY,YAAY,KAAK,OAAO;;CAGjE,AAAO,SAAe;AACpB,OAAK,YAAY;;;;;;AChRrB,IAAa,kBAAb,cAAqC,WAAW;CAC9C,AAAO,oBAAmC;CAC1C,AAAO,oBAAmC;CAE1C,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,2BAAe,MAAM;GACnB,mBAAmBC;GACnB,mBAAmBA;GACnB,YAAYC;GACZ,SAASA;GACT,cAAcA;GACd,sBAAsBA;GACtB,cAAcC;GACd,mBAAmBD;GACnB,WAAWA;GACX,qBAAqBA;GACrB,YAAYA;GACZ,YAAYA;GACZ,YAAYE,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;;CAGJ,IAAW,aAAsB;AAC/B,SAAO,KAAK,MAAM,YAAY;;CAGhC,IAAW,UAAkB;AAC3B,MAAI,KAAK,sBAAsB,KAC7B,QAAO,KAAK;EAEd,MAAM,UAAU,KAAK,MAAM,SAAS;AACpC,MAAI,CAAC,QACH,QAAO;AAET,SAAO,IAAI,kBACT,KAAK,QAAQ,OAAO,MACpB,KAAK,QACL,QACD,CAAC,WAAW;;CAGf,IAAW,eAA+B;AACxC,SAAO,KAAK,MAAM,cAAc;;CAGlC,IAAW,uBAA+B;EACxC,MAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,OACZ,QAAO;AAET,SAAO,OAAO,MAAM;;CAGtB,IAAW,eAA8B;AACvC,MAAI,KAAK,kBACP,QAAO,KAAK;AAId,SAFe,KAAK,QAAQ,OAAO,kBAAkB,CAChC,MAAM,MAAM,EAAE,WAAW,KAAK,OAAO,EAC5C,WAAW;;CAG3B,IAAoB,WAAoB;AACtC,SAAO,KAAK,oBAAoB,QAAQ,KAAK,iBAAiB;;CAGhE,IAAoB,eAA8B;AAChD,SAAO,KAAK,mBAAmB,KAAK,gBAAgB;;CAGtD,IAAW,oBAAwC;AACjD,SAAO,KAAK,QAAQ,OAAO,qBAAqB,KAAK,OAAO;;CAG9D,IAAW,YAAqB;AAC9B,SAAO,KAAK,YAAY,QAAQ,KAAK,kBAAkB,WAAW;;CAGpE,IAAW,sBAAqC;EAC9C,MAAM,aAAa,KAAK;AACxB,MAAI,WAAW,WAAW,EACxB,QAAO;AAGT,SAAO,qBADY,WAAW,KAAK,MAAM,EAAE,UAAU,CAAC,KAAK,KAAK;;CAIlE,AAAO,WAAW,YAA0B;AAC1C,OAAK,oBAAoB,cAAc;EACvC,MAAM,SAAS,KAAK,QAAQ,OAAO,cACjC,KAAK,QACL,cAAc,OACf;AACD,MAAI,OAAO,QACT,MAAK,oBAAoB;WAChB,OAAO,MAChB,MAAK,oBAAoB,OAAO;;CAIpC,AAAO,WAAW,UAAwB;EACxC,MAAM,QAAQ,kBAAkB,UAAU,KAAK,MAAM,UAAU,CAAC;AAChE,OAAK,QAAQ,OAAO,mBAAmB,KAAK,QAAQ,MAAM;;CAG5D,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,mBAAmB,gBAAgB;;;;ACxInD,IAAa,cAAb,cAAiC,WAAW;CAC1C,AAAO;CACP,AAAO,aAA4B;CAEnC,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,OAAK,mBAAmB,OAAO,qBAAqB,CAAC;AAErD,2BAAe,MAAM;GACnB,kBAAkBC;GAClB,YAAYA,gBAAW;GACvB,aAAaC;GACb,SAASA;GACT,iBAAiBC,YAAO;GACxB,iBAAiBA,YAAO;GACxB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;AAEF,OAAK,aAAa;;CAGpB,AAAQ,cAAoB;EAC1B,MAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,aAAa,aAAa,OAAO,KAAK,SAAS,KAAK;;CAI7D,IAAoB,gBAAyB;AAC3C,SAAO,CAAC,KAAK;;CAGf,IAAW,cAAuB;AAChC,SAAO,KAAK;;CAGd,AAAO,kBAAwB;AAC7B,OAAK,mBAAmB,CAAC,KAAK;;CAGhC,IAAW,UAAyB;AAClC,SAAO,KAAK;;CAGd,AAAO,gBAAgB,QAAsB;AAC3C,MAAI,CAAC,KAAK,WACR;EAGF,MAAM,eAAe,KAAK,MAAM,OAAO;AACvC,MAAI,aAAa,QAAQ,CACvB;EAGF,MAAM,UAAU,KAAK,QAAQ,mBAAmB,QAAQ,GAAG;AAC3D,MAAI,CAAC,QACH;AAIF,MADe,KAAK,QAAQ,OAAO,YAAY,aAAa,IAAI,EAAE,QAAQ,CAExE,MAAK,aAAa,aAAa,SAAS,KAAK,SAAS,KAAK;;CAI/D,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,eAAe,YAAY;;;;ACxF3C,IAAa,mBAAb,cAAsC,WAAW;CAC/C,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,2BAAe,MAAM;GACnB,OAAOC;GACP,iBAAiBC;GACjB,eAAeC,YAAO;GACtB,kBAAkBA,YAAO;GACzB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;;CAGJ,IAAoB,QAAgB;AAClC,SAAO;;CAGT,IAAW,kBAA0B;AACnC,SAAO,KAAK,MAAM,YAAY,IAAI;;CAGpC,AAAO,cAAc,SAA8B;AACjD,OAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,WAAW,GAAG;;CAGlE,MAAa,mBAAkC;EAC7C,MAAM,UAAU,MAAM,KAAK,QAAQ,kBAAkB;AACrD,MAAI,YAAY,KACd,MAAK,cAAc,QAAQ;;CAI/B,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,oBAAoB,iBAAiB;;;;ACrDrD,IAAa,YAAb,cAA+B,WAAW;CACxC,AAAO,mBAA4B;CACnC,AAAO,eAAyB,EAAE;CAClC,AAAiB;CAEjB,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,OAAK,gBAAgB,gBAAgB,KAAK,KAAK,CAAC;AAEhD,2BAAe,MAAM;GACnB,kBAAkBC;GAClB,cAAcA,gBAAW;GACzB,aAAaC;GACb,UAAUA;GACV,iBAAiBC,YAAO;GACxB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;AAEF,MAAI,KAAK,cACP,MAAK,sBAAsB;;CAI/B,AAAQ,uBAA6B;EACnC,MAAM,iBAAiB,kBAAkB,KAAK,MAAM,KAAK,CAAC;AAC1D,MAAI,CAAC,eACH;AAMF,OAAK,eAHU,IAAI,cAAc,CACL,MAAM,eAAe,CAG9C,YAAY,CACZ,KAAK,UAAU,aAAa,OAAO,KAAK,SAAS,MAAM,OAAO,KAAK,CAAC;;CAGzE,IAAW,MAAc;AACvB,SAAO,KAAK,MAAM,KAAK;;CAGzB,IAAoB,gBAAyB;AAC3C,SAAO,KAAK;;CAGd,IAAW,cAAuB;AAChC,SAAO,KAAK;;CAGd,AAAO,kBAAwB;AAC7B,OAAK,mBAAmB,CAAC,KAAK;;CAGhC,IAAW,WAA8B;AACvC,SAAO,KAAK;;CAGd,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,aAAa,UAAU;;;;AC/DvC,MAAM,8BAA8B;AAgBpC,IAAa,iBAAb,MAA4B;CAC1B,AAAiB;CACjB,AAAQ;CAER,AAAQ;CACR,AAAQ;CACR,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ,WAAW;CACnB,AAAQ,YAAgC,mBAAmB;CAC3D,AAAQ,uBAAuB;CAC/B,AAAQ,wBAA8C;CAEtD,YAAY,YAA8B,UAA+B,EAAE,EAAE;AAC3E,OAAK,UAAU,IAAI,aAAa,WAAW;AAE3C,OAAK,WAAW,QAAQ,WAAW;AACnC,OAAK,kBAAkB,KAAK;AAC5B,OAAK,QAAQ,QAAQ,QAAQ;AAC7B,OAAK,aAAa,QAAQ,aAAa;AACvC,OAAK,YAAY,QAAQ,YAAY;AACrC,OAAK,sBAAsB,QAAQ,sBAAsB;EAEzD,MAAM,iBAAiB,QAAQ,0BAA0B;EACzD,MAAM,aACJ,QAAQ,sBAAsB;EAChC,MAAM,YAAY,KAAK,QAAQ,YAAY;AAC3C,OAAK,qBAAqB,kBAAkB,aAAa;AAEzD,OAAK,cAAc,aAAa,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,KAAK;AAEtE,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,OAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,SAAuB;AAChC,SAAO,KAAK;;CAGd,IAAW,oBAA6B;AACtC,SAAO,KAAK;;CAGd,IAAW,UAAkB;AAC3B,SAAO,KAAK;;CAGd,IAAW,iBAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,mBAA4B;AACrC,SAAO,KAAK,aAAa,KAAK;;CAGhC,IAAW,eAA8B;AACvC,MAAI,CAAC,iBAAiB,KAAK,SAAS,CAClC,QAAO;AAET,SAAO;;CAGT,AAAO,WAAW,OAAqB;AACrC,OAAK,WAAW;;CAGlB,IAAW,UAAmB;AAC5B,SAAO,KAAK;;CAGd,AAAO,WAAW,OAAsB;AACtC,OAAK,WAAW;;CAGlB,IAAW,WAA+B;AACxC,SAAO,KAAK;;CAGd,AAAO,YAAY,MAAgC;AACjD,OAAK,YAAY;;CAGnB,IAAW,sBAA+B;AACxC,SAAO,KAAK;;CAGd,AAAO,oBAA0B;AAC/B,OAAK,uBAAuB;;CAG9B,AAAO,qBAA2B;AAChC,OAAK,uBAAuB;;CAG9B,IAAW,uBAA6C;AACtD,SAAO,KAAK;;CAGd,AAAO,wBAAwB,MAAkC;AAC/D,OAAK,wBAAwB;;CAG/B,IAAW,aAAqB;AAC9B,SAAO,KAAK;;CAGd,IAAW,UAAmB;AAC5B,SAAO,KAAK,QAAQ,WAAW,KAAK;;CAGtC,IAAW,UAAmB;AAC5B,SAAO,KAAK,QAAQ;;CAGtB,IAAW,oBAA6B;AACtC,SAAO,CAAC,KAAK,WAAW,CAAC,KAAK;;CAGhC,IAAW,eAAuB;AAChC,SAAO,KAAK,YAAY,CAAC;;CAG3B,IAAW,oBAA4B;AACrC,SAAO,KAAK,gBAAgB,KAAK,mBAAmB,IAAI;;CAG1D,IAAW,mBAA+C;AACxD,SAAO,KAAK,QAAQ;;CAGtB,IAAW,gBAA0C;EACnD,MAAM,eAAe,KAAK,QAAQ,kBAAkB;EACpD,MAAM,cAAc,KAAK,0BAA0B,KAAK,YAAY;AACpE,SAAO,CAAC,GAAG,cAAc,GAAG,YAAY;;CAG1C,AAAQ,0BAA0B,QAA0C;EAC1E,MAAM,SAAmC,EAAE;AAE3C,MAAI,kBAAkB,mBAAmB,OAAO,kBAC9C,QAAO,KAAK;GACV,QAAQ,OAAO;GACf,WAAW,OAAO,QAAQ;GAC1B,SAAS,OAAO;GACjB,CAAC;AAGJ,MAAI,cAAc,UAAU,MAAM,QAAQ,OAAO,SAAS,CACxD,MAAK,MAAM,SAAS,OAAO,SACzB,QAAO,KAAK,GAAG,KAAK,0BAA0B,MAAM,CAAC;AAIzD,MAAI,aAAa,UAAU,OAAO,QAChC,QAAO,KAAK,GAAG,KAAK,0BAA0B,OAAO,QAAQ,CAAC;AAGhE,SAAO;;CAGT,IAAW,YAAqB;AAC9B,SACE,KAAK,iBAAiB,SAAS,KAC/B,KAAK,cAAc,SAAS,KAC5B,KAAK,iBAAiB;;CAI1B,AAAO,cAAoB;AACzB,OAAK,QAAQ,aAAa;AAC1B,OAAK,kBAAkB,KAAK;;CAG9B,AAAO,SAAe;AACpB,OAAK,QAAQ,QAAQ;AACrB,OAAK,WAAW,KAAK;AACrB,OAAK,cAAc,aAAa,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,KAAK;;CAGxE,AAAO,eAAe,QAAsB;EAC1C,MAAM,cAAc,KAAK,QAAQ,MAAM;AACvC,MAAI,YAAY,QAAQ,CACtB;AAGF,MAAI,WAAW,cAAc,SAAS,CAAC,YAAY,SAAS,EAAE;GAC5D,MAAM,SAAS,KAAK,QAAQ,iBAAiB;AAC7C,OAAI,OAEF,MAAK,cAAc,aADD,KAAK,QAAQ,SAAS,OAAO,UAAU,EACd,MAAM,MAAM,KAAK;AAE9D;;EAGF,MAAM,UAAU,KAAK,mBAAmB,QAAQ,YAAY,MAAM,CAAC;AACnE,MAAI,SAEF;OADe,KAAK,QAAQ,gBAAgB,QAAQ,CAElD,MAAK,cAAc,aAAa,SAAS,MAAM,MAAM,KAAK;;;CAKhE,MAAa,mBAA2C;AACtD,MAAI,CAAC,KAAK,oBACR,QAAO;AAET,SAAO,KAAK,qBAAqB;;CAGnC,MAAa,UAAyB;AACpC,MAAI,CAAC,KAAK,WACR;AAEF,OAAK,WAAW;AAChB,MAAI;AAEF,OADgB,MAAM,KAAK,YAAY,EAC1B;AACX,SAAK,aAAa;AAClB,SAAK,oBAAoB;;YAEnB;AACR,QAAK,WAAW;;;CAIpB,AAAO,SAAe;AACpB,OAAK,aAAa;;CAGpB,AAAO,aAA4B;AACjC,SAAO,KAAK,QAAQ,YAAY;;CAGlC,AAAO,iBAA8B;AACnC,SAAO,KAAK,QAAQ,YAAY,CAAC,KAAK,MAAM,EAAE,MAAM;;CAGtD,AAAO,iBAAmC;AACxC,SAAO,KAAK,QAAQ,gBAAgB;;CAGtC,AAAO,iBAA0B;AAC/B,SAAO,0BAA0B,KAAK,gBAAgB,CAAC;;CAGzD,AAAO,mBAAmB,QAAgB,MAAiC;AACzE,SAAO,mBAAmB,QAAQ,KAAK;;CAGzC,AAAO,UAAgB;;;;;ACnSzB,IAAa,eAAb,MAAa,qBAAqB,WAAW;CAC3C,AAAO;CACP,AAAO,eAAyB,EAAE;CAElC,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,OAAK,mBAAmB,OAAO,qBAAqB,CAAC;AAErD,2BAAe,MAAM;GACnB,kBAAkBC;GAClB,cAAcA,gBAAW;GACzB,aAAaC;GACb,UAAUA;GACV,eAAeA;GACf,iBAAiBC,YAAO;GACxB,aAAaA,YAAO;GACpB,gBAAgBA,YAAO;GACvB,iBAAiBA,YAAO;GACxB,cAAcA,YAAO;GACrB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;AAEF,OAAK,cAAc;;CAGrB,AAAQ,eAAqB;AAC3B,OAAK,eAAe,KAAK,MACtB,YAAY,CACZ,KAAK,UAAU,aAAa,OAAO,KAAK,SAAS,KAAK,CAAC;;CAG5D,IAAoB,gBAAyB;AAC3C,SAAO,CAAC,KAAK;;CAGf,IAAW,cAAuB;AAChC,SAAO,KAAK;;CAGd,AAAO,kBAAwB;AAC7B,OAAK,mBAAmB,CAAC,KAAK;;CAGhC,IAAW,WAA8B;AACvC,SAAO,KAAK;;CAGd,IAAW,gBAAyB;AAClC,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAoB,oBAA6B;AAC/C,SAAO;;CAGT,AAAO,YAAY,MAAoB;EACrC,MAAM,UAAU,KAAK,QAAQ,OAAO,SAAS,KAAK,QAAQ,KAAK;AAC/D,MAAI,CAAC,QAAQ,QAAQ,EAAE;GACrB,MAAM,UAAU,aAAa,SAAS,KAAK,SAAS,KAAK;AACzD,QAAK,aAAa,KAAK,QAAQ;;;CAInC,AAAO,eAAe,SAAuB;AAE3C,MADgB,KAAK,QAAQ,OAAO,WAAW,QAAQ,OAAO,EACjD;GACX,MAAM,QAAQ,KAAK,aAAa,QAAQ,QAAQ;AAChD,OAAI,SAAS,EACX,MAAK,aAAa,OAAO,OAAO,EAAE;;;CAKxC,AAAO,gBAAgB,SAAiB,QAAsB;EAC5D,MAAM,cAAc,QAAQ;AAC5B,MAAI,YAAY,QAAQ,CACtB;AAGF,MAAI,WAAW,cAAc,SAAS,CAAC,YAAY,SAAS,EAAE;GAC5D,MAAM,SAAS,KAAK,QAAQ,OAAO,YAAY,QAAQ,OAAO;AAC9D,OAAI,QAAQ;IAEV,MAAM,QAAQ,aADI,KAAK,QAAQ,OAAO,SAAS,OAAO,UAAU,EAC1B,KAAK,SAAS,KAAK;AACzD,SAAK,kBAAkB,SAAS,MAAM;;AAExC;;EAGF,MAAM,UAAU,KAAK,QAAQ,mBAAmB,QAAQ,YAAY,MAAM,CAAC;AAC3E,MAAI,SAEF;OADe,KAAK,QAAQ,OAAO,YAAY,QAAQ,QAAQ,QAAQ,EAC3D;IACV,MAAM,QAAQ,aAAa,SAAS,KAAK,SAAS,KAAK;AACvD,SAAK,kBAAkB,SAAS,MAAM;;;;CAK5C,AAAQ,kBAAkB,OAAe,OAAqB;EAC5D,MAAM,QAAQ,KAAK,aAAa,QAAQ,MAAM;AAC9C,MAAI,SAAS,EACX,MAAK,aAAa,SAAS;;CAI/B,AAAO,aAAa,YAA0B;AAE5C,MADiB,KAAK,QAAQ,OAAO,SAAS,WAAW,CAC5C,QAAQ,CACnB;AAGF,OAAK,QAAQ,OAAO,SAAS,YAAY,KAAK,OAAO;EAErD,MAAM,YAAY,KAAK,QAAQ,OAAO,SAAS,WAAW;AAC1D,MAAI,CAAC,UAAU,QAAQ,EAAE;GACvB,MAAM,SAAS,KAAK,QAAQ;AAC5B,OAAI,kBAAkB,aACpB,QAAO,yBAAyB,WAAW;GAE7C,MAAM,UAAU,aAAa,WAAW,KAAK,SAAS,KAAK;AAC3D,QAAK,aAAa,KAAK,QAAQ;;;CAInC,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;CAI9C,AAAO,yBAAyB,QAAyB;EACvD,MAAM,QAAQ,KAAK,aAAa,WAAW,OAAO,GAAG,WAAW,OAAO;AACvE,MAAI,SAAS,GAAG;AACd,QAAK,aAAa,OAAO,OAAO,EAAE;AAClC,UAAO;;AAET,OAAK,MAAM,SAAS,KAAK,aACvB,KAAI,iBAAiB,cAEnB;OADc,MAAM,yBAAyB,OAAO,CAElD,QAAO;;AAIb,SAAO;;;AAIX,gBAAgB,gBAAgB,aAAa;;;;AC3J7C,MAAa,6CACV,EACC,WACA,eACA,aACA,kBACA,OACA,kBACA,eACI;CACJ,MAAM,kBAAkB,eAAe,UAAU;CACjD,MAAM,sBAAsB,mBAAmB,UAAU;AAgBzD,QACE,4CAACC;EACC,eAAc;EACd,WAAU;EACV,OAAM;EACN,QAlBF,iBAAiB,CAAC,cACd;IACG,MAAM,oBAAoB,EAAE,YAAY,UAAU;IAClD,MAAM,wBAAwB,EAAE,YAAY,WAAW;GACzD,GACD,EAAE;aAeJ,4CAACA;GACC,KAAI;GACJ,YAAW;GACX,QAAO;GACP,IAAG;GACH,IAAG;GACH,UAAS;GACT,KApBmB,mBACrB,GACG,YAAY,qBAAqB,EAAE,SAAS,GAAG,EACjD,GACD,EAAE;;IAkBA,2CAACC;KAAI,UAAS;KAAW,IAAG;KAAQ,QAAO;KAAO,OAAM;MAAS;IACjE,2CAACA;KACC,WAAW;KACX,OAAM;KACN,YAAY,cAAc,WAAW;eAErC,2CAACC,oCAAmB;MAChB;IACL,iBACC,2CAACC;KACC,WAAW;KACX,YAAY,cAAc,YAAY;KACtC,QAAQ,EAAE,iBAAiB,eAAe;KAC1C,IAAG;KACH,UAAS;KACT,MAAK;KACL,OAAM;KACN,SAAQ;KACR,SAAS;KACT,OAAM;KACN,QAAO;eAEP,2CAACF;MAAI,QAAQ,cAAc,MAAM;gBAC/B,2CAACG,yCAAwB;OACrB;MACK;IAEd;;IACI,EACN,YAAY,CAAC,eACZ,2CAACJ;GACC,IAAG;GACH,IAAG;GACH,iBAAiB;GACjB,iBAAgB;GAChB,iBAAgB;GAChB,QAAQ,EAAE,iBAAiB,kBAAkB;GAE5C;IACI;GAEJ;EAGZ;;;;AC3FD,MAAM,WAA6B,EACjC,OACA,SACA,UACA,uBACI;AACJ,QACE,4CAACK,2BAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,2BAAK,0BACJ,2CAACC;GAAI,MAAK;aAAK;IAAY,EAC3B,2CAACC,kCAAiB,IACD,EACnB,2CAACC,qCACC,2CAACH,2BAAK,wBACJ,2CAACA,2BAAK,qBACH,QAAQ,KAAK,WACZ,4CAACI,6BACC,2CAACJ,2BAAK;GACJ,OAAO,OAAO;GACd,eAAa,GAAG,iBAAiB,GAAG,OAAO;GAC3C,eAAe,SAAS,OAAO,GAAG;aAEjC,OAAO;IACE,EACX,OAAO,SAAS,aAAa,OAAO,mBACnC,2CAACA,2BAAK,cAAY,KATP,OAAO,GAWX,CACX,GACW,GACC,GACX;GACC;;AAYhB,MAAa,YAA+B,EAC1C,YACA,UACA,YACA,MACA,mBACI;CACJ,MAAM,oBAAoB,YAA+B;AACvD,iBAAe,QAAQ,KAAK;;AAG9B,QACE,4CAACA,2BAAK;EAAW;EAAM,cAAc;aACnC,2CAACA,2BAAK;GAAQ;aAAS;IAA0B,EACjD,2CAACG,qCACC,2CAACH,2BAAK,wBACJ,2CAACA,2BAAK,qBACH,eAAe,KAAK,UACnB,4CAACI,6BACE,MAAM,QAAQ,KAAK,WAClB,OAAO,SAAS,YACd,2CAAC;GAEC,OAAO,OAAO;GACd,SAAS,OAAO;GACN;GACV,kBAAkB,GAAG,WAAW;KAJ3B,OAAO,GAKZ,GAEF,2CAACJ,2BAAK;GAEJ,OAAO,OAAO;GACd,eAAa,GAAG,WAAW,aAAa,OAAO;GAC/C,eAAe,SAAS,OAAO,GAAG;aAEjC,OAAO;KALH,OAAO,GAMF,CAEf,EACA,MAAM,mBAAmB,2CAACA,2BAAK,cAAY,KArB/B,MAAM,GAsBV,CACX,GACW,GACC,GACX;GACC;;;;;ACtFhB,MAAM,eAAe,SAAqD;CACxE,MAAM,YAAY,KAAK;AACvB,KAAI,aAAa,OAAO,cAAc,YAAY,YAAY,UAC5D,QAAO;AAET,QAAO;;AAQT,MAAa,kBAAkB,EAC7B,WACA,aAC2B;CAC3B,MAAM,mCAA+C,KAAK;CAC1D,MAAM,CAAC,QAAQ,iCAAsB,MAAM;CAC3C,MAAM,CAAC,gBAAgB,yCAA8B,MAAM;CAC3D,MAAM,CAAC,eAAe,wCAA6B,MAAM;CAEzD,MAAM,cAAc,UAAU;CAC9B,MAAM,eAAe,UAAU;AAE/B,4BAAgB;AACd,MAAI,CAAC,eAAe,CAAC,eAAe,QAClC;EAGF,MAAM,iEAA+B;GACnC,SAAS,eAAe;GACxB,uBAAwC,EAAE,WAAW;GACtD,CAAC;AAEF,eAAa,SAAS;IACrB,CAAC,WAAW,YAAY,CAAC;AAE5B,4BAAgB;AACd,MAAI,CAAC,gBAAgB,CAAC,eAAe,QACnC;EAGF,MAAM,6EAA2C;GAC/C,SAAS,eAAe;GACxB,SAAS,MAAkD;IACzD,MAAM,oBAAoB,YAAY,EAAE,OAAO,KAAK;AAEpD,QACE,qBACA,UAAU,cAAc,kBAAkB,OAAO,EAEjD;SAAI,OACF,QAAO,kBAAkB,OAAO;cACvB,kBAAkB,UAC3B,CAAC,UAA2B,aAAa,kBAAkB,OAAO;;AAItE,qBAAiB,MAAM;AACvB,cAAU,MAAM;;GAElB,cAAc,MAAuD;IACnE,MAAM,oBAAoB,YAAY,EAAE,OAAO,KAAK;AACpD,QAAI,kBACF,kBAAiB,UAAU,cAAc,kBAAkB,OAAO,CAAC;;GAGvE,mBAAmB,iBAAiB,MAAM;GAC3C,CAAC;AAEF,eAAa,SAAS;IACrB;EAAC;EAAW;EAAc;EAAO,CAAC;AAErC,4BAAgB;AACd,yEAA0B;GACxB,cAAc,MAA+B;IAC3C,MAAM,oBAAoB,YAAY,EAAE,OAAO,KAAK;AAEpD,QAAI,CAAC,kBACH;AAGF,QAAI,aAGF,KAFkB,UAAU,cAAc,kBAAkB,OAAO,CAGjE,WAAU,KAAK;QAEf,mBAAkB,KAAK;QAGzB,mBAAkB,KAAK;;GAG3B,cAAc;AACZ,cAAU,MAAM;AAChB,sBAAkB,MAAM;;GAE3B,CAAC;IACD,CAAC,WAAW,aAAa,CAAC;AAE7B,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;ACrGH,MAAa,6CACV,EAAE,WAAW,YAAY,kBAAkB,cAAc,mBAAmB;CAC3E,MAAM,mBAAmB,UAAU;CACnC,MAAM,aACJ,oBAAoB,mBAAmB,mBAAmB;CAC5D,MAAM,UAAU,QAAQ,UAAU,KAAK;CACvC,MAAM,kBAAkB,WAAW,UAAU;CAE7C,MAAM,EACJ,gBACA,aACA,QACA,eACA,mBACE,eAAe,EAAE,WAAW,CAAC;AAEjC,QACE,4CAACK;EAAK,KAAI;EAAS,OAAM;EAAO,gBAAe;EAAa,SAAS;aACnE,4CAACA;GACC,eAAa,SAAS,GAAG,WAAW,SAAS;GAC7C,KAAK;GACL,MAAM,UAAU,IAAI;GACpB,UAAS;GACT,YAAW;GACX,aAAa;GACb,aAAY;GACZ,aAAa,SAAS,aAAa;GACnC,iBAAiB,gBAAgB,aAAa;GAC9C,OAAO,iBAAiB,aAAa;;IAEpC,eACC,2CAAC;KACC,SAAQ;KACR,aAAa,EAAE,WAAW,QAAQ;eAElC,2CAACA;MACC,eAAa,GAAG,WAAW;MAC3B,WAAW;MACX,UAAS;MACT,MAAK;MACL,SAAS,mBAAmB,IAAI;MAChC,QAAO;MACP,QAAQ,EAAE,iBAAiB,WAAW;MACtC,QAAO;MACP,YAAW;MACX,gBAAe;MACf,cAAa;MACb,YAAW;gBAEX,2CAACC;OAAK,MAAK;OAAK,OAAM;iBACpB,2CAACC,yCAAwB;QACpB;OACF;MACC;IAEX,UAAU,aACT,2CAACC;KAAK,OAAM;KAAW,eAAa;eACjC,UAAU;MACN,GAEP,2CAAC;KACa;KACZ,WAAW,CAAC,UAAU;KACtB,WAAW,UAAU;KACrB,aACE,UAAU,SACN,gCACA;KAEN,QAAQ,UAAU;KAClB,eAAe,UAAU,WAAW,KAAK;KACzC,UAAU,UAAU;MACpB;IAEH,WAAW,UAAU,YACpB,2CAAC;KACC,SAAS,UAAU,gBAAgB;KACnC,aAAa,EAAE,WAAW,OAAO;KACjC,cAAc,EAAE,UAAU,SAAS;eAEnC,2CAACC;MACC,OAAM;MACN,QAAO;MACP,SAAQ;MACR,YAAW;MACX,IAAG;gBAEH,2CAACC,mCAAkB;OACf;MACE;;IAEP,EACN,mBACC,4CAACL;GAAK,KAAI;GAAS,YAAW;;IAC3B,UAAU,gBACT,2CAAC;KAAQ,SAAQ;KAAa,aAAa,EAAE,WAAW,OAAO;eAC7D,2CAACI;MACC,OAAM;MACN,QAAO;MACP,SAAQ;MACR,YAAW;gBAEX,2CAACE,6BAAY;OACT;MACE;IAEX,UAAU,cACT,2CAAC;KACC,SAAS,YAAY,UAAU;KAC/B,aAAa,EAAE,WAAW,OAAO;eAEjC,2CAACF;MACC,OAAM;MACN,QAAO;MACP,SAAQ;MACR,YAAW;gBAEX,2CAACG,8BAAa;OACV;MACE;IAEZ,2CAACH;KAAI,WAAW;KAAY,SAAS,mBAAmB,IAAI;eAC1D,4CAACJ;MAAK,KAAI;MAAS,YAAW;iBAC3B,UAAU,mBACT,2CAAC;OACa;OACZ,UAAU;OACV,MAAM,UAAU;OAChB,cAAc,UAAU;OACxB,YACE,2CAACG;QACC,eAAa,GAAG,WAAW;QAC3B,OAAM;QACN,gBAAe;QACf,QAAO;kBAEN,UAAU;SACN;QAET,GAEF,2CAACA;OACC,eAAa,GAAG,WAAW;OAC3B,OAAM;iBAEL,UAAU;QACN,EAER;OACI;MACH;;IACD;GAEJ;EAGZ;;;;ACxKD,MAAa,gDACV,EAAE,gBAAgB;AACjB,KAAI,CAAC,UAAU,eACb,QAAO;AAGT,QACE,2CAACK;EAAK,KAAI;EAAM,YAAW;EAAS,OAAM;YACxC,2CAAC;GACC,SAAS,UAAU;GACnB,aAAa,EAAE,WAAW,OAAO;aAEjC,2CAACC;IAAI,QAAO;cACV,2CAACC,2BAAU;KACP;IACE;GACL;EAGZ;;;;;;;;;;;;;;;;;;;;;;;;ACRD,SAAgB,2BACd,YACA;AACA,gCACG,MAAsC;EACrC,MAAM,SAAU,EACb,QAAQ,eAAe;AAE1B,MAAI,kBAAkB,SAKpB;OAHE,OAAO,QAAQ,+CAA2C,IAC1D,CAAC,WAAW,SAAS,SAAS,OAAO,CAGrC,GAAE,gBAAgB;;IAIxB,CAAC,WAAW,CACb;;;;;AC9BH,MAAa,oDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,CAAC,YAAY,qCAA0B,UAAU,YAAY;CAEnE,MAAM,mBAAmB;AACvB,YAAU,eAAe,WAAW;;CAGtC,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,4CAACC,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,2BAAU;GACX,2CAACC;IAAI,MAAK;cAAI;KAAiB;GAC9B,UAAU,kBACT,2CAACA;IACC,OAAM;IACN,UAAS;IACT,MAAK;IACL,UAAS;IACT,cAAa;IACb,YAAW;cAEV,UAAU;KACP;GAER,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;aACvB,2CAACK;IACC,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT,MAAM;IACN;IACA,eAAa,GAAG,WAAW;KAC3B;IACW,GACC,GACX;GACC;EAGjB;;;;ACrDD,MAAa,gDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,CAAC,YAAY,qCAA0B,UAAU,QAAQ;CAE/D,MAAM,mBAAmB;AACvB,YAAU,WAAW,WAAW;;CAGlC,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,4CAACC,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,8BAAa;GACd,2CAACC;IAAI,MAAK;cAAI;KAAa;GAC1B,UAAU,cACT,2CAACA;IACC,OAAM;IACN,UAAS;IACT,MAAK;IACL,UAAS;IACT,cAAa;IACb,YAAW;cAEV,UAAU;KACP;GAER,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,4CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;cACvB,2CAACK;IACC,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT;IACA,eAAa,GAAG,WAAW;KAC3B,EACD,cACC,2CAACH;IAAI,UAAS;IAAK,OAAM;IAAW,IAAG;cAAI;KAErC;IAEK,GACC,GACX;GACC;EAGjB;;;;ACzDD,MAAa,qDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,CAAC,YAAY,qCACjB,UAAU,qBACX;CAED,MAAM,mBAAmB;AACvB,YAAU,WAAW,WAAW;;CAGlC,MAAM,uBAAuB,YAAqB;AAChD,YAAU,WAAW,UAAU,SAAS,QAAQ;;CAGlD,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,4CAACI,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,4BAAW;GACZ,2CAACC;IAAI,MAAK;cAAI;KAAmB;GAChC,UAAU,wBACT,2CAACA;IACC,OAAM;IACN,UAAS;IACT,MAAK;IACL,UAAS;IACT,cAAa;IACb,YAAW;cAEV,UAAU;KACP;GAER,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;aACtB,UAAU,YACT,4CAACA,sBAAK;IACJ,OAAM;IACN,SAAS,UAAU,iBAAiB;IACpC,uBACE,oBAAoB,UAAU,iBAAiB,KAAK;IAEtD,eAAa,GAAG,WAAW;eAC5B,QAEC,2CAACA,sBAAK,kBAAgB;KACJ,GAEpB,2CAACK;IACC,MAAK;IACL,MAAM,UAAU,WAAW,WAAW;IACtC,aAAa,UAAU,WAAW,MAAM;IACxC,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT;IACA,eAAa,GAAG,WAAW;KAC3B;IAES,GACC,GACX;GACC;EAGjB;;;;AC3ED,MAAa,yBAAyD,EACpE,wBACI;AACJ,KAAI,kBAAkB,WAAW,EAC/B,QAAO;AAGT,QACE,4CAACC,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,wBAAI,GAAE,SAAS;GAChB,2CAACA;IAAI,MAAK;cAAI;KAAsB;GACpC,2CAACA;IACC,OAAM;IACN,UAAS;IACT,IAAG;IACH,IAAG;IACH,cAAa;cAEZ,kBAAkB;KACf;GACN,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACH,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;aACtB,kBAAkB,KAAK,QACtB,4CAACC;IAEC,IAAG;IACH,mBAAmB;IACnB,aAAY;IACZ,OAAO,EAAE,mBAAmB,GAAG;eAE/B,2CAACA;KAAI,UAAS;KAAK,YAAW;eAC3B,IAAI;MACD,EACN,2CAACA;KAAI,UAAS;KAAK,OAAM;KAAW,YAAW;eAC5C,IAAI;MACD;MAXD,IAAI,cAYL,CACN;IACW,GACC,GACX;GACC;;;;;ACjChB,MAAa,iDACV,EACC,WACA,YACA,aAAa,MACb,cAAc,OACd,cAAc,OACd,eACI;CACJ,MAAM,+BAAoC,KAAK;CAC/C,MAAM,wBAAwB,2BAA2B,WAAW;CAEpE,MAAM,oBAAoB,YAA+B;AACvD,YAAU,gBAAgB,QAAQ,KAAK;;AAGzC,QACE,4CAACG,sBAAK;EACJ,MAAM,UAAU;EAChB,cAAc;EACd,aAAa,EAAE,WAAW,gBAAgB;EAC1C,mBAAmB;aAEnB,2CAACA,sBAAK;GAAQ;aACZ,2CAAC;IACC,QAAO;IACP,OAAM;IACN,QAAQ,EAAE,OAAO,YAAY;IACjB;KACZ;IACW,EACf,2CAACC,qCACC,2CAACD,sBAAK,wBACJ,4CAACA,sBAAK;GAAQ,KAAK;GAAY,MAAK;;IAClC,2CAAC;KACY;KACC;MACZ;IAED,eACC,2CAAC;KAA0B;KAAuB;MAAc;IAGjE,eACC,2CAAC;KACY;KACC;MACZ;IAGJ,2CAACA,sBAAK,cAAY;IAElB,4CAACA,sBAAK;KACJ,OAAM;KACN,eAAe,UAAU,cAAc,CAAC,UAAU,aAAa;KAC/D,eAAa,GAAG,WAAW;gBAE3B,2CAACE,wBAAI,GAAE,SAAS,EACf,UAAU,eACP,sBACA;MACM;IAEZ,2CAAC,yBACC,mBAAmB,UAAU,oBAC7B;IAED,cACC,qFACE,2CAACF,sBAAK,cAAY,EAClB,4CAACA,sBAAK;KACJ,OAAM;KACN,OAAO,UAAU,YAAY,aAAa;KAC1C,UAAU,CAAC,UAAU;KACrB,SAAS,UAAU,YAAY,WAAW;KAC1C,OAAO,UAAU,uBAAuB;KACxC,eAAa,GAAG,WAAW;KAC3B,QACE,UAAU,YACN;MAAE,IAAI;MAAY,OAAO;MAAY,GACrC;gBAGN,2CAACG,2BAAU,EACX,2CAACD;MAAI,MAAK;gBAAI;OAAkB;MACtB,IACX;;IAEQ,GACC,GACX;GACC;EAGjB;;;;ACtGD,MAAa,kDACV,EAAE,WAAW,YAAY,aAAa,MAAM,eAAe;AAC1D,QACE,qFACE,2CAAC,kBAA0B,YAAa,EACvC,UAAU,YACT,2CAAC;EACY;EACX,YAAY,GAAG,WAAW;EACd;EACF;GACV,IAEH;EAGR;;;;ACRD,MAAa,qDACV,EAAE,WAAW,YAAY,aAAa;CACrC,MAAM,mBAAmB,gBAAgB,UAAU;AAEnD,QACE,2CAAC;EACY;EACX,eAAe,UAAU;EACzB,aAAa,UAAU;EACvB,kBAAkB,UAAU;EACV;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACxB,cACE,2CAAC;IACY;IACC;IACZ,YAAY,CAAC,UAAU;IACvB,UAAU,UAAU;KACpB;IAEJ;YAGJ,4CAACE;GAAK,eAAc;GAAS,OAAM;cAChC,UAAU,SAAS,KAAK,SAAS,UAChC,2CAAC;IAEC,WAAW;IACX,YAAY,GAAG,WAAW,GAAG;MAFxB,QAAQ,OAGb,CACF,EACD;IACI;GACK;EAGnB;;;;AClDD,MAAa,gDACV,EAAE,WAAW,iBAAiB;AAC7B,QACE,2CAAC;EACY;EACC;EACZ,QACE,UAAU,iBACR,2CAACC;GAAI,IAAG;aACN,2CAAC;IACC,YAAY,GAAG,WAAW;IAC1B,OAAM;IACN,eAAe,UAAU,YAAY,GAAG;KACxC;IACE;GAGV;EAGP;;;;ACTD,MAAa,+CACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,mBAAmB,gBAAgB,UAAU;AAEnD,QACE,2CAAC;EACY;EACX,eAAe,UAAU;EACzB,aAAa,UAAU;EACvB,kBAAkB,UAAU;EACV;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACxB,cACE,2CAAC;IACY;IACC;IACZ,UAAU,UAAU;KACpB;IAEJ;YAGH,UAAU,WACT,2CAACC;GAAK,eAAc;GAAS,OAAM;aACjC,2CAAC;IAA0B;IAAuB;KAAc;IAC3D;GAEG;EAGnB;AAOD,MAAM,gDACH,EAAE,WAAW,iBAAiB;CAC7B,MAAM,UAAU,UAAU;AAC1B,KAAI,CAAC,QACH,QAAO;CAGT,MAAM,mBAAmB,gBAAgB,QAAQ;CACjD,MAAM,mBAAmB,QAAQ;AAEjC,QACE,2CAAC;EACC,WAAW;EACX,eAAe;EACf,aAAa;EACK;EAClB,OACE,2CAAC;GACY;GACC;GACM;GACA;IAClB;YAGJ,2CAAC;GAA4B;GAAS,YAAY,GAAG,WAAW;IAAO;GAC3D;EAGnB;AAcD,MAAM,oDACH,EAAE,SAAS,iBAAiB;AAC3B,KAAI,mBAAmB,aACrB,QACE,4CAACA;EAAK,eAAc;EAAS,OAAM;aAChC,QAAQ,SAAS,KAAK,SAAS,UAC9B,2CAAC;GAEC,WAAW;GACX,YAAY,GAAG,WAAW,GAAG;KAFxB,QAAQ,OAGb,CACF,EACD,QAAQ,iBACP,2CAACC;GAAI,IAAG;aACN,2CAAC;IACC,YAAY,GAAG,WAAW;IAC1B,OAAM;IACN,eAAe,QAAQ,YAAY,GAAG;KACtC;IACE;GAEH;AAIX,KAAI,mBAAmB,YACrB,QACE,2CAACD;EAAK,eAAc;EAAS,OAAM;YACjC,2CAAC;GAAe,WAAW;GAAqB;IAAc;GACzD;AAIX,KAAI,mBAAmB,iBACrB,QAAO,2CAACE;EAAgB,WAAW;EAAqB;GAAc;AAGxE,QAAO;EAEV;AAOD,MAAMA,mDACH,EAAE,WAAW,iBAAiB;CAC7B,MAAM,QAAQ,UAAU;AAExB,QACE,4CAACF;EAAK,KAAI;EAAM,YAAW;EAAS,QAAO;EAAO,IAAG;EAAM,IAAG;aAC5D,2CAACC;GAAI,OAAM;aACT,2CAACE,oCAAmB;IAChB,EACN,2CAACH;GACC,KAAI;GACJ,OAAM;GACN,gBAAe;GACf,SAAS;GACT,QAAQ;IACN,gBAAgB;IAChB,qBAAqB;IACtB;GACD,SAAS,UAAU;GACnB,QAAO;aAEP,2CAACI;IACC,OAAM;IACN,eAAa,GAAG,WAAW;cAE1B,SAAS;KACL;IACF;GACF;EAGZ;AAED,MAAM,iDACH,EAAE,WAAW,YAAY,kBAAkB,uBAAuB;CACjE,MAAM,UAAU,UAAU;AAC1B,KAAI,CAAC,QACH,QAAO;CAGT,MAAM,EAAE,gBAAgB,QAAQ,eAAe,mBAC7C,eAAe,EAAE,WAAW,SAAS,CAAC;AAExC,QACE,4CAACJ;EACC,KAAK;EACL,eAAa,SAAS,GAAG,WAAW,eAAe;EACnD,aAAa;EACb,aAAY;EACZ,aAAa,SAAS,aAAa;EACnC,iBAAiB,gBAAgB,aAAa;EAC9C,OAAO,iBAAiB,aAAa;EACrC,KAAI;EACJ,YAAW;aAEX,2CAAC;GACa;GACZ,UAAU,UAAU;GACpB,MAAM,QAAQ;GACd,cAAc,QAAQ;GACtB,YACE,2CAACI;IACC,eAAa,GAAG,WAAW;IAC3B,OAAM;IACN,QAAO;IACP,gBAAe;IACf,SAAS;cAER,QAAQ;KACJ;IAET,EACF,2CAACH;GACC,WAAW,mBAAmB,mBAAmB;GACjD,SAAS,mBAAmB,IAAI;aAEhC,4CAACD;IAAK,KAAI;IAAS,YAAW;eAC5B,2CAAC,kBAAe,WAAW,UAAW,EACrC,QAAQ,YACP,2CAAC;KACC,WAAW;KACX,YAAY,GAAG,WAAW;KAC1B,YAAY;MACZ;KAEC;IACH;GACD;EAGZ;;;;ACvOD,MAAa,mDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,mBAAmB,gBAAgB,UAAU;CAEnD,MAAM,eACJ,qFACE,2CAAC,kBAA0B,YAAa,EACvC,UAAU,YACT,2CAAC;EACY;EACX,YAAY,GAAG,WAAW;EAC1B;EACA;EACA;EACA,UAAU,UAAU;GACpB,IAEH;AAGL,QACE,2CAAC;EACY;EACX,eAAe;EACf,aAAa;EACK;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACV;IACd;GAEJ;EAGP;;;;ACrCD,MAAa,8CACV,EAAE,WAAW,YAAY,eAAe;CACvC,MAAM,mBAAmB,gBAAgB,UAAU;CAEnD,MAAM,eACJ,qFACE,2CAAC,kBAA0B,YAAa,EACvC,UAAU,YACT,2CAAC;EACY;EACX,YAAY,GAAG,WAAW;EAC1B;EACA,UAAU,UAAU;GACpB,IAEH;AAGL,QACE,2CAAC;EACY;EACX,eAAe;EACf,aAAa;EACK;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACV;IACd;EAGH;GACW;EAGnB;;;;ACxCD,MAAa,oDACV,EAAE,WAAW,iBAAiB;AAC7B,QACE,2CAAC;EAAwB;EAAuB;YAC9C,2CAAC;GAA2B;GAAuB;IAAc;GACpD;EAGpB;AAOD,MAAM,iDACH,EAAE,WAAW,iBAAiB;CAC7B,MAAM,QAAQ,UAAU;AAExB,QACE,4CAACK;EAAK,KAAI;EAAM,YAAW;EAAS,QAAO;EAAO,IAAG;EAAM,IAAG;aAC5D,2CAACC;GAAI,OAAM;aACT,2CAACC,oCAAmB;IAChB,EACN,2CAACF;GACC,KAAI;GACJ,OAAM;GACN,gBAAe;GACf,SAAS;GACT,QAAQ;IACN,gBAAgB;IAChB,qBAAqB;IACtB;GACD,SAAS,UAAU;GACnB,QAAO;aAEP,2CAACG;IACC,OAAM;IACN,eAAa,GAAG,WAAW;cAE1B,SAAS;KACL;IACF;GACF;EAGZ;;;;AC/CD,MAAa,6CACV,EAAE,WAAW,iBAAiB;AAC7B,KAAI,CAAC,UAAU,cACb,QAAO,2CAAC;EAAwB;EAAuB;GAAc;AAGvE,QACE,2CAAC;EAA+B;EAAuB;GAAc;EAG1E;;;;ACFD,MAAa,0CACV,EAAE,WAAW,iBAAiB;AAC7B,KAAI,qBAAqB,aACvB,QAAO,2CAAC;EAA0B;EAAuB;GAAc;AAGzE,KAAI,qBAAqB,YACvB,QAAO,2CAAC;EAAyB;EAAuB;GAAc;AAGxE,KAAI,qBAAqB,iBACvB,QACE,2CAAC;EAA8B;EAAuB;GAAc;AAIxE,KAAI,qBAAqB,UACvB,QAAO,2CAAC;EAAuB;EAAuB;GAAc;AAGtE,KAAI,qBAAqB,gBACvB,QACE,2CAAC;EAA6B;EAAuB;GAAc;AAIvE,QAAO;EAEV;;;;AC+BD,MAAM,iBAA4C;CAChD,KAAKC;CACL,QAAQC;CACR,MAAMC;CACN,SAASC;CACV;AAED,MAAM,aAAgD,EAAE,eACtD,2CAACC;CAAI,IAAG;CAAO,IAAG;CAAI,IAAG;CAAW,cAAa;CAAK,YAAW;CAC9D;EACG;AAGR,MAAM,iBAAqD,EAAE,eAAe;AAC1E,KAAI,aAAa,OACf,QAAO;AAGT,KAAI,aAAa,WACf,QACE,2CAACC;EAAM,MAAK;EAAK,cAAa;EAAS,SAAQ;YAAS;GAEhD;AAIZ,QACE,2CAACA;EAAM,MAAK;EAAK,cAAa;EAAM,SAAQ;YAAS;GAE7C;;AAIZ,MAAM,yBAA2D,EAAE,WAAW;AAC5E,QACE,4CAACC;EAAO,OAAM;EAAU,KAAK;EAAG,IAAI;aAClC,4CAACC;GAAK,OAAM;GAAS,KAAK;GAAG,UAAS;GAAK,UAAS;cACjD,KAAK,MAAM,KAAK,MAAM,cACrB,4CAACA;IAAqB,OAAM;IAAS,KAAK;eACvC,YAAY,KAAK,2CAACC;KAAK,OAAM;eAAW;MAAQ,EACjD,2CAACH;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;eAC1C,KAAK;MACA;MAJC,KAAK,KAKT,CACP,EACF,2CAAC,iBAAc,UAAU,KAAK,mBAAoB;IAC7C,EAEP,4CAACE;GAAK,OAAM;GAAS,KAAK;GAAG,UAAS;GAAK,OAAM;;IAC/C,2CAACC;KAAK,OAAM;eAAW;MAAe;IACtC,2CAACJ;KACC,IAAG;KACH,IAAI;KACJ,IAAI;KACJ,IAAG;KACH,cAAa;KACb,YAAW;eAEV,KAAK,UAAU,KAAK,QAAQ,OAAO;MAChC;IACN,2CAACK;KAAK,IAAIC;KAAc,OAAM;KAAW,YAAY;MAAK;IAC1D,2CAACN;KACC,IAAG;KACH,IAAI;KACJ,IAAI;KACJ,IAAG;KACH,cAAa;KACb,YAAW;eAEV,KAAK,UAAU,KAAK,QAAQ,MAAM;MAC/B;;IACD;GACA;;AAIb,MAAM,sBAAsB,UAA2B;AACrD,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAEvC,QAAO,KAAK,UAAU,MAAM;;AAG9B,MAAM,mBAAyD,EAAE,cAAc;CAC7E,MAAM,EAAE,OAAO,MAAM,sBAAsB;AAE3C,KAAI,kBACF,QAAO;CAGT,MAAM,iBAAiB,mBAAmB,MAAM;CAChD,MAAM,cAAc,eAAe,SAAS,KAAK;AAEjD,QACE,4CAACG;EACC,OAAO,cAAc,eAAe;EACpC,KAAK;EACL,UAAS;EACT,OAAM;EACN,IAAI;;GAEJ,2CAACC;IAAK,OAAM;cAAW;KAAe;GACtC,2CAACJ;IACC,IAAG;IACH,IAAI,cAAc,IAAI;IACtB,IAAI,cAAc,MAAM;IACxB,IAAG;IACH,cAAa;IACb,YAAW;IACX,YAAY,cAAc,QAAQ;cAEjC;KACG;GACN,4CAACI;IAAK,OAAM;;KAAW;KAAE;KAAK;;KAAQ;;GACjC;;AAIX,MAAM,sBAA6D,EACjE,cACI;CACJ,MAAM,kBAAkB,QAAQ,QAC7B,WACC,WAAW,aACX,WAAW,aACX,WAAW,iBACX,WAAW,gBACX,WAAW,gBACX,WAAW,mBACd;AAED,KAAI,gBAAgB,WAAW,EAC7B,QAAO;AAGT,QACE,2CAACD;EAAK,OAAM;EAAS,KAAK;EAAG,UAAS;EAAK,IAAI;EAAG,UAAS;YACxD,gBAAgB,KAAK,WACpB,2CAACF;GAAmB,MAAK;GAAK,cAAa;GAAO,SAAQ;aACvD;KADS,OAEJ,CACR;GACG;;AAIX,MAAM,WAA8C,EAAE,eACpD,2CAACD;CACC,IAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAG;CACH,cAAa;CACb,YAAW;CAEV;EACG;AASR,MAAM,kBAA2C,EAC/C,OACA,WACA,cAEA,4CAACG;CACC,OAAM;CACN,KAAK;CACL,UAAS;CACT,OAAM;CACN,IAAI;CACJ,UAAS;;EAET,4CAACC;GAAK,OAAM;cAAY,OAAM;IAAQ;EACtC,2CAAC,qBAAS,YAAoB;EAC9B,2CAACC;GAAK,IAAIC;GAAc,OAAM;GAAW,YAAY;IAAK;EAC1D,2CAAC,qBAAS,UAAkB;;EACvB;AAGT,MAAM,qBAAqB,UAA2B;AACpD,KAAI,UAAU,OACZ,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO,SAAS;AAElB,QAAO,KAAK,UAAU,MAAM;;AAO9B,MAAM,oBAAoB,UAAwC;AAChE,KAAI,MAAM,OAAO,UAAU,MAAM,KAC/B,QAAO,wBAAwB,MAAM,KAAK;AAE5C,QAAO;;AAGT,MAAM,wBAA0D,EAC9D,kBACI;CACJ,MAAM,EAAE,OAAO,cAAc;CAC7B,MAAM,gBAAgB,eAAe,MAAM;AAE3C,SAAQ,MAAM,IAAd;EACE,KAAK,MACH,QACE,4CAACH;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACD;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,KAAK,SACH,QACE,4CAACD;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACD;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,KAAK,QAAQ;GACX,MAAM,YAAY,iBAAiB,MAAM;AACzC,OAAI,YAAY,SACd,QACE,4CAACD;IAAK,OAAM;IAAS,KAAK;eACxB,2CAACE;KACC,IAAI;KACJ,OAAM;KACN,SAAS;KACT,YAAY;MACZ,EACF,4CAACD;KAAK,UAAS;KAAK,OAAM;;MAAW;MACrB,2CAAC,uBAAW,YAAsB;;MAAI;MACpD,2CAAC,uBAAW,YAAsB;;MAC7B;KACF;AAGX,UACE,4CAACD;IAAK,OAAM;IAAS,KAAK;;KACxB,2CAACE;MACC,IAAI;MACJ,OAAM;MACN,SAAS;MACT,YAAY;OACZ;KACF,4CAACD;MAAK,UAAS;MAAK,OAAM;;OAAW;OACvB,2CAAC,uBAAW,YAAsB;;OAAI;OAClD,2CAAC,uBAAW,YAAsB;;OAC7B;KACN,YAAY,kBACX,2CAACH;MAAM,MAAK;MAAK,cAAa;MAAS,SAAQ;gBAAS;OAEhD;;KAEL;;EAGX,KAAK,UACH,QACE,4CAACE;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACD;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,QACE,QACE,4CAACD;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAIN;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACK;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;;;AAKf,MAAM,0CAAwC,EAAE,kBAAkB;CAChE,MAAM,EACJ,OACA,iBACA,YACA,eACA,eACA,mBACA,kBACA,kBACA,2BACE;CAEJ,MAAM,8CAEF,aACI,oCACE,WAAW,UACX,WAAW,OACZ,GACD,MACN,CAAC,WAAW,CACb;CACD,MAAM,0CAA+B;AACnC,MAAI,MAAM,OAAO,SAAS,MAAM,MAC9B,QAAO,uBAAuB;GAC5B,IAAI;GACJ,MAAM,MAAM;GACZ,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;IACN,CAAC,MAAM,CAAC;AAEX,QACE,4CAACJ;EACC,cAAa;EACb,aAAY;EACZ,IAAI;EACJ,IAAI;EACJ,OAAO,EAAE,cAAc,QAAQ;EAC/B,QAAQ,EAAE,IAAI,WAAW;;GAEzB,2CAAC,wBAAkC,cAAe;GAEjD,kBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC,mBAAgB,SAAS,iBAAkB;KACxC;GAGP,sBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC,yBAAsB,MAAM,qBAAsB;KAC/C;GAGP,iBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,cAAc,YAAY;KACvD,SAAS,kBAAkB,cAAc,UAAU;MACnD;KACE;GAGP,iBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,cAAc,YAAY;KACvD,SAAS,kBAAkB,cAAc,UAAU;MACnD;KACE;GAGP,qBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,kBAAkB,gBAAgB;KAC/D,SAAS,kBAAkB,kBAAkB,cAAc;MAC3D;KACE;GAGP,oBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,iBAAiB,eAAe;KAC7D,SAAS,kBAAkB,iBAAiB,aAAa;MACzD;KACE;GAGP,oBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,iBAAiB,eAAe;KAC7D,SAAS,kBAAkB,iBAAiB,aAAa;MACzD;KACE;GAGP,0BACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBACT,uBAAuB,qBACxB;KACD,SAAS,kBACP,uBAAuB,mBACxB;MACD;KACE;GAGP,CAAC,sBAAsB,gBAAgB,SAAS,KAC/C,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC,sBAAmB,SAAS,kBAAmB;KAC5C;;GAEJ;EAER;AAEF,MAAM,oBAAuD,EAAE,aAAa;AAC1E,QACE,2CAACA;EACC,cAAa;EACb,aAAY;EACZ,IAAI;EACJ,IAAI;EACJ,OAAO,EAAE,cAAc,QAAQ;EAC/B,QAAQ,EAAE,IAAI,WAAW;YAEzB,4CAACG;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAIP;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACM;IAAK,UAAS;IAAK,OAAM;;KAAW;KAChB,2CAAC,uBAAW,OAAO,iBAA2B;;KAAI;KACrE,2CAAC,uBAAW,OAAO,iBAA2B;;KACzC;IACF;GACH;;AAUV,MAAM,aAAiC,EAAE,SAAS,MAAM,gBACtD,2CAACJ;CAAI,IAAI;CAAG,IAAI;WACd,4CAACG;EAAK,OAAM;EAAS,KAAK;aACxB,2CAACE;GAAK,IAAIE;GAAiB,OAAM;GAAW,SAAS;GAAG,YAAY;IAAK,EACzE,4CAACH;GAAK,UAAS;GAAK,OAAM;;IACvB,SAAS,aACR,2CAACH;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;KAAS,IAAI;eAAG;MAErD;IAET,SAAS,aACR,2CAACA;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;KAAS,IAAI;eAAG;MAErD;IAET,aACC,4CAACD;KAAI,IAAG;KAAO,YAAW;;MACvB;MAAU;MAAE;;MACT;IAEP;;IACI;GACF;EACH;AASR,MAAM,cAAmC,EACvC,kBACA,eACA,mBAEA,4CAACA;CACC,QAAO;CACP,aAAY;CACZ,cAAa;CACb,IAAG;CACH,UAAS;YAET,2CAACA;EACC,IAAI;EACJ,IAAI;EACJ,IAAG;EACH,cAAa;EACb,aAAY;YAEZ,2CAACI;GAAK,UAAS;GAAK,YAAW;GAAS,OAAM;aAAW;IAElD;GACH,EACN,4CAACF;EAAO,OAAM;EAAU,KAAK;EAAG,SAAQ;EAAM,aAAY;;GACvD,gBACC,2CAAC;IAA8B,SAAS;IAAc,MAAK;MAA5C,gBAAwD;GAExE,iBAAiB,KAAK,UACrB,2CAAC;IAEC,SAAS,MAAM;IACf,MAAK;MAFA,cAAc,MAAM,SAGzB,CACF;GACD,cAAc,KAAK,UAClB,2CAAC;IAEC,SAAS,MAAM;IACf,MAAK;IACL,WAAW,MAAM;MAHZ,WAAW,MAAM,aAAa,GAAG,GAAG,MAAM,UAI/C,CACF;;GACK;EACL;AAGR,MAAa,sDACV,EACC,QACA,SACA,WACA,UACA,SACA,WACA,SACA,eACA,cACA,mBAAmB,EAAE,EACrB,gBAAgB,EAAE,EAClB,MACA,uBAAuB,WACvB,8BACA,aACA,iBACI;CACJ,MAAM,aAAa,SAAS;CAC5B,MAAM,mBAAmB,QAAQ,SAAS;CAC1C,MAAM,mBAAmB,QAAQ,cAAc;CAC/C,MAAM,aAAa,oBAAoB;CACvC,MAAM,YACJ,iBAAiB,SAAS,KAC1B,cAAc,SAAS,KACvB,QAAQ,aAAa;CAGvB,MAAM,WAAW,aAFC,CAAC,YACD,cAAc,CAAC;CAEjC,MAAM,oBAAoB,QAAQ,UAAU,mBAAmB,IAAI;CACnE,MAAM,kBAAkB,aACpB,iBACA,kBAAkB,kBAAkB;AAExC,QACE,2CAACM;EACC,MAAM;EACN,eAAe,EAAE,WAAW,CAAC,QAAQ,SAAS;EAC9C,MAAK;YAEL,4CAACC,sCACC,2CAACC,2CAAiB,EAClB,2CAACC,sDACC,4CAACC;GAAc,UAAS;;IACtB,2CAACC,kDACC,2CAACC,iDACE,aACG,iBAAiB,QAAQ,KACzB,uBAAuB,QAAQ,KACvB,GACD;IAEf,2CAACC,gDACC,4CAACb;KAAO,OAAM;KAAU,KAAK;;MAC1B,aACC,2CAAC;OACmB;OACH;OACD;QACd;MAGH,CAAC,aAAa,cAAc,CAAC,cAC5B,qFACE,4CAACF;OACC,QAAO;OACP,aAAY;OACZ,cAAa;OACb,UAAS;OACT,WAAU;OACV,WAAU;kBAET,iBACC,2CAAC,oBAAiB,QAAQ,gBAAiB,EAE5C,QAAQ,KAAK,gBACZ,2CAAC,YAEc,eADR,YAAY,MAAM,KAEvB,CACF;QACE,EAEN,2CAACI;OAAK,UAAS;OAAK,OAAM;iBAAW;QAG9B,IACN;MAEJ,CAAC,aAAa,CAAC,cAAc,CAAC,cAC7B,2CAACD;OAAK,SAAQ;OAAS,OAAM;OAAS,WAAU;iBAC9C,2CAACC;QAAK,OAAM;QAAW,UAAS;kBAAK;SAE9B;QACF;MAER,CAAC,aAAa,cACb,qFACE,4CAACY,8BAAa;OACZ,MAAK;OACL,OAAO;OACP,gBAAgB,YACd,+BACE,QAAQ,MACT;kBAGH,2CAACA,8BAAa,cAAY,EAC1B,2CAACA,8BAAa,SAAM,OAAO,CAAC,WAAW,SAAS,GAAI;QAClC,EACpB,2CAAChB;OACC,QAAO;OACP,aAAY;OACZ,cAAa;OACb,UAAS;OACT,WAAU;OACV,WAAU;iBAET,yBAAyB,YACxB,2CAAC;QAAS;QAAS,MAAM,eAAe;SAAQ,GAEhD,2CAAC;QAAS;QAAS,MAAM,cAAc;SAAQ;QAE7C,IACL;;MAEE,GACE;IAEb,2CAACiB,kDACC,4CAACd;KAAK,SAAQ;KAAgB,OAAM;gBACjC,aACC,2CAACH,yBAAM,GAEP,2CAACkB;MACC,SAAQ;MACR,MAAK;MACL,SAAS;MACT,UAAU,CAAC,cAAc,CAAC;MAC1B,OAAM;gBAEN,2CAACC,+CAA8B;OACpB,EAEf,4CAAChB;MAAK,KAAK;iBACT,2CAACiB;OAAO,SAAQ;OAAU,SAAS;iBAAS;QAEnC,EACR,CAAC,aACA,2CAACA;OACC,SAAQ;OACR,SAAS;OACT,UAAU,CAAC;OACX,SAAS;iBAER;QACM;OAEN;MACF,GACM;IAEf,2CAACC,+CAAqB;;IACR,GACC,IACZ;GACE;EAGlB;;;;AC9wBD,MAAa,8CAAgD,EAAE,YAAY;CACzE,MAAM,2BAA2B;AAC/B,QAAM,mBAAmB;;CAG3B,MAAM,qBAAqB;AACzB,QAAM,QAAQ;AACd,QAAM,oBAAoB;;AAO5B,QACE,4CAACC;EACC,MAAM;EACN,eAAc;EACd,KAAI;EACJ,KATsB,EACxB,gCAAgC,EAAE,SAAS,GAAG,EAC/C;EAQG,eAAY;;GAEZ,4CAACA;IACC,gBAAe;IACf,OAAM;IACN,YAAW;IACX,eAAc;eAEd,4CAACC,mCACE,MAAM,SAAS,aACd,2CAAC;KACC,YAAW;KACX,SAAS,MAAM;MACf,GAEF,2CAAC;KACC,YAAW;KACX,SAAS,MAAM;MACf,EAEH,MAAM,SAAS,aACd,2CAACC;KACC,MAAK;KACL,SAAQ;KACR,SAAS;KACT,UAAU,MAAM,qBAAqB,CAAC,MAAM;KAC5C,SAAS,MAAM;KACf,eAAY;eAEX,MAAM,YAAY,kBAAkB;MAC9B,IAER,MAAM,WAAW,MAAM,cACtB,2CAACA;KACC,MAAK;KACL,SAAQ;KACR,SAAS;KACT,UAAU,MAAM,qBAAqB,CAAC,MAAM;KAC5C,SAAS,MAAM;KACf,eAAY;eAEX,MAAM,YACH,kBACA,kBAAkB,MAAM,kBAAkB;MACvC,IAGT,EACN,2CAACD;KAAI,WAAU;KAAsB,SAAS;eAC5C,2CAAC;MACC,oBAAoB;MACpB,MAAM,MAAM;MACZ,UAAU,MAAM;OAChB;MACE;KACD;GACN,MAAM,aAAa,mBAAmB,QACrC,2CAACA;IAAI,eAAc;cACjB,2CAAC;KAAS,WAAW,MAAM;KAAY,YAAW;MAAS;KACvD;GAEP,MAAM,aAAa,mBAAmB,QACrC,2CAAC;IACC;IACA,MAAM,MAAM,gBAAgB;KAC5B;GAGJ,2CAAC;IACC,QAAQ,MAAM;IACd,SAAS,MAAM;IACf,WAAW,MAAM;IACjB,UAAU;IACV,SAAS,MAAM,YAAY;IAC3B,WAAW,MAAM;IACjB,SAAS,MAAM;IACf,eACE,MAAM,mBACF;KACE,gBAAgB,MAAM;KACtB,gBAAgB,MAAM;KACvB,GACD;IAEN,cAAc,MAAM;IACpB,kBAAkB,MAAM;IACxB,eAAe,MAAM;IACrB,MAAM,MAAM;IACZ,sBAAsB,MAAM;IAC5B,8BAA8B,MAAM;IACpC,aAAa,MAAM,gBAAgB;IACnC,YAAY,MAAM,gBAAgB;KAClC;;GACG;EAET;;;;AC3HF,IAAI,gBAAgB;AAEpB,SAAgB,iBAAyB;AACvC,QAAO,QAAQ,EAAE;;AAOnB,IAAsB,gBAAtB,MAAyD;CACvD,AAAS;CAET,AAAS;CAET,AAAQ,UAA4B;CACpC,AAAiB;CAEjB,YAAY,IAAwB,MAAc,QAA0B;AAC1E,OAAK,KAAK,MAAM,gBAAgB;AAChC,OAAK,QAAQ;AACb,OAAK,SAAS;;CAGhB,IAAI,SAA2B;AAC7B,SAAO,KAAK;;CAGd,IAAI,OAAO,OAAyB;AAClC,OAAK,UAAU;;CAGjB,IAAI,OAAe;AACjB,SAAO,KAAK;;CAMd,WAAoC;AAClC,SAAO;;CAGT,UAAkC;AAChC,SAAO;;CAGT,cAA0C;AACxC,SAAO;;CAGT,IAAI,SAAgC;AAClC,SAAO,EAAE;;CAGX,IAAI,WAAkC;AACpC,SAAO,EAAE;;CAGX,IAAI,UAAmB;AACrB,SAAO,KAAK,OAAO,WAAW;;CAGhC,IAAI,cAAuB;AACzB,SAAO,KAAK,SAAS,SAAS;;;;;;AC9DlC,IAAsB,yBAAtB,cAGU,cAEV;CACE,AAAU;CACV,AAAU;CACV,AAAU,kBAAyC;CAEnD,YACE,IACA,MACA,QACA,OACA,cACA;AACA,QAAM,IAAI,MAAM,OAAO;EACvB,MAAM,eAAe,SAAU,OAAO,WAAiB;AACvD,OAAK,SAAS;AACd,OAAK,aAAa;;CAGpB,AAAU,iBAAuB;AAC/B,2BAGE,MAAM;GACN,QAAQE;GACR,YAAYA;GACZ,iBAAiBA;GACjB,OAAOC;GACP,WAAWA;GACX,SAASA;GACT,QAAQA;GACR,UAAUA;GACV,UAAUC;GACV,mBAAmBA;GACnB,QAAQA;GACR,QAAQA;GACT,CAAC;;CAGJ,IAAI,QAAW;AACb,SAAO,KAAK;;CAGd,IAAI,MAAM,UAAa;AACrB,MAAI,KAAK,WACP,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO;AAEtE,OAAK,SAAS;;CAGhB,IAAI,YAAe;AACjB,SAAO,KAAK;;CAGd,IAAI,UAAmB;AACrB,SAAO,KAAK,WAAW,KAAK;;CAK9B,IAAI,UAAyC;EAC3C,MAAM,WAAW,KAAK,OAAO;AAC7B,MAAI,SACF,QAAO;GAAE,YAAY,SAAS;GAAY,SAAS,SAAS;GAAS;;CAKzE,IAAI,iBAAwC;AAC1C,SAAO,KAAK;;CAGd,IAAI,aAAsB;AACxB,SAAO,KAAK,OAAO,aAAa,QAAQ,KAAK,YAAY;;CAG3D,gBAAmB;AACjB,SAAO,KAAK;;CAGd,SAAS,OAAgB,SAAwC;AAC/D,MAAI,KAAK,cAAc,CAAC,SAAS,SAC/B,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO;AAEtE,OAAK,SAAS,KAAK,YAAY,MAAM;;CAKvC,kBAAkB,SAAsC;AACtD,OAAK,kBAAkB;;CAGzB,SAAe;AACb,OAAK,aAAa,KAAK;;CAGzB,SAAe;AACb,OAAK,SAAS,KAAK;;CAGrB,AAAS,cAA0C;AACjD,SAAO;;CAGT,IAAa,SAAgC;AAC3C,SAAO,KAAK,eAAe;;CAG7B,AAAU,gBAAuC;AAC/C,SAAO,EAAE;;CAGX,IAAa,WAAkC;AAC7C,MAAI,CAAC,KAAK,gBACR,QAAO,EAAE;AAGX,SAAO,CACL;GACE,UAAU;GACV,MAAM,KAAK,gBAAgB;GAC3B,SAAS,KAAK,gBAAgB;GAC9B,MAAM,KAAK;GACX,QAAQ;IACN,YAAY,KAAK,gBAAgB;IACjC,eAAe,KAAK,gBAAgB;IACrC;GACF,CACF;;;;;;ACjHL,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;AChCF,IAAa,kBAAb,cAAqC,uBAA+B;CAClE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,GAAG;AAClC,OAAK,gBAAgB;;CAGvB,IAAI,eAAuB;AACzB,SAAQ,KAAK,OAAO,WAAsB;;CAG5C,AAAU,YAAY,OAAwB;AAC5C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,SAAO,OAAO,MAAM;;CAGtB,AAAmB,gBAAuC;EACxD,MAAM,SAAuB,EAAE;AAE/B,OAAK,iBAAiB,OAAO;AAC7B,OAAK,mBAAmB,OAAO;AAC/B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,gBAAgB,OAAO;AAC5B,OAAK,aAAa,OAAO;AAEzB,SAAO;;CAGT,AAAQ,iBAAiB,QAA4B;AACnD,MAAI,KAAK,OAAO,YAAY,KAAK,WAAW,GAC1C,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACZ,CAAC;;CAIN,AAAQ,mBAAmB,QAA4B;EACrD,MAAM,aAAa,KAAK,OAAO;AAC/B,MAAI,cAAc,KAAK,WAAW,GAChC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,gBAAgB,WAAW;GACpC,MAAM,KAAK;GACX,QAAQ,EAAE,OAAO,YAAY;GAC9B,CAAC;;CAIN,AAAQ,kBAAkB,QAA4B;EACpD,MAAM,YAAY,KAAK,OAAO;AAC9B,MACE,cAAc,UACd,KAAK,OAAO,SAAS,KACrB,KAAK,OAAO,SAAS,UAErB,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,qBAAqB;GAC9B,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAW,QAAQ,KAAK,OAAO;IAAQ;GACvD,CAAC;;CAIN,AAAQ,kBAAkB,QAA4B;EACpD,MAAM,YAAY,KAAK,OAAO;AAC9B,MAAI,cAAc,UAAa,KAAK,OAAO,SAAS,UAClD,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,qBAAqB;GAC9B,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAW,QAAQ,KAAK,OAAO;IAAQ;GACvD,CAAC;;CAIN,AAAQ,gBAAgB,QAA4B;EAClD,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,CAAC,WAAW,KAAK,OAAO,WAAW,EACrC;AAGF,MAAI;AACF,OAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,OAAO,CACxC,QAAO,KAAK;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM,KAAK;IACX,QAAQ,EAAE,SAAS;IACpB,CAAC;UAEE;AACN,UAAO,KAAK;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM,KAAK;IACX,QAAQ,EAAE,SAAS;IACpB,CAAC;;;CAIN,AAAQ,aAAa,QAA4B;EAC/C,MAAM,aAAa,KAAK,OAAO;AAC/B,MACE,cACA,WAAW,SAAS,KACpB,CAAC,WAAW,SAAS,KAAK,OAAO,CAEjC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACX,QAAQ;IAAE,SAAS;IAAY,QAAQ,KAAK;IAAQ;GACrD,CAAC;;;;;;ACvIR,IAAa,kBAAb,cAAqC,uBAA+B;CAClE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,EAAE;AACjC,OAAK,gBAAgB;;CAGvB,IAAI,eAAuB;AACzB,SAAQ,KAAK,OAAO,WAAsB;;CAG5C,AAAU,YAAY,OAAwB;AAC5C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,SAAO,OAAO,MAAM,IAAI;;CAG1B,AAAmB,gBAAuC;EACxD,MAAM,SAAuB,EAAE;EAE/B,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,YAAY,UAAa,KAAK,SAAS,QACzC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,0BAA0B;GACnC,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAS,QAAQ,KAAK;IAAQ;GAC9C,CAAC;EAGJ,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,YAAY,UAAa,KAAK,SAAS,QACzC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,yBAAyB;GAClC,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAS,QAAQ,KAAK;IAAQ;GAC9C,CAAC;EAGJ,MAAM,aAAa,KAAK,OAAO;AAC/B,MACE,cACA,WAAW,SAAS,KACpB,CAAC,WAAW,SAAS,KAAK,OAAO,CAEjC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACX,QAAQ;IAAE,SAAS;IAAY,QAAQ,KAAK;IAAQ;GACrD,CAAC;AAGJ,SAAO;;;;;;AChEX,IAAa,mBAAb,cAAsC,uBAAgC;CACpE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,MAAM;AACrC,OAAK,gBAAgB;;CAGvB,IAAI,eAAwB;AAC1B,SAAQ,KAAK,OAAO,WAAuB;;CAG7C,AAAU,YAAY,OAAyB;AAC7C,MAAI,OAAO,UAAU,UACnB,QAAO;AAET,SAAO,QAAQ,MAAM;;;;;;ACnBzB,IAAa,kBAAb,cAAqC,cAA0C;CAC7E,AAAS,OAAO,UAAU;CAE1B,AAAQ,4BAAoC,IAAI,KAAK;CACrD,AAAQ,gCAAwC,IAAI,KAAK;CAEzD,YACE,IACA,MACA,QACA,UACA;AACA,QAAM,IAAI,MAAM,OAAO;AAEvB,MAAI,SACF,MAAK,MAAM,SAAS,UAAU;AAC5B,QAAK,UAAU,IAAI,MAAM,MAAM,MAAM;AACrC,SAAM,SAAS;;AAInB,OAAK,gBAAgB,IAAI,IAAI,KAAK,UAAU;AAE5C,2BAA+D,MAAM;GACnE,WAAWC;GACX,eAAeA;GACf,OAAOC;GACP,UAAUA;GACV,SAASA;GACT,QAAQA;GACR,UAAUA;GACV,UAAUC;GACV,aAAaA;GACb,QAAQA;GACR,QAAQA;GACT,CAAC;;CAGJ,IAAI,QAAmC;AACrC,SAAO,OAAO,YAAY,KAAK,UAAU;;CAG3C,IAAI,WAAiC;AACnC,SAAO,MAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;;CAG5C,gBAAyC;EACvC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,SAAS,KAAK,UAC7B,QAAO,OAAO,KAAK,eAAe;AAEpC,SAAO;;CAGT,MAAM,MAAqC;AACzC,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAuB;AAC9B,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAuB;EAC9B,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK,KAAK;AAC9C,MAAI,SACF,UAAS,SAAS;AAEpB,OAAK,SAAS;AACd,OAAK,UAAU,IAAI,KAAK,MAAM,KAAK;;CAGrC,YAAY,MAAoB;EAC9B,MAAM,OAAO,KAAK,UAAU,IAAI,KAAK;AACrC,MAAI,MAAM;AACR,QAAK,SAAS;AACd,QAAK,UAAU,OAAO,KAAK;;;CAI/B,IAAI,UAAmB;AACrB,MAAI,KAAK,UAAU,SAAS,KAAK,cAAc,KAC7C,QAAO;AAGT,OAAK,MAAM,CAAC,KAAK,UAAU,KAAK,UAC9B,KAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAClC,QAAO;AAIX,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,KAAI,aAAa,SAAU,MAA+B,QACxD,QAAO;AAIX,SAAO;;CAGT,SAAe;AACb,OAAK,gBAAgB,IAAI,IAAI,KAAK,UAAU;AAC5C,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,KAAI,YAAY,SAAS,OAAO,MAAM,WAAW,WAC/C,CAAC,MAAiC,QAAQ;;CAKhD,SAAe;AACb,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,OAAM,SAAS;AAGjB,OAAK,YAAY,IAAI,IAAI,KAAK,cAAc;AAE5C,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,EAAE;AAC3C,SAAM,SAAS;AACf,OAAI,YAAY,SAAS,OAAO,MAAM,WAAW,WAC/C,CAAC,MAAiC,QAAQ;;;CAKhD,AAAS,WAAqC;AAC5C,SAAO;;CAGT,IAAa,SAAgC;EAC3C,MAAM,SAAuB,EAAE;AAE/B,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,QAAO,KAAK,GAAG,MAAM,OAAO;AAG9B,SAAO;;CAGT,IAAa,WAAkC;EAC7C,MAAM,WAAyB,EAAE;AAEjC,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,UAAS,KAAK,GAAG,MAAM,SAAS;AAGlC,SAAO;;;;;;AC/IX,IAAa,iBAAb,cAAoC,cAAyC;CAC3E,AAAS,OAAO,UAAU;CAE1B,AAAQ,SAAsB,EAAE;CAChC,AAAQ,aAA0B,EAAE;CACpC,AAAQ,eAAmC;CAE3C,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,OAAO;AAEvB,MAAI,MACF,MAAK,MAAM,QAAQ,OAAO;AACxB,QAAK,SAAS;AACd,QAAK,OAAO,KAAK,KAAK;;AAI1B,OAAK,aAAa,CAAC,GAAG,KAAK,OAAO;AAElC,2BAAwD,MAAM;GAC5D,QAAQC;GACR,YAAYA;GACZ,OAAOC;GACP,QAAQA;GACR,SAASA;GACT,QAAQA;GACR,UAAUA;GACV,MAAMC;GACN,UAAUA;GACV,UAAUA;GACV,MAAMA;GACN,WAAWA;GACX,OAAOA;GACP,QAAQA;GACR,QAAQA;GACR,WAAWA;GACX,eAAeA;GAChB,CAAC;;CAGJ,IAAI,QAA8B;AAChC,SAAO,KAAK;;CAGd,IAAI,SAAiB;AACnB,SAAO,KAAK,OAAO;;CAGrB,gBAA2B;AACzB,SAAO,KAAK,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC;;CAGxD,GAAG,OAAsC;AACvC,MAAI,QAAQ,EACV,QAAO,KAAK,OAAO,KAAK,OAAO,SAAS;AAE1C,SAAO,KAAK,OAAO;;CAGrB,KAAK,MAAuB;AAC1B,OAAK,SAAS;AACd,OAAK,OAAO,KAAK,KAAK;;CAGxB,SAAS,OAAe,MAAuB;AAC7C,MAAI,QAAQ,KAAK,QAAQ,KAAK,OAAO,OACnC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;AAElD,OAAK,SAAS;AACd,OAAK,OAAO,OAAO,OAAO,GAAG,KAAK;;CAGpC,SAAS,OAAqB;AAC5B,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,OACpC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;EAElD,MAAM,UAAU,KAAK,OAAO,OAAO,OAAO,EAAE,CAAC;AAC7C,MAAI,QACF,SAAQ,SAAS;;CAIrB,KAAK,WAAmB,SAAuB;AAC7C,MAAI,YAAY,KAAK,aAAa,KAAK,OAAO,OAC5C,OAAM,IAAI,MAAM,+BAA+B,YAAY;AAE7D,MAAI,UAAU,KAAK,WAAW,KAAK,OAAO,OACxC,OAAM,IAAI,MAAM,+BAA+B,UAAU;AAE3D,MAAI,cAAc,QAChB;EAGF,MAAM,CAAC,QAAQ,KAAK,OAAO,OAAO,WAAW,EAAE;AAC/C,MAAI,KACF,MAAK,OAAO,OAAO,SAAS,GAAG,KAAK;;CAIxC,UAAU,OAAe,MAAuB;AAC9C,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,OACpC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;EAElD,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,QACF,SAAQ,SAAS;AAEnB,OAAK,SAAS;AACd,OAAK,OAAO,SAAS;;CAGvB,QAAc;AACZ,OAAK,MAAM,QAAQ,KAAK,OACtB,MAAK,SAAS;AAEhB,OAAK,OAAO,SAAS;;CAGvB,eAAe,SAA4B;AACzC,OAAK,eAAe;;CAGtB,UAAU,OAAuB;EAC/B,MAAM,OAAO,KAAK,eAAe,KAAK,OAAO,QAAQ,MAAM;AAC3D,OAAK,KAAK,KAAK;;CAGjB,cAAc,OAAe,OAAuB;EAClD,MAAM,OAAO,KAAK,eAAe,OAAO,MAAM;AAC9C,OAAK,SAAS,OAAO,KAAK;;CAG5B,AAAQ,eAAe,OAAe,OAA4B;AAChE,MAAI,CAAC,KAAK,aACR,OAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,aAAa,KAAK,OAAO;AAC/B,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,kBAAkB;EAGpC,MAAM,YAAY,UAAU,SAAY,WAAW,UAAU;EAC7D,MAAM,OAAO,KAAK,aAAa,OAAO,OAAO,MAAM,EAAE,YAAY,UAAU;AAE3E,OAAK,iBAAiB,KAAK;AAE3B,SAAO;;CAGT,AAAQ,iBAAiB,MAAuB;AAC9C,MAAI,CAAC,KAAK,aACR;AAGF,MAAI,KAAK,SAAS,EAAE;AAClB,QAAK,eAAe,KAAK,aAAa;AACtC,QAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,iBAAiB,KAAK;aAEpB,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,iBAAiB,MAAM;;CAKlC,IAAI,UAAmB;AACrB,MAAI,KAAK,OAAO,WAAW,KAAK,WAAW,OACzC,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,IACtC,KAAI,KAAK,OAAO,OAAO,KAAK,WAAW,GACrC,QAAO;AAIX,OAAK,MAAM,QAAQ,KAAK,OACtB,KAAI,aAAa,QAAS,KAA8B,QACtD,QAAO;AAIX,SAAO;;CAGT,SAAe;AACb,OAAK,aAAa,CAAC,GAAG,KAAK,OAAO;AAClC,OAAK,MAAM,QAAQ,KAAK,OACtB,KAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,CAAC,KAAgC,QAAQ;;CAK/C,SAAe;AACb,OAAK,MAAM,QAAQ,KAAK,OACtB,MAAK,SAAS;AAGhB,OAAK,SAAS,CAAC,GAAG,KAAK,WAAW;AAElC,OAAK,MAAM,QAAQ,KAAK,QAAQ;AAC9B,QAAK,SAAS;AACd,OAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,CAAC,KAAgC,QAAQ;;;CAK/C,AAAS,UAAmC;AAC1C,SAAO;;CAGT,IAAa,SAAgC;EAC3C,MAAM,SAAuB,EAAE;AAE/B,OAAK,MAAM,QAAQ,KAAK,OACtB,QAAO,KAAK,GAAG,KAAK,OAAO;AAG7B,SAAO;;CAGT,IAAa,WAAkC;EAC7C,MAAM,WAAyB,EAAE;AAEjC,OAAK,MAAM,QAAQ,KAAK,OACtB,UAAS,KAAK,GAAG,KAAK,SAAS;AAGjC,SAAO;;;;;;ACrOX,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,4BAAY,IAAI,KAA4B;CAE7D,SAAS,YAAoB,SAA8B;AACzD,OAAK,UAAU,IAAI,YAAY,QAAQ;AACvC,SAAO;;CAGT,IAAI,YAA+C;AACjD,SAAO,KAAK,UAAU,IAAI,WAAW;;CAGvC,IAAI,YAA6B;AAC/B,SAAO,KAAK,UAAU,IAAI,WAAW;;;AAIzC,IAAaC,gBAAb,MAAyB;CACvB,YAAY,AAAiB,UAA+B;EAA/B;;CAE7B,OACE,MACA,QACA,OACA,IACW;EACX,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,UAAU,KAAK,SAAS,IAAI,WAAW;AAE7C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,wBAAwB,aAAa;AAGvD,SAAO,QAAQ,MAAM,QAAQ,OAAO,GAAG;;CAGzC,WAAW,QAA0B,OAA2B;AAC9D,SAAO,KAAK,OAAO,IAAI,QAAQ,MAAM;;;AAIzC,MAAM,iBAAgC,MAAM,QAAQ,OAAO,OAAO;AAChE,QAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,MAA4B;;AAG3E,MAAM,iBAAgC,MAAM,QAAQ,OAAO,OAAO;AAChE,QAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,MAA4B;;AAG3E,MAAM,kBAAiC,MAAM,QAAQ,OAAO,OAAO;AACjE,QAAO,IAAI,iBAAiB,IAAI,MAAM,QAAQ,MAA6B;;AAG7E,SAAS,oBAAoB,aAAyC;AACpE,SAAQ,MAAM,QAAQ,OAAO,OAAO;EAClC,MAAM,WAAY,SAAS,EAAE;EAC7B,MAAM,WAAwB,EAAE;EAEhC,MAAM,aAAa,OAAO,cAAc,EAAE;AAC1C,OAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAAQ,WAAW,EAAE;GAC/D,MAAM,YAAY,SAAS;GAC3B,MAAM,YAAY,YAAY,OAAO,UAAU,YAAY,UAAU;AACrE,YAAS,KAAK,UAAU;;AAG1B,SAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,SAAS;;;AAI1D,SAAS,mBAAmB,aAAyC;AACnE,SAAQ,MAAM,QAAQ,OAAO,OAAO;EAClC,MAAM,WAAY,SAAS,EAAE;EAC7B,MAAM,aAAa,OAAO,SAAS,EAAE,MAAM,UAAU;EACrD,MAAM,QAAqB,EAAE;AAE7B,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,YAAY,SAAS;GAC3B,MAAM,WAAW,YAAY,OAAO,OAAO,EAAE,EAAE,YAAY,UAAU;AACrE,SAAM,KAAK,SAAS;;AAGtB,SAAO,IAAI,eAAe,IAAI,MAAM,QAAQ,MAAM;;;AAItD,SAAgB,wBAA6C;CAC3D,MAAM,WAAW,IAAI,qBAAqB;AAE1C,UAAS,SAAS,UAAU,cAAc;AAC1C,UAAS,SAAS,UAAU,cAAc;AAC1C,UAAS,SAAS,WAAW,eAAe;AAE5C,QAAO;;AAGT,SAAgB,oBAAiC;CAC/C,MAAM,WAAW,uBAAuB;CACxC,MAAM,UAAU,IAAIA,cAAY,SAAS;AAEzC,UAAS,SAAS,UAAU,oBAAoB,QAAQ,CAAC;AACzD,UAAS,SAAS,SAAS,mBAAmB,QAAQ,CAAC;AAEvD,QAAO;;;;;AChHT,IAAa,OAAb,MAAa,KAAK;CAChB,AAAQ,YAAY,AAAiB,WAAmC;EAAnC;;CAErC,OAAO,QAAc;AACnB,SAAO,IAAI,KAAK,EAAE,CAAC;;CAGrB,OAAwB,cAAc;CACtC,OAAwB,aAAa;CAErC,OAAO,WAAW,MAAoB;AACpC,MAAI,CAAC,QAAQ,SAAS,GACpB,QAAO,KAAK,OAAO;EAGrB,MAAM,WAA0B,EAAE;EAClC,IAAI,UAAU;AAEd,SAAO,QAAQ,SAAS,GAAG;GACzB,MAAM,aAAa,KAAK,YAAY,KAAK,QAAQ;AACjD,OAAI,aAAa,OAAO,QAAW;AACjC,aAAS,KAAK;KACZ,MAAM;KACN,OAAO,OAAO,SAAS,WAAW,IAAI,GAAG;KAC1C,CAAC;AACF,cAAU,QAAQ,MAAM,WAAW,GAAG,OAAO;AAC7C;;AAGF,OAAI,QAAQ,WAAW,MAAM,EAAE;AAC7B,aAAS,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,cAAU,QAAQ,MAAM,EAAE;AAC1B;;GAGF,MAAM,YAAY,KAAK,WAAW,KAAK,QAAQ;AAC/C,OAAI,YAAY,OAAO,QAAW;AAChC,aAAS,KAAK;KAAE,MAAM;KAAY,MAAM,UAAU;KAAI,CAAC;AACvD,cAAU,QAAQ,MAAM,UAAU,GAAG,OAAO;AAC5C;;AAGF,SAAM,IAAI,MAAM,yBAAyB,UAAU;;AAGrD,SAAO,IAAI,KAAK,SAAS;;CAG3B,OAAO,aAAa,UAAwC;AAC1D,SAAO,IAAI,KAAK,CAAC,GAAG,SAAS,CAAC;;CAGhC,WAAmC;AACjC,SAAO,KAAK;;CAGd,UAAmB;AACjB,SAAO,KAAK,UAAU,WAAW;;CAGnC,SAAiB;AACf,SAAO,KAAK,UAAU;;CAGxB,QAAiC;AAC/B,SAAO,KAAK,UAAU;;CAGxB,OAAgC;AAC9B,SAAO,KAAK,UAAU,GAAG,GAAG;;CAG9B,SAAe;AACb,MAAI,KAAK,UAAU,WAAW,EAC5B,QAAO;AAET,SAAO,IAAI,KAAK,KAAK,UAAU,MAAM,GAAG,GAAG,CAAC;;CAG9C,MAAM,MAAoB;AACxB,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;GAAE,MAAM;GAAY;GAAM,CAAC,CAAC;;CAGlE,WAAW,OAAqB;AAC9B,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;GAAE,MAAM;GAAS;GAAO,CAAC,CAAC;;CAGhE,aAAmB;AACjB,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC;;CAGzD,UAAU,QAAuB;AAC/B,MAAI,OAAO,UAAU,UAAU,KAAK,UAAU,OAC5C,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,UAAU,QAAQ,KAAK;GAChD,MAAM,YAAY,OAAO,UAAU;GACnC,MAAM,UAAU,KAAK,UAAU;AAC/B,OAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,cAAc,WAAW,QAAQ,CACnE,QAAO;;AAIX,SAAO;;CAGT,OAAO,OAAsB;AAC3B,MAAI,KAAK,UAAU,WAAW,MAAM,UAAU,OAC5C,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;GAC9C,MAAM,UAAU,KAAK,UAAU;GAC/B,MAAM,WAAW,MAAM,UAAU;AACjC,OAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,cAAc,SAAS,SAAS,CACjE,QAAO;;AAIX,SAAO;;CAGT,WAAmB;EACjB,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,KAAK,UACzB,KAAI,QAAQ,SAAS,YAAY;AAC/B,OAAI,OAAO,SAAS,EAClB,WAAU;AAEZ,aAAU,QAAQ;aACT,QAAQ,SAAS,QAC1B,WAAU,IAAI,QAAQ,MAAM;WACnB,QAAQ,SAAS,QAC1B,WAAU;AAId,SAAO;;CAGT,gBAAwB;AACtB,MAAI,KAAK,UAAU,WAAW,EAC5B,QAAO;EAGT,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,KAAK,UACzB,KAAI,QAAQ,SAAS,WACnB,WAAU,MAAM,QAAQ;WACf,QAAQ,SAAS,QAC1B,WAAU,MAAM,QAAQ;WACf,QAAQ,SAAS,QAC1B,WAAU;AAId,SAAO;;CAGT,AAAQ,cAAc,GAAgB,GAAyB;AAC7D,MAAI,EAAE,SAAS,EAAE,KACf,QAAO;AAGT,MAAI,EAAE,SAAS,cAAc,EAAE,SAAS,WACtC,QAAO,EAAE,SAAS,EAAE;AAGtB,MAAI,EAAE,SAAS,WAAW,EAAE,SAAS,QACnC,QAAO,EAAE,UAAU,EAAE;AAGvB,SAAO;;;;;;ACjLX,IAAa,YAAb,MAAuB;CACrB,AAAiB,4BAAY,IAAI,KAAwB;CACzD,AAAiB,4BAAY,IAAI,KAAmB;CAEpD,YAAY,AAAiB,MAAiB;EAAjB;AAC3B,OAAK,SAAS;;CAGhB,SAAS,IAAmC;EAC1C,MAAM,OAAO,KAAK,UAAU,IAAI,GAAG;AACnC,MAAI,KACF,QAAO;AAGT,OAAK,SAAS;AACd,SAAO,KAAK,UAAU,IAAI,GAAG;;CAG/B,OAAO,MAAuB;AAC5B,MAAI,KAAK,cAAc,KAAK,CAC1B,QAAO,KAAK,YAAY,KAAK;EAG/B,MAAM,SAAS,KAAK,UAAU,IAAI,KAAK,GAAG;AAC1C,MAAI,OACF,QAAO;EAGT,MAAM,OAAO,KAAK,YAAY,KAAK;AACnC,OAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AACjC,SAAO;;CAGT,AAAQ,cAAc,MAA0B;EAC9C,IAAI,UAA4B,KAAK;AACrC,SAAO,SAAS;AACd,OAAI,QAAQ,SAAS,CACnB,QAAO;AAET,aAAU,QAAQ;;AAEpB,SAAO;;CAGT,UAAgB;AACd,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,KAAK,KAAK;;CAG3B,aAAa,MAAuB;AAClC,OAAK,UAAU,KAAK;;CAGtB,qBAAqB,MAAuB;AAC1C,OAAK,UAAU,OAAO,KAAK,GAAG;AAC9B,OAAK,qBAAqB,KAAK;;CAGjC,AAAQ,UAAU,MAAuB;AACvC,OAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AAEjC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,UAAU,MAAM;WAEd,KAAK,SAAS,CACvB,MAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,UAAU,KAAK;;CAK1B,AAAQ,YAAY,MAAuB;EACzC,MAAM,WAEF,EAAE;EACN,IAAI,UAA4B;AAEhC,SAAO,SAAS,QAAQ;GACtB,MAAM,SAAoB,QAAQ;AAElC,OAAI,OAAO,UAAU,CACnB,UAAS,QAAQ;IAAE,MAAM;IAAY,MAAM,QAAQ;IAAM,CAAC;YACjD,OAAO,SAAS,EAAE;IAC3B,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAQ;AAC3C,QAAI,SAAS,EACX,UAAS,QAAQ;KAAE,MAAM;KAAS;KAAO,CAAC;;AAI9C,aAAU;;AAGZ,SAAO,KAAK,aAAa,SAAS;;CAGpC,AAAQ,qBAAqB,MAAuB;AAClD,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,UAAU;AACjC,QAAK,UAAU,OAAO,MAAM,GAAG;AAC/B,QAAK,qBAAqB,MAAM;;WAEzB,KAAK,SAAS,CACvB,MAAK,MAAM,QAAQ,KAAK,OAAO;AAC7B,QAAK,UAAU,OAAO,KAAK,GAAG;AAC9B,QAAK,qBAAqB,KAAK;;;;;;;AC3GvC,IAAa,gBAAb,MAA2B;CACzB,AAAQ,WAAqB,EAAE;CAE/B,IAAI,UAA6B;AAC/B,SAAO,KAAK;;CAGd,IAAI,aAAsB;AACxB,SAAO,KAAK,SAAS,SAAS;;CAGhC,MAAM,QAAsB;AAC1B,OAAK,SAAS,KAAK,OAAO;;CAG5B,QAAc;AACZ,OAAK,WAAW,EAAE;;CAGpB,YAAkC;EAChC,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,KAAK,UAAU;GAClC,MAAM,QAAQ,KAAK,gBAAgB,OAAO;AAC1C,WAAQ,KAAK,GAAG,MAAM;;AAGxB,SAAO;;CAGT,AAAQ,gBAAgB,QAA6B;EACnD,MAAM,OAAO,OAAO,KAAK,eAAe;AAExC,UAAQ,OAAO,MAAf;GACE,KAAK,WACH,QAAO,CAAC;IAAE,IAAI;IAAW;IAAM,OAAO,OAAO;IAAO,CAAC;GAEvD,KAAK,cACH,QAAO,CAAC;IAAE,IAAI;IAAO;IAAM,OAAO,OAAO;IAAO,CAAC;GAEnD,KAAK,iBACH,QAAO,CAAC;IAAE,IAAI;IAAU;IAAM,CAAC;GAEjC,KAAK,YACH,QAAO,CAAC;IAAE,IAAI;IAAO,MAAM,GAAG,KAAK;IAAK,OAAO,OAAO;IAAO,CAAC;GAEhE,KAAK,cACH,QAAO,CACL;IAAE,IAAI;IAAO,MAAM,GAAG,KAAK,GAAG,OAAO;IAAS,OAAO,OAAO;IAAO,CACpE;GAEH,KAAK,cACH,QAAO,CAAC;IAAE,IAAI;IAAU,MAAM,GAAG,KAAK,GAAG,OAAO;IAAS,CAAC;GAE5D,KAAK,aAAa;IAChB,MAAM,YAAY,OAAO,aAAa;IACtC,MAAM,UAAU,OAAO,WAAW;AAClC,WAAO,CACL;KACE,IAAI;KACJ,MAAM,GAAG,KAAK,GAAG;KACjB,MAAM,GAAG,KAAK,GAAG;KAClB,CACF;;GAGH,KAAK,eACH,QAAO,CACL;IACE,IAAI;IACJ,MAAM,GAAG,KAAK,GAAG,OAAO;IACxB,OAAO,OAAO;IACf,CACF;GAEH,KAAK,aACH,QAAO,CAAC;IAAE,IAAI;IAAW;IAAM,OAAO,EAAE;IAAE,CAAC;GAE7C,QACE,QAAO,EAAE;;;;;;;ACxEjB,IAAa,YAAb,MAAuB;CACrB,AAAiB;CACjB,AAAiB;CACjB,AAAQ,iBAAuC;CAE/C,YAAY,AAAiB,OAAkB;EAAlB;AAC3B,OAAK,QAAQ,IAAI,UAAU,MAAM;AACjC,OAAK,gBAAgB,IAAI,eAAe;AAExC,2BAAe,MAAM;GACnB,WAAWC;GACX,aAAaA;GACb,gBAAgBA;GAChB,SAASA;GACT,gBAAgBA;GAChB,SAASA;GACT,QAAQC;GACR,QAAQA;GACT,CAAC;;CAGJ,IAAI,OAAkB;AACpB,SAAO,KAAK;;CAGd,SAAS,IAAmC;AAC1C,SAAO,KAAK,MAAM,SAAS,GAAG;;CAGhC,IAAI,MAAqC;AACvC,SAAO,KAAK,UAAU,KAAK,WAAW,KAAK,CAAC;;CAG9C,UAAU,MAAmC;AAC3C,MAAI,KAAK,SAAS,CAChB,QAAO,KAAK;EAGd,IAAI,UAAiC,KAAK;AAE1C,OAAK,MAAM,WAAW,KAAK,UAAU,EAAE;AACrC,OAAI,CAAC,QACH;AAGF,aAAU,KAAK,eAAe,SAAS,QAAQ;;AAGjD,SAAO;;CAGT,AAAQ,eACN,MACA,SACuB;AACvB,MAAI,QAAQ,SAAS,cAAc,KAAK,UAAU,CAChD,QAAO,KAAK,MAAM,QAAQ,KAAK;AAEjC,MAAI,QAAQ,SAAS,WAAW,KAAK,SAAS,CAC5C,QAAO,KAAK,GAAG,QAAQ,MAAM;;CAKjC,OAAO,UAAoC;EACzC,MAAM,OACJ,OAAO,aAAa,WAAW,KAAK,SAAS,SAAS,GAAG;AAC3D,MAAI,CAAC,KACH,QAAO,KAAK,OAAO;AAErB,SAAO,KAAK,MAAM,OAAO,KAAK;;CAGhC,IAAI,YAAmC;AACrC,SAAO,KAAK,MAAM;;CAGpB,IAAI,cAAqC;AACvC,SAAO,KAAK,MAAM;;CAGpB,IAAI,iBAAwC;AAC1C,SAAO,CAAC,GAAG,KAAK,WAAW,GAAG,KAAK,YAAY;;CAGjD,IAAI,UAAmB;AACrB,SAAO,KAAK,UAAU,WAAW;;CAGnC,IAAI,iBAA0B;AAC5B,SAAO,KAAK,eAAe,SAAS;;CAGtC,IAAI,eAA2D;EAC7D,MAAM,sBAAM,IAAI,KAA2B;AAC3C,OAAK,MAAM,SAAS,KAAK,WAAW;GAClC,MAAM,OAAO,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE;AACtC,QAAK,KAAK,MAAM;AAChB,OAAI,IAAI,MAAM,MAAM,KAAK;;AAE3B,SAAO;;CAGT,SAAS,MAAuB;AAC9B,SAAO,KAAK,IAAI,KAAK,EAAE,eAAe;;CAGxC,SAAS,MAAc,OAAsB;EAC3C,MAAM,aAAa,KAAK,WAAW,KAAK;EACxC,MAAM,OAAO,KAAK,UAAU,WAAW;AACvC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,mBAAmB,OAAO;AAE5C,MAAI,CAAC,KAAK,aAAa,CACrB,OAAM,IAAI,MAAM,2CAA2C,OAAO;EAGpE,MAAM,WAAW,KAAK;AACtB,OAAK,SAAS,MAAM;AAEpB,OAAK,cAAc,MAAM;GACvB,MAAM;GACN,MAAM;GACN;GACA;GACD,CAAC;;CAGJ,gBAAyB;AACvB,SAAO,KAAK,MAAM,eAAe;;CAGnC,IAAI,UAA6B;AAC/B,SAAO,KAAK,cAAc;;CAG5B,IAAI,aAAsB;AACxB,SAAO,KAAK,cAAc;;CAG5B,eAAqB;AACnB,OAAK,cAAc,OAAO;;CAG5B,aAAmC;AACjC,SAAO,KAAK,cAAc,WAAW;;CAGvC,YAAY,QAAsB;AAChC,OAAK,cAAc,MAAM,OAAO;;CAGlC,eAAqB;AACnB,OAAK,MAAM,SAAS;;CAGtB,qBAAqB,MAAuB;AAC1C,OAAK,MAAM,qBAAqB,KAAK;;CAGvC,IAAI,UAAmB;EACrB,MAAM,OAAO,KAAK;AAClB,MAAI,aAAa,KACf,QAAO,KAAK;AAEd,SAAO;;CAGT,SAAe;EACb,MAAM,OAAO,KAAK;AAClB,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,MAAK,QAAQ;AAEf,OAAK,cAAc,OAAO;;CAG5B,SAAe;EACb,MAAM,OAAO,KAAK;AAClB,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,MAAK,QAAQ;AAEf,OAAK,cAAc,OAAO;;CAG5B,iBAAiB,QAA6B;AAC5C,OAAK,iBAAiB;;CAGxB,IAAI,gBAAsC;AACxC,SAAO,KAAK;;CAGd,UAAgB;AACd,OAAK,gBAAgB,SAAS;AAC9B,OAAK,iBAAiB;;;;;;AC1L1B,MAAM,cAAc;AACpB,MAAM,aAAa;AAEnB,IAAa,mBAAb,MAA8B;CAC5B,AAAQ,OAAyB;CAEjC,QAAQ,MAAiC;AACvC,OAAK,OAAO;EACZ,MAAM,WAA2B,EAAE;AACnC,OAAK,SAAS,MAAM;GAAE,QAAQ;GAAM,aAAa,EAAE;GAAE,EAAE,SAAS;AAChE,SAAO;;CAGT,AAAQ,SACN,MACA,SACA,UACM;AACN,MAAI,KAAK,aAAa,CACpB,MAAK,iBAAiB,MAAM,SAAS,SAAS;WACrC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,SAAS,OAAO;GAAE,GAAG;GAAS,QAAQ;GAAM,EAAE,SAAS;WAErD,KAAK,SAAS,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,OAAI,KACF,MAAK,SACH,MACA;IACE,GAAG;IACH,aAAa,CAAC,GAAG,QAAQ,aAAa;KAAE,OAAO;KAAM,OAAO;KAAG,CAAC;IACjE,EACD,SACD;;;CAMT,AAAQ,iBACN,MACA,SACA,UACM;EACN,MAAM,UAAU,KAAK;AACrB,MAAI,CAAC,QACH;EAGF,MAAM,kBAAkB,KAAK,oBAAoB,QAAQ,WAAW;EACpE,MAAM,kBAAkB,KAAK,oBAC3B,iBACA,MACA,QACD;AAED,WAAS,KAAK;GACZ;GACA,YAAY,QAAQ;GACpB,QAAQ,QAAQ;GAChB;GACA,aAAa,QAAQ;GACtB,CAAC;;CAGJ,AAAQ,oBAAoB,YAAuC;AACjE,MAAI;AAEF,iDAD+B,WAAW,CAC5B;UACR;AACN,UAAO,EAAE;;;CAIb,AAAQ,oBACN,SACA,aACA,SACsB;EACtB,MAAM,QAA8B,EAAE;AAEtC,OAAK,MAAM,OAAO,SAAS;GACzB,MAAM,OAAO,KAAK,qBAAqB,KAAK,aAAa,QAAQ;AACjE,OAAI,KACF,MAAK,sBAAsB,MAAM,MAAM;;AAI3C,SAAO;;CAGT,AAAQ,sBACN,MACA,QACM;AACN,MAAI,KAAK,aAAa,CACpB,QAAO,KAAK,KAAK;WACR,KAAK,SAAS,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,OAAI,KACF,MAAK,sBAAsB,MAAM,OAAO;;WAGnC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,sBAAsB,OAAO,OAAO;;CAK/C,AAAQ,qBACN,KACA,cACA,SACkB;AAClB,MAAI,IAAI,WAAW,IAAI,CACrB,QAAO,KAAK,gBAAgB,IAAI,MAAM,EAAE,CAAC;AAG3C,MAAI,IAAI,WAAW,MAAM,CACvB,QAAO,KAAK,gBAAgB,KAAK,QAAQ;AAG3C,MAAI,QAAQ,OACV,QAAO,KAAK,gBAAgB,QAAQ,QAAQ,IAAI;AAGlD,SAAO,KAAK,gBAAgB,IAAI;;CAGlC,AAAQ,gBAAgB,SAAmC;AACzD,MAAI,CAAC,KAAK,KACR,QAAO;AAET,SAAO,KAAK,gBAAgB,KAAK,MAAM,QAAQ;;CAGjD,AAAQ,gBACN,WACA,SACkB;EAClB,MAAM,WAAW,KAAK,kBAAkB,QAAQ;EAChD,IAAI,UAA4B;AAEhC,OAAK,MAAM,WAAW,UAAU;AAC9B,OAAI,CAAC,QACH,QAAO;AAGT,OAAI,QAAQ,SAAS,WACnB,KAAI,QAAQ,UAAU,CACpB,WACE,QAAQ,SAAS,MAAM,MAAM,EAAE,SAAS,QAAQ,KAAK,IAAI;OAE3D,QAAO;YAEA,QAAQ,SAAS,QAC1B,KAAI,QAAQ,SAAS,CACnB,WAAU,QAAQ,GAAG,QAAQ,MAAM,IAAI;OAEvC,QAAO;;AAKb,SAAO;;CAGT,AAAQ,gBACN,KACA,SACkB;EAClB,IAAI,WAAW;EACf,IAAI,YAAY;AAEhB,SAAO,UAAU,WAAW,MAAM,EAAE;AAClC;AACA,eAAY,UAAU,MAAM,EAAE;;EAGhC,IAAI,UAA4B,QAAQ;AAExC,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,SAAS,KAAK;AAC5C,aAAU,KAAK,WAAW,QAAQ;AAClC,OAAI,SAAS,SAAS,CACpB,WAAU,KAAK,WAAW,QAAQ;;AAItC,MAAI,CAAC,QACH,QAAO;AAGT,MAAI,UACF,QAAO,KAAK,gBAAgB,SAAS,UAAU;AAGjD,SAAO;;CAGT,AAAQ,WAAW,MAAmC;AACpD,MAAI,CAAC,KAAK,QAAQ,SAAS,KAAK,KAC9B,QAAO;AAGT,SAAO,KAAK,oBAAoB,KAAK,MAAM,KAAK;;CAGlD,AAAQ,oBACN,SACA,QACkB;EAClB,MAAM,WAAW,KAAK,cAAc,QAAQ;AAE5C,OAAK,MAAM,SAAS,UAAU;AAC5B,OAAI,UAAU,OACZ,QAAO;GAET,MAAM,QAAQ,KAAK,oBAAoB,OAAO,OAAO;AACrD,OAAI,MACF,QAAO;;AAIX,SAAO;;CAGT,AAAQ,cAAc,MAA8B;AAClD,MAAI,KAAK,UAAU,CACjB,QAAO,CAAC,GAAG,KAAK,SAAS;AAE3B,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAqB,EAAE;AAC7B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,KACF,OAAM,KAAK,KAAK;;AAGpB,UAAO;;AAET,SAAO,EAAE;;CAGX,AAAQ,kBAAkB,SAAgC;EACxD,MAAM,WAA0B,EAAE;EAClC,IAAI,UAAU;AAEd,SAAO,QAAQ,SAAS,GAAG;GACzB,MAAM,aAAa,YAAY,KAAK,QAAQ;AAC5C,OAAI,aAAa,IAAI;AACnB,aAAS,KAAK;KACZ,MAAM;KACN,OAAO,OAAO,SAAS,WAAW,IAAI,GAAG;KAC1C,CAAC;AACF,cAAU,QAAQ,MAAM,WAAW,GAAG,OAAO;AAC7C;;GAGF,MAAM,YAAY,WAAW,KAAK,QAAQ;AAC1C,OAAI,YAAY,IAAI;AAClB,aAAS,KAAK;KAAE,MAAM;KAAY,MAAM,UAAU;KAAI,CAAC;AACvD,cAAU,QAAQ,MAAM,UAAU,GAAG,OAAO;AAC5C;;AAGF;;AAGF,SAAO;;;;;;AC9RX,IAAa,kBAAb,MAA6B;CAC3B,mBAAmB,UAAkD;EACnE,MAAM,sBAAqB,IAAI,KAAK;AAEpC,OAAK,MAAM,SAAS,SAClB,MAAK,MAAM,WAAW,MAAM,iBAAiB;GAC3C,IAAI,SAAS,IAAI,IAAI,QAAQ;AAC7B,OAAI,CAAC,QAAQ;AACX,6BAAS,IAAI,KAAK;AAClB,QAAI,IAAI,SAAS,OAAO;;AAE1B,UAAO,IAAI,MAAM;;AAIrB,SAAO;;CAGT,qBACE,UACyB;EACzB,MAAM,eAAe,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK,CAAC;EACzD,MAAM,0BAAU,IAAI,KAAyB;EAC7C,MAAM,QAAwB,EAAE;EAEhC,MAAM,gCAAgB,IAAI,KAAuC;AACjE,OAAK,MAAM,SAAS,SAClB,eAAc,IAAI,MAAM,MAAM,MAAM;EAGtC,MAAM,SACJ,OACA,UACS;AACT,OAAI,QAAQ,IAAI,MAAM,KAAK,CACzB;AAGF,OAAI,MAAM,IAAI,MAAM,KAAK,CACvB;AAGF,SAAM,IAAI,MAAM,KAAK;AAErB,QAAK,MAAM,WAAW,MAAM,gBAC1B,KAAI,aAAa,IAAI,QAAQ,EAAE;IAC7B,MAAM,aAAa,cAAc,IAAI,QAAQ;AAC7C,QAAI,WACF,OAAM,YAAY,MAAM;;AAK9B,SAAM,OAAO,MAAM,KAAK;AACxB,WAAQ,IAAI,MAAM,KAAK;AACvB,SAAM,KAAK,MAAM;;AAGnB,OAAK,MAAM,SAAS,SAClB,OAAM,uBAAO,IAAI,KAAK,CAAC;AAGzB,SAAO;;CAGT,oBACE,aACA,eACA,iBACyB;EACzB,MAAM,2BAAW,IAAI,KAAmB;EACxC,MAAM,QAA8B,CAAC,YAAY;AAEjD,SAAO,MAAM,SAAS,GAAG;GACvB,MAAM,UAAU,MAAM,OAAO;AAC7B,OAAI,CAAC,QACH;GAEF,MAAM,aAAa,cAAc,IAAI,QAAQ;AAE7C,OAAI,YACF;SAAK,MAAM,SAAS,WAClB,KAAI,CAAC,SAAS,IAAI,MAAM,EAAE;AACxB,cAAS,IAAI,MAAM;AACnB,WAAM,KAAK,MAAM,KAAK;;;;AAM9B,SAAO,gBAAgB,QAAQ,UAAU,SAAS,IAAI,MAAM,CAAC;;;;;;ACxFjE,IAAa,mBAAb,MAA8B;CAC5B,YACE,AAAiB,MACjB,AAAiB,UAAgC,EAAE,EACnD;EAFiB;EACA;;CAGnB,SAAS,OAA2B;AAClC,MAAI;GACF,MAAM,UAAU,KAAK,aAAa,MAAM;GACxC,MAAM,oDAA6B,MAAM,YAAY,QAAQ;AAE7D,QAAK,aAAa,OAAO,OAAO;AAChC,QAAK,iBAAiB,OAAO,OAAO;WAC7B,OAAO;AACd,QAAK,YAAY,OAAO,MAAe;;;CAI3C,YAAY,QAAsC;AAChD,OAAK,MAAM,SAAS,OAClB,MAAK,SAAS,MAAM;;CAIxB,AAAQ,aAAa,OAAqB;EAGxC,MAAM,UAYF,EAAE,UAdW,KAAK,KAAK,eAAe,EAc1B;AAEhB,MAAI,MAAM,QAAQ;GAChB,MAAM,WAAW,KAAK,oBAAoB,MAAM,OAAO;AACvD,OAAI,SACF,SAAQ,WAAW;;AAIvB,MAAI,MAAM,YAAY,SAAS,EAC7B,SAAQ,eAAe,EAAE,QAAQ,KAAK,iBAAiB,MAAM,EAAE;AAGjE,SAAO;;CAGT,AAAQ,iBAAiB,OAAqB;EAC5C,MAAM,SAKD,EAAE;AAIP,OAAK,IAAI,IAAI,MAAM,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;GACtD,MAAM,QAAQ,MAAM,YAAY;AAChC,OAAI,CAAC,MACH;GAEF,MAAM,EAAE,OAAO,UAAU;AAEzB,UAAO,KAAK;IACV;IACA,QAAQ,MAAM;IACd,MAAM,KAAK,iBAAiB,OAAO,MAAM;IACzC,MAAM,KAAK,iBAAiB,OAAO,MAAM;IAC1C,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,iBACN,OACA,OACS;AACT,MAAI,SAAS,EACX,QAAO;EAET,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACpC,SAAO,WAAW,KAAK,kBAAkB,SAAS,GAAG;;CAGvD,AAAQ,iBACN,OACA,OACS;AACT,MAAI,SAAS,MAAM,SAAS,EAC1B,QAAO;EAET,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACpC,SAAO,WAAW,KAAK,kBAAkB,SAAS,GAAG;;CAGvD,AAAQ,oBAAoB,MAAgD;EAC1E,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,SAAS,KAAK,SACvB,QAAO,MAAM,QAAQ,KAAK,kBAAkB,MAAM;AAEpD,SAAO;;CAGT,AAAQ,kBAAkB,MAA0B;AAClD,MAAI,KAAK,aAAa,CACpB,QAAO,KAAK;AAEd,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,oBAAoB,KAAK;AAEvC,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,SAAoB,EAAE;AAC5B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,KACF,QAAO,KAAK,KAAK,kBAAkB,KAAK,CAAC;;AAG7C,UAAO;;AAET,SAAO;;CAGT,AAAQ,aAAa,OAAqB,QAAuB;EAC/D,MAAM,EAAE,SAAS;EACjB,MAAM,eAAe,KAAK;AAE1B,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,QAAK,SAAS,cAAc,EAAE,UAAU,MAAM,CAAC;AAC/C;;AAGF,MACE,OAAO,WAAW,aACjB,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO,SAAS,OAAO,GACjD;AACA,QAAK,SAAS,cAAc,EAAE,UAAU,MAAM,CAAC;AAC/C;;AAGF,OAAK,SAAS,QAAQ,EAAE,UAAU,MAAM,CAAC;;CAG3C,AAAQ,iBAAiB,OAAqB,QAAuB;EACnE,MAAM,EAAE,SAAS;AAEjB,MAAI,OAAO,WAAW,UAAU;AAC9B,OAAI,OAAO,MAAM,OAAO,EAAE;AACxB,SAAK,kBAAkB;KACrB,MAAM;KACN,SAAS;KACT,YAAY,MAAM;KAClB,eAAe;KAChB,CAAC;AACF;;AAGF,OAAI,CAAC,OAAO,SAAS,OAAO,EAAE;AAC5B,SAAK,kBAAkB;KACrB,MAAM;KACN,SAAS;KACT,YAAY,MAAM;KAClB,eAAe;KAChB,CAAC;AACF;;;AAIJ,OAAK,kBAAkB,KAAK;;CAG9B,AAAQ,YAAY,OAAqB,OAAoB;EAC3D,MAAM,EAAE,SAAS;AAEjB,OAAK,SAAS,KAAK,cAAc,EAAE,UAAU,MAAM,CAAC;AAEpD,OAAK,kBAAkB;GACrB,MAAM;GACN,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,eAAe;GAChB,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ,QAAQ,MAAM,MAAM;;;;;;AC3LvC,IAAa,gBAAb,MAA2B;CACzB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ,WAA2B,EAAE;CACrC,AAAQ,gCAA+B,IAAI,KAAK;CAChD,AAAQ,kBAA2C,EAAE;CACrD,AAAQ,YAAiC,EAAE;CAE3C,YACE,AAAiB,MACjB,UAAgC,EAAE,EAClC;EAFiB;AAGjB,OAAK,YAAY,IAAI,kBAAkB;AACvC,OAAK,QAAQ,IAAI,iBAAiB;AAClC,OAAK,YAAY,IAAI,iBAAiB,MAAM,QAAQ;AAEpD,OAAK,YAAY;;CAGnB,eAAqB;AACnB,OAAK,kBAAkB;AACvB,OAAK,YAAY;;CAGnB,UAAgB;AACd,OAAK,kBAAkB;AACvB,OAAK,WAAW,EAAE;AAClB,OAAK,gCAAgB,IAAI,KAAK;AAC9B,OAAK,kBAAkB,EAAE;;CAG3B,cAAuC;AACrC,SAAO,KAAK;;CAGd,qBAA8C;AAC5C,SAAO,KAAK;;CAGd,AAAQ,aAAmB;AACzB,OAAK,WAAW,KAAK,UAAU,QAAQ,KAAK,KAAK,KAAK;AAEtD,OAAK,gBAAgB,KAAK,MAAM,mBAAmB,KAAK,SAAS;AACjE,OAAK,kBAAkB,KAAK,MAAM,qBAAqB,KAAK,SAAS;AAErE,OAAK,aAAa;AAElB,OAAK,gBAAgB;;CAGvB,AAAQ,cAAoB;AAC1B,8BAAkB;AAChB,QAAK,MAAM,SAAS,KAAK,gBACvB,MAAK,UAAU,SAAS,MAAM;IAEhC;;CAGJ,AAAQ,iBAAuB;EAC7B,MAAM,+BAAe,IAAI,KAAyB;AAElD,OAAK,MAAM,CAAC,YAAY,KAAK,eAAe;AAC1C,OAAI,aAAa,IAAI,QAAQ,CAC3B;AAEF,gBAAa,IAAI,QAAQ;GAEzB,MAAM,oCACE,QAAQ,aACR,KAAK,uBAAuB,QAAQ,CAC3C;AACD,QAAK,UAAU,KAAK,SAAS;;AAG/B,OAAK,oBAAoB,KAAK,KAAK,KAAK;;CAG1C,AAAQ,oBAAoB,MAAuB;AACjD,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,oCACE,KAAK,cACL,KAAK,uBAAuB,CACnC;AACD,QAAK,UAAU,KAAK,SAAS;AAE7B,QAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,oBAAoB,KAAK;aAEvB,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,oBAAoB,MAAM;;CAKrC,AAAQ,uBAAuB,aAAuC;EACpE,MAAM,WAAW,KAAK,MAAM,oBAC1B,aACA,KAAK,eACL,KAAK,gBACN;AAED,8BAAkB;AAChB,QAAK,MAAM,SAAS,SAClB,MAAK,UAAU,SAAS,MAAM;IAEhC;;CAGJ,AAAQ,wBAA8B;AACpC,OAAK,cAAc;;CAGrB,AAAQ,mBAAyB;AAC/B,OAAK,MAAM,YAAY,KAAK,UAC1B,WAAU;AAEZ,OAAK,YAAY,EAAE;;;;;;ACvHvB,SAAgB,iBACd,QACA,cACA,SACW;CACX,MAAM,cAAc,SAAS,eAAe,mBAAmB;CAC/D,MAAM,WAAW,YAAY,WAAW,QAAQ,aAAa;AAE7D,0BAAyB,UAAU,YAAY;CAE/C,MAAM,OAAO,IAAI,UAAU,SAAS;AAEpC,KAAI,SAAS,kBAAkB,OAAO;EAGpC,MAAM,SAAS,IAAI,cAAc,MAD/B,OAAO,SAAS,kBAAkB,WAAW,QAAQ,gBAAgB,EAAE,CACnB;AACtD,OAAK,iBAAiB,OAAO;;AAG/B,QAAO;;AAGT,SAAS,yBAAyB,MAAiB,SAA4B;AAC7E,KAAI,KAAK,SAAS,EAAE;AAClB,OAAK,eAAe,QAAQ;AAC5B,OAAK,MAAM,QAAQ,KAAK,MACtB,0BAAyB,MAAM,QAAQ;YAEhC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,0BAAyB,OAAO,QAAQ;;AAK9C,SAAgB,sBACd,QACA,SACW;AACX,QAAO,iBAAiB,QAAQ,QAAW,QAAQ"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["React","ChakraTooltip","Portal","Flex","Box","Text","Button","Flex","Box","Text","PiPlusBold","Button","Icon","PiX","Button","Icon","PiCaretLeft","IconButton","PiGear","IconButton","PiCopy","Flex","Box","CodeMirror","EditorView","githubLight","Text","PiTreeViewThin","PiBracketsCurlyThin","PiLinkThin","Menu","Button","Icon","PiCaretDownLight","Portal","observable","createDefaultRegistry","observable","observable","computed","action","observable","override","computed","action","observable","computed","action","override","computed","action","observable","computed","action","observable","computed","action","Flex","Box","PiDotOutlineFill","IconButton","MdOutlineChevronRight","Menu","Box","LuChevronRight","Portal","Fragment","Flex","Icon","PiDotsSixVerticalBold","Text","Box","PiWarningCircle","PiWarning","PiFunction","Flex","Box","PiTextT","Menu","PiTextT","Box","PiCaretRight","Portal","Textarea","Menu","PiFunction","Box","PiCaretRight","Portal","Input","Menu","PiEquals","Box","PiCaretRight","Portal","Input","Menu","Box","PiCaretRight","Portal","Menu","Portal","Box","PiTrash","Flex","Box","Flex","Box","ForeignKeyValue","PiDotOutlineFill","Text","Flex","Box","PiDotOutlineFill","Text","PiPlusLight","PiMinusLight","PiArrowsLeftRightLight","PiPencilSimpleLight","Box","Badge","VStack","Flex","Text","Icon","PiArrowRight","PiWarningCircle","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","SegmentGroup","DialogFooter","IconButton","PiArrowCounterClockwiseBold","Button","DialogCloseTrigger","Flex","Box","Button","observable","computed","action","observable","computed","action","observable","computed","action","NodeFactory","computed","action"],"sources":["../src/components/Tooltip/Tooltip.tsx","../src/components/ContentEditable/ContentEditable.tsx","../src/components/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/schema-editor/types.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/schema-editor/model/node/NodeType.ts","../src/schema-editor/model/node/NodeMetadata.ts","../src/schema-editor/model/node/NullNode.ts","../src/schema-editor/model/node/ObjectNode.ts","../src/schema-editor/model/node/ArrayNode.ts","../src/schema-editor/model/node/StringNode.ts","../src/schema-editor/model/node/NumberNode.ts","../src/schema-editor/model/node/BooleanNode.ts","../src/schema-editor/model/node/RefNode.ts","../src/schema-editor/model/node/NodeFactory.ts","../src/schema-editor/model/path/PathSegment.ts","../src/schema-editor/model/path/Path.ts","../src/schema-editor/model/path/PathParser.ts","../src/schema-editor/model/formula/core/FormulaDependency.ts","../src/schema-editor/model/formula/core/FormulaError.ts","../src/schema-editor/model/formula/parsing/RelativePath.ts","../src/schema-editor/model/formula/parsing/ParsedFormula.ts","../src/schema-editor/model/formula/serialization/RelativePathBuilder.ts","../src/schema-editor/model/formula/serialization/FormulaSerializer.ts","../src/schema-editor/model/formula/store/FormulaDependencyIndex.ts","../src/schema-editor/model/tree/TreeNodeIndex.ts","../src/schema-editor/model/tree/TreeMutator.ts","../src/schema-editor/model/tree/SchemaTree.ts","../src/schema-editor/model/parsing/descriptors/TypeRegistry.ts","../src/schema-editor/model/parsing/descriptors/TypeCapabilities.ts","../src/schema-editor/model/parsing/descriptors/StringDescriptor.ts","../src/schema-editor/model/parsing/descriptors/NumberDescriptor.ts","../src/schema-editor/model/parsing/descriptors/BooleanDescriptor.ts","../src/schema-editor/model/parsing/descriptors/ObjectDescriptor.ts","../src/schema-editor/model/parsing/descriptors/ArrayDescriptor.ts","../src/schema-editor/model/parsing/descriptors/RefDescriptor.ts","../src/schema-editor/model/parsing/descriptors/index.ts","../src/schema-editor/model/schema/SchemaParser.ts","../src/schema-editor/model/schema/SchemaSerializer.ts","../src/schema-editor/model/diff/SchemaComparator.ts","../src/schema-editor/model/diff/index/NodePathIndex.ts","../src/schema-editor/model/diff/changes/ChangeCollector.ts","../src/schema-editor/model/diff/changes/ChangeCoalescer.ts","../src/schema-editor/model/diff/changes/PatchGenerator.ts","../src/schema-editor/model/diff/changes/FormulaChangeDetector.ts","../src/schema-editor/model/diff/enricher/NodeMetadataExtractor.ts","../src/schema-editor/model/diff/enricher/PatchEnricher.ts","../src/schema-editor/model/diff/PatchBuilder.ts","../src/schema-editor/model/diff/SchemaDiff.ts","../src/schema-editor/model/validation/FieldNameValidator.ts","../src/schema-editor/model/validation/SchemaValidator.ts","../src/schema-editor/model/validation/FormulaValidator.ts","../src/schema-editor/model/validation/DefaultValueParser.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/engine/SchemaEngine.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/config/system-schemas.ts","../src/schema-editor/vm/createNodeVM.ts","../src/schema-editor/vm/BaseNodeVM.ts","../src/schema-editor/vm/PrimitiveNodeVM.ts","../src/schema-editor/vm/ArrayNodeVM.ts","../src/schema-editor/vm/ForeignKeyNodeVM.ts","../src/schema-editor/vm/RefNodeVM.ts","../src/schema-editor/vm/SchemaEditorVM.ts","../src/schema-editor/vm/ObjectNodeVM.ts","../src/schema-editor/ui/NodeWrapper/NodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/hooks/useDragAndDrop.ts","../src/schema-editor/ui/FieldEditor/FieldEditor.tsx","../src/schema-editor/ui/NodeIndicators/NodeIndicators.tsx","../src/schema-editor/ui/hooks/useFixZagNestedMenuDismiss.ts","../src/schema-editor/ui/NodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/UsedByFormulasSubmenu.tsx","../src/schema-editor/ui/NodeContextMenu/NodeContextMenu.tsx","../src/schema-editor/ui/NodeRightContent/NodeRightContent.tsx","../src/schema-editor/ui/CollapsibleNodeView/CollapsibleNodeView.tsx","../src/schema-editor/ui/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/LeafNodeView/LeafNodeView.tsx","../src/schema-editor/ui/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/NodeView/NodeView.tsx","../src/schema-editor/ui/ChangesPreviewDialog/ChangesPreviewDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.tsx","../src/value-model/node/BaseValueNode.ts","../src/value-model/node/BasePrimitiveValueNode.ts","../src/value-model/core/types.ts","../src/value-model/node/StringValueNode.ts","../src/value-model/node/NumberValueNode.ts","../src/value-model/node/BooleanValueNode.ts","../src/value-model/node/ObjectValueNode.ts","../src/value-model/node/ArrayValueNode.ts","../src/value-model/node/NodeFactory.ts","../src/value-model/core/Path.ts","../src/value-model/tree/TreeIndex.ts","../src/value-model/tree/ChangeTracker.ts","../src/value-model/tree/ValueTree.ts","../src/value-model/formula/FormulaCollector.ts","../src/value-model/formula/DependencyGraph.ts","../src/value-model/formula/FormulaEvaluator.ts","../src/value-model/formula/FormulaEngine.ts","../src/value-model/factory.ts"],"sourcesContent":["import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react';\nimport * as React from 'react';\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) {\n return <>{children}</>;\n }\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, {\n DependencyList,\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\nimport { useUpdateEffect } from 'react-use';\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\ninterface ContentEditableBoxProps {\n initValue: string;\n placeholder?: string;\n autoFocus?: boolean;\n onBlur?: () => void;\n onFocus?: () => void;\n onChange?: (value: string) => void;\n onEscape?: () => void;\n onEnter?: () => void;\n focusIfDependencyList?: DependencyList;\n restrict?: RegExp;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport const ContentEditable: React.FC<ContentEditableBoxProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusIfDependencyList,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n\n useEffect(() => {\n if (autoFocus) {\n ref.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && ref.current) {\n const maxPosition = (ref.current.textContent || '').length;\n const position = Math.min(maxPosition, cursorPosition.current);\n\n const range = document.createRange();\n const sel = globalThis.getSelection();\n const firstChild = ref.current.childNodes[0];\n const node: Node = firstChild ?? ref.current;\n range.setStart(node, position);\n range.collapse(true);\n\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n });\n\n useUpdateEffect(() => {\n if (focusIfDependencyList) {\n ref.current?.focus();\n const selection = globalThis.getSelection();\n\n if (ref.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(ref.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }, [...(focusIfDependencyList ?? [])]);\n\n const handleChange: React.FormEventHandler<HTMLDivElement> = useCallback(\n (event) => {\n const selection = globalThis.getSelection();\n if (selection && selection.rangeCount > 0) {\n cursorPosition.current = selection.getRangeAt(0).startOffset;\n }\n\n const textValue = event.currentTarget.innerText;\n onChange?.(textValue === '\\n' ? '' : textValue);\n },\n [onChange],\n );\n\n const handleBlur: React.FormEventHandler<HTMLDivElement> = useCallback(() => {\n onBlur?.();\n cursorPosition.current = null;\n }, [onBlur]);\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = useCallback(\n (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (initValue) {\n ref.current?.blur();\n onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n if (initValue) {\n ref.current?.blur();\n }\n onEscape?.();\n }\n\n if (restrict && !allowed.has(event.key) && !restrict.test(event.key)) {\n event.preventDefault();\n }\n },\n [initValue, onEnter, onEscape, restrict],\n );\n\n const handleParentClick = useCallback(() => {\n ref.current?.focus();\n }, []);\n\n const showPlaceholder = !initValue && placeholder;\n\n return (\n <Flex\n minWidth={0}\n width={showPlaceholder ? '100%' : undefined}\n position=\"relative\"\n onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={ref}\n contentEditable\n spellCheck={'false'}\n dangerouslySetInnerHTML={{ __html: escapeHtml(initValue) }}\n outline={0}\n width=\"100%\"\n onBlur={handleBlur}\n onFocus={onFocus}\n onInput={handleChange}\n onKeyDown={handleKeyDown}\n ></Box>\n {!showPlaceholder && postfix}\n {showPlaceholder && (\n <Text\n cursor=\"text\"\n userSelect=\"none\"\n pointerEvents=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n position=\"absolute\"\n >\n {placeholder}\n </Text>\n )}\n </Flex>\n );\n};\n","import { Box, Button, Flex, Text } from '@chakra-ui/react';\nimport React from 'react';\n\ninterface GrayButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n isLoading?: boolean;\n icon?: React.ReactNode;\n height?: string;\n dataTestId?: string;\n}\n\nexport const GrayButton: React.FC<GrayButtonProps> = ({\n height = '2.5rem',\n title,\n onClick,\n disabled,\n isSelected,\n isLoading,\n icon,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n _hover={{ color: 'gray.400', backgroundColor: 'white' }}\n _disabled={\n isSelected\n ? { backgroundColor: 'gray.50', cursor: 'not-allowed' }\n : undefined\n }\n alignSelf=\"flex-start\"\n color=\"gray.300\"\n fontWeight=\"500\"\n fontSize={16}\n height={height}\n disabled={disabled || isSelected}\n loading={isLoading}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Flex alignItems=\"center\" gap=\"0.5rem\">\n {icon && <Box fontSize=\"sm\">{icon}</Box>}\n <Text>{title}</Text>\n </Flex>\n </Button>\n );\n};\n","import React from 'react';\nimport { PiPlusBold } from 'react-icons/pi';\nimport { GrayButton } from '../GrayButton/GrayButton';\n\ninterface CreateButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CreateButton: React.FC<CreateButtonProps> = (props) => {\n return <GrayButton {...props} icon={<PiPlusBold />} />;\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiX } from 'react-icons/pi';\n\ninterface CloseButtonProps {\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CloseButton: React.FC<CloseButtonProps> = ({\n height = '2.5rem',\n onClick,\n disabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={disabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n color=\"gray.400\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n width=\"48px\"\n >\n <Icon size=\"md\">\n <PiX />\n </Icon>\n </Button>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiCaretLeft } from 'react-icons/pi';\n\ninterface BackButtonProps {\n onClick?: () => void;\n isDisabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({\n height = '2.5rem',\n onClick,\n isDisabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={isDisabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Icon boxSize={4} color=\"gray.500\">\n <PiCaretLeft />\n </Icon>\n </Button>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiGear } from 'react-icons/pi';\n\ninterface SettingsButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const SettingsButton: FC<SettingsButtonProps> = ({\n dataTestId,\n ...props\n}) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.50' }}\n color=\"gray.400\"\n variant=\"ghost\"\n size=\"sm\"\n {...props}\n >\n <PiGear />\n </IconButton>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCopy } from 'react-icons/pi';\n\ninterface CopyButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const CopyButton: FC<CopyButtonProps> = ({ dataTestId, ...props }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.100' }}\n color=\"gray.400\"\n variant=\"ghost\"\n {...props}\n >\n <PiCopy />\n </IconButton>\n );\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton/CopyButton';\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ninterface JsonCardProps {\n data: JsonValue;\n readonly?: boolean;\n onChange?: (data: JsonValue) => void;\n onBlur?: () => void;\n onCopy?: () => void;\n}\n\nexport const JsonCard: React.FC<JsonCardProps> = ({\n data,\n readonly,\n onChange,\n onBlur,\n onCopy,\n}) => {\n const [error, setError] = useState('');\n const externalText = JSON.stringify(data, null, 3);\n const [internalText, setInternalText] = useState(externalText);\n const isFocusedRef = useRef(false);\n\n const displayText = isFocusedRef.current ? internalText : externalText;\n\n const handleClick = useCallback(() => {\n void navigator.clipboard.writeText(displayText).then(() => {\n onCopy?.();\n });\n }, [displayText, onCopy]);\n\n const handleChange = useCallback(\n (value: string) => {\n setInternalText(value);\n\n try {\n const parsedData = JSON.parse(value) as JsonValue;\n setError('');\n onChange?.(parsedData);\n } catch (e) {\n console.error(e);\n setError('Invalid JSON');\n }\n },\n [onChange],\n );\n\n const handleFocus = useCallback(() => {\n isFocusedRef.current = true;\n setInternalText(externalText);\n }, [externalText]);\n\n const handleBlur = useCallback(() => {\n isFocusedRef.current = false;\n setInternalText(externalText);\n onBlur?.();\n }, [onBlur, externalText]);\n\n const hoverStyles = {\n '&:hover .copy-button': { visibility: 'visible' as const },\n };\n\n return (\n <Flex\n position=\"relative\"\n width=\"100%\"\n flex={1}\n direction=\"column\"\n gap=\"1rem\"\n css={hoverStyles}\n >\n <Box p={1} flex={1}>\n <CodeMirror\n value={displayText}\n extensions={[EditorView.lineWrapping, json()]}\n editable={!readonly}\n theme={githubLight}\n maxWidth=\"100%\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <CopyButton\n dataTestId=\"json-card-copy-button\"\n aria-label=\"\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n className=\"copy-button\"\n visibility=\"hidden\"\n onClick={handleClick}\n />\n </Box>\n <Flex\n height=\"40px\"\n paddingBottom=\"8px\"\n alignItems=\"flex-end\"\n backgroundColor=\"white\"\n width=\"100%\"\n position=\"sticky\"\n bottom={0}\n justifyContent=\"center\"\n >\n <Text color=\"gray\">{error}</Text>\n </Flex>\n </Flex>\n );\n};\n","export type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport enum JsonSchemaTypeName {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Object = 'object',\n Array = 'array',\n}\n\nexport type JsonPatch =\n | { op: 'add'; path: string; value: JsonValue }\n | { op: 'remove'; path: string }\n | { op: 'replace'; path: string; value: JsonValue }\n | { op: 'move'; from: string; path: string }\n | { op: 'copy'; from: string; path: string }\n | { op: 'test'; path: string; value: JsonValue };\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n\nexport enum SystemSchemaIds {\n RowId = 'urn:jsonschema:io:revisium:row-id-schema:1.0.0',\n RowCreatedId = 'urn:jsonschema:io:revisium:row-created-id-schema:1.0.0',\n RowVersionId = 'urn:jsonschema:io:revisium:row-version-id-schema:1.0.0',\n RowCreatedAt = 'urn:jsonschema:io:revisium:row-created-at-schema:1.0.0',\n RowPublishedAt = 'urn:jsonschema:io:revisium:row-published-at-schema:1.0.0',\n RowUpdatedAt = 'urn:jsonschema:io:revisium:row-updated-at-schema:1.0.0',\n RowHash = 'urn:jsonschema:io:revisium:row-hash-schema:1.0.0',\n RowSchemaHash = 'urn:jsonschema:io:revisium:row-schema-hash-schema:1.0.0',\n File = 'urn:jsonschema:io:revisium:file-schema:1.0.0',\n}\n\nexport const getLabelByRef = (ref: string): string => {\n const refMap: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\n [SystemSchemaIds.RowCreatedAt]: 'createdAt',\n [SystemSchemaIds.RowPublishedAt]: 'publishedAt',\n [SystemSchemaIds.RowUpdatedAt]: 'updatedAt',\n [SystemSchemaIds.RowHash]: 'hash',\n [SystemSchemaIds.RowSchemaHash]: 'schemaHash',\n [SystemSchemaIds.File]: 'File',\n };\n return refMap[ref] ?? ref;\n};\n","import { Button, Icon, Menu, Portal } from '@chakra-ui/react';\nimport React, { useMemo, useState } from 'react';\nimport {\n PiBracketsCurlyThin,\n PiCaretDownLight,\n PiLinkThin,\n PiTreeViewThin,\n} from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { ViewerSwitcherMode } from '../../schema-editor/types';\n\nconst modes: {\n mode: ViewerSwitcherMode;\n label: string;\n icon: React.ReactNode;\n dataTestId?: string;\n}[] = [\n {\n mode: ViewerSwitcherMode.Tree,\n label: 'Tree',\n icon: <PiTreeViewThin />,\n dataTestId: 'row-editor-mode-tree',\n },\n {\n mode: ViewerSwitcherMode.Json,\n label: 'JSON',\n icon: <PiBracketsCurlyThin />,\n dataTestId: 'row-editor-mode-json',\n },\n {\n mode: ViewerSwitcherMode.RefBy,\n label: 'References',\n icon: <PiLinkThin />,\n dataTestId: 'row-editor-mode-refs',\n },\n];\n\ninterface ViewerSwitcherProps {\n mode: ViewerSwitcherMode;\n availableRefByMode?: boolean;\n onChange?: (mode: ViewerSwitcherMode) => void;\n}\n\nexport const ViewerSwitcher: React.FC<ViewerSwitcherProps> = ({\n mode,\n onChange,\n availableRefByMode,\n}) => {\n const [menuOpen, setMenuOpen] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const currentModes = useMemo(\n () =>\n modes.filter(\n (item) =>\n !(item.mode === ViewerSwitcherMode.RefBy && !availableRefByMode),\n ),\n [availableRefByMode],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentMode = modes.find((m) => m.mode === mode) ?? modes[0]!;\n\n const handleValueChange = (details: { value: string }) => {\n const selectedMode = modes.find(\n (m) => m.mode === (details.value as ViewerSwitcherMode),\n );\n if (selectedMode) {\n onChange?.(selectedMode.mode);\n }\n };\n\n return (\n <Menu.Root onOpenChange={({ open }) => setMenuOpen(open)}>\n <Menu.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n height=\"2.5rem\"\n color=\"gray.500\"\n _hover={{ backgroundColor: 'gray.50', '& .caret': { opacity: 1 } }}\n _focus={{ outline: 'none', boxShadow: 'none' }}\n _focusVisible={{ outline: 'none', boxShadow: 'none' }}\n data-testid=\"view-mode-switcher\"\n px=\"8px\"\n gap=\"2px\"\n >\n <Tooltip\n open={!menuOpen && tooltipOpen}\n onOpenChange={(details) => setTooltipOpen(details.open)}\n content=\"View mode\"\n openDelay={500}\n closeDelay={0}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <Icon boxSize={4}>{currentMode.icon}</Icon>\n <Icon\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n >\n <PiCaretDownLight />\n </Icon>\n </span>\n </Tooltip>\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minWidth=\"140px\">\n <Menu.RadioItemGroup value={mode} onValueChange={handleValueChange}>\n {currentModes.map((item) => (\n <Menu.RadioItem\n key={item.mode}\n value={item.mode}\n data-testid={item.dataTestId}\n cursor=\"pointer\"\n >\n <Menu.ItemIndicator />\n <Icon boxSize={4} mr=\"8px\">\n {item.icon}\n </Icon>\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","export enum NodeType {\n Object = 'object',\n Array = 'array',\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Ref = 'ref',\n}\n","export interface NodeMetadata {\n title?: string;\n description?: string;\n deprecated?: boolean;\n}\n\nexport const EMPTY_METADATA: NodeMetadata = {};\n","import type { SchemaNode } from './SchemaNode';\nimport type { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\n\nclass NullNodeImpl implements SchemaNode {\n id(): string {\n return '';\n }\n\n name(): string {\n throw new Error('Null node has no name');\n }\n\n nodeType(): NodeType {\n throw new Error('Null node has no type');\n }\n\n metadata(): NodeMetadata {\n return EMPTY_METADATA;\n }\n\n property(): SchemaNode {\n return this;\n }\n\n items(): SchemaNode {\n return this;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return true;\n }\n\n ref(): string {\n throw new Error('Null node has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(): void {\n throw new Error('Cannot modify null node');\n }\n\n setMetadata(): void {\n throw new Error('Cannot modify null node');\n }\n\n addProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n removeProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n removePropertyById(): void {\n throw new Error('Cannot modify null node');\n }\n\n replaceProperty(): void {\n throw new Error('Cannot modify null node');\n }\n\n setItems(): void {\n throw new Error('Cannot modify null node');\n }\n\n setFormula(): void {\n throw new Error('Cannot modify null node');\n }\n\n setDefaultValue(): void {\n throw new Error('Cannot modify null node');\n }\n\n clone(): SchemaNode {\n return this;\n }\n}\n\nexport const NULL_NODE: SchemaNode = new NullNodeImpl();\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class ObjectNode implements SchemaNode {\n private _name: string;\n private _children: SchemaNode[];\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n children: SchemaNode[] = [],\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('ObjectNode requires nodeId');\n }\n this._name = name;\n this._children = children;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Object;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n property(name: string): SchemaNode {\n for (const prop of this._children) {\n if (prop.name() === name) {\n return prop;\n }\n }\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return this._children;\n }\n\n isObject(): boolean {\n return true;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('ObjectNode has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n addProperty(node: SchemaNode): void {\n this._children.push(node);\n }\n\n removeProperty(name: string): void {\n const index = this._children.findIndex((c) => c.name() === name);\n if (index >= 0) {\n this._children.splice(index, 1);\n }\n }\n\n removePropertyById(id: string): void {\n const index = this._children.findIndex((c) => c.id() === id);\n if (index >= 0) {\n this._children.splice(index, 1);\n }\n }\n\n replaceProperty(name: string, node: SchemaNode): void {\n const index = this._children.findIndex((c) => c.name() === name);\n if (index >= 0) {\n this._children[index] = node;\n }\n }\n\n setItems(): void {\n // No-op for ObjectNode\n }\n\n setFormula(): void {\n // No-op for ObjectNode\n }\n\n setDefaultValue(): void {\n // No-op for ObjectNode\n }\n\n setChildren(children: SchemaNode[]): void {\n this._children = children;\n }\n\n clone(): ObjectNode {\n const clonedChildren = this._children.map((child) => child.clone());\n return new ObjectNode(this._id, this._name, clonedChildren, {\n ...this._metadata,\n });\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class ArrayNode implements SchemaNode {\n private _name: string;\n private _items: SchemaNode;\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n items: SchemaNode,\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('ArrayNode requires nodeId');\n }\n this._name = name;\n this._items = items;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Array;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return this._items;\n }\n\n properties(): readonly SchemaNode[] {\n return [this._items];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return true;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('ArrayNode has no ref');\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n addProperty(): void {\n // No-op for ArrayNode\n }\n\n removeProperty(): void {\n // No-op for ArrayNode\n }\n\n removePropertyById(): void {\n // No-op for ArrayNode\n }\n\n replaceProperty(): void {\n // No-op for ArrayNode\n }\n\n setItems(node: SchemaNode): void {\n this._items = node;\n }\n\n setFormula(): void {\n // No-op for ArrayNode\n }\n\n setDefaultValue(): void {\n // No-op for ArrayNode\n }\n\n clone(): ArrayNode {\n return new ArrayNode(this._id, this._name, this._items.clone(), {\n ...this._metadata,\n });\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport type StringFormat = 'date-time' | 'date' | 'time' | 'email' | 'regex';\n\nexport type ContentMediaType =\n | 'text/plain'\n | 'text/markdown'\n | 'text/html'\n | 'application/json'\n | 'application/schema+json'\n | 'application/yaml';\n\nexport interface StringNodeOptions {\n defaultValue?: string;\n foreignKey?: string;\n format?: StringFormat;\n contentMediaType?: ContentMediaType;\n enumValues?: string[];\n formula?: Formula;\n}\n\nexport class StringNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: string | undefined;\n private _foreignKey: string | undefined;\n private _format: StringFormat | undefined;\n private _contentMediaType: ContentMediaType | undefined;\n private _enumValues: string[] | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: StringNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('StringNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._foreignKey = options.foreignKey;\n this._format = options.format;\n this._contentMediaType = options.contentMediaType;\n this._enumValues = options.enumValues;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.String;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): string | undefined {\n return this._defaultValue;\n }\n\n foreignKey(): string | undefined {\n return this._foreignKey;\n }\n\n format(): StringFormat | undefined {\n return this._format;\n }\n\n contentMediaType(): ContentMediaType | undefined {\n return this._contentMediaType;\n }\n\n enumValues(): string[] | undefined {\n return this._enumValues;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('StringNode has no ref');\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: string | undefined): void {\n this._defaultValue = value;\n }\n\n setForeignKey(value: string | undefined): void {\n this._foreignKey = value;\n }\n\n setFormat(value: StringFormat | undefined): void {\n this._format = value;\n }\n\n setContentMediaType(value: ContentMediaType | undefined): void {\n this._contentMediaType = value;\n }\n\n setEnumValues(values: string[] | undefined): void {\n this._enumValues = values;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for StringNode\n }\n\n removeProperty(): void {\n // No-op for StringNode\n }\n\n removePropertyById(): void {\n // No-op for StringNode\n }\n\n replaceProperty(): void {\n // No-op for StringNode\n }\n\n setItems(): void {\n // No-op for StringNode\n }\n\n clone(): StringNode {\n return new StringNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n foreignKey: this._foreignKey,\n format: this._format,\n contentMediaType: this._contentMediaType,\n enumValues: this._enumValues ? [...this._enumValues] : undefined,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport interface NumberNodeOptions {\n defaultValue?: number;\n formula?: Formula;\n}\n\nexport class NumberNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: number | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: NumberNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('NumberNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Number;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): number | undefined {\n return this._defaultValue;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('NumberNode has no ref');\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: number | undefined): void {\n this._defaultValue = value;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for NumberNode\n }\n\n removeProperty(): void {\n // No-op for NumberNode\n }\n\n removePropertyById(): void {\n // No-op for NumberNode\n }\n\n replaceProperty(): void {\n // No-op for NumberNode\n }\n\n setItems(): void {\n // No-op for NumberNode\n }\n\n clone(): NumberNode {\n return new NumberNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\nimport type { Formula } from '../formula';\n\nexport interface BooleanNodeOptions {\n defaultValue?: boolean;\n formula?: Formula;\n}\n\nexport class BooleanNode implements SchemaNode {\n private _name: string;\n private _metadata: NodeMetadata;\n private _defaultValue: boolean | undefined;\n private _formula: Formula | undefined;\n\n constructor(\n private readonly _id: string,\n name: string,\n options: BooleanNodeOptions = {},\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('BooleanNode requires nodeId');\n }\n this._name = name;\n this._metadata = metadata;\n this._defaultValue = options.defaultValue;\n this._formula = options.formula;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Boolean;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n defaultValue(): boolean | undefined {\n return this._defaultValue;\n }\n\n formula(): Formula | undefined {\n return this._formula;\n }\n\n hasFormula(): boolean {\n return this._formula !== undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return true;\n }\n\n isRef(): boolean {\n return false;\n }\n\n isNull(): boolean {\n return false;\n }\n\n ref(): string {\n throw new Error('BooleanNode has no ref');\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setDefaultValue(value: boolean | undefined): void {\n this._defaultValue = value;\n }\n\n setFormula(formula: Formula | undefined): void {\n this._formula = formula;\n }\n\n addProperty(): void {\n // No-op for BooleanNode\n }\n\n removeProperty(): void {\n // No-op for BooleanNode\n }\n\n removePropertyById(): void {\n // No-op for BooleanNode\n }\n\n replaceProperty(): void {\n // No-op for BooleanNode\n }\n\n setItems(): void {\n // No-op for BooleanNode\n }\n\n clone(): BooleanNode {\n return new BooleanNode(\n this._id,\n this._name,\n {\n defaultValue: this._defaultValue,\n formula: this._formula,\n },\n { ...this._metadata },\n );\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from './SchemaNode';\nimport { NodeType } from './NodeType';\nimport type { NodeMetadata } from './NodeMetadata';\nimport { EMPTY_METADATA } from './NodeMetadata';\nimport { NULL_NODE } from './NullNode';\n\nexport class RefNode implements SchemaNode {\n private _name: string;\n private _ref: string;\n private _metadata: NodeMetadata;\n\n constructor(\n private readonly _id: string,\n name: string,\n ref: string,\n metadata: NodeMetadata = EMPTY_METADATA,\n ) {\n if (!_id) {\n throw new Error('RefNode requires nodeId');\n }\n if (!ref) {\n throw new Error('RefNode requires ref');\n }\n this._name = name;\n this._ref = ref;\n this._metadata = metadata;\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n id(): string {\n return this._id;\n }\n\n name(): string {\n return this._name;\n }\n\n nodeType(): NodeType {\n return NodeType.Ref;\n }\n\n metadata(): NodeMetadata {\n return this._metadata;\n }\n\n ref(): string {\n return this._ref;\n }\n\n formula(): undefined {\n return undefined;\n }\n\n hasFormula(): boolean {\n return false;\n }\n\n defaultValue(): undefined {\n return undefined;\n }\n\n foreignKey(): undefined {\n return undefined;\n }\n\n property(): SchemaNode {\n return NULL_NODE;\n }\n\n items(): SchemaNode {\n return NULL_NODE;\n }\n\n properties(): readonly SchemaNode[] {\n return [];\n }\n\n isObject(): boolean {\n return false;\n }\n\n isArray(): boolean {\n return false;\n }\n\n isPrimitive(): boolean {\n return false;\n }\n\n isRef(): boolean {\n return true;\n }\n\n isNull(): boolean {\n return false;\n }\n\n setName(name: string): void {\n this._name = name;\n }\n\n setMetadata(meta: NodeMetadata): void {\n this._metadata = meta;\n }\n\n setRef(ref: string): void {\n this._ref = ref;\n }\n\n addProperty(): void {\n // No-op for RefNode\n }\n\n removeProperty(): void {\n // No-op for RefNode\n }\n\n removePropertyById(): void {\n // No-op for RefNode\n }\n\n replaceProperty(): void {\n // No-op for RefNode\n }\n\n setItems(): void {\n // No-op for RefNode\n }\n\n setFormula(): void {\n // No-op for RefNode\n }\n\n setDefaultValue(): void {\n // No-op for RefNode\n }\n\n clone(): RefNode {\n return new RefNode(this._id, this._name, this._ref, { ...this._metadata });\n }\n}\n","import { nanoid } from 'nanoid';\nimport { StringNode, type ContentMediaType } from './StringNode';\nimport { NumberNode } from './NumberNode';\nimport { BooleanNode } from './BooleanNode';\nimport { ObjectNode } from './ObjectNode';\nimport { ArrayNode } from './ArrayNode';\nimport { RefNode } from './RefNode';\nimport type { SchemaNode } from './SchemaNode';\n\nexport interface StringNodeFactoryOptions {\n foreignKey?: string;\n contentMediaType?: ContentMediaType;\n}\n\nexport interface RefNodeOptions {\n $ref: string;\n}\n\nexport class NodeFactory {\n static string(name: string, options?: StringNodeFactoryOptions): StringNode {\n const node = new StringNode(nanoid(), name);\n if (options?.foreignKey !== undefined) {\n node.setForeignKey(options.foreignKey);\n }\n if (options?.contentMediaType !== undefined) {\n node.setContentMediaType(options.contentMediaType);\n }\n return node;\n }\n\n static number(name: string): NumberNode {\n return new NumberNode(nanoid(), name);\n }\n\n static boolean(name: string): BooleanNode {\n return new BooleanNode(nanoid(), name);\n }\n\n static object(name: string, children: SchemaNode[] = []): ObjectNode {\n return new ObjectNode(nanoid(), name, children);\n }\n\n static array(name: string, items: SchemaNode): ArrayNode {\n return new ArrayNode(nanoid(), name, items);\n }\n\n static ref(name: string, options: RefNodeOptions): RefNode {\n return new RefNode(nanoid(), name, options.$ref);\n }\n}\n","import type { PathSegment } from './types';\n\nexport class PropertySegment implements PathSegment {\n constructor(private readonly name: string) {}\n\n isProperty(): boolean {\n return true;\n }\n\n isItems(): boolean {\n return false;\n }\n\n propertyName(): string {\n return this.name;\n }\n\n equals(other: PathSegment): boolean {\n return other.isProperty() && other.propertyName() === this.name;\n }\n}\n\nexport class ItemsSegment implements PathSegment {\n isProperty(): boolean {\n return false;\n }\n\n isItems(): boolean {\n return true;\n }\n\n propertyName(): string {\n throw new Error('Items segment has no property name');\n }\n\n equals(other: PathSegment): boolean {\n return other.isItems();\n }\n}\n","import type { Path, PathSegment } from './types';\nimport { PropertySegment, ItemsSegment } from './PathSegment';\n\nclass PathImpl implements Path {\n constructor(private readonly segs: readonly PathSegment[]) {}\n\n segments(): readonly PathSegment[] {\n return this.segs;\n }\n\n asJsonPointer(): string {\n return this.segs\n .map((seg) =>\n seg.isProperty() ? `/properties/${seg.propertyName()}` : '/items',\n )\n .join('');\n }\n\n asSimple(): string {\n const parts: string[] = [];\n\n for (const seg of this.segs) {\n if (seg.isProperty()) {\n parts.push(seg.propertyName());\n } else if (seg.isItems() && parts.length > 0) {\n parts[parts.length - 1] += '[*]';\n }\n }\n\n return parts.join('.');\n }\n\n parent(): Path {\n if (this.segs.length <= 1) {\n return EMPTY_PATH;\n }\n return new PathImpl(this.segs.slice(0, -1));\n }\n\n child(name: string): Path {\n return new PathImpl([...this.segs, new PropertySegment(name)]);\n }\n\n childItems(): Path {\n return new PathImpl([...this.segs, new ItemsSegment()]);\n }\n\n equals(other: Path): boolean {\n const otherSegs = other.segments();\n if (this.segs.length !== otherSegs.length) {\n return false;\n }\n for (let i = 0; i < this.segs.length; i++) {\n const a = this.segs[i];\n const b = otherSegs[i];\n if (!a || !b || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n\n isEmpty(): boolean {\n return this.segs.length === 0;\n }\n\n length(): number {\n return this.segs.length;\n }\n\n isChildOf(parent: Path): boolean {\n const parentSegs = parent.segments();\n if (this.segs.length <= parentSegs.length) {\n return false;\n }\n for (let i = 0; i < parentSegs.length; i++) {\n const a = this.segs[i];\n const b = parentSegs[i];\n if (!a || !b || !a.equals(b)) {\n return false;\n }\n }\n return true;\n }\n}\n\nexport const EMPTY_PATH: Path = new PathImpl([]);\n\nexport function createPath(segments: readonly PathSegment[]): Path {\n return segments.length === 0 ? EMPTY_PATH : new PathImpl(segments);\n}\n","import type { Path, PathSegment } from './types';\nimport { createPath } from './Path';\nimport { PropertySegment, ItemsSegment } from './PathSegment';\n\nexport function jsonPointerToSegments(pointer: string): PathSegment[] {\n if (pointer === '' || pointer === '/') {\n return [];\n }\n\n const parts = pointer.split('/').filter(Boolean);\n const segments: PathSegment[] = [];\n\n let i = 0;\n while (i < parts.length) {\n const part = parts[i];\n if (part === 'properties') {\n if (i + 1 < parts.length) {\n const name = parts[i + 1];\n if (name !== undefined) {\n segments.push(new PropertySegment(name));\n }\n i += 2;\n } else {\n i += 1;\n }\n } else if (part === 'items') {\n segments.push(new ItemsSegment());\n i += 1;\n } else {\n throw new Error(`Invalid path segment: ${part} in path ${pointer}`);\n }\n }\n\n return segments;\n}\n\nexport function jsonPointerToPath(pointer: string): Path {\n return createPath(jsonPointerToSegments(pointer));\n}\n\nexport function jsonPointerToSimplePath(pointer: string): string {\n return jsonPointerToPath(pointer).asSimple();\n}\n","export interface FormulaDependency {\n targetNodeId(): string;\n}\n\nexport class ResolvedDependency implements FormulaDependency {\n constructor(private readonly nodeId: string) {\n if (!nodeId) {\n throw new Error('FormulaDependency requires targetNodeId');\n }\n }\n\n targetNodeId(): string {\n return this.nodeId;\n }\n}\n","export class FormulaError extends Error {\n constructor(\n message: string,\n private readonly nodeId: string,\n private readonly details?: string,\n ) {\n super(message);\n this.name = 'FormulaError';\n }\n\n formulaNodeId(): string {\n return this.nodeId;\n }\n\n errorDetails(): string | undefined {\n return this.details;\n }\n}\n","import { parseFormula, type ASTNode } from '@revisium/formula';\nimport type { Path } from '../../path';\nimport { EMPTY_PATH } from '../../path';\n\nconst ARRAY_NOTATION_REGEX = /^([^[]+)\\[(?:\\d+|\\*)?\\]$/;\n\nexport class RelativePath {\n constructor(\n private readonly basePath: Path,\n private readonly relativePath: string,\n ) {}\n\n resolve(): Path | null {\n let ast: ASTNode;\n try {\n const parseResult = parseFormula(this.relativePath);\n ast = parseResult.ast;\n } catch {\n return null;\n }\n\n return this.astToPath(ast, this.basePath);\n }\n\n private astToPath(ast: ASTNode, base: Path): Path | null {\n switch (ast.type) {\n case 'Identifier':\n return base.child(ast.name);\n\n case 'MemberExpression': {\n const objectPath = this.astToPath(ast.object, base);\n if (!objectPath) {\n return null;\n }\n return objectPath.child(ast.property);\n }\n\n case 'IndexExpression':\n case 'WildcardExpression': {\n const objectPath = this.astToPath(ast.object, base);\n if (!objectPath) {\n return null;\n }\n return objectPath.childItems();\n }\n\n case 'RelativePath':\n return this.resolveRelativePathString(base, ast.path);\n\n case 'RootPath':\n return this.resolveRootPath(ast.path);\n\n default:\n return null;\n }\n }\n\n private resolveRelativePathString(base: Path, path: string): Path | null {\n const parts = path.split('/');\n let result = base;\n\n for (const part of parts) {\n if (part === '..') {\n if (result.isEmpty()) {\n return null;\n }\n result = result.parent();\n } else if (part === '.') {\n continue;\n } else if (part) {\n result = result.child(part);\n }\n }\n\n return result;\n }\n\n private resolveRootPath(rootPath: string): Path | null {\n const path = rootPath.startsWith('/') ? rootPath.slice(1) : rootPath;\n if (!path) {\n return EMPTY_PATH;\n }\n\n try {\n return this.parseFormulaPath(path);\n } catch {\n return null;\n }\n }\n\n private parseFormulaPath(formulaPath: string): Path {\n const parts = formulaPath.split('.');\n let result: Path = EMPTY_PATH;\n\n for (const part of parts) {\n if (!part) {\n throw new Error(`Invalid path: empty segment`);\n }\n\n const match = ARRAY_NOTATION_REGEX.exec(part);\n if (match?.[1]) {\n result = result.child(match[1]).childItems();\n } else {\n result = result.child(part);\n }\n }\n\n return result;\n }\n}\n","import { parseFormula, type ASTNode } from '@revisium/formula';\nimport type { Formula } from '../core/Formula';\nimport type { FormulaDependency } from '../core/FormulaDependency';\nimport { ResolvedDependency } from '../core/FormulaDependency';\nimport { FormulaError } from '../core/FormulaError';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport type { Path } from '../../path';\nimport { RelativePath } from './RelativePath';\n\nexport class ParsedFormula implements Formula {\n private readonly astNode: ASTNode;\n private readonly deps: readonly FormulaDependency[];\n private readonly astPathToNodeId: ReadonlyMap<string, string>;\n\n constructor(tree: NodeTree, formulaNodeId: string, expression: string) {\n const parseResult = parseFormula(expression);\n this.astNode = parseResult.ast;\n\n const formulaPath = tree.pathOf(formulaNodeId);\n if (formulaPath.isEmpty() && tree.root().id() !== formulaNodeId) {\n throw new FormulaError('Formula node not found in tree', formulaNodeId);\n }\n\n const deps: FormulaDependency[] = [];\n const astPathToNodeId = new Map<string, string>();\n\n for (const depPath of parseResult.dependencies) {\n const targetNodeId = this.resolveDependencyPath(\n tree,\n formulaPath,\n depPath,\n );\n if (!targetNodeId) {\n throw new FormulaError(\n `Cannot resolve formula dependency: ${depPath}`,\n formulaNodeId,\n 'Path not found in schema',\n );\n }\n if (targetNodeId === formulaNodeId) {\n throw new FormulaError(\n 'Formula cannot reference itself',\n formulaNodeId,\n 'Self-reference detected',\n );\n }\n deps.push(new ResolvedDependency(targetNodeId));\n astPathToNodeId.set(depPath, targetNodeId);\n }\n\n this.deps = deps;\n this.astPathToNodeId = astPathToNodeId;\n }\n\n version(): number {\n return 1;\n }\n\n ast(): ASTNode {\n return this.astNode;\n }\n\n dependencies(): readonly FormulaDependency[] {\n return this.deps;\n }\n\n getNodeIdForAstPath(astPath: string): string | null {\n return this.astPathToNodeId.get(astPath) ?? null;\n }\n\n astPaths(): readonly string[] {\n return Array.from(this.astPathToNodeId.keys());\n }\n\n private resolveDependencyPath(\n tree: NodeTree,\n formulaPath: Path,\n depPath: string,\n ): string | null {\n const basePath = this.getFormulaBasePath(formulaPath);\n const relativePath = new RelativePath(basePath, depPath);\n const targetPath = relativePath.resolve();\n\n if (!targetPath) {\n return null;\n }\n\n const targetNode = tree.nodeAt(targetPath);\n if (targetNode.isNull()) {\n return null;\n }\n\n return targetNode.id();\n }\n\n private getFormulaBasePath(formulaPath: Path): Path {\n let basePath = formulaPath;\n\n while (!basePath.isEmpty()) {\n const segs = basePath.segments();\n const lastSeg = segs[segs.length - 1];\n basePath = basePath.parent();\n if (!lastSeg?.isItems()) {\n break;\n }\n }\n\n return basePath;\n }\n}\n","import type { Path, PathSegment } from '../../path';\n\nexport class RelativePathBuilder {\n public buildWithArrayNotation(fromPath: Path, toPath: Path): string {\n const fromSegments = fromPath.parent().segments();\n const toSegments = toPath.segments();\n\n const commonLength = this.findCommonPrefixLength(fromSegments, toSegments);\n const upCount = fromSegments.length - commonLength;\n\n const parts = this.buildPartsWithArrayNotation(\n upCount,\n toSegments,\n commonLength,\n );\n\n return this.formatPartsWithArrayNotation(parts, toSegments);\n }\n\n private findCommonPrefixLength(\n fromSegments: readonly PathSegment[],\n toSegments: readonly PathSegment[],\n ): number {\n const minLen = Math.min(fromSegments.length, toSegments.length);\n let commonPrefixLen = 0;\n\n for (let i = 0; i < minLen; i++) {\n const fromSeg = fromSegments[i];\n const toSeg = toSegments[i];\n\n if (!fromSeg || !toSeg) {\n break;\n }\n\n if (fromSeg.isItems() && toSeg.isItems()) {\n commonPrefixLen++;\n } else if (\n fromSeg.isProperty() &&\n toSeg.isProperty() &&\n fromSeg.propertyName() === toSeg.propertyName()\n ) {\n commonPrefixLen++;\n } else {\n break;\n }\n }\n\n return commonPrefixLen;\n }\n\n private buildPartsWithArrayNotation(\n upCount: number,\n toSegments: readonly PathSegment[],\n startIndex: number,\n ): string[] {\n const parts: string[] = [];\n\n for (let i = 0; i < upCount; i++) {\n parts.push('..');\n }\n\n for (let i = startIndex; i < toSegments.length; i++) {\n const seg = toSegments[i];\n if (seg) {\n if (seg.isProperty()) {\n parts.push(seg.propertyName());\n } else if (seg.isItems() && parts.length > 0) {\n const lastPart = parts.at(-1);\n if (lastPart && lastPart !== '..') {\n parts[parts.length - 1] = lastPart + '[*]';\n }\n }\n }\n }\n\n return parts;\n }\n\n private formatPartsWithArrayNotation(\n parts: string[],\n toSegments: readonly PathSegment[],\n ): string {\n if (parts.length === 0) {\n const lastSeg = toSegments.at(-1);\n if (lastSeg?.isProperty()) {\n return lastSeg.propertyName();\n }\n return '';\n }\n\n if (parts[0] === '..') {\n return parts.join('/');\n }\n\n return parts.join('.');\n }\n}\n","import { serializeAst, replaceDependencies } from '@revisium/formula';\nimport type { Formula } from '../core/Formula';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport { FormulaError } from '../core/FormulaError';\nimport type { XFormula } from '../../schema/JsonSchema';\nimport { RelativePathBuilder } from './RelativePathBuilder';\n\nexport class FormulaSerializer {\n private readonly relativePathBuilder = new RelativePathBuilder();\n\n constructor(\n private readonly tree: NodeTree,\n private readonly formulaNodeId: string,\n private readonly formula: Formula,\n ) {}\n\n static toXFormula(\n tree: NodeTree,\n formulaNodeId: string,\n formula: Formula,\n ): XFormula {\n const serializer = new FormulaSerializer(tree, formulaNodeId, formula);\n return {\n version: 1,\n expression: serializer.serialize(),\n };\n }\n\n serialize(): string {\n const replacements = this.buildPathReplacements();\n const updatedAst = replaceDependencies(this.formula.ast(), replacements);\n return serializeAst(updatedAst);\n }\n\n private buildPathReplacements(): Record<string, string> {\n const replacements: Record<string, string> = {};\n const formulaPath = this.tree.pathOf(this.formulaNodeId);\n\n for (const astPath of this.formula.astPaths()) {\n const nodeId = this.formula.getNodeIdForAstPath(astPath);\n if (!nodeId) {\n continue;\n }\n\n const targetNode = this.tree.nodeById(nodeId);\n if (targetNode.isNull()) {\n throw new FormulaError(\n `Cannot serialize formula: target node not found`,\n this.formulaNodeId,\n `Target nodeId: ${nodeId}`,\n );\n }\n\n const targetPath = this.tree.pathOf(nodeId);\n const newPath = this.relativePathBuilder.buildWithArrayNotation(\n formulaPath,\n targetPath,\n );\n\n if (this.needsReplacement(astPath, newPath)) {\n replacements[astPath] = newPath;\n }\n }\n\n return replacements;\n }\n\n private needsReplacement(astPath: string, newPath: string): boolean {\n if (astPath === newPath) {\n return false;\n }\n\n const normalizedAstPath = this.normalizeArrayNotation(astPath);\n const normalizedNewPath = this.normalizeArrayNotation(newPath);\n\n return normalizedAstPath !== normalizedNewPath;\n }\n\n private normalizeArrayNotation(path: string): string {\n return path.replaceAll(/\\[\\d+\\]/g, '[*]');\n }\n}\n","import { makeAutoObservable, observable } from 'mobx';\nimport type { Formula } from '../core/Formula';\n\nexport interface FormulaDependent {\n formulaNodeId: string;\n fieldName: string;\n expression: string;\n}\n\nexport class FormulaDependencyIndex {\n private readonly dependentsMap = observable.map<string, Set<string>>();\n private readonly formulasByNodeId = observable.map<string, Formula>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n registerFormula(formulaNodeId: string, formula: Formula): void {\n this.unregisterFormula(formulaNodeId);\n\n this.formulasByNodeId.set(formulaNodeId, formula);\n\n for (const dep of formula.dependencies()) {\n const targetId = dep.targetNodeId();\n let dependents = this.dependentsMap.get(targetId);\n if (!dependents) {\n dependents = observable.set<string>();\n this.dependentsMap.set(targetId, dependents);\n }\n dependents.add(formulaNodeId);\n }\n }\n\n unregisterFormula(formulaNodeId: string): void {\n this.formulasByNodeId.delete(formulaNodeId);\n\n for (const [targetId, dependents] of this.dependentsMap) {\n dependents.delete(formulaNodeId);\n if (dependents.size === 0) {\n this.dependentsMap.delete(targetId);\n }\n }\n }\n\n getDependents(nodeId: string): readonly string[] {\n const dependents = this.dependentsMap.get(nodeId);\n return dependents ? Array.from(dependents) : [];\n }\n\n getFormula(nodeId: string): Formula | null {\n return this.formulasByNodeId.get(nodeId) ?? null;\n }\n\n clear(): void {\n this.dependentsMap.clear();\n this.formulasByNodeId.clear();\n }\n\n forEachFormula(callback: (nodeId: string, formula: Formula) => void): void {\n for (const [nodeId, formula] of this.formulasByNodeId) {\n callback(nodeId, formula);\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { Path } from '../path';\nimport { EMPTY_PATH } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\n\nexport class TreeNodeIndex {\n private readonly nodeIndex = new Map<string, SchemaNode>();\n private readonly pathIndex = new Map<string, Path>();\n\n public rebuild(rootNode: SchemaNode): void {\n this.nodeIndex.clear();\n this.pathIndex.clear();\n this.collectNodes(rootNode, EMPTY_PATH);\n }\n\n public getNode(id: string): SchemaNode {\n return this.nodeIndex.get(id) ?? NULL_NODE;\n }\n\n public getPath(id: string): Path {\n return this.pathIndex.get(id) ?? EMPTY_PATH;\n }\n\n public countNodes(): number {\n return this.nodeIndex.size;\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIndex.keys();\n }\n\n private collectNodes(node: SchemaNode, path: Path): void {\n if (node.isNull()) {\n return;\n }\n\n this.nodeIndex.set(node.id(), node);\n this.pathIndex.set(node.id(), path);\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectNodes(child, path.child(child.name()));\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectNodes(items, path.childItems());\n }\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { Path, PathSegment } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\n\nexport class TreeMutator {\n public setNodeAt(\n rootNode: SchemaNode,\n path: Path,\n newNode: SchemaNode,\n ): void {\n if (path.isEmpty()) {\n throw new Error('Cannot replace root node');\n }\n this.updateNodeAt(rootNode, path.segments(), 0, newNode);\n }\n\n public removeNodeAt(rootNode: SchemaNode, path: Path): void {\n if (path.isEmpty()) {\n throw new Error('Cannot remove root node');\n }\n this.removeNodeAtInternal(rootNode, path.segments(), 0);\n }\n\n public removeNodeAtInternal(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n ): void {\n const segment = segments[index];\n if (!segment) {\n return;\n }\n\n const isLastSegment = index === segments.length - 1;\n\n if (segment.isProperty()) {\n this.removePropertySegment(\n current,\n segment.propertyName(),\n segments,\n index,\n isLastSegment,\n );\n } else if (segment.isItems()) {\n this.removeItemsSegment(current, segments, index, isLastSegment);\n }\n }\n\n private removePropertySegment(\n current: SchemaNode,\n childName: string,\n segments: readonly PathSegment[],\n index: number,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.removeProperty(childName);\n return;\n }\n\n const existingChild = current.property(childName);\n if (!existingChild.isNull()) {\n this.removeNodeAtInternal(existingChild, segments, index + 1);\n }\n }\n\n private removeItemsSegment(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.setItems(NULL_NODE);\n return;\n }\n\n const existingItems = current.items();\n if (!existingItems.isNull()) {\n this.removeNodeAtInternal(existingItems, segments, index + 1);\n }\n }\n\n private updateNodeAt(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n ): void {\n if (index >= segments.length) {\n return;\n }\n\n const segment = segments[index];\n if (!segment) {\n return;\n }\n\n const isLastSegment = index === segments.length - 1;\n\n if (segment.isProperty()) {\n this.updatePropertySegment(\n current,\n segment.propertyName(),\n segments,\n index,\n newNode,\n isLastSegment,\n );\n } else if (segment.isItems()) {\n this.updateItemsSegment(current, segments, index, newNode, isLastSegment);\n }\n }\n\n private updatePropertySegment(\n current: SchemaNode,\n childName: string,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n newNode.setName(childName);\n const existingChild = current.property(childName);\n if (existingChild.isNull()) {\n current.addProperty(newNode);\n } else {\n current.replaceProperty(childName, newNode);\n }\n return;\n }\n\n const existingChild = current.property(childName);\n if (!existingChild.isNull()) {\n this.updateNodeAt(existingChild, segments, index + 1, newNode);\n }\n }\n\n private updateItemsSegment(\n current: SchemaNode,\n segments: readonly PathSegment[],\n index: number,\n newNode: SchemaNode,\n isLastSegment: boolean,\n ): void {\n if (isLastSegment) {\n current.setItems(newNode);\n return;\n }\n\n const existingItems = current.items();\n if (!existingItems.isNull()) {\n this.updateNodeAt(existingItems, segments, index + 1, newNode);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { NodeTree } from './NodeTree';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { Path, PathSegment } from '../path';\nimport { NULL_NODE } from '../node/NullNode';\nimport {\n FormulaDependencyIndex,\n FormulaSerializer,\n type FormulaDependent,\n type Formula,\n} from '../formula';\nimport { TreeNodeIndex } from './TreeNodeIndex';\nimport { TreeMutator } from './TreeMutator';\n\nexport class SchemaTree implements NodeTree {\n private readonly nodeIndex: TreeNodeIndex;\n private readonly mutator: TreeMutator;\n private readonly formulaIndex: FormulaDependencyIndex;\n private _rootNode: SchemaNode;\n\n constructor(rootNode: SchemaNode) {\n this._rootNode = rootNode;\n this.nodeIndex = new TreeNodeIndex();\n this.mutator = new TreeMutator();\n this.formulaIndex = new FormulaDependencyIndex();\n this.rebuildIndex();\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public root(): SchemaNode {\n return this._rootNode;\n }\n\n public countNodes(): number {\n return this.nodeIndex.countNodes();\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIndex.nodeIds();\n }\n\n public nodeById(id: string): SchemaNode {\n return this.nodeIndex.getNode(id);\n }\n\n public pathOf(id: string): Path {\n return this.nodeIndex.getPath(id);\n }\n\n public nodeAt(path: Path): SchemaNode {\n if (path.isEmpty()) {\n return this._rootNode;\n }\n\n let current: SchemaNode = this._rootNode;\n for (const segment of path.segments()) {\n if (segment.isProperty()) {\n current = current.property(segment.propertyName());\n } else {\n current = current.items();\n }\n if (current.isNull()) {\n return NULL_NODE;\n }\n }\n return current;\n }\n\n public replaceRoot(newRoot: SchemaNode): void {\n this._rootNode = newRoot;\n this.rebuildIndex();\n }\n\n public setNodeAt(path: Path, node: SchemaNode): void {\n this.mutator.setNodeAt(this._rootNode, path, node);\n this.rebuildIndex();\n }\n\n public removeNodeAt(path: Path): void {\n this.mutator.removeNodeAt(this._rootNode, path);\n this.rebuildIndex();\n }\n\n public renameNode(id: string, newName: string): void {\n const node = this.nodeById(id);\n if (node.isNull()) {\n return;\n }\n\n node.setName(newName);\n this.rebuildIndex();\n }\n\n public addChildTo(parentId: string, node: SchemaNode): void {\n const parent = this.nodeById(parentId);\n if (parent.isNull() || !parent.isObject()) {\n return;\n }\n parent.addProperty(node);\n this.rebuildIndex();\n }\n\n public canMoveNode(fromNodeId: string, toNodeId: string): boolean {\n if (fromNodeId === toNodeId) {\n return false;\n }\n const fromNode = this.nodeById(fromNodeId);\n const toNode = this.nodeById(toNodeId);\n if (fromNode.isNull() || toNode.isNull()) {\n return false;\n }\n if (!toNode.isObject()) {\n return false;\n }\n const toPath = this.pathOf(toNodeId);\n const fromPath = this.pathOf(fromNodeId);\n if (toPath.equals(fromPath) || toPath.isChildOf(fromPath)) {\n return false;\n }\n if (fromPath.parent().equals(toPath)) {\n return false;\n }\n if (this.isMovingOutOfArray(fromPath, toPath)) {\n return false;\n }\n return true;\n }\n\n private isMovingOutOfArray(fromPath: Path, toPath: Path): boolean {\n const fromSegments = fromPath.segments();\n const toSegments = toPath.segments();\n\n for (let i = 0; i < fromSegments.length; i++) {\n const fromSeg = fromSegments[i];\n if (fromSeg?.isItems()) {\n if (!toSegments[i]?.isItems()) {\n return true;\n }\n if (this.hasPathPrefixMismatch(fromSegments, toSegments, i)) {\n return true;\n }\n }\n }\n return false;\n }\n\n private hasPathPrefixMismatch(\n fromSegments: readonly PathSegment[],\n toSegments: readonly PathSegment[],\n endIndex: number,\n ): boolean {\n for (let j = 0; j < endIndex; j++) {\n const fromSeg = fromSegments[j];\n const toSeg = toSegments[j];\n if (!fromSeg || !toSeg || !fromSeg.equals(toSeg)) {\n return true;\n }\n }\n return false;\n }\n\n public hasValidDropTarget(nodeId: string): boolean {\n return this.findValidDropTarget(this._rootNode, nodeId);\n }\n\n private findValidDropTarget(current: SchemaNode, nodeId: string): boolean {\n if (current.isObject() && this.canMoveNode(nodeId, current.id())) {\n return true;\n }\n\n if (current.isObject()) {\n for (const child of current.properties()) {\n if (this.findValidDropTarget(child, nodeId)) {\n return true;\n }\n }\n }\n\n if (current.isArray()) {\n const items = current.items();\n if (!items.isNull() && this.findValidDropTarget(items, nodeId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public moveNode(nodeId: string, targetParentId: string): void {\n const node = this.nodeById(nodeId);\n const targetParent = this.nodeById(targetParentId);\n if (node.isNull() || targetParent.isNull() || !targetParent.isObject()) {\n return;\n }\n\n const sourcePath = this.pathOf(nodeId);\n if (sourcePath.isEmpty()) {\n return;\n }\n\n this.mutator.removeNodeAtInternal(this._rootNode, sourcePath.segments(), 0);\n targetParent.addProperty(node);\n this.rebuildIndex();\n }\n\n public registerFormula(formulaNodeId: string, formula: Formula): void {\n const node = this.nodeById(formulaNodeId);\n if (node.isNull()) {\n return;\n }\n this.formulaIndex.registerFormula(formulaNodeId, formula);\n }\n\n public unregisterFormula(formulaNodeId: string): void {\n this.formulaIndex.unregisterFormula(formulaNodeId);\n }\n\n public getFormulaDependents(nodeId: string): FormulaDependent[] {\n const result: FormulaDependent[] = [];\n this.collectFormulaDependents(nodeId, result, new Set());\n return result;\n }\n\n public getDirectFormulaDependents(nodeId: string): FormulaDependent[] {\n const result: FormulaDependent[] = [];\n this.collectDirectDependents(nodeId, result, new Set());\n return result;\n }\n\n public hasFormulaDependents(nodeId: string): boolean {\n return this.getFormulaDependents(nodeId).length > 0;\n }\n\n public getFormulaByNodeId(nodeId: string): Formula | null {\n return this.formulaIndex.getFormula(nodeId);\n }\n\n public clearFormulaIndex(): void {\n this.formulaIndex.clear();\n }\n\n public forEachFormula(callback: (nodeId: string) => void): void {\n this.formulaIndex.forEachFormula(callback);\n }\n\n private rebuildIndex(): void {\n this.nodeIndex.rebuild(this._rootNode);\n }\n\n public clone(): SchemaTree {\n const clonedRoot = this._rootNode.clone();\n const clonedTree = new SchemaTree(clonedRoot);\n this.cloneFormulas(clonedTree);\n return clonedTree;\n }\n\n private cloneFormulas(targetTree: SchemaTree): void {\n this.formulaIndex.forEachFormula((nodeId) => {\n const targetNode = targetTree.nodeById(nodeId);\n const formula = targetNode.formula();\n if (!targetNode.isNull() && formula) {\n targetTree.registerFormula(nodeId, formula);\n }\n });\n }\n\n private collectFormulaDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n this.collectDirectDependents(nodeId, result, seen);\n this.collectChildDependents(nodeId, result, seen);\n }\n\n private collectDirectDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n const directDependentIds = this.formulaIndex.getDependents(nodeId);\n\n for (const formulaNodeId of directDependentIds) {\n if (seen.has(formulaNodeId)) {\n continue;\n }\n seen.add(formulaNodeId);\n\n const dependent = this.createFormulaDependent(formulaNodeId);\n if (dependent) {\n result.push(dependent);\n }\n }\n }\n\n private createFormulaDependent(\n formulaNodeId: string,\n ): FormulaDependent | null {\n const formulaNode = this.nodeById(formulaNodeId);\n const formula = this.formulaIndex.getFormula(formulaNodeId);\n\n if (formulaNode.isNull() || !formula) {\n return null;\n }\n\n const expression = new FormulaSerializer(\n this,\n formulaNodeId,\n formula,\n ).serialize();\n\n return {\n formulaNodeId,\n fieldName: formulaNode.name(),\n expression,\n };\n }\n\n private collectChildDependents(\n nodeId: string,\n result: FormulaDependent[],\n seen: Set<string>,\n ): void {\n const node = this.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectFormulaDependents(child.id(), result, seen);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectFormulaDependents(items.id(), result, seen);\n }\n }\n }\n}\n","import type { JsonSchemaType } from '../../schema/JsonSchema';\nimport type { TypeDescriptor } from './TypeDescriptor';\n\nexport class TypeRegistry {\n private readonly descriptors: Map<string, TypeDescriptor> = new Map();\n private readonly parseOrder: TypeDescriptor[] = [];\n\n register(descriptor: TypeDescriptor): void {\n if (this.descriptors.has(descriptor.type)) {\n throw new Error(`Type \"${descriptor.type}\" is already registered`);\n }\n this.descriptors.set(descriptor.type, descriptor);\n this.parseOrder.push(descriptor);\n }\n\n getDescriptor(type: string): TypeDescriptor | undefined {\n return this.descriptors.get(type);\n }\n\n findDescriptorForSchema(schema: JsonSchemaType): TypeDescriptor | undefined {\n for (const descriptor of this.parseOrder) {\n if (descriptor.canParse(schema)) {\n return descriptor;\n }\n }\n return undefined;\n }\n\n getAllDescriptors(): readonly TypeDescriptor[] {\n return this.parseOrder;\n }\n\n getTypes(): readonly string[] {\n return Array.from(this.descriptors.keys());\n }\n}\n","export interface TypeCapabilities {\n readonly hasChildren: boolean;\n readonly hasItems: boolean;\n readonly hasFormula: boolean;\n readonly isPrimitive: boolean;\n readonly isContainer: boolean;\n}\n\nexport const PRIMITIVE_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: false,\n hasFormula: true,\n isPrimitive: true,\n isContainer: false,\n};\n\nexport const OBJECT_CAPABILITIES: TypeCapabilities = {\n hasChildren: true,\n hasItems: false,\n hasFormula: false,\n isPrimitive: false,\n isContainer: true,\n};\n\nexport const ARRAY_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: true,\n hasFormula: false,\n isPrimitive: false,\n isContainer: true,\n};\n\nexport const REF_CAPABILITIES: TypeCapabilities = {\n hasChildren: false,\n hasItems: false,\n hasFormula: false,\n isPrimitive: false,\n isContainer: false,\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonStringSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport {\n StringNode,\n type StringNodeOptions,\n type StringFormat,\n type ContentMediaType,\n} from '../../node/StringNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isStringSchema(schema: JsonSchemaType): schema is JsonStringSchema {\n return 'type' in schema && schema.type === 'string';\n}\n\nexport const stringDescriptor: TypeDescriptor<JsonStringSchema, StringNode> = {\n type: 'string',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isStringSchema,\n\n parse(\n schema: JsonStringSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): StringNode {\n const options: StringNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n if (schema.foreignKey) {\n options.foreignKey = schema.foreignKey;\n }\n if (schema.format) {\n options.format = schema.format as StringFormat;\n }\n if (schema.contentMediaType) {\n options.contentMediaType = schema.contentMediaType as ContentMediaType;\n }\n if (schema.enum && schema.enum.length > 0) {\n options.enumValues = schema.enum;\n }\n\n const node = new StringNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: StringNode, context: SerializeContext): JsonStringSchema {\n const result: JsonStringSchema = {\n type: 'string',\n default: node.defaultValue() ?? '',\n };\n\n if (node.foreignKey()) {\n result.foreignKey = node.foreignKey();\n }\n if (node.format()) {\n result.format = node.format();\n }\n if (node.contentMediaType()) {\n result.contentMediaType = node.contentMediaType();\n }\n const enumValues = node.enumValues();\n if (enumValues && enumValues.length > 0) {\n result.enum = [...enumValues];\n }\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonStringSchema): string {\n return 'default' in schema ? schema.default : '';\n },\n\n parseDefaultValueString(valueStr: string): string {\n return valueStr;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonNumberSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { NumberNode, type NumberNodeOptions } from '../../node/NumberNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isNumberSchema(schema: JsonSchemaType): schema is JsonNumberSchema {\n return 'type' in schema && schema.type === 'number';\n}\n\nexport const numberDescriptor: TypeDescriptor<JsonNumberSchema, NumberNode> = {\n type: 'number',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isNumberSchema,\n\n parse(\n schema: JsonNumberSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): NumberNode {\n const options: NumberNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n\n const node = new NumberNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: NumberNode, context: SerializeContext): JsonNumberSchema {\n const result: JsonNumberSchema = {\n type: 'number',\n default: node.defaultValue() ?? 0,\n };\n\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonNumberSchema): number {\n return 'default' in schema ? schema.default : 0;\n },\n\n parseDefaultValueString(valueStr: string): number | undefined {\n if (!valueStr) {\n return undefined;\n }\n const num = Number(valueStr);\n if (!Number.isNaN(num)) {\n return num;\n }\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type {\n JsonBooleanSchema,\n JsonSchemaType,\n} from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { BooleanNode, type BooleanNodeOptions } from '../../node/BooleanNode';\nimport { PRIMITIVE_CAPABILITIES } from './TypeCapabilities';\n\nfunction isBooleanSchema(schema: JsonSchemaType): schema is JsonBooleanSchema {\n return 'type' in schema && schema.type === 'boolean';\n}\n\nexport const booleanDescriptor: TypeDescriptor<JsonBooleanSchema, BooleanNode> =\n {\n type: 'boolean',\n\n capabilities: PRIMITIVE_CAPABILITIES,\n\n canParse: isBooleanSchema,\n\n parse(\n schema: JsonBooleanSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): BooleanNode {\n const options: BooleanNodeOptions = {};\n\n if (schema.default !== undefined) {\n options.defaultValue = schema.default;\n }\n\n const node = new BooleanNode(context.generateId(), name, options);\n node.setMetadata(metadata);\n\n if (schema['x-formula']?.expression) {\n context.addPendingFormula(node.id(), schema['x-formula'].expression);\n }\n\n return node;\n },\n\n serialize(node: BooleanNode, context: SerializeContext): JsonBooleanSchema {\n const result: JsonBooleanSchema = {\n type: 'boolean',\n default: node.defaultValue() ?? false,\n };\n\n const formula = node.formula();\n if (formula) {\n result.readOnly = true;\n result['x-formula'] = context.serializeFormula(node.id(), formula);\n }\n\n return result;\n },\n\n getDefaultValue(schema: JsonBooleanSchema): boolean {\n return 'default' in schema ? schema.default : false;\n },\n\n parseDefaultValueString(valueStr: string): boolean | undefined {\n if (!valueStr) {\n return undefined;\n }\n const lower = valueStr.toLowerCase();\n if (lower === 'true') {\n return true;\n }\n if (lower === 'false') {\n return false;\n }\n return undefined;\n },\n };\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonObjectSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport type { SchemaNode } from '../../node/SchemaNode';\nimport { ObjectNode } from '../../node/ObjectNode';\nimport { OBJECT_CAPABILITIES } from './TypeCapabilities';\n\nfunction isObjectSchema(schema: JsonSchemaType): schema is JsonObjectSchema {\n return 'type' in schema && schema.type === 'object';\n}\n\nexport const objectDescriptor: TypeDescriptor<JsonObjectSchema, ObjectNode> = {\n type: 'object',\n\n capabilities: OBJECT_CAPABILITIES,\n\n canParse: isObjectSchema,\n\n parse(\n schema: JsonObjectSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): ObjectNode {\n const children: SchemaNode[] = [];\n\n const orderedKeys = schema.required ?? Object.keys(schema.properties);\n\n for (const propName of orderedKeys) {\n const propSchema = schema.properties[propName];\n if (propSchema) {\n children.push(context.parseNode(propSchema, propName));\n }\n }\n\n const node = new ObjectNode(context.generateId(), name, children);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: ObjectNode, context: SerializeContext): JsonObjectSchema {\n const properties: Record<string, JsonSchemaType> = {};\n const required: string[] = [];\n\n for (const child of node.properties()) {\n const childName = child.name();\n properties[childName] = context.serialize(child);\n required.push(childName);\n }\n\n return {\n type: 'object',\n required,\n properties,\n additionalProperties: false,\n };\n },\n\n getDefaultValue(_schema: JsonObjectSchema): Record<string, unknown> {\n return {};\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonArraySchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { ArrayNode } from '../../node/ArrayNode';\nimport { ARRAY_CAPABILITIES } from './TypeCapabilities';\n\nfunction isArraySchema(schema: JsonSchemaType): schema is JsonArraySchema {\n return 'type' in schema && schema.type === 'array';\n}\n\nexport const arrayDescriptor: TypeDescriptor<JsonArraySchema, ArrayNode> = {\n type: 'array',\n\n capabilities: ARRAY_CAPABILITIES,\n\n canParse: isArraySchema,\n\n parse(\n schema: JsonArraySchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): ArrayNode {\n const items = context.parseNode(schema.items, '');\n const node = new ArrayNode(context.generateId(), name, items);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: ArrayNode, context: SerializeContext): JsonArraySchema {\n const items = node.items();\n\n return {\n type: 'array',\n items: items.isNull()\n ? { type: 'string', default: '' }\n : context.serialize(items),\n };\n },\n\n getDefaultValue(_schema: JsonArraySchema): unknown[] {\n return [];\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","import type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nimport type { JsonRefSchema, JsonSchemaType } from '../../schema/JsonSchema';\nimport type { NodeMetadata } from '../../node/NodeMetadata';\nimport { RefNode } from '../../node/RefNode';\nimport { REF_CAPABILITIES } from './TypeCapabilities';\n\nfunction isRefSchema(schema: JsonSchemaType): schema is JsonRefSchema {\n return '$ref' in schema;\n}\n\nexport const refDescriptor: TypeDescriptor<JsonRefSchema, RefNode> = {\n type: 'ref',\n\n capabilities: REF_CAPABILITIES,\n\n canParse: isRefSchema,\n\n parse(\n schema: JsonRefSchema,\n name: string,\n metadata: NodeMetadata,\n context: ParseContext,\n ): RefNode {\n const node = new RefNode(context.generateId(), name, schema.$ref);\n node.setMetadata(metadata);\n return node;\n },\n\n serialize(node: RefNode, _context: SerializeContext): JsonRefSchema {\n const result: JsonRefSchema = {\n $ref: node.ref(),\n };\n\n const meta = node.metadata();\n if (meta.title) {\n result.title = meta.title;\n }\n if (meta.description) {\n result.description = meta.description;\n }\n if (meta.deprecated) {\n result.deprecated = meta.deprecated;\n }\n\n return result;\n },\n\n getDefaultValue(_schema: JsonRefSchema): null {\n return null;\n },\n\n parseDefaultValueString(_valueStr: string): undefined {\n return undefined;\n },\n};\n","export { TypeRegistry } from './TypeRegistry';\nexport type {\n TypeDescriptor,\n ParseContext,\n SerializeContext,\n} from './TypeDescriptor';\nexport type { TypeCapabilities } from './TypeCapabilities';\nexport {\n PRIMITIVE_CAPABILITIES,\n OBJECT_CAPABILITIES,\n ARRAY_CAPABILITIES,\n REF_CAPABILITIES,\n} from './TypeCapabilities';\n\nexport { stringDescriptor } from './StringDescriptor';\nexport { numberDescriptor } from './NumberDescriptor';\nexport { booleanDescriptor } from './BooleanDescriptor';\nexport { objectDescriptor } from './ObjectDescriptor';\nexport { arrayDescriptor } from './ArrayDescriptor';\nexport { refDescriptor } from './RefDescriptor';\n\nimport { TypeRegistry } from './TypeRegistry';\nimport { refDescriptor } from './RefDescriptor';\nimport { objectDescriptor } from './ObjectDescriptor';\nimport { arrayDescriptor } from './ArrayDescriptor';\nimport { stringDescriptor } from './StringDescriptor';\nimport { numberDescriptor } from './NumberDescriptor';\nimport { booleanDescriptor } from './BooleanDescriptor';\n\nexport function createDefaultRegistry(): TypeRegistry {\n const registry = new TypeRegistry();\n\n registry.register(refDescriptor);\n registry.register(objectDescriptor);\n registry.register(arrayDescriptor);\n registry.register(stringDescriptor);\n registry.register(numberDescriptor);\n registry.register(booleanDescriptor);\n\n return registry;\n}\n\nexport const defaultRegistry = createDefaultRegistry();\n","import type { JsonSchemaType } from './JsonSchema';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { NodeMetadata } from '../node/NodeMetadata';\nimport {\n type TypeRegistry,\n type ParseContext,\n defaultRegistry,\n} from '../parsing/index';\n\nlet idCounter = 0;\n\nfunction generateId(): string {\n idCounter++;\n return `node-${idCounter}`;\n}\n\nexport function resetIdCounter(): void {\n idCounter = 0;\n}\n\ninterface PendingFormula {\n nodeId: string;\n expression: string;\n}\n\nexport class SchemaParser {\n private pendingFormulas: PendingFormula[] = [];\n private readonly registry: TypeRegistry;\n\n constructor(registry: TypeRegistry = defaultRegistry) {\n this.registry = registry;\n }\n\n parse(schema: JsonSchemaType): SchemaNode {\n this.pendingFormulas = [];\n return this.parseNode(schema, '');\n }\n\n parseWithRootName(schema: JsonSchemaType, name: string): SchemaNode {\n this.pendingFormulas = [];\n return this.parseNode(schema, name);\n }\n\n getPendingFormulas(): PendingFormula[] {\n return this.pendingFormulas;\n }\n\n private parseNode(schema: JsonSchemaType, name: string): SchemaNode {\n const metadata = this.extractMetadata(schema);\n const descriptor = this.registry.findDescriptorForSchema(schema);\n\n if (!descriptor) {\n throw new Error(\n `No type descriptor found for schema: ${JSON.stringify(schema)}`,\n );\n }\n\n const context: ParseContext = {\n generateId,\n parseNode: (s, n) => this.parseNode(s, n),\n addPendingFormula: (nodeId, expression) => {\n this.pendingFormulas.push({ nodeId, expression });\n },\n };\n\n return descriptor.parse(schema, name, metadata, context);\n }\n\n private extractMetadata(schema: JsonSchemaType): NodeMetadata {\n return {\n title: 'title' in schema ? schema.title : undefined,\n description: 'description' in schema ? schema.description : undefined,\n deprecated: 'deprecated' in schema ? schema.deprecated : undefined,\n };\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { NodeTree } from '../tree/NodeTree';\nimport type { JsonSchemaType, JsonObjectSchema } from './JsonSchema';\nimport {\n type TypeRegistry,\n type SerializeContext,\n defaultRegistry,\n} from '../parsing/index';\nimport { FormulaSerializer } from '../formula';\n\nexport interface SerializeOptions {\n excludeNodeIds?: Set<string>;\n}\n\nexport class SchemaSerializer {\n private readonly registry: TypeRegistry;\n private tree: NodeTree | null = null;\n private excludeNodeIds: Set<string> = new Set();\n\n constructor(registry: TypeRegistry = defaultRegistry) {\n this.registry = registry;\n }\n\n serializeWithTree(\n node: SchemaNode,\n tree: NodeTree,\n options?: SerializeOptions,\n ): JsonSchemaType {\n this.tree = tree;\n this.excludeNodeIds = options?.excludeNodeIds ?? new Set();\n try {\n return this.serialize(node);\n } finally {\n this.tree = null;\n this.excludeNodeIds = new Set();\n }\n }\n\n serialize(node: SchemaNode): JsonSchemaType {\n if (node.isNull()) {\n throw new Error('Cannot serialize null node');\n }\n\n if (this.excludeNodeIds.size > 0 && node.isObject()) {\n return this.serializeObjectWithExclusions(node);\n }\n\n const descriptor = this.registry.getDescriptor(node.nodeType());\n\n if (!descriptor) {\n throw new Error(\n `No type descriptor found for node type: ${node.nodeType()}`,\n );\n }\n\n const context: SerializeContext = {\n serialize: (n) => this.serialize(n),\n serializeFormula: (nodeId, formula) => {\n if (!this.tree) {\n throw new Error(\n 'Cannot serialize formula without tree context. Use serializeWithTree.',\n );\n }\n return FormulaSerializer.toXFormula(this.tree, nodeId, formula);\n },\n };\n\n const result = descriptor.serialize(node, context);\n return this.addMetadata(result, node);\n }\n\n private serializeObjectWithExclusions(node: SchemaNode): JsonObjectSchema {\n const properties: Record<string, JsonSchemaType> = {};\n const required: string[] = [];\n\n for (const child of node.properties()) {\n if (this.excludeNodeIds.has(child.id())) {\n continue;\n }\n properties[child.name()] = this.serialize(child);\n required.push(child.name());\n }\n\n const result: JsonObjectSchema = {\n type: 'object',\n properties,\n additionalProperties: false,\n required,\n };\n\n return this.addMetadata(result, node);\n }\n\n private addMetadata<\n T extends { title?: string; description?: string; deprecated?: boolean },\n >(schema: T, node: SchemaNode): T {\n const meta = node.metadata();\n\n if (meta.title) {\n schema.title = meta.title;\n }\n if (meta.description) {\n schema.description = meta.description;\n }\n if (meta.deprecated) {\n schema.deprecated = meta.deprecated;\n }\n\n return schema;\n }\n}\n","export class SchemaComparator {\n public areEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (\n a === null ||\n b === null ||\n typeof a !== 'object' ||\n typeof b !== 'object'\n ) {\n return a === b;\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return this.arraysEqual(a, b);\n }\n\n return this.objectsEqual(\n a as Record<string, unknown>,\n b as Record<string, unknown>,\n );\n }\n\n private arraysEqual(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((item, i) => this.areEqual(item, b[i]));\n }\n\n private objectsEqual(\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n ): boolean {\n const aKeys = Object.keys(a).sort((x, y) => x.localeCompare(y));\n const bKeys = Object.keys(b).sort((x, y) => x.localeCompare(y));\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n if (!aKeys.every((k, i) => k === bKeys[i])) {\n return false;\n }\n\n return aKeys.every((key) => this.areEqual(a[key], b[key]));\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { Path } from '../../path';\nimport { EMPTY_PATH } from '../../path';\n\nexport class NodePathIndex {\n private readonly nodeIdToPath = new Map<string, Path>();\n private readonly oldToNewNodeId = new Map<string, string>();\n private readonly newToOldNodeId = new Map<string, string>();\n private readonly replacedPaths = new Set<Path>();\n private tree: SchemaTree;\n\n constructor(tree: SchemaTree) {\n this.tree = tree;\n this.rebuild();\n }\n\n public rebuild(): void {\n this.nodeIdToPath.clear();\n this.oldToNewNodeId.clear();\n this.newToOldNodeId.clear();\n this.replacedPaths.clear();\n this.collectNodePaths(this.tree.root(), EMPTY_PATH);\n }\n\n public rebuildFrom(tree: SchemaTree): void {\n this.tree = tree;\n this.rebuild();\n }\n\n public getPath(nodeId: string): Path | undefined {\n return this.nodeIdToPath.get(nodeId);\n }\n\n public hasNode(nodeId: string): boolean {\n return this.nodeIdToPath.has(nodeId);\n }\n\n public nodeIds(): IterableIterator<string> {\n return this.nodeIdToPath.keys();\n }\n\n public trackReplacement(oldNodeId: string, newNodeId: string): void {\n const basePath = this.nodeIdToPath.get(oldNodeId);\n if (basePath !== undefined) {\n this.removeChildPaths(basePath);\n this.nodeIdToPath.delete(oldNodeId);\n this.nodeIdToPath.set(newNodeId, basePath);\n this.replacedPaths.add(basePath);\n }\n this.oldToNewNodeId.set(oldNodeId, newNodeId);\n this.newToOldNodeId.set(newNodeId, oldNodeId);\n }\n\n public getOriginalNodeId(newNodeId: string): string | undefined {\n return this.newToOldNodeId.get(newNodeId);\n }\n\n public isChildOfReplacedPath(path: Path): boolean {\n for (const replacedPath of this.replacedPaths) {\n if (path.isChildOf(replacedPath)) {\n return true;\n }\n }\n return false;\n }\n\n private removeChildPaths(parentPath: Path): void {\n for (const [nodeId, path] of this.nodeIdToPath) {\n if (path.isChildOf(parentPath)) {\n this.nodeIdToPath.delete(nodeId);\n }\n }\n }\n\n private collectNodePaths(node: SchemaNode, path: Path): void {\n if (node.isNull()) {\n return;\n }\n\n this.nodeIdToPath.set(node.id(), path);\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectNodePaths(child, path.child(child.name()));\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectNodePaths(items, path.childItems());\n }\n }\n }\n}\n","import type { SchemaTree } from '../../tree/SchemaTree';\nimport type { NodePathIndex } from '../index/NodePathIndex';\nimport type { RawChange } from './RawChange';\n\nexport class ChangeCollector {\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n private readonly baseIndex: NodePathIndex,\n ) {}\n\n public collect(): RawChange[] {\n const changes: RawChange[] = [];\n const processedBaseNodeIds = new Set<string>();\n\n this.collectCurrentTreeChanges(changes, processedBaseNodeIds);\n this.collectRemovedNodes(changes, processedBaseNodeIds);\n\n return changes;\n }\n\n private collectCurrentTreeChanges(\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n for (const nodeId of this.currentTree.nodeIds()) {\n const currentPath = this.currentTree.pathOf(nodeId);\n const currentNode = this.currentTree.nodeById(nodeId);\n\n if (this.baseIndex.hasNode(nodeId)) {\n this.collectExistingNodeChange(\n nodeId,\n currentNode,\n currentPath,\n changes,\n processedBaseNodeIds,\n );\n } else {\n changes.push({\n type: 'added',\n baseNode: null,\n currentNode,\n });\n }\n }\n }\n\n private collectExistingNodeChange(\n nodeId: string,\n currentNode: ReturnType<SchemaTree['nodeById']>,\n currentPath: ReturnType<SchemaTree['pathOf']>,\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n processedBaseNodeIds.add(nodeId);\n\n const originalNodeId = this.baseIndex.getOriginalNodeId(nodeId);\n const baseNodeId = originalNodeId ?? nodeId;\n const baseNode = this.baseTree.nodeById(baseNodeId);\n\n if (originalNodeId) {\n processedBaseNodeIds.add(originalNodeId);\n }\n\n const basePath = this.baseIndex.getPath(nodeId);\n const isMoved = !basePath || !currentPath.equals(basePath);\n\n changes.push({\n type: isMoved ? 'moved' : 'modified',\n baseNode,\n currentNode,\n });\n }\n\n private collectRemovedNodes(\n changes: RawChange[],\n processedBaseNodeIds: Set<string>,\n ): void {\n for (const nodeId of this.baseIndex.nodeIds()) {\n if (processedBaseNodeIds.has(nodeId)) {\n continue;\n }\n\n const baseNode = this.baseTree.nodeById(nodeId);\n changes.push({\n type: 'removed',\n baseNode,\n currentNode: null,\n });\n }\n }\n}\n","import { type Path, EMPTY_PATH } from '../../path';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { NodePathIndex } from '../index/NodePathIndex';\nimport type { RawChange } from './RawChange';\n\nexport interface CoalescedChanges {\n moved: RawChange[];\n added: RawChange[];\n removed: RawChange[];\n modified: RawChange[];\n}\n\nexport class ChangeCoalescer {\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n private readonly baseIndex: NodePathIndex,\n ) {}\n\n public coalesce(changes: RawChange[]): CoalescedChanges {\n const moved = changes.filter((c) => c.type === 'moved');\n const added = changes.filter((c) => c.type === 'added');\n const removed = changes.filter((c) => c.type === 'removed');\n const modified = changes.filter((c) => c.type === 'modified');\n\n const topLevelMoves = this.filterTopLevelMoves(moved);\n const movedBaseNodes = new Set(moved.map((c) => c.baseNode));\n const moveAffectedTopLevelNodeIds =\n this.collectMoveAffectedTopLevelNodeIds(topLevelMoves);\n\n return {\n moved: topLevelMoves,\n added: this.filterTopLevelAdds(added),\n removed: this.filterTopLevelRemoves(removed, movedBaseNodes),\n modified: this.filterModified(modified, moveAffectedTopLevelNodeIds),\n };\n }\n\n private collectMoveAffectedTopLevelNodeIds(\n topLevelMoves: RawChange[],\n ): Set<string> {\n const nodeIds = new Set<string>();\n for (const change of topLevelMoves) {\n if (change.baseNode) {\n const topLevelNodeId = this.getTopLevelNodeId(\n this.baseTree,\n change.baseNode.id(),\n );\n if (topLevelNodeId) {\n nodeIds.add(topLevelNodeId);\n }\n }\n if (change.currentNode) {\n const topLevelNodeId = this.getTopLevelNodeId(\n this.currentTree,\n change.currentNode.id(),\n );\n if (topLevelNodeId) {\n nodeIds.add(topLevelNodeId);\n }\n }\n }\n return nodeIds;\n }\n\n private getTopLevelNodeId(tree: SchemaTree, nodeId: string): string | null {\n const path = tree.pathOf(nodeId);\n const firstSeg = path.segments()[0];\n if (!firstSeg?.isProperty()) {\n return null;\n }\n const topLevelNode = tree.nodeAt(EMPTY_PATH.child(firstSeg.propertyName()));\n return topLevelNode.isNull() ? null : topLevelNode.id();\n }\n\n private filterTopLevelMoves(moved: RawChange[]): RawChange[] {\n return moved.filter((change) => !this.isChildOfMovedPath(change, moved));\n }\n\n private isChildOfMovedPath(\n change: RawChange,\n allMoved: RawChange[],\n ): boolean {\n if (!change.baseNode) {\n return false;\n }\n const changeBaseNodeId = change.baseNode.id();\n const basePath = this.baseTree.pathOf(changeBaseNodeId);\n return allMoved.some(\n (other) =>\n other.baseNode &&\n other.baseNode.id() !== changeBaseNodeId &&\n basePath.isChildOf(this.baseTree.pathOf(other.baseNode.id())),\n );\n }\n\n private filterTopLevelAdds(added: RawChange[]): RawChange[] {\n const changesWithPaths = added\n .flatMap((change) => {\n if (!change.currentNode) {\n return [];\n }\n return [\n {\n change,\n path: this.currentTree.pathOf(change.currentNode.id()),\n },\n ];\n })\n .sort((a, b) => a.path.length() - b.path.length());\n\n const addedPaths: Path[] = [];\n const result: RawChange[] = [];\n\n for (const { change, path } of changesWithPaths) {\n if (this.baseIndex.isChildOfReplacedPath(path)) {\n continue;\n }\n\n if (this.isChildOfAnyPath(path, addedPaths)) {\n continue;\n }\n\n result.push(change);\n addedPaths.push(path);\n }\n\n return result;\n }\n\n private filterTopLevelRemoves(\n removed: RawChange[],\n movedBaseNodes: Set<RawChange['baseNode']>,\n ): RawChange[] {\n const changesWithPaths = removed\n .flatMap((change) => {\n if (!change.baseNode || movedBaseNodes.has(change.baseNode)) {\n return [];\n }\n return [\n {\n change,\n path: this.baseTree.pathOf(change.baseNode.id()),\n },\n ];\n })\n .sort((a, b) => a.path.length() - b.path.length());\n\n const removedPaths: Path[] = [];\n const result: RawChange[] = [];\n\n for (const { change, path } of changesWithPaths) {\n if (this.isChildOfAnyPath(path, removedPaths)) {\n continue;\n }\n\n result.push(change);\n removedPaths.push(path);\n }\n\n return result;\n }\n\n private filterModified(\n modified: RawChange[],\n moveAffectedTopLevelNodeIds: Set<string>,\n ): RawChange[] {\n return modified.filter((change) => {\n if (!change.currentNode) {\n return false;\n }\n\n const topLevelNodeId = this.getTopLevelNodeId(\n this.currentTree,\n change.currentNode.id(),\n );\n if (topLevelNodeId && moveAffectedTopLevelNodeIds.has(topLevelNodeId)) {\n return false;\n }\n\n return true;\n });\n }\n\n private isChildOfAnyPath(path: Path, parents: Path[]): boolean {\n for (const parent of parents) {\n if (path.isChildOf(parent)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport type { Path } from '../../path';\nimport { jsonPointerToPath } from '../../path';\nimport { SchemaSerializer } from '../../schema/SchemaSerializer';\nimport { SchemaComparator } from '../SchemaComparator';\nimport type { JsonPatch } from '../SchemaPatch';\nimport type { RawChange } from './RawChange';\nimport type { CoalescedChanges } from './ChangeCoalescer';\n\nexport class PatchGenerator {\n private readonly serializer = new SchemaSerializer();\n private readonly comparator = new SchemaComparator();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public generate(coalesced: CoalescedChanges): JsonPatch[] {\n const movedNodeIds = this.collectMovedNodeIds(coalesced.moved);\n const movePatches = this.generateMovePatches(coalesced.moved);\n const addPatches = this.generateAddPatches(coalesced.added, movedNodeIds);\n const removePatches = this.generateRemovePatches(coalesced.removed);\n\n const { prerequisiteAdds, regularAdds } = this.partitionAddPatches(\n addPatches,\n movePatches,\n );\n\n const childChangePaths = new Set([\n ...addPatches.map((p) => p.path),\n ...removePatches.map((p) => p.path),\n ...movePatches.flatMap((p) => [p.path, p.from ?? '']).filter(Boolean),\n ]);\n\n const replacePatches = this.generateReplacePatches(\n coalesced.modified,\n childChangePaths,\n );\n\n return [\n ...prerequisiteAdds,\n ...movePatches,\n ...replacePatches,\n ...regularAdds,\n ...removePatches,\n ];\n }\n\n private collectMovedNodeIds(moved: RawChange[]): Set<string> {\n const nodeIds = new Set<string>();\n for (const change of moved) {\n if (change.currentNode) {\n nodeIds.add(change.currentNode.id());\n }\n }\n return nodeIds;\n }\n\n private partitionAddPatches(\n addPatches: JsonPatch[],\n movePatches: JsonPatch[],\n ): { prerequisiteAdds: JsonPatch[]; regularAdds: JsonPatch[] } {\n const moveDestinations = movePatches.map((p) => jsonPointerToPath(p.path));\n\n const prerequisiteAdds: JsonPatch[] = [];\n const regularAdds: JsonPatch[] = [];\n\n for (const addPatch of addPatches) {\n const addPath = jsonPointerToPath(addPatch.path);\n const isPrerequisite = moveDestinations.some((moveDest) =>\n moveDest.isChildOf(addPath),\n );\n\n if (isPrerequisite) {\n prerequisiteAdds.push(addPatch);\n } else {\n regularAdds.push(addPatch);\n }\n }\n\n return { prerequisiteAdds, regularAdds };\n }\n\n private generateMovePatches(moved: RawChange[]): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of moved) {\n if (!change.baseNode || !change.currentNode) {\n continue;\n }\n\n const basePath = this.baseTree.pathOf(change.baseNode.id());\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n\n patches.push({\n op: 'move',\n from: basePath.asJsonPointer(),\n path: currentPath.asJsonPointer(),\n });\n\n const modifyPatch = this.generateModifyAfterMove(\n change.baseNode,\n change.currentNode,\n currentPath.asJsonPointer(),\n );\n if (modifyPatch) {\n patches.push(modifyPatch);\n }\n }\n\n return patches;\n }\n\n private generateModifyAfterMove(\n baseNode: SchemaNode,\n currentNode: SchemaNode,\n currentPath: string,\n ): JsonPatch | null {\n const currentSchema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n const baseSchema = this.serializer.serializeWithTree(\n baseNode,\n this.baseTree,\n );\n\n if (!this.comparator.areEqual(currentSchema, baseSchema)) {\n return {\n op: 'replace',\n path: currentPath,\n value: currentSchema,\n };\n }\n\n return null;\n }\n\n private generateAddPatches(\n added: RawChange[],\n movedNodeIds: Set<string>,\n ): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of added) {\n if (!change.currentNode) {\n continue;\n }\n\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n const schema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n { excludeNodeIds: movedNodeIds },\n );\n patches.push({\n op: 'add',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n }\n\n return patches;\n }\n\n private generateRemovePatches(removed: RawChange[]): JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of removed) {\n if (!change.baseNode) {\n continue;\n }\n\n const basePath = this.baseTree.pathOf(change.baseNode.id());\n patches.push({\n op: 'remove',\n path: basePath.asJsonPointer(),\n });\n }\n\n return patches;\n }\n\n private generateReplacePatches(\n modified: RawChange[],\n childChangePaths: Set<string>,\n ): JsonPatch[] {\n const patches: JsonPatch[] = [];\n const replacedPaths: Path[] = [];\n const childChangePathObjects = [...childChangePaths].map(jsonPointerToPath);\n\n for (const change of modified) {\n if (!change.currentNode || !change.baseNode) {\n continue;\n }\n\n const currentPath = this.currentTree.pathOf(change.currentNode.id());\n\n if (this.isChildOfAny(currentPath, replacedPaths)) {\n continue;\n }\n\n if (this.hasChildIn(currentPath, childChangePathObjects)) {\n continue;\n }\n\n if (!this.isActuallyModified(change)) {\n continue;\n }\n\n if (change.currentNode.isArray()) {\n const arrayPatches = this.generateArrayReplacePatches(\n change.currentNode,\n change.baseNode,\n currentPath,\n );\n patches.push(...arrayPatches);\n replacedPaths.push(currentPath);\n continue;\n }\n\n const schema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n replacedPaths.push(currentPath);\n }\n\n return patches;\n }\n\n private generateArrayReplacePatches(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n currentPath: Path,\n ): JsonPatch[] {\n if (!baseNode.isArray()) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n return [\n {\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n },\n ];\n }\n\n const patches: JsonPatch[] = [];\n const metadataChanged = this.hasMetadataChanged(currentNode, baseNode);\n const itemsChanged = this.hasItemsChanged(currentNode, baseNode);\n\n if (metadataChanged) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: currentPath.asJsonPointer(),\n value: schema,\n });\n }\n\n if (itemsChanged) {\n const items = currentNode.items();\n if (!items.isNull()) {\n const itemsPath = currentPath.childItems();\n const itemsSchema = this.serializer.serializeWithTree(\n items,\n this.currentTree,\n );\n patches.push({\n op: 'replace',\n path: itemsPath.asJsonPointer(),\n value: itemsSchema,\n });\n }\n }\n\n return patches;\n }\n\n private hasItemsChanged(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n const items = currentNode.items();\n const baseItems = baseNode.items();\n\n if (items.isNull() && baseItems.isNull()) {\n return false;\n }\n if (items.isNull() || baseItems.isNull()) {\n return true;\n }\n\n const currentItemsSchema = this.serializer.serializeWithTree(\n items,\n this.currentTree,\n );\n const baseItemsSchema = this.serializer.serializeWithTree(\n baseItems,\n this.baseTree,\n );\n\n return !this.comparator.areEqual(currentItemsSchema, baseItemsSchema);\n }\n\n private isChildOfAny(path: Path, parents: Path[]): boolean {\n return parents.some((parent) => path.isChildOf(parent));\n }\n\n private hasChildIn(path: Path, candidates: Path[]): boolean {\n return candidates.some((candidate) => candidate.isChildOf(path));\n }\n\n private isActuallyModified(change: RawChange): boolean {\n if (!change.currentNode || !change.baseNode) {\n return false;\n }\n\n const currentSchema = this.serializer.serializeWithTree(\n change.currentNode,\n this.currentTree,\n );\n const baseSchema = this.serializer.serializeWithTree(\n change.baseNode,\n this.baseTree,\n );\n\n if (this.comparator.areEqual(currentSchema, baseSchema)) {\n return false;\n }\n\n if (\n change.currentNode.isObject() &&\n this.hasOnlyChildChanges(change.currentNode, change.baseNode)\n ) {\n return false;\n }\n\n if (\n change.currentNode.isArray() &&\n this.hasOnlyItemsChanges(change.currentNode, change.baseNode)\n ) {\n return false;\n }\n\n return true;\n }\n\n private hasOnlyChildChanges(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n if (!baseNode.isObject()) {\n return false;\n }\n\n if (this.hasMetadataChanged(currentNode, baseNode)) {\n return false;\n }\n\n return true;\n }\n\n private hasMetadataChanged(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n const currentMeta = currentNode.metadata();\n const baseMeta = baseNode.metadata();\n\n return (\n currentMeta.title !== baseMeta.title ||\n currentMeta.description !== baseMeta.description ||\n currentMeta.deprecated !== baseMeta.deprecated\n );\n }\n\n private hasOnlyItemsChanges(\n currentNode: SchemaNode,\n baseNode: SchemaNode,\n ): boolean {\n if (!baseNode.isArray()) {\n return false;\n }\n\n if (this.hasMetadataChanged(currentNode, baseNode)) {\n return false;\n }\n\n const items = currentNode.items();\n const baseItems = baseNode.items();\n\n if (items.isNull() || baseItems.isNull()) {\n return false;\n }\n\n return items.id() === baseItems.id();\n }\n}\n","import type { SchemaTree } from '../../tree/SchemaTree';\nimport { FormulaSerializer } from '../../formula';\nimport { SchemaSerializer } from '../../schema/SchemaSerializer';\nimport type { JsonPatch } from '../SchemaPatch';\n\nexport class FormulaChangeDetector {\n private readonly serializer = new SchemaSerializer();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public detectIndirectFormulaChanges(\n existingPatches: JsonPatch[],\n ): JsonPatch[] {\n const patchedPaths = new Set(existingPatches.map((p) => p.path));\n const result: JsonPatch[] = [];\n\n this.baseTree.forEachFormula((formulaNodeId) => {\n const currentNode = this.currentTree.nodeById(formulaNodeId);\n if (currentNode.isNull()) {\n return;\n }\n\n const currentPath = this.currentTree\n .pathOf(formulaNodeId)\n .asJsonPointer();\n if (patchedPaths.has(currentPath)) {\n return;\n }\n\n const baseFormula = this.baseTree.getFormulaByNodeId(formulaNodeId);\n const currentFormula = currentNode.formula();\n\n if (!baseFormula || !currentFormula) {\n return;\n }\n\n const baseExpression = new FormulaSerializer(\n this.baseTree,\n formulaNodeId,\n baseFormula,\n ).serialize();\n\n const currentExpression = new FormulaSerializer(\n this.currentTree,\n formulaNodeId,\n currentFormula,\n ).serialize();\n\n if (baseExpression !== currentExpression) {\n const schema = this.serializer.serializeWithTree(\n currentNode,\n this.currentTree,\n );\n result.push({\n op: 'replace',\n path: currentPath,\n value: schema,\n });\n }\n });\n\n return result;\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { NodeTree } from '../../tree/NodeTree';\nimport { FormulaSerializer } from '../../formula/serialization/FormulaSerializer';\nimport type {\n DefaultValueType,\n MetadataChangeType,\n MetadataChangesResult,\n} from '../SchemaPatch';\n\nexport class NodeMetadataExtractor {\n public getNodeType(node: SchemaNode | null): string {\n if (!node || node.isNull()) {\n return 'unknown';\n }\n\n if (node.isRef()) {\n return node.ref();\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n const itemsType = this.getNodeType(items);\n return `array<${itemsType}>`;\n }\n return 'array';\n }\n\n return node.nodeType();\n }\n\n public getFormulaExpression(\n tree: NodeTree,\n node: SchemaNode | null,\n ): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n const formula = node.formula();\n if (!formula) {\n return undefined;\n }\n return new FormulaSerializer(tree, node.id(), formula).serialize();\n }\n\n public getDefaultValue(node: SchemaNode | null): DefaultValueType {\n if (!node || node.isNull()) {\n return undefined;\n }\n const def = node.defaultValue();\n if (\n typeof def === 'string' ||\n typeof def === 'number' ||\n typeof def === 'boolean'\n ) {\n return def;\n }\n return undefined;\n }\n\n public getDescription(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.metadata().description;\n }\n\n public getDeprecated(node: SchemaNode | null): boolean | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.metadata().deprecated;\n }\n\n public getForeignKey(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.foreignKey();\n }\n\n public getContentMediaType(node: SchemaNode | null): string | undefined {\n if (!node || node.isNull()) {\n return undefined;\n }\n return node.contentMediaType?.();\n }\n\n public computeMetadataChanges(\n baseTree: NodeTree,\n baseNode: SchemaNode | null,\n currentTree: NodeTree,\n currentNode: SchemaNode | null,\n ): MetadataChangesResult {\n const changes: MetadataChangeType[] = [];\n let formulaChange: MetadataChangesResult['formulaChange'];\n let defaultChange: MetadataChangesResult['defaultChange'];\n let descriptionChange: MetadataChangesResult['descriptionChange'];\n let deprecatedChange: MetadataChangesResult['deprecatedChange'];\n let foreignKeyChange: MetadataChangesResult['foreignKeyChange'];\n let contentMediaTypeChange: MetadataChangesResult['contentMediaTypeChange'];\n\n const effectiveCurrentNode = this.getEffectiveNodeForComparison(\n baseNode,\n currentNode,\n );\n\n const baseDesc = this.getDescription(baseNode);\n const currentDesc = this.getDescription(effectiveCurrentNode);\n if (baseDesc !== currentDesc) {\n changes.push('description');\n descriptionChange = {\n fromDescription: baseDesc,\n toDescription: currentDesc,\n };\n }\n\n const baseDeprecated = this.getDeprecated(baseNode);\n const currentDeprecated = this.getDeprecated(effectiveCurrentNode);\n if (baseDeprecated !== currentDeprecated) {\n changes.push('deprecated');\n deprecatedChange = {\n fromDeprecated: baseDeprecated,\n toDeprecated: currentDeprecated,\n };\n }\n\n const baseFormula = this.getFormulaExpression(baseTree, baseNode);\n const currentFormula = this.getFormulaExpression(\n currentTree,\n effectiveCurrentNode,\n );\n if (baseFormula !== currentFormula) {\n changes.push('formula');\n formulaChange = { fromFormula: baseFormula, toFormula: currentFormula };\n }\n\n const baseForeignKey = this.getForeignKey(baseNode);\n const currentForeignKey = this.getForeignKey(effectiveCurrentNode);\n if (baseForeignKey !== currentForeignKey) {\n changes.push('foreignKey');\n foreignKeyChange = {\n fromForeignKey: baseForeignKey,\n toForeignKey: currentForeignKey,\n };\n }\n\n const baseDefault = this.getDefaultValue(baseNode);\n const currentDefault = this.getDefaultValue(effectiveCurrentNode);\n if (baseDefault !== currentDefault) {\n changes.push('default');\n defaultChange = { fromDefault: baseDefault, toDefault: currentDefault };\n }\n\n const baseContentMediaType = this.getContentMediaType(baseNode);\n const currentContentMediaType =\n this.getContentMediaType(effectiveCurrentNode);\n if (baseContentMediaType !== currentContentMediaType) {\n changes.push('contentMediaType');\n contentMediaTypeChange = {\n fromContentMediaType: baseContentMediaType,\n toContentMediaType: currentContentMediaType,\n };\n }\n\n return {\n metadataChanges: changes,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private getEffectiveNodeForComparison(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): SchemaNode | null {\n if (\n baseNode &&\n !baseNode.isNull() &&\n baseNode.isPrimitive() &&\n currentNode &&\n !currentNode.isNull() &&\n currentNode.isArray()\n ) {\n const items = currentNode.items();\n return items.isNull() ? null : items;\n }\n return currentNode;\n }\n\n public hasTypeChanged(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n const baseType = this.getNodeType(baseNode);\n const currentType = this.getNodeType(currentNode);\n return baseType !== currentType;\n }\n\n public hasTypeChangedIgnoringItems(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n const baseType = this.getBaseNodeType(baseNode);\n const currentType = this.getBaseNodeType(currentNode);\n return baseType !== currentType;\n }\n\n private getBaseNodeType(node: SchemaNode | null): string {\n if (!node || node.isNull()) {\n return 'unknown';\n }\n\n if (node.isRef()) {\n return node.ref();\n }\n\n if (node.isArray()) {\n return 'array';\n }\n\n return node.nodeType();\n }\n}\n","import type { SchemaNode } from '../../node/SchemaNode';\nimport type { SchemaTree } from '../../tree/SchemaTree';\nimport { jsonPointerToPath } from '../../path';\nimport { NodeMetadataExtractor } from './NodeMetadataExtractor';\nimport type { JsonPatch, SchemaPatch } from '../SchemaPatch';\n\nexport class PatchEnricher {\n private readonly metadataExtractor = new NodeMetadataExtractor();\n\n constructor(\n private readonly currentTree: SchemaTree,\n private readonly baseTree: SchemaTree,\n ) {}\n\n public enrich(patch: JsonPatch): SchemaPatch {\n const fieldName = this.getFieldNameFromPath(patch.path);\n\n if (patch.op === 'add') {\n return this.enrichAddPatch(patch, fieldName);\n }\n\n if (patch.op === 'remove') {\n return { patch, fieldName, metadataChanges: [] };\n }\n\n if (patch.op === 'move') {\n return this.enrichMovePatch(patch, fieldName);\n }\n\n return this.enrichReplacePatch(patch, fieldName);\n }\n\n private enrichAddPatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const {\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = this.metadataExtractor.computeMetadataChanges(\n this.baseTree,\n null,\n this.currentTree,\n currentNode,\n );\n\n return {\n patch,\n fieldName,\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private enrichMovePatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const fromPath = patch.from || '';\n const isRename = this.isRenameMove(fromPath, patch.path);\n const movesIntoArray = this.movesIntoArrayBoundary(fromPath, patch.path);\n\n const baseNode = this.getNodeAtPath(this.baseTree, fromPath);\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const baseFormula = this.metadataExtractor.getFormulaExpression(\n this.baseTree,\n baseNode,\n );\n const currentFormula = this.metadataExtractor.getFormulaExpression(\n this.currentTree,\n currentNode,\n );\n\n const formulaChange =\n baseFormula !== currentFormula\n ? { fromFormula: baseFormula, toFormula: currentFormula }\n : undefined;\n\n return {\n patch,\n fieldName,\n metadataChanges: formulaChange ? ['formula'] : [],\n isRename: isRename || undefined,\n movesIntoArray: movesIntoArray || undefined,\n formulaChange,\n };\n }\n\n private enrichReplacePatch(patch: JsonPatch, fieldName: string): SchemaPatch {\n const baseNode = this.getNodeAtPath(this.baseTree, patch.path);\n const currentNode = this.getNodeAtPath(this.currentTree, patch.path);\n\n const {\n metadataChanges,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = this.metadataExtractor.computeMetadataChanges(\n this.baseTree,\n baseNode,\n this.currentTree,\n currentNode,\n );\n\n const isArrayMetadataPatch = this.isArrayMetadataOnlyPatch(\n baseNode,\n currentNode,\n );\n\n const typeChanged = isArrayMetadataPatch\n ? this.metadataExtractor.hasTypeChangedIgnoringItems(\n baseNode,\n currentNode,\n )\n : this.metadataExtractor.hasTypeChanged(baseNode, currentNode);\n\n return {\n patch,\n fieldName,\n metadataChanges,\n typeChange: typeChanged\n ? {\n fromType: this.metadataExtractor.getNodeType(baseNode),\n toType: this.metadataExtractor.getNodeType(currentNode),\n }\n : undefined,\n formulaChange,\n defaultChange: isArrayMetadataPatch ? undefined : defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n };\n }\n\n private isArrayMetadataOnlyPatch(\n baseNode: SchemaNode | null,\n currentNode: SchemaNode | null,\n ): boolean {\n return Boolean(baseNode?.isArray() && currentNode?.isArray());\n }\n\n private getFieldNameFromPath(jsonPointer: string): string {\n try {\n return jsonPointerToPath(jsonPointer).asSimple();\n } catch {\n return '';\n }\n }\n\n private isRenameMove(fromPointer: string, toPointer: string): boolean {\n try {\n const fromParent = jsonPointerToPath(fromPointer).parent();\n const toParent = jsonPointerToPath(toPointer).parent();\n return fromParent.equals(toParent);\n } catch {\n return false;\n }\n }\n\n private movesIntoArrayBoundary(\n fromPointer: string,\n toPointer: string,\n ): boolean {\n try {\n const fromPath = jsonPointerToPath(fromPointer);\n const toPath = jsonPointerToPath(toPointer);\n const fromArrayDepth = this.countArrayDepth(fromPath);\n const toArrayDepth = this.countArrayDepth(toPath);\n return toArrayDepth > fromArrayDepth;\n } catch {\n return false;\n }\n }\n\n private countArrayDepth(path: import('../../path').Path): number {\n return path.segments().filter((seg) => seg.isItems()).length;\n }\n\n private getNodeAtPath(\n tree: SchemaTree,\n jsonPointer: string,\n ): SchemaNode | null {\n try {\n const path = jsonPointerToPath(jsonPointer);\n const node = tree.nodeAt(path);\n return node.isNull() ? null : node;\n } catch {\n return null;\n }\n }\n}\n","import type { SchemaTree } from '../tree/SchemaTree';\nimport type { NodePathIndex } from './index/NodePathIndex';\nimport type { SchemaPatch } from './SchemaPatch';\nimport { ChangeCollector } from './changes/ChangeCollector';\nimport { ChangeCoalescer } from './changes/ChangeCoalescer';\nimport { PatchGenerator } from './changes/PatchGenerator';\nimport { FormulaChangeDetector } from './changes/FormulaChangeDetector';\nimport { PatchEnricher } from './enricher/PatchEnricher';\n\nexport class PatchBuilder {\n private readonly collector: ChangeCollector;\n private readonly coalescer: ChangeCoalescer;\n private readonly generator: PatchGenerator;\n private readonly formulaDetector: FormulaChangeDetector;\n private readonly enricher: PatchEnricher;\n\n constructor(\n currentTree: SchemaTree,\n baseTree: SchemaTree,\n baseIndex: NodePathIndex,\n ) {\n this.collector = new ChangeCollector(currentTree, baseTree, baseIndex);\n this.coalescer = new ChangeCoalescer(currentTree, baseTree, baseIndex);\n this.generator = new PatchGenerator(currentTree, baseTree);\n this.formulaDetector = new FormulaChangeDetector(currentTree, baseTree);\n this.enricher = new PatchEnricher(currentTree, baseTree);\n }\n\n public build(): SchemaPatch[] {\n const rawChanges = this.collector.collect();\n const coalesced = this.coalescer.coalesce(rawChanges);\n const jsonPatches = this.generator.generate(coalesced);\n const formulaPatches =\n this.formulaDetector.detectIndirectFormulaChanges(jsonPatches);\n const allPatches = [...jsonPatches, ...formulaPatches];\n return allPatches.map((patch) => this.enricher.enrich(patch));\n }\n}\n","import { makeAutoObservable, observable } from 'mobx';\nimport type { SchemaTree } from '../tree/SchemaTree';\nimport type { JsonObjectSchema } from '../schema/JsonSchema';\nimport { SchemaSerializer } from '../schema/SchemaSerializer';\nimport type { SchemaPatch } from './SchemaPatch';\nimport { SchemaComparator } from './SchemaComparator';\nimport { NodePathIndex } from './index/NodePathIndex';\nimport { PatchBuilder } from './PatchBuilder';\n\nexport class SchemaDiff {\n private readonly serializer = new SchemaSerializer();\n private readonly comparator = new SchemaComparator();\n private readonly baseIndex: NodePathIndex;\n private baseTree: SchemaTree;\n\n constructor(private readonly tree: SchemaTree) {\n this.baseTree = tree.clone();\n this.baseIndex = new NodePathIndex(this.baseTree);\n makeAutoObservable<SchemaDiff, 'baseTree'>(\n this,\n { baseTree: observable.ref },\n { autoBind: true },\n );\n }\n\n public markAsSaved(): void {\n this.baseTree = this.tree.clone();\n this.baseIndex.rebuildFrom(this.baseTree);\n }\n\n public getBaseSchema(): JsonObjectSchema {\n return this.serializer.serializeWithTree(\n this.baseTree.root(),\n this.baseTree,\n ) as JsonObjectSchema;\n }\n\n public trackReplacement(oldNodeId: string, newNodeId: string): void {\n this.baseIndex.trackReplacement(oldNodeId, newNodeId);\n }\n\n public getPatches(): SchemaPatch[] {\n return this.createPatchBuilder().build();\n }\n\n public isDirty(): boolean {\n const currentSchema = this.getCurrentSchema();\n const baseSchema = this.getBaseSchema();\n return !this.comparator.areEqual(currentSchema, baseSchema);\n }\n\n public getCurrentSchema(): JsonObjectSchema {\n return this.serializer.serializeWithTree(\n this.tree.root(),\n this.tree,\n ) as JsonObjectSchema;\n }\n\n private createPatchBuilder(): PatchBuilder {\n return new PatchBuilder(this.tree, this.baseTree, this.baseIndex);\n }\n}\n","const FIELD_NAME_PATTERN = /^(?!__)[a-zA-Z_][a-zA-Z0-9-_]*$/;\nconst FIELD_NAME_MAX_LENGTH = 64;\n\nexport const FIELD_NAME_ERROR_MESSAGE =\n 'Must start with a letter or underscore, cannot start with __, and can only include letters, numbers, hyphens, and underscores (max 64 chars)';\n\nexport function isValidFieldName(name: string): boolean {\n if (name.length < 1 || name.length > FIELD_NAME_MAX_LENGTH) {\n return false;\n }\n return FIELD_NAME_PATTERN.test(name);\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport {\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from './FieldNameValidator';\n\nexport type ValidationErrorType =\n | 'empty-name'\n | 'duplicate-name'\n | 'invalid-name';\n\nexport interface ValidationError {\n nodeId: string;\n type: ValidationErrorType;\n message: string;\n}\n\nexport class SchemaValidator {\n validate(root: SchemaNode): ValidationError[] {\n const errors: ValidationError[] = [];\n this.collectValidationErrors(root, errors);\n return errors;\n }\n\n private collectValidationErrors(\n node: SchemaNode,\n errors: ValidationError[],\n ): void {\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const children = node.properties();\n const nameSet = new Set<string>();\n for (const child of children) {\n const name = child.name();\n if (!name) {\n errors.push({\n nodeId: child.id(),\n type: 'empty-name',\n message: 'Field name is required',\n });\n } else if (nameSet.has(name)) {\n errors.push({\n nodeId: child.id(),\n type: 'duplicate-name',\n message: `Duplicate field name: ${name}`,\n });\n } else if (!isValidFieldName(name)) {\n errors.push({\n nodeId: child.id(),\n type: 'invalid-name',\n message: FIELD_NAME_ERROR_MESSAGE,\n });\n }\n nameSet.add(name);\n this.collectValidationErrors(child, errors);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectValidationErrors(items, errors);\n }\n }\n }\n}\n","import type { SchemaNode } from '../node/SchemaNode';\nimport type { SchemaTree } from '../tree/SchemaTree';\n\nexport interface FormulaValidationError {\n nodeId: string;\n message: string;\n fieldPath?: string;\n}\n\nexport class FormulaValidator {\n constructor(private readonly tree: SchemaTree) {}\n\n validate(): FormulaValidationError[] {\n const errors: FormulaValidationError[] = [];\n this.collectErrors(this.tree.root(), '', errors);\n return errors;\n }\n\n validateNode(\n nodeId: string,\n fieldPath?: string,\n ): FormulaValidationError | null {\n const formula = this.tree.getFormulaByNodeId(nodeId);\n if (!formula) {\n return null;\n }\n\n for (const dep of formula.dependencies()) {\n const targetNode = this.tree.nodeById(dep.targetNodeId());\n if (targetNode.isNull()) {\n return {\n nodeId,\n message: `Cannot resolve formula dependency: target node not found`,\n fieldPath: fieldPath || undefined,\n };\n }\n }\n\n return null;\n }\n\n private collectErrors(\n node: SchemaNode,\n currentPath: string,\n errors: FormulaValidationError[],\n ): void {\n if (node.isNull()) {\n return;\n }\n\n if (node.isPrimitive()) {\n const error = this.validateNode(node.id(), currentPath);\n if (error) {\n errors.push(error);\n }\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n const childPath = currentPath\n ? `${currentPath}.${child.name()}`\n : child.name();\n this.collectErrors(child, childPath, errors);\n }\n }\n\n if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n const itemsPath = `${currentPath}[*]`;\n this.collectErrors(items, itemsPath, errors);\n }\n }\n }\n}\n","import { NodeType } from '../node/NodeType';\nimport { defaultRegistry } from '../parsing/index';\n\nexport type ParsedDefaultValue = string | number | boolean | undefined;\n\nexport function parseDefaultValue(\n valueStr: string,\n nodeType: NodeType,\n): ParsedDefaultValue {\n if (!valueStr) {\n return undefined;\n }\n\n const descriptor = defaultRegistry.getDescriptor(nodeType);\n if (descriptor) {\n return descriptor.parseDefaultValueString(valueStr) as ParsedDefaultValue;\n }\n\n return undefined;\n}\n","export type DataLossSeverity = 'none' | 'possible' | 'certain';\n\nexport interface TransformationStep {\n name: string;\n dataLossSeverity: DataLossSeverity;\n}\n\nexport interface TransformationInfo {\n fromType: string;\n toType: string;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n steps: TransformationStep[];\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface TransformationRule {\n fromType: SchemaType;\n toType: SchemaType;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n stepName: string;\n}\n\ninterface TransformationContext {\n fromType: SchemaType;\n toType: SchemaType;\n fromItemsType?: SchemaType;\n toItemsType?: SchemaType;\n}\n\nconst transformationRules: TransformationRule[] = [\n {\n fromType: 'number',\n toType: 'string',\n example: { before: 123, after: '123' },\n dataLossSeverity: 'none',\n stepName: 'number → string',\n },\n {\n fromType: 'boolean',\n toType: 'string',\n example: { before: true, after: 'true' },\n dataLossSeverity: 'none',\n stepName: 'boolean → string',\n },\n {\n fromType: 'boolean',\n toType: 'number',\n example: { before: true, after: 1 },\n dataLossSeverity: 'none',\n stepName: 'boolean → number',\n },\n {\n fromType: 'string',\n toType: 'number',\n example: { before: '123', after: 123 },\n dataLossSeverity: 'possible',\n stepName: 'string → number',\n },\n {\n fromType: 'string',\n toType: 'boolean',\n example: { before: 'hello', after: true },\n dataLossSeverity: 'possible',\n stepName: 'string → boolean',\n },\n {\n fromType: 'number',\n toType: 'boolean',\n example: { before: 42, after: true },\n dataLossSeverity: 'possible',\n stepName: 'number → boolean',\n },\n {\n fromType: 'object',\n toType: 'string',\n example: { before: { a: 1 }, after: '' },\n dataLossSeverity: 'certain',\n stepName: 'object → string',\n },\n {\n fromType: 'object',\n toType: 'number',\n example: { before: { a: 1 }, after: 0 },\n dataLossSeverity: 'certain',\n stepName: 'object → number',\n },\n {\n fromType: 'object',\n toType: 'boolean',\n example: { before: { a: 1 }, after: false },\n dataLossSeverity: 'certain',\n stepName: 'object → boolean',\n },\n {\n fromType: 'array',\n toType: 'string',\n example: { before: ['a', 'b'], after: 'a' },\n dataLossSeverity: 'possible',\n stepName: 'array → string (first element)',\n },\n {\n fromType: 'array',\n toType: 'number',\n example: { before: [1, 2], after: 1 },\n dataLossSeverity: 'possible',\n stepName: 'array → number (first element)',\n },\n {\n fromType: 'array',\n toType: 'boolean',\n example: { before: [true, false], after: true },\n dataLossSeverity: 'possible',\n stepName: 'array → boolean (first element)',\n },\n {\n fromType: 'string',\n toType: 'object',\n example: { before: 'hello', after: {} },\n dataLossSeverity: 'certain',\n stepName: 'string → object',\n },\n {\n fromType: 'number',\n toType: 'object',\n example: { before: 42, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'number → object',\n },\n {\n fromType: 'boolean',\n toType: 'object',\n example: { before: true, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'boolean → object',\n },\n {\n fromType: 'string',\n toType: 'array',\n example: { before: 'hello', after: ['hello'] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'number',\n toType: 'array',\n example: { before: 42, after: [42] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'boolean',\n toType: 'array',\n example: { before: true, after: [true] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'object',\n toType: 'array',\n example: { before: { a: 1 }, after: [] },\n dataLossSeverity: 'certain',\n stepName: 'object → array',\n },\n {\n fromType: 'array',\n toType: 'object',\n example: { before: [1, 2], after: {} },\n dataLossSeverity: 'certain',\n stepName: 'array → object',\n },\n];\n\nconst sampleValues: Record<SchemaType, unknown> = {\n string: 'hello',\n number: 42,\n boolean: true,\n object: { a: 1 },\n array: [1, 2],\n ref: null,\n unknown: null,\n};\n\nconst validSchemaTypes = new Set<SchemaType>([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'ref',\n 'unknown',\n]);\n\nfunction toSchemaType(typeStr: string): SchemaType {\n return validSchemaTypes.has(typeStr as SchemaType)\n ? (typeStr as SchemaType)\n : 'unknown';\n}\n\nfunction parseTypeString(typeStr: string): {\n baseType: SchemaType;\n itemsType?: SchemaType;\n} {\n const arrayMatch = /^array<(.+)>$/.exec(typeStr);\n if (arrayMatch?.[1]) {\n return { baseType: 'array', itemsType: toSchemaType(arrayMatch[1]) };\n }\n return { baseType: toSchemaType(typeStr) };\n}\n\nfunction findTransformationRule(\n fromType: SchemaType,\n toType: SchemaType,\n): TransformationRule | null {\n if (fromType === toType) {\n return null;\n }\n return (\n transformationRules.find(\n (rule) => rule.fromType === fromType && rule.toType === toType,\n ) ?? null\n );\n}\n\nfunction transformValue(\n value: unknown,\n fromType: SchemaType,\n toType: SchemaType,\n): unknown {\n if (fromType === toType) {\n return value;\n }\n switch (toType) {\n case 'string':\n return String(value);\n case 'number':\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return typeof value === 'number' ? value : 0;\n case 'boolean':\n return Boolean(value);\n default:\n return value;\n }\n}\n\nfunction getConversionSeverity(\n fromType: SchemaType,\n toType: SchemaType,\n): DataLossSeverity {\n if (fromType === toType) {\n return 'none';\n }\n const rule = findTransformationRule(fromType, toType);\n return rule ? rule.dataLossSeverity : 'certain';\n}\n\nfunction maxSeverity(\n a: DataLossSeverity,\n b: DataLossSeverity,\n): DataLossSeverity {\n const order: DataLossSeverity[] = ['none', 'possible', 'certain'];\n return order[Math.max(order.indexOf(a), order.indexOf(b))] ?? 'certain';\n}\n\nfunction computeOverallSeverity(steps: TransformationStep[]): DataLossSeverity {\n return steps.reduce<DataLossSeverity>(\n (acc, step) => maxSeverity(acc, step.dataLossSeverity),\n 'none',\n );\n}\n\nfunction buildTransformationSteps(\n ctx: TransformationContext,\n): TransformationStep[] {\n const { fromType, toType, fromItemsType, toItemsType } = ctx;\n const steps: TransformationStep[] = [];\n\n if (\n toType === 'array' &&\n toItemsType !== undefined &&\n fromType !== 'array' &&\n fromType !== 'object'\n ) {\n steps.push({ name: 'wrap in array', dataLossSeverity: 'none' });\n if (fromType !== toItemsType) {\n const severity = getConversionSeverity(fromType, toItemsType);\n steps.push({\n name: `${fromType} → ${toItemsType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'array' &&\n fromItemsType !== undefined &&\n toType !== 'array' &&\n toType !== 'object'\n ) {\n steps.push({\n name: 'unwrap array (first element)',\n dataLossSeverity: 'possible',\n });\n if (fromItemsType !== toType) {\n const severity = getConversionSeverity(fromItemsType, toType);\n steps.push({\n name: `${fromItemsType} → ${toType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'object' ||\n toType === 'object' ||\n fromType === 'array' ||\n toType === 'array'\n ) {\n steps.push({\n name: `${fromType} → ${toType}`,\n dataLossSeverity: 'certain',\n });\n } else {\n const severity = getConversionSeverity(fromType, toType);\n steps.push({ name: `${fromType} → ${toType}`, dataLossSeverity: severity });\n }\n\n return steps;\n}\n\nfunction computeArrayTransformationExample(\n fromType: SchemaType,\n itemsType: SchemaType,\n): { before: unknown; after: unknown } {\n const before = sampleValues[fromType];\n const transformedValue = transformValue(before, fromType, itemsType);\n return { before, after: [transformedValue] };\n}\n\nfunction computeArrayToPrimitiveExample(\n fromItemsType: SchemaType,\n toType: SchemaType,\n): { before: unknown; after: unknown } {\n const itemValue = sampleValues[fromItemsType];\n const before = [itemValue, itemValue];\n const after = transformValue(itemValue, fromItemsType, toType);\n return { before, after };\n}\n\nexport function getTransformationInfoFromTypeChange(\n fromType: string,\n toType: string,\n): TransformationInfo | null {\n if (fromType === toType) {\n return null;\n }\n\n const from = parseTypeString(fromType);\n const to = parseTypeString(toType);\n\n if (from.baseType === 'unknown' || to.baseType === 'unknown') {\n return null;\n }\n\n if (\n to.baseType === 'array' &&\n to.itemsType &&\n from.baseType !== 'array' &&\n from.baseType !== 'object'\n ) {\n const example = computeArrayTransformationExample(\n from.baseType,\n to.itemsType,\n );\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n toItemsType: to.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n if (\n from.baseType === 'array' &&\n from.itemsType &&\n to.baseType !== 'array' &&\n to.baseType !== 'object'\n ) {\n const example = computeArrayToPrimitiveExample(from.itemsType, to.baseType);\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n fromItemsType: from.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n const rule = findTransformationRule(from.baseType, to.baseType);\n if (rule) {\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n });\n return {\n fromType,\n toType,\n example: rule.example,\n dataLossSeverity: rule.dataLossSeverity,\n steps,\n };\n }\n\n return {\n fromType,\n toType,\n example: { before: '?', after: '?' },\n dataLossSeverity: 'certain',\n steps: [\n {\n name: `${from.baseType} → ${to.baseType}`,\n dataLossSeverity: 'certain',\n },\n ],\n };\n}\n","import type { JsonSchemaType } from '../schema/JsonSchema';\n\nexport interface DefaultValueExample {\n value: unknown;\n type: string;\n foreignKeyTableId?: string;\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\nfunction getTypeFromSchema(schema: JsonSchemaType): SchemaType {\n if ('$ref' in schema) {\n return 'ref';\n }\n if ('type' in schema) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: JsonSchemaType): string | undefined {\n if ('type' in schema && schema.type === 'string' && 'foreignKey' in schema) {\n const fk = (schema as { foreignKey?: string }).foreignKey;\n return fk || undefined;\n }\n return undefined;\n}\n\nfunction getDefaultForPrimitive(\n schema: JsonSchemaType,\n fallback: unknown,\n): unknown {\n return 'default' in schema ? schema.default : fallback;\n}\n\nfunction getDefaultForArray(schema: JsonSchemaType): unknown {\n if ('default' in schema) {\n return schema.default;\n }\n const arrSchema = schema as { items?: JsonSchemaType };\n if (arrSchema.items) {\n return [getDefaultValueFromSchema(arrSchema.items)];\n }\n return [];\n}\n\nfunction getDefaultForObject(schema: JsonSchemaType): unknown {\n if ('default' in schema) {\n return schema.default;\n }\n const objSchema = schema as { properties?: Record<string, JsonSchemaType> };\n if (!objSchema.properties) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(objSchema.properties).map(([key, propSchema]) => [\n key,\n getDefaultValueFromSchema(propSchema),\n ]),\n );\n}\n\nconst typeHandlers: Record<string, (schema: JsonSchemaType) => unknown> = {\n string: (schema) => getDefaultForPrimitive(schema, ''),\n number: (schema) => getDefaultForPrimitive(schema, 0),\n boolean: (schema) => getDefaultForPrimitive(schema, false),\n array: getDefaultForArray,\n object: getDefaultForObject,\n};\n\nexport function getDefaultValueFromSchema(schema: JsonSchemaType): unknown {\n if ('$ref' in schema) {\n return null;\n }\n\n if (!('type' in schema)) {\n return null;\n }\n\n const handler = typeHandlers[schema.type];\n return handler ? handler(schema) : null;\n}\n\ninterface AddPatch {\n op: 'add';\n path: string;\n value: JsonSchemaType;\n}\n\nexport function getDefaultValueExample(\n patch: AddPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add') {\n return null;\n }\n\n const value = getDefaultValueFromSchema(patch.value);\n const type = getTypeFromSchema(patch.value);\n const foreignKeyTableId = getForeignKeyTableId(patch.value);\n\n return { value, type, foreignKeyTableId };\n}\n","import { makeAutoObservable } from 'mobx';\nimport { SchemaTree } from '../tree/SchemaTree';\nimport { SchemaDiff } from '../diff/SchemaDiff';\nimport { SchemaParser } from '../schema/SchemaParser';\nimport { SchemaValidator } from '../validation/SchemaValidator';\nimport { FormulaValidator } from '../validation/FormulaValidator';\nimport { ParsedFormula, FormulaError } from '../formula';\nimport { NodeFactory } from '../node/NodeFactory';\nimport { NodeType } from '../node/NodeType';\nimport { NULL_NODE } from '../node/NullNode';\nimport type { JsonObjectSchema } from '../schema/JsonSchema';\nimport type { SchemaPatch } from '../diff/index';\nimport type { ValidationError } from '../validation/SchemaValidator';\nimport type { FormulaValidationError } from '../validation/FormulaValidator';\nimport type { SchemaNode } from '../node/SchemaNode';\nimport type { FormulaDependent } from '../formula';\nimport type { StringNode } from '../node/StringNode';\n\nexport interface ReplaceResult {\n replacedNodeId: string;\n newNodeId: string;\n}\n\nexport interface FormulaUpdateResult {\n success: boolean;\n error?: string;\n}\n\ninterface FormulaParseError {\n nodeId: string;\n expression: string;\n message: string;\n}\n\nexport class SchemaEngine {\n private readonly _tree: SchemaTree;\n private readonly _diff: SchemaDiff;\n private readonly _schemaValidator = new SchemaValidator();\n private readonly _formulaValidator: FormulaValidator;\n private _formulaParseErrors: FormulaParseError[] = [];\n\n constructor(jsonSchema: JsonObjectSchema) {\n const parser = new SchemaParser();\n const root = parser.parse(jsonSchema);\n this._tree = new SchemaTree(root);\n this._formulaValidator = new FormulaValidator(this._tree);\n\n this._formulaParseErrors = this.applyPendingFormulas(\n parser.getPendingFormulas(),\n );\n\n this._diff = new SchemaDiff(this._tree);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private applyPendingFormulas(\n pending: { nodeId: string; expression: string }[],\n ): FormulaParseError[] {\n const errors: FormulaParseError[] = [];\n\n for (const { nodeId, expression } of pending) {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n continue;\n }\n\n try {\n const formula = new ParsedFormula(this._tree, nodeId, expression);\n node.setFormula(formula);\n this._tree.registerFormula(nodeId, formula);\n } catch (error) {\n const message = this.extractErrorMessage(error);\n errors.push({ nodeId, expression, message });\n }\n }\n\n return errors;\n }\n\n private extractErrorMessage(error: unknown): string {\n if (error instanceof FormulaError) {\n return error.message;\n }\n if (error instanceof Error) {\n return error.message;\n }\n return 'Unknown formula error';\n }\n\n public get tree(): SchemaTree {\n return this._tree;\n }\n\n public get diff(): SchemaDiff {\n return this._diff;\n }\n\n public root(): SchemaNode {\n return this._tree.root();\n }\n\n public nodeById(nodeId: string): SchemaNode {\n return this._tree.nodeById(nodeId);\n }\n\n public countNodes(): number {\n return this._tree.countNodes();\n }\n\n public getFormulaDependents(nodeId: string): FormulaDependent[] {\n return this._tree.getDirectFormulaDependents(nodeId);\n }\n\n public get isDirty(): boolean {\n return this._diff.isDirty();\n }\n\n public get isValid(): boolean {\n const root = this._tree.root();\n if (root.isNull()) {\n return false;\n }\n if (root.isObject()) {\n return root.properties().length > 0;\n }\n return true;\n }\n\n public get validationErrors(): readonly ValidationError[] {\n return this._schemaValidator.validate(this._tree.root());\n }\n\n public validateFormulas(): FormulaValidationError[] {\n const validatorErrors = this._formulaValidator.validate();\n const parseErrors: FormulaValidationError[] = this._formulaParseErrors.map(\n (e) => ({\n nodeId: e.nodeId,\n message: e.message,\n }),\n );\n return [...parseErrors, ...validatorErrors];\n }\n\n public markAsSaved(): void {\n this._diff.markAsSaved();\n }\n\n public revert(): void {\n const baseSchema = this._diff.getBaseSchema();\n const parser = new SchemaParser();\n const root = parser.parse(baseSchema);\n\n this._tree.clearFormulaIndex();\n this._tree.replaceRoot(root);\n this._formulaParseErrors = this.applyPendingFormulas(\n parser.getPendingFormulas(),\n );\n\n this._diff.markAsSaved();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._diff.getPatches();\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._diff.getCurrentSchema();\n }\n\n public canMoveNode(fromNodeId: string, toNodeId: string): boolean {\n return this._tree.canMoveNode(fromNodeId, toNodeId);\n }\n\n public hasValidDropTarget(nodeId: string): boolean {\n return this._tree.hasValidDropTarget(nodeId);\n }\n\n public moveNode(nodeId: string, targetObjectId: string): void {\n if (!this.canMoveNode(nodeId, targetObjectId)) {\n return;\n }\n this._tree.moveNode(nodeId, targetObjectId);\n }\n\n public renameNode(nodeId: string, newName: string): void {\n this._tree.renameNode(nodeId, newName);\n }\n\n public updateNodeMetadata(\n nodeId: string,\n metadata: { description?: string; deprecated?: boolean },\n ): void {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n const currentMeta = node.metadata();\n node.setMetadata({\n description:\n 'description' in metadata\n ? metadata.description || undefined\n : currentMeta.description,\n deprecated:\n 'deprecated' in metadata ? metadata.deprecated : currentMeta.deprecated,\n });\n }\n\n public updateDefaultValue(\n nodeId: string,\n value: string | number | boolean | undefined,\n ): void {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return;\n }\n node.setDefaultValue(value);\n }\n\n public addChild(parentId: string, name: string): SchemaNode {\n const parent = this._tree.nodeById(parentId);\n if (parent.isNull() || !parent.isObject()) {\n return NULL_NODE;\n }\n const newNode = NodeFactory.string(name);\n this._tree.addChildTo(parentId, newNode);\n return newNode;\n }\n\n public removeNode(nodeId: string): boolean {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return false;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return false;\n }\n this._tree.removeNodeAt(path);\n return true;\n }\n\n public replaceNode(\n nodeId: string,\n newNode: SchemaNode,\n ): ReplaceResult | null {\n const currentNode = this._tree.nodeById(nodeId);\n if (currentNode.isNull()) {\n return null;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return null;\n }\n this._tree.setNodeAt(path, newNode);\n this._diff.trackReplacement(nodeId, newNode.id());\n return {\n replacedNodeId: nodeId,\n newNodeId: newNode.id(),\n };\n }\n\n public wrapInArray(nodeId: string): ReplaceResult | null {\n const currentNode = this._tree.nodeById(nodeId);\n if (currentNode.isNull()) {\n return null;\n }\n if (currentNode.isArray()) {\n return null;\n }\n const path = this._tree.pathOf(nodeId);\n if (path.isEmpty()) {\n return null;\n }\n const name = currentNode.name();\n const arrayNode = NodeFactory.array(name, currentNode);\n this._tree.setNodeAt(path, arrayNode);\n currentNode.setName('');\n this._diff.trackReplacement(nodeId, arrayNode.id());\n return {\n replacedNodeId: nodeId,\n newNodeId: arrayNode.id(),\n };\n }\n\n public replaceRootWith(newNode: SchemaNode): ReplaceResult | null {\n const currentRoot = this._tree.root();\n if (currentRoot.isNull()) {\n return null;\n }\n const oldId = currentRoot.id();\n newNode.setName(currentRoot.name());\n this._tree.replaceRoot(newNode);\n this._diff.trackReplacement(oldId, newNode.id());\n return {\n replacedNodeId: oldId,\n newNodeId: newNode.id(),\n };\n }\n\n public wrapRootInArray(): ReplaceResult | null {\n const currentRoot = this._tree.root();\n if (currentRoot.isNull() || currentRoot.isArray()) {\n return null;\n }\n const oldId = currentRoot.id();\n const name = currentRoot.name();\n const arrayNode = NodeFactory.array(name, currentRoot);\n currentRoot.setName('');\n this._tree.replaceRoot(arrayNode);\n this._diff.trackReplacement(oldId, arrayNode.id());\n return {\n replacedNodeId: oldId,\n newNodeId: arrayNode.id(),\n };\n }\n\n public updateForeignKey(nodeId: string, tableId: string): boolean {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull() || node.nodeType() !== NodeType.String) {\n return false;\n }\n (node as StringNode).setForeignKey(tableId || undefined);\n return true;\n }\n\n public updateFormula(\n nodeId: string,\n expression: string | undefined,\n ): FormulaUpdateResult {\n const node = this._tree.nodeById(nodeId);\n if (node.isNull()) {\n return { success: false, error: 'Node not found' };\n }\n try {\n const formula = expression\n ? new ParsedFormula(this._tree, nodeId, expression)\n : undefined;\n node.setFormula(formula);\n if (formula) {\n this._tree.registerFormula(nodeId, formula);\n } else {\n this._tree.unregisterFormula(nodeId);\n }\n this._formulaParseErrors = this._formulaParseErrors.filter(\n (e) => e.nodeId !== nodeId,\n );\n return { success: true };\n } catch (error) {\n const errorMessage =\n error instanceof FormulaError ? error.message : String(error);\n return { success: false, error: errorMessage };\n }\n }\n\n public createStringNode(name: string): SchemaNode {\n return NodeFactory.string(name);\n }\n\n public createNumberNode(name: string): SchemaNode {\n return NodeFactory.number(name);\n }\n}\n","import { SystemSchemaIds, getLabelByRef } from '../types';\nimport { NodeFactory, type SchemaNode } from '../model';\n\nexport enum SchemaTypeIds {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n Object = 'Object',\n Array = 'Array',\n ForeignKeyString = 'ForeignKeyString',\n File = 'File',\n RowId = 'RowId',\n RowVersionId = 'RowVersionId',\n RowCreatedId = 'RowCreatedId',\n RowCreatedAt = 'RowCreatedAt',\n RowPublishedAt = 'RowPublishedAt',\n RowUpdatedAt = 'RowUpdatedAt',\n RowHash = 'RowHash',\n RowSchemaHash = 'RowSchemaHash',\n Markdown = 'Markdown',\n}\n\nexport function createNodeByTypeId(\n typeId: SchemaTypeIds | string,\n name: string,\n): SchemaNode | null {\n switch (typeId as SchemaTypeIds) {\n case SchemaTypeIds.String:\n return NodeFactory.string(name);\n case SchemaTypeIds.Number:\n return NodeFactory.number(name);\n case SchemaTypeIds.Boolean:\n return NodeFactory.boolean(name);\n case SchemaTypeIds.Object:\n return NodeFactory.object(name);\n case SchemaTypeIds.Array:\n return NodeFactory.array(name, NodeFactory.string(''));\n case SchemaTypeIds.ForeignKeyString:\n return NodeFactory.string(name, { foreignKey: '' });\n case SchemaTypeIds.File:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.File });\n case SchemaTypeIds.RowId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowId });\n case SchemaTypeIds.RowVersionId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowVersionId });\n case SchemaTypeIds.RowCreatedId:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowCreatedId });\n case SchemaTypeIds.RowCreatedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowCreatedAt });\n case SchemaTypeIds.RowPublishedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowPublishedAt });\n case SchemaTypeIds.RowUpdatedAt:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowUpdatedAt });\n case SchemaTypeIds.RowHash:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowHash });\n case SchemaTypeIds.RowSchemaHash:\n return NodeFactory.ref(name, { $ref: SystemSchemaIds.RowSchemaHash });\n case SchemaTypeIds.Markdown:\n return NodeFactory.string(name, { contentMediaType: 'text/markdown' });\n default:\n return null;\n }\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\ntype MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\ntype MenuGroup = {\n id: string;\n options: MenuOptionItem[];\n addDividerAfter?: boolean;\n};\n\nconst typesOptions: MenuOptionItem[] = [\n { id: SchemaTypeIds.String, label: 'string' },\n { id: SchemaTypeIds.Number, label: 'number' },\n { id: SchemaTypeIds.Boolean, label: 'boolean' },\n { id: SchemaTypeIds.Object, label: 'object' },\n { id: SchemaTypeIds.Array, label: 'array' },\n { id: SchemaTypeIds.ForeignKeyString, label: 'foreign key' },\n];\n\nconst schemasOptions: MenuOptionItem[] = [\n {\n id: 'schemas-submenu',\n label: 'Schemas',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.File, label: getLabelByRef(SystemSchemaIds.File) },\n { id: SchemaTypeIds.Markdown, label: 'Markdown' },\n ],\n },\n];\n\nconst systemFieldsOptions: MenuOptionItem[] = [\n {\n id: 'system-fields-submenu',\n label: 'System fields',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.RowId, label: getLabelByRef(SystemSchemaIds.RowId) },\n {\n id: SchemaTypeIds.RowVersionId,\n label: getLabelByRef(SystemSchemaIds.RowVersionId),\n },\n {\n id: SchemaTypeIds.RowCreatedId,\n label: getLabelByRef(SystemSchemaIds.RowCreatedId),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowCreatedAt,\n label: getLabelByRef(SystemSchemaIds.RowCreatedAt),\n },\n {\n id: SchemaTypeIds.RowPublishedAt,\n label: getLabelByRef(SystemSchemaIds.RowPublishedAt),\n },\n {\n id: SchemaTypeIds.RowUpdatedAt,\n label: getLabelByRef(SystemSchemaIds.RowUpdatedAt),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowHash,\n label: getLabelByRef(SystemSchemaIds.RowHash),\n },\n {\n id: SchemaTypeIds.RowSchemaHash,\n label: getLabelByRef(SystemSchemaIds.RowSchemaHash),\n },\n ],\n },\n];\n\nexport const typeMenuGroups: MenuGroup[] = [\n { id: 'types', options: typesOptions, addDividerAfter: true },\n { id: 'schemas', options: schemasOptions, addDividerAfter: true },\n { id: 'system-fields', options: systemFieldsOptions },\n];\n\nexport type { MenuOptionItem, MenuGroup };\n","import { JsonSchemaTypeName, SystemSchemaIds } from '../types';\nimport type { JsonObjectSchema } from '../model';\n\nexport const fileSchema: JsonObjectSchema = {\n type: JsonSchemaTypeName.Object,\n properties: {\n status: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n fileId: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n url: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n fileName: { type: JsonSchemaTypeName.String, default: '' },\n hash: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n extension: {\n type: JsonSchemaTypeName.String,\n default: '',\n readOnly: true,\n },\n mimeType: { type: JsonSchemaTypeName.String, default: '', readOnly: true },\n size: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n width: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n height: { type: JsonSchemaTypeName.Number, default: 0, readOnly: true },\n },\n required: [\n 'status',\n 'fileId',\n 'url',\n 'fileName',\n 'hash',\n 'extension',\n 'mimeType',\n 'size',\n 'width',\n 'height',\n ],\n additionalProperties: false,\n};\n\nexport const systemSchemaRegistry: Record<string, JsonObjectSchema> = {\n [SystemSchemaIds.File]: fileSchema,\n};\n\nexport const getResolvedSchema = (ref: string): JsonObjectSchema | null => {\n if (Object.hasOwn(systemSchemaRegistry, ref)) {\n return systemSchemaRegistry[ref] ?? null;\n }\n return null;\n};\n\nexport const isResolvableRef = (ref: string): boolean => {\n return Object.hasOwn(systemSchemaRegistry, ref);\n};\n","import type { SchemaNode } from '../model';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM as ObjectNodeVMType } from './ObjectNodeVM';\nimport type { ArrayNodeVM as ArrayNodeVMType } from './ArrayNodeVM';\nimport type { PrimitiveNodeVM as PrimitiveNodeVMType } from './PrimitiveNodeVM';\nimport type { RefNodeVM as RefNodeVMType } from './RefNodeVM';\nimport type { ForeignKeyNodeVM as ForeignKeyNodeVMType } from './ForeignKeyNodeVM';\n\nexport type NodeVM =\n | ObjectNodeVMType\n | ArrayNodeVMType\n | PrimitiveNodeVMType\n | RefNodeVMType\n | ForeignKeyNodeVMType;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype NodeVMClass = new (...args: any[]) => NodeVM;\n\ninterface VMRegistry {\n ObjectNodeVM?: NodeVMClass;\n ArrayNodeVM?: NodeVMClass;\n PrimitiveNodeVM?: NodeVMClass;\n RefNodeVM?: NodeVMClass;\n ForeignKeyNodeVM?: NodeVMClass;\n}\n\nconst registry: VMRegistry = {};\n\nexport function registerVMClass(\n name: keyof VMRegistry,\n VMClass: NodeVMClass,\n): void {\n registry[name] = VMClass;\n}\n\nexport function createNodeVM(\n node: SchemaNode,\n editor: SchemaEditorVM,\n parent: ObjectNodeVMType | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n): NodeVM {\n if (node.isObject()) {\n const VMClass = registry.ObjectNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ObjectNodeVM not registered. Import ObjectNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(node, editor, parent, isRoot, isReadonly);\n }\n\n if (node.isArray()) {\n const VMClass = registry.ArrayNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ArrayNodeVM not registered. Import ArrayNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(node, editor, parent, isRoot, isReadonly);\n }\n\n if (node.isRef()) {\n const VMClass = registry.RefNodeVM;\n if (!VMClass) {\n throw new Error(\n 'RefNodeVM not registered. Import RefNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n }\n\n if (node.foreignKey() !== undefined) {\n const VMClass = registry.ForeignKeyNodeVM;\n if (!VMClass) {\n throw new Error(\n 'ForeignKeyNodeVM not registered. Import ForeignKeyNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n }\n\n const VMClass = registry.PrimitiveNodeVM;\n if (!VMClass) {\n throw new Error(\n 'PrimitiveNodeVM not registered. Import PrimitiveNodeVM before using createNodeVM.',\n );\n }\n return new VMClass(\n node,\n editor,\n parent as ObjectNodeVMType,\n isRoot,\n isReadonly,\n );\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { getLabelByRef } from '../types';\nimport { NodeType, type SchemaNode, type FormulaDependent } from '../model';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\n\nexport abstract class BaseNodeVM {\n public isFocusedState = false;\n public isMenuOpenState = false;\n public isSettingsOpenState = false;\n\n constructor(\n protected readonly _node: SchemaNode,\n protected readonly _editor: SchemaEditorVM,\n protected readonly _isRoot: boolean = false,\n protected readonly _isReadonly: boolean = false,\n ) {\n makeObservable(this, {\n isFocusedState: observable,\n isMenuOpenState: observable,\n isSettingsOpenState: observable,\n nodeId: computed,\n name: computed,\n path: computed,\n type: computed,\n label: computed,\n isFocused: computed,\n isMenuOpen: computed,\n isSettingsOpen: computed,\n shouldApplyFieldStyles: computed,\n isCollapsible: computed,\n isObject: computed,\n isArray: computed,\n isPrimitive: computed,\n isString: computed,\n isNumber: computed,\n isBoolean: computed,\n showTypeSelector: computed,\n showMenu: computed,\n hasDescription: computed,\n isDeprecated: computed,\n description: computed,\n hasFormula: computed,\n formula: computed,\n formulaDependents: computed,\n canDelete: computed,\n deleteBlockedReason: computed,\n defaultValue: computed,\n defaultValueAsString: computed,\n validationError: computed,\n hasError: computed,\n errorMessage: computed,\n canDrag: computed,\n isValidDropTarget: computed,\n isReadonly: computed,\n setFocused: action.bound,\n setMenuOpen: action.bound,\n setSettingsOpen: action.bound,\n rename: action.bound,\n setDescription: action.bound,\n setDeprecated: action.bound,\n setFormula: action.bound,\n setDefault: action.bound,\n handleFieldBlur: action.bound,\n });\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get node(): SchemaNode {\n return this._node;\n }\n\n public get nodeId(): string {\n return this._node.id();\n }\n\n public get isRoot(): boolean {\n return this._isRoot;\n }\n\n public get name(): string {\n if (this._isRoot) {\n return this._editor.tableId;\n }\n return this._node.name();\n }\n\n public get path(): string {\n return this._node.name();\n }\n\n public get type(): string {\n if (this._node.isRef()) {\n return 'ref';\n }\n return this._node.nodeType();\n }\n\n public get label(): string {\n if (this._node.isRef()) {\n const ref = this._node.ref();\n return getLabelByRef(ref) ?? ref;\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n return this._node.nodeType();\n }\n\n public get isFocused(): boolean {\n return this.isFocusedState;\n }\n\n public get isMenuOpen(): boolean {\n return this.isMenuOpenState;\n }\n\n public get isSettingsOpen(): boolean {\n return this.isSettingsOpenState;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.isFocusedState && !this.isMenuOpenState && !this.isSettingsOpenState\n );\n }\n\n public setFocused(value: boolean): void {\n this.isFocusedState = value;\n }\n\n public setMenuOpen(value: boolean): void {\n this.isMenuOpenState = value;\n }\n\n public setSettingsOpen(value: boolean): void {\n this.isSettingsOpenState = value;\n }\n\n public get isCollapsible(): boolean {\n return false;\n }\n\n public get isObject(): boolean {\n return this._node.isObject();\n }\n\n public get isArray(): boolean {\n return this._node.isArray();\n }\n\n public get isPrimitive(): boolean {\n return this._node.isPrimitive();\n }\n\n public get isString(): boolean {\n return this._node.nodeType() === NodeType.String;\n }\n\n public get isNumber(): boolean {\n return this._node.nodeType() === NodeType.Number;\n }\n\n public get isBoolean(): boolean {\n return this._node.nodeType() === NodeType.Boolean;\n }\n\n public get showTypeSelector(): boolean {\n return !this._isReadonly;\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public get hasDescription(): boolean {\n return Boolean(this._node.metadata().description);\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get description(): string {\n return this._node.metadata().description ?? '';\n }\n\n public get hasFormula(): boolean {\n return false;\n }\n\n public get formula(): string {\n return '';\n }\n\n public get formulaDependents(): FormulaDependent[] {\n return [];\n }\n\n public get canDelete(): boolean {\n return true;\n }\n\n public get deleteBlockedReason(): string | null {\n return null;\n }\n\n public get defaultValue(): unknown {\n return undefined;\n }\n\n public get defaultValueAsString(): string {\n return '';\n }\n\n public get validationError(): string | null {\n if (this._isRoot && this._editor.tableIdError) {\n return this._editor.tableIdError;\n }\n const errors = this._editor.engine.validationErrors;\n const error = errors.find((e) => e.nodeId === this.nodeId);\n return error?.message ?? null;\n }\n\n public get hasError(): boolean {\n return this.validationError !== null;\n }\n\n public get errorMessage(): string | null {\n return this.validationError;\n }\n\n public get canDrag(): boolean {\n if (this._isReadonly || this._isRoot || !this._node.name()) {\n return false;\n }\n return this._editor.engine.hasValidDropTarget(this.nodeId);\n }\n\n public get isValidDropTarget(): boolean {\n return false;\n }\n\n public rename(newName: string): void {\n if (newName !== this.name) {\n if (this._isRoot) {\n this._editor.setTableId(newName);\n } else {\n this._editor.engine.renameNode(this.nodeId, newName);\n }\n }\n }\n\n public setDescription(value: string): void {\n this._editor.engine.updateNodeMetadata(this.nodeId, { description: value });\n }\n\n public setDeprecated(value: boolean): void {\n this._editor.engine.updateNodeMetadata(this.nodeId, { deprecated: value });\n }\n\n public setFormula(_expression: string): void {\n // Override in subclasses that support formulas\n }\n\n public setDefault(_value: string): void {\n // Override in subclasses that support default values\n }\n\n public handleFieldBlur(): void {\n this.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.removeSelf();\n }\n }\n\n public canAcceptDrop(fromNodeId: string): boolean {\n return this._editor.engine.canMoveNode(fromNodeId, this.nodeId);\n }\n\n public remove(): void {\n this.removeSelf();\n }\n\n public abstract removeSelf(): void;\n public abstract changeType(typeId: string): void;\n}\n","import { makeObservable, observable, computed, action, override } from 'mobx';\nimport {\n parseDefaultValue,\n FormulaSerializer,\n type SchemaNode,\n type FormulaDependent,\n} from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { registerVMClass } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\ntype PrimitiveValue = string | number | boolean | undefined;\n\nexport class PrimitiveNodeVM extends BaseNodeVM {\n public formulaInputValue: string | null = null;\n public formulaErrorValue: string | null = null;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n makeObservable(this, {\n formulaInputValue: observable,\n formulaErrorValue: observable,\n hasFormula: override,\n formula: override,\n defaultValue: override,\n defaultValueAsString: override,\n formulaError: computed,\n formulaDependents: override,\n canDelete: override,\n deleteBlockedReason: override,\n setFormula: override,\n setDefault: override,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get formula(): string {\n if (this.formulaInputValue !== null) {\n return this.formulaInputValue;\n }\n const formula = this._node.formula();\n if (!formula) {\n return '';\n }\n return new FormulaSerializer(\n this._editor.engine.tree,\n this.nodeId,\n formula,\n ).serialize();\n }\n\n public get defaultValue(): PrimitiveValue {\n return this._node.defaultValue() as PrimitiveValue;\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined) {\n return '';\n }\n return String(value);\n }\n\n public get formulaError(): string | null {\n if (this.formulaErrorValue) {\n return this.formulaErrorValue;\n }\n const errors = this._editor.engine.validateFormulas();\n const error = errors.find((e) => e.nodeId === this.nodeId);\n return error?.message ?? null;\n }\n\n public override get hasError(): boolean {\n return this.validationError !== null || this.formulaError !== null;\n }\n\n public override get errorMessage(): string | null {\n return this.validationError ?? this.formulaError ?? null;\n }\n\n public get formulaDependents(): FormulaDependent[] {\n return this._editor.engine.getFormulaDependents(this.nodeId);\n }\n\n public get canDelete(): boolean {\n return this._parent !== null && this.formulaDependents.length === 0;\n }\n\n public get deleteBlockedReason(): string | null {\n const dependents = this.formulaDependents;\n if (dependents.length === 0) {\n return null;\n }\n const fieldNames = dependents.map((d) => d.fieldName).join(', ');\n return `Used by formulas: ${fieldNames}`;\n }\n\n public setFormula(expression: string): void {\n this.formulaInputValue = expression || null;\n const result = this._editor.engine.updateFormula(\n this.nodeId,\n expression || undefined,\n );\n if (result.success) {\n this.formulaErrorValue = null;\n } else if (result.error) {\n this.formulaErrorValue = result.error;\n }\n }\n\n public setDefault(valueStr: string): void {\n const value = parseDefaultValue(valueStr, this._node.nodeType());\n this._editor.engine.updateDefaultValue(this.nodeId, value);\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('PrimitiveNodeVM', PrimitiveNodeVM);\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class ArrayNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean;\n public itemsVMRef: NodeVM | null = null;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this.isCollapsedState = editor.shouldCollapseAll && !isRoot;\n\n makeObservable(this, {\n isCollapsedState: observable,\n itemsVMRef: observable.ref,\n isCollapsed: computed,\n itemsVM: computed,\n toggleCollapsed: action.bound,\n changeItemsType: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n this.initItemsVM();\n }\n\n private initItemsVM(): void {\n const items = this._node.items();\n if (!items.isNull()) {\n this.itemsVMRef = createNodeVM(items, this._editor, null);\n }\n }\n\n public override get isCollapsible(): boolean {\n return !this._isRoot;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get itemsVM(): NodeVM | null {\n return this.itemsVMRef;\n }\n\n public changeItemsType(typeId: string): void {\n if (!this.itemsVMRef) {\n return;\n }\n\n const currentItems = this._node.items();\n if (currentItems.isNull()) {\n return;\n }\n\n const newNode = this._editor.createNodeByTypeId(typeId, '');\n if (!newNode) {\n return;\n }\n\n const result = this._editor.engine.replaceNode(currentItems.id(), newNode);\n if (result) {\n this.itemsVMRef = createNodeVM(newNode, this._editor, null);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('ArrayNodeVM', ArrayNodeVM);\n","import { makeObservable, computed, action, override } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { registerVMClass } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class ForeignKeyNodeVM extends BaseNodeVM {\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n makeObservable(this, {\n label: override,\n foreignKeyValue: computed,\n setForeignKey: action.bound,\n selectForeignKey: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n }\n\n public override get label(): string {\n return 'foreign key';\n }\n\n public get foreignKeyValue(): string {\n return this._node.foreignKey() ?? '';\n }\n\n public setForeignKey(tableId: string | null): void {\n this._editor.engine.updateForeignKey(this.nodeId, tableId ?? '');\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._editor.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('ForeignKeyNodeVM', ForeignKeyNodeVM);\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode, SchemaParser } from '../model';\nimport { isResolvableRef, getResolvedSchema } from '../config/system-schemas';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\nimport type { ObjectNodeVM } from './ObjectNodeVM';\n\nexport class RefNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean = true;\n public childrenList: NodeVM[] = [];\n private readonly _isResolvable: boolean;\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this._isResolvable = isResolvableRef(node.ref());\n\n makeObservable(this, {\n isCollapsedState: observable,\n childrenList: observable.shallow,\n isCollapsed: computed,\n children: computed,\n toggleCollapsed: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n if (this._isResolvable) {\n this.initResolvedChildren();\n }\n }\n\n private initResolvedChildren(): void {\n const resolvedSchema = getResolvedSchema(this._node.ref());\n if (!resolvedSchema) {\n return;\n }\n\n const parser = new SchemaParser();\n const resolvedRoot = parser.parse(resolvedSchema);\n\n this.childrenList = resolvedRoot\n .properties()\n .map((child) => createNodeVM(child, this._editor, null, false, true));\n }\n\n public get ref(): string {\n return this._node.ref();\n }\n\n public override get isCollapsible(): boolean {\n return this._isResolvable;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get children(): readonly NodeVM[] {\n return this.childrenList;\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n}\n\nregisterVMClass('RefNodeVM', RefNodeVM);\n","import { makeAutoObservable } from 'mobx';\nimport { ViewerSwitcherMode } from '../types';\nimport {\n SchemaEngine,\n getDefaultValueFromSchema,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type ValidationError,\n type FormulaValidationError,\n type SchemaNode,\n} from '../model';\nimport {\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '../model/validation/FieldNameValidator';\nimport { createNodeByTypeId, SchemaTypeIds } from '../config';\nimport { createNodeVM, type NodeVM } from './createNodeVM';\nimport { PrimitiveNodeVM } from './PrimitiveNodeVM';\n\n// Import all VM classes to ensure they are registered\nimport './ArrayNodeVM';\nimport './ForeignKeyNodeVM';\nimport './RefNodeVM';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type SchemaEditorMode = 'creating' | 'updating';\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorOptions {\n tableId?: string;\n mode?: SchemaEditorMode;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onApprove?: () => Promise<boolean>;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorVM {\n private readonly _engine: SchemaEngine;\n private _rootNodeVM: NodeVM;\n\n private _tableId: string;\n private _initialTableId: string;\n private readonly _shouldCollapseAll: boolean;\n private readonly _mode: SchemaEditorMode;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n private _loading = false;\n private _viewMode: ViewerSwitcherMode = ViewerSwitcherMode.Tree;\n private _isChangesDialogOpen = false;\n private _createDialogViewMode: 'Example' | 'Schema' = 'Example';\n\n constructor(jsonSchema: JsonObjectSchema, options: SchemaEditorOptions = {}) {\n this._engine = new SchemaEngine(jsonSchema);\n\n this._tableId = options.tableId ?? '';\n this._initialTableId = this._tableId;\n this._mode = options.mode ?? 'creating';\n this._onApprove = options.onApprove ?? null;\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n const nodeCount = this._engine.countNodes();\n this._shouldCollapseAll = shouldCollapse && nodeCount >= complexity;\n\n this._rootNodeVM = createNodeVM(this._engine.root(), this, null, true);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get mode(): SchemaEditorMode {\n return this._mode;\n }\n\n public get engine(): SchemaEngine {\n return this._engine;\n }\n\n public get shouldCollapseAll(): boolean {\n return this._shouldCollapseAll;\n }\n\n public get tableId(): string {\n return this._tableId;\n }\n\n public get initialTableId(): string {\n return this._initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableId !== this._initialTableId;\n }\n\n public get tableIdError(): string | null {\n if (!isValidFieldName(this._tableId)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableId = value;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public setLoading(value: boolean): void {\n this._loading = value;\n }\n\n public get viewMode(): ViewerSwitcherMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewerSwitcherMode): void {\n this._viewMode = mode;\n }\n\n public get isChangesDialogOpen(): boolean {\n return this._isChangesDialogOpen;\n }\n\n public openChangesDialog(): void {\n this._isChangesDialogOpen = true;\n }\n\n public closeChangesDialog(): void {\n this._isChangesDialogOpen = false;\n }\n\n public get createDialogViewMode(): 'Example' | 'Schema' {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: 'Example' | 'Schema'): void {\n this._createDialogViewMode = mode;\n }\n\n public get rootNodeVM(): NodeVM {\n return this._rootNodeVM;\n }\n\n public get isDirty(): boolean {\n return this._engine.isDirty || this.isTableIdChanged;\n }\n\n public get isValid(): boolean {\n return this._engine.isValid;\n }\n\n public get isApproveDisabled(): boolean {\n return !this.isValid || !this.isDirty;\n }\n\n public get patchesCount(): number {\n return this.getPatches().length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public get validationErrors(): readonly ValidationError[] {\n return this._engine.validationErrors;\n }\n\n public get formulaErrors(): FormulaValidationError[] {\n const engineErrors = this._engine.validateFormulas();\n const inputErrors = this.collectFormulaInputErrors(this._rootNodeVM);\n return [...engineErrors, ...inputErrors];\n }\n\n private collectFormulaInputErrors(nodeVM: NodeVM): FormulaValidationError[] {\n const errors: FormulaValidationError[] = [];\n\n if (nodeVM instanceof PrimitiveNodeVM && nodeVM.formulaErrorValue) {\n errors.push({\n nodeId: nodeVM.nodeId,\n fieldPath: nodeVM.name || undefined,\n message: nodeVM.formulaErrorValue,\n });\n }\n\n if ('children' in nodeVM && Array.isArray(nodeVM.children)) {\n for (const child of nodeVM.children as NodeVM[]) {\n errors.push(...this.collectFormulaInputErrors(child));\n }\n }\n\n if ('itemsVM' in nodeVM && nodeVM.itemsVM) {\n errors.push(...this.collectFormulaInputErrors(nodeVM.itemsVM));\n }\n\n return errors;\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public markAsSaved(): void {\n this._engine.markAsSaved();\n this._initialTableId = this._tableId;\n }\n\n public revert(): void {\n this._engine.revert();\n this._tableId = this._initialTableId;\n this._rootNodeVM = createNodeVM(this._engine.root(), this, null, true);\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._engine.root();\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === SchemaTypeIds.Array && !currentRoot.isArray()) {\n const result = this._engine.wrapRootInArray();\n if (result) {\n const arrayNode = this._engine.nodeById(result.newNodeId);\n this._rootNodeVM = createNodeVM(arrayNode, this, null, true);\n }\n return;\n }\n\n const newNode = this.createNodeByTypeId(typeId, currentRoot.name());\n if (newNode) {\n const result = this._engine.replaceRootWith(newNode);\n if (result) {\n this._rootNodeVM = createNodeVM(newNode, this, null, true);\n }\n }\n }\n\n public async selectForeignKey(): Promise<string | null> {\n if (!this._onSelectForeignKey) {\n return null;\n }\n return this._onSelectForeignKey();\n }\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._loading = true;\n try {\n const success = await this._onApprove();\n if (success) {\n this.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._loading = false;\n }\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._engine.getPatches();\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._engine.getPatches().map((p) => p.patch);\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._engine.getPlainSchema() as unknown as JsonObjectSchema;\n }\n\n public getExampleData(): unknown {\n return getDefaultValueFromSchema(this.getPlainSchema());\n }\n\n public createNodeByTypeId(typeId: string, name: string): SchemaNode | null {\n return createNodeByTypeId(typeId, name);\n }\n\n public dispose(): void {\n // Nothing to clean up now\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport { type SchemaNode } from '../model';\nimport { SchemaTypeIds } from '../config';\nimport { BaseNodeVM } from './BaseNodeVM';\nimport { createNodeVM, registerVMClass, type NodeVM } from './createNodeVM';\nimport type { SchemaEditorVM } from './SchemaEditorVM';\n\nexport class ObjectNodeVM extends BaseNodeVM {\n public isCollapsedState: boolean;\n public propertyList: NodeVM[] = [];\n\n constructor(\n node: SchemaNode,\n editor: SchemaEditorVM,\n private readonly _parent: ObjectNodeVM | null,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ) {\n super(node, editor, isRoot, isReadonly);\n\n this.isCollapsedState = editor.shouldCollapseAll && !isRoot;\n\n makeObservable(this, {\n isCollapsedState: observable,\n propertyList: observable.shallow,\n isCollapsed: computed,\n children: computed,\n showAddButton: computed,\n toggleCollapsed: action.bound,\n addProperty: action.bound,\n removeProperty: action.bound,\n replaceProperty: action.bound,\n moveNodeHere: action.bound,\n removeSelf: action.bound,\n changeType: action.bound,\n });\n\n this.initChildren();\n }\n\n private initChildren(): void {\n this.propertyList = this._node\n .properties()\n .map((child) => createNodeVM(child, this._editor, this));\n }\n\n public override get isCollapsible(): boolean {\n return !this._isRoot;\n }\n\n public get isCollapsed(): boolean {\n return this.isCollapsedState;\n }\n\n public toggleCollapsed(): void {\n this.isCollapsedState = !this.isCollapsedState;\n }\n\n public get children(): readonly NodeVM[] {\n return this.propertyList;\n }\n\n public get showAddButton(): boolean {\n return this._node.isObject();\n }\n\n public override get isValidDropTarget(): boolean {\n return true;\n }\n\n public addProperty(name: string): void {\n const newNode = this._editor.engine.addChild(this.nodeId, name);\n if (!newNode.isNull()) {\n const childVM = createNodeVM(newNode, this._editor, this);\n this.propertyList.push(childVM);\n }\n }\n\n public removeProperty(childVM: NodeVM): void {\n const removed = this._editor.engine.removeNode(childVM.nodeId);\n if (removed) {\n const index = this.propertyList.indexOf(childVM);\n if (index >= 0) {\n this.propertyList.splice(index, 1);\n }\n }\n }\n\n public replaceProperty(childVM: NodeVM, typeId: string): void {\n const currentNode = childVM.node;\n if (currentNode.isNull()) {\n return;\n }\n\n if (typeId === SchemaTypeIds.Array && !currentNode.isArray()) {\n const result = this._editor.engine.wrapInArray(childVM.nodeId);\n if (result) {\n const arrayNode = this._editor.engine.nodeById(result.newNodeId);\n const newVM = createNodeVM(arrayNode, this._editor, this);\n this.replacePropertyVM(childVM, newVM);\n }\n return;\n }\n\n const newNode = this._editor.createNodeByTypeId(typeId, currentNode.name());\n if (newNode) {\n const result = this._editor.engine.replaceNode(childVM.nodeId, newNode);\n if (result) {\n const newVM = createNodeVM(newNode, this._editor, this);\n this.replacePropertyVM(childVM, newVM);\n }\n }\n }\n\n private replacePropertyVM(oldVM: NodeVM, newVM: NodeVM): void {\n const index = this.propertyList.indexOf(oldVM);\n if (index >= 0) {\n this.propertyList[index] = newVM;\n }\n }\n\n public moveNodeHere(fromNodeId: string): void {\n const fromNode = this._editor.engine.nodeById(fromNodeId);\n if (fromNode.isNull()) {\n return;\n }\n\n this._editor.engine.moveNode(fromNodeId, this.nodeId);\n\n const movedNode = this._editor.engine.nodeById(fromNodeId);\n if (!movedNode.isNull()) {\n const rootVM = this._editor.rootNodeVM;\n if (rootVM instanceof ObjectNodeVM) {\n rootVM.removePropertyVMByNodeId(fromNodeId);\n }\n const movedVM = createNodeVM(movedNode, this._editor, this);\n this.propertyList.push(movedVM);\n }\n }\n\n public removeSelf(): void {\n if (this._parent) {\n this._parent.removeProperty(this);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isRoot) {\n this._editor.changeRootType(typeId);\n } else if (this._parent) {\n this._parent.replaceProperty(this, typeId);\n }\n }\n\n public removePropertyVMByNodeId(nodeId: string): boolean {\n const index = this.propertyList.findIndex((vm) => vm.nodeId === nodeId);\n if (index >= 0) {\n this.propertyList.splice(index, 1);\n return true;\n }\n for (const child of this.propertyList) {\n if (child instanceof ObjectNodeVM) {\n const found = child.removePropertyVMByNodeId(nodeId);\n if (found) {\n return true;\n }\n }\n }\n return false;\n }\n}\n\nregisterVMClass('ObjectNodeVM', ObjectNodeVM);\n","import { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface NodeWrapperProps {\n viewModel: BaseNodeVM;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n children?: ReactNode;\n}\n\nexport const NodeWrapper: FC<NodeWrapperProps> = observer(\n ({\n viewModel,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${viewModel.nodeId}`;\n const collapseButtonClass = `collapse-button-${viewModel.nodeId}`;\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n }\n : {};\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\n >\n <Flex\n gap=\"4px\"\n alignItems=\"center\"\n height=\"30px\"\n mt=\"2px\"\n mb=\"2px\"\n position=\"relative\"\n css={fieldHoverStyles}\n >\n <Box position=\"absolute\" ml=\"-60px\" height=\"100%\" width=\"60px\" />\n <Box\n className={dotOutlineClass}\n color=\"gray.300\"\n visibility={isCollapsed ? 'hidden' : 'visible'}\n >\n <PiDotOutlineFill />\n </Box>\n {isCollapsible && (\n <IconButton\n className={collapseButtonClass}\n visibility={isCollapsed ? 'visible' : 'hidden'}\n _hover={{ backgroundColor: 'transparent' }}\n ml=\"-8px\"\n position=\"absolute\"\n size=\"xs\"\n color=\"gray.400\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n width=\"26px\"\n height=\"26px\"\n >\n <Box rotate={isCollapsed ? '0' : '90deg'}>\n <MdOutlineChevronRight />\n </Box>\n </IconButton>\n )}\n {field}\n </Flex>\n {children && !isCollapsed && (\n <Flex\n ml=\"7px\"\n pl=\"18px\"\n borderLeftWidth={1}\n borderLeftStyle=\"solid\"\n borderLeftColor=\"white\"\n _hover={{ borderLeftColor: 'blackAlpha.200' }}\n >\n {children}\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Portal } from '@chakra-ui/react';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { FC, Fragment, ReactElement } from 'react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { typeMenuGroups, type MenuOptionItem } from '../../config/index';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <Box flex=\"1\">{label}</Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {options.map((option) => (\n <Fragment key={option.id}>\n <Menu.Item\n value={option.id}\n data-testid={`${dataTestIdPrefix}-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n {option.type !== 'submenu' && option.addDividerAfter && (\n <Menu.Separator />\n )}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\ninterface TypeMenuProps {\n menuButton: ReactElement;\n onSelect: (typeId: string) => void;\n dataTestId?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const TypeMenu: FC<TypeMenuProps> = ({\n menuButton,\n onSelect,\n dataTestId,\n open,\n onOpenChange,\n}) => {\n const handleOpenChange = (details: { open: boolean }) => {\n onOpenChange?.(details.open);\n };\n\n return (\n <Menu.Root open={open} onOpenChange={handleOpenChange}>\n <Menu.Trigger asChild>{menuButton}</Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {typeMenuGroups.map((group) => (\n <Fragment key={group.id}>\n {group.options.map((option) =>\n option.type === 'submenu' ? (\n <SubMenu\n key={option.id}\n label={option.label}\n options={option.items}\n onSelect={onSelect}\n dataTestIdPrefix={`${dataTestId}-menu-sub`}\n />\n ) : (\n <Menu.Item\n key={option.id}\n value={option.id}\n data-testid={`${dataTestId}-menu-type-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n ),\n )}\n {group.addDividerAfter && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import {\n draggable,\n dropTargetForElements,\n monitorForElements,\n type ElementEventBasePayload,\n type ElementDropTargetEventPayloadMap,\n} from '@atlaskit/drag-and-drop/adapter/element';\nimport type { CleanupFn } from '@atlaskit/drag-and-drop/types';\nimport { useEffect, useRef, useState } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport type { ObjectNodeVM } from '../../vm/ObjectNodeVM';\n\ntype DragAndDropData = Record<string, unknown> & {\n viewModel: BaseNodeVM;\n};\n\nconst getDragData = (data: Record<string, unknown>): BaseNodeVM | null => {\n const viewModel = data.viewModel;\n if (viewModel && typeof viewModel === 'object' && 'nodeId' in viewModel) {\n return viewModel as BaseNodeVM;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n viewModel: BaseNodeVM;\n onDrop?: (fromNodeId: string) => void;\n}\n\nexport const useDragAndDrop = ({\n viewModel,\n onDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n const [isDrop, setIsDrop] = useState(false);\n const [isDisabledDrop, setIsDisabledDrop] = useState(false);\n const [isDraggedOver, setIsDraggedOver] = useState(false);\n\n const isDraggable = viewModel.canDrag;\n const isDropTarget = viewModel.isValidDropTarget;\n\n useEffect(() => {\n if (!isDraggable || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ viewModel }),\n });\n\n return () => cleanup();\n }, [viewModel, isDraggable]);\n\n useEffect(() => {\n if (!isDropTarget || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = dropTargetForElements({\n element: dragAndDropRef.current,\n onDrop: (e: ElementDropTargetEventPayloadMap['onDrop']) => {\n const draggingViewModel = getDragData(e.source.data);\n\n if (\n draggingViewModel &&\n viewModel.canAcceptDrop(draggingViewModel.nodeId)\n ) {\n if (onDrop) {\n onDrop(draggingViewModel.nodeId);\n } else if ('moveNodeHere' in viewModel) {\n (viewModel as ObjectNodeVM).moveNodeHere(draggingViewModel.nodeId);\n }\n }\n\n setIsDraggedOver(false);\n setIsDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingViewModel = getDragData(e.source.data);\n if (draggingViewModel) {\n setIsDraggedOver(viewModel.canAcceptDrop(draggingViewModel.nodeId));\n }\n },\n onDragLeave: () => setIsDraggedOver(false),\n });\n\n return () => cleanup();\n }, [viewModel, isDropTarget, onDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingViewModel = getDragData(e.source.data);\n\n if (!draggingViewModel) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = viewModel.canAcceptDrop(draggingViewModel.nodeId);\n\n if (canAccept) {\n setIsDrop(true);\n } else {\n setIsDisabledDrop(true);\n }\n } else {\n setIsDisabledDrop(true);\n }\n },\n onDrop: () => {\n setIsDrop(false);\n setIsDisabledDrop(false);\n },\n });\n }, [viewModel, isDropTarget]);\n\n return {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDisabledDrop,\n isDraggedOver,\n };\n};\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport {\n PiDotsSixVerticalBold,\n PiWarningCircle,\n PiWarning,\n PiFunction,\n} from 'react-icons/pi';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { ContentEditable } from '../../../components/ContentEditable';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { TypeMenu } from '../TypeMenu/TypeMenu';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\n\ninterface FieldEditorProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const FieldEditor: FC<FieldEditorProps> = observer(\n ({ viewModel, dataTestId, hoverTargetClass, onChangeType, rightContent }) => {\n const applyHoverStyles = viewModel.shouldApplyFieldStyles;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(viewModel.name);\n const showTypeAndMenu = hasName || viewModel.isRoot;\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({ viewModel });\n\n return (\n <Flex gap=\"0.5rem\" width=\"100%\" justifyContent=\"flex-start\" outline={0}>\n <Flex\n data-testid={isDrop ? `${dataTestId}-drop` : undefined}\n ref={dragAndDropRef}\n flex={hasName ? 0 : 1}\n position=\"relative\"\n whiteSpace=\"nowrap\"\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n >\n {isDraggable && (\n <Tooltip\n content=\"Drag to move field to another object\"\n positioning={{ placement: 'left' }}\n >\n <Flex\n data-testid={`${dataTestId}-drag-button`}\n className={hoverClass}\n position=\"absolute\"\n left=\"-34px\"\n opacity={applyHoverStyles ? 0 : 1}\n cursor=\"grab\"\n _hover={{ backgroundColor: 'gray.50' }}\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"4px\"\n marginLeft=\"-6px\"\n >\n <Icon size=\"md\" color=\"gray.300\">\n <PiDotsSixVerticalBold />\n </Icon>\n </Flex>\n </Tooltip>\n )}\n {viewModel.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {viewModel.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!viewModel.name}\n initValue={viewModel.name}\n placeholder={\n viewModel.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={viewModel.handleFieldBlur}\n onFocus={() => viewModel.setFocused(true)}\n onChange={viewModel.rename}\n />\n )}\n {hasName && viewModel.hasError && (\n <Tooltip\n content={viewModel.errorMessage ?? ''}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\n color=\"red.500\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n ml=\"4px\"\n >\n <PiWarningCircle />\n </Box>\n </Tooltip>\n )}\n </Flex>\n {showTypeAndMenu && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {viewModel.isDeprecated && (\n <Tooltip content=\"Deprecated\" positioning={{ placement: 'top' }}>\n <Box\n color=\"orange.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiWarning />\n </Box>\n </Tooltip>\n )}\n {viewModel.hasFormula && (\n <Tooltip\n content={`Formula: ${viewModel.formula}`}\n positioning={{ placement: 'top' }}\n >\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiFunction />\n </Box>\n </Tooltip>\n )}\n <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {viewModel.showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={viewModel.isMenuOpen}\n onOpenChange={viewModel.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {viewModel.label}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {viewModel.label}\n </Text>\n )}\n {rightContent}\n </Flex>\n </Box>\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiTextT } from 'react-icons/pi';\nimport { Tooltip } from '../../../components';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface NodeIndicatorsProps {\n viewModel: BaseNodeVM;\n}\n\nexport const NodeIndicators: FC<NodeIndicatorsProps> = observer(\n ({ viewModel }) => {\n if (!viewModel.hasDescription) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\" color=\"gray.400\">\n <Tooltip\n content={viewModel.description}\n positioning={{ placement: 'top' }}\n >\n <Box cursor=\"default\">\n <PiTextT />\n </Box>\n </Tooltip>\n </Flex>\n );\n },\n);\n","import { RefObject, useCallback } from 'react';\n\n/**\n * Workaround for zag-js dismissable layer race condition bug.\n *\n * When a submenu closes, focus can briefly move to submenu content element.\n * The parent menu's onFocusOutside handler sees this as \"focus outside\"\n * and incorrectly closes the parent menu.\n *\n * This hook provides an onInteractOutside handler that prevents the parent\n * menu from closing when the interaction target is a submenu content element.\n *\n * @see https://github.com/chakra-ui/zag/commit/9817e4cb3b18d93408b95e7c827d35801b01a267\n * @see https://github.com/chakra-ui/zag/blob/main/.changeset/fix-nested-layer-dismissal.md\n *\n * This workaround can be removed when @zag-js/dismissable >= 1.34.0 is released\n * and included in @chakra-ui/react (current: 1.31.1). The fix adds recentlyRemoved\n * tracking to layerStack.isInNestedLayer() to ignore focus events during layer cleanup.\n *\n * @param contentRef - Ref to the parent menu content element\n * @returns onInteractOutside handler to pass to Menu.Root\n */\nexport function useFixZagNestedMenuDismiss(\n contentRef: RefObject<HTMLDivElement | null>,\n) {\n return useCallback(\n (e: { preventDefault: () => void }) => {\n const target = (e as unknown as { detail?: { originalEvent?: Event } })\n .detail?.originalEvent?.target;\n\n if (target instanceof Element) {\n const isSubmenuContent =\n target.closest('[data-scope=\"menu\"][data-part=\"content\"]') &&\n !contentRef.current?.contains(target);\n\n if (isSubmenuContent) {\n e.preventDefault();\n }\n }\n },\n [contentRef],\n );\n}\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiTextT, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface DescriptionSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(viewModel.description);\n\n const handleBlur = () => {\n viewModel.setDescription(localValue);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {viewModel.hasDescription && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.description}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Textarea\n size=\"sm\"\n placeholder=\"Add description...\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n rows={3}\n autoFocus\n data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface FormulaSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(viewModel.formula);\n\n const handleBlur = () => {\n viewModel.setFormula(localValue);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {viewModel.hasFormula && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Input\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n autoFocus\n data-testid={`${dataTestId}-formula-input`}\n />\n {localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt=\"1\">\n Field will be readOnly\n </Box>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useState } from 'react';\nimport { PiEquals, PiCaretRight } from 'react-icons/pi';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\n\ninterface DefaultValueSubmenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ viewModel, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n viewModel.defaultValueAsString,\n );\n\n const handleBlur = () => {\n viewModel.setDefault(localValue);\n };\n\n const handleBooleanChange = (checked: boolean) => {\n viewModel.setDefault(checked ? 'true' : 'false');\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {viewModel.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {viewModel.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {viewModel.isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={viewModel.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(viewModel.defaultValue !== true)\n }\n data-testid={`${dataTestId}-default-checkbox`}\n >\n true\n <Menu.ItemIndicator />\n </Menu.CheckboxItem>\n ) : (\n <Input\n size=\"sm\"\n type={viewModel.isNumber ? 'number' : 'text'}\n placeholder={viewModel.isNumber ? '0' : 'default value'}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n autoFocus\n data-testid={`${dataTestId}-default-input`}\n />\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCaretRight } from 'react-icons/pi';\nimport type { FormulaDependent } from '../../model';\n\ninterface UsedByFormulasSubmenuProps {\n formulaDependents: FormulaDependent[];\n}\n\nexport const UsedByFormulasSubmenu: FC<UsedByFormulasSubmenuProps> = ({\n formulaDependents,\n}) => {\n if (formulaDependents.length === 0) {\n return null;\n }\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem>\n <Box w=\"16px\" />\n <Box flex=\"1\">Used by formulas</Box>\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n bg=\"gray.100\"\n px=\"1.5\"\n borderRadius=\"full\"\n >\n {formulaDependents.length}\n </Box>\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"240px\">\n {formulaDependents.map((dep) => (\n <Box\n key={dep.formulaNodeId}\n py=\"1\"\n borderBottomWidth={1}\n borderColor=\"gray.100\"\n _last={{ borderBottomWidth: 0 }}\n >\n <Box fontSize=\"sm\" fontWeight=\"medium\">\n {dep.fieldName}\n </Box>\n <Box fontSize=\"xs\" color=\"gray.500\" fontFamily=\"mono\">\n {dep.expression}\n </Box>\n </Box>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useRef } from 'react';\nimport { PiTrash } from 'react-icons/pi';\nimport { SettingsButton } from '../../../components';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { useFixZagNestedMenuDismiss } from '../hooks/useFixZagNestedMenuDismiss';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\nimport { UsedByFormulasSubmenu } from './UsedByFormulasSubmenu';\n\ninterface NodeContextMenuProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const NodeContextMenu: FC<NodeContextMenuProps> = observer(\n ({\n viewModel,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n const handleInteractOutside = useFixZagNestedMenuDismiss(contentRef);\n\n const handleOpenChange = (details: { open: boolean }) => {\n viewModel.setSettingsOpen(details.open);\n };\n\n return (\n <Menu.Root\n open={viewModel.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n onInteractOutside={handleInteractOutside}\n >\n <Menu.Trigger asChild>\n <SettingsButton\n height=\"26px\"\n color=\"gray.300\"\n _hover={{ color: 'gray.400' }}\n dataTestId={dataTestId}\n />\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content ref={contentRef} minW=\"220px\">\n <DescriptionSubmenu\n viewModel={viewModel}\n dataTestId={dataTestId}\n />\n\n {showFormula && (\n <FormulaSubmenu viewModel={viewModel} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n viewModel={viewModel}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() => viewModel.setDeprecated(!viewModel.isDeprecated)}\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {viewModel.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n <UsedByFormulasSubmenu\n formulaDependents={viewModel.formulaDependents}\n />\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={viewModel.canDelete ? 'fg.error' : 'gray.400'}\n disabled={!viewModel.canDelete}\n onClick={viewModel.canDelete ? onDelete : undefined}\n title={viewModel.deleteBlockedReason ?? undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n viewModel.canDelete\n ? { bg: 'bg.error', color: 'fg.error' }\n : undefined\n }\n >\n <PiTrash />\n <Box flex=\"1\">Delete field</Box>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface NodeRightContentProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n showDelete?: boolean;\n onDelete?: () => void;\n}\n\nexport const NodeRightContent: FC<NodeRightContentProps> = observer(\n ({ viewModel, dataTestId, showDelete = true, onDelete }) => {\n return (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeRightContent } from '../NodeRightContent';\nimport { NodeView } from '../NodeView/NodeView';\n\ninterface CollapsibleNodeViewProps {\n viewModel: BaseNodeVM & {\n isCollapsible: boolean;\n isCollapsed: boolean;\n toggleCollapsed: () => void;\n children: readonly NodeVM[];\n };\n dataTestId: string;\n footer?: ReactNode;\n}\n\nexport const CollapsibleNodeView: FC<CollapsibleNodeViewProps> = observer(\n ({ viewModel, dataTestId, footer }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={viewModel.isCollapsible}\n isCollapsed={viewModel.isCollapsed}\n onToggleCollapse={viewModel.toggleCollapsed}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={\n <NodeRightContent\n viewModel={viewModel}\n dataTestId={dataTestId}\n showDelete={!viewModel.isRoot}\n onDelete={viewModel.removeSelf}\n />\n }\n />\n }\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {viewModel.children.map((childVm, index) => (\n <NodeView\n key={childVm.nodeId}\n viewModel={childVm}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {footer}\n </Flex>\n </NodeWrapper>\n );\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../components';\nimport type { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { CollapsibleNodeView } from '../CollapsibleNodeView';\n\ninterface ObjectNodeViewProps {\n viewModel: ObjectNodeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n return (\n <CollapsibleNodeView\n viewModel={viewModel}\n dataTestId={dataTestId}\n footer={\n viewModel.showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => viewModel.addProperty('')}\n />\n </Box>\n )\n }\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { CreateButton } from '../../../components';\nimport { ArrayNodeVM } from '../../vm/ArrayNodeVM';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeRightContent } from '../NodeRightContent';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\nimport { TypeMenu } from '../TypeMenu/TypeMenu';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\nimport { NodeView } from '../NodeView/NodeView';\n\ninterface ArrayNodeViewProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={viewModel.isCollapsible}\n isCollapsed={viewModel.isCollapsed}\n onToggleCollapse={viewModel.toggleCollapsed}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={\n <NodeRightContent\n viewModel={viewModel}\n dataTestId={dataTestId}\n onDelete={viewModel.removeSelf}\n />\n }\n />\n }\n >\n {viewModel.itemsVM && (\n <Flex flexDirection=\"column\" width=\"100%\">\n <ArrayItemsView viewModel={viewModel} dataTestId={dataTestId} />\n </Flex>\n )}\n </NodeWrapper>\n );\n },\n);\n\ninterface ArrayItemsViewProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n}\n\nconst ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const itemsVm = viewModel.itemsVM;\n if (!itemsVm) {\n return null;\n }\n\n const hoverTargetClass = `hover-target-${itemsVm.nodeId}`;\n const applyHoverStyles = itemsVm.shouldApplyFieldStyles;\n\n return (\n <NodeWrapper\n viewModel={itemsVm}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <ArrayItemsField\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n applyHoverStyles={applyHoverStyles}\n />\n }\n >\n <ArrayItemsChildren itemsVm={itemsVm} dataTestId={`${dataTestId}-0`} />\n </NodeWrapper>\n );\n },\n);\n\ninterface ArrayItemsFieldProps {\n viewModel: ArrayNodeVM;\n dataTestId: string;\n hoverTargetClass: string;\n applyHoverStyles: boolean;\n}\n\ninterface ArrayItemsChildrenProps {\n itemsVm: NodeVM;\n dataTestId: string;\n}\n\nconst ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ itemsVm, dataTestId }) => {\n if (itemsVm instanceof ObjectNodeVM) {\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {itemsVm.children.map((childVm, index) => (\n <NodeView\n key={childVm.nodeId}\n viewModel={childVm}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {itemsVm.showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => itemsVm.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (itemsVm instanceof ArrayNodeVM) {\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n <ArrayItemsView viewModel={itemsVm} dataTestId={dataTestId} />\n </Flex>\n );\n }\n\n if (itemsVm instanceof ForeignKeyNodeVM) {\n return <ForeignKeyValue viewModel={itemsVm} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n\ninterface ForeignKeyValueProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nconst ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ viewModel, dataTestId }) => {\n const value = viewModel.foreignKeyValue;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={viewModel.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n\nconst ArrayItemsField: FC<ArrayItemsFieldProps> = observer(\n ({ viewModel, dataTestId, hoverTargetClass, applyHoverStyles }) => {\n const itemsVm = viewModel.itemsVM;\n if (!itemsVm) {\n return null;\n }\n\n const { dragAndDropRef, isDrop, isDraggedOver, isDisabledDrop } =\n useDragAndDrop({ viewModel: itemsVm });\n\n return (\n <Flex\n ref={dragAndDropRef}\n data-testid={isDrop ? `${dataTestId}-items-drop` : undefined}\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n gap=\"0.5rem\"\n alignItems=\"center\"\n >\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={viewModel.changeItemsType}\n open={itemsVm.isMenuOpen}\n onOpenChange={itemsVm.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n cursor=\"pointer\"\n textDecoration=\"underline\"\n outline={0}\n >\n {itemsVm.label}\n </Text>\n }\n />\n <Box\n className={applyHoverStyles ? hoverTargetClass : undefined}\n opacity={applyHoverStyles ? 0 : 1}\n >\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <NodeIndicators viewModel={itemsVm} />\n {itemsVm.showMenu && (\n <NodeContextMenu\n viewModel={itemsVm}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { PrimitiveNodeVM } from '../../vm/PrimitiveNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface PrimitiveNodeViewProps {\n viewModel: PrimitiveNodeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n const rightContent = (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete\n showFormula\n showDefault\n onDelete={viewModel.removeSelf}\n />\n )}\n </>\n );\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={rightContent}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { BaseNodeVM } from '../../vm/BaseNodeVM';\nimport { NodeWrapper } from '../NodeWrapper/NodeWrapper';\nimport { FieldEditor } from '../FieldEditor/FieldEditor';\nimport { NodeIndicators } from '../NodeIndicators/NodeIndicators';\nimport { NodeContextMenu } from '../NodeContextMenu';\n\ninterface LeafNodeViewProps {\n viewModel: BaseNodeVM;\n dataTestId: string;\n children?: ReactNode;\n}\n\nexport const LeafNodeView: FC<LeafNodeViewProps> = observer(\n ({ viewModel, dataTestId, children }) => {\n const hoverTargetClass = `hover-target-${viewModel.nodeId}`;\n\n const rightContent = (\n <>\n <NodeIndicators viewModel={viewModel} />\n {viewModel.showMenu && (\n <NodeContextMenu\n viewModel={viewModel}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete\n onDelete={viewModel.removeSelf}\n />\n )}\n </>\n );\n\n return (\n <NodeWrapper\n viewModel={viewModel}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <FieldEditor\n viewModel={viewModel}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={viewModel.changeType}\n rightContent={rightContent}\n />\n }\n >\n {children}\n </NodeWrapper>\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { LeafNodeView } from '../LeafNodeView/LeafNodeView';\n\ninterface ForeignKeyNodeViewProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n return (\n <LeafNodeView viewModel={viewModel} dataTestId={dataTestId}>\n <ForeignKeyValue viewModel={viewModel} dataTestId={dataTestId} />\n </LeafNodeView>\n );\n },\n);\n\ninterface ForeignKeyValueProps {\n viewModel: ForeignKeyNodeVM;\n dataTestId: string;\n}\n\nconst ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ viewModel, dataTestId }) => {\n const value = viewModel.foreignKeyValue;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={viewModel.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { RefNodeVM } from '../../vm/RefNodeVM';\nimport { LeafNodeView } from '../LeafNodeView/LeafNodeView';\nimport { CollapsibleNodeView } from '../CollapsibleNodeView';\n\ninterface RefNodeViewProps {\n viewModel: RefNodeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n if (!viewModel.isCollapsible) {\n return <LeafNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n return (\n <CollapsibleNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeVM } from '../../vm/createNodeVM';\nimport { ObjectNodeVM } from '../../vm/ObjectNodeVM';\nimport { ArrayNodeVM } from '../../vm/ArrayNodeVM';\nimport { PrimitiveNodeVM } from '../../vm/PrimitiveNodeVM';\nimport { ForeignKeyNodeVM } from '../../vm/ForeignKeyNodeVM';\nimport { RefNodeVM } from '../../vm/RefNodeVM';\nimport { ObjectNodeView } from '../ObjectNodeView/ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView/ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView/PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView/ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView/RefNodeView';\n\ninterface NodeViewProps {\n viewModel: NodeVM;\n dataTestId: string;\n}\n\nexport const NodeView: FC<NodeViewProps> = observer(\n ({ viewModel, dataTestId }) => {\n if (viewModel instanceof ObjectNodeVM) {\n return <ObjectNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof ArrayNodeVM) {\n return <ArrayNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof ForeignKeyNodeVM) {\n return (\n <ForeignKeyNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n }\n\n if (viewModel instanceof RefNodeVM) {\n return <RefNodeView viewModel={viewModel} dataTestId={dataTestId} />;\n }\n\n if (viewModel instanceof PrimitiveNodeVM) {\n return (\n <PrimitiveNodeView viewModel={viewModel} dataTestId={dataTestId} />\n );\n }\n\n return null;\n },\n);\n","import {\n Badge,\n Box,\n Button,\n Flex,\n Icon,\n IconButton,\n Portal,\n SegmentGroup,\n Text,\n VStack,\n} from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport {\n PiArrowCounterClockwiseBold,\n PiArrowRight,\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n PiWarningCircle,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport type {\n SchemaPatch,\n MetadataChangeType,\n TransformationInfo,\n DataLossSeverity,\n DefaultValueExample,\n SchemaValidationError,\n FormulaErrorInfo,\n} from '../../model';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n jsonPointerToSimplePath,\n} from '../../model';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { JsonValue } from '../../types';\n\ninterface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\ninterface ChangesPreviewDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onApprove: () => void;\n onRevert: () => void;\n patches: SchemaPatch[];\n isLoading?: boolean;\n tableId: string;\n tableIdChange?: TableIdChangeInfo;\n tableIdError?: string | null;\n validationErrors?: SchemaValidationError[];\n formulaErrors?: FormulaErrorInfo[];\n mode: 'creating' | 'updating';\n createDialogViewMode?: 'Example' | 'Schema';\n onCreateDialogViewModeChange?: (mode: 'Example' | 'Schema') => void;\n exampleData?: JsonValue;\n schemaData?: JsonValue;\n}\n\ntype PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nconst operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nconst Highlight: FC<{ children: React.ReactNode }> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n\nconst DataLossBadge: FC<{ severity: DataLossSeverity }> = ({ severity }) => {\n if (severity === 'none') {\n return null;\n }\n\n if (severity === 'possible') {\n return (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data may be lost\n </Badge>\n );\n }\n\n return (\n <Badge size=\"sm\" colorPalette=\"red\" variant=\"subtle\">\n data loss\n </Badge>\n );\n};\n\nconst TransformationInfoRow: FC<{ info: TransformationInfo }> = ({ info }) => {\n return (\n <VStack align=\"stretch\" gap={1} pl={2}>\n <Flex align=\"center\" gap={2} fontSize=\"xs\" flexWrap=\"wrap\">\n {info.steps.map((step, stepIndex) => (\n <Flex key={step.name} align=\"center\" gap={1}>\n {stepIndex > 0 && <Text color=\"gray.400\">+</Text>}\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {step.name}\n </Badge>\n </Flex>\n ))}\n <DataLossBadge severity={info.dataLossSeverity} />\n </Flex>\n\n <Flex align=\"center\" gap={2} fontSize=\"xs\" color=\"gray.500\">\n <Text color=\"gray.400\">example:</Text>\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {JSON.stringify(info.example.before)}\n </Box>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {JSON.stringify(info.example.after)}\n </Box>\n </Flex>\n </VStack>\n );\n};\n\nconst formatDefaultValue = (value: unknown): string => {\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return JSON.stringify(value);\n};\n\nconst DefaultValueRow: FC<{ example: DefaultValueExample }> = ({ example }) => {\n const { value, type, foreignKeyTableId } = example;\n\n if (foreignKeyTableId) {\n return null;\n }\n\n const formattedValue = formatDefaultValue(value);\n const isMultiline = formattedValue.includes('\\n');\n\n return (\n <Flex\n align={isMultiline ? 'flex-start' : 'center'}\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n >\n <Text color=\"gray.400\">default:</Text>\n <Box\n as=\"code\"\n px={isMultiline ? 2 : 1}\n py={isMultiline ? 1.5 : 0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n whiteSpace={isMultiline ? 'pre' : 'nowrap'}\n >\n {formattedValue}\n </Box>\n <Text color=\"gray.400\">({type})</Text>\n </Flex>\n );\n};\n\nconst MetadataChangesRow: FC<{ changes: MetadataChangeType[] }> = ({\n changes,\n}) => {\n const filteredChanges = changes.filter(\n (change) =>\n change !== 'formula' &&\n change !== 'default' &&\n change !== 'description' &&\n change !== 'deprecated' &&\n change !== 'foreignKey' &&\n change !== 'contentMediaType',\n );\n\n if (filteredChanges.length === 0) {\n return null;\n }\n\n return (\n <Flex align=\"center\" gap={2} fontSize=\"xs\" pl={2} flexWrap=\"wrap\">\n {filteredChanges.map((change) => (\n <Badge key={change} size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {change}\n </Badge>\n ))}\n </Flex>\n );\n};\n\nconst CodeBox: FC<{ children: React.ReactNode }> = ({ children }) => (\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {children}\n </Box>\n);\n\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nconst ValueChangeRow: FC<ValueChangeRowProps> = ({\n label,\n fromValue,\n toValue,\n}) => (\n <Flex\n align=\"center\"\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n flexWrap=\"wrap\"\n >\n <Text color=\"gray.400\">{label}:</Text>\n <CodeBox>{fromValue}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{toValue}</CodeBox>\n </Flex>\n);\n\nconst formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '(none)';\n }\n return JSON.stringify(value);\n};\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nconst getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nconst OperationDescription: FC<{ schemaPatch: SchemaPatch }> = ({\n schemaPatch,\n}) => {\n const { patch, fieldName } = schemaPatch;\n const IconComponent = operationIcons[patch.op as PatchOp];\n\n switch (patch.op) {\n case 'add':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was added\n </Text>\n </Flex>\n );\n case 'remove':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was removed\n </Text>\n </Flex>\n );\n case 'move': {\n const fromField = getFromFieldName(patch);\n if (schemaPatch.isRename) {\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Renamed field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n </Flex>\n );\n }\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Moved field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n {schemaPatch.movesIntoArray && (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data will be cloned\n </Badge>\n )}\n </Flex>\n );\n }\n case 'replace':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was modified\n </Text>\n </Flex>\n );\n default:\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiPencilSimpleLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was changed\n </Text>\n </Flex>\n );\n }\n};\n\nconst PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const {\n patch,\n metadataChanges,\n typeChange,\n formulaChange,\n defaultChange,\n descriptionChange,\n deprecatedChange,\n foreignKeyChange,\n contentMediaTypeChange,\n } = schemaPatch;\n\n const transformationInfo = useMemo(\n () =>\n typeChange\n ? getTransformationInfoFromTypeChange(\n typeChange.fromType,\n typeChange.toType,\n )\n : null,\n [typeChange],\n );\n const defaultExample = useMemo(() => {\n if (patch.op === 'add' && patch.value) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\n\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <OperationDescription schemaPatch={schemaPatch} />\n\n {defaultExample && (\n <Box mt={2} ml={8}>\n <DefaultValueRow example={defaultExample} />\n </Box>\n )}\n\n {transformationInfo && (\n <Box mt={2} ml={8}>\n <TransformationInfoRow info={transformationInfo} />\n </Box>\n )}\n\n {formulaChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"formula\"\n fromValue={formatChangeValue(formulaChange.fromFormula)}\n toValue={formatChangeValue(formulaChange.toFormula)}\n />\n </Box>\n )}\n\n {defaultChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"default\"\n fromValue={formatChangeValue(defaultChange.fromDefault)}\n toValue={formatChangeValue(defaultChange.toDefault)}\n />\n </Box>\n )}\n\n {descriptionChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"description\"\n fromValue={formatChangeValue(descriptionChange.fromDescription)}\n toValue={formatChangeValue(descriptionChange.toDescription)}\n />\n </Box>\n )}\n\n {deprecatedChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"deprecated\"\n fromValue={formatChangeValue(deprecatedChange.fromDeprecated)}\n toValue={formatChangeValue(deprecatedChange.toDeprecated)}\n />\n </Box>\n )}\n\n {foreignKeyChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"foreignKey\"\n fromValue={formatChangeValue(foreignKeyChange.fromForeignKey)}\n toValue={formatChangeValue(foreignKeyChange.toForeignKey)}\n />\n </Box>\n )}\n\n {contentMediaTypeChange && (\n <Box mt={2} ml={8}>\n <ValueChangeRow\n label=\"contentMediaType\"\n fromValue={formatChangeValue(\n contentMediaTypeChange.fromContentMediaType,\n )}\n toValue={formatChangeValue(\n contentMediaTypeChange.toContentMediaType,\n )}\n />\n </Box>\n )}\n\n {!transformationInfo && metadataChanges.length > 0 && (\n <Box mt={2} ml={8}>\n <MetadataChangesRow changes={metadataChanges} />\n </Box>\n )}\n </Box>\n );\n});\n\nconst TableIdChangeRow: FC<{ change: TableIdChangeInfo }> = ({ change }) => {\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiArrowsLeftRightLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Table renamed from <Highlight>{change.initialTableId}</Highlight> to{' '}\n <Highlight>{change.currentTableId}</Highlight>\n </Text>\n </Flex>\n </Box>\n );\n};\n\ninterface ErrorItemProps {\n message: string;\n type?: 'validation' | 'formula' | 'tableId';\n fieldPath?: string;\n}\n\nconst ErrorItem: FC<ErrorItemProps> = ({ message, type, fieldPath }) => (\n <Box py={2} px={4}>\n <Flex align=\"center\" gap={2}>\n <Icon as={PiWarningCircle} color=\"gray.400\" boxSize={4} flexShrink={0} />\n <Text fontSize=\"sm\" color=\"gray.600\">\n {type === 'formula' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n formula\n </Badge>\n )}\n {type === 'tableId' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n table name\n </Badge>\n )}\n {fieldPath && (\n <Box as=\"span\" fontWeight=\"medium\">\n {fieldPath}:{' '}\n </Box>\n )}\n {message}\n </Text>\n </Flex>\n </Box>\n);\n\ninterface ErrorsListProps {\n validationErrors: SchemaValidationError[];\n formulaErrors: FormulaErrorInfo[];\n tableIdError?: string | null;\n}\n\nconst ErrorsList: FC<ErrorsListProps> = ({\n validationErrors,\n formulaErrors,\n tableIdError,\n}) => (\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"gray.50\"\n overflow=\"hidden\"\n >\n <Box\n py={2}\n px={4}\n bg=\"gray.100\"\n borderBottom=\"1px solid\"\n borderColor=\"gray.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.600\">\n Please fix the following errors before applying changes:\n </Text>\n </Box>\n <VStack align=\"stretch\" gap={0} divideY=\"1px\" divideColor=\"gray.100\">\n {tableIdError && (\n <ErrorItem key=\"tableId-error\" message={tableIdError} type=\"tableId\" />\n )}\n {validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {formulaErrors.map((error) => (\n <ErrorItem\n key={`formula-${error.fieldPath ?? ''}-${error.message}`}\n message={error.message}\n type=\"formula\"\n fieldPath={error.fieldPath}\n />\n ))}\n </VStack>\n </Box>\n);\n\nexport const ChangesPreviewDialog: FC<ChangesPreviewDialogProps> = observer(\n ({\n isOpen,\n onClose,\n onApprove,\n onRevert,\n patches,\n isLoading,\n tableId,\n tableIdChange,\n tableIdError,\n validationErrors = [],\n formulaErrors = [],\n mode,\n createDialogViewMode = 'Example',\n onCreateDialogViewModeChange,\n exampleData,\n schemaData,\n }) => {\n const isCreating = mode === 'creating';\n const hasSchemaChanges = patches.length > 0;\n const hasTableIdChange = Boolean(tableIdChange);\n const hasChanges = hasSchemaChanges || hasTableIdChange;\n const hasErrors =\n validationErrors.length > 0 ||\n formulaErrors.length > 0 ||\n Boolean(tableIdError);\n const canCreate = !hasErrors;\n const canUpdate = hasChanges && !hasErrors;\n const canApply = isCreating ? canCreate : canUpdate;\n const totalChangesCount = patches.length + (hasTableIdChange ? 1 : 0);\n const applyButtonText = isCreating\n ? 'Create Table'\n : `Apply Changes (${totalChangesCount})`;\n\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => !open && onClose()}\n size=\"lg\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth=\"700px\">\n <DialogHeader>\n <DialogTitle>\n {isCreating\n ? `Create Table \"${tableId}\"`\n : `Review Changes for \"${tableId}\"`}\n </DialogTitle>\n </DialogHeader>\n\n <DialogBody>\n <VStack align=\"stretch\" gap={4}>\n {hasErrors && (\n <ErrorsList\n validationErrors={validationErrors}\n formulaErrors={formulaErrors}\n tableIdError={tableIdError}\n />\n )}\n\n {!hasErrors && hasChanges && !isCreating && (\n <>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {tableIdChange && (\n <TableIdChangeRow change={tableIdChange} />\n )}\n {patches.map((schemaPatch) => (\n <PatchRow\n key={schemaPatch.patch.path}\n schemaPatch={schemaPatch}\n />\n ))}\n </Box>\n\n <Text fontSize=\"xs\" color=\"gray.500\">\n Data in existing rows will be automatically transformed\n according to the new schema.\n </Text>\n </>\n )}\n {!hasErrors && !hasChanges && !isCreating && (\n <Flex justify=\"center\" align=\"center\" minHeight=\"100px\">\n <Text color=\"gray.400\" fontSize=\"sm\">\n No changes to apply\n </Text>\n </Flex>\n )}\n {!hasErrors && isCreating && (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={createDialogViewMode}\n onValueChange={(details) =>\n onCreateDialogViewModeChange?.(\n details.value as 'Example' | 'Schema',\n )\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Example', 'Schema']} />\n </SegmentGroup.Root>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {createDialogViewMode === 'Example' ? (\n <JsonCard readonly data={exampleData ?? null} />\n ) : (\n <JsonCard readonly data={schemaData ?? null} />\n )}\n </Box>\n </>\n )}\n </VStack>\n </DialogBody>\n\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {isCreating ? (\n <Box />\n ) : (\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n onClick={onRevert}\n disabled={!hasChanges && !hasErrors}\n title=\"Revert all changes\"\n >\n <PiArrowCounterClockwiseBold />\n </IconButton>\n )}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n {!hasErrors && (\n <Button\n variant=\"outline\"\n onClick={onApprove}\n disabled={!canApply}\n loading={isLoading}\n >\n {applyButtonText}\n </Button>\n )}\n </Flex>\n </Flex>\n </DialogFooter>\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { ViewerSwitcherMode, type JsonValue } from '../../types';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { CloseButton } from '../../../components';\nimport { BackButton } from '../../../components/BackButton';\nimport { JsonCard } from '../../../components/JsonCard';\nimport { SchemaEditorVM } from '../../vm';\nimport { NodeView } from '../NodeView/NodeView';\nimport { ChangesPreviewDialog } from '../ChangesPreviewDialog/ChangesPreviewDialog';\n\nexport interface SchemaEditorProps {\n model: SchemaEditorVM;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(({ model }) => {\n const handleApproveClick = () => {\n model.openChangesDialog();\n };\n\n const handleRevert = () => {\n model.revert();\n model.closeChangesDialog();\n };\n\n const editorHoverStyles = {\n '&:hover .editor-hover-target': { opacity: 1 },\n };\n\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={editorHoverStyles}\n data-testid=\"schema-editor-v2\"\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {model.mode === 'creating' ? (\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={model.cancel}\n />\n ) : (\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={model.cancel}\n />\n )}\n {model.mode === 'creating' ? (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleApproveClick}\n disabled={model.isApproveDisabled && !model.hasErrors}\n loading={model.loading}\n data-testid=\"schema-editor-create-button\"\n >\n {model.hasErrors ? 'Review Errors' : 'Create Table'}\n </Button>\n ) : (\n (model.isDirty || model.hasErrors) && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={handleApproveClick}\n disabled={model.isApproveDisabled && !model.hasErrors}\n loading={model.loading}\n data-testid=\"schema-editor-approve-button\"\n >\n {model.hasErrors\n ? 'Review Errors'\n : `Apply Changes (${model.totalChangesCount})`}\n </Button>\n )\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={model.viewMode}\n onChange={model.setViewMode}\n />\n </Box>\n </Flex>\n {model.viewMode === ViewerSwitcherMode.Tree && (\n <Box paddingBottom=\"4rem\">\n <NodeView viewModel={model.rootNodeVM} dataTestId=\"root\" />\n </Box>\n )}\n {model.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={model.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ChangesPreviewDialog\n isOpen={model.isChangesDialogOpen}\n onClose={model.closeChangesDialog}\n onApprove={model.approve}\n onRevert={handleRevert}\n patches={model.getPatches()}\n isLoading={model.loading}\n tableId={model.tableId}\n tableIdChange={\n model.isTableIdChanged\n ? {\n initialTableId: model.initialTableId,\n currentTableId: model.tableId,\n }\n : undefined\n }\n tableIdError={model.tableIdError}\n validationErrors={model.validationErrors as never}\n formulaErrors={model.formulaErrors as never}\n mode={model.mode}\n createDialogViewMode={model.createDialogViewMode}\n onCreateDialogViewModeChange={model.setCreateDialogViewMode}\n exampleData={model.getExampleData() as JsonValue}\n schemaData={model.getPlainSchema() as unknown as JsonValue}\n />\n </Flex>\n );\n});\n","import type { Diagnostic, SchemaDefinition, ValueType } from '../core/types';\nimport type {\n ArrayValueNode,\n ObjectValueNode,\n PrimitiveValueNode,\n ValueNode,\n} from './types';\n\nlet nodeIdCounter = 0;\n\nexport function generateNodeId(): string {\n return `node-${++nodeIdCounter}`;\n}\n\nexport function resetNodeIdCounter(): void {\n nodeIdCounter = 0;\n}\n\nexport abstract class BaseValueNode implements ValueNode {\n readonly id: string;\n abstract readonly type: ValueType;\n readonly schema: SchemaDefinition;\n\n private _parent: ValueNode | null = null;\n private readonly _name: string;\n\n constructor(id: string | undefined, name: string, schema: SchemaDefinition) {\n this.id = id ?? generateNodeId();\n this._name = name;\n this.schema = schema;\n }\n\n get parent(): ValueNode | null {\n return this._parent;\n }\n\n set parent(value: ValueNode | null) {\n this._parent = value;\n }\n\n get name(): string {\n return this._name;\n }\n\n abstract get value(): unknown;\n abstract getPlainValue(): unknown;\n\n isObject(): this is ObjectValueNode {\n return false;\n }\n\n isArray(): this is ArrayValueNode {\n return false;\n }\n\n isPrimitive(): this is PrimitiveValueNode {\n return false;\n }\n\n get errors(): readonly Diagnostic[] {\n return [];\n }\n\n get warnings(): readonly Diagnostic[] {\n return [];\n }\n\n get isValid(): boolean {\n return this.errors.length === 0;\n }\n\n get hasWarnings(): boolean {\n return this.warnings.length > 0;\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type {\n Diagnostic,\n FormulaDefinition,\n FormulaWarning,\n SchemaDefinition,\n} from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { PrimitiveValueNode } from './types';\n\nexport abstract class BasePrimitiveValueNode<\n T extends string | number | boolean,\n>\n extends BaseValueNode\n implements PrimitiveValueNode\n{\n protected _value: T;\n protected _baseValue: T;\n protected _formulaWarning: FormulaWarning | null = null;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value: T | undefined,\n defaultValue: T,\n ) {\n super(id, name, schema);\n const initialValue = value ?? (schema.default as T) ?? defaultValue;\n this._value = initialValue;\n this._baseValue = initialValue;\n }\n\n protected initObservable(): void {\n makeObservable<\n BasePrimitiveValueNode<T>,\n '_value' | '_baseValue' | '_formulaWarning'\n >(this, {\n _value: observable,\n _baseValue: observable,\n _formulaWarning: observable,\n value: computed,\n baseValue: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n setValue: action,\n setFormulaWarning: action,\n commit: action,\n revert: action,\n });\n }\n\n get value(): T {\n return this._value;\n }\n\n set value(newValue: T) {\n if (this.isReadOnly) {\n throw new Error(`Cannot set value on read-only field: ${this.name}`);\n }\n this._value = newValue;\n }\n\n get baseValue(): T {\n return this._baseValue;\n }\n\n get isDirty(): boolean {\n return this._value !== this._baseValue;\n }\n\n abstract get defaultValue(): T;\n\n get formula(): FormulaDefinition | undefined {\n const xFormula = this.schema['x-formula'];\n if (xFormula) {\n return { expression: xFormula.expression, version: xFormula.version };\n }\n return undefined;\n }\n\n get formulaWarning(): FormulaWarning | null {\n return this._formulaWarning;\n }\n\n get isReadOnly(): boolean {\n return this.schema.readOnly === true || this.formula !== undefined;\n }\n\n getPlainValue(): T {\n return this._value;\n }\n\n setValue(value: unknown, options?: { internal?: boolean }): void {\n if (this.isReadOnly && !options?.internal) {\n throw new Error(`Cannot set value on read-only field: ${this.name}`);\n }\n this._value = this.coerceValue(value);\n }\n\n protected abstract coerceValue(value: unknown): T;\n\n setFormulaWarning(warning: FormulaWarning | null): void {\n this._formulaWarning = warning;\n }\n\n commit(): void {\n this._baseValue = this._value;\n }\n\n revert(): void {\n this._value = this._baseValue;\n }\n\n override isPrimitive(): this is PrimitiveValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n return this.computeErrors();\n }\n\n protected computeErrors(): readonly Diagnostic[] {\n return [];\n }\n\n override get warnings(): readonly Diagnostic[] {\n if (!this._formulaWarning) {\n return [];\n }\n\n return [\n {\n severity: 'warning',\n type: this._formulaWarning.type,\n message: this._formulaWarning.message,\n path: this.name,\n params: {\n expression: this._formulaWarning.expression,\n computedValue: this._formulaWarning.computedValue,\n },\n },\n ];\n }\n}\n","export type DiagnosticSeverity = 'error' | 'warning' | 'info';\n\nexport interface Diagnostic {\n readonly severity: DiagnosticSeverity;\n readonly type: string;\n readonly message: string;\n readonly path: string;\n readonly params?: Record<string, unknown>;\n}\n\nexport interface SchemaDefinition {\n readonly type?: string;\n readonly $ref?: string;\n readonly default?: unknown;\n readonly readOnly?: boolean;\n readonly required?: boolean;\n readonly format?: string;\n readonly properties?: Record<string, SchemaDefinition>;\n readonly items?: SchemaDefinition;\n readonly additionalProperties?: boolean;\n readonly foreignKey?: string;\n readonly 'x-formula'?: { version: number; expression: string };\n readonly minimum?: number;\n readonly maximum?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly pattern?: string;\n readonly enum?: readonly unknown[];\n}\n\nexport enum ValueType {\n String = 'string',\n Number = 'number',\n Boolean = 'boolean',\n Object = 'object',\n Array = 'array',\n Ref = 'ref',\n}\n\nexport interface FormulaDefinition {\n readonly expression: string;\n readonly version?: number;\n}\n\nexport interface FormulaWarning {\n readonly type:\n | 'nan'\n | 'infinity'\n | 'type-coercion'\n | 'division-by-zero'\n | 'null-reference'\n | 'runtime-error';\n readonly message: string;\n readonly expression: string;\n readonly computedValue: unknown;\n}\n\nexport type ChangeType =\n | 'setValue'\n | 'addProperty'\n | 'removeProperty'\n | 'arrayPush'\n | 'arrayInsert'\n | 'arrayRemove'\n | 'arrayMove'\n | 'arrayReplace'\n | 'arrayClear';\n\nimport type { Path } from './Path';\n\nexport interface Change {\n readonly type: ChangeType;\n readonly path: Path;\n readonly value?: unknown;\n readonly oldValue?: unknown;\n readonly fromIndex?: number;\n readonly toIndex?: number;\n readonly index?: number;\n}\n\nexport type JsonPatchOp =\n | 'add'\n | 'remove'\n | 'replace'\n | 'move'\n | 'copy'\n | 'test';\n\nexport interface JsonPatch {\n readonly op: JsonPatchOp;\n readonly path: string;\n readonly value?: unknown;\n readonly from?: string;\n}\n","import type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class StringValueNode extends BasePrimitiveValueNode<string> {\n readonly type = ValueType.String;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: string,\n ) {\n super(id, name, schema, value, '');\n this.initObservable();\n }\n\n get defaultValue(): string {\n return (this.schema.default as string) ?? '';\n }\n\n protected coerceValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (value === null || value === undefined) {\n return '';\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n return String(value);\n }\n\n protected override computeErrors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n this.validateRequired(errors);\n this.validateForeignKey(errors);\n this.validateMinLength(errors);\n this.validateMaxLength(errors);\n this.validatePattern(errors);\n this.validateEnum(errors);\n\n return errors;\n }\n\n private validateRequired(errors: Diagnostic[]): void {\n if (this.schema.required && this._value === '') {\n errors.push({\n severity: 'error',\n type: 'required',\n message: 'Field is required',\n path: this.name,\n });\n }\n }\n\n private validateForeignKey(errors: Diagnostic[]): void {\n const foreignKey = this.schema.foreignKey;\n if (foreignKey && this._value === '') {\n errors.push({\n severity: 'error',\n type: 'foreignKey',\n message: `Reference to ${foreignKey} is required`,\n path: this.name,\n params: { table: foreignKey },\n });\n }\n }\n\n private validateMinLength(errors: Diagnostic[]): void {\n const minLength = this.schema.minLength;\n if (\n minLength !== undefined &&\n this._value.length > 0 &&\n this._value.length < minLength\n ) {\n errors.push({\n severity: 'error',\n type: 'minLength',\n message: `Minimum length is ${minLength}`,\n path: this.name,\n params: { min: minLength, actual: this._value.length },\n });\n }\n }\n\n private validateMaxLength(errors: Diagnostic[]): void {\n const maxLength = this.schema.maxLength;\n if (maxLength !== undefined && this._value.length > maxLength) {\n errors.push({\n severity: 'error',\n type: 'maxLength',\n message: `Maximum length is ${maxLength}`,\n path: this.name,\n params: { max: maxLength, actual: this._value.length },\n });\n }\n }\n\n private validatePattern(errors: Diagnostic[]): void {\n const pattern = this.schema.pattern;\n if (!pattern || this._value.length === 0) {\n return;\n }\n\n try {\n if (!new RegExp(pattern).test(this._value)) {\n errors.push({\n severity: 'error',\n type: 'pattern',\n message: 'Value does not match pattern',\n path: this.name,\n params: { pattern },\n });\n }\n } catch {\n errors.push({\n severity: 'error',\n type: 'invalidPattern',\n message: 'Invalid regex pattern in schema',\n path: this.name,\n params: { pattern },\n });\n }\n }\n\n private validateEnum(errors: Diagnostic[]): void {\n const enumValues = this.schema.enum;\n if (\n enumValues &&\n enumValues.length > 0 &&\n !enumValues.includes(this._value)\n ) {\n errors.push({\n severity: 'error',\n type: 'enum',\n message: 'Value is not in allowed list',\n path: this.name,\n params: { allowed: enumValues, actual: this._value },\n });\n }\n }\n}\n","import type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class NumberValueNode extends BasePrimitiveValueNode<number> {\n readonly type = ValueType.Number;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: number,\n ) {\n super(id, name, schema, value, 0);\n this.initObservable();\n }\n\n get defaultValue(): number {\n return (this.schema.default as number) ?? 0;\n }\n\n protected coerceValue(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n return Number(value) || 0;\n }\n\n protected override computeErrors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n const minimum = this.schema.minimum;\n if (minimum !== undefined && this._value < minimum) {\n errors.push({\n severity: 'error',\n type: 'min',\n message: `Value must be at least ${minimum}`,\n path: this.name,\n params: { min: minimum, actual: this._value },\n });\n }\n\n const maximum = this.schema.maximum;\n if (maximum !== undefined && this._value > maximum) {\n errors.push({\n severity: 'error',\n type: 'max',\n message: `Value must be at most ${maximum}`,\n path: this.name,\n params: { max: maximum, actual: this._value },\n });\n }\n\n const enumValues = this.schema.enum;\n if (\n enumValues &&\n enumValues.length > 0 &&\n !enumValues.includes(this._value)\n ) {\n errors.push({\n severity: 'error',\n type: 'enum',\n message: 'Value is not in allowed list',\n path: this.name,\n params: { allowed: enumValues, actual: this._value },\n });\n }\n\n return errors;\n }\n}\n","import type { SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BasePrimitiveValueNode } from './BasePrimitiveValueNode';\n\nexport class BooleanValueNode extends BasePrimitiveValueNode<boolean> {\n readonly type = ValueType.Boolean;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n value?: boolean,\n ) {\n super(id, name, schema, value, false);\n this.initObservable();\n }\n\n get defaultValue(): boolean {\n return (this.schema.default as boolean) ?? false;\n }\n\n protected coerceValue(value: unknown): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n return Boolean(value);\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { ObjectValueNode as IObjectValueNode, ValueNode } from './types';\n\nexport class ObjectValueNode extends BaseValueNode implements IObjectValueNode {\n readonly type = ValueType.Object;\n\n private _children: Map<string, ValueNode> = new Map();\n private _baseChildren: Map<string, ValueNode> = new Map();\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n children?: ValueNode[],\n ) {\n super(id, name, schema);\n\n if (children) {\n for (const child of children) {\n this._children.set(child.name, child);\n child.parent = this;\n }\n }\n\n this._baseChildren = new Map(this._children);\n\n makeObservable<ObjectValueNode, '_children' | '_baseChildren'>(this, {\n _children: observable,\n _baseChildren: observable,\n value: computed,\n children: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n addChild: action,\n removeChild: action,\n commit: action,\n revert: action,\n });\n }\n\n get value(): Record<string, ValueNode> {\n return Object.fromEntries(this._children);\n }\n\n get children(): readonly ValueNode[] {\n return Array.from(this._children.values());\n }\n\n getPlainValue(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, node] of this._children) {\n result[key] = node.getPlainValue();\n }\n return result;\n }\n\n child(name: string): ValueNode | undefined {\n return this._children.get(name);\n }\n\n hasChild(name: string): boolean {\n return this._children.has(name);\n }\n\n addChild(node: ValueNode): void {\n const existing = this._children.get(node.name);\n if (existing) {\n existing.parent = null;\n }\n node.parent = this;\n this._children.set(node.name, node);\n }\n\n removeChild(name: string): void {\n const node = this._children.get(name);\n if (node) {\n node.parent = null;\n this._children.delete(name);\n }\n }\n\n get isDirty(): boolean {\n if (this._children.size !== this._baseChildren.size) {\n return true;\n }\n\n for (const [key, child] of this._children) {\n if (this._baseChildren.get(key) !== child) {\n return true;\n }\n }\n\n for (const child of this._children.values()) {\n if ('isDirty' in child && (child as { isDirty: boolean }).isDirty) {\n return true;\n }\n }\n\n return false;\n }\n\n commit(): void {\n this._baseChildren = new Map(this._children);\n for (const child of this._children.values()) {\n if ('commit' in child && typeof child.commit === 'function') {\n (child as { commit: () => void }).commit();\n }\n }\n }\n\n revert(): void {\n for (const child of this._children.values()) {\n child.parent = null;\n }\n\n this._children = new Map(this._baseChildren);\n\n for (const child of this._children.values()) {\n child.parent = this;\n if ('revert' in child && typeof child.revert === 'function') {\n (child as { revert: () => void }).revert();\n }\n }\n }\n\n override isObject(): this is IObjectValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n for (const child of this._children.values()) {\n errors.push(...child.errors);\n }\n\n return errors;\n }\n\n override get warnings(): readonly Diagnostic[] {\n const warnings: Diagnostic[] = [];\n\n for (const child of this._children.values()) {\n warnings.push(...child.warnings);\n }\n\n return warnings;\n }\n}\n","import { makeObservable, observable, computed, action } from 'mobx';\nimport type { Diagnostic, SchemaDefinition } from '../core/types';\nimport { ValueType } from '../core/types';\nimport { BaseValueNode } from './BaseValueNode';\nimport type { ArrayValueNode as IArrayValueNode, ValueNode } from './types';\nimport type { NodeFactory } from './NodeFactory';\n\nexport class ArrayValueNode extends BaseValueNode implements IArrayValueNode {\n readonly type = ValueType.Array;\n\n private _items: ValueNode[] = [];\n private _baseItems: ValueNode[] = [];\n private _nodeFactory: NodeFactory | null = null;\n\n constructor(\n id: string | undefined,\n name: string,\n schema: SchemaDefinition,\n items?: ValueNode[],\n ) {\n super(id, name, schema);\n\n if (items) {\n for (const item of items) {\n item.parent = this;\n this._items.push(item);\n }\n }\n\n this._baseItems = [...this._items];\n\n makeObservable<ArrayValueNode, '_items' | '_baseItems'>(this, {\n _items: observable,\n _baseItems: observable,\n value: computed,\n length: computed,\n isDirty: computed,\n errors: computed,\n warnings: computed,\n push: action,\n insertAt: action,\n removeAt: action,\n move: action,\n replaceAt: action,\n clear: action,\n commit: action,\n revert: action,\n pushValue: action,\n insertValueAt: action,\n });\n }\n\n get value(): readonly ValueNode[] {\n return this._items;\n }\n\n get length(): number {\n return this._items.length;\n }\n\n getPlainValue(): unknown[] {\n return this._items.map((item) => item.getPlainValue());\n }\n\n at(index: number): ValueNode | undefined {\n if (index < 0) {\n return this._items[this._items.length + index];\n }\n return this._items[index];\n }\n\n push(node: ValueNode): void {\n node.parent = this;\n this._items.push(node);\n }\n\n insertAt(index: number, node: ValueNode): void {\n if (index < 0 || index > this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n node.parent = this;\n this._items.splice(index, 0, node);\n }\n\n removeAt(index: number): void {\n if (index < 0 || index >= this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n const removed = this._items.splice(index, 1)[0];\n if (removed) {\n removed.parent = null;\n }\n }\n\n move(fromIndex: number, toIndex: number): void {\n if (fromIndex < 0 || fromIndex >= this._items.length) {\n throw new Error(`Source index out of bounds: ${fromIndex}`);\n }\n if (toIndex < 0 || toIndex >= this._items.length) {\n throw new Error(`Target index out of bounds: ${toIndex}`);\n }\n if (fromIndex === toIndex) {\n return;\n }\n\n const [item] = this._items.splice(fromIndex, 1);\n if (item) {\n this._items.splice(toIndex, 0, item);\n }\n }\n\n replaceAt(index: number, node: ValueNode): void {\n if (index < 0 || index >= this._items.length) {\n throw new Error(`Index out of bounds: ${index}`);\n }\n const oldNode = this._items[index];\n if (oldNode) {\n oldNode.parent = null;\n }\n node.parent = this;\n this._items[index] = node;\n }\n\n clear(): void {\n for (const item of this._items) {\n item.parent = null;\n }\n this._items.length = 0;\n }\n\n setNodeFactory(factory: NodeFactory): void {\n this._nodeFactory = factory;\n }\n\n pushValue(value?: unknown): void {\n const node = this.createItemNode(this._items.length, value);\n this.push(node);\n }\n\n insertValueAt(index: number, value?: unknown): void {\n const node = this.createItemNode(index, value);\n this.insertAt(index, node);\n }\n\n private createItemNode(index: number, value?: unknown): ValueNode {\n if (!this._nodeFactory) {\n throw new Error('NodeFactory not set');\n }\n\n const itemSchema = this.schema.items;\n if (!itemSchema) {\n throw new Error('No items schema');\n }\n\n const itemValue = value === undefined ? itemSchema.default : value;\n const node = this._nodeFactory.create(String(index), itemSchema, itemValue);\n\n this.propagateFactory(node);\n\n return node;\n }\n\n private propagateFactory(node: ValueNode): void {\n if (!this._nodeFactory) {\n return;\n }\n\n if (node.isArray()) {\n node.setNodeFactory(this._nodeFactory);\n for (const item of node.value) {\n this.propagateFactory(item);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.propagateFactory(child);\n }\n }\n }\n\n get isDirty(): boolean {\n if (this._items.length !== this._baseItems.length) {\n return true;\n }\n\n for (let i = 0; i < this._items.length; i++) {\n if (this._items[i] !== this._baseItems[i]) {\n return true;\n }\n }\n\n for (const item of this._items) {\n if ('isDirty' in item && (item as { isDirty: boolean }).isDirty) {\n return true;\n }\n }\n\n return false;\n }\n\n commit(): void {\n this._baseItems = [...this._items];\n for (const item of this._items) {\n if ('commit' in item && typeof item.commit === 'function') {\n (item as { commit: () => void }).commit();\n }\n }\n }\n\n revert(): void {\n for (const item of this._items) {\n item.parent = null;\n }\n\n this._items = [...this._baseItems];\n\n for (const item of this._items) {\n item.parent = this;\n if ('revert' in item && typeof item.revert === 'function') {\n (item as { revert: () => void }).revert();\n }\n }\n }\n\n override isArray(): this is IArrayValueNode {\n return true;\n }\n\n override get errors(): readonly Diagnostic[] {\n const errors: Diagnostic[] = [];\n\n for (const item of this._items) {\n errors.push(...item.errors);\n }\n\n return errors;\n }\n\n override get warnings(): readonly Diagnostic[] {\n const warnings: Diagnostic[] = [];\n\n for (const item of this._items) {\n warnings.push(...item.warnings);\n }\n\n return warnings;\n }\n}\n","import type { SchemaDefinition } from '../core/types';\nimport type { ValueNode } from './types';\nimport { StringValueNode } from './StringValueNode';\nimport { NumberValueNode } from './NumberValueNode';\nimport { BooleanValueNode } from './BooleanValueNode';\nimport { ObjectValueNode } from './ObjectValueNode';\nimport { ArrayValueNode } from './ArrayValueNode';\n\nexport type NodeFactoryFn = (\n name: string,\n schema: SchemaDefinition,\n value: unknown,\n id?: string,\n) => ValueNode;\n\nexport class NodeFactoryRegistry {\n private readonly factories = new Map<string, NodeFactoryFn>();\n\n register(schemaType: string, factory: NodeFactoryFn): this {\n this.factories.set(schemaType, factory);\n return this;\n }\n\n get(schemaType: string): NodeFactoryFn | undefined {\n return this.factories.get(schemaType);\n }\n\n has(schemaType: string): boolean {\n return this.factories.has(schemaType);\n }\n}\n\nexport class NodeFactory {\n constructor(private readonly registry: NodeFactoryRegistry) {}\n\n create(\n name: string,\n schema: SchemaDefinition,\n value: unknown,\n id?: string,\n ): ValueNode {\n const schemaType = schema.type ?? 'object';\n const factory = this.registry.get(schemaType);\n\n if (!factory) {\n throw new Error(`Unknown schema type: ${schemaType}`);\n }\n\n return factory(name, schema, value, id);\n }\n\n createTree(schema: SchemaDefinition, value: unknown): ValueNode {\n return this.create('', schema, value);\n }\n}\n\nconst stringFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new StringValueNode(id, name, schema, value as string | undefined);\n};\n\nconst numberFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new NumberValueNode(id, name, schema, value as number | undefined);\n};\n\nconst booleanFactory: NodeFactoryFn = (name, schema, value, id) => {\n return new BooleanValueNode(id, name, schema, value as boolean | undefined);\n};\n\nfunction createObjectFactory(nodeFactory: NodeFactory): NodeFactoryFn {\n return (name, schema, value, id) => {\n const objValue = (value ?? {}) as Record<string, unknown>;\n const children: ValueNode[] = [];\n\n const properties = schema.properties ?? {};\n for (const [propName, propSchema] of Object.entries(properties)) {\n const propValue = objValue[propName];\n const childNode = nodeFactory.create(propName, propSchema, propValue);\n children.push(childNode);\n }\n\n return new ObjectValueNode(id, name, schema, children);\n };\n}\n\nfunction createArrayFactory(nodeFactory: NodeFactory): NodeFactoryFn {\n return (name, schema, value, id) => {\n const arrValue = (value ?? []) as unknown[];\n const itemSchema = schema.items ?? { type: 'string' };\n const items: ValueNode[] = [];\n\n for (let i = 0; i < arrValue.length; i++) {\n const itemValue = arrValue[i];\n const itemNode = nodeFactory.create(String(i), itemSchema, itemValue);\n items.push(itemNode);\n }\n\n return new ArrayValueNode(id, name, schema, items);\n };\n}\n\nexport function createDefaultRegistry(): NodeFactoryRegistry {\n const registry = new NodeFactoryRegistry();\n\n registry.register('string', stringFactory);\n registry.register('number', numberFactory);\n registry.register('boolean', booleanFactory);\n\n return registry;\n}\n\nexport function createNodeFactory(): NodeFactory {\n const registry = createDefaultRegistry();\n const factory = new NodeFactory(registry);\n\n registry.register('object', createObjectFactory(factory));\n registry.register('array', createArrayFactory(factory));\n\n return factory;\n}\n","export type PathSegment =\n | { type: 'property'; name: string }\n | { type: 'index'; index: number }\n | { type: 'items' };\n\nexport class Path {\n private constructor(private readonly _segments: readonly PathSegment[]) {}\n\n static empty(): Path {\n return new Path([]);\n }\n\n private static readonly INDEX_REGEX = /^\\[(\\d+)\\]/;\n private static readonly PROP_REGEX = /^\\.?([a-zA-Z_]\\w*)/;\n\n static fromString(path: string): Path {\n if (!path || path === '') {\n return Path.empty();\n }\n\n const segments: PathSegment[] = [];\n let current = path;\n\n while (current.length > 0) {\n const indexMatch = Path.INDEX_REGEX.exec(current);\n if (indexMatch?.[1] !== undefined) {\n segments.push({\n type: 'index',\n index: Number.parseInt(indexMatch[1], 10),\n });\n current = current.slice(indexMatch[0].length);\n continue;\n }\n\n if (current.startsWith('[*]')) {\n segments.push({ type: 'items' });\n current = current.slice(3);\n continue;\n }\n\n const propMatch = Path.PROP_REGEX.exec(current);\n if (propMatch?.[1] !== undefined) {\n segments.push({ type: 'property', name: propMatch[1] });\n current = current.slice(propMatch[0].length);\n continue;\n }\n\n throw new Error(`Invalid path segment: ${current}`);\n }\n\n return new Path(segments);\n }\n\n static fromSegments(segments: readonly PathSegment[]): Path {\n return new Path([...segments]);\n }\n\n segments(): readonly PathSegment[] {\n return this._segments;\n }\n\n isEmpty(): boolean {\n return this._segments.length === 0;\n }\n\n length(): number {\n return this._segments.length;\n }\n\n first(): PathSegment | undefined {\n return this._segments[0];\n }\n\n last(): PathSegment | undefined {\n return this._segments.at(-1);\n }\n\n parent(): Path {\n if (this._segments.length === 0) {\n return this;\n }\n return new Path(this._segments.slice(0, -1));\n }\n\n child(name: string): Path {\n return new Path([...this._segments, { type: 'property', name }]);\n }\n\n childIndex(index: number): Path {\n return new Path([...this._segments, { type: 'index', index }]);\n }\n\n childItems(): Path {\n return new Path([...this._segments, { type: 'items' }]);\n }\n\n isChildOf(parent: Path): boolean {\n if (parent._segments.length >= this._segments.length) {\n return false;\n }\n\n for (let i = 0; i < parent._segments.length; i++) {\n const parentSeg = parent._segments[i];\n const thisSeg = this._segments[i];\n if (!parentSeg || !thisSeg || !this.segmentEquals(parentSeg, thisSeg)) {\n return false;\n }\n }\n\n return true;\n }\n\n equals(other: Path): boolean {\n if (this._segments.length !== other._segments.length) {\n return false;\n }\n\n for (let i = 0; i < this._segments.length; i++) {\n const thisSeg = this._segments[i];\n const otherSeg = other._segments[i];\n if (!thisSeg || !otherSeg || !this.segmentEquals(thisSeg, otherSeg)) {\n return false;\n }\n }\n\n return true;\n }\n\n asSimple(): string {\n let result = '';\n\n for (const segment of this._segments) {\n if (segment.type === 'property') {\n if (result.length > 0) {\n result += '.';\n }\n result += segment.name;\n } else if (segment.type === 'index') {\n result += `[${segment.index}]`;\n } else if (segment.type === 'items') {\n result += '[*]';\n }\n }\n\n return result;\n }\n\n asJsonPointer(): string {\n if (this._segments.length === 0) {\n return '';\n }\n\n let result = '';\n\n for (const segment of this._segments) {\n if (segment.type === 'property') {\n result += '/' + segment.name;\n } else if (segment.type === 'index') {\n result += '/' + segment.index;\n } else if (segment.type === 'items') {\n result += '/-';\n }\n }\n\n return result;\n }\n\n private segmentEquals(a: PathSegment, b: PathSegment): boolean {\n if (a.type !== b.type) {\n return false;\n }\n\n if (a.type === 'property' && b.type === 'property') {\n return a.name === b.name;\n }\n\n if (a.type === 'index' && b.type === 'index') {\n return a.index === b.index;\n }\n\n return true;\n }\n}\n","import { Path } from '../core/Path';\nimport type { ValueNode } from '../node/types';\n\nexport class TreeIndex {\n private readonly nodesById = new Map<string, ValueNode>();\n private readonly pathCache = new Map<string, Path>();\n\n constructor(private readonly root: ValueNode) {\n this.rebuild();\n }\n\n nodeById(id: string): ValueNode | undefined {\n const node = this.nodesById.get(id);\n if (node) {\n return node;\n }\n\n this.rebuild();\n return this.nodesById.get(id);\n }\n\n pathOf(node: ValueNode): Path {\n if (this.isInsideArray(node)) {\n return this.computePath(node);\n }\n\n const cached = this.pathCache.get(node.id);\n if (cached) {\n return cached;\n }\n\n const path = this.computePath(node);\n this.pathCache.set(node.id, path);\n return path;\n }\n\n private isInsideArray(node: ValueNode): boolean {\n let current: ValueNode | null = node.parent;\n while (current) {\n if (current.isArray()) {\n return true;\n }\n current = current.parent;\n }\n return false;\n }\n\n rebuild(): void {\n this.nodesById.clear();\n this.pathCache.clear();\n this.indexNode(this.root);\n }\n\n registerNode(node: ValueNode): void {\n this.indexNode(node);\n }\n\n invalidatePathsUnder(node: ValueNode): void {\n this.pathCache.delete(node.id);\n this.invalidateChildPaths(node);\n }\n\n private indexNode(node: ValueNode): void {\n this.nodesById.set(node.id, node);\n\n if (node.isObject()) {\n for (const child of node.children) {\n this.indexNode(child);\n }\n } else if (node.isArray()) {\n for (const item of node.value) {\n this.indexNode(item);\n }\n }\n }\n\n private computePath(node: ValueNode): Path {\n const segments: Array<\n { type: 'property'; name: string } | { type: 'index'; index: number }\n > = [];\n let current: ValueNode | null = node;\n\n while (current?.parent) {\n const parent: ValueNode = current.parent;\n\n if (parent.isObject()) {\n segments.unshift({ type: 'property', name: current.name });\n } else if (parent.isArray()) {\n const index = parent.value.indexOf(current);\n if (index >= 0) {\n segments.unshift({ type: 'index', index });\n }\n }\n\n current = parent;\n }\n\n return Path.fromSegments(segments);\n }\n\n private invalidateChildPaths(node: ValueNode): void {\n if (node.isObject()) {\n for (const child of node.children) {\n this.pathCache.delete(child.id);\n this.invalidateChildPaths(child);\n }\n } else if (node.isArray()) {\n for (const item of node.value) {\n this.pathCache.delete(item.id);\n this.invalidateChildPaths(item);\n }\n }\n }\n}\n","import type { Change, JsonPatch } from '../core/types';\n\nexport class ChangeTracker {\n private _changes: Change[] = [];\n\n get changes(): readonly Change[] {\n return this._changes;\n }\n\n get hasChanges(): boolean {\n return this._changes.length > 0;\n }\n\n track(change: Change): void {\n this._changes.push(change);\n }\n\n clear(): void {\n this._changes = [];\n }\n\n toPatches(): readonly JsonPatch[] {\n const patches: JsonPatch[] = [];\n\n for (const change of this._changes) {\n const patch = this.changeToPatches(change);\n patches.push(...patch);\n }\n\n return patches;\n }\n\n private changeToPatches(change: Change): JsonPatch[] {\n const path = change.path.asJsonPointer();\n\n switch (change.type) {\n case 'setValue':\n return [{ op: 'replace', path, value: change.value }];\n\n case 'addProperty':\n return [{ op: 'add', path, value: change.value }];\n\n case 'removeProperty':\n return [{ op: 'remove', path }];\n\n case 'arrayPush':\n return [{ op: 'add', path: `${path}/-`, value: change.value }];\n\n case 'arrayInsert':\n return [\n { op: 'add', path: `${path}/${change.index}`, value: change.value },\n ];\n\n case 'arrayRemove':\n return [{ op: 'remove', path: `${path}/${change.index}` }];\n\n case 'arrayMove': {\n const fromIndex = change.fromIndex ?? 0;\n const toIndex = change.toIndex ?? 0;\n return [\n {\n op: 'move',\n from: `${path}/${fromIndex}`,\n path: `${path}/${toIndex}`,\n },\n ];\n }\n\n case 'arrayReplace':\n return [\n {\n op: 'replace',\n path: `${path}/${change.index}`,\n value: change.value,\n },\n ];\n\n case 'arrayClear':\n return [{ op: 'replace', path, value: [] }];\n\n default:\n return [];\n }\n }\n}\n","import { makeObservable, computed, action } from 'mobx';\nimport type { Diagnostic, Change, JsonPatch } from '../core/types';\nimport { Path } from '../core/Path';\nimport type { PathSegment } from '../core/Path';\nimport type { ValueNode, DirtyTrackable } from '../node/types';\nimport { TreeIndex } from './TreeIndex';\nimport { ChangeTracker } from './ChangeTracker';\nimport type { FormulaEngine } from '../formula/FormulaEngine';\n\nexport class ValueTree {\n private readonly index: TreeIndex;\n private readonly changeTracker: ChangeTracker;\n private _formulaEngine: FormulaEngine | null = null;\n\n constructor(private readonly _root: ValueNode) {\n this.index = new TreeIndex(_root);\n this.changeTracker = new ChangeTracker();\n\n makeObservable(this, {\n allErrors: computed,\n allWarnings: computed,\n allDiagnostics: computed,\n isValid: computed,\n hasDiagnostics: computed,\n isDirty: computed,\n commit: action,\n revert: action,\n });\n }\n\n get root(): ValueNode {\n return this._root;\n }\n\n nodeById(id: string): ValueNode | undefined {\n return this.index.nodeById(id);\n }\n\n get(path: string): ValueNode | undefined {\n return this.getByPath(Path.fromString(path));\n }\n\n getByPath(path: Path): ValueNode | undefined {\n if (path.isEmpty()) {\n return this._root;\n }\n\n let current: ValueNode | undefined = this._root;\n\n for (const segment of path.segments()) {\n if (!current) {\n return undefined;\n }\n\n current = this.resolveSegment(current, segment);\n }\n\n return current;\n }\n\n private resolveSegment(\n node: ValueNode,\n segment: PathSegment,\n ): ValueNode | undefined {\n if (segment.type === 'property' && node.isObject()) {\n return node.child(segment.name);\n }\n if (segment.type === 'index' && node.isArray()) {\n return node.at(segment.index);\n }\n return undefined;\n }\n\n pathOf(nodeOrId: ValueNode | string): Path {\n const node =\n typeof nodeOrId === 'string' ? this.nodeById(nodeOrId) : nodeOrId;\n if (!node) {\n return Path.empty();\n }\n return this.index.pathOf(node);\n }\n\n get allErrors(): readonly Diagnostic[] {\n return this._root.errors;\n }\n\n get allWarnings(): readonly Diagnostic[] {\n return this._root.warnings;\n }\n\n get allDiagnostics(): readonly Diagnostic[] {\n return [...this.allErrors, ...this.allWarnings];\n }\n\n get isValid(): boolean {\n return this.allErrors.length === 0;\n }\n\n get hasDiagnostics(): boolean {\n return this.allDiagnostics.length > 0;\n }\n\n get errorsByPath(): ReadonlyMap<string, readonly Diagnostic[]> {\n const map = new Map<string, Diagnostic[]>();\n for (const error of this.allErrors) {\n const list = map.get(error.path) ?? [];\n list.push(error);\n map.set(error.path, list);\n }\n return map;\n }\n\n getValue(path: string): unknown {\n return this.get(path)?.getPlainValue();\n }\n\n setValue(path: string, value: unknown): void {\n const parsedPath = Path.fromString(path);\n const node = this.getByPath(parsedPath);\n if (!node) {\n throw new Error(`Path not found: ${path}`);\n }\n if (!node.isPrimitive()) {\n throw new Error(`Cannot set value on non-primitive node: ${path}`);\n }\n\n const oldValue = node.value;\n node.setValue(value);\n\n this.changeTracker.track({\n type: 'setValue',\n path: parsedPath,\n value,\n oldValue,\n });\n }\n\n getPlainValue(): unknown {\n return this._root.getPlainValue();\n }\n\n get changes(): readonly Change[] {\n return this.changeTracker.changes;\n }\n\n get hasChanges(): boolean {\n return this.changeTracker.hasChanges;\n }\n\n clearChanges(): void {\n this.changeTracker.clear();\n }\n\n getPatches(): readonly JsonPatch[] {\n return this.changeTracker.toPatches();\n }\n\n trackChange(change: Change): void {\n this.changeTracker.track(change);\n }\n\n rebuildIndex(): void {\n this.index.rebuild();\n }\n\n invalidatePathsUnder(node: ValueNode): void {\n this.index.invalidatePathsUnder(node);\n }\n\n get isDirty(): boolean {\n const root = this._root as unknown as DirtyTrackable;\n if ('isDirty' in root) {\n return root.isDirty;\n }\n return false;\n }\n\n commit(): void {\n const root = this._root as unknown as DirtyTrackable;\n if ('commit' in root && typeof root.commit === 'function') {\n root.commit();\n }\n this.changeTracker.clear();\n }\n\n revert(): void {\n const root = this._root as unknown as DirtyTrackable;\n if ('revert' in root && typeof root.revert === 'function') {\n root.revert();\n }\n this.changeTracker.clear();\n }\n\n setFormulaEngine(engine: FormulaEngine): void {\n this._formulaEngine = engine;\n }\n\n get formulaEngine(): FormulaEngine | null {\n return this._formulaEngine;\n }\n\n dispose(): void {\n this._formulaEngine?.dispose();\n this._formulaEngine = null;\n }\n}\n","import { parseExpression } from '@revisium/formula';\nimport type {\n ValueNode,\n PrimitiveValueNode,\n ObjectValueNode,\n} from '../node/types';\nimport type { FormulaField, FormulaArrayLevel } from './types';\n\ninterface TraverseContext {\n parent: ObjectValueNode | null;\n arrayLevels: FormulaArrayLevel[];\n}\n\ntype PathSegment =\n | { type: 'property'; name: string }\n | { type: 'index'; index: number };\n\nconst INDEX_REGEX = /^\\[(-?\\d+)\\]/;\nconst PROP_REGEX = /^\\.?([a-zA-Z_]\\w*)/;\n\nexport class FormulaCollector {\n private root: ValueNode | null = null;\n\n collect(root: ValueNode): FormulaField[] {\n this.root = root;\n const formulas: FormulaField[] = [];\n this.traverse(root, { parent: null, arrayLevels: [] }, formulas);\n return formulas;\n }\n\n private traverse(\n node: ValueNode,\n context: TraverseContext,\n formulas: FormulaField[],\n ): void {\n if (node.isPrimitive()) {\n this.collectPrimitive(node, context, formulas);\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.traverse(child, { ...context, parent: node }, formulas);\n }\n } else if (node.isArray()) {\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n this.traverse(\n item,\n {\n ...context,\n arrayLevels: [...context.arrayLevels, { array: node, index: i }],\n },\n formulas,\n );\n }\n }\n }\n }\n\n private collectPrimitive(\n node: PrimitiveValueNode,\n context: TraverseContext,\n formulas: FormulaField[],\n ): void {\n const formula = node.formula;\n if (!formula) {\n return;\n }\n\n const rawDependencies = this.extractDependencies(formula.expression);\n const dependencyNodes = this.resolveDependencies(\n rawDependencies,\n node,\n context,\n );\n\n formulas.push({\n node,\n expression: formula.expression,\n parent: context.parent,\n dependencyNodes,\n arrayLevels: context.arrayLevels,\n });\n }\n\n private extractDependencies(expression: string): readonly string[] {\n try {\n const parsed = parseExpression(expression);\n return parsed.dependencies;\n } catch {\n return [];\n }\n }\n\n private resolveDependencies(\n rawDeps: readonly string[],\n formulaNode: PrimitiveValueNode,\n context: TraverseContext,\n ): PrimitiveValueNode[] {\n const nodes: PrimitiveValueNode[] = [];\n\n for (const dep of rawDeps) {\n const node = this.resolveOneDependency(dep, formulaNode, context);\n if (node) {\n this.collectPrimitiveNodes(node, nodes);\n }\n }\n\n return nodes;\n }\n\n private collectPrimitiveNodes(\n node: ValueNode,\n result: PrimitiveValueNode[],\n ): void {\n if (node.isPrimitive()) {\n result.push(node);\n } else if (node.isArray()) {\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n this.collectPrimitiveNodes(item, result);\n }\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.collectPrimitiveNodes(child, result);\n }\n }\n }\n\n private resolveOneDependency(\n dep: string,\n _formulaNode: PrimitiveValueNode,\n context: TraverseContext,\n ): ValueNode | null {\n if (dep.startsWith('/')) {\n return this.resolveFromRoot(dep.slice(1));\n }\n\n if (dep.startsWith('../')) {\n return this.resolveRelative(dep, context);\n }\n\n if (context.parent) {\n return this.resolveFromNode(context.parent, dep);\n }\n\n return this.resolveFromRoot(dep);\n }\n\n private resolveFromRoot(pathStr: string): ValueNode | null {\n if (!this.root) {\n return null;\n }\n return this.resolveFromNode(this.root, pathStr);\n }\n\n private resolveFromNode(\n startNode: ValueNode,\n pathStr: string,\n ): ValueNode | null {\n const segments = this.parsePathSegments(pathStr);\n let current: ValueNode | null = startNode;\n\n for (const segment of segments) {\n if (!current) {\n return null;\n }\n\n if (segment.type === 'property') {\n if (current.isObject()) {\n current =\n current.children.find((c) => c.name === segment.name) ?? null;\n } else {\n return null;\n }\n } else if (segment.type === 'index') {\n if (current.isArray()) {\n current = current.at(segment.index) ?? null;\n } else {\n return null;\n }\n }\n }\n\n return current;\n }\n\n private resolveRelative(\n dep: string,\n context: TraverseContext,\n ): ValueNode | null {\n let upLevels = 0;\n let remaining = dep;\n\n while (remaining.startsWith('../')) {\n upLevels++;\n remaining = remaining.slice(3);\n }\n\n let current: ValueNode | null = context.parent;\n\n for (let i = 0; i < upLevels && current; i++) {\n current = this.findParent(current);\n if (current?.isArray()) {\n current = this.findParent(current);\n }\n }\n\n if (!current) {\n return null;\n }\n\n if (remaining) {\n return this.resolveFromNode(current, remaining);\n }\n\n return current;\n }\n\n private findParent(node: ValueNode): ValueNode | null {\n if (!this.root || node === this.root) {\n return null;\n }\n\n return this.findParentRecursive(this.root, node);\n }\n\n private findParentRecursive(\n current: ValueNode,\n target: ValueNode,\n ): ValueNode | null {\n const children = this.getChildNodes(current);\n\n for (const child of children) {\n if (child === target) {\n return current;\n }\n const found = this.findParentRecursive(child, target);\n if (found) {\n return found;\n }\n }\n\n return null;\n }\n\n private getChildNodes(node: ValueNode): ValueNode[] {\n if (node.isObject()) {\n return [...node.children];\n }\n if (node.isArray()) {\n const items: ValueNode[] = [];\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n items.push(item);\n }\n }\n return items;\n }\n return [];\n }\n\n private parsePathSegments(pathStr: string): PathSegment[] {\n const segments: PathSegment[] = [];\n let current = pathStr;\n\n while (current.length > 0) {\n const indexMatch = INDEX_REGEX.exec(current);\n if (indexMatch?.[1]) {\n segments.push({\n type: 'index',\n index: Number.parseInt(indexMatch[1], 10),\n });\n current = current.slice(indexMatch[0].length);\n continue;\n }\n\n const propMatch = PROP_REGEX.exec(current);\n if (propMatch?.[1]) {\n segments.push({ type: 'property', name: propMatch[1] });\n current = current.slice(propMatch[0].length);\n continue;\n }\n\n break;\n }\n\n return segments;\n }\n}\n","import type { PrimitiveValueNode } from '../node/types';\nimport type { FormulaField, DependencyMap } from './types';\n\nexport class DependencyGraph {\n buildDependencyMap(formulas: readonly FormulaField[]): DependencyMap {\n const map: DependencyMap = new Map();\n\n for (const field of formulas) {\n for (const depNode of field.dependencyNodes) {\n let depSet = map.get(depNode);\n if (!depSet) {\n depSet = new Set();\n map.set(depNode, depSet);\n }\n depSet.add(field);\n }\n }\n\n return map;\n }\n\n buildEvaluationOrder(\n formulas: readonly FormulaField[],\n ): readonly FormulaField[] {\n const formulaNodes = new Set(formulas.map((f) => f.node));\n const visited = new Set<PrimitiveValueNode>();\n const order: FormulaField[] = [];\n\n const formulaByNode = new Map<PrimitiveValueNode, FormulaField>();\n for (const field of formulas) {\n formulaByNode.set(field.node, field);\n }\n\n const visit = (\n field: FormulaField,\n stack: Set<PrimitiveValueNode>,\n ): void => {\n if (visited.has(field.node)) {\n return;\n }\n\n if (stack.has(field.node)) {\n return;\n }\n\n stack.add(field.node);\n\n for (const depNode of field.dependencyNodes) {\n if (formulaNodes.has(depNode)) {\n const depFormula = formulaByNode.get(depNode);\n if (depFormula) {\n visit(depFormula, stack);\n }\n }\n }\n\n stack.delete(field.node);\n visited.add(field.node);\n order.push(field);\n };\n\n for (const field of formulas) {\n visit(field, new Set());\n }\n\n return order;\n }\n\n getAffectedFormulas(\n changedNode: PrimitiveValueNode,\n dependencyMap: DependencyMap,\n evaluationOrder: readonly FormulaField[],\n ): readonly FormulaField[] {\n const affected = new Set<FormulaField>();\n const queue: PrimitiveValueNode[] = [changedNode];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const dependents = dependencyMap.get(current);\n\n if (dependents) {\n for (const field of dependents) {\n if (!affected.has(field)) {\n affected.add(field);\n queue.push(field.node);\n }\n }\n }\n }\n\n return evaluationOrder.filter((field) => affected.has(field));\n }\n}\n","import { evaluateWithContext } from '@revisium/formula';\nimport type { ValueTree } from '../tree/ValueTree';\nimport type { ValueNode, ObjectValueNode } from '../node/types';\nimport type { FormulaField, FormulaEngineOptions } from './types';\n\nexport class FormulaEvaluator {\n constructor(\n private readonly tree: ValueTree,\n private readonly options: FormulaEngineOptions = {},\n ) {}\n\n evaluate(field: FormulaField): void {\n try {\n const context = this.buildContext(field);\n const result = evaluateWithContext(field.expression, context);\n\n this.setNodeValue(field, result);\n this.checkForWarnings(field, result);\n } catch (error) {\n this.handleError(field, error as Error);\n }\n }\n\n evaluateAll(fields: Iterable<FormulaField>): void {\n for (const field of fields) {\n this.evaluate(field);\n }\n }\n\n private buildContext(field: FormulaField) {\n const rootData = this.tree.getPlainValue() as Record<string, unknown>;\n\n const context: {\n rootData: Record<string, unknown>;\n itemData?: Record<string, unknown>;\n currentPath?: string;\n arrayContext?: {\n levels: Array<{\n index: number;\n length: number;\n prev: unknown;\n next: unknown;\n }>;\n };\n } = { rootData };\n\n if (field.parent) {\n const itemData = this.getPlainObjectValue(field.parent);\n if (itemData) {\n context.itemData = itemData;\n }\n }\n\n if (field.arrayLevels.length > 0) {\n context.arrayContext = { levels: this.buildArrayLevels(field) };\n }\n\n return context;\n }\n\n private buildArrayLevels(field: FormulaField) {\n const levels: Array<{\n index: number;\n length: number;\n prev: unknown;\n next: unknown;\n }> = [];\n\n // Build levels from innermost to outermost (reverse order)\n // levels[0] = current (innermost), levels[1] = parent, levels[2] = root, etc.\n for (let i = field.arrayLevels.length - 1; i >= 0; i--) {\n const level = field.arrayLevels[i];\n if (!level) {\n continue;\n }\n const { array, index } = level;\n\n levels.push({\n index,\n length: array.length,\n prev: this.getPrevItemValue(array, index),\n next: this.getNextItemValue(array, index),\n });\n }\n\n return levels;\n }\n\n private getPrevItemValue(\n array: { at(i: number): ValueNode | undefined; length: number },\n index: number,\n ): unknown {\n if (index <= 0) {\n return null;\n }\n const prevItem = array.at(index - 1);\n return prevItem ? this.getPlainNodeValue(prevItem) : null;\n }\n\n private getNextItemValue(\n array: { at(i: number): ValueNode | undefined; length: number },\n index: number,\n ): unknown {\n if (index >= array.length - 1) {\n return null;\n }\n const nextItem = array.at(index + 1);\n return nextItem ? this.getPlainNodeValue(nextItem) : null;\n }\n\n private getPlainObjectValue(node: ObjectValueNode): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const child of node.children) {\n result[child.name] = this.getPlainNodeValue(child);\n }\n return result;\n }\n\n private getPlainNodeValue(node: ValueNode): unknown {\n if (node.isPrimitive()) {\n return node.value;\n }\n if (node.isObject()) {\n return this.getPlainObjectValue(node);\n }\n if (node.isArray()) {\n const result: unknown[] = [];\n for (let i = 0; i < node.length; i++) {\n const item = node.at(i);\n if (item) {\n result.push(this.getPlainNodeValue(item));\n }\n }\n return result;\n }\n return null;\n }\n\n private setNodeValue(field: FormulaField, result: unknown): void {\n const { node } = field;\n const defaultValue = node.defaultValue;\n\n if (result === null || result === undefined) {\n node.setValue(defaultValue, { internal: true });\n return;\n }\n\n if (\n typeof result === 'number' &&\n (Number.isNaN(result) || !Number.isFinite(result))\n ) {\n node.setValue(defaultValue, { internal: true });\n return;\n }\n\n node.setValue(result, { internal: true });\n }\n\n private checkForWarnings(field: FormulaField, result: unknown): void {\n const { node } = field;\n\n if (typeof result === 'number') {\n if (Number.isNaN(result)) {\n node.setFormulaWarning({\n type: 'nan',\n message: 'Formula result is NaN',\n expression: field.expression,\n computedValue: result,\n });\n return;\n }\n\n if (!Number.isFinite(result)) {\n node.setFormulaWarning({\n type: 'infinity',\n message: 'Formula result is Infinity',\n expression: field.expression,\n computedValue: result,\n });\n return;\n }\n }\n\n node.setFormulaWarning(null);\n }\n\n private handleError(field: FormulaField, error: Error): void {\n const { node } = field;\n\n node.setValue(node.defaultValue, { internal: true });\n\n node.setFormulaWarning({\n type: 'runtime-error',\n message: error.message,\n expression: field.expression,\n computedValue: undefined,\n });\n\n if (this.options.onError) {\n this.options.onError(node, error);\n }\n }\n}\n","import { reaction, runInAction, IReactionDisposer } from 'mobx';\nimport type { ValueTree } from '../tree/ValueTree';\nimport type { ValueNode, PrimitiveValueNode } from '../node/types';\nimport type {\n FormulaField,\n DependencyMap,\n FormulaEngineOptions,\n} from './types';\nimport { FormulaCollector } from './FormulaCollector';\nimport { DependencyGraph } from './DependencyGraph';\nimport { FormulaEvaluator } from './FormulaEvaluator';\n\nexport class FormulaEngine {\n private readonly collector: FormulaCollector;\n private readonly graph: DependencyGraph;\n private readonly evaluator: FormulaEvaluator;\n\n private formulas: FormulaField[] = [];\n private dependencyMap: DependencyMap = new Map();\n private evaluationOrder: readonly FormulaField[] = [];\n private disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly tree: ValueTree,\n options: FormulaEngineOptions = {},\n ) {\n this.collector = new FormulaCollector();\n this.graph = new DependencyGraph();\n this.evaluator = new FormulaEvaluator(tree, options);\n\n this.initialize();\n }\n\n reinitialize(): void {\n this.disposeReactions();\n this.initialize();\n }\n\n dispose(): void {\n this.disposeReactions();\n this.formulas = [];\n this.dependencyMap = new Map();\n this.evaluationOrder = [];\n }\n\n getFormulas(): readonly FormulaField[] {\n return this.formulas;\n }\n\n getEvaluationOrder(): readonly FormulaField[] {\n return this.evaluationOrder;\n }\n\n private initialize(): void {\n this.formulas = this.collector.collect(this.tree.root);\n\n this.dependencyMap = this.graph.buildDependencyMap(this.formulas);\n this.evaluationOrder = this.graph.buildEvaluationOrder(this.formulas);\n\n this.evaluateAll();\n\n this.setupReactions();\n }\n\n private evaluateAll(): void {\n runInAction(() => {\n for (const field of this.evaluationOrder) {\n this.evaluator.evaluate(field);\n }\n });\n }\n\n private setupReactions(): void {\n const watchedNodes = new Set<PrimitiveValueNode>();\n\n for (const [depNode] of this.dependencyMap) {\n if (watchedNodes.has(depNode)) {\n continue;\n }\n watchedNodes.add(depNode);\n\n const disposer = reaction(\n () => depNode.value,\n () => this.handleDependencyChange(depNode),\n );\n this.disposers.push(disposer);\n }\n\n this.setupArrayReactions(this.tree.root);\n }\n\n private setupArrayReactions(node: ValueNode): void {\n if (node.isArray()) {\n const disposer = reaction(\n () => node.length,\n () => this.handleStructureChange(),\n );\n this.disposers.push(disposer);\n\n for (const item of node.value) {\n this.setupArrayReactions(item);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n this.setupArrayReactions(child);\n }\n }\n }\n\n private handleDependencyChange(changedNode: PrimitiveValueNode): void {\n const affected = this.graph.getAffectedFormulas(\n changedNode,\n this.dependencyMap,\n this.evaluationOrder,\n );\n\n runInAction(() => {\n for (const field of affected) {\n this.evaluator.evaluate(field);\n }\n });\n }\n\n private handleStructureChange(): void {\n this.reinitialize();\n }\n\n private disposeReactions(): void {\n for (const disposer of this.disposers) {\n disposer();\n }\n this.disposers = [];\n }\n}\n","import type { SchemaDefinition } from './core/types';\nimport { createNodeFactory, NodeFactory } from './node/NodeFactory';\nimport type { ValueNode } from './node/types';\nimport { ValueTree } from './tree/ValueTree';\nimport { FormulaEngine } from './formula/FormulaEngine';\nimport type { FormulaEngineOptions } from './formula/types';\n\nexport interface CreateValueModelOptions {\n nodeFactory?: NodeFactory;\n formulaEngine?: boolean | FormulaEngineOptions;\n}\n\nexport function createValueModel(\n schema: SchemaDefinition,\n initialValue: unknown,\n options?: CreateValueModelOptions,\n): ValueTree {\n const nodeFactory = options?.nodeFactory ?? createNodeFactory();\n const rootNode = nodeFactory.createTree(schema, initialValue);\n\n propagateFactoryToArrays(rootNode, nodeFactory);\n\n const tree = new ValueTree(rootNode);\n\n if (options?.formulaEngine !== false) {\n const formulaOptions =\n typeof options?.formulaEngine === 'object' ? options.formulaEngine : {};\n const engine = new FormulaEngine(tree, formulaOptions);\n tree.setFormulaEngine(engine);\n }\n\n return tree;\n}\n\nfunction propagateFactoryToArrays(node: ValueNode, factory: NodeFactory): void {\n if (node.isArray()) {\n node.setNodeFactory(factory);\n for (const item of node.value) {\n propagateFactoryToArrays(item, factory);\n }\n } else if (node.isObject()) {\n for (const child of node.children) {\n propagateFactoryToArrays(child, factory);\n }\n }\n}\n\nexport function createEmptyValueModel(\n schema: SchemaDefinition,\n options?: CreateValueModelOptions,\n): ValueTree {\n return createValueModel(schema, undefined, options);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAa,UAAUA,MAAM,WAC3B,SAAS,QAAQ,OAAO,KAAK;CAC3B,MAAM,EACJ,WACA,UACA,UACA,YAAY,MACZ,SACA,cACA,WACA,GAAG,SACD;AAEJ,KAAI,SACF,QAAO,yEAAG,WAAY;AAGxB,QACE,4CAACC,yBAAc;EAAK,GAAI;aACtB,2CAACA,yBAAc;GAAQ;GAAS;IAAiC,EACjE,2CAACC;GAAO,UAAU,CAAC;GAAW,WAAW;aACvC,2CAACD,yBAAc,wBACb,4CAACA,yBAAc;IAAa;IAAK,GAAI;eAClC,aACC,2CAACA,yBAAc,mBACb,2CAACA,yBAAc,aAAW,GACN,EAEvB;KACqB,GACC;IACpB;GACU;EAG1B;;;;ACpCD,SAAS,WAAW,MAAsB;AACxC,QAAO,KACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,SAAS;;AAoB9B,MAAM,UAAU,IAAI,IAAI;CACtB;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAa,mBAAsD,EACjE,WACA,aACA,WACA,QACA,UACA,UACA,SACA,SACA,uBACA,UACA,QACA,SACA,YACA,qBACI;CACJ,MAAM,wBAAoC,KAAK;CAC/C,MAAM,mCAAuC,KAAK;AAElD,4BAAgB;AACd,MAAI,UACF,KAAI,SAAS,OAAO;IAErB,CAAC,UAAU,CAAC;AAEf,kCAAsB;AAEpB,MADkB,WAAW,cAAc,IAC1B,eAAe,YAAY,QAAQ,IAAI,SAAS;GAC/D,MAAM,eAAe,IAAI,QAAQ,eAAe,IAAI;GACpD,MAAM,WAAW,KAAK,IAAI,aAAa,eAAe,QAAQ;GAE9D,MAAM,QAAQ,SAAS,aAAa;GACpC,MAAM,MAAM,WAAW,cAAc;GAErC,MAAM,OADa,IAAI,QAAQ,WAAW,MACT,IAAI;AACrC,SAAM,SAAS,MAAM,SAAS;AAC9B,SAAM,SAAS,KAAK;AAEpB,OAAI,KAAK;AACP,QAAI,iBAAiB;AACrB,QAAI,SAAS,MAAM;;;GAGvB;AAEF,sCAAsB;AACpB,MAAI,uBAAuB;AACzB,OAAI,SAAS,OAAO;GACpB,MAAM,YAAY,WAAW,cAAc;AAE3C,OAAI,IAAI,WAAW,WAAW;IAC5B,MAAM,QAAQ,SAAS,aAAa;AACpC,UAAM,mBAAmB,IAAI,QAAQ;AACrC,UAAM,SAAS,MAAM;AACrB,cAAU,iBAAiB;AAC3B,cAAU,SAAS,MAAM;;;IAG5B,CAAC,GAAI,yBAAyB,EAAE,CAAE,CAAC;CAEtC,MAAM,uCACH,UAAU;EACT,MAAM,YAAY,WAAW,cAAc;AAC3C,MAAI,aAAa,UAAU,aAAa,EACtC,gBAAe,UAAU,UAAU,WAAW,EAAE,CAAC;EAGnD,MAAM,YAAY,MAAM,cAAc;AACtC,aAAW,cAAc,OAAO,KAAK,UAAU;IAEjD,CAAC,SAAS,CACX;CAED,MAAM,0CAAuE;AAC3E,YAAU;AACV,iBAAe,UAAU;IACxB,CAAC,OAAO,CAAC;CAEZ,MAAM,wCACH,UAAU;AACT,MAAI,MAAM,QAAQ,SAAS;AACzB,SAAM,gBAAgB;AAEtB,OAAI,WAAW;AACb,QAAI,SAAS,MAAM;AACnB,eAAW;;;AAGf,MAAI,MAAM,QAAQ,UAAU;AAC1B,SAAM,gBAAgB;AACtB,OAAI,UACF,KAAI,SAAS,MAAM;AAErB,eAAY;;AAGd,MAAI,YAAY,CAAC,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAClE,OAAM,gBAAgB;IAG1B;EAAC;EAAW;EAAS;EAAU;EAAS,CACzC;CAED,MAAM,iDAAsC;AAC1C,MAAI,SAAS,OAAO;IACnB,EAAE,CAAC;CAEN,MAAM,kBAAkB,CAAC,aAAa;AAEtC,QACE,4CAACE;EACC,UAAU;EACV,OAAO,kBAAkB,SAAS;EAClC,UAAS;EACT,SAAS;;GAER,CAAC,mBAAmB;GACrB,2CAACC;IACC,OAAM;IACU;IAChB,eAAa;IACR;IACL;IACA,YAAY;IACZ,yBAAyB,EAAE,QAAQ,WAAW,UAAU,EAAE;IAC1D,SAAS;IACT,OAAM;IACN,QAAQ;IACC;IACT,SAAS;IACT,WAAW;KACN;GACN,CAAC,mBAAmB;GACpB,mBACC,2CAACC;IACC,QAAO;IACP,YAAW;IACX,eAAc;IACd,YAAW;IACX,OAAM;IACN,UAAS;cAER;KACI;;GAEJ;;;;;ACjLX,MAAa,cAAyC,EACpD,SAAS,UACT,OACA,SACA,UACA,YACA,WACA,MACA,iBACI;AACJ,QACE,2CAACC;EACC,eAAa;EACb,QAAQ;GAAE,OAAO;GAAY,iBAAiB;GAAS;EACvD,WACE,aACI;GAAE,iBAAiB;GAAW,QAAQ;GAAe,GACrD;EAEN,WAAU;EACV,OAAM;EACN,YAAW;EACX,UAAU;EACF;EACR,UAAU,YAAY;EACtB,SAAS;EACT,SAAQ;EACC;YAET,4CAACC;GAAK,YAAW;GAAS,KAAI;cAC3B,QAAQ,2CAACC;IAAI,UAAS;cAAM;KAAW,EACxC,2CAACC,mCAAM,QAAa;IACf;GACA;;;;;ACnCb,MAAa,gBAA6C,UAAU;AAClE,QAAO,2CAAC;EAAW,GAAI;EAAO,MAAM,2CAACC,8BAAa;GAAI;;;;;ACFxD,MAAa,eAA2C,EACtD,SAAS,UACT,SACA,UACA,iBACI;AACJ,QACE,2CAACC;EACC,eAAa;EACH;EACV,QAAQ,EAAE,iBAAiB,WAAW;EACtC,WAAU;EACV,OAAM;EACE;EACR,SAAQ;EACC;EACT,OAAM;YAEN,2CAACC;GAAK,MAAK;aACT,2CAACC,uBAAM;IACF;GACA;;;;;ACrBb,MAAa,cAAyC,EACpD,SAAS,UACT,SACA,YACA,iBACI;AACJ,QACE,2CAACC;EACC,eAAa;EACb,UAAU;EACV,QAAQ,EAAE,iBAAiB,WAAW;EACtC,WAAU;EACF;EACR,SAAQ;EACC;YAET,2CAACC;GAAK,SAAS;GAAG,OAAM;aACtB,2CAACC,+BAAc;IACV;GACA;;;;;ACtBb,MAAa,kBAA2C,EACtD,YACA,GAAG,YACC;AACJ,QACE,2CAACC;EACC,eAAa;EACb,QAAQ,EAAE,iBAAiB,WAAW;EACtC,OAAM;EACN,SAAQ;EACR,MAAK;EACL,GAAI;YAEJ,2CAACC,0BAAS;GACC;;;;;ACdjB,MAAa,cAAmC,EAAE,YAAY,GAAG,YAAY;AAC3E,QACE,2CAACC;EACC,eAAa;EACb,QAAQ,EAAE,iBAAiB,YAAY;EACvC,OAAM;EACN,SAAQ;EACR,GAAI;YAEJ,2CAACC,0BAAS;GACC;;;;;ACKjB,MAAa,YAAqC,EAChD,MACA,UACA,UACA,QACA,aACI;CACJ,MAAM,CAAC,OAAO,gCAAqB,GAAG;CACtC,MAAM,eAAe,KAAK,UAAU,MAAM,MAAM,EAAE;CAClD,MAAM,CAAC,cAAc,uCAA4B,aAAa;CAC9D,MAAM,iCAAsB,MAAM;CAElC,MAAM,cAAc,aAAa,UAAU,eAAe;CAE1D,MAAM,2CAAgC;AACpC,EAAK,UAAU,UAAU,UAAU,YAAY,CAAC,WAAW;AACzD,aAAU;IACV;IACD,CAAC,aAAa,OAAO,CAAC;CAEzB,MAAM,uCACH,UAAkB;AACjB,kBAAgB,MAAM;AAEtB,MAAI;GACF,MAAM,aAAa,KAAK,MAAM,MAAM;AACpC,YAAS,GAAG;AACZ,cAAW,WAAW;WACf,GAAG;AACV,WAAQ,MAAM,EAAE;AAChB,YAAS,eAAe;;IAG5B,CAAC,SAAS,CACX;CAED,MAAM,2CAAgC;AACpC,eAAa,UAAU;AACvB,kBAAgB,aAAa;IAC5B,CAAC,aAAa,CAAC;CAElB,MAAM,0CAA+B;AACnC,eAAa,UAAU;AACvB,kBAAgB,aAAa;AAC7B,YAAU;IACT,CAAC,QAAQ,aAAa,CAAC;AAM1B,QACE,4CAACC;EACC,UAAS;EACT,OAAM;EACN,MAAM;EACN,WAAU;EACV,KAAI;EACJ,KAXgB,EAClB,wBAAwB,EAAE,YAAY,WAAoB,EAC3D;aAWG,4CAACC;GAAI,GAAG;GAAG,MAAM;cACf,2CAACC;IACC,OAAO;IACP,YAAY,CAACC,iCAAW,+CAAoB,CAAC;IAC7C,UAAU,CAAC;IACX,OAAOC;IACP,UAAS;IACT,YAAY;KACV,aAAa;KACb,YAAY;KACb;IACD,UAAU;IACV,SAAS;IACT,QAAQ;KACR,EACF,2CAAC;IACC,YAAW;IACX,cAAW;IACX,UAAS;IACT,KAAI;IACJ,OAAM;IACN,WAAU;IACV,YAAW;IACX,SAAS;KACT;IACE,EACN,2CAACJ;GACC,QAAO;GACP,eAAc;GACd,YAAW;GACX,iBAAgB;GAChB,OAAM;GACN,UAAS;GACT,QAAQ;GACR,gBAAe;aAEf,2CAACK;IAAK,OAAM;cAAQ;KAAa;IAC5B;GACF;;;;;ACjHX,IAAY,kEAAL;AACL;AACA;AACA;AACA;AACA;;;AAWF,IAAY,kEAAL;AACL;AACA;AACA;;;AAGF,IAAY,4DAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,MAAa,iBAAiB,QAAwB;AAYpD,QAXuC;GACpC,gBAAgB,QAAQ;GACxB,gBAAgB,eAAe;GAC/B,gBAAgB,eAAe;GAC/B,gBAAgB,eAAe;GAC/B,gBAAgB,iBAAiB;GACjC,gBAAgB,eAAe;GAC/B,gBAAgB,UAAU;GAC1B,gBAAgB,gBAAgB;GAChC,gBAAgB,OAAO;EACzB,CACa,QAAQ;;;;;AC3CxB,MAAM,QAKA;CACJ;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM,2CAACC,kCAAiB;EACxB,YAAY;EACb;CACD;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM,2CAACC,uCAAsB;EAC7B,YAAY;EACb;CACD;EACE,MAAM,mBAAmB;EACzB,OAAO;EACP,MAAM,2CAACC,8BAAa;EACpB,YAAY;EACb;CACF;AAQD,MAAa,kBAAiD,EAC5D,MACA,UACA,yBACI;CACJ,MAAM,CAAC,UAAU,mCAAwB,MAAM;CAC/C,MAAM,CAAC,aAAa,sCAA2B,MAAM;CAErD,MAAM,wCAEF,MAAM,QACH,SACC,EAAE,KAAK,SAAS,mBAAmB,SAAS,CAAC,oBAChD,EACH,CAAC,mBAAmB,CACrB;CAGD,MAAM,cAAc,MAAM,MAAM,MAAM,EAAE,SAAS,KAAK,IAAI,MAAM;CAEhE,MAAM,qBAAqB,YAA+B;EACxD,MAAM,eAAe,MAAM,MACxB,MAAM,EAAE,SAAU,QAAQ,MAC5B;AACD,MAAI,aACF,YAAW,aAAa,KAAK;;AAIjC,QACE,4CAACC,sBAAK;EAAK,eAAe,EAAE,WAAW,YAAY,KAAK;aACtD,2CAACA,sBAAK;GAAQ;aACZ,2CAACC;IACC,SAAQ;IACR,MAAK;IACL,QAAO;IACP,OAAM;IACN,QAAQ;KAAE,iBAAiB;KAAW,YAAY,EAAE,SAAS,GAAG;KAAE;IAClE,QAAQ;KAAE,SAAS;KAAQ,WAAW;KAAQ;IAC9C,eAAe;KAAE,SAAS;KAAQ,WAAW;KAAQ;IACrD,eAAY;IACZ,IAAG;IACH,KAAI;cAEJ,2CAAC;KACC,MAAM,CAAC,YAAY;KACnB,eAAe,YAAY,eAAe,QAAQ,KAAK;KACvD,SAAQ;KACR,WAAW;KACX,YAAY;eAEZ,4CAAC;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAO;iBAChE,2CAACC;OAAK,SAAS;iBAAI,YAAY;QAAY,EAC3C,2CAACA;OACC,SAAS;OACT,OAAM;OACN,WAAU;OACV,SAAS;OACT,YAAW;iBAEX,2CAACC,oCAAmB;QACf;OACF;MACC;KACH;IACI,EACf,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,UAAS;aACrB,2CAACA,sBAAK;IAAe,OAAO;IAAM,eAAe;cAC9C,aAAa,KAAK,SACjB,4CAACA,sBAAK;KAEJ,OAAO,KAAK;KACZ,eAAa,KAAK;KAClB,QAAO;;MAEP,2CAACA,sBAAK,kBAAgB;MACtB,2CAACE;OAAK,SAAS;OAAG,IAAG;iBAClB,KAAK;QACD;MACN,KAAK;;OATD,KAAK,KAUK,CACjB;KACkB;IACT,GACC,GACX;GACC;;;;;ACnIhB,IAAY,8CAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;ACAF,MAAa,iBAA+B,EAAE;;;;ACD9C,IAAM,eAAN,MAAyC;CACvC,KAAa;AACX,SAAO;;CAGT,OAAe;AACb,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,WAAqB;AACnB,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,WAAyB;AACvB,SAAO;;CAGT,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,uBAAuB;;CAGzC,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,UAAgB;AACd,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,cAAoB;AAClB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,cAAoB;AAClB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,iBAAuB;AACrB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,qBAA2B;AACzB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,kBAAwB;AACtB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,WAAiB;AACf,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,aAAmB;AACjB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,kBAAwB;AACtB,QAAM,IAAI,MAAM,0BAA0B;;CAG5C,QAAoB;AAClB,SAAO;;;AAIX,MAAa,YAAwB,IAAI,cAAc;;;;AC5GvD,IAAa,aAAb,MAAa,WAAiC;CAC5C,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,WAAyB,EAAE,EAC3B,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,YAAY;AAEjB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,SAAS,MAA0B;AACjC,OAAK,MAAM,QAAQ,KAAK,UACtB,KAAI,KAAK,MAAM,KAAK,KAClB,QAAO;AAGX,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,KAAK;;CAGd,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,YAAY,MAAwB;AAClC,OAAK,UAAU,KAAK,KAAK;;CAG3B,eAAe,MAAoB;EACjC,MAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,EAAE,MAAM,KAAK,KAAK;AAChE,MAAI,SAAS,EACX,MAAK,UAAU,OAAO,OAAO,EAAE;;CAInC,mBAAmB,IAAkB;EACnC,MAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,EAAE,IAAI,KAAK,GAAG;AAC5D,MAAI,SAAS,EACX,MAAK,UAAU,OAAO,OAAO,EAAE;;CAInC,gBAAgB,MAAc,MAAwB;EACpD,MAAM,QAAQ,KAAK,UAAU,WAAW,MAAM,EAAE,MAAM,KAAK,KAAK;AAChE,MAAI,SAAS,EACX,MAAK,UAAU,SAAS;;CAI5B,WAAiB;CAIjB,aAAmB;CAInB,kBAAwB;CAIxB,YAAY,UAA8B;AACxC,OAAK,YAAY;;CAGnB,QAAoB;EAClB,MAAM,iBAAiB,KAAK,UAAU,KAAK,UAAU,MAAM,OAAO,CAAC;AACnE,SAAO,IAAI,WAAW,KAAK,KAAK,KAAK,OAAO,gBAAgB,EAC1D,GAAG,KAAK,WACT,CAAC;;;;;;ACnJN,IAAa,YAAb,MAAa,UAAgC;CAC3C,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,OACA,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,4BAA4B;AAE9C,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,YAAY;AAEjB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO,KAAK;;CAGd,aAAoC;AAClC,SAAO,CAAC,KAAK,OAAO;;CAGtB,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,uBAAuB;;CAGzC,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,SAAS,MAAwB;AAC/B,OAAK,SAAS;;CAGhB,aAAmB;CAInB,kBAAwB;CAIxB,QAAmB;AACjB,SAAO,IAAI,UAAU,KAAK,KAAK,KAAK,OAAO,KAAK,OAAO,OAAO,EAAE,EAC9D,GAAG,KAAK,WACT,CAAC;;;;;;AC5GN,IAAa,aAAb,MAAa,WAAiC;CAC5C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,UAA6B,EAAE,EAC/B,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,cAAc,QAAQ;AAC3B,OAAK,UAAU,QAAQ;AACvB,OAAK,oBAAoB,QAAQ;AACjC,OAAK,cAAc,QAAQ;AAC3B,OAAK,WAAW,QAAQ;AAExB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,eAAmC;AACjC,SAAO,KAAK;;CAGd,aAAiC;AAC/B,SAAO,KAAK;;CAGd,SAAmC;AACjC,SAAO,KAAK;;CAGd,mBAAiD;AAC/C,SAAO,KAAK;;CAGd,aAAmC;AACjC,SAAO,KAAK;;CAGd,UAA+B;AAC7B,SAAO,KAAK;;CAGd,aAAsB;AACpB,SAAO,KAAK,aAAa;;CAG3B,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,gBAAgB,OAAiC;AAC/C,OAAK,gBAAgB;;CAGvB,cAAc,OAAiC;AAC7C,OAAK,cAAc;;CAGrB,UAAU,OAAuC;AAC/C,OAAK,UAAU;;CAGjB,oBAAoB,OAA2C;AAC7D,OAAK,oBAAoB;;CAG3B,cAAc,QAAoC;AAChD,OAAK,cAAc;;CAGrB,WAAW,SAAoC;AAC7C,OAAK,WAAW;;CAGlB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,QAAoB;AAClB,SAAO,IAAI,WACT,KAAK,KACL,KAAK,OACL;GACE,cAAc,KAAK;GACnB,YAAY,KAAK;GACjB,QAAQ,KAAK;GACb,kBAAkB,KAAK;GACvB,YAAY,KAAK,cAAc,CAAC,GAAG,KAAK,YAAY,GAAG;GACvD,SAAS,KAAK;GACf,EACD,EAAE,GAAG,KAAK,WAAW,CACtB;;;;;;AC9LL,IAAa,aAAb,MAAa,WAAiC;CAC5C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,UAA6B,EAAE,EAC/B,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,6BAA6B;AAE/C,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,WAAW,QAAQ;AAExB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,eAAmC;AACjC,SAAO,KAAK;;CAGd,UAA+B;AAC7B,SAAO,KAAK;;CAGd,aAAsB;AACpB,SAAO,KAAK,aAAa;;CAG3B,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,wBAAwB;;CAG1C,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,gBAAgB,OAAiC;AAC/C,OAAK,gBAAgB;;CAGvB,WAAW,SAAoC;AAC7C,OAAK,WAAW;;CAGlB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,QAAoB;AAClB,SAAO,IAAI,WACT,KAAK,KACL,KAAK,OACL;GACE,cAAc,KAAK;GACnB,SAAS,KAAK;GACf,EACD,EAAE,GAAG,KAAK,WAAW,CACtB;;;;;;ACxIL,IAAa,cAAb,MAAa,YAAkC;CAC7C,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,UAA8B,EAAE,EAChC,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,8BAA8B;AAEhD,OAAK,QAAQ;AACb,OAAK,YAAY;AACjB,OAAK,gBAAgB,QAAQ;AAC7B,OAAK,WAAW,QAAQ;AAExB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,eAAoC;AAClC,SAAO,KAAK;;CAGd,UAA+B;AAC7B,SAAO,KAAK;;CAGd,aAAsB;AACpB,SAAO,KAAK,aAAa;;CAG3B,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,MAAc;AACZ,QAAM,IAAI,MAAM,yBAAyB;;CAG3C,aAAwB;CAIxB,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,gBAAgB,OAAkC;AAChD,OAAK,gBAAgB;;CAGvB,WAAW,SAAoC;AAC7C,OAAK,WAAW;;CAGlB,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,QAAqB;AACnB,SAAO,IAAI,YACT,KAAK,KACL,KAAK,OACL;GACE,cAAc,KAAK;GACnB,SAAS,KAAK;GACf,EACD,EAAE,GAAG,KAAK,WAAW,CACtB;;;;;;AC9IL,IAAa,UAAb,MAAa,QAA8B;CACzC,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YACE,AAAiB,KACjB,MACA,KACA,WAAyB,gBACzB;EAJiB;AAKjB,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,0BAA0B;AAE5C,MAAI,CAAC,IACH,OAAM,IAAI,MAAM,uBAAuB;AAEzC,OAAK,QAAQ;AACb,OAAK,OAAO;AACZ,OAAK,YAAY;AAEjB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,KAAa;AACX,SAAO,KAAK;;CAGd,OAAe;AACb,SAAO,KAAK;;CAGd,WAAqB;AACnB,SAAO,SAAS;;CAGlB,WAAyB;AACvB,SAAO,KAAK;;CAGd,MAAc;AACZ,SAAO,KAAK;;CAGd,UAAqB;CAIrB,aAAsB;AACpB,SAAO;;CAGT,eAA0B;CAI1B,aAAwB;CAIxB,WAAuB;AACrB,SAAO;;CAGT,QAAoB;AAClB,SAAO;;CAGT,aAAoC;AAClC,SAAO,EAAE;;CAGX,WAAoB;AAClB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,cAAuB;AACrB,SAAO;;CAGT,QAAiB;AACf,SAAO;;CAGT,SAAkB;AAChB,SAAO;;CAGT,QAAQ,MAAoB;AAC1B,OAAK,QAAQ;;CAGf,YAAY,MAA0B;AACpC,OAAK,YAAY;;CAGnB,OAAO,KAAmB;AACxB,OAAK,OAAO;;CAGd,cAAoB;CAIpB,iBAAuB;CAIvB,qBAA2B;CAI3B,kBAAwB;CAIxB,WAAiB;CAIjB,aAAmB;CAInB,kBAAwB;CAIxB,QAAiB;AACf,SAAO,IAAI,QAAQ,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,EAAE,GAAG,KAAK,WAAW,CAAC;;;;;;AC1H9E,IAAa,cAAb,MAAyB;CACvB,OAAO,OAAO,MAAc,SAAgD;EAC1E,MAAM,OAAO,IAAI,+BAAmB,EAAE,KAAK;AAC3C,MAAI,SAAS,eAAe,OAC1B,MAAK,cAAc,QAAQ,WAAW;AAExC,MAAI,SAAS,qBAAqB,OAChC,MAAK,oBAAoB,QAAQ,iBAAiB;AAEpD,SAAO;;CAGT,OAAO,OAAO,MAA0B;AACtC,SAAO,IAAI,+BAAmB,EAAE,KAAK;;CAGvC,OAAO,QAAQ,MAA2B;AACxC,SAAO,IAAI,gCAAoB,EAAE,KAAK;;CAGxC,OAAO,OAAO,MAAc,WAAyB,EAAE,EAAc;AACnE,SAAO,IAAI,+BAAmB,EAAE,MAAM,SAAS;;CAGjD,OAAO,MAAM,MAAc,OAA8B;AACvD,SAAO,IAAI,8BAAkB,EAAE,MAAM,MAAM;;CAG7C,OAAO,IAAI,MAAc,SAAkC;AACzD,SAAO,IAAI,4BAAgB,EAAE,MAAM,QAAQ,KAAK;;;;;;AC7CpD,IAAa,kBAAb,MAAoD;CAClD,YAAY,AAAiB,MAAc;EAAd;;CAE7B,aAAsB;AACpB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,eAAuB;AACrB,SAAO,KAAK;;CAGd,OAAO,OAA6B;AAClC,SAAO,MAAM,YAAY,IAAI,MAAM,cAAc,KAAK,KAAK;;;AAI/D,IAAa,eAAb,MAAiD;CAC/C,aAAsB;AACpB,SAAO;;CAGT,UAAmB;AACjB,SAAO;;CAGT,eAAuB;AACrB,QAAM,IAAI,MAAM,qCAAqC;;CAGvD,OAAO,OAA6B;AAClC,SAAO,MAAM,SAAS;;;;;;ACjC1B,IAAM,WAAN,MAAM,SAAyB;CAC7B,YAAY,AAAiB,MAA8B;EAA9B;;CAE7B,WAAmC;AACjC,SAAO,KAAK;;CAGd,gBAAwB;AACtB,SAAO,KAAK,KACT,KAAK,QACJ,IAAI,YAAY,GAAG,eAAe,IAAI,cAAc,KAAK,SAC1D,CACA,KAAK,GAAG;;CAGb,WAAmB;EACjB,MAAM,QAAkB,EAAE;AAE1B,OAAK,MAAM,OAAO,KAAK,KACrB,KAAI,IAAI,YAAY,CAClB,OAAM,KAAK,IAAI,cAAc,CAAC;WACrB,IAAI,SAAS,IAAI,MAAM,SAAS,EACzC,OAAM,MAAM,SAAS,MAAM;AAI/B,SAAO,MAAM,KAAK,IAAI;;CAGxB,SAAe;AACb,MAAI,KAAK,KAAK,UAAU,EACtB,QAAO;AAET,SAAO,IAAI,SAAS,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;;CAG7C,MAAM,MAAoB;AACxB,SAAO,IAAI,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI,gBAAgB,KAAK,CAAC,CAAC;;CAGhE,aAAmB;AACjB,SAAO,IAAI,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC;;CAGzD,OAAO,OAAsB;EAC3B,MAAM,YAAY,MAAM,UAAU;AAClC,MAAI,KAAK,KAAK,WAAW,UAAU,OACjC,QAAO;AAET,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK;GACzC,MAAM,IAAI,KAAK,KAAK;GACpB,MAAM,IAAI,UAAU;AACpB,OAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAC1B,QAAO;;AAGX,SAAO;;CAGT,UAAmB;AACjB,SAAO,KAAK,KAAK,WAAW;;CAG9B,SAAiB;AACf,SAAO,KAAK,KAAK;;CAGnB,UAAU,QAAuB;EAC/B,MAAM,aAAa,OAAO,UAAU;AACpC,MAAI,KAAK,KAAK,UAAU,WAAW,OACjC,QAAO;AAET,OAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;GAC1C,MAAM,IAAI,KAAK,KAAK;GACpB,MAAM,IAAI,WAAW;AACrB,OAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAC1B,QAAO;;AAGX,SAAO;;;AAIX,MAAa,aAAmB,IAAI,SAAS,EAAE,CAAC;AAEhD,SAAgB,WAAW,UAAwC;AACjE,QAAO,SAAS,WAAW,IAAI,aAAa,IAAI,SAAS,SAAS;;;;;ACrFpE,SAAgB,sBAAsB,SAAgC;AACpE,KAAI,YAAY,MAAM,YAAY,IAChC,QAAO,EAAE;CAGX,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ;CAChD,MAAM,WAA0B,EAAE;CAElC,IAAI,IAAI;AACR,QAAO,IAAI,MAAM,QAAQ;EACvB,MAAM,OAAO,MAAM;AACnB,MAAI,SAAS,aACX,KAAI,IAAI,IAAI,MAAM,QAAQ;GACxB,MAAM,OAAO,MAAM,IAAI;AACvB,OAAI,SAAS,OACX,UAAS,KAAK,IAAI,gBAAgB,KAAK,CAAC;AAE1C,QAAK;QAEL,MAAK;WAEE,SAAS,SAAS;AAC3B,YAAS,KAAK,IAAI,cAAc,CAAC;AACjC,QAAK;QAEL,OAAM,IAAI,MAAM,yBAAyB,KAAK,WAAW,UAAU;;AAIvE,QAAO;;AAGT,SAAgB,kBAAkB,SAAuB;AACvD,QAAO,WAAW,sBAAsB,QAAQ,CAAC;;AAGnD,SAAgB,wBAAwB,SAAyB;AAC/D,QAAO,kBAAkB,QAAQ,CAAC,UAAU;;;;;ACrC9C,IAAa,qBAAb,MAA6D;CAC3D,YAAY,AAAiB,QAAgB;EAAhB;AAC3B,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,0CAA0C;;CAI9D,eAAuB;AACrB,SAAO,KAAK;;;;;;ACZhB,IAAa,eAAb,cAAkC,MAAM;CACtC,YACE,SACA,AAAiB,QACjB,AAAiB,SACjB;AACA,QAAM,QAAQ;EAHG;EACA;AAGjB,OAAK,OAAO;;CAGd,gBAAwB;AACtB,SAAO,KAAK;;CAGd,eAAmC;AACjC,SAAO,KAAK;;;;;;ACXhB,MAAM,uBAAuB;AAE7B,IAAa,eAAb,MAA0B;CACxB,YACE,AAAiB,UACjB,AAAiB,cACjB;EAFiB;EACA;;CAGnB,UAAuB;EACrB,IAAI;AACJ,MAAI;AAEF,6CADiC,KAAK,aAAa,CACjC;UACZ;AACN,UAAO;;AAGT,SAAO,KAAK,UAAU,KAAK,KAAK,SAAS;;CAG3C,AAAQ,UAAU,KAAc,MAAyB;AACvD,UAAQ,IAAI,MAAZ;GACE,KAAK,aACH,QAAO,KAAK,MAAM,IAAI,KAAK;GAE7B,KAAK,oBAAoB;IACvB,MAAM,aAAa,KAAK,UAAU,IAAI,QAAQ,KAAK;AACnD,QAAI,CAAC,WACH,QAAO;AAET,WAAO,WAAW,MAAM,IAAI,SAAS;;GAGvC,KAAK;GACL,KAAK,sBAAsB;IACzB,MAAM,aAAa,KAAK,UAAU,IAAI,QAAQ,KAAK;AACnD,QAAI,CAAC,WACH,QAAO;AAET,WAAO,WAAW,YAAY;;GAGhC,KAAK,eACH,QAAO,KAAK,0BAA0B,MAAM,IAAI,KAAK;GAEvD,KAAK,WACH,QAAO,KAAK,gBAAgB,IAAI,KAAK;GAEvC,QACE,QAAO;;;CAIb,AAAQ,0BAA0B,MAAY,MAA2B;EACvE,MAAM,QAAQ,KAAK,MAAM,IAAI;EAC7B,IAAI,SAAS;AAEb,OAAK,MAAM,QAAQ,MACjB,KAAI,SAAS,MAAM;AACjB,OAAI,OAAO,SAAS,CAClB,QAAO;AAET,YAAS,OAAO,QAAQ;aACf,SAAS,IAClB;WACS,KACT,UAAS,OAAO,MAAM,KAAK;AAI/B,SAAO;;CAGT,AAAQ,gBAAgB,UAA+B;EACrD,MAAM,OAAO,SAAS,WAAW,IAAI,GAAG,SAAS,MAAM,EAAE,GAAG;AAC5D,MAAI,CAAC,KACH,QAAO;AAGT,MAAI;AACF,UAAO,KAAK,iBAAiB,KAAK;UAC5B;AACN,UAAO;;;CAIX,AAAQ,iBAAiB,aAA2B;EAClD,MAAM,QAAQ,YAAY,MAAM,IAAI;EACpC,IAAI,SAAe;AAEnB,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,CAAC,KACH,OAAM,IAAI,MAAM,8BAA8B;GAGhD,MAAM,QAAQ,qBAAqB,KAAK,KAAK;AAC7C,OAAI,QAAQ,GACV,UAAS,OAAO,MAAM,MAAM,GAAG,CAAC,YAAY;OAE5C,UAAS,OAAO,MAAM,KAAK;;AAI/B,SAAO;;;;;;AClGX,IAAa,gBAAb,MAA8C;CAC5C,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,MAAgB,eAAuB,YAAoB;EACrE,MAAM,kDAA2B,WAAW;AAC5C,OAAK,UAAU,YAAY;EAE3B,MAAM,cAAc,KAAK,OAAO,cAAc;AAC9C,MAAI,YAAY,SAAS,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,cAChD,OAAM,IAAI,aAAa,kCAAkC,cAAc;EAGzE,MAAM,OAA4B,EAAE;EACpC,MAAM,kCAAkB,IAAI,KAAqB;AAEjD,OAAK,MAAM,WAAW,YAAY,cAAc;GAC9C,MAAM,eAAe,KAAK,sBACxB,MACA,aACA,QACD;AACD,OAAI,CAAC,aACH,OAAM,IAAI,aACR,sCAAsC,WACtC,eACA,2BACD;AAEH,OAAI,iBAAiB,cACnB,OAAM,IAAI,aACR,mCACA,eACA,0BACD;AAEH,QAAK,KAAK,IAAI,mBAAmB,aAAa,CAAC;AAC/C,mBAAgB,IAAI,SAAS,aAAa;;AAG5C,OAAK,OAAO;AACZ,OAAK,kBAAkB;;CAGzB,UAAkB;AAChB,SAAO;;CAGT,MAAe;AACb,SAAO,KAAK;;CAGd,eAA6C;AAC3C,SAAO,KAAK;;CAGd,oBAAoB,SAAgC;AAClD,SAAO,KAAK,gBAAgB,IAAI,QAAQ,IAAI;;CAG9C,WAA8B;AAC5B,SAAO,MAAM,KAAK,KAAK,gBAAgB,MAAM,CAAC;;CAGhD,AAAQ,sBACN,MACA,aACA,SACe;EAGf,MAAM,aADe,IAAI,aADR,KAAK,mBAAmB,YAAY,EACL,QAAQ,CACxB,SAAS;AAEzC,MAAI,CAAC,WACH,QAAO;EAGT,MAAM,aAAa,KAAK,OAAO,WAAW;AAC1C,MAAI,WAAW,QAAQ,CACrB,QAAO;AAGT,SAAO,WAAW,IAAI;;CAGxB,AAAQ,mBAAmB,aAAyB;EAClD,IAAI,WAAW;AAEf,SAAO,CAAC,SAAS,SAAS,EAAE;GAC1B,MAAM,OAAO,SAAS,UAAU;GAChC,MAAM,UAAU,KAAK,KAAK,SAAS;AACnC,cAAW,SAAS,QAAQ;AAC5B,OAAI,CAAC,SAAS,SAAS,CACrB;;AAIJ,SAAO;;;;;;ACzGX,IAAa,sBAAb,MAAiC;CAC/B,AAAO,uBAAuB,UAAgB,QAAsB;EAClE,MAAM,eAAe,SAAS,QAAQ,CAAC,UAAU;EACjD,MAAM,aAAa,OAAO,UAAU;EAEpC,MAAM,eAAe,KAAK,uBAAuB,cAAc,WAAW;EAC1E,MAAM,UAAU,aAAa,SAAS;EAEtC,MAAM,QAAQ,KAAK,4BACjB,SACA,YACA,aACD;AAED,SAAO,KAAK,6BAA6B,OAAO,WAAW;;CAG7D,AAAQ,uBACN,cACA,YACQ;EACR,MAAM,SAAS,KAAK,IAAI,aAAa,QAAQ,WAAW,OAAO;EAC/D,IAAI,kBAAkB;AAEtB,OAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,UAAU,aAAa;GAC7B,MAAM,QAAQ,WAAW;AAEzB,OAAI,CAAC,WAAW,CAAC,MACf;AAGF,OAAI,QAAQ,SAAS,IAAI,MAAM,SAAS,CACtC;YAEA,QAAQ,YAAY,IACpB,MAAM,YAAY,IAClB,QAAQ,cAAc,KAAK,MAAM,cAAc,CAE/C;OAEA;;AAIJ,SAAO;;CAGT,AAAQ,4BACN,SACA,YACA,YACU;EACV,MAAM,QAAkB,EAAE;AAE1B,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,IAC3B,OAAM,KAAK,KAAK;AAGlB,OAAK,IAAI,IAAI,YAAY,IAAI,WAAW,QAAQ,KAAK;GACnD,MAAM,MAAM,WAAW;AACvB,OAAI,KACF;QAAI,IAAI,YAAY,CAClB,OAAM,KAAK,IAAI,cAAc,CAAC;aACrB,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;KAC5C,MAAM,WAAW,MAAM,GAAG,GAAG;AAC7B,SAAI,YAAY,aAAa,KAC3B,OAAM,MAAM,SAAS,KAAK,WAAW;;;;AAM7C,SAAO;;CAGT,AAAQ,6BACN,OACA,YACQ;AACR,MAAI,MAAM,WAAW,GAAG;GACtB,MAAM,UAAU,WAAW,GAAG,GAAG;AACjC,OAAI,SAAS,YAAY,CACvB,QAAO,QAAQ,cAAc;AAE/B,UAAO;;AAGT,MAAI,MAAM,OAAO,KACf,QAAO,MAAM,KAAK,IAAI;AAGxB,SAAO,MAAM,KAAK,IAAI;;;;;;ACvF1B,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,AAAiB,sBAAsB,IAAI,qBAAqB;CAEhE,YACE,AAAiB,MACjB,AAAiB,eACjB,AAAiB,SACjB;EAHiB;EACA;EACA;;CAGnB,OAAO,WACL,MACA,eACA,SACU;AAEV,SAAO;GACL,SAAS;GACT,YAHiB,IAAI,kBAAkB,MAAM,eAAe,QAAQ,CAG7C,WAAW;GACnC;;CAGH,YAAoB;EAClB,MAAM,eAAe,KAAK,uBAAuB;AAEjD,wFADuC,KAAK,QAAQ,KAAK,EAAE,aAAa,CACzC;;CAGjC,AAAQ,wBAAgD;EACtD,MAAM,eAAuC,EAAE;EAC/C,MAAM,cAAc,KAAK,KAAK,OAAO,KAAK,cAAc;AAExD,OAAK,MAAM,WAAW,KAAK,QAAQ,UAAU,EAAE;GAC7C,MAAM,SAAS,KAAK,QAAQ,oBAAoB,QAAQ;AACxD,OAAI,CAAC,OACH;AAIF,OADmB,KAAK,KAAK,SAAS,OAAO,CAC9B,QAAQ,CACrB,OAAM,IAAI,aACR,mDACA,KAAK,eACL,kBAAkB,SACnB;GAGH,MAAM,aAAa,KAAK,KAAK,OAAO,OAAO;GAC3C,MAAM,UAAU,KAAK,oBAAoB,uBACvC,aACA,WACD;AAED,OAAI,KAAK,iBAAiB,SAAS,QAAQ,CACzC,cAAa,WAAW;;AAI5B,SAAO;;CAGT,AAAQ,iBAAiB,SAAiB,SAA0B;AAClE,MAAI,YAAY,QACd,QAAO;AAMT,SAH0B,KAAK,uBAAuB,QAAQ,KACpC,KAAK,uBAAuB,QAAQ;;CAKhE,AAAQ,uBAAuB,MAAsB;AACnD,SAAO,KAAK,WAAW,YAAY,MAAM;;;;;;ACtE7C,IAAa,yBAAb,MAAoC;CAClC,AAAiB,gBAAgBG,gBAAW,KAA0B;CACtE,AAAiB,mBAAmBA,gBAAW,KAAsB;CAErE,cAAc;AACZ,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,gBAAgB,eAAuB,SAAwB;AAC7D,OAAK,kBAAkB,cAAc;AAErC,OAAK,iBAAiB,IAAI,eAAe,QAAQ;AAEjD,OAAK,MAAM,OAAO,QAAQ,cAAc,EAAE;GACxC,MAAM,WAAW,IAAI,cAAc;GACnC,IAAI,aAAa,KAAK,cAAc,IAAI,SAAS;AACjD,OAAI,CAAC,YAAY;AACf,iBAAaA,gBAAW,KAAa;AACrC,SAAK,cAAc,IAAI,UAAU,WAAW;;AAE9C,cAAW,IAAI,cAAc;;;CAIjC,kBAAkB,eAA6B;AAC7C,OAAK,iBAAiB,OAAO,cAAc;AAE3C,OAAK,MAAM,CAAC,UAAU,eAAe,KAAK,eAAe;AACvD,cAAW,OAAO,cAAc;AAChC,OAAI,WAAW,SAAS,EACtB,MAAK,cAAc,OAAO,SAAS;;;CAKzC,cAAc,QAAmC;EAC/C,MAAM,aAAa,KAAK,cAAc,IAAI,OAAO;AACjD,SAAO,aAAa,MAAM,KAAK,WAAW,GAAG,EAAE;;CAGjD,WAAW,QAAgC;AACzC,SAAO,KAAK,iBAAiB,IAAI,OAAO,IAAI;;CAG9C,QAAc;AACZ,OAAK,cAAc,OAAO;AAC1B,OAAK,iBAAiB,OAAO;;CAG/B,eAAe,UAA4D;AACzE,OAAK,MAAM,CAAC,QAAQ,YAAY,KAAK,iBACnC,UAAS,QAAQ,QAAQ;;;;;;ACvD/B,IAAa,gBAAb,MAA2B;CACzB,AAAiB,4BAAY,IAAI,KAAyB;CAC1D,AAAiB,4BAAY,IAAI,KAAmB;CAEpD,AAAO,QAAQ,UAA4B;AACzC,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,aAAa,UAAU,WAAW;;CAGzC,AAAO,QAAQ,IAAwB;AACrC,SAAO,KAAK,UAAU,IAAI,GAAG,IAAI;;CAGnC,AAAO,QAAQ,IAAkB;AAC/B,SAAO,KAAK,UAAU,IAAI,GAAG,IAAI;;CAGnC,AAAO,aAAqB;AAC1B,SAAO,KAAK,UAAU;;CAGxB,AAAO,UAAoC;AACzC,SAAO,KAAK,UAAU,MAAM;;CAG9B,AAAQ,aAAa,MAAkB,MAAkB;AACvD,MAAI,KAAK,QAAQ,CACf;AAGF,OAAK,UAAU,IAAI,KAAK,IAAI,EAAE,KAAK;AACnC,OAAK,UAAU,IAAI,KAAK,IAAI,EAAE,KAAK;AAEnC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,aAAa,OAAO,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC;WAE3C,KAAK,SAAS,EAAE;GACzB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,aAAa,OAAO,KAAK,YAAY,CAAC;;;;;;;AC1CnD,IAAa,cAAb,MAAyB;CACvB,AAAO,UACL,UACA,MACA,SACM;AACN,MAAI,KAAK,SAAS,CAChB,OAAM,IAAI,MAAM,2BAA2B;AAE7C,OAAK,aAAa,UAAU,KAAK,UAAU,EAAE,GAAG,QAAQ;;CAG1D,AAAO,aAAa,UAAsB,MAAkB;AAC1D,MAAI,KAAK,SAAS,CAChB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,OAAK,qBAAqB,UAAU,KAAK,UAAU,EAAE,EAAE;;CAGzD,AAAO,qBACL,SACA,UACA,OACM;EACN,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH;EAGF,MAAM,gBAAgB,UAAU,SAAS,SAAS;AAElD,MAAI,QAAQ,YAAY,CACtB,MAAK,sBACH,SACA,QAAQ,cAAc,EACtB,UACA,OACA,cACD;WACQ,QAAQ,SAAS,CAC1B,MAAK,mBAAmB,SAAS,UAAU,OAAO,cAAc;;CAIpE,AAAQ,sBACN,SACA,WACA,UACA,OACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,eAAe,UAAU;AACjC;;EAGF,MAAM,gBAAgB,QAAQ,SAAS,UAAU;AACjD,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,qBAAqB,eAAe,UAAU,QAAQ,EAAE;;CAIjE,AAAQ,mBACN,SACA,UACA,OACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,SAAS,UAAU;AAC3B;;EAGF,MAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,qBAAqB,eAAe,UAAU,QAAQ,EAAE;;CAIjE,AAAQ,aACN,SACA,UACA,OACA,SACM;AACN,MAAI,SAAS,SAAS,OACpB;EAGF,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH;EAGF,MAAM,gBAAgB,UAAU,SAAS,SAAS;AAElD,MAAI,QAAQ,YAAY,CACtB,MAAK,sBACH,SACA,QAAQ,cAAc,EACtB,UACA,OACA,SACA,cACD;WACQ,QAAQ,SAAS,CAC1B,MAAK,mBAAmB,SAAS,UAAU,OAAO,SAAS,cAAc;;CAI7E,AAAQ,sBACN,SACA,WACA,UACA,OACA,SACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,QAAQ,UAAU;AAE1B,OADsB,QAAQ,SAAS,UAAU,CAC/B,QAAQ,CACxB,SAAQ,YAAY,QAAQ;OAE5B,SAAQ,gBAAgB,WAAW,QAAQ;AAE7C;;EAGF,MAAM,gBAAgB,QAAQ,SAAS,UAAU;AACjD,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,aAAa,eAAe,UAAU,QAAQ,GAAG,QAAQ;;CAIlE,AAAQ,mBACN,SACA,UACA,OACA,SACA,eACM;AACN,MAAI,eAAe;AACjB,WAAQ,SAAS,QAAQ;AACzB;;EAGF,MAAM,gBAAgB,QAAQ,OAAO;AACrC,MAAI,CAAC,cAAc,QAAQ,CACzB,MAAK,aAAa,eAAe,UAAU,QAAQ,GAAG,QAAQ;;;;;;AC3IpE,IAAa,aAAb,MAAa,WAA+B;CAC1C,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAQ;CAER,YAAY,UAAsB;AAChC,OAAK,YAAY;AACjB,OAAK,YAAY,IAAI,eAAe;AACpC,OAAK,UAAU,IAAI,aAAa;AAChC,OAAK,eAAe,IAAI,wBAAwB;AAChD,OAAK,cAAc;AAEnB,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,AAAO,OAAmB;AACxB,SAAO,KAAK;;CAGd,AAAO,aAAqB;AAC1B,SAAO,KAAK,UAAU,YAAY;;CAGpC,AAAO,UAAoC;AACzC,SAAO,KAAK,UAAU,SAAS;;CAGjC,AAAO,SAAS,IAAwB;AACtC,SAAO,KAAK,UAAU,QAAQ,GAAG;;CAGnC,AAAO,OAAO,IAAkB;AAC9B,SAAO,KAAK,UAAU,QAAQ,GAAG;;CAGnC,AAAO,OAAO,MAAwB;AACpC,MAAI,KAAK,SAAS,CAChB,QAAO,KAAK;EAGd,IAAI,UAAsB,KAAK;AAC/B,OAAK,MAAM,WAAW,KAAK,UAAU,EAAE;AACrC,OAAI,QAAQ,YAAY,CACtB,WAAU,QAAQ,SAAS,QAAQ,cAAc,CAAC;OAElD,WAAU,QAAQ,OAAO;AAE3B,OAAI,QAAQ,QAAQ,CAClB,QAAO;;AAGX,SAAO;;CAGT,AAAO,YAAY,SAA2B;AAC5C,OAAK,YAAY;AACjB,OAAK,cAAc;;CAGrB,AAAO,UAAU,MAAY,MAAwB;AACnD,OAAK,QAAQ,UAAU,KAAK,WAAW,MAAM,KAAK;AAClD,OAAK,cAAc;;CAGrB,AAAO,aAAa,MAAkB;AACpC,OAAK,QAAQ,aAAa,KAAK,WAAW,KAAK;AAC/C,OAAK,cAAc;;CAGrB,AAAO,WAAW,IAAY,SAAuB;EACnD,MAAM,OAAO,KAAK,SAAS,GAAG;AAC9B,MAAI,KAAK,QAAQ,CACf;AAGF,OAAK,QAAQ,QAAQ;AACrB,OAAK,cAAc;;CAGrB,AAAO,WAAW,UAAkB,MAAwB;EAC1D,MAAM,SAAS,KAAK,SAAS,SAAS;AACtC,MAAI,OAAO,QAAQ,IAAI,CAAC,OAAO,UAAU,CACvC;AAEF,SAAO,YAAY,KAAK;AACxB,OAAK,cAAc;;CAGrB,AAAO,YAAY,YAAoB,UAA2B;AAChE,MAAI,eAAe,SACjB,QAAO;EAET,MAAM,WAAW,KAAK,SAAS,WAAW;EAC1C,MAAM,SAAS,KAAK,SAAS,SAAS;AACtC,MAAI,SAAS,QAAQ,IAAI,OAAO,QAAQ,CACtC,QAAO;AAET,MAAI,CAAC,OAAO,UAAU,CACpB,QAAO;EAET,MAAM,SAAS,KAAK,OAAO,SAAS;EACpC,MAAM,WAAW,KAAK,OAAO,WAAW;AACxC,MAAI,OAAO,OAAO,SAAS,IAAI,OAAO,UAAU,SAAS,CACvD,QAAO;AAET,MAAI,SAAS,QAAQ,CAAC,OAAO,OAAO,CAClC,QAAO;AAET,MAAI,KAAK,mBAAmB,UAAU,OAAO,CAC3C,QAAO;AAET,SAAO;;CAGT,AAAQ,mBAAmB,UAAgB,QAAuB;EAChE,MAAM,eAAe,SAAS,UAAU;EACxC,MAAM,aAAa,OAAO,UAAU;AAEpC,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,IAEvC,KADgB,aAAa,IAChB,SAAS,EAAE;AACtB,OAAI,CAAC,WAAW,IAAI,SAAS,CAC3B,QAAO;AAET,OAAI,KAAK,sBAAsB,cAAc,YAAY,EAAE,CACzD,QAAO;;AAIb,SAAO;;CAGT,AAAQ,sBACN,cACA,YACA,UACS;AACT,OAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;GACjC,MAAM,UAAU,aAAa;GAC7B,MAAM,QAAQ,WAAW;AACzB,OAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,OAAO,MAAM,CAC9C,QAAO;;AAGX,SAAO;;CAGT,AAAO,mBAAmB,QAAyB;AACjD,SAAO,KAAK,oBAAoB,KAAK,WAAW,OAAO;;CAGzD,AAAQ,oBAAoB,SAAqB,QAAyB;AACxE,MAAI,QAAQ,UAAU,IAAI,KAAK,YAAY,QAAQ,QAAQ,IAAI,CAAC,CAC9D,QAAO;AAGT,MAAI,QAAQ,UAAU,EACpB;QAAK,MAAM,SAAS,QAAQ,YAAY,CACtC,KAAI,KAAK,oBAAoB,OAAO,OAAO,CACzC,QAAO;;AAKb,MAAI,QAAQ,SAAS,EAAE;GACrB,MAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,oBAAoB,OAAO,OAAO,CAC5D,QAAO;;AAIX,SAAO;;CAGT,AAAO,SAAS,QAAgB,gBAA8B;EAC5D,MAAM,OAAO,KAAK,SAAS,OAAO;EAClC,MAAM,eAAe,KAAK,SAAS,eAAe;AAClD,MAAI,KAAK,QAAQ,IAAI,aAAa,QAAQ,IAAI,CAAC,aAAa,UAAU,CACpE;EAGF,MAAM,aAAa,KAAK,OAAO,OAAO;AACtC,MAAI,WAAW,SAAS,CACtB;AAGF,OAAK,QAAQ,qBAAqB,KAAK,WAAW,WAAW,UAAU,EAAE,EAAE;AAC3E,eAAa,YAAY,KAAK;AAC9B,OAAK,cAAc;;CAGrB,AAAO,gBAAgB,eAAuB,SAAwB;AAEpE,MADa,KAAK,SAAS,cAAc,CAChC,QAAQ,CACf;AAEF,OAAK,aAAa,gBAAgB,eAAe,QAAQ;;CAG3D,AAAO,kBAAkB,eAA6B;AACpD,OAAK,aAAa,kBAAkB,cAAc;;CAGpD,AAAO,qBAAqB,QAAoC;EAC9D,MAAM,SAA6B,EAAE;AACrC,OAAK,yBAAyB,QAAQ,wBAAQ,IAAI,KAAK,CAAC;AACxD,SAAO;;CAGT,AAAO,2BAA2B,QAAoC;EACpE,MAAM,SAA6B,EAAE;AACrC,OAAK,wBAAwB,QAAQ,wBAAQ,IAAI,KAAK,CAAC;AACvD,SAAO;;CAGT,AAAO,qBAAqB,QAAyB;AACnD,SAAO,KAAK,qBAAqB,OAAO,CAAC,SAAS;;CAGpD,AAAO,mBAAmB,QAAgC;AACxD,SAAO,KAAK,aAAa,WAAW,OAAO;;CAG7C,AAAO,oBAA0B;AAC/B,OAAK,aAAa,OAAO;;CAG3B,AAAO,eAAe,UAA0C;AAC9D,OAAK,aAAa,eAAe,SAAS;;CAG5C,AAAQ,eAAqB;AAC3B,OAAK,UAAU,QAAQ,KAAK,UAAU;;CAGxC,AAAO,QAAoB;EAEzB,MAAM,aAAa,IAAI,WADJ,KAAK,UAAU,OAAO,CACI;AAC7C,OAAK,cAAc,WAAW;AAC9B,SAAO;;CAGT,AAAQ,cAAc,YAA8B;AAClD,OAAK,aAAa,gBAAgB,WAAW;GAC3C,MAAM,aAAa,WAAW,SAAS,OAAO;GAC9C,MAAM,UAAU,WAAW,SAAS;AACpC,OAAI,CAAC,WAAW,QAAQ,IAAI,QAC1B,YAAW,gBAAgB,QAAQ,QAAQ;IAE7C;;CAGJ,AAAQ,yBACN,QACA,QACA,MACM;AACN,OAAK,wBAAwB,QAAQ,QAAQ,KAAK;AAClD,OAAK,uBAAuB,QAAQ,QAAQ,KAAK;;CAGnD,AAAQ,wBACN,QACA,QACA,MACM;EACN,MAAM,qBAAqB,KAAK,aAAa,cAAc,OAAO;AAElE,OAAK,MAAM,iBAAiB,oBAAoB;AAC9C,OAAI,KAAK,IAAI,cAAc,CACzB;AAEF,QAAK,IAAI,cAAc;GAEvB,MAAM,YAAY,KAAK,uBAAuB,cAAc;AAC5D,OAAI,UACF,QAAO,KAAK,UAAU;;;CAK5B,AAAQ,uBACN,eACyB;EACzB,MAAM,cAAc,KAAK,SAAS,cAAc;EAChD,MAAM,UAAU,KAAK,aAAa,WAAW,cAAc;AAE3D,MAAI,YAAY,QAAQ,IAAI,CAAC,QAC3B,QAAO;EAGT,MAAM,aAAa,IAAI,kBACrB,MACA,eACA,QACD,CAAC,WAAW;AAEb,SAAO;GACL;GACA,WAAW,YAAY,MAAM;GAC7B;GACD;;CAGH,AAAQ,uBACN,QACA,QACA,MACM;EACN,MAAM,OAAO,KAAK,SAAS,OAAO;AAClC,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,yBAAyB,MAAM,IAAI,EAAE,QAAQ,KAAK;AAI3D,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,yBAAyB,MAAM,IAAI,EAAE,QAAQ,KAAK;;;;;;;AC/U/D,IAAa,eAAb,MAA0B;CACxB,AAAiB,8BAA2C,IAAI,KAAK;CACrE,AAAiB,aAA+B,EAAE;CAElD,SAAS,YAAkC;AACzC,MAAI,KAAK,YAAY,IAAI,WAAW,KAAK,CACvC,OAAM,IAAI,MAAM,SAAS,WAAW,KAAK,yBAAyB;AAEpE,OAAK,YAAY,IAAI,WAAW,MAAM,WAAW;AACjD,OAAK,WAAW,KAAK,WAAW;;CAGlC,cAAc,MAA0C;AACtD,SAAO,KAAK,YAAY,IAAI,KAAK;;CAGnC,wBAAwB,QAAoD;AAC1E,OAAK,MAAM,cAAc,KAAK,WAC5B,KAAI,WAAW,SAAS,OAAO,CAC7B,QAAO;;CAMb,oBAA+C;AAC7C,SAAO,KAAK;;CAGd,WAA8B;AAC5B,SAAO,MAAM,KAAK,KAAK,YAAY,MAAM,CAAC;;;;;;ACzB9C,MAAa,yBAA2C;CACtD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,sBAAwC;CACnD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,qBAAuC;CAClD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,mBAAqC;CAChD,aAAa;CACb,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACd;;;;ACvBD,SAAS,eAAe,QAAoD;AAC1E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,mBAAiE;CAC5E,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACY;EACZ,MAAM,UAA6B,EAAE;AAErC,MAAI,OAAO,YAAY,OACrB,SAAQ,eAAe,OAAO;AAEhC,MAAI,OAAO,WACT,SAAQ,aAAa,OAAO;AAE9B,MAAI,OAAO,OACT,SAAQ,SAAS,OAAO;AAE1B,MAAI,OAAO,iBACT,SAAQ,mBAAmB,OAAO;AAEpC,MAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,EACtC,SAAQ,aAAa,OAAO;EAG9B,MAAM,OAAO,IAAI,WAAW,QAAQ,YAAY,EAAE,MAAM,QAAQ;AAChE,OAAK,YAAY,SAAS;AAE1B,MAAI,OAAO,cAAc,WACvB,SAAQ,kBAAkB,KAAK,IAAI,EAAE,OAAO,aAAa,WAAW;AAGtE,SAAO;;CAGT,UAAU,MAAkB,SAA6C;EACvE,MAAM,SAA2B;GAC/B,MAAM;GACN,SAAS,KAAK,cAAc,IAAI;GACjC;AAED,MAAI,KAAK,YAAY,CACnB,QAAO,aAAa,KAAK,YAAY;AAEvC,MAAI,KAAK,QAAQ,CACf,QAAO,SAAS,KAAK,QAAQ;AAE/B,MAAI,KAAK,kBAAkB,CACzB,QAAO,mBAAmB,KAAK,kBAAkB;EAEnD,MAAM,aAAa,KAAK,YAAY;AACpC,MAAI,cAAc,WAAW,SAAS,EACpC,QAAO,OAAO,CAAC,GAAG,WAAW;EAE/B,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,SAAS;AACX,UAAO,WAAW;AAClB,UAAO,eAAe,QAAQ,iBAAiB,KAAK,IAAI,EAAE,QAAQ;;AAGpE,SAAO;;CAGT,gBAAgB,QAAkC;AAChD,SAAO,aAAa,SAAS,OAAO,UAAU;;CAGhD,wBAAwB,UAA0B;AAChD,SAAO;;CAEV;;;;ACrFD,SAAS,eAAe,QAAoD;AAC1E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,mBAAiE;CAC5E,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACY;EACZ,MAAM,UAA6B,EAAE;AAErC,MAAI,OAAO,YAAY,OACrB,SAAQ,eAAe,OAAO;EAGhC,MAAM,OAAO,IAAI,WAAW,QAAQ,YAAY,EAAE,MAAM,QAAQ;AAChE,OAAK,YAAY,SAAS;AAE1B,MAAI,OAAO,cAAc,WACvB,SAAQ,kBAAkB,KAAK,IAAI,EAAE,OAAO,aAAa,WAAW;AAGtE,SAAO;;CAGT,UAAU,MAAkB,SAA6C;EACvE,MAAM,SAA2B;GAC/B,MAAM;GACN,SAAS,KAAK,cAAc,IAAI;GACjC;EAED,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,SAAS;AACX,UAAO,WAAW;AAClB,UAAO,eAAe,QAAQ,iBAAiB,KAAK,IAAI,EAAE,QAAQ;;AAGpE,SAAO;;CAGT,gBAAgB,QAAkC;AAChD,SAAO,aAAa,SAAS,OAAO,UAAU;;CAGhD,wBAAwB,UAAsC;AAC5D,MAAI,CAAC,SACH;EAEF,MAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,CAAC,OAAO,MAAM,IAAI,CACpB,QAAO;;CAIZ;;;;AC3DD,SAAS,gBAAgB,QAAqD;AAC5E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,oBACX;CACE,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACa;EACb,MAAM,UAA8B,EAAE;AAEtC,MAAI,OAAO,YAAY,OACrB,SAAQ,eAAe,OAAO;EAGhC,MAAM,OAAO,IAAI,YAAY,QAAQ,YAAY,EAAE,MAAM,QAAQ;AACjE,OAAK,YAAY,SAAS;AAE1B,MAAI,OAAO,cAAc,WACvB,SAAQ,kBAAkB,KAAK,IAAI,EAAE,OAAO,aAAa,WAAW;AAGtE,SAAO;;CAGT,UAAU,MAAmB,SAA8C;EACzE,MAAM,SAA4B;GAChC,MAAM;GACN,SAAS,KAAK,cAAc,IAAI;GACjC;EAED,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,SAAS;AACX,UAAO,WAAW;AAClB,UAAO,eAAe,QAAQ,iBAAiB,KAAK,IAAI,EAAE,QAAQ;;AAGpE,SAAO;;CAGT,gBAAgB,QAAoC;AAClD,SAAO,aAAa,SAAS,OAAO,UAAU;;CAGhD,wBAAwB,UAAuC;AAC7D,MAAI,CAAC,SACH;EAEF,MAAM,QAAQ,SAAS,aAAa;AACpC,MAAI,UAAU,OACZ,QAAO;AAET,MAAI,UAAU,QACZ,QAAO;;CAIZ;;;;ACpEH,SAAS,eAAe,QAAoD;AAC1E,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,mBAAiE;CAC5E,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACY;EACZ,MAAM,WAAyB,EAAE;EAEjC,MAAM,cAAc,OAAO,YAAY,OAAO,KAAK,OAAO,WAAW;AAErE,OAAK,MAAM,YAAY,aAAa;GAClC,MAAM,aAAa,OAAO,WAAW;AACrC,OAAI,WACF,UAAS,KAAK,QAAQ,UAAU,YAAY,SAAS,CAAC;;EAI1D,MAAM,OAAO,IAAI,WAAW,QAAQ,YAAY,EAAE,MAAM,SAAS;AACjE,OAAK,YAAY,SAAS;AAC1B,SAAO;;CAGT,UAAU,MAAkB,SAA6C;EACvE,MAAM,aAA6C,EAAE;EACrD,MAAM,WAAqB,EAAE;AAE7B,OAAK,MAAM,SAAS,KAAK,YAAY,EAAE;GACrC,MAAM,YAAY,MAAM,MAAM;AAC9B,cAAW,aAAa,QAAQ,UAAU,MAAM;AAChD,YAAS,KAAK,UAAU;;AAG1B,SAAO;GACL,MAAM;GACN;GACA;GACA,sBAAsB;GACvB;;CAGH,gBAAgB,SAAoD;AAClE,SAAO,EAAE;;CAGX,wBAAwB,WAA8B;CAGvD;;;;AC3DD,SAAS,cAAc,QAAmD;AACxE,QAAO,UAAU,UAAU,OAAO,SAAS;;AAG7C,MAAa,kBAA8D;CACzE,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACW;EACX,MAAM,QAAQ,QAAQ,UAAU,OAAO,OAAO,GAAG;EACjD,MAAM,OAAO,IAAI,UAAU,QAAQ,YAAY,EAAE,MAAM,MAAM;AAC7D,OAAK,YAAY,SAAS;AAC1B,SAAO;;CAGT,UAAU,MAAiB,SAA4C;EACrE,MAAM,QAAQ,KAAK,OAAO;AAE1B,SAAO;GACL,MAAM;GACN,OAAO,MAAM,QAAQ,GACjB;IAAE,MAAM;IAAU,SAAS;IAAI,GAC/B,QAAQ,UAAU,MAAM;GAC7B;;CAGH,gBAAgB,SAAqC;AACnD,SAAO,EAAE;;CAGX,wBAAwB,WAA8B;CAGvD;;;;ACzCD,SAAS,YAAY,QAAiD;AACpE,QAAO,UAAU;;AAGnB,MAAa,gBAAwD;CACnE,MAAM;CAEN,cAAc;CAEd,UAAU;CAEV,MACE,QACA,MACA,UACA,SACS;EACT,MAAM,OAAO,IAAI,QAAQ,QAAQ,YAAY,EAAE,MAAM,OAAO,KAAK;AACjE,OAAK,YAAY,SAAS;AAC1B,SAAO;;CAGT,UAAU,MAAe,UAA2C;EAClE,MAAM,SAAwB,EAC5B,MAAM,KAAK,KAAK,EACjB;EAED,MAAM,OAAO,KAAK,UAAU;AAC5B,MAAI,KAAK,MACP,QAAO,QAAQ,KAAK;AAEtB,MAAI,KAAK,YACP,QAAO,cAAc,KAAK;AAE5B,MAAI,KAAK,WACP,QAAO,aAAa,KAAK;AAG3B,SAAO;;CAGT,gBAAgB,SAA8B;AAC5C,SAAO;;CAGT,wBAAwB,WAA8B;CAGvD;;;;AC7BD,SAAgBC,0BAAsC;CACpD,MAAM,WAAW,IAAI,cAAc;AAEnC,UAAS,SAAS,cAAc;AAChC,UAAS,SAAS,iBAAiB;AACnC,UAAS,SAAS,gBAAgB;AAClC,UAAS,SAAS,iBAAiB;AACnC,UAAS,SAAS,iBAAiB;AACnC,UAAS,SAAS,kBAAkB;AAEpC,QAAO;;AAGT,MAAa,kBAAkBA,yBAAuB;;;;ACjCtD,IAAI,YAAY;AAEhB,SAAS,aAAqB;AAC5B;AACA,QAAO,QAAQ;;AAGjB,SAAgB,iBAAuB;AACrC,aAAY;;AAQd,IAAa,eAAb,MAA0B;CACxB,AAAQ,kBAAoC,EAAE;CAC9C,AAAiB;CAEjB,YAAY,WAAyB,iBAAiB;AACpD,OAAK,WAAW;;CAGlB,MAAM,QAAoC;AACxC,OAAK,kBAAkB,EAAE;AACzB,SAAO,KAAK,UAAU,QAAQ,GAAG;;CAGnC,kBAAkB,QAAwB,MAA0B;AAClE,OAAK,kBAAkB,EAAE;AACzB,SAAO,KAAK,UAAU,QAAQ,KAAK;;CAGrC,qBAAuC;AACrC,SAAO,KAAK;;CAGd,AAAQ,UAAU,QAAwB,MAA0B;EAClE,MAAM,WAAW,KAAK,gBAAgB,OAAO;EAC7C,MAAM,aAAa,KAAK,SAAS,wBAAwB,OAAO;AAEhE,MAAI,CAAC,WACH,OAAM,IAAI,MACR,wCAAwC,KAAK,UAAU,OAAO,GAC/D;EAGH,MAAM,UAAwB;GAC5B;GACA,YAAY,GAAG,MAAM,KAAK,UAAU,GAAG,EAAE;GACzC,oBAAoB,QAAQ,eAAe;AACzC,SAAK,gBAAgB,KAAK;KAAE;KAAQ;KAAY,CAAC;;GAEpD;AAED,SAAO,WAAW,MAAM,QAAQ,MAAM,UAAU,QAAQ;;CAG1D,AAAQ,gBAAgB,QAAsC;AAC5D,SAAO;GACL,OAAO,WAAW,SAAS,OAAO,QAAQ;GAC1C,aAAa,iBAAiB,SAAS,OAAO,cAAc;GAC5D,YAAY,gBAAgB,SAAS,OAAO,aAAa;GAC1D;;;;;;AC3DL,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAQ,OAAwB;CAChC,AAAQ,iCAA8B,IAAI,KAAK;CAE/C,YAAY,WAAyB,iBAAiB;AACpD,OAAK,WAAW;;CAGlB,kBACE,MACA,MACA,SACgB;AAChB,OAAK,OAAO;AACZ,OAAK,iBAAiB,SAAS,kCAAkB,IAAI,KAAK;AAC1D,MAAI;AACF,UAAO,KAAK,UAAU,KAAK;YACnB;AACR,QAAK,OAAO;AACZ,QAAK,iCAAiB,IAAI,KAAK;;;CAInC,UAAU,MAAkC;AAC1C,MAAI,KAAK,QAAQ,CACf,OAAM,IAAI,MAAM,6BAA6B;AAG/C,MAAI,KAAK,eAAe,OAAO,KAAK,KAAK,UAAU,CACjD,QAAO,KAAK,8BAA8B,KAAK;EAGjD,MAAM,aAAa,KAAK,SAAS,cAAc,KAAK,UAAU,CAAC;AAE/D,MAAI,CAAC,WACH,OAAM,IAAI,MACR,2CAA2C,KAAK,UAAU,GAC3D;EAeH,MAAM,SAAS,WAAW,UAAU,MAZF;GAChC,YAAY,MAAM,KAAK,UAAU,EAAE;GACnC,mBAAmB,QAAQ,YAAY;AACrC,QAAI,CAAC,KAAK,KACR,OAAM,IAAI,MACR,wEACD;AAEH,WAAO,kBAAkB,WAAW,KAAK,MAAM,QAAQ,QAAQ;;GAElE,CAEiD;AAClD,SAAO,KAAK,YAAY,QAAQ,KAAK;;CAGvC,AAAQ,8BAA8B,MAAoC;EACxE,MAAM,aAA6C,EAAE;EACrD,MAAM,WAAqB,EAAE;AAE7B,OAAK,MAAM,SAAS,KAAK,YAAY,EAAE;AACrC,OAAI,KAAK,eAAe,IAAI,MAAM,IAAI,CAAC,CACrC;AAEF,cAAW,MAAM,MAAM,IAAI,KAAK,UAAU,MAAM;AAChD,YAAS,KAAK,MAAM,MAAM,CAAC;;EAG7B,MAAM,SAA2B;GAC/B,MAAM;GACN;GACA,sBAAsB;GACtB;GACD;AAED,SAAO,KAAK,YAAY,QAAQ,KAAK;;CAGvC,AAAQ,YAEN,QAAW,MAAqB;EAChC,MAAM,OAAO,KAAK,UAAU;AAE5B,MAAI,KAAK,MACP,QAAO,QAAQ,KAAK;AAEtB,MAAI,KAAK,YACP,QAAO,cAAc,KAAK;AAE5B,MAAI,KAAK,WACP,QAAO,aAAa,KAAK;AAG3B,SAAO;;;;;;AC5GX,IAAa,mBAAb,MAA8B;CAC5B,AAAO,SAAS,GAAY,GAAqB;AAC/C,MAAI,MAAM,EACR,QAAO;AAGT,MACE,MAAM,QACN,MAAM,QACN,OAAO,MAAM,YACb,OAAO,MAAM,SAEb,QAAO,MAAM;AAGf,MAAI,MAAM,QAAQ,EAAE,KAAK,MAAM,QAAQ,EAAE,CACvC,QAAO;AAGT,MAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,CACtC,QAAO,KAAK,YAAY,GAAG,EAAE;AAG/B,SAAO,KAAK,aACV,GACA,EACD;;CAGH,AAAQ,YAAY,GAAc,GAAuB;AACvD,MAAI,EAAE,WAAW,EAAE,OACjB,QAAO;AAET,SAAO,EAAE,OAAO,MAAM,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,CAAC;;CAGxD,AAAQ,aACN,GACA,GACS;EACT,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;EAC/D,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,CAAC;AAE/D,MAAI,MAAM,WAAW,MAAM,OACzB,QAAO;AAGT,MAAI,CAAC,MAAM,OAAO,GAAG,MAAM,MAAM,MAAM,GAAG,CACxC,QAAO;AAGT,SAAO,MAAM,OAAO,QAAQ,KAAK,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;;;;;;AC9C9D,IAAa,gBAAb,MAA2B;CACzB,AAAiB,+BAAe,IAAI,KAAmB;CACvD,AAAiB,iCAAiB,IAAI,KAAqB;CAC3D,AAAiB,iCAAiB,IAAI,KAAqB;CAC3D,AAAiB,gCAAgB,IAAI,KAAW;CAChD,AAAQ;CAER,YAAY,MAAkB;AAC5B,OAAK,OAAO;AACZ,OAAK,SAAS;;CAGhB,AAAO,UAAgB;AACrB,OAAK,aAAa,OAAO;AACzB,OAAK,eAAe,OAAO;AAC3B,OAAK,eAAe,OAAO;AAC3B,OAAK,cAAc,OAAO;AAC1B,OAAK,iBAAiB,KAAK,KAAK,MAAM,EAAE,WAAW;;CAGrD,AAAO,YAAY,MAAwB;AACzC,OAAK,OAAO;AACZ,OAAK,SAAS;;CAGhB,AAAO,QAAQ,QAAkC;AAC/C,SAAO,KAAK,aAAa,IAAI,OAAO;;CAGtC,AAAO,QAAQ,QAAyB;AACtC,SAAO,KAAK,aAAa,IAAI,OAAO;;CAGtC,AAAO,UAAoC;AACzC,SAAO,KAAK,aAAa,MAAM;;CAGjC,AAAO,iBAAiB,WAAmB,WAAyB;EAClE,MAAM,WAAW,KAAK,aAAa,IAAI,UAAU;AACjD,MAAI,aAAa,QAAW;AAC1B,QAAK,iBAAiB,SAAS;AAC/B,QAAK,aAAa,OAAO,UAAU;AACnC,QAAK,aAAa,IAAI,WAAW,SAAS;AAC1C,QAAK,cAAc,IAAI,SAAS;;AAElC,OAAK,eAAe,IAAI,WAAW,UAAU;AAC7C,OAAK,eAAe,IAAI,WAAW,UAAU;;CAG/C,AAAO,kBAAkB,WAAuC;AAC9D,SAAO,KAAK,eAAe,IAAI,UAAU;;CAG3C,AAAO,sBAAsB,MAAqB;AAChD,OAAK,MAAM,gBAAgB,KAAK,cAC9B,KAAI,KAAK,UAAU,aAAa,CAC9B,QAAO;AAGX,SAAO;;CAGT,AAAQ,iBAAiB,YAAwB;AAC/C,OAAK,MAAM,CAAC,QAAQ,SAAS,KAAK,aAChC,KAAI,KAAK,UAAU,WAAW,CAC5B,MAAK,aAAa,OAAO,OAAO;;CAKtC,AAAQ,iBAAiB,MAAkB,MAAkB;AAC3D,MAAI,KAAK,QAAQ,CACf;AAGF,OAAK,aAAa,IAAI,KAAK,IAAI,EAAE,KAAK;AAEtC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,CACnC,MAAK,iBAAiB,OAAO,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC;AAI1D,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,iBAAiB,OAAO,KAAK,YAAY,CAAC;;;;;;;ACvFvD,IAAa,kBAAb,MAA6B;CAC3B,YACE,AAAiB,aACjB,AAAiB,UACjB,AAAiB,WACjB;EAHiB;EACA;EACA;;CAGnB,AAAO,UAAuB;EAC5B,MAAM,UAAuB,EAAE;EAC/B,MAAM,uCAAuB,IAAI,KAAa;AAE9C,OAAK,0BAA0B,SAAS,qBAAqB;AAC7D,OAAK,oBAAoB,SAAS,qBAAqB;AAEvD,SAAO;;CAGT,AAAQ,0BACN,SACA,sBACM;AACN,OAAK,MAAM,UAAU,KAAK,YAAY,SAAS,EAAE;GAC/C,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO;GACnD,MAAM,cAAc,KAAK,YAAY,SAAS,OAAO;AAErD,OAAI,KAAK,UAAU,QAAQ,OAAO,CAChC,MAAK,0BACH,QACA,aACA,aACA,SACA,qBACD;OAED,SAAQ,KAAK;IACX,MAAM;IACN,UAAU;IACV;IACD,CAAC;;;CAKR,AAAQ,0BACN,QACA,aACA,aACA,SACA,sBACM;AACN,uBAAqB,IAAI,OAAO;EAEhC,MAAM,iBAAiB,KAAK,UAAU,kBAAkB,OAAO;EAC/D,MAAM,aAAa,kBAAkB;EACrC,MAAM,WAAW,KAAK,SAAS,SAAS,WAAW;AAEnD,MAAI,eACF,sBAAqB,IAAI,eAAe;EAG1C,MAAM,WAAW,KAAK,UAAU,QAAQ,OAAO;EAC/C,MAAM,UAAU,CAAC,YAAY,CAAC,YAAY,OAAO,SAAS;AAE1D,UAAQ,KAAK;GACX,MAAM,UAAU,UAAU;GAC1B;GACA;GACD,CAAC;;CAGJ,AAAQ,oBACN,SACA,sBACM;AACN,OAAK,MAAM,UAAU,KAAK,UAAU,SAAS,EAAE;AAC7C,OAAI,qBAAqB,IAAI,OAAO,CAClC;GAGF,MAAM,WAAW,KAAK,SAAS,SAAS,OAAO;AAC/C,WAAQ,KAAK;IACX,MAAM;IACN;IACA,aAAa;IACd,CAAC;;;;;;;AC5ER,IAAa,kBAAb,MAA6B;CAC3B,YACE,AAAiB,aACjB,AAAiB,UACjB,AAAiB,WACjB;EAHiB;EACA;EACA;;CAGnB,AAAO,SAAS,SAAwC;EACtD,MAAM,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ;EACvD,MAAM,QAAQ,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ;EACvD,MAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE,SAAS,UAAU;EAC3D,MAAM,WAAW,QAAQ,QAAQ,MAAM,EAAE,SAAS,WAAW;EAE7D,MAAM,gBAAgB,KAAK,oBAAoB,MAAM;EACrD,MAAM,iBAAiB,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,SAAS,CAAC;EAC5D,MAAM,8BACJ,KAAK,mCAAmC,cAAc;AAExD,SAAO;GACL,OAAO;GACP,OAAO,KAAK,mBAAmB,MAAM;GACrC,SAAS,KAAK,sBAAsB,SAAS,eAAe;GAC5D,UAAU,KAAK,eAAe,UAAU,4BAA4B;GACrE;;CAGH,AAAQ,mCACN,eACa;EACb,MAAM,0BAAU,IAAI,KAAa;AACjC,OAAK,MAAM,UAAU,eAAe;AAClC,OAAI,OAAO,UAAU;IACnB,MAAM,iBAAiB,KAAK,kBAC1B,KAAK,UACL,OAAO,SAAS,IAAI,CACrB;AACD,QAAI,eACF,SAAQ,IAAI,eAAe;;AAG/B,OAAI,OAAO,aAAa;IACtB,MAAM,iBAAiB,KAAK,kBAC1B,KAAK,aACL,OAAO,YAAY,IAAI,CACxB;AACD,QAAI,eACF,SAAQ,IAAI,eAAe;;;AAIjC,SAAO;;CAGT,AAAQ,kBAAkB,MAAkB,QAA+B;EAEzE,MAAM,WADO,KAAK,OAAO,OAAO,CACV,UAAU,CAAC;AACjC,MAAI,CAAC,UAAU,YAAY,CACzB,QAAO;EAET,MAAM,eAAe,KAAK,OAAO,WAAW,MAAM,SAAS,cAAc,CAAC,CAAC;AAC3E,SAAO,aAAa,QAAQ,GAAG,OAAO,aAAa,IAAI;;CAGzD,AAAQ,oBAAoB,OAAiC;AAC3D,SAAO,MAAM,QAAQ,WAAW,CAAC,KAAK,mBAAmB,QAAQ,MAAM,CAAC;;CAG1E,AAAQ,mBACN,QACA,UACS;AACT,MAAI,CAAC,OAAO,SACV,QAAO;EAET,MAAM,mBAAmB,OAAO,SAAS,IAAI;EAC7C,MAAM,WAAW,KAAK,SAAS,OAAO,iBAAiB;AACvD,SAAO,SAAS,MACb,UACC,MAAM,YACN,MAAM,SAAS,IAAI,KAAK,oBACxB,SAAS,UAAU,KAAK,SAAS,OAAO,MAAM,SAAS,IAAI,CAAC,CAAC,CAChE;;CAGH,AAAQ,mBAAmB,OAAiC;EAC1D,MAAM,mBAAmB,MACtB,SAAS,WAAW;AACnB,OAAI,CAAC,OAAO,YACV,QAAO,EAAE;AAEX,UAAO,CACL;IACE;IACA,MAAM,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;IACvD,CACF;IACD,CACD,MAAM,GAAG,MAAM,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;EAEpD,MAAM,aAAqB,EAAE;EAC7B,MAAM,SAAsB,EAAE;AAE9B,OAAK,MAAM,EAAE,QAAQ,UAAU,kBAAkB;AAC/C,OAAI,KAAK,UAAU,sBAAsB,KAAK,CAC5C;AAGF,OAAI,KAAK,iBAAiB,MAAM,WAAW,CACzC;AAGF,UAAO,KAAK,OAAO;AACnB,cAAW,KAAK,KAAK;;AAGvB,SAAO;;CAGT,AAAQ,sBACN,SACA,gBACa;EACb,MAAM,mBAAmB,QACtB,SAAS,WAAW;AACnB,OAAI,CAAC,OAAO,YAAY,eAAe,IAAI,OAAO,SAAS,CACzD,QAAO,EAAE;AAEX,UAAO,CACL;IACE;IACA,MAAM,KAAK,SAAS,OAAO,OAAO,SAAS,IAAI,CAAC;IACjD,CACF;IACD,CACD,MAAM,GAAG,MAAM,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,QAAQ,CAAC;EAEpD,MAAM,eAAuB,EAAE;EAC/B,MAAM,SAAsB,EAAE;AAE9B,OAAK,MAAM,EAAE,QAAQ,UAAU,kBAAkB;AAC/C,OAAI,KAAK,iBAAiB,MAAM,aAAa,CAC3C;AAGF,UAAO,KAAK,OAAO;AACnB,gBAAa,KAAK,KAAK;;AAGzB,SAAO;;CAGT,AAAQ,eACN,UACA,6BACa;AACb,SAAO,SAAS,QAAQ,WAAW;AACjC,OAAI,CAAC,OAAO,YACV,QAAO;GAGT,MAAM,iBAAiB,KAAK,kBAC1B,KAAK,aACL,OAAO,YAAY,IAAI,CACxB;AACD,OAAI,kBAAkB,4BAA4B,IAAI,eAAe,CACnE,QAAO;AAGT,UAAO;IACP;;CAGJ,AAAQ,iBAAiB,MAAY,SAA0B;AAC7D,OAAK,MAAM,UAAU,QACnB,KAAI,KAAK,UAAU,OAAO,CACxB,QAAO;AAGX,SAAO;;;;;;ACpLX,IAAa,iBAAb,MAA4B;CAC1B,AAAiB,aAAa,IAAI,kBAAkB;CACpD,AAAiB,aAAa,IAAI,kBAAkB;CAEpD,YACE,AAAiB,aACjB,AAAiB,UACjB;EAFiB;EACA;;CAGnB,AAAO,SAAS,WAA0C;EACxD,MAAM,eAAe,KAAK,oBAAoB,UAAU,MAAM;EAC9D,MAAM,cAAc,KAAK,oBAAoB,UAAU,MAAM;EAC7D,MAAM,aAAa,KAAK,mBAAmB,UAAU,OAAO,aAAa;EACzE,MAAM,gBAAgB,KAAK,sBAAsB,UAAU,QAAQ;EAEnE,MAAM,EAAE,kBAAkB,gBAAgB,KAAK,oBAC7C,YACA,YACD;EAED,MAAM,mBAAmB,IAAI,IAAI;GAC/B,GAAG,WAAW,KAAK,MAAM,EAAE,KAAK;GAChC,GAAG,cAAc,KAAK,MAAM,EAAE,KAAK;GACnC,GAAG,YAAY,SAAS,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,OAAO,QAAQ;GACtE,CAAC;EAEF,MAAM,iBAAiB,KAAK,uBAC1B,UAAU,UACV,iBACD;AAED,SAAO;GACL,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACJ;;CAGH,AAAQ,oBAAoB,OAAiC;EAC3D,MAAM,0BAAU,IAAI,KAAa;AACjC,OAAK,MAAM,UAAU,MACnB,KAAI,OAAO,YACT,SAAQ,IAAI,OAAO,YAAY,IAAI,CAAC;AAGxC,SAAO;;CAGT,AAAQ,oBACN,YACA,aAC6D;EAC7D,MAAM,mBAAmB,YAAY,KAAK,MAAM,kBAAkB,EAAE,KAAK,CAAC;EAE1E,MAAM,mBAAgC,EAAE;EACxC,MAAM,cAA2B,EAAE;AAEnC,OAAK,MAAM,YAAY,YAAY;GACjC,MAAM,UAAU,kBAAkB,SAAS,KAAK;AAKhD,OAJuB,iBAAiB,MAAM,aAC5C,SAAS,UAAU,QAAQ,CAC5B,CAGC,kBAAiB,KAAK,SAAS;OAE/B,aAAY,KAAK,SAAS;;AAI9B,SAAO;GAAE;GAAkB;GAAa;;CAG1C,AAAQ,oBAAoB,OAAiC;EAC3D,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,OAAO;AAC1B,OAAI,CAAC,OAAO,YAAY,CAAC,OAAO,YAC9B;GAGF,MAAM,WAAW,KAAK,SAAS,OAAO,OAAO,SAAS,IAAI,CAAC;GAC3D,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;AAEpE,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,SAAS,eAAe;IAC9B,MAAM,YAAY,eAAe;IAClC,CAAC;GAEF,MAAM,cAAc,KAAK,wBACvB,OAAO,UACP,OAAO,aACP,YAAY,eAAe,CAC5B;AACD,OAAI,YACF,SAAQ,KAAK,YAAY;;AAI7B,SAAO;;CAGT,AAAQ,wBACN,UACA,aACA,aACkB;EAClB,MAAM,gBAAgB,KAAK,WAAW,kBACpC,aACA,KAAK,YACN;EACD,MAAM,aAAa,KAAK,WAAW,kBACjC,UACA,KAAK,SACN;AAED,MAAI,CAAC,KAAK,WAAW,SAAS,eAAe,WAAW,CACtD,QAAO;GACL,IAAI;GACJ,MAAM;GACN,OAAO;GACR;AAGH,SAAO;;CAGT,AAAQ,mBACN,OACA,cACa;EACb,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,OAAO;AAC1B,OAAI,CAAC,OAAO,YACV;GAGF,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;GACpE,MAAM,SAAS,KAAK,WAAW,kBAC7B,OAAO,aACP,KAAK,aACL,EAAE,gBAAgB,cAAc,CACjC;AACD,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,YAAY,eAAe;IACjC,OAAO;IACR,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,sBAAsB,SAAmC;EAC/D,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,SAAS;AAC5B,OAAI,CAAC,OAAO,SACV;GAGF,MAAM,WAAW,KAAK,SAAS,OAAO,OAAO,SAAS,IAAI,CAAC;AAC3D,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,SAAS,eAAe;IAC/B,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,uBACN,UACA,kBACa;EACb,MAAM,UAAuB,EAAE;EAC/B,MAAM,gBAAwB,EAAE;EAChC,MAAM,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,IAAI,kBAAkB;AAE3E,OAAK,MAAM,UAAU,UAAU;AAC7B,OAAI,CAAC,OAAO,eAAe,CAAC,OAAO,SACjC;GAGF,MAAM,cAAc,KAAK,YAAY,OAAO,OAAO,YAAY,IAAI,CAAC;AAEpE,OAAI,KAAK,aAAa,aAAa,cAAc,CAC/C;AAGF,OAAI,KAAK,WAAW,aAAa,uBAAuB,CACtD;AAGF,OAAI,CAAC,KAAK,mBAAmB,OAAO,CAClC;AAGF,OAAI,OAAO,YAAY,SAAS,EAAE;IAChC,MAAM,eAAe,KAAK,4BACxB,OAAO,aACP,OAAO,UACP,YACD;AACD,YAAQ,KAAK,GAAG,aAAa;AAC7B,kBAAc,KAAK,YAAY;AAC/B;;GAGF,MAAM,SAAS,KAAK,WAAW,kBAC7B,OAAO,aACP,KAAK,YACN;AACD,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,YAAY,eAAe;IACjC,OAAO;IACR,CAAC;AACF,iBAAc,KAAK,YAAY;;AAGjC,SAAO;;CAGT,AAAQ,4BACN,aACA,UACA,aACa;AACb,MAAI,CAAC,SAAS,SAAS,EAAE;GACvB,MAAM,SAAS,KAAK,WAAW,kBAC7B,aACA,KAAK,YACN;AACD,UAAO,CACL;IACE,IAAI;IACJ,MAAM,YAAY,eAAe;IACjC,OAAO;IACR,CACF;;EAGH,MAAM,UAAuB,EAAE;EAC/B,MAAM,kBAAkB,KAAK,mBAAmB,aAAa,SAAS;EACtE,MAAM,eAAe,KAAK,gBAAgB,aAAa,SAAS;AAEhE,MAAI,iBAAiB;GACnB,MAAM,SAAS,KAAK,WAAW,kBAC7B,aACA,KAAK,YACN;AACD,WAAQ,KAAK;IACX,IAAI;IACJ,MAAM,YAAY,eAAe;IACjC,OAAO;IACR,CAAC;;AAGJ,MAAI,cAAc;GAChB,MAAM,QAAQ,YAAY,OAAO;AACjC,OAAI,CAAC,MAAM,QAAQ,EAAE;IACnB,MAAM,YAAY,YAAY,YAAY;IAC1C,MAAM,cAAc,KAAK,WAAW,kBAClC,OACA,KAAK,YACN;AACD,YAAQ,KAAK;KACX,IAAI;KACJ,MAAM,UAAU,eAAe;KAC/B,OAAO;KACR,CAAC;;;AAIN,SAAO;;CAGT,AAAQ,gBACN,aACA,UACS;EACT,MAAM,QAAQ,YAAY,OAAO;EACjC,MAAM,YAAY,SAAS,OAAO;AAElC,MAAI,MAAM,QAAQ,IAAI,UAAU,QAAQ,CACtC,QAAO;AAET,MAAI,MAAM,QAAQ,IAAI,UAAU,QAAQ,CACtC,QAAO;EAGT,MAAM,qBAAqB,KAAK,WAAW,kBACzC,OACA,KAAK,YACN;EACD,MAAM,kBAAkB,KAAK,WAAW,kBACtC,WACA,KAAK,SACN;AAED,SAAO,CAAC,KAAK,WAAW,SAAS,oBAAoB,gBAAgB;;CAGvE,AAAQ,aAAa,MAAY,SAA0B;AACzD,SAAO,QAAQ,MAAM,WAAW,KAAK,UAAU,OAAO,CAAC;;CAGzD,AAAQ,WAAW,MAAY,YAA6B;AAC1D,SAAO,WAAW,MAAM,cAAc,UAAU,UAAU,KAAK,CAAC;;CAGlE,AAAQ,mBAAmB,QAA4B;AACrD,MAAI,CAAC,OAAO,eAAe,CAAC,OAAO,SACjC,QAAO;EAGT,MAAM,gBAAgB,KAAK,WAAW,kBACpC,OAAO,aACP,KAAK,YACN;EACD,MAAM,aAAa,KAAK,WAAW,kBACjC,OAAO,UACP,KAAK,SACN;AAED,MAAI,KAAK,WAAW,SAAS,eAAe,WAAW,CACrD,QAAO;AAGT,MACE,OAAO,YAAY,UAAU,IAC7B,KAAK,oBAAoB,OAAO,aAAa,OAAO,SAAS,CAE7D,QAAO;AAGT,MACE,OAAO,YAAY,SAAS,IAC5B,KAAK,oBAAoB,OAAO,aAAa,OAAO,SAAS,CAE7D,QAAO;AAGT,SAAO;;CAGT,AAAQ,oBACN,aACA,UACS;AACT,MAAI,CAAC,SAAS,UAAU,CACtB,QAAO;AAGT,MAAI,KAAK,mBAAmB,aAAa,SAAS,CAChD,QAAO;AAGT,SAAO;;CAGT,AAAQ,mBACN,aACA,UACS;EACT,MAAM,cAAc,YAAY,UAAU;EAC1C,MAAM,WAAW,SAAS,UAAU;AAEpC,SACE,YAAY,UAAU,SAAS,SAC/B,YAAY,gBAAgB,SAAS,eACrC,YAAY,eAAe,SAAS;;CAIxC,AAAQ,oBACN,aACA,UACS;AACT,MAAI,CAAC,SAAS,SAAS,CACrB,QAAO;AAGT,MAAI,KAAK,mBAAmB,aAAa,SAAS,CAChD,QAAO;EAGT,MAAM,QAAQ,YAAY,OAAO;EACjC,MAAM,YAAY,SAAS,OAAO;AAElC,MAAI,MAAM,QAAQ,IAAI,UAAU,QAAQ,CACtC,QAAO;AAGT,SAAO,MAAM,IAAI,KAAK,UAAU,IAAI;;;;;;ACpZxC,IAAa,wBAAb,MAAmC;CACjC,AAAiB,aAAa,IAAI,kBAAkB;CAEpD,YACE,AAAiB,aACjB,AAAiB,UACjB;EAFiB;EACA;;CAGnB,AAAO,6BACL,iBACa;EACb,MAAM,eAAe,IAAI,IAAI,gBAAgB,KAAK,MAAM,EAAE,KAAK,CAAC;EAChE,MAAM,SAAsB,EAAE;AAE9B,OAAK,SAAS,gBAAgB,kBAAkB;GAC9C,MAAM,cAAc,KAAK,YAAY,SAAS,cAAc;AAC5D,OAAI,YAAY,QAAQ,CACtB;GAGF,MAAM,cAAc,KAAK,YACtB,OAAO,cAAc,CACrB,eAAe;AAClB,OAAI,aAAa,IAAI,YAAY,CAC/B;GAGF,MAAM,cAAc,KAAK,SAAS,mBAAmB,cAAc;GACnE,MAAM,iBAAiB,YAAY,SAAS;AAE5C,OAAI,CAAC,eAAe,CAAC,eACnB;AAeF,OAZuB,IAAI,kBACzB,KAAK,UACL,eACA,YACD,CAAC,WAAW,KAEa,IAAI,kBAC5B,KAAK,aACL,eACA,eACD,CAAC,WAAW,EAE6B;IACxC,MAAM,SAAS,KAAK,WAAW,kBAC7B,aACA,KAAK,YACN;AACD,WAAO,KAAK;KACV,IAAI;KACJ,MAAM;KACN,OAAO;KACR,CAAC;;IAEJ;AAEF,SAAO;;;;;;ACvDX,IAAa,wBAAb,MAAmC;CACjC,AAAO,YAAY,MAAiC;AAClD,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB,QAAO;AAGT,MAAI,KAAK,OAAO,CACd,QAAO,KAAK,KAAK;AAGnB,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CAEjB,QAAO,SADW,KAAK,YAAY,MAAM,CACf;AAE5B,UAAO;;AAGT,SAAO,KAAK,UAAU;;CAGxB,AAAO,qBACL,MACA,MACoB;AACpB,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;EAEF,MAAM,UAAU,KAAK,SAAS;AAC9B,MAAI,CAAC,QACH;AAEF,SAAO,IAAI,kBAAkB,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC,WAAW;;CAGpE,AAAO,gBAAgB,MAA2C;AAChE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;EAEF,MAAM,MAAM,KAAK,cAAc;AAC/B,MACE,OAAO,QAAQ,YACf,OAAO,QAAQ,YACf,OAAO,QAAQ,UAEf,QAAO;;CAKX,AAAO,eAAe,MAA6C;AACjE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,UAAU,CAAC;;CAGzB,AAAO,cAAc,MAA8C;AACjE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,UAAU,CAAC;;CAGzB,AAAO,cAAc,MAA6C;AAChE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,YAAY;;CAG1B,AAAO,oBAAoB,MAA6C;AACtE,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB;AAEF,SAAO,KAAK,oBAAoB;;CAGlC,AAAO,uBACL,UACA,UACA,aACA,aACuB;EACvB,MAAM,UAAgC,EAAE;EACxC,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EAEJ,MAAM,uBAAuB,KAAK,8BAChC,UACA,YACD;EAED,MAAM,WAAW,KAAK,eAAe,SAAS;EAC9C,MAAM,cAAc,KAAK,eAAe,qBAAqB;AAC7D,MAAI,aAAa,aAAa;AAC5B,WAAQ,KAAK,cAAc;AAC3B,uBAAoB;IAClB,iBAAiB;IACjB,eAAe;IAChB;;EAGH,MAAM,iBAAiB,KAAK,cAAc,SAAS;EACnD,MAAM,oBAAoB,KAAK,cAAc,qBAAqB;AAClE,MAAI,mBAAmB,mBAAmB;AACxC,WAAQ,KAAK,aAAa;AAC1B,sBAAmB;IACjB,gBAAgB;IAChB,cAAc;IACf;;EAGH,MAAM,cAAc,KAAK,qBAAqB,UAAU,SAAS;EACjE,MAAM,iBAAiB,KAAK,qBAC1B,aACA,qBACD;AACD,MAAI,gBAAgB,gBAAgB;AAClC,WAAQ,KAAK,UAAU;AACvB,mBAAgB;IAAE,aAAa;IAAa,WAAW;IAAgB;;EAGzE,MAAM,iBAAiB,KAAK,cAAc,SAAS;EACnD,MAAM,oBAAoB,KAAK,cAAc,qBAAqB;AAClE,MAAI,mBAAmB,mBAAmB;AACxC,WAAQ,KAAK,aAAa;AAC1B,sBAAmB;IACjB,gBAAgB;IAChB,cAAc;IACf;;EAGH,MAAM,cAAc,KAAK,gBAAgB,SAAS;EAClD,MAAM,iBAAiB,KAAK,gBAAgB,qBAAqB;AACjE,MAAI,gBAAgB,gBAAgB;AAClC,WAAQ,KAAK,UAAU;AACvB,mBAAgB;IAAE,aAAa;IAAa,WAAW;IAAgB;;EAGzE,MAAM,uBAAuB,KAAK,oBAAoB,SAAS;EAC/D,MAAM,0BACJ,KAAK,oBAAoB,qBAAqB;AAChD,MAAI,yBAAyB,yBAAyB;AACpD,WAAQ,KAAK,mBAAmB;AAChC,4BAAyB;IACvB,sBAAsB;IACtB,oBAAoB;IACrB;;AAGH,SAAO;GACL,iBAAiB;GACjB;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,AAAQ,8BACN,UACA,aACmB;AACnB,MACE,YACA,CAAC,SAAS,QAAQ,IAClB,SAAS,aAAa,IACtB,eACA,CAAC,YAAY,QAAQ,IACrB,YAAY,SAAS,EACrB;GACA,MAAM,QAAQ,YAAY,OAAO;AACjC,UAAO,MAAM,QAAQ,GAAG,OAAO;;AAEjC,SAAO;;CAGT,AAAO,eACL,UACA,aACS;AAGT,SAFiB,KAAK,YAAY,SAAS,KACvB,KAAK,YAAY,YAAY;;CAInD,AAAO,4BACL,UACA,aACS;AAGT,SAFiB,KAAK,gBAAgB,SAAS,KAC3B,KAAK,gBAAgB,YAAY;;CAIvD,AAAQ,gBAAgB,MAAiC;AACvD,MAAI,CAAC,QAAQ,KAAK,QAAQ,CACxB,QAAO;AAGT,MAAI,KAAK,OAAO,CACd,QAAO,KAAK,KAAK;AAGnB,MAAI,KAAK,SAAS,CAChB,QAAO;AAGT,SAAO,KAAK,UAAU;;;;;;AC3N1B,IAAa,gBAAb,MAA2B;CACzB,AAAiB,oBAAoB,IAAI,uBAAuB;CAEhE,YACE,AAAiB,aACjB,AAAiB,UACjB;EAFiB;EACA;;CAGnB,AAAO,OAAO,OAA+B;EAC3C,MAAM,YAAY,KAAK,qBAAqB,MAAM,KAAK;AAEvD,MAAI,MAAM,OAAO,MACf,QAAO,KAAK,eAAe,OAAO,UAAU;AAG9C,MAAI,MAAM,OAAO,SACf,QAAO;GAAE;GAAO;GAAW,iBAAiB,EAAE;GAAE;AAGlD,MAAI,MAAM,OAAO,OACf,QAAO,KAAK,gBAAgB,OAAO,UAAU;AAG/C,SAAO,KAAK,mBAAmB,OAAO,UAAU;;CAGlD,AAAQ,eAAe,OAAkB,WAAgC;EACvE,MAAM,cAAc,KAAK,cAAc,KAAK,aAAa,MAAM,KAAK;EAEpE,MAAM,EACJ,iBACA,eACA,eACA,mBACA,kBACA,kBACA,2BACE,KAAK,kBAAkB,uBACzB,KAAK,UACL,MACA,KAAK,aACL,YACD;AAED,SAAO;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;;CAGH,AAAQ,gBAAgB,OAAkB,WAAgC;EACxE,MAAM,WAAW,MAAM,QAAQ;EAC/B,MAAM,WAAW,KAAK,aAAa,UAAU,MAAM,KAAK;EACxD,MAAM,iBAAiB,KAAK,uBAAuB,UAAU,MAAM,KAAK;EAExE,MAAM,WAAW,KAAK,cAAc,KAAK,UAAU,SAAS;EAC5D,MAAM,cAAc,KAAK,cAAc,KAAK,aAAa,MAAM,KAAK;EAEpE,MAAM,cAAc,KAAK,kBAAkB,qBACzC,KAAK,UACL,SACD;EACD,MAAM,iBAAiB,KAAK,kBAAkB,qBAC5C,KAAK,aACL,YACD;EAED,MAAM,gBACJ,gBAAgB,iBACZ;GAAE,aAAa;GAAa,WAAW;GAAgB,GACvD;AAEN,SAAO;GACL;GACA;GACA,iBAAiB,gBAAgB,CAAC,UAAU,GAAG,EAAE;GACjD,UAAU,YAAY;GACtB,gBAAgB,kBAAkB;GAClC;GACD;;CAGH,AAAQ,mBAAmB,OAAkB,WAAgC;EAC3E,MAAM,WAAW,KAAK,cAAc,KAAK,UAAU,MAAM,KAAK;EAC9D,MAAM,cAAc,KAAK,cAAc,KAAK,aAAa,MAAM,KAAK;EAEpE,MAAM,EACJ,iBACA,eACA,eACA,mBACA,kBACA,kBACA,2BACE,KAAK,kBAAkB,uBACzB,KAAK,UACL,UACA,KAAK,aACL,YACD;EAED,MAAM,uBAAuB,KAAK,yBAChC,UACA,YACD;AASD,SAAO;GACL;GACA;GACA;GACA,aAXkB,uBAChB,KAAK,kBAAkB,4BACrB,UACA,YACD,GACD,KAAK,kBAAkB,eAAe,UAAU,YAAY,IAO1D;IACE,UAAU,KAAK,kBAAkB,YAAY,SAAS;IACtD,QAAQ,KAAK,kBAAkB,YAAY,YAAY;IACxD,GACD;GACJ;GACA,eAAe,uBAAuB,SAAY;GAClD;GACA;GACA;GACA;GACD;;CAGH,AAAQ,yBACN,UACA,aACS;AACT,SAAO,QAAQ,UAAU,SAAS,IAAI,aAAa,SAAS,CAAC;;CAG/D,AAAQ,qBAAqB,aAA6B;AACxD,MAAI;AACF,UAAO,kBAAkB,YAAY,CAAC,UAAU;UAC1C;AACN,UAAO;;;CAIX,AAAQ,aAAa,aAAqB,WAA4B;AACpE,MAAI;GACF,MAAM,aAAa,kBAAkB,YAAY,CAAC,QAAQ;GAC1D,MAAM,WAAW,kBAAkB,UAAU,CAAC,QAAQ;AACtD,UAAO,WAAW,OAAO,SAAS;UAC5B;AACN,UAAO;;;CAIX,AAAQ,uBACN,aACA,WACS;AACT,MAAI;GACF,MAAM,WAAW,kBAAkB,YAAY;GAC/C,MAAM,SAAS,kBAAkB,UAAU;GAC3C,MAAM,iBAAiB,KAAK,gBAAgB,SAAS;AAErD,UADqB,KAAK,gBAAgB,OAAO,GAC3B;UAChB;AACN,UAAO;;;CAIX,AAAQ,gBAAgB,MAAyC;AAC/D,SAAO,KAAK,UAAU,CAAC,QAAQ,QAAQ,IAAI,SAAS,CAAC,CAAC;;CAGxD,AAAQ,cACN,MACA,aACmB;AACnB,MAAI;GACF,MAAM,OAAO,kBAAkB,YAAY;GAC3C,MAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,UAAO,KAAK,QAAQ,GAAG,OAAO;UACxB;AACN,UAAO;;;;;;;AC7Lb,IAAa,eAAb,MAA0B;CACxB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YACE,aACA,UACA,WACA;AACA,OAAK,YAAY,IAAI,gBAAgB,aAAa,UAAU,UAAU;AACtE,OAAK,YAAY,IAAI,gBAAgB,aAAa,UAAU,UAAU;AACtE,OAAK,YAAY,IAAI,eAAe,aAAa,SAAS;AAC1D,OAAK,kBAAkB,IAAI,sBAAsB,aAAa,SAAS;AACvE,OAAK,WAAW,IAAI,cAAc,aAAa,SAAS;;CAG1D,AAAO,QAAuB;EAC5B,MAAM,aAAa,KAAK,UAAU,SAAS;EAC3C,MAAM,YAAY,KAAK,UAAU,SAAS,WAAW;EACrD,MAAM,cAAc,KAAK,UAAU,SAAS,UAAU;EACtD,MAAM,iBACJ,KAAK,gBAAgB,6BAA6B,YAAY;AAEhE,SADmB,CAAC,GAAG,aAAa,GAAG,eAAe,CACpC,KAAK,UAAU,KAAK,SAAS,OAAO,MAAM,CAAC;;;;;;AC1BjE,IAAa,aAAb,MAAwB;CACtB,AAAiB,aAAa,IAAI,kBAAkB;CACpD,AAAiB,aAAa,IAAI,kBAAkB;CACpD,AAAiB;CACjB,AAAQ;CAER,YAAY,AAAiB,MAAkB;EAAlB;AAC3B,OAAK,WAAW,KAAK,OAAO;AAC5B,OAAK,YAAY,IAAI,cAAc,KAAK,SAAS;AACjD,+BACE,MACA,EAAE,UAAUC,gBAAW,KAAK,EAC5B,EAAE,UAAU,MAAM,CACnB;;CAGH,AAAO,cAAoB;AACzB,OAAK,WAAW,KAAK,KAAK,OAAO;AACjC,OAAK,UAAU,YAAY,KAAK,SAAS;;CAG3C,AAAO,gBAAkC;AACvC,SAAO,KAAK,WAAW,kBACrB,KAAK,SAAS,MAAM,EACpB,KAAK,SACN;;CAGH,AAAO,iBAAiB,WAAmB,WAAyB;AAClE,OAAK,UAAU,iBAAiB,WAAW,UAAU;;CAGvD,AAAO,aAA4B;AACjC,SAAO,KAAK,oBAAoB,CAAC,OAAO;;CAG1C,AAAO,UAAmB;EACxB,MAAM,gBAAgB,KAAK,kBAAkB;EAC7C,MAAM,aAAa,KAAK,eAAe;AACvC,SAAO,CAAC,KAAK,WAAW,SAAS,eAAe,WAAW;;CAG7D,AAAO,mBAAqC;AAC1C,SAAO,KAAK,WAAW,kBACrB,KAAK,KAAK,MAAM,EAChB,KAAK,KACN;;CAGH,AAAQ,qBAAmC;AACzC,SAAO,IAAI,aAAa,KAAK,MAAM,KAAK,UAAU,KAAK,UAAU;;;;;;AC3DrE,MAAM,qBAAqB;AAC3B,MAAM,wBAAwB;AAE9B,MAAa,2BACX;AAEF,SAAgB,iBAAiB,MAAuB;AACtD,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,sBACnC,QAAO;AAET,QAAO,mBAAmB,KAAK,KAAK;;;;;ACOtC,IAAa,kBAAb,MAA6B;CAC3B,SAAS,MAAqC;EAC5C,MAAM,SAA4B,EAAE;AACpC,OAAK,wBAAwB,MAAM,OAAO;AAC1C,SAAO;;CAGT,AAAQ,wBACN,MACA,QACM;AACN,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,UAAU,EAAE;GACnB,MAAM,WAAW,KAAK,YAAY;GAClC,MAAM,0BAAU,IAAI,KAAa;AACjC,QAAK,MAAM,SAAS,UAAU;IAC5B,MAAM,OAAO,MAAM,MAAM;AACzB,QAAI,CAAC,KACH,QAAO,KAAK;KACV,QAAQ,MAAM,IAAI;KAClB,MAAM;KACN,SAAS;KACV,CAAC;aACO,QAAQ,IAAI,KAAK,CAC1B,QAAO,KAAK;KACV,QAAQ,MAAM,IAAI;KAClB,MAAM;KACN,SAAS,yBAAyB;KACnC,CAAC;aACO,CAAC,iBAAiB,KAAK,CAChC,QAAO,KAAK;KACV,QAAQ,MAAM,IAAI;KAClB,MAAM;KACN,SAAS;KACV,CAAC;AAEJ,YAAQ,IAAI,KAAK;AACjB,SAAK,wBAAwB,OAAO,OAAO;;;AAI/C,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,wBAAwB,OAAO,OAAO;;;;;;;ACvDnD,IAAa,mBAAb,MAA8B;CAC5B,YAAY,AAAiB,MAAkB;EAAlB;;CAE7B,WAAqC;EACnC,MAAM,SAAmC,EAAE;AAC3C,OAAK,cAAc,KAAK,KAAK,MAAM,EAAE,IAAI,OAAO;AAChD,SAAO;;CAGT,aACE,QACA,WAC+B;EAC/B,MAAM,UAAU,KAAK,KAAK,mBAAmB,OAAO;AACpD,MAAI,CAAC,QACH,QAAO;AAGT,OAAK,MAAM,OAAO,QAAQ,cAAc,CAEtC,KADmB,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,CAC1C,QAAQ,CACrB,QAAO;GACL;GACA,SAAS;GACT,WAAW,aAAa;GACzB;AAIL,SAAO;;CAGT,AAAQ,cACN,MACA,aACA,QACM;AACN,MAAI,KAAK,QAAQ,CACf;AAGF,MAAI,KAAK,aAAa,EAAE;GACtB,MAAM,QAAQ,KAAK,aAAa,KAAK,IAAI,EAAE,YAAY;AACvD,OAAI,MACF,QAAO,KAAK,MAAM;;AAItB,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,YAAY,EAAE;GACrC,MAAM,YAAY,cACd,GAAG,YAAY,GAAG,MAAM,MAAM,KAC9B,MAAM,MAAM;AAChB,QAAK,cAAc,OAAO,WAAW,OAAO;;AAIhD,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAQ,KAAK,OAAO;AAC1B,OAAI,CAAC,MAAM,QAAQ,EAAE;IACnB,MAAM,YAAY,GAAG,YAAY;AACjC,SAAK,cAAc,OAAO,WAAW,OAAO;;;;;;;;ACjEpD,SAAgB,kBACd,UACA,UACoB;AACpB,KAAI,CAAC,SACH;CAGF,MAAM,aAAa,gBAAgB,cAAc,SAAS;AAC1D,KAAI,WACF,QAAO,WAAW,wBAAwB,SAAS;;;;;ACwBvD,MAAM,sBAA4C;CAChD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAK,OAAO;GAAO;EACtC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO;GAAQ;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO;GAAG;EACnC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAO,OAAO;GAAK;EACtC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO;GAAM;EACzC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO;GAAM;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAI;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAG;EACvC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO;GAAO;EAC3C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,KAAK,IAAI;GAAE,OAAO;GAAK;EAC3C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,GAAG,EAAE;GAAE,OAAO;GAAG;EACrC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,MAAM,MAAM;GAAE,OAAO;GAAM;EAC/C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO,EAAE;GAAE;EACvC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO,EAAE;GAAE;EAClC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO,EAAE;GAAE;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAS,OAAO,CAAC,QAAQ;GAAE;EAC9C,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAI,OAAO,CAAC,GAAG;GAAE;EACpC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ;GAAM,OAAO,CAAC,KAAK;GAAE;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,EAAE,GAAG,GAAG;GAAE,OAAO,EAAE;GAAE;EACxC,kBAAkB;EAClB,UAAU;EACX;CACD;EACE,UAAU;EACV,QAAQ;EACR,SAAS;GAAE,QAAQ,CAAC,GAAG,EAAE;GAAE,OAAO,EAAE;GAAE;EACtC,kBAAkB;EAClB,UAAU;EACX;CACF;AAED,MAAM,eAA4C;CAChD,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ,EAAE,GAAG,GAAG;CAChB,OAAO,CAAC,GAAG,EAAE;CACb,KAAK;CACL,SAAS;CACV;AAED,MAAM,mBAAmB,IAAI,IAAgB;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,aAAa,SAA6B;AACjD,QAAO,iBAAiB,IAAI,QAAsB,GAC7C,UACD;;AAGN,SAAS,gBAAgB,SAGvB;CACA,MAAM,aAAa,gBAAgB,KAAK,QAAQ;AAChD,KAAI,aAAa,GACf,QAAO;EAAE,UAAU;EAAS,WAAW,aAAa,WAAW,GAAG;EAAE;AAEtE,QAAO,EAAE,UAAU,aAAa,QAAQ,EAAE;;AAG5C,SAAS,uBACP,UACA,QAC2B;AAC3B,KAAI,aAAa,OACf,QAAO;AAET,QACE,oBAAoB,MACjB,SAAS,KAAK,aAAa,YAAY,KAAK,WAAW,OACzD,IAAI;;AAIT,SAAS,eACP,OACA,UACA,QACS;AACT,KAAI,aAAa,OACf,QAAO;AAET,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,OAAO,MAAM;EACtB,KAAK;AACH,OAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,IAAI;AAErB,UAAO,OAAO,UAAU,WAAW,QAAQ;EAC7C,KAAK,UACH,QAAO,QAAQ,MAAM;EACvB,QACE,QAAO;;;AAIb,SAAS,sBACP,UACA,QACkB;AAClB,KAAI,aAAa,OACf,QAAO;CAET,MAAM,OAAO,uBAAuB,UAAU,OAAO;AACrD,QAAO,OAAO,KAAK,mBAAmB;;AAGxC,SAAS,YACP,GACA,GACkB;CAClB,MAAM,QAA4B;EAAC;EAAQ;EAAY;EAAU;AACjE,QAAO,MAAM,KAAK,IAAI,MAAM,QAAQ,EAAE,EAAE,MAAM,QAAQ,EAAE,CAAC,KAAK;;AAGhE,SAAS,uBAAuB,OAA+C;AAC7E,QAAO,MAAM,QACV,KAAK,SAAS,YAAY,KAAK,KAAK,iBAAiB,EACtD,OACD;;AAGH,SAAS,yBACP,KACsB;CACtB,MAAM,EAAE,UAAU,QAAQ,eAAe,gBAAgB;CACzD,MAAM,QAA8B,EAAE;AAEtC,KACE,WAAW,WACX,gBAAgB,UAChB,aAAa,WACb,aAAa,UACb;AACA,QAAM,KAAK;GAAE,MAAM;GAAiB,kBAAkB;GAAQ,CAAC;AAC/D,MAAI,aAAa,aAAa;GAC5B,MAAM,WAAW,sBAAsB,UAAU,YAAY;AAC7D,SAAM,KAAK;IACT,MAAM,GAAG,SAAS,KAAK;IACvB,kBAAkB;IACnB,CAAC;;YAGJ,aAAa,WACb,kBAAkB,UAClB,WAAW,WACX,WAAW,UACX;AACA,QAAM,KAAK;GACT,MAAM;GACN,kBAAkB;GACnB,CAAC;AACF,MAAI,kBAAkB,QAAQ;GAC5B,MAAM,WAAW,sBAAsB,eAAe,OAAO;AAC7D,SAAM,KAAK;IACT,MAAM,GAAG,cAAc,KAAK;IAC5B,kBAAkB;IACnB,CAAC;;YAGJ,aAAa,YACb,WAAW,YACX,aAAa,WACb,WAAW,QAEX,OAAM,KAAK;EACT,MAAM,GAAG,SAAS,KAAK;EACvB,kBAAkB;EACnB,CAAC;MACG;EACL,MAAM,WAAW,sBAAsB,UAAU,OAAO;AACxD,QAAM,KAAK;GAAE,MAAM,GAAG,SAAS,KAAK;GAAU,kBAAkB;GAAU,CAAC;;AAG7E,QAAO;;AAGT,SAAS,kCACP,UACA,WACqC;CACrC,MAAM,SAAS,aAAa;AAE5B,QAAO;EAAE;EAAQ,OAAO,CADC,eAAe,QAAQ,UAAU,UAAU,CAC1B;EAAE;;AAG9C,SAAS,+BACP,eACA,QACqC;CACrC,MAAM,YAAY,aAAa;AAG/B,QAAO;EAAE,QAFM,CAAC,WAAW,UAAU;EAEpB,OADH,eAAe,WAAW,eAAe,OAAO;EACtC;;AAG1B,SAAgB,oCACd,UACA,QAC2B;AAC3B,KAAI,aAAa,OACf,QAAO;CAGT,MAAM,OAAO,gBAAgB,SAAS;CACtC,MAAM,KAAK,gBAAgB,OAAO;AAElC,KAAI,KAAK,aAAa,aAAa,GAAG,aAAa,UACjD,QAAO;AAGT,KACE,GAAG,aAAa,WAChB,GAAG,aACH,KAAK,aAAa,WAClB,KAAK,aAAa,UAClB;EACA,MAAM,UAAU,kCACd,KAAK,UACL,GAAG,UACJ;EACD,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACX,aAAa,GAAG;GACjB,CAAC;AACF,SAAO;GACL;GACA;GACA;GACA,kBAAkB,uBAAuB,MAAM;GAC/C;GACD;;AAGH,KACE,KAAK,aAAa,WAClB,KAAK,aACL,GAAG,aAAa,WAChB,GAAG,aAAa,UAChB;EACA,MAAM,UAAU,+BAA+B,KAAK,WAAW,GAAG,SAAS;EAC3E,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACX,eAAe,KAAK;GACrB,CAAC;AACF,SAAO;GACL;GACA;GACA;GACA,kBAAkB,uBAAuB,MAAM;GAC/C;GACD;;CAGH,MAAM,OAAO,uBAAuB,KAAK,UAAU,GAAG,SAAS;AAC/D,KAAI,MAAM;EACR,MAAM,QAAQ,yBAAyB;GACrC,UAAU,KAAK;GACf,QAAQ,GAAG;GACZ,CAAC;AACF,SAAO;GACL;GACA;GACA,SAAS,KAAK;GACd,kBAAkB,KAAK;GACvB;GACD;;AAGH,QAAO;EACL;EACA;EACA,SAAS;GAAE,QAAQ;GAAK,OAAO;GAAK;EACpC,kBAAkB;EAClB,OAAO,CACL;GACE,MAAM,GAAG,KAAK,SAAS,KAAK,GAAG;GAC/B,kBAAkB;GACnB,CACF;EACF;;;;;ACzaH,SAAS,kBAAkB,QAAoC;AAC7D,KAAI,UAAU,OACZ,QAAO;AAET,KAAI,UAAU,OACZ,QAAO,OAAO;AAEhB,QAAO;;AAGT,SAAS,qBAAqB,QAA4C;AACxE,KAAI,UAAU,UAAU,OAAO,SAAS,YAAY,gBAAgB,OAElE,QADY,OAAmC,cAClC;;AAKjB,SAAS,uBACP,QACA,UACS;AACT,QAAO,aAAa,SAAS,OAAO,UAAU;;AAGhD,SAAS,mBAAmB,QAAiC;AAC3D,KAAI,aAAa,OACf,QAAO,OAAO;CAEhB,MAAM,YAAY;AAClB,KAAI,UAAU,MACZ,QAAO,CAAC,0BAA0B,UAAU,MAAM,CAAC;AAErD,QAAO,EAAE;;AAGX,SAAS,oBAAoB,QAAiC;AAC5D,KAAI,aAAa,OACf,QAAO,OAAO;CAEhB,MAAM,YAAY;AAClB,KAAI,CAAC,UAAU,WACb,QAAO,EAAE;AAEX,QAAO,OAAO,YACZ,OAAO,QAAQ,UAAU,WAAW,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAC9D,KACA,0BAA0B,WAAW,CACtC,CAAC,CACH;;AAGH,MAAM,eAAoE;CACxE,SAAS,WAAW,uBAAuB,QAAQ,GAAG;CACtD,SAAS,WAAW,uBAAuB,QAAQ,EAAE;CACrD,UAAU,WAAW,uBAAuB,QAAQ,MAAM;CAC1D,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,0BAA0B,QAAiC;AACzE,KAAI,UAAU,OACZ,QAAO;AAGT,KAAI,EAAE,UAAU,QACd,QAAO;CAGT,MAAM,UAAU,aAAa,OAAO;AACpC,QAAO,UAAU,QAAQ,OAAO,GAAG;;AASrC,SAAgB,uBACd,OAC4B;AAC5B,KAAI,MAAM,OAAO,MACf,QAAO;AAOT,QAAO;EAAE,OAJK,0BAA0B,MAAM,MAAM;EAIpC,MAHH,kBAAkB,MAAM,MAAM;EAGrB,mBAFI,qBAAqB,MAAM,MAAM;EAElB;;;;;ACzE3C,IAAa,eAAb,MAA0B;CACxB,AAAiB;CACjB,AAAiB;CACjB,AAAiB,mBAAmB,IAAI,iBAAiB;CACzD,AAAiB;CACjB,AAAQ,sBAA2C,EAAE;CAErD,YAAY,YAA8B;EACxC,MAAM,SAAS,IAAI,cAAc;AAEjC,OAAK,QAAQ,IAAI,WADJ,OAAO,MAAM,WAAW,CACJ;AACjC,OAAK,oBAAoB,IAAI,iBAAiB,KAAK,MAAM;AAEzD,OAAK,sBAAsB,KAAK,qBAC9B,OAAO,oBAAoB,CAC5B;AAED,OAAK,QAAQ,IAAI,WAAW,KAAK,MAAM;AAEvC,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,AAAQ,qBACN,SACqB;EACrB,MAAM,SAA8B,EAAE;AAEtC,OAAK,MAAM,EAAE,QAAQ,gBAAgB,SAAS;GAC5C,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,OAAI,KAAK,QAAQ,CACf;AAGF,OAAI;IACF,MAAM,UAAU,IAAI,cAAc,KAAK,OAAO,QAAQ,WAAW;AACjE,SAAK,WAAW,QAAQ;AACxB,SAAK,MAAM,gBAAgB,QAAQ,QAAQ;YACpC,OAAO;IACd,MAAM,UAAU,KAAK,oBAAoB,MAAM;AAC/C,WAAO,KAAK;KAAE;KAAQ;KAAY;KAAS,CAAC;;;AAIhD,SAAO;;CAGT,AAAQ,oBAAoB,OAAwB;AAClD,MAAI,iBAAiB,aACnB,QAAO,MAAM;AAEf,MAAI,iBAAiB,MACnB,QAAO,MAAM;AAEf,SAAO;;CAGT,IAAW,OAAmB;AAC5B,SAAO,KAAK;;CAGd,IAAW,OAAmB;AAC5B,SAAO,KAAK;;CAGd,AAAO,OAAmB;AACxB,SAAO,KAAK,MAAM,MAAM;;CAG1B,AAAO,SAAS,QAA4B;AAC1C,SAAO,KAAK,MAAM,SAAS,OAAO;;CAGpC,AAAO,aAAqB;AAC1B,SAAO,KAAK,MAAM,YAAY;;CAGhC,AAAO,qBAAqB,QAAoC;AAC9D,SAAO,KAAK,MAAM,2BAA2B,OAAO;;CAGtD,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,SAAS;;CAG7B,IAAW,UAAmB;EAC5B,MAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,MAAI,KAAK,QAAQ,CACf,QAAO;AAET,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,YAAY,CAAC,SAAS;AAEpC,SAAO;;CAGT,IAAW,mBAA+C;AACxD,SAAO,KAAK,iBAAiB,SAAS,KAAK,MAAM,MAAM,CAAC;;CAG1D,AAAO,mBAA6C;EAClD,MAAM,kBAAkB,KAAK,kBAAkB,UAAU;AAOzD,SAAO,CAAC,GANsC,KAAK,oBAAoB,KACpE,OAAO;GACN,QAAQ,EAAE;GACV,SAAS,EAAE;GACZ,EACF,EACuB,GAAG,gBAAgB;;CAG7C,AAAO,cAAoB;AACzB,OAAK,MAAM,aAAa;;CAG1B,AAAO,SAAe;EACpB,MAAM,aAAa,KAAK,MAAM,eAAe;EAC7C,MAAM,SAAS,IAAI,cAAc;EACjC,MAAM,OAAO,OAAO,MAAM,WAAW;AAErC,OAAK,MAAM,mBAAmB;AAC9B,OAAK,MAAM,YAAY,KAAK;AAC5B,OAAK,sBAAsB,KAAK,qBAC9B,OAAO,oBAAoB,CAC5B;AAED,OAAK,MAAM,aAAa;;CAG1B,AAAO,aAA4B;AACjC,SAAO,KAAK,MAAM,YAAY;;CAGhC,AAAO,iBAAmC;AACxC,SAAO,KAAK,MAAM,kBAAkB;;CAGtC,AAAO,YAAY,YAAoB,UAA2B;AAChE,SAAO,KAAK,MAAM,YAAY,YAAY,SAAS;;CAGrD,AAAO,mBAAmB,QAAyB;AACjD,SAAO,KAAK,MAAM,mBAAmB,OAAO;;CAG9C,AAAO,SAAS,QAAgB,gBAA8B;AAC5D,MAAI,CAAC,KAAK,YAAY,QAAQ,eAAe,CAC3C;AAEF,OAAK,MAAM,SAAS,QAAQ,eAAe;;CAG7C,AAAO,WAAW,QAAgB,SAAuB;AACvD,OAAK,MAAM,WAAW,QAAQ,QAAQ;;CAGxC,AAAO,mBACL,QACA,UACM;EACN,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,CACf;EAEF,MAAM,cAAc,KAAK,UAAU;AACnC,OAAK,YAAY;GACf,aACE,iBAAiB,WACb,SAAS,eAAe,SACxB,YAAY;GAClB,YACE,gBAAgB,WAAW,SAAS,aAAa,YAAY;GAChE,CAAC;;CAGJ,AAAO,mBACL,QACA,OACM;EACN,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,CACf;AAEF,OAAK,gBAAgB,MAAM;;CAG7B,AAAO,SAAS,UAAkB,MAA0B;EAC1D,MAAM,SAAS,KAAK,MAAM,SAAS,SAAS;AAC5C,MAAI,OAAO,QAAQ,IAAI,CAAC,OAAO,UAAU,CACvC,QAAO;EAET,MAAM,UAAU,YAAY,OAAO,KAAK;AACxC,OAAK,MAAM,WAAW,UAAU,QAAQ;AACxC,SAAO;;CAGT,AAAO,WAAW,QAAyB;AAEzC,MADa,KAAK,MAAM,SAAS,OAAO,CAC/B,QAAQ,CACf,QAAO;EAET,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACtC,MAAI,KAAK,SAAS,CAChB,QAAO;AAET,OAAK,MAAM,aAAa,KAAK;AAC7B,SAAO;;CAGT,AAAO,YACL,QACA,SACsB;AAEtB,MADoB,KAAK,MAAM,SAAS,OAAO,CAC/B,QAAQ,CACtB,QAAO;EAET,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACtC,MAAI,KAAK,SAAS,CAChB,QAAO;AAET,OAAK,MAAM,UAAU,MAAM,QAAQ;AACnC,OAAK,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,CAAC;AACjD,SAAO;GACL,gBAAgB;GAChB,WAAW,QAAQ,IAAI;GACxB;;CAGH,AAAO,YAAY,QAAsC;EACvD,MAAM,cAAc,KAAK,MAAM,SAAS,OAAO;AAC/C,MAAI,YAAY,QAAQ,CACtB,QAAO;AAET,MAAI,YAAY,SAAS,CACvB,QAAO;EAET,MAAM,OAAO,KAAK,MAAM,OAAO,OAAO;AACtC,MAAI,KAAK,SAAS,CAChB,QAAO;EAET,MAAM,OAAO,YAAY,MAAM;EAC/B,MAAM,YAAY,YAAY,MAAM,MAAM,YAAY;AACtD,OAAK,MAAM,UAAU,MAAM,UAAU;AACrC,cAAY,QAAQ,GAAG;AACvB,OAAK,MAAM,iBAAiB,QAAQ,UAAU,IAAI,CAAC;AACnD,SAAO;GACL,gBAAgB;GAChB,WAAW,UAAU,IAAI;GAC1B;;CAGH,AAAO,gBAAgB,SAA2C;EAChE,MAAM,cAAc,KAAK,MAAM,MAAM;AACrC,MAAI,YAAY,QAAQ,CACtB,QAAO;EAET,MAAM,QAAQ,YAAY,IAAI;AAC9B,UAAQ,QAAQ,YAAY,MAAM,CAAC;AACnC,OAAK,MAAM,YAAY,QAAQ;AAC/B,OAAK,MAAM,iBAAiB,OAAO,QAAQ,IAAI,CAAC;AAChD,SAAO;GACL,gBAAgB;GAChB,WAAW,QAAQ,IAAI;GACxB;;CAGH,AAAO,kBAAwC;EAC7C,MAAM,cAAc,KAAK,MAAM,MAAM;AACrC,MAAI,YAAY,QAAQ,IAAI,YAAY,SAAS,CAC/C,QAAO;EAET,MAAM,QAAQ,YAAY,IAAI;EAC9B,MAAM,OAAO,YAAY,MAAM;EAC/B,MAAM,YAAY,YAAY,MAAM,MAAM,YAAY;AACtD,cAAY,QAAQ,GAAG;AACvB,OAAK,MAAM,YAAY,UAAU;AACjC,OAAK,MAAM,iBAAiB,OAAO,UAAU,IAAI,CAAC;AAClD,SAAO;GACL,gBAAgB;GAChB,WAAW,UAAU,IAAI;GAC1B;;CAGH,AAAO,iBAAiB,QAAgB,SAA0B;EAChE,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,IAAI,KAAK,UAAU,KAAK,SAAS,OAChD,QAAO;AAET,EAAC,KAAoB,cAAc,WAAW,OAAU;AACxD,SAAO;;CAGT,AAAO,cACL,QACA,YACqB;EACrB,MAAM,OAAO,KAAK,MAAM,SAAS,OAAO;AACxC,MAAI,KAAK,QAAQ,CACf,QAAO;GAAE,SAAS;GAAO,OAAO;GAAkB;AAEpD,MAAI;GACF,MAAM,UAAU,aACZ,IAAI,cAAc,KAAK,OAAO,QAAQ,WAAW,GACjD;AACJ,QAAK,WAAW,QAAQ;AACxB,OAAI,QACF,MAAK,MAAM,gBAAgB,QAAQ,QAAQ;OAE3C,MAAK,MAAM,kBAAkB,OAAO;AAEtC,QAAK,sBAAsB,KAAK,oBAAoB,QACjD,MAAM,EAAE,WAAW,OACrB;AACD,UAAO,EAAE,SAAS,MAAM;WACjB,OAAO;AAGd,UAAO;IAAE,SAAS;IAAO,OADvB,iBAAiB,eAAe,MAAM,UAAU,OAAO,MAAM;IACjB;;;CAIlD,AAAO,iBAAiB,MAA0B;AAChD,SAAO,YAAY,OAAO,KAAK;;CAGjC,AAAO,iBAAiB,MAA0B;AAChD,SAAO,YAAY,OAAO,KAAK;;;;;;ACrWnC,IAAY,wDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGF,SAAgB,mBACd,QACA,MACmB;AACnB,SAAQ,QAAR;EACE,KAAK,cAAc,OACjB,QAAO,YAAY,OAAO,KAAK;EACjC,KAAK,cAAc,OACjB,QAAO,YAAY,OAAO,KAAK;EACjC,KAAK,cAAc,QACjB,QAAO,YAAY,QAAQ,KAAK;EAClC,KAAK,cAAc,OACjB,QAAO,YAAY,OAAO,KAAK;EACjC,KAAK,cAAc,MACjB,QAAO,YAAY,MAAM,MAAM,YAAY,OAAO,GAAG,CAAC;EACxD,KAAK,cAAc,iBACjB,QAAO,YAAY,OAAO,MAAM,EAAE,YAAY,IAAI,CAAC;EACrD,KAAK,cAAc,KACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,MAAM,CAAC;EAC9D,KAAK,cAAc,MACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,OAAO,CAAC;EAC/D,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,eACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,gBAAgB,CAAC;EACxE,KAAK,cAAc,aACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,cAAc,CAAC;EACtE,KAAK,cAAc,QACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,SAAS,CAAC;EACjE,KAAK,cAAc,cACjB,QAAO,YAAY,IAAI,MAAM,EAAE,MAAM,gBAAgB,eAAe,CAAC;EACvE,KAAK,cAAc,SACjB,QAAO,YAAY,OAAO,MAAM,EAAE,kBAAkB,iBAAiB,CAAC;EACxE,QACE,QAAO;;;AA0Bb,MAAM,eAAiC;CACrC;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAS,OAAO;EAAW;CAC/C;EAAE,IAAI,cAAc;EAAQ,OAAO;EAAU;CAC7C;EAAE,IAAI,cAAc;EAAO,OAAO;EAAS;CAC3C;EAAE,IAAI,cAAc;EAAkB,OAAO;EAAe;CAC7D;AAED,MAAM,iBAAmC,CACvC;CACE,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO,CACL;EAAE,IAAI,cAAc;EAAM,OAAO,cAAc,gBAAgB,KAAK;EAAE,EACtE;EAAE,IAAI,cAAc;EAAU,OAAO;EAAY,CAClD;CACF,CACF;AAED,MAAM,sBAAwC,CAC5C;CACE,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO;EACL;GAAE,IAAI,cAAc;GAAO,OAAO,cAAc,gBAAgB,MAAM;GAAE;EACxE;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GACnD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GAClD,iBAAiB;GAClB;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GACnD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,eAAe;GACrD;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,aAAa;GAClD,iBAAiB;GAClB;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,QAAQ;GAC9C;EACD;GACE,IAAI,cAAc;GAClB,OAAO,cAAc,gBAAgB,cAAc;GACpD;EACF;CACF,CACF;AAED,MAAa,iBAA8B;CACzC;EAAE,IAAI;EAAS,SAAS;EAAc,iBAAiB;EAAM;CAC7D;EAAE,IAAI;EAAW,SAAS;EAAgB,iBAAiB;EAAM;CACjE;EAAE,IAAI;EAAiB,SAAS;EAAqB;CACtD;;;;ACrJD,MAAa,aAA+B;CAC1C,MAAM,mBAAmB;CACzB,YAAY;EACV,QAAQ;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACxE,QAAQ;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACxE,KAAK;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACrE,UAAU;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI;EAC1D,MAAM;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EACtE,WAAW;GACT,MAAM,mBAAmB;GACzB,SAAS;GACT,UAAU;GACX;EACD,UAAU;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAI,UAAU;GAAM;EAC1E,MAAM;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAG,UAAU;GAAM;EACrE,OAAO;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAG,UAAU;GAAM;EACtE,QAAQ;GAAE,MAAM,mBAAmB;GAAQ,SAAS;GAAG,UAAU;GAAM;EACxE;CACD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,sBAAsB;CACvB;AAED,MAAa,uBAAyD,GACnE,gBAAgB,OAAO,YACzB;AAED,MAAa,qBAAqB,QAAyC;AACzE,KAAI,OAAO,OAAO,sBAAsB,IAAI,CAC1C,QAAO,qBAAqB,QAAQ;AAEtC,QAAO;;AAGT,MAAa,mBAAmB,QAAyB;AACvD,QAAO,OAAO,OAAO,sBAAsB,IAAI;;;;;ACtBjD,MAAM,WAAuB,EAAE;AAE/B,SAAgB,gBACd,MACA,SACM;AACN,UAAS,QAAQ;;AAGnB,SAAgB,aACd,MACA,QACA,QACA,SAAkB,OAClB,aAAsB,OACd;AACR,KAAI,KAAK,UAAU,EAAE;EACnB,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,8EACD;AAEH,SAAO,IAAI,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,WAAW;;AAG9D,KAAI,KAAK,SAAS,EAAE;EAClB,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,4EACD;AAEH,SAAO,IAAI,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,WAAW;;AAG9D,KAAI,KAAK,OAAO,EAAE;EAChB,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,wEACD;AAEH,SAAO,IAAI,QACT,MACA,QACA,QACA,QACA,WACD;;AAGH,KAAI,KAAK,YAAY,KAAK,QAAW;EACnC,MAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QACH,OAAM,IAAI,MACR,sFACD;AAEH,SAAO,IAAI,QACT,MACA,QACA,QACA,QACA,WACD;;CAGH,MAAM,UAAU,SAAS;AACzB,KAAI,CAAC,QACH,OAAM,IAAI,MACR,oFACD;AAEH,QAAO,IAAI,QACT,MACA,QACA,QACA,QACA,WACD;;;;;ACrGH,IAAsB,aAAtB,MAAiC;CAC/B,AAAO,iBAAiB;CACxB,AAAO,kBAAkB;CACzB,AAAO,sBAAsB;CAE7B,YACE,AAAmB,OACnB,AAAmB,SACnB,AAAmB,UAAmB,OACtC,AAAmB,cAAuB,OAC1C;EAJmB;EACA;EACA;EACA;AAEnB,2BAAe,MAAM;GACnB,gBAAgBC;GAChB,iBAAiBA;GACjB,qBAAqBA;GACrB,QAAQC;GACR,MAAMA;GACN,MAAMA;GACN,MAAMA;GACN,OAAOA;GACP,WAAWA;GACX,YAAYA;GACZ,gBAAgBA;GAChB,wBAAwBA;GACxB,eAAeA;GACf,UAAUA;GACV,SAASA;GACT,aAAaA;GACb,UAAUA;GACV,UAAUA;GACV,WAAWA;GACX,kBAAkBA;GAClB,UAAUA;GACV,gBAAgBA;GAChB,cAAcA;GACd,aAAaA;GACb,YAAYA;GACZ,SAASA;GACT,mBAAmBA;GACnB,WAAWA;GACX,qBAAqBA;GACrB,cAAcA;GACd,sBAAsBA;GACtB,iBAAiBA;GACjB,UAAUA;GACV,cAAcA;GACd,SAASA;GACT,mBAAmBA;GACnB,YAAYA;GACZ,YAAYC,YAAO;GACnB,aAAaA,YAAO;GACpB,iBAAiBA,YAAO;GACxB,QAAQA,YAAO;GACf,gBAAgBA,YAAO;GACvB,eAAeA,YAAO;GACtB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACnB,iBAAiBA,YAAO;GACzB,CAAC;;CAGJ,IAAW,aAAsB;AAC/B,SAAO,KAAK;;CAGd,IAAW,OAAmB;AAC5B,SAAO,KAAK;;CAGd,IAAW,SAAiB;AAC1B,SAAO,KAAK,MAAM,IAAI;;CAGxB,IAAW,SAAkB;AAC3B,SAAO,KAAK;;CAGd,IAAW,OAAe;AACxB,MAAI,KAAK,QACP,QAAO,KAAK,QAAQ;AAEtB,SAAO,KAAK,MAAM,MAAM;;CAG1B,IAAW,OAAe;AACxB,SAAO,KAAK,MAAM,MAAM;;CAG1B,IAAW,OAAe;AACxB,MAAI,KAAK,MAAM,OAAO,CACpB,QAAO;AAET,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,QAAgB;AACzB,MAAI,KAAK,MAAM,OAAO,EAAE;GACtB,MAAM,MAAM,KAAK,MAAM,KAAK;AAC5B,UAAO,cAAc,IAAI,IAAI;;AAE/B,MAAI,KAAK,MAAM,UAAU,CACvB,QAAO;AAET,MAAI,KAAK,MAAM,SAAS,CACtB,QAAO;AAET,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,YAAqB;AAC9B,SAAO,KAAK;;CAGd,IAAW,aAAsB;AAC/B,SAAO,KAAK;;CAGd,IAAW,iBAA0B;AACnC,SAAO,KAAK;;CAGd,IAAW,yBAAkC;AAC3C,SACE,CAAC,KAAK,kBAAkB,CAAC,KAAK,mBAAmB,CAAC,KAAK;;CAI3D,AAAO,WAAW,OAAsB;AACtC,OAAK,iBAAiB;;CAGxB,AAAO,YAAY,OAAsB;AACvC,OAAK,kBAAkB;;CAGzB,AAAO,gBAAgB,OAAsB;AAC3C,OAAK,sBAAsB;;CAG7B,IAAW,gBAAyB;AAClC,SAAO;;CAGT,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAW,UAAmB;AAC5B,SAAO,KAAK,MAAM,SAAS;;CAG7B,IAAW,cAAuB;AAChC,SAAO,KAAK,MAAM,aAAa;;CAGjC,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU,KAAK,SAAS;;CAG5C,IAAW,WAAoB;AAC7B,SAAO,KAAK,MAAM,UAAU,KAAK,SAAS;;CAG5C,IAAW,YAAqB;AAC9B,SAAO,KAAK,MAAM,UAAU,KAAK,SAAS;;CAG5C,IAAW,mBAA4B;AACrC,SAAO,CAAC,KAAK;;CAGf,IAAW,WAAoB;AAC7B,SAAO,CAAC,KAAK;;CAGf,IAAW,iBAA0B;AACnC,SAAO,QAAQ,KAAK,MAAM,UAAU,CAAC,YAAY;;CAGnD,IAAW,eAAwB;AACjC,SAAO,KAAK,MAAM,UAAU,CAAC,cAAc;;CAG7C,IAAW,cAAsB;AAC/B,SAAO,KAAK,MAAM,UAAU,CAAC,eAAe;;CAG9C,IAAW,aAAsB;AAC/B,SAAO;;CAGT,IAAW,UAAkB;AAC3B,SAAO;;CAGT,IAAW,oBAAwC;AACjD,SAAO,EAAE;;CAGX,IAAW,YAAqB;AAC9B,SAAO;;CAGT,IAAW,sBAAqC;AAC9C,SAAO;;CAGT,IAAW,eAAwB;CAInC,IAAW,uBAA+B;AACxC,SAAO;;CAGT,IAAW,kBAAiC;AAC1C,MAAI,KAAK,WAAW,KAAK,QAAQ,aAC/B,QAAO,KAAK,QAAQ;AAItB,SAFe,KAAK,QAAQ,OAAO,iBACd,MAAM,MAAM,EAAE,WAAW,KAAK,OAAO,EAC5C,WAAW;;CAG3B,IAAW,WAAoB;AAC7B,SAAO,KAAK,oBAAoB;;CAGlC,IAAW,eAA8B;AACvC,SAAO,KAAK;;CAGd,IAAW,UAAmB;AAC5B,MAAI,KAAK,eAAe,KAAK,WAAW,CAAC,KAAK,MAAM,MAAM,CACxD,QAAO;AAET,SAAO,KAAK,QAAQ,OAAO,mBAAmB,KAAK,OAAO;;CAG5D,IAAW,oBAA6B;AACtC,SAAO;;CAGT,AAAO,OAAO,SAAuB;AACnC,MAAI,YAAY,KAAK,KACnB,KAAI,KAAK,QACP,MAAK,QAAQ,WAAW,QAAQ;MAEhC,MAAK,QAAQ,OAAO,WAAW,KAAK,QAAQ,QAAQ;;CAK1D,AAAO,eAAe,OAAqB;AACzC,OAAK,QAAQ,OAAO,mBAAmB,KAAK,QAAQ,EAAE,aAAa,OAAO,CAAC;;CAG7E,AAAO,cAAc,OAAsB;AACzC,OAAK,QAAQ,OAAO,mBAAmB,KAAK,QAAQ,EAAE,YAAY,OAAO,CAAC;;CAG5E,AAAO,WAAW,aAA2B;CAI7C,AAAO,WAAW,QAAsB;CAIxC,AAAO,kBAAwB;AAC7B,OAAK,WAAW,MAAM;AACtB,MAAI,CAAC,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,QAC9B,MAAK,YAAY;;CAIrB,AAAO,cAAc,YAA6B;AAChD,SAAO,KAAK,QAAQ,OAAO,YAAY,YAAY,KAAK,OAAO;;CAGjE,AAAO,SAAe;AACpB,OAAK,YAAY;;;;;;AChRrB,IAAa,kBAAb,cAAqC,WAAW;CAC9C,AAAO,oBAAmC;CAC1C,AAAO,oBAAmC;CAE1C,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,2BAAe,MAAM;GACnB,mBAAmBC;GACnB,mBAAmBA;GACnB,YAAYC;GACZ,SAASA;GACT,cAAcA;GACd,sBAAsBA;GACtB,cAAcC;GACd,mBAAmBD;GACnB,WAAWA;GACX,qBAAqBA;GACrB,YAAYA;GACZ,YAAYA;GACZ,YAAYE,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;;CAGJ,IAAW,aAAsB;AAC/B,SAAO,KAAK,MAAM,YAAY;;CAGhC,IAAW,UAAkB;AAC3B,MAAI,KAAK,sBAAsB,KAC7B,QAAO,KAAK;EAEd,MAAM,UAAU,KAAK,MAAM,SAAS;AACpC,MAAI,CAAC,QACH,QAAO;AAET,SAAO,IAAI,kBACT,KAAK,QAAQ,OAAO,MACpB,KAAK,QACL,QACD,CAAC,WAAW;;CAGf,IAAW,eAA+B;AACxC,SAAO,KAAK,MAAM,cAAc;;CAGlC,IAAW,uBAA+B;EACxC,MAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,OACZ,QAAO;AAET,SAAO,OAAO,MAAM;;CAGtB,IAAW,eAA8B;AACvC,MAAI,KAAK,kBACP,QAAO,KAAK;AAId,SAFe,KAAK,QAAQ,OAAO,kBAAkB,CAChC,MAAM,MAAM,EAAE,WAAW,KAAK,OAAO,EAC5C,WAAW;;CAG3B,IAAoB,WAAoB;AACtC,SAAO,KAAK,oBAAoB,QAAQ,KAAK,iBAAiB;;CAGhE,IAAoB,eAA8B;AAChD,SAAO,KAAK,mBAAmB,KAAK,gBAAgB;;CAGtD,IAAW,oBAAwC;AACjD,SAAO,KAAK,QAAQ,OAAO,qBAAqB,KAAK,OAAO;;CAG9D,IAAW,YAAqB;AAC9B,SAAO,KAAK,YAAY,QAAQ,KAAK,kBAAkB,WAAW;;CAGpE,IAAW,sBAAqC;EAC9C,MAAM,aAAa,KAAK;AACxB,MAAI,WAAW,WAAW,EACxB,QAAO;AAGT,SAAO,qBADY,WAAW,KAAK,MAAM,EAAE,UAAU,CAAC,KAAK,KAAK;;CAIlE,AAAO,WAAW,YAA0B;AAC1C,OAAK,oBAAoB,cAAc;EACvC,MAAM,SAAS,KAAK,QAAQ,OAAO,cACjC,KAAK,QACL,cAAc,OACf;AACD,MAAI,OAAO,QACT,MAAK,oBAAoB;WAChB,OAAO,MAChB,MAAK,oBAAoB,OAAO;;CAIpC,AAAO,WAAW,UAAwB;EACxC,MAAM,QAAQ,kBAAkB,UAAU,KAAK,MAAM,UAAU,CAAC;AAChE,OAAK,QAAQ,OAAO,mBAAmB,KAAK,QAAQ,MAAM;;CAG5D,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,mBAAmB,gBAAgB;;;;ACxInD,IAAa,cAAb,cAAiC,WAAW;CAC1C,AAAO;CACP,AAAO,aAA4B;CAEnC,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,OAAK,mBAAmB,OAAO,qBAAqB,CAAC;AAErD,2BAAe,MAAM;GACnB,kBAAkBC;GAClB,YAAYA,gBAAW;GACvB,aAAaC;GACb,SAASA;GACT,iBAAiBC,YAAO;GACxB,iBAAiBA,YAAO;GACxB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;AAEF,OAAK,aAAa;;CAGpB,AAAQ,cAAoB;EAC1B,MAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,CAAC,MAAM,QAAQ,CACjB,MAAK,aAAa,aAAa,OAAO,KAAK,SAAS,KAAK;;CAI7D,IAAoB,gBAAyB;AAC3C,SAAO,CAAC,KAAK;;CAGf,IAAW,cAAuB;AAChC,SAAO,KAAK;;CAGd,AAAO,kBAAwB;AAC7B,OAAK,mBAAmB,CAAC,KAAK;;CAGhC,IAAW,UAAyB;AAClC,SAAO,KAAK;;CAGd,AAAO,gBAAgB,QAAsB;AAC3C,MAAI,CAAC,KAAK,WACR;EAGF,MAAM,eAAe,KAAK,MAAM,OAAO;AACvC,MAAI,aAAa,QAAQ,CACvB;EAGF,MAAM,UAAU,KAAK,QAAQ,mBAAmB,QAAQ,GAAG;AAC3D,MAAI,CAAC,QACH;AAIF,MADe,KAAK,QAAQ,OAAO,YAAY,aAAa,IAAI,EAAE,QAAQ,CAExE,MAAK,aAAa,aAAa,SAAS,KAAK,SAAS,KAAK;;CAI/D,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,eAAe,YAAY;;;;ACxF3C,IAAa,mBAAb,cAAsC,WAAW;CAC/C,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,2BAAe,MAAM;GACnB,OAAOC;GACP,iBAAiBC;GACjB,eAAeC,YAAO;GACtB,kBAAkBA,YAAO;GACzB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;;CAGJ,IAAoB,QAAgB;AAClC,SAAO;;CAGT,IAAW,kBAA0B;AACnC,SAAO,KAAK,MAAM,YAAY,IAAI;;CAGpC,AAAO,cAAc,SAA8B;AACjD,OAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,WAAW,GAAG;;CAGlE,MAAa,mBAAkC;EAC7C,MAAM,UAAU,MAAM,KAAK,QAAQ,kBAAkB;AACrD,MAAI,YAAY,KACd,MAAK,cAAc,QAAQ;;CAI/B,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,oBAAoB,iBAAiB;;;;ACrDrD,IAAa,YAAb,cAA+B,WAAW;CACxC,AAAO,mBAA4B;CACnC,AAAO,eAAyB,EAAE;CAClC,AAAiB;CAEjB,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,OAAK,gBAAgB,gBAAgB,KAAK,KAAK,CAAC;AAEhD,2BAAe,MAAM;GACnB,kBAAkBC;GAClB,cAAcA,gBAAW;GACzB,aAAaC;GACb,UAAUA;GACV,iBAAiBC,YAAO;GACxB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;AAEF,MAAI,KAAK,cACP,MAAK,sBAAsB;;CAI/B,AAAQ,uBAA6B;EACnC,MAAM,iBAAiB,kBAAkB,KAAK,MAAM,KAAK,CAAC;AAC1D,MAAI,CAAC,eACH;AAMF,OAAK,eAHU,IAAI,cAAc,CACL,MAAM,eAAe,CAG9C,YAAY,CACZ,KAAK,UAAU,aAAa,OAAO,KAAK,SAAS,MAAM,OAAO,KAAK,CAAC;;CAGzE,IAAW,MAAc;AACvB,SAAO,KAAK,MAAM,KAAK;;CAGzB,IAAoB,gBAAyB;AAC3C,SAAO,KAAK;;CAGd,IAAW,cAAuB;AAChC,SAAO,KAAK;;CAGd,AAAO,kBAAwB;AAC7B,OAAK,mBAAmB,CAAC,KAAK;;CAGhC,IAAW,WAA8B;AACvC,SAAO,KAAK;;CAGd,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;;AAKhD,gBAAgB,aAAa,UAAU;;;;AC/DvC,MAAM,8BAA8B;AAgBpC,IAAa,iBAAb,MAA4B;CAC1B,AAAiB;CACjB,AAAQ;CAER,AAAQ;CACR,AAAQ;CACR,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ,WAAW;CACnB,AAAQ,YAAgC,mBAAmB;CAC3D,AAAQ,uBAAuB;CAC/B,AAAQ,wBAA8C;CAEtD,YAAY,YAA8B,UAA+B,EAAE,EAAE;AAC3E,OAAK,UAAU,IAAI,aAAa,WAAW;AAE3C,OAAK,WAAW,QAAQ,WAAW;AACnC,OAAK,kBAAkB,KAAK;AAC5B,OAAK,QAAQ,QAAQ,QAAQ;AAC7B,OAAK,aAAa,QAAQ,aAAa;AACvC,OAAK,YAAY,QAAQ,YAAY;AACrC,OAAK,sBAAsB,QAAQ,sBAAsB;EAEzD,MAAM,iBAAiB,QAAQ,0BAA0B;EACzD,MAAM,aACJ,QAAQ,sBAAsB;EAChC,MAAM,YAAY,KAAK,QAAQ,YAAY;AAC3C,OAAK,qBAAqB,kBAAkB,aAAa;AAEzD,OAAK,cAAc,aAAa,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,KAAK;AAEtE,+BAAmB,MAAM,EAAE,EAAE,EAAE,UAAU,MAAM,CAAC;;CAGlD,IAAW,OAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,SAAuB;AAChC,SAAO,KAAK;;CAGd,IAAW,oBAA6B;AACtC,SAAO,KAAK;;CAGd,IAAW,UAAkB;AAC3B,SAAO,KAAK;;CAGd,IAAW,iBAAyB;AAClC,SAAO,KAAK;;CAGd,IAAW,mBAA4B;AACrC,SAAO,KAAK,aAAa,KAAK;;CAGhC,IAAW,eAA8B;AACvC,MAAI,CAAC,iBAAiB,KAAK,SAAS,CAClC,QAAO;AAET,SAAO;;CAGT,AAAO,WAAW,OAAqB;AACrC,OAAK,WAAW;;CAGlB,IAAW,UAAmB;AAC5B,SAAO,KAAK;;CAGd,AAAO,WAAW,OAAsB;AACtC,OAAK,WAAW;;CAGlB,IAAW,WAA+B;AACxC,SAAO,KAAK;;CAGd,AAAO,YAAY,MAAgC;AACjD,OAAK,YAAY;;CAGnB,IAAW,sBAA+B;AACxC,SAAO,KAAK;;CAGd,AAAO,oBAA0B;AAC/B,OAAK,uBAAuB;;CAG9B,AAAO,qBAA2B;AAChC,OAAK,uBAAuB;;CAG9B,IAAW,uBAA6C;AACtD,SAAO,KAAK;;CAGd,AAAO,wBAAwB,MAAkC;AAC/D,OAAK,wBAAwB;;CAG/B,IAAW,aAAqB;AAC9B,SAAO,KAAK;;CAGd,IAAW,UAAmB;AAC5B,SAAO,KAAK,QAAQ,WAAW,KAAK;;CAGtC,IAAW,UAAmB;AAC5B,SAAO,KAAK,QAAQ;;CAGtB,IAAW,oBAA6B;AACtC,SAAO,CAAC,KAAK,WAAW,CAAC,KAAK;;CAGhC,IAAW,eAAuB;AAChC,SAAO,KAAK,YAAY,CAAC;;CAG3B,IAAW,oBAA4B;AACrC,SAAO,KAAK,gBAAgB,KAAK,mBAAmB,IAAI;;CAG1D,IAAW,mBAA+C;AACxD,SAAO,KAAK,QAAQ;;CAGtB,IAAW,gBAA0C;EACnD,MAAM,eAAe,KAAK,QAAQ,kBAAkB;EACpD,MAAM,cAAc,KAAK,0BAA0B,KAAK,YAAY;AACpE,SAAO,CAAC,GAAG,cAAc,GAAG,YAAY;;CAG1C,AAAQ,0BAA0B,QAA0C;EAC1E,MAAM,SAAmC,EAAE;AAE3C,MAAI,kBAAkB,mBAAmB,OAAO,kBAC9C,QAAO,KAAK;GACV,QAAQ,OAAO;GACf,WAAW,OAAO,QAAQ;GAC1B,SAAS,OAAO;GACjB,CAAC;AAGJ,MAAI,cAAc,UAAU,MAAM,QAAQ,OAAO,SAAS,CACxD,MAAK,MAAM,SAAS,OAAO,SACzB,QAAO,KAAK,GAAG,KAAK,0BAA0B,MAAM,CAAC;AAIzD,MAAI,aAAa,UAAU,OAAO,QAChC,QAAO,KAAK,GAAG,KAAK,0BAA0B,OAAO,QAAQ,CAAC;AAGhE,SAAO;;CAGT,IAAW,YAAqB;AAC9B,SACE,KAAK,iBAAiB,SAAS,KAC/B,KAAK,cAAc,SAAS,KAC5B,KAAK,iBAAiB;;CAI1B,AAAO,cAAoB;AACzB,OAAK,QAAQ,aAAa;AAC1B,OAAK,kBAAkB,KAAK;;CAG9B,AAAO,SAAe;AACpB,OAAK,QAAQ,QAAQ;AACrB,OAAK,WAAW,KAAK;AACrB,OAAK,cAAc,aAAa,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,KAAK;;CAGxE,AAAO,eAAe,QAAsB;EAC1C,MAAM,cAAc,KAAK,QAAQ,MAAM;AACvC,MAAI,YAAY,QAAQ,CACtB;AAGF,MAAI,WAAW,cAAc,SAAS,CAAC,YAAY,SAAS,EAAE;GAC5D,MAAM,SAAS,KAAK,QAAQ,iBAAiB;AAC7C,OAAI,OAEF,MAAK,cAAc,aADD,KAAK,QAAQ,SAAS,OAAO,UAAU,EACd,MAAM,MAAM,KAAK;AAE9D;;EAGF,MAAM,UAAU,KAAK,mBAAmB,QAAQ,YAAY,MAAM,CAAC;AACnE,MAAI,SAEF;OADe,KAAK,QAAQ,gBAAgB,QAAQ,CAElD,MAAK,cAAc,aAAa,SAAS,MAAM,MAAM,KAAK;;;CAKhE,MAAa,mBAA2C;AACtD,MAAI,CAAC,KAAK,oBACR,QAAO;AAET,SAAO,KAAK,qBAAqB;;CAGnC,MAAa,UAAyB;AACpC,MAAI,CAAC,KAAK,WACR;AAEF,OAAK,WAAW;AAChB,MAAI;AAEF,OADgB,MAAM,KAAK,YAAY,EAC1B;AACX,SAAK,aAAa;AAClB,SAAK,oBAAoB;;YAEnB;AACR,QAAK,WAAW;;;CAIpB,AAAO,SAAe;AACpB,OAAK,aAAa;;CAGpB,AAAO,aAA4B;AACjC,SAAO,KAAK,QAAQ,YAAY;;CAGlC,AAAO,iBAA8B;AACnC,SAAO,KAAK,QAAQ,YAAY,CAAC,KAAK,MAAM,EAAE,MAAM;;CAGtD,AAAO,iBAAmC;AACxC,SAAO,KAAK,QAAQ,gBAAgB;;CAGtC,AAAO,iBAA0B;AAC/B,SAAO,0BAA0B,KAAK,gBAAgB,CAAC;;CAGzD,AAAO,mBAAmB,QAAgB,MAAiC;AACzE,SAAO,mBAAmB,QAAQ,KAAK;;CAGzC,AAAO,UAAgB;;;;;ACnSzB,IAAa,eAAb,MAAa,qBAAqB,WAAW;CAC3C,AAAO;CACP,AAAO,eAAyB,EAAE;CAElC,YACE,MACA,QACA,AAAiB,SACjB,SAAkB,OAClB,aAAsB,OACtB;AACA,QAAM,MAAM,QAAQ,QAAQ,WAAW;EAJtB;AAMjB,OAAK,mBAAmB,OAAO,qBAAqB,CAAC;AAErD,2BAAe,MAAM;GACnB,kBAAkBC;GAClB,cAAcA,gBAAW;GACzB,aAAaC;GACb,UAAUA;GACV,eAAeA;GACf,iBAAiBC,YAAO;GACxB,aAAaA,YAAO;GACpB,gBAAgBA,YAAO;GACvB,iBAAiBA,YAAO;GACxB,cAAcA,YAAO;GACrB,YAAYA,YAAO;GACnB,YAAYA,YAAO;GACpB,CAAC;AAEF,OAAK,cAAc;;CAGrB,AAAQ,eAAqB;AAC3B,OAAK,eAAe,KAAK,MACtB,YAAY,CACZ,KAAK,UAAU,aAAa,OAAO,KAAK,SAAS,KAAK,CAAC;;CAG5D,IAAoB,gBAAyB;AAC3C,SAAO,CAAC,KAAK;;CAGf,IAAW,cAAuB;AAChC,SAAO,KAAK;;CAGd,AAAO,kBAAwB;AAC7B,OAAK,mBAAmB,CAAC,KAAK;;CAGhC,IAAW,WAA8B;AACvC,SAAO,KAAK;;CAGd,IAAW,gBAAyB;AAClC,SAAO,KAAK,MAAM,UAAU;;CAG9B,IAAoB,oBAA6B;AAC/C,SAAO;;CAGT,AAAO,YAAY,MAAoB;EACrC,MAAM,UAAU,KAAK,QAAQ,OAAO,SAAS,KAAK,QAAQ,KAAK;AAC/D,MAAI,CAAC,QAAQ,QAAQ,EAAE;GACrB,MAAM,UAAU,aAAa,SAAS,KAAK,SAAS,KAAK;AACzD,QAAK,aAAa,KAAK,QAAQ;;;CAInC,AAAO,eAAe,SAAuB;AAE3C,MADgB,KAAK,QAAQ,OAAO,WAAW,QAAQ,OAAO,EACjD;GACX,MAAM,QAAQ,KAAK,aAAa,QAAQ,QAAQ;AAChD,OAAI,SAAS,EACX,MAAK,aAAa,OAAO,OAAO,EAAE;;;CAKxC,AAAO,gBAAgB,SAAiB,QAAsB;EAC5D,MAAM,cAAc,QAAQ;AAC5B,MAAI,YAAY,QAAQ,CACtB;AAGF,MAAI,WAAW,cAAc,SAAS,CAAC,YAAY,SAAS,EAAE;GAC5D,MAAM,SAAS,KAAK,QAAQ,OAAO,YAAY,QAAQ,OAAO;AAC9D,OAAI,QAAQ;IAEV,MAAM,QAAQ,aADI,KAAK,QAAQ,OAAO,SAAS,OAAO,UAAU,EAC1B,KAAK,SAAS,KAAK;AACzD,SAAK,kBAAkB,SAAS,MAAM;;AAExC;;EAGF,MAAM,UAAU,KAAK,QAAQ,mBAAmB,QAAQ,YAAY,MAAM,CAAC;AAC3E,MAAI,SAEF;OADe,KAAK,QAAQ,OAAO,YAAY,QAAQ,QAAQ,QAAQ,EAC3D;IACV,MAAM,QAAQ,aAAa,SAAS,KAAK,SAAS,KAAK;AACvD,SAAK,kBAAkB,SAAS,MAAM;;;;CAK5C,AAAQ,kBAAkB,OAAe,OAAqB;EAC5D,MAAM,QAAQ,KAAK,aAAa,QAAQ,MAAM;AAC9C,MAAI,SAAS,EACX,MAAK,aAAa,SAAS;;CAI/B,AAAO,aAAa,YAA0B;AAE5C,MADiB,KAAK,QAAQ,OAAO,SAAS,WAAW,CAC5C,QAAQ,CACnB;AAGF,OAAK,QAAQ,OAAO,SAAS,YAAY,KAAK,OAAO;EAErD,MAAM,YAAY,KAAK,QAAQ,OAAO,SAAS,WAAW;AAC1D,MAAI,CAAC,UAAU,QAAQ,EAAE;GACvB,MAAM,SAAS,KAAK,QAAQ;AAC5B,OAAI,kBAAkB,aACpB,QAAO,yBAAyB,WAAW;GAE7C,MAAM,UAAU,aAAa,WAAW,KAAK,SAAS,KAAK;AAC3D,QAAK,aAAa,KAAK,QAAQ;;;CAInC,AAAO,aAAmB;AACxB,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,KAAK;;CAIrC,AAAO,WAAW,QAAsB;AACtC,MAAI,KAAK,QACP,MAAK,QAAQ,eAAe,OAAO;WAC1B,KAAK,QACd,MAAK,QAAQ,gBAAgB,MAAM,OAAO;;CAI9C,AAAO,yBAAyB,QAAyB;EACvD,MAAM,QAAQ,KAAK,aAAa,WAAW,OAAO,GAAG,WAAW,OAAO;AACvE,MAAI,SAAS,GAAG;AACd,QAAK,aAAa,OAAO,OAAO,EAAE;AAClC,UAAO;;AAET,OAAK,MAAM,SAAS,KAAK,aACvB,KAAI,iBAAiB,cAEnB;OADc,MAAM,yBAAyB,OAAO,CAElD,QAAO;;AAIb,SAAO;;;AAIX,gBAAgB,gBAAgB,aAAa;;;;AC3J7C,MAAa,6CACV,EACC,WACA,eACA,aACA,kBACA,OACA,kBACA,eACI;CACJ,MAAM,kBAAkB,eAAe,UAAU;CACjD,MAAM,sBAAsB,mBAAmB,UAAU;AAgBzD,QACE,4CAACC;EACC,eAAc;EACd,WAAU;EACV,OAAM;EACN,QAlBF,iBAAiB,CAAC,cACd;IACG,MAAM,oBAAoB,EAAE,YAAY,UAAU;IAClD,MAAM,wBAAwB,EAAE,YAAY,WAAW;GACzD,GACD,EAAE;aAeJ,4CAACA;GACC,KAAI;GACJ,YAAW;GACX,QAAO;GACP,IAAG;GACH,IAAG;GACH,UAAS;GACT,KApBmB,mBACrB,GACG,YAAY,qBAAqB,EAAE,SAAS,GAAG,EACjD,GACD,EAAE;;IAkBA,2CAACC;KAAI,UAAS;KAAW,IAAG;KAAQ,QAAO;KAAO,OAAM;MAAS;IACjE,2CAACA;KACC,WAAW;KACX,OAAM;KACN,YAAY,cAAc,WAAW;eAErC,2CAACC,oCAAmB;MAChB;IACL,iBACC,2CAACC;KACC,WAAW;KACX,YAAY,cAAc,YAAY;KACtC,QAAQ,EAAE,iBAAiB,eAAe;KAC1C,IAAG;KACH,UAAS;KACT,MAAK;KACL,OAAM;KACN,SAAQ;KACR,SAAS;KACT,OAAM;KACN,QAAO;eAEP,2CAACF;MAAI,QAAQ,cAAc,MAAM;gBAC/B,2CAACG,yCAAwB;OACrB;MACK;IAEd;;IACI,EACN,YAAY,CAAC,eACZ,2CAACJ;GACC,IAAG;GACH,IAAG;GACH,iBAAiB;GACjB,iBAAgB;GAChB,iBAAgB;GAChB,QAAQ,EAAE,iBAAiB,kBAAkB;GAE5C;IACI;GAEJ;EAGZ;;;;AC3FD,MAAM,WAA6B,EACjC,OACA,SACA,UACA,uBACI;AACJ,QACE,4CAACK,2BAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,2BAAK,0BACJ,2CAACC;GAAI,MAAK;aAAK;IAAY,EAC3B,2CAACC,kCAAiB,IACD,EACnB,2CAACC,qCACC,2CAACH,2BAAK,wBACJ,2CAACA,2BAAK,qBACH,QAAQ,KAAK,WACZ,4CAACI,6BACC,2CAACJ,2BAAK;GACJ,OAAO,OAAO;GACd,eAAa,GAAG,iBAAiB,GAAG,OAAO;GAC3C,eAAe,SAAS,OAAO,GAAG;aAEjC,OAAO;IACE,EACX,OAAO,SAAS,aAAa,OAAO,mBACnC,2CAACA,2BAAK,cAAY,KATP,OAAO,GAWX,CACX,GACW,GACC,GACX;GACC;;AAYhB,MAAa,YAA+B,EAC1C,YACA,UACA,YACA,MACA,mBACI;CACJ,MAAM,oBAAoB,YAA+B;AACvD,iBAAe,QAAQ,KAAK;;AAG9B,QACE,4CAACA,2BAAK;EAAW;EAAM,cAAc;aACnC,2CAACA,2BAAK;GAAQ;aAAS;IAA0B,EACjD,2CAACG,qCACC,2CAACH,2BAAK,wBACJ,2CAACA,2BAAK,qBACH,eAAe,KAAK,UACnB,4CAACI,6BACE,MAAM,QAAQ,KAAK,WAClB,OAAO,SAAS,YACd,2CAAC;GAEC,OAAO,OAAO;GACd,SAAS,OAAO;GACN;GACV,kBAAkB,GAAG,WAAW;KAJ3B,OAAO,GAKZ,GAEF,2CAACJ,2BAAK;GAEJ,OAAO,OAAO;GACd,eAAa,GAAG,WAAW,aAAa,OAAO;GAC/C,eAAe,SAAS,OAAO,GAAG;aAEjC,OAAO;KALH,OAAO,GAMF,CAEf,EACA,MAAM,mBAAmB,2CAACA,2BAAK,cAAY,KArB/B,MAAM,GAsBV,CACX,GACW,GACC,GACX;GACC;;;;;ACtFhB,MAAM,eAAe,SAAqD;CACxE,MAAM,YAAY,KAAK;AACvB,KAAI,aAAa,OAAO,cAAc,YAAY,YAAY,UAC5D,QAAO;AAET,QAAO;;AAQT,MAAa,kBAAkB,EAC7B,WACA,aAC2B;CAC3B,MAAM,mCAA+C,KAAK;CAC1D,MAAM,CAAC,QAAQ,iCAAsB,MAAM;CAC3C,MAAM,CAAC,gBAAgB,yCAA8B,MAAM;CAC3D,MAAM,CAAC,eAAe,wCAA6B,MAAM;CAEzD,MAAM,cAAc,UAAU;CAC9B,MAAM,eAAe,UAAU;AAE/B,4BAAgB;AACd,MAAI,CAAC,eAAe,CAAC,eAAe,QAClC;EAGF,MAAM,iEAA+B;GACnC,SAAS,eAAe;GACxB,uBAAwC,EAAE,WAAW;GACtD,CAAC;AAEF,eAAa,SAAS;IACrB,CAAC,WAAW,YAAY,CAAC;AAE5B,4BAAgB;AACd,MAAI,CAAC,gBAAgB,CAAC,eAAe,QACnC;EAGF,MAAM,6EAA2C;GAC/C,SAAS,eAAe;GACxB,SAAS,MAAkD;IACzD,MAAM,oBAAoB,YAAY,EAAE,OAAO,KAAK;AAEpD,QACE,qBACA,UAAU,cAAc,kBAAkB,OAAO,EAEjD;SAAI,OACF,QAAO,kBAAkB,OAAO;cACvB,kBAAkB,UAC3B,CAAC,UAA2B,aAAa,kBAAkB,OAAO;;AAItE,qBAAiB,MAAM;AACvB,cAAU,MAAM;;GAElB,cAAc,MAAuD;IACnE,MAAM,oBAAoB,YAAY,EAAE,OAAO,KAAK;AACpD,QAAI,kBACF,kBAAiB,UAAU,cAAc,kBAAkB,OAAO,CAAC;;GAGvE,mBAAmB,iBAAiB,MAAM;GAC3C,CAAC;AAEF,eAAa,SAAS;IACrB;EAAC;EAAW;EAAc;EAAO,CAAC;AAErC,4BAAgB;AACd,yEAA0B;GACxB,cAAc,MAA+B;IAC3C,MAAM,oBAAoB,YAAY,EAAE,OAAO,KAAK;AAEpD,QAAI,CAAC,kBACH;AAGF,QAAI,aAGF,KAFkB,UAAU,cAAc,kBAAkB,OAAO,CAGjE,WAAU,KAAK;QAEf,mBAAkB,KAAK;QAGzB,mBAAkB,KAAK;;GAG3B,cAAc;AACZ,cAAU,MAAM;AAChB,sBAAkB,MAAM;;GAE3B,CAAC;IACD,CAAC,WAAW,aAAa,CAAC;AAE7B,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;;;;;ACrGH,MAAa,6CACV,EAAE,WAAW,YAAY,kBAAkB,cAAc,mBAAmB;CAC3E,MAAM,mBAAmB,UAAU;CACnC,MAAM,aACJ,oBAAoB,mBAAmB,mBAAmB;CAC5D,MAAM,UAAU,QAAQ,UAAU,KAAK;CACvC,MAAM,kBAAkB,WAAW,UAAU;CAE7C,MAAM,EACJ,gBACA,aACA,QACA,eACA,mBACE,eAAe,EAAE,WAAW,CAAC;AAEjC,QACE,4CAACK;EAAK,KAAI;EAAS,OAAM;EAAO,gBAAe;EAAa,SAAS;aACnE,4CAACA;GACC,eAAa,SAAS,GAAG,WAAW,SAAS;GAC7C,KAAK;GACL,MAAM,UAAU,IAAI;GACpB,UAAS;GACT,YAAW;GACX,aAAa;GACb,aAAY;GACZ,aAAa,SAAS,aAAa;GACnC,iBAAiB,gBAAgB,aAAa;GAC9C,OAAO,iBAAiB,aAAa;;IAEpC,eACC,2CAAC;KACC,SAAQ;KACR,aAAa,EAAE,WAAW,QAAQ;eAElC,2CAACA;MACC,eAAa,GAAG,WAAW;MAC3B,WAAW;MACX,UAAS;MACT,MAAK;MACL,SAAS,mBAAmB,IAAI;MAChC,QAAO;MACP,QAAQ,EAAE,iBAAiB,WAAW;MACtC,QAAO;MACP,YAAW;MACX,gBAAe;MACf,cAAa;MACb,YAAW;gBAEX,2CAACC;OAAK,MAAK;OAAK,OAAM;iBACpB,2CAACC,yCAAwB;QACpB;OACF;MACC;IAEX,UAAU,aACT,2CAACC;KAAK,OAAM;KAAW,eAAa;eACjC,UAAU;MACN,GAEP,2CAAC;KACa;KACZ,WAAW,CAAC,UAAU;KACtB,WAAW,UAAU;KACrB,aACE,UAAU,SACN,gCACA;KAEN,QAAQ,UAAU;KAClB,eAAe,UAAU,WAAW,KAAK;KACzC,UAAU,UAAU;MACpB;IAEH,WAAW,UAAU,YACpB,2CAAC;KACC,SAAS,UAAU,gBAAgB;KACnC,aAAa,EAAE,WAAW,OAAO;KACjC,cAAc,EAAE,UAAU,SAAS;eAEnC,2CAACC;MACC,OAAM;MACN,QAAO;MACP,SAAQ;MACR,YAAW;MACX,IAAG;gBAEH,2CAACC,mCAAkB;OACf;MACE;;IAEP,EACN,mBACC,4CAACL;GAAK,KAAI;GAAS,YAAW;;IAC3B,UAAU,gBACT,2CAAC;KAAQ,SAAQ;KAAa,aAAa,EAAE,WAAW,OAAO;eAC7D,2CAACI;MACC,OAAM;MACN,QAAO;MACP,SAAQ;MACR,YAAW;gBAEX,2CAACE,6BAAY;OACT;MACE;IAEX,UAAU,cACT,2CAAC;KACC,SAAS,YAAY,UAAU;KAC/B,aAAa,EAAE,WAAW,OAAO;eAEjC,2CAACF;MACC,OAAM;MACN,QAAO;MACP,SAAQ;MACR,YAAW;gBAEX,2CAACG,8BAAa;OACV;MACE;IAEZ,2CAACH;KAAI,WAAW;KAAY,SAAS,mBAAmB,IAAI;eAC1D,4CAACJ;MAAK,KAAI;MAAS,YAAW;iBAC3B,UAAU,mBACT,2CAAC;OACa;OACZ,UAAU;OACV,MAAM,UAAU;OAChB,cAAc,UAAU;OACxB,YACE,2CAACG;QACC,eAAa,GAAG,WAAW;QAC3B,OAAM;QACN,gBAAe;QACf,QAAO;kBAEN,UAAU;SACN;QAET,GAEF,2CAACA;OACC,eAAa,GAAG,WAAW;OAC3B,OAAM;iBAEL,UAAU;QACN,EAER;OACI;MACH;;IACD;GAEJ;EAGZ;;;;ACxKD,MAAa,gDACV,EAAE,gBAAgB;AACjB,KAAI,CAAC,UAAU,eACb,QAAO;AAGT,QACE,2CAACK;EAAK,KAAI;EAAM,YAAW;EAAS,OAAM;YACxC,2CAAC;GACC,SAAS,UAAU;GACnB,aAAa,EAAE,WAAW,OAAO;aAEjC,2CAACC;IAAI,QAAO;cACV,2CAACC,2BAAU;KACP;IACE;GACL;EAGZ;;;;;;;;;;;;;;;;;;;;;;;;ACRD,SAAgB,2BACd,YACA;AACA,gCACG,MAAsC;EACrC,MAAM,SAAU,EACb,QAAQ,eAAe;AAE1B,MAAI,kBAAkB,SAKpB;OAHE,OAAO,QAAQ,+CAA2C,IAC1D,CAAC,WAAW,SAAS,SAAS,OAAO,CAGrC,GAAE,gBAAgB;;IAIxB,CAAC,WAAW,CACb;;;;;AC9BH,MAAa,oDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,CAAC,YAAY,qCAA0B,UAAU,YAAY;CAEnE,MAAM,mBAAmB;AACvB,YAAU,eAAe,WAAW;;CAGtC,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,4CAACC,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,2BAAU;GACX,2CAACC;IAAI,MAAK;cAAI;KAAiB;GAC9B,UAAU,kBACT,2CAACA;IACC,OAAM;IACN,UAAS;IACT,MAAK;IACL,UAAS;IACT,cAAa;IACb,YAAW;cAEV,UAAU;KACP;GAER,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;aACvB,2CAACK;IACC,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT,MAAM;IACN;IACA,eAAa,GAAG,WAAW;KAC3B;IACW,GACC,GACX;GACC;EAGjB;;;;ACrDD,MAAa,gDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,CAAC,YAAY,qCAA0B,UAAU,QAAQ;CAE/D,MAAM,mBAAmB;AACvB,YAAU,WAAW,WAAW;;CAGlC,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,4CAACC,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,8BAAa;GACd,2CAACC;IAAI,MAAK;cAAI;KAAa;GAC1B,UAAU,cACT,2CAACA;IACC,OAAM;IACN,UAAS;IACT,MAAK;IACL,UAAS;IACT,cAAa;IACb,YAAW;cAEV,UAAU;KACP;GAER,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,4CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;cACvB,2CAACK;IACC,MAAK;IACL,aAAY;IACZ,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT;IACA,eAAa,GAAG,WAAW;KAC3B,EACD,cACC,2CAACH;IAAI,UAAS;IAAK,OAAM;IAAW,IAAG;cAAI;KAErC;IAEK,GACC,GACX;GACC;EAGjB;;;;ACzDD,MAAa,qDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,CAAC,YAAY,qCACjB,UAAU,qBACX;CAED,MAAM,mBAAmB;AACvB,YAAU,WAAW,WAAW;;CAGlC,MAAM,uBAAuB,YAAqB;AAChD,YAAU,WAAW,UAAU,SAAS,QAAQ;;CAGlD,MAAM,mBAAmB,MAAkD;AACzE,IAAE,iBAAiB;AACnB,IAAE,YAAY,0BAA0B;;AAG1C,QACE,4CAACI,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,4BAAW;GACZ,2CAACC;IAAI,MAAK;cAAI;KAAmB;GAChC,UAAU,wBACT,2CAACA;IACC,OAAM;IACN,UAAS;IACT,MAAK;IACL,UAAS;IACT,cAAa;IACb,YAAW;cAEV,UAAU;KACP;GAER,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACJ,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;aACtB,UAAU,YACT,4CAACA,sBAAK;IACJ,OAAM;IACN,SAAS,UAAU,iBAAiB;IACpC,uBACE,oBAAoB,UAAU,iBAAiB,KAAK;IAEtD,eAAa,GAAG,WAAW;eAC5B,QAEC,2CAACA,sBAAK,kBAAgB;KACJ,GAEpB,2CAACK;IACC,MAAK;IACL,MAAM,UAAU,WAAW,WAAW;IACtC,aAAa,UAAU,WAAW,MAAM;IACxC,OAAO;IACP,WAAW,MAAM,cAAc,EAAE,OAAO,MAAM;IAC9C,QAAQ;IACR,WAAW;IACX,SAAS;IACT;IACA,eAAa,GAAG,WAAW;KAC3B;IAES,GACC,GACX;GACC;EAGjB;;;;AC3ED,MAAa,yBAAyD,EACpE,wBACI;AACJ,KAAI,kBAAkB,WAAW,EAC/B,QAAO;AAGT,QACE,4CAACC,sBAAK;EAAK,aAAa;GAAE,WAAW;GAAe,QAAQ;GAAG;aAC7D,4CAACA,sBAAK;GACJ,2CAACC,wBAAI,GAAE,SAAS;GAChB,2CAACA;IAAI,MAAK;cAAI;KAAsB;GACpC,2CAACA;IACC,OAAM;IACN,UAAS;IACT,IAAG;IACH,IAAG;IACH,cAAa;cAEZ,kBAAkB;KACf;GACN,2CAACC,gCAAe;MACC,EACnB,2CAACC,qCACC,2CAACH,sBAAK,wBACJ,2CAACA,sBAAK;GAAQ,GAAE;GAAI,MAAK;aACtB,kBAAkB,KAAK,QACtB,4CAACC;IAEC,IAAG;IACH,mBAAmB;IACnB,aAAY;IACZ,OAAO,EAAE,mBAAmB,GAAG;eAE/B,2CAACA;KAAI,UAAS;KAAK,YAAW;eAC3B,IAAI;MACD,EACN,2CAACA;KAAI,UAAS;KAAK,OAAM;KAAW,YAAW;eAC5C,IAAI;MACD;MAXD,IAAI,cAYL,CACN;IACW,GACC,GACX;GACC;;;;;ACjChB,MAAa,iDACV,EACC,WACA,YACA,aAAa,MACb,cAAc,OACd,cAAc,OACd,eACI;CACJ,MAAM,+BAAoC,KAAK;CAC/C,MAAM,wBAAwB,2BAA2B,WAAW;CAEpE,MAAM,oBAAoB,YAA+B;AACvD,YAAU,gBAAgB,QAAQ,KAAK;;AAGzC,QACE,4CAACG,sBAAK;EACJ,MAAM,UAAU;EAChB,cAAc;EACd,aAAa,EAAE,WAAW,gBAAgB;EAC1C,mBAAmB;aAEnB,2CAACA,sBAAK;GAAQ;aACZ,2CAAC;IACC,QAAO;IACP,OAAM;IACN,QAAQ,EAAE,OAAO,YAAY;IACjB;KACZ;IACW,EACf,2CAACC,qCACC,2CAACD,sBAAK,wBACJ,4CAACA,sBAAK;GAAQ,KAAK;GAAY,MAAK;;IAClC,2CAAC;KACY;KACC;MACZ;IAED,eACC,2CAAC;KAA0B;KAAuB;MAAc;IAGjE,eACC,2CAAC;KACY;KACC;MACZ;IAGJ,2CAACA,sBAAK,cAAY;IAElB,4CAACA,sBAAK;KACJ,OAAM;KACN,eAAe,UAAU,cAAc,CAAC,UAAU,aAAa;KAC/D,eAAa,GAAG,WAAW;gBAE3B,2CAACE,wBAAI,GAAE,SAAS,EACf,UAAU,eACP,sBACA;MACM;IAEZ,2CAAC,yBACC,mBAAmB,UAAU,oBAC7B;IAED,cACC,qFACE,2CAACF,sBAAK,cAAY,EAClB,4CAACA,sBAAK;KACJ,OAAM;KACN,OAAO,UAAU,YAAY,aAAa;KAC1C,UAAU,CAAC,UAAU;KACrB,SAAS,UAAU,YAAY,WAAW;KAC1C,OAAO,UAAU,uBAAuB;KACxC,eAAa,GAAG,WAAW;KAC3B,QACE,UAAU,YACN;MAAE,IAAI;MAAY,OAAO;MAAY,GACrC;gBAGN,2CAACG,2BAAU,EACX,2CAACD;MAAI,MAAK;gBAAI;OAAkB;MACtB,IACX;;IAEQ,GACC,GACX;GACC;EAGjB;;;;ACtGD,MAAa,kDACV,EAAE,WAAW,YAAY,aAAa,MAAM,eAAe;AAC1D,QACE,qFACE,2CAAC,kBAA0B,YAAa,EACvC,UAAU,YACT,2CAAC;EACY;EACX,YAAY,GAAG,WAAW;EACd;EACF;GACV,IAEH;EAGR;;;;ACRD,MAAa,qDACV,EAAE,WAAW,YAAY,aAAa;CACrC,MAAM,mBAAmB,gBAAgB,UAAU;AAEnD,QACE,2CAAC;EACY;EACX,eAAe,UAAU;EACzB,aAAa,UAAU;EACvB,kBAAkB,UAAU;EACV;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACxB,cACE,2CAAC;IACY;IACC;IACZ,YAAY,CAAC,UAAU;IACvB,UAAU,UAAU;KACpB;IAEJ;YAGJ,4CAACE;GAAK,eAAc;GAAS,OAAM;cAChC,UAAU,SAAS,KAAK,SAAS,UAChC,2CAAC;IAEC,WAAW;IACX,YAAY,GAAG,WAAW,GAAG;MAFxB,QAAQ,OAGb,CACF,EACD;IACI;GACK;EAGnB;;;;AClDD,MAAa,gDACV,EAAE,WAAW,iBAAiB;AAC7B,QACE,2CAAC;EACY;EACC;EACZ,QACE,UAAU,iBACR,2CAACC;GAAI,IAAG;aACN,2CAAC;IACC,YAAY,GAAG,WAAW;IAC1B,OAAM;IACN,eAAe,UAAU,YAAY,GAAG;KACxC;IACE;GAGV;EAGP;;;;ACTD,MAAa,+CACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,mBAAmB,gBAAgB,UAAU;AAEnD,QACE,2CAAC;EACY;EACX,eAAe,UAAU;EACzB,aAAa,UAAU;EACvB,kBAAkB,UAAU;EACV;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACxB,cACE,2CAAC;IACY;IACC;IACZ,UAAU,UAAU;KACpB;IAEJ;YAGH,UAAU,WACT,2CAACC;GAAK,eAAc;GAAS,OAAM;aACjC,2CAAC;IAA0B;IAAuB;KAAc;IAC3D;GAEG;EAGnB;AAOD,MAAM,gDACH,EAAE,WAAW,iBAAiB;CAC7B,MAAM,UAAU,UAAU;AAC1B,KAAI,CAAC,QACH,QAAO;CAGT,MAAM,mBAAmB,gBAAgB,QAAQ;CACjD,MAAM,mBAAmB,QAAQ;AAEjC,QACE,2CAAC;EACC,WAAW;EACX,eAAe;EACf,aAAa;EACK;EAClB,OACE,2CAAC;GACY;GACC;GACM;GACA;IAClB;YAGJ,2CAAC;GAA4B;GAAS,YAAY,GAAG,WAAW;IAAO;GAC3D;EAGnB;AAcD,MAAM,oDACH,EAAE,SAAS,iBAAiB;AAC3B,KAAI,mBAAmB,aACrB,QACE,4CAACA;EAAK,eAAc;EAAS,OAAM;aAChC,QAAQ,SAAS,KAAK,SAAS,UAC9B,2CAAC;GAEC,WAAW;GACX,YAAY,GAAG,WAAW,GAAG;KAFxB,QAAQ,OAGb,CACF,EACD,QAAQ,iBACP,2CAACC;GAAI,IAAG;aACN,2CAAC;IACC,YAAY,GAAG,WAAW;IAC1B,OAAM;IACN,eAAe,QAAQ,YAAY,GAAG;KACtC;IACE;GAEH;AAIX,KAAI,mBAAmB,YACrB,QACE,2CAACD;EAAK,eAAc;EAAS,OAAM;YACjC,2CAAC;GAAe,WAAW;GAAqB;IAAc;GACzD;AAIX,KAAI,mBAAmB,iBACrB,QAAO,2CAACE;EAAgB,WAAW;EAAqB;GAAc;AAGxE,QAAO;EAEV;AAOD,MAAMA,mDACH,EAAE,WAAW,iBAAiB;CAC7B,MAAM,QAAQ,UAAU;AAExB,QACE,4CAACF;EAAK,KAAI;EAAM,YAAW;EAAS,QAAO;EAAO,IAAG;EAAM,IAAG;aAC5D,2CAACC;GAAI,OAAM;aACT,2CAACE,oCAAmB;IAChB,EACN,2CAACH;GACC,KAAI;GACJ,OAAM;GACN,gBAAe;GACf,SAAS;GACT,QAAQ;IACN,gBAAgB;IAChB,qBAAqB;IACtB;GACD,SAAS,UAAU;GACnB,QAAO;aAEP,2CAACI;IACC,OAAM;IACN,eAAa,GAAG,WAAW;cAE1B,SAAS;KACL;IACF;GACF;EAGZ;AAED,MAAM,iDACH,EAAE,WAAW,YAAY,kBAAkB,uBAAuB;CACjE,MAAM,UAAU,UAAU;AAC1B,KAAI,CAAC,QACH,QAAO;CAGT,MAAM,EAAE,gBAAgB,QAAQ,eAAe,mBAC7C,eAAe,EAAE,WAAW,SAAS,CAAC;AAExC,QACE,4CAACJ;EACC,KAAK;EACL,eAAa,SAAS,GAAG,WAAW,eAAe;EACnD,aAAa;EACb,aAAY;EACZ,aAAa,SAAS,aAAa;EACnC,iBAAiB,gBAAgB,aAAa;EAC9C,OAAO,iBAAiB,aAAa;EACrC,KAAI;EACJ,YAAW;aAEX,2CAAC;GACa;GACZ,UAAU,UAAU;GACpB,MAAM,QAAQ;GACd,cAAc,QAAQ;GACtB,YACE,2CAACI;IACC,eAAa,GAAG,WAAW;IAC3B,OAAM;IACN,QAAO;IACP,gBAAe;IACf,SAAS;cAER,QAAQ;KACJ;IAET,EACF,2CAACH;GACC,WAAW,mBAAmB,mBAAmB;GACjD,SAAS,mBAAmB,IAAI;aAEhC,4CAACD;IAAK,KAAI;IAAS,YAAW;eAC5B,2CAAC,kBAAe,WAAW,UAAW,EACrC,QAAQ,YACP,2CAAC;KACC,WAAW;KACX,YAAY,GAAG,WAAW;KAC1B,YAAY;MACZ;KAEC;IACH;GACD;EAGZ;;;;ACvOD,MAAa,mDACV,EAAE,WAAW,iBAAiB;CAC7B,MAAM,mBAAmB,gBAAgB,UAAU;CAEnD,MAAM,eACJ,qFACE,2CAAC,kBAA0B,YAAa,EACvC,UAAU,YACT,2CAAC;EACY;EACX,YAAY,GAAG,WAAW;EAC1B;EACA;EACA;EACA,UAAU,UAAU;GACpB,IAEH;AAGL,QACE,2CAAC;EACY;EACX,eAAe;EACf,aAAa;EACK;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACV;IACd;GAEJ;EAGP;;;;ACrCD,MAAa,8CACV,EAAE,WAAW,YAAY,eAAe;CACvC,MAAM,mBAAmB,gBAAgB,UAAU;CAEnD,MAAM,eACJ,qFACE,2CAAC,kBAA0B,YAAa,EACvC,UAAU,YACT,2CAAC;EACY;EACX,YAAY,GAAG,WAAW;EAC1B;EACA,UAAU,UAAU;GACpB,IAEH;AAGL,QACE,2CAAC;EACY;EACX,eAAe;EACf,aAAa;EACK;EAClB,OACE,2CAAC;GACY;GACC;GACM;GAClB,cAAc,UAAU;GACV;IACd;EAGH;GACW;EAGnB;;;;ACxCD,MAAa,oDACV,EAAE,WAAW,iBAAiB;AAC7B,QACE,2CAAC;EAAwB;EAAuB;YAC9C,2CAAC;GAA2B;GAAuB;IAAc;GACpD;EAGpB;AAOD,MAAM,iDACH,EAAE,WAAW,iBAAiB;CAC7B,MAAM,QAAQ,UAAU;AAExB,QACE,4CAACK;EAAK,KAAI;EAAM,YAAW;EAAS,QAAO;EAAO,IAAG;EAAM,IAAG;aAC5D,2CAACC;GAAI,OAAM;aACT,2CAACC,oCAAmB;IAChB,EACN,2CAACF;GACC,KAAI;GACJ,OAAM;GACN,gBAAe;GACf,SAAS;GACT,QAAQ;IACN,gBAAgB;IAChB,qBAAqB;IACtB;GACD,SAAS,UAAU;GACnB,QAAO;aAEP,2CAACG;IACC,OAAM;IACN,eAAa,GAAG,WAAW;cAE1B,SAAS;KACL;IACF;GACF;EAGZ;;;;AC/CD,MAAa,6CACV,EAAE,WAAW,iBAAiB;AAC7B,KAAI,CAAC,UAAU,cACb,QAAO,2CAAC;EAAwB;EAAuB;GAAc;AAGvE,QACE,2CAAC;EAA+B;EAAuB;GAAc;EAG1E;;;;ACFD,MAAa,0CACV,EAAE,WAAW,iBAAiB;AAC7B,KAAI,qBAAqB,aACvB,QAAO,2CAAC;EAA0B;EAAuB;GAAc;AAGzE,KAAI,qBAAqB,YACvB,QAAO,2CAAC;EAAyB;EAAuB;GAAc;AAGxE,KAAI,qBAAqB,iBACvB,QACE,2CAAC;EAA8B;EAAuB;GAAc;AAIxE,KAAI,qBAAqB,UACvB,QAAO,2CAAC;EAAuB;EAAuB;GAAc;AAGtE,KAAI,qBAAqB,gBACvB,QACE,2CAAC;EAA6B;EAAuB;GAAc;AAIvE,QAAO;EAEV;;;;AC+BD,MAAM,iBAA4C;CAChD,KAAKC;CACL,QAAQC;CACR,MAAMC;CACN,SAASC;CACV;AAED,MAAM,aAAgD,EAAE,eACtD,2CAACC;CAAI,IAAG;CAAO,IAAG;CAAI,IAAG;CAAW,cAAa;CAAK,YAAW;CAC9D;EACG;AAGR,MAAM,iBAAqD,EAAE,eAAe;AAC1E,KAAI,aAAa,OACf,QAAO;AAGT,KAAI,aAAa,WACf,QACE,2CAACC;EAAM,MAAK;EAAK,cAAa;EAAS,SAAQ;YAAS;GAEhD;AAIZ,QACE,2CAACA;EAAM,MAAK;EAAK,cAAa;EAAM,SAAQ;YAAS;GAE7C;;AAIZ,MAAM,yBAA2D,EAAE,WAAW;AAC5E,QACE,4CAACC;EAAO,OAAM;EAAU,KAAK;EAAG,IAAI;aAClC,4CAACC;GAAK,OAAM;GAAS,KAAK;GAAG,UAAS;GAAK,UAAS;cACjD,KAAK,MAAM,KAAK,MAAM,cACrB,4CAACA;IAAqB,OAAM;IAAS,KAAK;eACvC,YAAY,KAAK,2CAACC;KAAK,OAAM;eAAW;MAAQ,EACjD,2CAACH;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;eAC1C,KAAK;MACA;MAJC,KAAK,KAKT,CACP,EACF,2CAAC,iBAAc,UAAU,KAAK,mBAAoB;IAC7C,EAEP,4CAACE;GAAK,OAAM;GAAS,KAAK;GAAG,UAAS;GAAK,OAAM;;IAC/C,2CAACC;KAAK,OAAM;eAAW;MAAe;IACtC,2CAACJ;KACC,IAAG;KACH,IAAI;KACJ,IAAI;KACJ,IAAG;KACH,cAAa;KACb,YAAW;eAEV,KAAK,UAAU,KAAK,QAAQ,OAAO;MAChC;IACN,2CAACK;KAAK,IAAIC;KAAc,OAAM;KAAW,YAAY;MAAK;IAC1D,2CAACN;KACC,IAAG;KACH,IAAI;KACJ,IAAI;KACJ,IAAG;KACH,cAAa;KACb,YAAW;eAEV,KAAK,UAAU,KAAK,QAAQ,MAAM;MAC/B;;IACD;GACA;;AAIb,MAAM,sBAAsB,UAA2B;AACrD,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAEvC,QAAO,KAAK,UAAU,MAAM;;AAG9B,MAAM,mBAAyD,EAAE,cAAc;CAC7E,MAAM,EAAE,OAAO,MAAM,sBAAsB;AAE3C,KAAI,kBACF,QAAO;CAGT,MAAM,iBAAiB,mBAAmB,MAAM;CAChD,MAAM,cAAc,eAAe,SAAS,KAAK;AAEjD,QACE,4CAACG;EACC,OAAO,cAAc,eAAe;EACpC,KAAK;EACL,UAAS;EACT,OAAM;EACN,IAAI;;GAEJ,2CAACC;IAAK,OAAM;cAAW;KAAe;GACtC,2CAACJ;IACC,IAAG;IACH,IAAI,cAAc,IAAI;IACtB,IAAI,cAAc,MAAM;IACxB,IAAG;IACH,cAAa;IACb,YAAW;IACX,YAAY,cAAc,QAAQ;cAEjC;KACG;GACN,4CAACI;IAAK,OAAM;;KAAW;KAAE;KAAK;;KAAQ;;GACjC;;AAIX,MAAM,sBAA6D,EACjE,cACI;CACJ,MAAM,kBAAkB,QAAQ,QAC7B,WACC,WAAW,aACX,WAAW,aACX,WAAW,iBACX,WAAW,gBACX,WAAW,gBACX,WAAW,mBACd;AAED,KAAI,gBAAgB,WAAW,EAC7B,QAAO;AAGT,QACE,2CAACD;EAAK,OAAM;EAAS,KAAK;EAAG,UAAS;EAAK,IAAI;EAAG,UAAS;YACxD,gBAAgB,KAAK,WACpB,2CAACF;GAAmB,MAAK;GAAK,cAAa;GAAO,SAAQ;aACvD;KADS,OAEJ,CACR;GACG;;AAIX,MAAM,WAA8C,EAAE,eACpD,2CAACD;CACC,IAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAG;CACH,cAAa;CACb,YAAW;CAEV;EACG;AASR,MAAM,kBAA2C,EAC/C,OACA,WACA,cAEA,4CAACG;CACC,OAAM;CACN,KAAK;CACL,UAAS;CACT,OAAM;CACN,IAAI;CACJ,UAAS;;EAET,4CAACC;GAAK,OAAM;cAAY,OAAM;IAAQ;EACtC,2CAAC,qBAAS,YAAoB;EAC9B,2CAACC;GAAK,IAAIC;GAAc,OAAM;GAAW,YAAY;IAAK;EAC1D,2CAAC,qBAAS,UAAkB;;EACvB;AAGT,MAAM,qBAAqB,UAA2B;AACpD,KAAI,UAAU,OACZ,QAAO;AAET,KAAI,OAAO,UAAU,SACnB,QAAO,SAAS;AAElB,QAAO,KAAK,UAAU,MAAM;;AAO9B,MAAM,oBAAoB,UAAwC;AAChE,KAAI,MAAM,OAAO,UAAU,MAAM,KAC/B,QAAO,wBAAwB,MAAM,KAAK;AAE5C,QAAO;;AAGT,MAAM,wBAA0D,EAC9D,kBACI;CACJ,MAAM,EAAE,OAAO,cAAc;CAC7B,MAAM,gBAAgB,eAAe,MAAM;AAE3C,SAAQ,MAAM,IAAd;EACE,KAAK,MACH,QACE,4CAACH;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACD;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,KAAK,SACH,QACE,4CAACD;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACD;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,KAAK,QAAQ;GACX,MAAM,YAAY,iBAAiB,MAAM;AACzC,OAAI,YAAY,SACd,QACE,4CAACD;IAAK,OAAM;IAAS,KAAK;eACxB,2CAACE;KACC,IAAI;KACJ,OAAM;KACN,SAAS;KACT,YAAY;MACZ,EACF,4CAACD;KAAK,UAAS;KAAK,OAAM;;MAAW;MACrB,2CAAC,uBAAW,YAAsB;;MAAI;MACpD,2CAAC,uBAAW,YAAsB;;MAC7B;KACF;AAGX,UACE,4CAACD;IAAK,OAAM;IAAS,KAAK;;KACxB,2CAACE;MACC,IAAI;MACJ,OAAM;MACN,SAAS;MACT,YAAY;OACZ;KACF,4CAACD;MAAK,UAAS;MAAK,OAAM;;OAAW;OACvB,2CAAC,uBAAW,YAAsB;;OAAI;OAClD,2CAAC,uBAAW,YAAsB;;OAC7B;KACN,YAAY,kBACX,2CAACH;MAAM,MAAK;MAAK,cAAa;MAAS,SAAQ;gBAAS;OAEhD;;KAEL;;EAGX,KAAK,UACH,QACE,4CAACE;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAI;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACD;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;EAEX,QACE,QACE,4CAACD;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAIN;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACK;IAAK,UAAS;IAAK,OAAM;;KAAW;KAC7B,2CAAC,uBAAW,YAAsB;;;KACnC;IACF;;;AAKf,MAAM,0CAAwC,EAAE,kBAAkB;CAChE,MAAM,EACJ,OACA,iBACA,YACA,eACA,eACA,mBACA,kBACA,kBACA,2BACE;CAEJ,MAAM,8CAEF,aACI,oCACE,WAAW,UACX,WAAW,OACZ,GACD,MACN,CAAC,WAAW,CACb;CACD,MAAM,0CAA+B;AACnC,MAAI,MAAM,OAAO,SAAS,MAAM,MAC9B,QAAO,uBAAuB;GAC5B,IAAI;GACJ,MAAM,MAAM;GACZ,OAAO,MAAM;GACd,CAAC;AAEJ,SAAO;IACN,CAAC,MAAM,CAAC;AAEX,QACE,4CAACJ;EACC,cAAa;EACb,aAAY;EACZ,IAAI;EACJ,IAAI;EACJ,OAAO,EAAE,cAAc,QAAQ;EAC/B,QAAQ,EAAE,IAAI,WAAW;;GAEzB,2CAAC,wBAAkC,cAAe;GAEjD,kBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC,mBAAgB,SAAS,iBAAkB;KACxC;GAGP,sBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC,yBAAsB,MAAM,qBAAsB;KAC/C;GAGP,iBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,cAAc,YAAY;KACvD,SAAS,kBAAkB,cAAc,UAAU;MACnD;KACE;GAGP,iBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,cAAc,YAAY;KACvD,SAAS,kBAAkB,cAAc,UAAU;MACnD;KACE;GAGP,qBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,kBAAkB,gBAAgB;KAC/D,SAAS,kBAAkB,kBAAkB,cAAc;MAC3D;KACE;GAGP,oBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,iBAAiB,eAAe;KAC7D,SAAS,kBAAkB,iBAAiB,aAAa;MACzD;KACE;GAGP,oBACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBAAkB,iBAAiB,eAAe;KAC7D,SAAS,kBAAkB,iBAAiB,aAAa;MACzD;KACE;GAGP,0BACC,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC;KACC,OAAM;KACN,WAAW,kBACT,uBAAuB,qBACxB;KACD,SAAS,kBACP,uBAAuB,mBACxB;MACD;KACE;GAGP,CAAC,sBAAsB,gBAAgB,SAAS,KAC/C,2CAACA;IAAI,IAAI;IAAG,IAAI;cACd,2CAAC,sBAAmB,SAAS,kBAAmB;KAC5C;;GAEJ;EAER;AAEF,MAAM,oBAAuD,EAAE,aAAa;AAC1E,QACE,2CAACA;EACC,cAAa;EACb,aAAY;EACZ,IAAI;EACJ,IAAI;EACJ,OAAO,EAAE,cAAc,QAAQ;EAC/B,QAAQ,EAAE,IAAI,WAAW;YAEzB,4CAACG;GAAK,OAAM;GAAS,KAAK;cACxB,2CAACE;IACC,IAAIP;IACJ,OAAM;IACN,SAAS;IACT,YAAY;KACZ,EACF,4CAACM;IAAK,UAAS;IAAK,OAAM;;KAAW;KAChB,2CAAC,uBAAW,OAAO,iBAA2B;;KAAI;KACrE,2CAAC,uBAAW,OAAO,iBAA2B;;KACzC;IACF;GACH;;AAUV,MAAM,aAAiC,EAAE,SAAS,MAAM,gBACtD,2CAACJ;CAAI,IAAI;CAAG,IAAI;WACd,4CAACG;EAAK,OAAM;EAAS,KAAK;aACxB,2CAACE;GAAK,IAAIE;GAAiB,OAAM;GAAW,SAAS;GAAG,YAAY;IAAK,EACzE,4CAACH;GAAK,UAAS;GAAK,OAAM;;IACvB,SAAS,aACR,2CAACH;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;KAAS,IAAI;eAAG;MAErD;IAET,SAAS,aACR,2CAACA;KAAM,MAAK;KAAK,cAAa;KAAO,SAAQ;KAAS,IAAI;eAAG;MAErD;IAET,aACC,4CAACD;KAAI,IAAG;KAAO,YAAW;;MACvB;MAAU;MAAE;;MACT;IAEP;;IACI;GACF;EACH;AASR,MAAM,cAAmC,EACvC,kBACA,eACA,mBAEA,4CAACA;CACC,QAAO;CACP,aAAY;CACZ,cAAa;CACb,IAAG;CACH,UAAS;YAET,2CAACA;EACC,IAAI;EACJ,IAAI;EACJ,IAAG;EACH,cAAa;EACb,aAAY;YAEZ,2CAACI;GAAK,UAAS;GAAK,YAAW;GAAS,OAAM;aAAW;IAElD;GACH,EACN,4CAACF;EAAO,OAAM;EAAU,KAAK;EAAG,SAAQ;EAAM,aAAY;;GACvD,gBACC,2CAAC;IAA8B,SAAS;IAAc,MAAK;MAA5C,gBAAwD;GAExE,iBAAiB,KAAK,UACrB,2CAAC;IAEC,SAAS,MAAM;IACf,MAAK;MAFA,cAAc,MAAM,SAGzB,CACF;GACD,cAAc,KAAK,UAClB,2CAAC;IAEC,SAAS,MAAM;IACf,MAAK;IACL,WAAW,MAAM;MAHZ,WAAW,MAAM,aAAa,GAAG,GAAG,MAAM,UAI/C,CACF;;GACK;EACL;AAGR,MAAa,sDACV,EACC,QACA,SACA,WACA,UACA,SACA,WACA,SACA,eACA,cACA,mBAAmB,EAAE,EACrB,gBAAgB,EAAE,EAClB,MACA,uBAAuB,WACvB,8BACA,aACA,iBACI;CACJ,MAAM,aAAa,SAAS;CAC5B,MAAM,mBAAmB,QAAQ,SAAS;CAC1C,MAAM,mBAAmB,QAAQ,cAAc;CAC/C,MAAM,aAAa,oBAAoB;CACvC,MAAM,YACJ,iBAAiB,SAAS,KAC1B,cAAc,SAAS,KACvB,QAAQ,aAAa;CAGvB,MAAM,WAAW,aAFC,CAAC,YACD,cAAc,CAAC;CAEjC,MAAM,oBAAoB,QAAQ,UAAU,mBAAmB,IAAI;CACnE,MAAM,kBAAkB,aACpB,iBACA,kBAAkB,kBAAkB;AAExC,QACE,2CAACM;EACC,MAAM;EACN,eAAe,EAAE,WAAW,CAAC,QAAQ,SAAS;EAC9C,MAAK;YAEL,4CAACC,sCACC,2CAACC,2CAAiB,EAClB,2CAACC,sDACC,4CAACC;GAAc,UAAS;;IACtB,2CAACC,kDACC,2CAACC,iDACE,aACG,iBAAiB,QAAQ,KACzB,uBAAuB,QAAQ,KACvB,GACD;IAEf,2CAACC,gDACC,4CAACb;KAAO,OAAM;KAAU,KAAK;;MAC1B,aACC,2CAAC;OACmB;OACH;OACD;QACd;MAGH,CAAC,aAAa,cAAc,CAAC,cAC5B,qFACE,4CAACF;OACC,QAAO;OACP,aAAY;OACZ,cAAa;OACb,UAAS;OACT,WAAU;OACV,WAAU;kBAET,iBACC,2CAAC,oBAAiB,QAAQ,gBAAiB,EAE5C,QAAQ,KAAK,gBACZ,2CAAC,YAEc,eADR,YAAY,MAAM,KAEvB,CACF;QACE,EAEN,2CAACI;OAAK,UAAS;OAAK,OAAM;iBAAW;QAG9B,IACN;MAEJ,CAAC,aAAa,CAAC,cAAc,CAAC,cAC7B,2CAACD;OAAK,SAAQ;OAAS,OAAM;OAAS,WAAU;iBAC9C,2CAACC;QAAK,OAAM;QAAW,UAAS;kBAAK;SAE9B;QACF;MAER,CAAC,aAAa,cACb,qFACE,4CAACY,8BAAa;OACZ,MAAK;OACL,OAAO;OACP,gBAAgB,YACd,+BACE,QAAQ,MACT;kBAGH,2CAACA,8BAAa,cAAY,EAC1B,2CAACA,8BAAa,SAAM,OAAO,CAAC,WAAW,SAAS,GAAI;QAClC,EACpB,2CAAChB;OACC,QAAO;OACP,aAAY;OACZ,cAAa;OACb,UAAS;OACT,WAAU;OACV,WAAU;iBAET,yBAAyB,YACxB,2CAAC;QAAS;QAAS,MAAM,eAAe;SAAQ,GAEhD,2CAAC;QAAS;QAAS,MAAM,cAAc;SAAQ;QAE7C,IACL;;MAEE,GACE;IAEb,2CAACiB,kDACC,4CAACd;KAAK,SAAQ;KAAgB,OAAM;gBACjC,aACC,2CAACH,yBAAM,GAEP,2CAACkB;MACC,SAAQ;MACR,MAAK;MACL,SAAS;MACT,UAAU,CAAC,cAAc,CAAC;MAC1B,OAAM;gBAEN,2CAACC,+CAA8B;OACpB,EAEf,4CAAChB;MAAK,KAAK;iBACT,2CAACiB;OAAO,SAAQ;OAAU,SAAS;iBAAS;QAEnC,EACR,CAAC,aACA,2CAACA;OACC,SAAQ;OACR,SAAS;OACT,UAAU,CAAC;OACX,SAAS;iBAER;QACM;OAEN;MACF,GACM;IAEf,2CAACC,+CAAqB;;IACR,GACC,IACZ;GACE;EAGlB;;;;AC9wBD,MAAa,8CAAgD,EAAE,YAAY;CACzE,MAAM,2BAA2B;AAC/B,QAAM,mBAAmB;;CAG3B,MAAM,qBAAqB;AACzB,QAAM,QAAQ;AACd,QAAM,oBAAoB;;AAO5B,QACE,4CAACC;EACC,MAAM;EACN,eAAc;EACd,KAAI;EACJ,KATsB,EACxB,gCAAgC,EAAE,SAAS,GAAG,EAC/C;EAQG,eAAY;;GAEZ,4CAACA;IACC,gBAAe;IACf,OAAM;IACN,YAAW;IACX,eAAc;eAEd,4CAACC,mCACE,MAAM,SAAS,aACd,2CAAC;KACC,YAAW;KACX,SAAS,MAAM;MACf,GAEF,2CAAC;KACC,YAAW;KACX,SAAS,MAAM;MACf,EAEH,MAAM,SAAS,aACd,2CAACC;KACC,MAAK;KACL,SAAQ;KACR,SAAS;KACT,UAAU,MAAM,qBAAqB,CAAC,MAAM;KAC5C,SAAS,MAAM;KACf,eAAY;eAEX,MAAM,YAAY,kBAAkB;MAC9B,IAER,MAAM,WAAW,MAAM,cACtB,2CAACA;KACC,MAAK;KACL,SAAQ;KACR,SAAS;KACT,UAAU,MAAM,qBAAqB,CAAC,MAAM;KAC5C,SAAS,MAAM;KACf,eAAY;eAEX,MAAM,YACH,kBACA,kBAAkB,MAAM,kBAAkB;MACvC,IAGT,EACN,2CAACD;KAAI,WAAU;KAAsB,SAAS;eAC5C,2CAAC;MACC,oBAAoB;MACpB,MAAM,MAAM;MACZ,UAAU,MAAM;OAChB;MACE;KACD;GACN,MAAM,aAAa,mBAAmB,QACrC,2CAACA;IAAI,eAAc;cACjB,2CAAC;KAAS,WAAW,MAAM;KAAY,YAAW;MAAS;KACvD;GAEP,MAAM,aAAa,mBAAmB,QACrC,2CAAC;IACC;IACA,MAAM,MAAM,gBAAgB;KAC5B;GAGJ,2CAAC;IACC,QAAQ,MAAM;IACd,SAAS,MAAM;IACf,WAAW,MAAM;IACjB,UAAU;IACV,SAAS,MAAM,YAAY;IAC3B,WAAW,MAAM;IACjB,SAAS,MAAM;IACf,eACE,MAAM,mBACF;KACE,gBAAgB,MAAM;KACtB,gBAAgB,MAAM;KACvB,GACD;IAEN,cAAc,MAAM;IACpB,kBAAkB,MAAM;IACxB,eAAe,MAAM;IACrB,MAAM,MAAM;IACZ,sBAAsB,MAAM;IAC5B,8BAA8B,MAAM;IACpC,aAAa,MAAM,gBAAgB;IACnC,YAAY,MAAM,gBAAgB;KAClC;;GACG;EAET;;;;AC3HF,IAAI,gBAAgB;AAEpB,SAAgB,iBAAyB;AACvC,QAAO,QAAQ,EAAE;;AAOnB,IAAsB,gBAAtB,MAAyD;CACvD,AAAS;CAET,AAAS;CAET,AAAQ,UAA4B;CACpC,AAAiB;CAEjB,YAAY,IAAwB,MAAc,QAA0B;AAC1E,OAAK,KAAK,MAAM,gBAAgB;AAChC,OAAK,QAAQ;AACb,OAAK,SAAS;;CAGhB,IAAI,SAA2B;AAC7B,SAAO,KAAK;;CAGd,IAAI,OAAO,OAAyB;AAClC,OAAK,UAAU;;CAGjB,IAAI,OAAe;AACjB,SAAO,KAAK;;CAMd,WAAoC;AAClC,SAAO;;CAGT,UAAkC;AAChC,SAAO;;CAGT,cAA0C;AACxC,SAAO;;CAGT,IAAI,SAAgC;AAClC,SAAO,EAAE;;CAGX,IAAI,WAAkC;AACpC,SAAO,EAAE;;CAGX,IAAI,UAAmB;AACrB,SAAO,KAAK,OAAO,WAAW;;CAGhC,IAAI,cAAuB;AACzB,SAAO,KAAK,SAAS,SAAS;;;;;;AC9DlC,IAAsB,yBAAtB,cAGU,cAEV;CACE,AAAU;CACV,AAAU;CACV,AAAU,kBAAyC;CAEnD,YACE,IACA,MACA,QACA,OACA,cACA;AACA,QAAM,IAAI,MAAM,OAAO;EACvB,MAAM,eAAe,SAAU,OAAO,WAAiB;AACvD,OAAK,SAAS;AACd,OAAK,aAAa;;CAGpB,AAAU,iBAAuB;AAC/B,2BAGE,MAAM;GACN,QAAQE;GACR,YAAYA;GACZ,iBAAiBA;GACjB,OAAOC;GACP,WAAWA;GACX,SAASA;GACT,QAAQA;GACR,UAAUA;GACV,UAAUC;GACV,mBAAmBA;GACnB,QAAQA;GACR,QAAQA;GACT,CAAC;;CAGJ,IAAI,QAAW;AACb,SAAO,KAAK;;CAGd,IAAI,MAAM,UAAa;AACrB,MAAI,KAAK,WACP,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO;AAEtE,OAAK,SAAS;;CAGhB,IAAI,YAAe;AACjB,SAAO,KAAK;;CAGd,IAAI,UAAmB;AACrB,SAAO,KAAK,WAAW,KAAK;;CAK9B,IAAI,UAAyC;EAC3C,MAAM,WAAW,KAAK,OAAO;AAC7B,MAAI,SACF,QAAO;GAAE,YAAY,SAAS;GAAY,SAAS,SAAS;GAAS;;CAKzE,IAAI,iBAAwC;AAC1C,SAAO,KAAK;;CAGd,IAAI,aAAsB;AACxB,SAAO,KAAK,OAAO,aAAa,QAAQ,KAAK,YAAY;;CAG3D,gBAAmB;AACjB,SAAO,KAAK;;CAGd,SAAS,OAAgB,SAAwC;AAC/D,MAAI,KAAK,cAAc,CAAC,SAAS,SAC/B,OAAM,IAAI,MAAM,wCAAwC,KAAK,OAAO;AAEtE,OAAK,SAAS,KAAK,YAAY,MAAM;;CAKvC,kBAAkB,SAAsC;AACtD,OAAK,kBAAkB;;CAGzB,SAAe;AACb,OAAK,aAAa,KAAK;;CAGzB,SAAe;AACb,OAAK,SAAS,KAAK;;CAGrB,AAAS,cAA0C;AACjD,SAAO;;CAGT,IAAa,SAAgC;AAC3C,SAAO,KAAK,eAAe;;CAG7B,AAAU,gBAAuC;AAC/C,SAAO,EAAE;;CAGX,IAAa,WAAkC;AAC7C,MAAI,CAAC,KAAK,gBACR,QAAO,EAAE;AAGX,SAAO,CACL;GACE,UAAU;GACV,MAAM,KAAK,gBAAgB;GAC3B,SAAS,KAAK,gBAAgB;GAC9B,MAAM,KAAK;GACX,QAAQ;IACN,YAAY,KAAK,gBAAgB;IACjC,eAAe,KAAK,gBAAgB;IACrC;GACF,CACF;;;;;;ACjHL,IAAY,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;;;;;;AChCF,IAAa,kBAAb,cAAqC,uBAA+B;CAClE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,GAAG;AAClC,OAAK,gBAAgB;;CAGvB,IAAI,eAAuB;AACzB,SAAQ,KAAK,OAAO,WAAsB;;CAG5C,AAAU,YAAY,OAAwB;AAC5C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,MAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,SAAO,OAAO,MAAM;;CAGtB,AAAmB,gBAAuC;EACxD,MAAM,SAAuB,EAAE;AAE/B,OAAK,iBAAiB,OAAO;AAC7B,OAAK,mBAAmB,OAAO;AAC/B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,gBAAgB,OAAO;AAC5B,OAAK,aAAa,OAAO;AAEzB,SAAO;;CAGT,AAAQ,iBAAiB,QAA4B;AACnD,MAAI,KAAK,OAAO,YAAY,KAAK,WAAW,GAC1C,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACZ,CAAC;;CAIN,AAAQ,mBAAmB,QAA4B;EACrD,MAAM,aAAa,KAAK,OAAO;AAC/B,MAAI,cAAc,KAAK,WAAW,GAChC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,gBAAgB,WAAW;GACpC,MAAM,KAAK;GACX,QAAQ,EAAE,OAAO,YAAY;GAC9B,CAAC;;CAIN,AAAQ,kBAAkB,QAA4B;EACpD,MAAM,YAAY,KAAK,OAAO;AAC9B,MACE,cAAc,UACd,KAAK,OAAO,SAAS,KACrB,KAAK,OAAO,SAAS,UAErB,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,qBAAqB;GAC9B,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAW,QAAQ,KAAK,OAAO;IAAQ;GACvD,CAAC;;CAIN,AAAQ,kBAAkB,QAA4B;EACpD,MAAM,YAAY,KAAK,OAAO;AAC9B,MAAI,cAAc,UAAa,KAAK,OAAO,SAAS,UAClD,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,qBAAqB;GAC9B,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAW,QAAQ,KAAK,OAAO;IAAQ;GACvD,CAAC;;CAIN,AAAQ,gBAAgB,QAA4B;EAClD,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,CAAC,WAAW,KAAK,OAAO,WAAW,EACrC;AAGF,MAAI;AACF,OAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,OAAO,CACxC,QAAO,KAAK;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM,KAAK;IACX,QAAQ,EAAE,SAAS;IACpB,CAAC;UAEE;AACN,UAAO,KAAK;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,MAAM,KAAK;IACX,QAAQ,EAAE,SAAS;IACpB,CAAC;;;CAIN,AAAQ,aAAa,QAA4B;EAC/C,MAAM,aAAa,KAAK,OAAO;AAC/B,MACE,cACA,WAAW,SAAS,KACpB,CAAC,WAAW,SAAS,KAAK,OAAO,CAEjC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACX,QAAQ;IAAE,SAAS;IAAY,QAAQ,KAAK;IAAQ;GACrD,CAAC;;;;;;ACvIR,IAAa,kBAAb,cAAqC,uBAA+B;CAClE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,EAAE;AACjC,OAAK,gBAAgB;;CAGvB,IAAI,eAAuB;AACzB,SAAQ,KAAK,OAAO,WAAsB;;CAG5C,AAAU,YAAY,OAAwB;AAC5C,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,SAAO,OAAO,MAAM,IAAI;;CAG1B,AAAmB,gBAAuC;EACxD,MAAM,SAAuB,EAAE;EAE/B,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,YAAY,UAAa,KAAK,SAAS,QACzC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,0BAA0B;GACnC,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAS,QAAQ,KAAK;IAAQ;GAC9C,CAAC;EAGJ,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,YAAY,UAAa,KAAK,SAAS,QACzC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS,yBAAyB;GAClC,MAAM,KAAK;GACX,QAAQ;IAAE,KAAK;IAAS,QAAQ,KAAK;IAAQ;GAC9C,CAAC;EAGJ,MAAM,aAAa,KAAK,OAAO;AAC/B,MACE,cACA,WAAW,SAAS,KACpB,CAAC,WAAW,SAAS,KAAK,OAAO,CAEjC,QAAO,KAAK;GACV,UAAU;GACV,MAAM;GACN,SAAS;GACT,MAAM,KAAK;GACX,QAAQ;IAAE,SAAS;IAAY,QAAQ,KAAK;IAAQ;GACrD,CAAC;AAGJ,SAAO;;;;;;AChEX,IAAa,mBAAb,cAAsC,uBAAgC;CACpE,AAAS,OAAO,UAAU;CAE1B,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,QAAQ,OAAO,MAAM;AACrC,OAAK,gBAAgB;;CAGvB,IAAI,eAAwB;AAC1B,SAAQ,KAAK,OAAO,WAAuB;;CAG7C,AAAU,YAAY,OAAyB;AAC7C,MAAI,OAAO,UAAU,UACnB,QAAO;AAET,SAAO,QAAQ,MAAM;;;;;;ACnBzB,IAAa,kBAAb,cAAqC,cAA0C;CAC7E,AAAS,OAAO,UAAU;CAE1B,AAAQ,4BAAoC,IAAI,KAAK;CACrD,AAAQ,gCAAwC,IAAI,KAAK;CAEzD,YACE,IACA,MACA,QACA,UACA;AACA,QAAM,IAAI,MAAM,OAAO;AAEvB,MAAI,SACF,MAAK,MAAM,SAAS,UAAU;AAC5B,QAAK,UAAU,IAAI,MAAM,MAAM,MAAM;AACrC,SAAM,SAAS;;AAInB,OAAK,gBAAgB,IAAI,IAAI,KAAK,UAAU;AAE5C,2BAA+D,MAAM;GACnE,WAAWC;GACX,eAAeA;GACf,OAAOC;GACP,UAAUA;GACV,SAASA;GACT,QAAQA;GACR,UAAUA;GACV,UAAUC;GACV,aAAaA;GACb,QAAQA;GACR,QAAQA;GACT,CAAC;;CAGJ,IAAI,QAAmC;AACrC,SAAO,OAAO,YAAY,KAAK,UAAU;;CAG3C,IAAI,WAAiC;AACnC,SAAO,MAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;;CAG5C,gBAAyC;EACvC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,SAAS,KAAK,UAC7B,QAAO,OAAO,KAAK,eAAe;AAEpC,SAAO;;CAGT,MAAM,MAAqC;AACzC,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAuB;AAC9B,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAuB;EAC9B,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK,KAAK;AAC9C,MAAI,SACF,UAAS,SAAS;AAEpB,OAAK,SAAS;AACd,OAAK,UAAU,IAAI,KAAK,MAAM,KAAK;;CAGrC,YAAY,MAAoB;EAC9B,MAAM,OAAO,KAAK,UAAU,IAAI,KAAK;AACrC,MAAI,MAAM;AACR,QAAK,SAAS;AACd,QAAK,UAAU,OAAO,KAAK;;;CAI/B,IAAI,UAAmB;AACrB,MAAI,KAAK,UAAU,SAAS,KAAK,cAAc,KAC7C,QAAO;AAGT,OAAK,MAAM,CAAC,KAAK,UAAU,KAAK,UAC9B,KAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAClC,QAAO;AAIX,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,KAAI,aAAa,SAAU,MAA+B,QACxD,QAAO;AAIX,SAAO;;CAGT,SAAe;AACb,OAAK,gBAAgB,IAAI,IAAI,KAAK,UAAU;AAC5C,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,KAAI,YAAY,SAAS,OAAO,MAAM,WAAW,WAC/C,CAAC,MAAiC,QAAQ;;CAKhD,SAAe;AACb,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,OAAM,SAAS;AAGjB,OAAK,YAAY,IAAI,IAAI,KAAK,cAAc;AAE5C,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,EAAE;AAC3C,SAAM,SAAS;AACf,OAAI,YAAY,SAAS,OAAO,MAAM,WAAW,WAC/C,CAAC,MAAiC,QAAQ;;;CAKhD,AAAS,WAAqC;AAC5C,SAAO;;CAGT,IAAa,SAAgC;EAC3C,MAAM,SAAuB,EAAE;AAE/B,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,QAAO,KAAK,GAAG,MAAM,OAAO;AAG9B,SAAO;;CAGT,IAAa,WAAkC;EAC7C,MAAM,WAAyB,EAAE;AAEjC,OAAK,MAAM,SAAS,KAAK,UAAU,QAAQ,CACzC,UAAS,KAAK,GAAG,MAAM,SAAS;AAGlC,SAAO;;;;;;AC/IX,IAAa,iBAAb,cAAoC,cAAyC;CAC3E,AAAS,OAAO,UAAU;CAE1B,AAAQ,SAAsB,EAAE;CAChC,AAAQ,aAA0B,EAAE;CACpC,AAAQ,eAAmC;CAE3C,YACE,IACA,MACA,QACA,OACA;AACA,QAAM,IAAI,MAAM,OAAO;AAEvB,MAAI,MACF,MAAK,MAAM,QAAQ,OAAO;AACxB,QAAK,SAAS;AACd,QAAK,OAAO,KAAK,KAAK;;AAI1B,OAAK,aAAa,CAAC,GAAG,KAAK,OAAO;AAElC,2BAAwD,MAAM;GAC5D,QAAQC;GACR,YAAYA;GACZ,OAAOC;GACP,QAAQA;GACR,SAASA;GACT,QAAQA;GACR,UAAUA;GACV,MAAMC;GACN,UAAUA;GACV,UAAUA;GACV,MAAMA;GACN,WAAWA;GACX,OAAOA;GACP,QAAQA;GACR,QAAQA;GACR,WAAWA;GACX,eAAeA;GAChB,CAAC;;CAGJ,IAAI,QAA8B;AAChC,SAAO,KAAK;;CAGd,IAAI,SAAiB;AACnB,SAAO,KAAK,OAAO;;CAGrB,gBAA2B;AACzB,SAAO,KAAK,OAAO,KAAK,SAAS,KAAK,eAAe,CAAC;;CAGxD,GAAG,OAAsC;AACvC,MAAI,QAAQ,EACV,QAAO,KAAK,OAAO,KAAK,OAAO,SAAS;AAE1C,SAAO,KAAK,OAAO;;CAGrB,KAAK,MAAuB;AAC1B,OAAK,SAAS;AACd,OAAK,OAAO,KAAK,KAAK;;CAGxB,SAAS,OAAe,MAAuB;AAC7C,MAAI,QAAQ,KAAK,QAAQ,KAAK,OAAO,OACnC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;AAElD,OAAK,SAAS;AACd,OAAK,OAAO,OAAO,OAAO,GAAG,KAAK;;CAGpC,SAAS,OAAqB;AAC5B,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,OACpC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;EAElD,MAAM,UAAU,KAAK,OAAO,OAAO,OAAO,EAAE,CAAC;AAC7C,MAAI,QACF,SAAQ,SAAS;;CAIrB,KAAK,WAAmB,SAAuB;AAC7C,MAAI,YAAY,KAAK,aAAa,KAAK,OAAO,OAC5C,OAAM,IAAI,MAAM,+BAA+B,YAAY;AAE7D,MAAI,UAAU,KAAK,WAAW,KAAK,OAAO,OACxC,OAAM,IAAI,MAAM,+BAA+B,UAAU;AAE3D,MAAI,cAAc,QAChB;EAGF,MAAM,CAAC,QAAQ,KAAK,OAAO,OAAO,WAAW,EAAE;AAC/C,MAAI,KACF,MAAK,OAAO,OAAO,SAAS,GAAG,KAAK;;CAIxC,UAAU,OAAe,MAAuB;AAC9C,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,OACpC,OAAM,IAAI,MAAM,wBAAwB,QAAQ;EAElD,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,QACF,SAAQ,SAAS;AAEnB,OAAK,SAAS;AACd,OAAK,OAAO,SAAS;;CAGvB,QAAc;AACZ,OAAK,MAAM,QAAQ,KAAK,OACtB,MAAK,SAAS;AAEhB,OAAK,OAAO,SAAS;;CAGvB,eAAe,SAA4B;AACzC,OAAK,eAAe;;CAGtB,UAAU,OAAuB;EAC/B,MAAM,OAAO,KAAK,eAAe,KAAK,OAAO,QAAQ,MAAM;AAC3D,OAAK,KAAK,KAAK;;CAGjB,cAAc,OAAe,OAAuB;EAClD,MAAM,OAAO,KAAK,eAAe,OAAO,MAAM;AAC9C,OAAK,SAAS,OAAO,KAAK;;CAG5B,AAAQ,eAAe,OAAe,OAA4B;AAChE,MAAI,CAAC,KAAK,aACR,OAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,aAAa,KAAK,OAAO;AAC/B,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,kBAAkB;EAGpC,MAAM,YAAY,UAAU,SAAY,WAAW,UAAU;EAC7D,MAAM,OAAO,KAAK,aAAa,OAAO,OAAO,MAAM,EAAE,YAAY,UAAU;AAE3E,OAAK,iBAAiB,KAAK;AAE3B,SAAO;;CAGT,AAAQ,iBAAiB,MAAuB;AAC9C,MAAI,CAAC,KAAK,aACR;AAGF,MAAI,KAAK,SAAS,EAAE;AAClB,QAAK,eAAe,KAAK,aAAa;AACtC,QAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,iBAAiB,KAAK;aAEpB,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,iBAAiB,MAAM;;CAKlC,IAAI,UAAmB;AACrB,MAAI,KAAK,OAAO,WAAW,KAAK,WAAW,OACzC,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,IACtC,KAAI,KAAK,OAAO,OAAO,KAAK,WAAW,GACrC,QAAO;AAIX,OAAK,MAAM,QAAQ,KAAK,OACtB,KAAI,aAAa,QAAS,KAA8B,QACtD,QAAO;AAIX,SAAO;;CAGT,SAAe;AACb,OAAK,aAAa,CAAC,GAAG,KAAK,OAAO;AAClC,OAAK,MAAM,QAAQ,KAAK,OACtB,KAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,CAAC,KAAgC,QAAQ;;CAK/C,SAAe;AACb,OAAK,MAAM,QAAQ,KAAK,OACtB,MAAK,SAAS;AAGhB,OAAK,SAAS,CAAC,GAAG,KAAK,WAAW;AAElC,OAAK,MAAM,QAAQ,KAAK,QAAQ;AAC9B,QAAK,SAAS;AACd,OAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,CAAC,KAAgC,QAAQ;;;CAK/C,AAAS,UAAmC;AAC1C,SAAO;;CAGT,IAAa,SAAgC;EAC3C,MAAM,SAAuB,EAAE;AAE/B,OAAK,MAAM,QAAQ,KAAK,OACtB,QAAO,KAAK,GAAG,KAAK,OAAO;AAG7B,SAAO;;CAGT,IAAa,WAAkC;EAC7C,MAAM,WAAyB,EAAE;AAEjC,OAAK,MAAM,QAAQ,KAAK,OACtB,UAAS,KAAK,GAAG,KAAK,SAAS;AAGjC,SAAO;;;;;;ACrOX,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,4BAAY,IAAI,KAA4B;CAE7D,SAAS,YAAoB,SAA8B;AACzD,OAAK,UAAU,IAAI,YAAY,QAAQ;AACvC,SAAO;;CAGT,IAAI,YAA+C;AACjD,SAAO,KAAK,UAAU,IAAI,WAAW;;CAGvC,IAAI,YAA6B;AAC/B,SAAO,KAAK,UAAU,IAAI,WAAW;;;AAIzC,IAAaC,gBAAb,MAAyB;CACvB,YAAY,AAAiB,UAA+B;EAA/B;;CAE7B,OACE,MACA,QACA,OACA,IACW;EACX,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,UAAU,KAAK,SAAS,IAAI,WAAW;AAE7C,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,wBAAwB,aAAa;AAGvD,SAAO,QAAQ,MAAM,QAAQ,OAAO,GAAG;;CAGzC,WAAW,QAA0B,OAA2B;AAC9D,SAAO,KAAK,OAAO,IAAI,QAAQ,MAAM;;;AAIzC,MAAM,iBAAgC,MAAM,QAAQ,OAAO,OAAO;AAChE,QAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,MAA4B;;AAG3E,MAAM,iBAAgC,MAAM,QAAQ,OAAO,OAAO;AAChE,QAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,MAA4B;;AAG3E,MAAM,kBAAiC,MAAM,QAAQ,OAAO,OAAO;AACjE,QAAO,IAAI,iBAAiB,IAAI,MAAM,QAAQ,MAA6B;;AAG7E,SAAS,oBAAoB,aAAyC;AACpE,SAAQ,MAAM,QAAQ,OAAO,OAAO;EAClC,MAAM,WAAY,SAAS,EAAE;EAC7B,MAAM,WAAwB,EAAE;EAEhC,MAAM,aAAa,OAAO,cAAc,EAAE;AAC1C,OAAK,MAAM,CAAC,UAAU,eAAe,OAAO,QAAQ,WAAW,EAAE;GAC/D,MAAM,YAAY,SAAS;GAC3B,MAAM,YAAY,YAAY,OAAO,UAAU,YAAY,UAAU;AACrE,YAAS,KAAK,UAAU;;AAG1B,SAAO,IAAI,gBAAgB,IAAI,MAAM,QAAQ,SAAS;;;AAI1D,SAAS,mBAAmB,aAAyC;AACnE,SAAQ,MAAM,QAAQ,OAAO,OAAO;EAClC,MAAM,WAAY,SAAS,EAAE;EAC7B,MAAM,aAAa,OAAO,SAAS,EAAE,MAAM,UAAU;EACrD,MAAM,QAAqB,EAAE;AAE7B,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GACxC,MAAM,YAAY,SAAS;GAC3B,MAAM,WAAW,YAAY,OAAO,OAAO,EAAE,EAAE,YAAY,UAAU;AACrE,SAAM,KAAK,SAAS;;AAGtB,SAAO,IAAI,eAAe,IAAI,MAAM,QAAQ,MAAM;;;AAItD,SAAgB,wBAA6C;CAC3D,MAAM,WAAW,IAAI,qBAAqB;AAE1C,UAAS,SAAS,UAAU,cAAc;AAC1C,UAAS,SAAS,UAAU,cAAc;AAC1C,UAAS,SAAS,WAAW,eAAe;AAE5C,QAAO;;AAGT,SAAgB,oBAAiC;CAC/C,MAAM,WAAW,uBAAuB;CACxC,MAAM,UAAU,IAAIA,cAAY,SAAS;AAEzC,UAAS,SAAS,UAAU,oBAAoB,QAAQ,CAAC;AACzD,UAAS,SAAS,SAAS,mBAAmB,QAAQ,CAAC;AAEvD,QAAO;;;;;AChHT,IAAa,OAAb,MAAa,KAAK;CAChB,AAAQ,YAAY,AAAiB,WAAmC;EAAnC;;CAErC,OAAO,QAAc;AACnB,SAAO,IAAI,KAAK,EAAE,CAAC;;CAGrB,OAAwB,cAAc;CACtC,OAAwB,aAAa;CAErC,OAAO,WAAW,MAAoB;AACpC,MAAI,CAAC,QAAQ,SAAS,GACpB,QAAO,KAAK,OAAO;EAGrB,MAAM,WAA0B,EAAE;EAClC,IAAI,UAAU;AAEd,SAAO,QAAQ,SAAS,GAAG;GACzB,MAAM,aAAa,KAAK,YAAY,KAAK,QAAQ;AACjD,OAAI,aAAa,OAAO,QAAW;AACjC,aAAS,KAAK;KACZ,MAAM;KACN,OAAO,OAAO,SAAS,WAAW,IAAI,GAAG;KAC1C,CAAC;AACF,cAAU,QAAQ,MAAM,WAAW,GAAG,OAAO;AAC7C;;AAGF,OAAI,QAAQ,WAAW,MAAM,EAAE;AAC7B,aAAS,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,cAAU,QAAQ,MAAM,EAAE;AAC1B;;GAGF,MAAM,YAAY,KAAK,WAAW,KAAK,QAAQ;AAC/C,OAAI,YAAY,OAAO,QAAW;AAChC,aAAS,KAAK;KAAE,MAAM;KAAY,MAAM,UAAU;KAAI,CAAC;AACvD,cAAU,QAAQ,MAAM,UAAU,GAAG,OAAO;AAC5C;;AAGF,SAAM,IAAI,MAAM,yBAAyB,UAAU;;AAGrD,SAAO,IAAI,KAAK,SAAS;;CAG3B,OAAO,aAAa,UAAwC;AAC1D,SAAO,IAAI,KAAK,CAAC,GAAG,SAAS,CAAC;;CAGhC,WAAmC;AACjC,SAAO,KAAK;;CAGd,UAAmB;AACjB,SAAO,KAAK,UAAU,WAAW;;CAGnC,SAAiB;AACf,SAAO,KAAK,UAAU;;CAGxB,QAAiC;AAC/B,SAAO,KAAK,UAAU;;CAGxB,OAAgC;AAC9B,SAAO,KAAK,UAAU,GAAG,GAAG;;CAG9B,SAAe;AACb,MAAI,KAAK,UAAU,WAAW,EAC5B,QAAO;AAET,SAAO,IAAI,KAAK,KAAK,UAAU,MAAM,GAAG,GAAG,CAAC;;CAG9C,MAAM,MAAoB;AACxB,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;GAAE,MAAM;GAAY;GAAM,CAAC,CAAC;;CAGlE,WAAW,OAAqB;AAC9B,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;GAAE,MAAM;GAAS;GAAO,CAAC,CAAC;;CAGhE,aAAmB;AACjB,SAAO,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC;;CAGzD,UAAU,QAAuB;AAC/B,MAAI,OAAO,UAAU,UAAU,KAAK,UAAU,OAC5C,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,UAAU,QAAQ,KAAK;GAChD,MAAM,YAAY,OAAO,UAAU;GACnC,MAAM,UAAU,KAAK,UAAU;AAC/B,OAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,cAAc,WAAW,QAAQ,CACnE,QAAO;;AAIX,SAAO;;CAGT,OAAO,OAAsB;AAC3B,MAAI,KAAK,UAAU,WAAW,MAAM,UAAU,OAC5C,QAAO;AAGT,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,UAAU,QAAQ,KAAK;GAC9C,MAAM,UAAU,KAAK,UAAU;GAC/B,MAAM,WAAW,MAAM,UAAU;AACjC,OAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,cAAc,SAAS,SAAS,CACjE,QAAO;;AAIX,SAAO;;CAGT,WAAmB;EACjB,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,KAAK,UACzB,KAAI,QAAQ,SAAS,YAAY;AAC/B,OAAI,OAAO,SAAS,EAClB,WAAU;AAEZ,aAAU,QAAQ;aACT,QAAQ,SAAS,QAC1B,WAAU,IAAI,QAAQ,MAAM;WACnB,QAAQ,SAAS,QAC1B,WAAU;AAId,SAAO;;CAGT,gBAAwB;AACtB,MAAI,KAAK,UAAU,WAAW,EAC5B,QAAO;EAGT,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,KAAK,UACzB,KAAI,QAAQ,SAAS,WACnB,WAAU,MAAM,QAAQ;WACf,QAAQ,SAAS,QAC1B,WAAU,MAAM,QAAQ;WACf,QAAQ,SAAS,QAC1B,WAAU;AAId,SAAO;;CAGT,AAAQ,cAAc,GAAgB,GAAyB;AAC7D,MAAI,EAAE,SAAS,EAAE,KACf,QAAO;AAGT,MAAI,EAAE,SAAS,cAAc,EAAE,SAAS,WACtC,QAAO,EAAE,SAAS,EAAE;AAGtB,MAAI,EAAE,SAAS,WAAW,EAAE,SAAS,QACnC,QAAO,EAAE,UAAU,EAAE;AAGvB,SAAO;;;;;;ACjLX,IAAa,YAAb,MAAuB;CACrB,AAAiB,4BAAY,IAAI,KAAwB;CACzD,AAAiB,4BAAY,IAAI,KAAmB;CAEpD,YAAY,AAAiB,MAAiB;EAAjB;AAC3B,OAAK,SAAS;;CAGhB,SAAS,IAAmC;EAC1C,MAAM,OAAO,KAAK,UAAU,IAAI,GAAG;AACnC,MAAI,KACF,QAAO;AAGT,OAAK,SAAS;AACd,SAAO,KAAK,UAAU,IAAI,GAAG;;CAG/B,OAAO,MAAuB;AAC5B,MAAI,KAAK,cAAc,KAAK,CAC1B,QAAO,KAAK,YAAY,KAAK;EAG/B,MAAM,SAAS,KAAK,UAAU,IAAI,KAAK,GAAG;AAC1C,MAAI,OACF,QAAO;EAGT,MAAM,OAAO,KAAK,YAAY,KAAK;AACnC,OAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AACjC,SAAO;;CAGT,AAAQ,cAAc,MAA0B;EAC9C,IAAI,UAA4B,KAAK;AACrC,SAAO,SAAS;AACd,OAAI,QAAQ,SAAS,CACnB,QAAO;AAET,aAAU,QAAQ;;AAEpB,SAAO;;CAGT,UAAgB;AACd,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,OAAO;AACtB,OAAK,UAAU,KAAK,KAAK;;CAG3B,aAAa,MAAuB;AAClC,OAAK,UAAU,KAAK;;CAGtB,qBAAqB,MAAuB;AAC1C,OAAK,UAAU,OAAO,KAAK,GAAG;AAC9B,OAAK,qBAAqB,KAAK;;CAGjC,AAAQ,UAAU,MAAuB;AACvC,OAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AAEjC,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,UAAU,MAAM;WAEd,KAAK,SAAS,CACvB,MAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,UAAU,KAAK;;CAK1B,AAAQ,YAAY,MAAuB;EACzC,MAAM,WAEF,EAAE;EACN,IAAI,UAA4B;AAEhC,SAAO,SAAS,QAAQ;GACtB,MAAM,SAAoB,QAAQ;AAElC,OAAI,OAAO,UAAU,CACnB,UAAS,QAAQ;IAAE,MAAM;IAAY,MAAM,QAAQ;IAAM,CAAC;YACjD,OAAO,SAAS,EAAE;IAC3B,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAQ;AAC3C,QAAI,SAAS,EACX,UAAS,QAAQ;KAAE,MAAM;KAAS;KAAO,CAAC;;AAI9C,aAAU;;AAGZ,SAAO,KAAK,aAAa,SAAS;;CAGpC,AAAQ,qBAAqB,MAAuB;AAClD,MAAI,KAAK,UAAU,CACjB,MAAK,MAAM,SAAS,KAAK,UAAU;AACjC,QAAK,UAAU,OAAO,MAAM,GAAG;AAC/B,QAAK,qBAAqB,MAAM;;WAEzB,KAAK,SAAS,CACvB,MAAK,MAAM,QAAQ,KAAK,OAAO;AAC7B,QAAK,UAAU,OAAO,KAAK,GAAG;AAC9B,QAAK,qBAAqB,KAAK;;;;;;;AC3GvC,IAAa,gBAAb,MAA2B;CACzB,AAAQ,WAAqB,EAAE;CAE/B,IAAI,UAA6B;AAC/B,SAAO,KAAK;;CAGd,IAAI,aAAsB;AACxB,SAAO,KAAK,SAAS,SAAS;;CAGhC,MAAM,QAAsB;AAC1B,OAAK,SAAS,KAAK,OAAO;;CAG5B,QAAc;AACZ,OAAK,WAAW,EAAE;;CAGpB,YAAkC;EAChC,MAAM,UAAuB,EAAE;AAE/B,OAAK,MAAM,UAAU,KAAK,UAAU;GAClC,MAAM,QAAQ,KAAK,gBAAgB,OAAO;AAC1C,WAAQ,KAAK,GAAG,MAAM;;AAGxB,SAAO;;CAGT,AAAQ,gBAAgB,QAA6B;EACnD,MAAM,OAAO,OAAO,KAAK,eAAe;AAExC,UAAQ,OAAO,MAAf;GACE,KAAK,WACH,QAAO,CAAC;IAAE,IAAI;IAAW;IAAM,OAAO,OAAO;IAAO,CAAC;GAEvD,KAAK,cACH,QAAO,CAAC;IAAE,IAAI;IAAO;IAAM,OAAO,OAAO;IAAO,CAAC;GAEnD,KAAK,iBACH,QAAO,CAAC;IAAE,IAAI;IAAU;IAAM,CAAC;GAEjC,KAAK,YACH,QAAO,CAAC;IAAE,IAAI;IAAO,MAAM,GAAG,KAAK;IAAK,OAAO,OAAO;IAAO,CAAC;GAEhE,KAAK,cACH,QAAO,CACL;IAAE,IAAI;IAAO,MAAM,GAAG,KAAK,GAAG,OAAO;IAAS,OAAO,OAAO;IAAO,CACpE;GAEH,KAAK,cACH,QAAO,CAAC;IAAE,IAAI;IAAU,MAAM,GAAG,KAAK,GAAG,OAAO;IAAS,CAAC;GAE5D,KAAK,aAAa;IAChB,MAAM,YAAY,OAAO,aAAa;IACtC,MAAM,UAAU,OAAO,WAAW;AAClC,WAAO,CACL;KACE,IAAI;KACJ,MAAM,GAAG,KAAK,GAAG;KACjB,MAAM,GAAG,KAAK,GAAG;KAClB,CACF;;GAGH,KAAK,eACH,QAAO,CACL;IACE,IAAI;IACJ,MAAM,GAAG,KAAK,GAAG,OAAO;IACxB,OAAO,OAAO;IACf,CACF;GAEH,KAAK,aACH,QAAO,CAAC;IAAE,IAAI;IAAW;IAAM,OAAO,EAAE;IAAE,CAAC;GAE7C,QACE,QAAO,EAAE;;;;;;;ACxEjB,IAAa,YAAb,MAAuB;CACrB,AAAiB;CACjB,AAAiB;CACjB,AAAQ,iBAAuC;CAE/C,YAAY,AAAiB,OAAkB;EAAlB;AAC3B,OAAK,QAAQ,IAAI,UAAU,MAAM;AACjC,OAAK,gBAAgB,IAAI,eAAe;AAExC,2BAAe,MAAM;GACnB,WAAWC;GACX,aAAaA;GACb,gBAAgBA;GAChB,SAASA;GACT,gBAAgBA;GAChB,SAASA;GACT,QAAQC;GACR,QAAQA;GACT,CAAC;;CAGJ,IAAI,OAAkB;AACpB,SAAO,KAAK;;CAGd,SAAS,IAAmC;AAC1C,SAAO,KAAK,MAAM,SAAS,GAAG;;CAGhC,IAAI,MAAqC;AACvC,SAAO,KAAK,UAAU,KAAK,WAAW,KAAK,CAAC;;CAG9C,UAAU,MAAmC;AAC3C,MAAI,KAAK,SAAS,CAChB,QAAO,KAAK;EAGd,IAAI,UAAiC,KAAK;AAE1C,OAAK,MAAM,WAAW,KAAK,UAAU,EAAE;AACrC,OAAI,CAAC,QACH;AAGF,aAAU,KAAK,eAAe,SAAS,QAAQ;;AAGjD,SAAO;;CAGT,AAAQ,eACN,MACA,SACuB;AACvB,MAAI,QAAQ,SAAS,cAAc,KAAK,UAAU,CAChD,QAAO,KAAK,MAAM,QAAQ,KAAK;AAEjC,MAAI,QAAQ,SAAS,WAAW,KAAK,SAAS,CAC5C,QAAO,KAAK,GAAG,QAAQ,MAAM;;CAKjC,OAAO,UAAoC;EACzC,MAAM,OACJ,OAAO,aAAa,WAAW,KAAK,SAAS,SAAS,GAAG;AAC3D,MAAI,CAAC,KACH,QAAO,KAAK,OAAO;AAErB,SAAO,KAAK,MAAM,OAAO,KAAK;;CAGhC,IAAI,YAAmC;AACrC,SAAO,KAAK,MAAM;;CAGpB,IAAI,cAAqC;AACvC,SAAO,KAAK,MAAM;;CAGpB,IAAI,iBAAwC;AAC1C,SAAO,CAAC,GAAG,KAAK,WAAW,GAAG,KAAK,YAAY;;CAGjD,IAAI,UAAmB;AACrB,SAAO,KAAK,UAAU,WAAW;;CAGnC,IAAI,iBAA0B;AAC5B,SAAO,KAAK,eAAe,SAAS;;CAGtC,IAAI,eAA2D;EAC7D,MAAM,sBAAM,IAAI,KAA2B;AAC3C,OAAK,MAAM,SAAS,KAAK,WAAW;GAClC,MAAM,OAAO,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE;AACtC,QAAK,KAAK,MAAM;AAChB,OAAI,IAAI,MAAM,MAAM,KAAK;;AAE3B,SAAO;;CAGT,SAAS,MAAuB;AAC9B,SAAO,KAAK,IAAI,KAAK,EAAE,eAAe;;CAGxC,SAAS,MAAc,OAAsB;EAC3C,MAAM,aAAa,KAAK,WAAW,KAAK;EACxC,MAAM,OAAO,KAAK,UAAU,WAAW;AACvC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,mBAAmB,OAAO;AAE5C,MAAI,CAAC,KAAK,aAAa,CACrB,OAAM,IAAI,MAAM,2CAA2C,OAAO;EAGpE,MAAM,WAAW,KAAK;AACtB,OAAK,SAAS,MAAM;AAEpB,OAAK,cAAc,MAAM;GACvB,MAAM;GACN,MAAM;GACN;GACA;GACD,CAAC;;CAGJ,gBAAyB;AACvB,SAAO,KAAK,MAAM,eAAe;;CAGnC,IAAI,UAA6B;AAC/B,SAAO,KAAK,cAAc;;CAG5B,IAAI,aAAsB;AACxB,SAAO,KAAK,cAAc;;CAG5B,eAAqB;AACnB,OAAK,cAAc,OAAO;;CAG5B,aAAmC;AACjC,SAAO,KAAK,cAAc,WAAW;;CAGvC,YAAY,QAAsB;AAChC,OAAK,cAAc,MAAM,OAAO;;CAGlC,eAAqB;AACnB,OAAK,MAAM,SAAS;;CAGtB,qBAAqB,MAAuB;AAC1C,OAAK,MAAM,qBAAqB,KAAK;;CAGvC,IAAI,UAAmB;EACrB,MAAM,OAAO,KAAK;AAClB,MAAI,aAAa,KACf,QAAO,KAAK;AAEd,SAAO;;CAGT,SAAe;EACb,MAAM,OAAO,KAAK;AAClB,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,MAAK,QAAQ;AAEf,OAAK,cAAc,OAAO;;CAG5B,SAAe;EACb,MAAM,OAAO,KAAK;AAClB,MAAI,YAAY,QAAQ,OAAO,KAAK,WAAW,WAC7C,MAAK,QAAQ;AAEf,OAAK,cAAc,OAAO;;CAG5B,iBAAiB,QAA6B;AAC5C,OAAK,iBAAiB;;CAGxB,IAAI,gBAAsC;AACxC,SAAO,KAAK;;CAGd,UAAgB;AACd,OAAK,gBAAgB,SAAS;AAC9B,OAAK,iBAAiB;;;;;;AC1L1B,MAAM,cAAc;AACpB,MAAM,aAAa;AAEnB,IAAa,mBAAb,MAA8B;CAC5B,AAAQ,OAAyB;CAEjC,QAAQ,MAAiC;AACvC,OAAK,OAAO;EACZ,MAAM,WAA2B,EAAE;AACnC,OAAK,SAAS,MAAM;GAAE,QAAQ;GAAM,aAAa,EAAE;GAAE,EAAE,SAAS;AAChE,SAAO;;CAGT,AAAQ,SACN,MACA,SACA,UACM;AACN,MAAI,KAAK,aAAa,CACpB,MAAK,iBAAiB,MAAM,SAAS,SAAS;WACrC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,SAAS,OAAO;GAAE,GAAG;GAAS,QAAQ;GAAM,EAAE,SAAS;WAErD,KAAK,SAAS,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,OAAI,KACF,MAAK,SACH,MACA;IACE,GAAG;IACH,aAAa,CAAC,GAAG,QAAQ,aAAa;KAAE,OAAO;KAAM,OAAO;KAAG,CAAC;IACjE,EACD,SACD;;;CAMT,AAAQ,iBACN,MACA,SACA,UACM;EACN,MAAM,UAAU,KAAK;AACrB,MAAI,CAAC,QACH;EAGF,MAAM,kBAAkB,KAAK,oBAAoB,QAAQ,WAAW;EACpE,MAAM,kBAAkB,KAAK,oBAC3B,iBACA,MACA,QACD;AAED,WAAS,KAAK;GACZ;GACA,YAAY,QAAQ;GACpB,QAAQ,QAAQ;GAChB;GACA,aAAa,QAAQ;GACtB,CAAC;;CAGJ,AAAQ,oBAAoB,YAAuC;AACjE,MAAI;AAEF,iDAD+B,WAAW,CAC5B;UACR;AACN,UAAO,EAAE;;;CAIb,AAAQ,oBACN,SACA,aACA,SACsB;EACtB,MAAM,QAA8B,EAAE;AAEtC,OAAK,MAAM,OAAO,SAAS;GACzB,MAAM,OAAO,KAAK,qBAAqB,KAAK,aAAa,QAAQ;AACjE,OAAI,KACF,MAAK,sBAAsB,MAAM,MAAM;;AAI3C,SAAO;;CAGT,AAAQ,sBACN,MACA,QACM;AACN,MAAI,KAAK,aAAa,CACpB,QAAO,KAAK,KAAK;WACR,KAAK,SAAS,CACvB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,OAAI,KACF,MAAK,sBAAsB,MAAM,OAAO;;WAGnC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,sBAAsB,OAAO,OAAO;;CAK/C,AAAQ,qBACN,KACA,cACA,SACkB;AAClB,MAAI,IAAI,WAAW,IAAI,CACrB,QAAO,KAAK,gBAAgB,IAAI,MAAM,EAAE,CAAC;AAG3C,MAAI,IAAI,WAAW,MAAM,CACvB,QAAO,KAAK,gBAAgB,KAAK,QAAQ;AAG3C,MAAI,QAAQ,OACV,QAAO,KAAK,gBAAgB,QAAQ,QAAQ,IAAI;AAGlD,SAAO,KAAK,gBAAgB,IAAI;;CAGlC,AAAQ,gBAAgB,SAAmC;AACzD,MAAI,CAAC,KAAK,KACR,QAAO;AAET,SAAO,KAAK,gBAAgB,KAAK,MAAM,QAAQ;;CAGjD,AAAQ,gBACN,WACA,SACkB;EAClB,MAAM,WAAW,KAAK,kBAAkB,QAAQ;EAChD,IAAI,UAA4B;AAEhC,OAAK,MAAM,WAAW,UAAU;AAC9B,OAAI,CAAC,QACH,QAAO;AAGT,OAAI,QAAQ,SAAS,WACnB,KAAI,QAAQ,UAAU,CACpB,WACE,QAAQ,SAAS,MAAM,MAAM,EAAE,SAAS,QAAQ,KAAK,IAAI;OAE3D,QAAO;YAEA,QAAQ,SAAS,QAC1B,KAAI,QAAQ,SAAS,CACnB,WAAU,QAAQ,GAAG,QAAQ,MAAM,IAAI;OAEvC,QAAO;;AAKb,SAAO;;CAGT,AAAQ,gBACN,KACA,SACkB;EAClB,IAAI,WAAW;EACf,IAAI,YAAY;AAEhB,SAAO,UAAU,WAAW,MAAM,EAAE;AAClC;AACA,eAAY,UAAU,MAAM,EAAE;;EAGhC,IAAI,UAA4B,QAAQ;AAExC,OAAK,IAAI,IAAI,GAAG,IAAI,YAAY,SAAS,KAAK;AAC5C,aAAU,KAAK,WAAW,QAAQ;AAClC,OAAI,SAAS,SAAS,CACpB,WAAU,KAAK,WAAW,QAAQ;;AAItC,MAAI,CAAC,QACH,QAAO;AAGT,MAAI,UACF,QAAO,KAAK,gBAAgB,SAAS,UAAU;AAGjD,SAAO;;CAGT,AAAQ,WAAW,MAAmC;AACpD,MAAI,CAAC,KAAK,QAAQ,SAAS,KAAK,KAC9B,QAAO;AAGT,SAAO,KAAK,oBAAoB,KAAK,MAAM,KAAK;;CAGlD,AAAQ,oBACN,SACA,QACkB;EAClB,MAAM,WAAW,KAAK,cAAc,QAAQ;AAE5C,OAAK,MAAM,SAAS,UAAU;AAC5B,OAAI,UAAU,OACZ,QAAO;GAET,MAAM,QAAQ,KAAK,oBAAoB,OAAO,OAAO;AACrD,OAAI,MACF,QAAO;;AAIX,SAAO;;CAGT,AAAQ,cAAc,MAA8B;AAClD,MAAI,KAAK,UAAU,CACjB,QAAO,CAAC,GAAG,KAAK,SAAS;AAE3B,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,QAAqB,EAAE;AAC7B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,KACF,OAAM,KAAK,KAAK;;AAGpB,UAAO;;AAET,SAAO,EAAE;;CAGX,AAAQ,kBAAkB,SAAgC;EACxD,MAAM,WAA0B,EAAE;EAClC,IAAI,UAAU;AAEd,SAAO,QAAQ,SAAS,GAAG;GACzB,MAAM,aAAa,YAAY,KAAK,QAAQ;AAC5C,OAAI,aAAa,IAAI;AACnB,aAAS,KAAK;KACZ,MAAM;KACN,OAAO,OAAO,SAAS,WAAW,IAAI,GAAG;KAC1C,CAAC;AACF,cAAU,QAAQ,MAAM,WAAW,GAAG,OAAO;AAC7C;;GAGF,MAAM,YAAY,WAAW,KAAK,QAAQ;AAC1C,OAAI,YAAY,IAAI;AAClB,aAAS,KAAK;KAAE,MAAM;KAAY,MAAM,UAAU;KAAI,CAAC;AACvD,cAAU,QAAQ,MAAM,UAAU,GAAG,OAAO;AAC5C;;AAGF;;AAGF,SAAO;;;;;;AC9RX,IAAa,kBAAb,MAA6B;CAC3B,mBAAmB,UAAkD;EACnE,MAAM,sBAAqB,IAAI,KAAK;AAEpC,OAAK,MAAM,SAAS,SAClB,MAAK,MAAM,WAAW,MAAM,iBAAiB;GAC3C,IAAI,SAAS,IAAI,IAAI,QAAQ;AAC7B,OAAI,CAAC,QAAQ;AACX,6BAAS,IAAI,KAAK;AAClB,QAAI,IAAI,SAAS,OAAO;;AAE1B,UAAO,IAAI,MAAM;;AAIrB,SAAO;;CAGT,qBACE,UACyB;EACzB,MAAM,eAAe,IAAI,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK,CAAC;EACzD,MAAM,0BAAU,IAAI,KAAyB;EAC7C,MAAM,QAAwB,EAAE;EAEhC,MAAM,gCAAgB,IAAI,KAAuC;AACjE,OAAK,MAAM,SAAS,SAClB,eAAc,IAAI,MAAM,MAAM,MAAM;EAGtC,MAAM,SACJ,OACA,UACS;AACT,OAAI,QAAQ,IAAI,MAAM,KAAK,CACzB;AAGF,OAAI,MAAM,IAAI,MAAM,KAAK,CACvB;AAGF,SAAM,IAAI,MAAM,KAAK;AAErB,QAAK,MAAM,WAAW,MAAM,gBAC1B,KAAI,aAAa,IAAI,QAAQ,EAAE;IAC7B,MAAM,aAAa,cAAc,IAAI,QAAQ;AAC7C,QAAI,WACF,OAAM,YAAY,MAAM;;AAK9B,SAAM,OAAO,MAAM,KAAK;AACxB,WAAQ,IAAI,MAAM,KAAK;AACvB,SAAM,KAAK,MAAM;;AAGnB,OAAK,MAAM,SAAS,SAClB,OAAM,uBAAO,IAAI,KAAK,CAAC;AAGzB,SAAO;;CAGT,oBACE,aACA,eACA,iBACyB;EACzB,MAAM,2BAAW,IAAI,KAAmB;EACxC,MAAM,QAA8B,CAAC,YAAY;AAEjD,SAAO,MAAM,SAAS,GAAG;GACvB,MAAM,UAAU,MAAM,OAAO;AAC7B,OAAI,CAAC,QACH;GAEF,MAAM,aAAa,cAAc,IAAI,QAAQ;AAE7C,OAAI,YACF;SAAK,MAAM,SAAS,WAClB,KAAI,CAAC,SAAS,IAAI,MAAM,EAAE;AACxB,cAAS,IAAI,MAAM;AACnB,WAAM,KAAK,MAAM,KAAK;;;;AAM9B,SAAO,gBAAgB,QAAQ,UAAU,SAAS,IAAI,MAAM,CAAC;;;;;;ACxFjE,IAAa,mBAAb,MAA8B;CAC5B,YACE,AAAiB,MACjB,AAAiB,UAAgC,EAAE,EACnD;EAFiB;EACA;;CAGnB,SAAS,OAA2B;AAClC,MAAI;GACF,MAAM,UAAU,KAAK,aAAa,MAAM;GACxC,MAAM,oDAA6B,MAAM,YAAY,QAAQ;AAE7D,QAAK,aAAa,OAAO,OAAO;AAChC,QAAK,iBAAiB,OAAO,OAAO;WAC7B,OAAO;AACd,QAAK,YAAY,OAAO,MAAe;;;CAI3C,YAAY,QAAsC;AAChD,OAAK,MAAM,SAAS,OAClB,MAAK,SAAS,MAAM;;CAIxB,AAAQ,aAAa,OAAqB;EAGxC,MAAM,UAYF,EAAE,UAdW,KAAK,KAAK,eAAe,EAc1B;AAEhB,MAAI,MAAM,QAAQ;GAChB,MAAM,WAAW,KAAK,oBAAoB,MAAM,OAAO;AACvD,OAAI,SACF,SAAQ,WAAW;;AAIvB,MAAI,MAAM,YAAY,SAAS,EAC7B,SAAQ,eAAe,EAAE,QAAQ,KAAK,iBAAiB,MAAM,EAAE;AAGjE,SAAO;;CAGT,AAAQ,iBAAiB,OAAqB;EAC5C,MAAM,SAKD,EAAE;AAIP,OAAK,IAAI,IAAI,MAAM,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;GACtD,MAAM,QAAQ,MAAM,YAAY;AAChC,OAAI,CAAC,MACH;GAEF,MAAM,EAAE,OAAO,UAAU;AAEzB,UAAO,KAAK;IACV;IACA,QAAQ,MAAM;IACd,MAAM,KAAK,iBAAiB,OAAO,MAAM;IACzC,MAAM,KAAK,iBAAiB,OAAO,MAAM;IAC1C,CAAC;;AAGJ,SAAO;;CAGT,AAAQ,iBACN,OACA,OACS;AACT,MAAI,SAAS,EACX,QAAO;EAET,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACpC,SAAO,WAAW,KAAK,kBAAkB,SAAS,GAAG;;CAGvD,AAAQ,iBACN,OACA,OACS;AACT,MAAI,SAAS,MAAM,SAAS,EAC1B,QAAO;EAET,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACpC,SAAO,WAAW,KAAK,kBAAkB,SAAS,GAAG;;CAGvD,AAAQ,oBAAoB,MAAgD;EAC1E,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,SAAS,KAAK,SACvB,QAAO,MAAM,QAAQ,KAAK,kBAAkB,MAAM;AAEpD,SAAO;;CAGT,AAAQ,kBAAkB,MAA0B;AAClD,MAAI,KAAK,aAAa,CACpB,QAAO,KAAK;AAEd,MAAI,KAAK,UAAU,CACjB,QAAO,KAAK,oBAAoB,KAAK;AAEvC,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,SAAoB,EAAE;AAC5B,QAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,MAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAI,KACF,QAAO,KAAK,KAAK,kBAAkB,KAAK,CAAC;;AAG7C,UAAO;;AAET,SAAO;;CAGT,AAAQ,aAAa,OAAqB,QAAuB;EAC/D,MAAM,EAAE,SAAS;EACjB,MAAM,eAAe,KAAK;AAE1B,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,QAAK,SAAS,cAAc,EAAE,UAAU,MAAM,CAAC;AAC/C;;AAGF,MACE,OAAO,WAAW,aACjB,OAAO,MAAM,OAAO,IAAI,CAAC,OAAO,SAAS,OAAO,GACjD;AACA,QAAK,SAAS,cAAc,EAAE,UAAU,MAAM,CAAC;AAC/C;;AAGF,OAAK,SAAS,QAAQ,EAAE,UAAU,MAAM,CAAC;;CAG3C,AAAQ,iBAAiB,OAAqB,QAAuB;EACnE,MAAM,EAAE,SAAS;AAEjB,MAAI,OAAO,WAAW,UAAU;AAC9B,OAAI,OAAO,MAAM,OAAO,EAAE;AACxB,SAAK,kBAAkB;KACrB,MAAM;KACN,SAAS;KACT,YAAY,MAAM;KAClB,eAAe;KAChB,CAAC;AACF;;AAGF,OAAI,CAAC,OAAO,SAAS,OAAO,EAAE;AAC5B,SAAK,kBAAkB;KACrB,MAAM;KACN,SAAS;KACT,YAAY,MAAM;KAClB,eAAe;KAChB,CAAC;AACF;;;AAIJ,OAAK,kBAAkB,KAAK;;CAG9B,AAAQ,YAAY,OAAqB,OAAoB;EAC3D,MAAM,EAAE,SAAS;AAEjB,OAAK,SAAS,KAAK,cAAc,EAAE,UAAU,MAAM,CAAC;AAEpD,OAAK,kBAAkB;GACrB,MAAM;GACN,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,eAAe;GAChB,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ,QAAQ,MAAM,MAAM;;;;;;AC3LvC,IAAa,gBAAb,MAA2B;CACzB,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,AAAQ,WAA2B,EAAE;CACrC,AAAQ,gCAA+B,IAAI,KAAK;CAChD,AAAQ,kBAA2C,EAAE;CACrD,AAAQ,YAAiC,EAAE;CAE3C,YACE,AAAiB,MACjB,UAAgC,EAAE,EAClC;EAFiB;AAGjB,OAAK,YAAY,IAAI,kBAAkB;AACvC,OAAK,QAAQ,IAAI,iBAAiB;AAClC,OAAK,YAAY,IAAI,iBAAiB,MAAM,QAAQ;AAEpD,OAAK,YAAY;;CAGnB,eAAqB;AACnB,OAAK,kBAAkB;AACvB,OAAK,YAAY;;CAGnB,UAAgB;AACd,OAAK,kBAAkB;AACvB,OAAK,WAAW,EAAE;AAClB,OAAK,gCAAgB,IAAI,KAAK;AAC9B,OAAK,kBAAkB,EAAE;;CAG3B,cAAuC;AACrC,SAAO,KAAK;;CAGd,qBAA8C;AAC5C,SAAO,KAAK;;CAGd,AAAQ,aAAmB;AACzB,OAAK,WAAW,KAAK,UAAU,QAAQ,KAAK,KAAK,KAAK;AAEtD,OAAK,gBAAgB,KAAK,MAAM,mBAAmB,KAAK,SAAS;AACjE,OAAK,kBAAkB,KAAK,MAAM,qBAAqB,KAAK,SAAS;AAErE,OAAK,aAAa;AAElB,OAAK,gBAAgB;;CAGvB,AAAQ,cAAoB;AAC1B,8BAAkB;AAChB,QAAK,MAAM,SAAS,KAAK,gBACvB,MAAK,UAAU,SAAS,MAAM;IAEhC;;CAGJ,AAAQ,iBAAuB;EAC7B,MAAM,+BAAe,IAAI,KAAyB;AAElD,OAAK,MAAM,CAAC,YAAY,KAAK,eAAe;AAC1C,OAAI,aAAa,IAAI,QAAQ,CAC3B;AAEF,gBAAa,IAAI,QAAQ;GAEzB,MAAM,oCACE,QAAQ,aACR,KAAK,uBAAuB,QAAQ,CAC3C;AACD,QAAK,UAAU,KAAK,SAAS;;AAG/B,OAAK,oBAAoB,KAAK,KAAK,KAAK;;CAG1C,AAAQ,oBAAoB,MAAuB;AACjD,MAAI,KAAK,SAAS,EAAE;GAClB,MAAM,oCACE,KAAK,cACL,KAAK,uBAAuB,CACnC;AACD,QAAK,UAAU,KAAK,SAAS;AAE7B,QAAK,MAAM,QAAQ,KAAK,MACtB,MAAK,oBAAoB,KAAK;aAEvB,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,MAAK,oBAAoB,MAAM;;CAKrC,AAAQ,uBAAuB,aAAuC;EACpE,MAAM,WAAW,KAAK,MAAM,oBAC1B,aACA,KAAK,eACL,KAAK,gBACN;AAED,8BAAkB;AAChB,QAAK,MAAM,SAAS,SAClB,MAAK,UAAU,SAAS,MAAM;IAEhC;;CAGJ,AAAQ,wBAA8B;AACpC,OAAK,cAAc;;CAGrB,AAAQ,mBAAyB;AAC/B,OAAK,MAAM,YAAY,KAAK,UAC1B,WAAU;AAEZ,OAAK,YAAY,EAAE;;;;;;ACvHvB,SAAgB,iBACd,QACA,cACA,SACW;CACX,MAAM,cAAc,SAAS,eAAe,mBAAmB;CAC/D,MAAM,WAAW,YAAY,WAAW,QAAQ,aAAa;AAE7D,0BAAyB,UAAU,YAAY;CAE/C,MAAM,OAAO,IAAI,UAAU,SAAS;AAEpC,KAAI,SAAS,kBAAkB,OAAO;EAGpC,MAAM,SAAS,IAAI,cAAc,MAD/B,OAAO,SAAS,kBAAkB,WAAW,QAAQ,gBAAgB,EAAE,CACnB;AACtD,OAAK,iBAAiB,OAAO;;AAG/B,QAAO;;AAGT,SAAS,yBAAyB,MAAiB,SAA4B;AAC7E,KAAI,KAAK,SAAS,EAAE;AAClB,OAAK,eAAe,QAAQ;AAC5B,OAAK,MAAM,QAAQ,KAAK,MACtB,0BAAyB,MAAM,QAAQ;YAEhC,KAAK,UAAU,CACxB,MAAK,MAAM,SAAS,KAAK,SACvB,0BAAyB,OAAO,QAAQ;;AAK9C,SAAgB,sBACd,QACA,SACW;AACX,QAAO,iBAAiB,QAAQ,QAAW,QAAQ"}
|