@finos/legend-application-studio 28.20.0 → 28.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/lib/__lib__/LegendStudioUserDataHelper.d.ts +4 -1
  2. package/lib/__lib__/LegendStudioUserDataHelper.d.ts.map +1 -1
  3. package/lib/__lib__/LegendStudioUserDataHelper.js +18 -0
  4. package/lib/__lib__/LegendStudioUserDataHelper.js.map +1 -1
  5. package/lib/components/editor/editor-group/EditorGroup.d.ts.map +1 -1
  6. package/lib/components/editor/editor-group/EditorGroup.js +5 -0
  7. package/lib/components/editor/editor-group/EditorGroup.js.map +1 -1
  8. package/lib/components/editor/editor-group/dataProduct/DataProductEditor.d.ts.map +1 -1
  9. package/lib/components/editor/editor-group/dataProduct/DataProductEditor.js +13 -44
  10. package/lib/components/editor/editor-group/dataProduct/DataProductEditor.js.map +1 -1
  11. package/lib/components/editor/editor-group/database-editor/DatabaseAnnotationDisplay.d.ts +26 -0
  12. package/lib/components/editor/editor-group/database-editor/DatabaseAnnotationDisplay.d.ts.map +1 -0
  13. package/lib/components/editor/editor-group/database-editor/DatabaseAnnotationDisplay.js +101 -0
  14. package/lib/components/editor/editor-group/database-editor/DatabaseAnnotationDisplay.js.map +1 -0
  15. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramCanvas.d.ts +23 -0
  16. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramCanvas.d.ts.map +1 -0
  17. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramCanvas.js +434 -0
  18. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramCanvas.js.map +1 -0
  19. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramHelper.d.ts +242 -0
  20. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramHelper.d.ts.map +1 -0
  21. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramHelper.js +371 -0
  22. package/lib/components/editor/editor-group/database-editor/DatabaseDiagramHelper.js.map +1 -0
  23. package/lib/components/editor/editor-group/database-editor/DatabaseEditor.d.ts +29 -0
  24. package/lib/components/editor/editor-group/database-editor/DatabaseEditor.d.ts.map +1 -0
  25. package/lib/components/editor/editor-group/database-editor/DatabaseEditor.js +78 -0
  26. package/lib/components/editor/editor-group/database-editor/DatabaseEditor.js.map +1 -0
  27. package/lib/components/editor/editor-group/database-editor/DatabaseSchemaTree.d.ts +30 -0
  28. package/lib/components/editor/editor-group/database-editor/DatabaseSchemaTree.d.ts.map +1 -0
  29. package/lib/components/editor/editor-group/database-editor/DatabaseSchemaTree.js +331 -0
  30. package/lib/components/editor/editor-group/database-editor/DatabaseSchemaTree.js.map +1 -0
  31. package/lib/components/editor/editor-group/database-editor/DatabaseTableNode.d.ts +104 -0
  32. package/lib/components/editor/editor-group/database-editor/DatabaseTableNode.d.ts.map +1 -0
  33. package/lib/components/editor/editor-group/database-editor/DatabaseTableNode.js +151 -0
  34. package/lib/components/editor/editor-group/database-editor/DatabaseTableNode.js.map +1 -0
  35. package/lib/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.d.ts.map +1 -1
  36. package/lib/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.js +3 -78
  37. package/lib/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.js.map +1 -1
  38. package/lib/index.css +2 -2
  39. package/lib/index.css.map +1 -1
  40. package/lib/package.json +4 -1
  41. package/lib/stores/editor/EditorTabManagerState.d.ts.map +1 -1
  42. package/lib/stores/editor/EditorTabManagerState.js +5 -3
  43. package/lib/stores/editor/EditorTabManagerState.js.map +1 -1
  44. package/lib/stores/editor/editor-state/element-editor-state/DatabaseEditorState.d.ts +252 -0
  45. package/lib/stores/editor/editor-state/element-editor-state/DatabaseEditorState.d.ts.map +1 -0
  46. package/lib/stores/editor/editor-state/element-editor-state/DatabaseEditorState.js +755 -0
  47. package/lib/stores/editor/editor-state/element-editor-state/DatabaseEditorState.js.map +1 -0
  48. package/package.json +12 -9
  49. package/src/__lib__/LegendStudioUserDataHelper.ts +30 -0
  50. package/src/components/editor/editor-group/EditorGroup.tsx +4 -0
  51. package/src/components/editor/editor-group/dataProduct/DataProductEditor.tsx +0 -52
  52. package/src/components/editor/editor-group/database-editor/DatabaseAnnotationDisplay.tsx +200 -0
  53. package/src/components/editor/editor-group/database-editor/DatabaseDiagramCanvas.tsx +701 -0
  54. package/src/components/editor/editor-group/database-editor/DatabaseDiagramHelper.ts +555 -0
  55. package/src/components/editor/editor-group/database-editor/DatabaseEditor.tsx +246 -0
  56. package/src/components/editor/editor-group/database-editor/DatabaseSchemaTree.tsx +1053 -0
  57. package/src/components/editor/editor-group/database-editor/DatabaseTableNode.tsx +465 -0
  58. package/src/components/editor/editor-group/ingest-editor/IngestDefinitionEditor.tsx +2 -242
  59. package/src/stores/editor/EditorTabManagerState.ts +4 -5
  60. package/src/stores/editor/editor-state/element-editor-state/DatabaseEditorState.ts +938 -0
  61. package/tsconfig.json +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseEditor.d.ts","sourceRoot":"","sources":["../../../../../src/components/editor/editor-group/database-editor/DatabaseEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAkCH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc;;CA2LzB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Copyright (c) 2020-present, Goldman Sachs
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { observer } from 'mobx-react-lite';
18
+ import { ChevronLeftIcon, ChevronRightIcon, InfoCircleIcon, LockIcon, MoonIcon, ResizablePanel, ResizablePanelGroup, ResizablePanelSplitter, ResizablePanelSplitterLine, SunIcon, clsx, getCollapsiblePanelGroupProps, } from '@finos/legend-art';
19
+ import { prettyCONSTName } from '@finos/legend-shared';
20
+ import { CODE_EDITOR_LANGUAGE } from '@finos/legend-code-editor';
21
+ import { CodeEditor } from '@finos/legend-lego/code-editor';
22
+ import { INTERNAL__LakehouseGeneratedDatabase } from '@finos/legend-graph';
23
+ import { useEditorStore } from '../../EditorStoreProvider.js';
24
+ import { DATABASE_EDITOR_TAB, DatabaseEditorState, } from '../../../../stores/editor/editor-state/element-editor-state/DatabaseEditorState.js';
25
+ import { DatabaseDiagramCanvas } from './DatabaseDiagramCanvas.js';
26
+ import { DatabaseSchemaTree } from './DatabaseSchemaTree.js';
27
+ const TABS = [
28
+ DATABASE_EDITOR_TAB.VIEW,
29
+ DATABASE_EDITOR_TAB.GRAMMAR,
30
+ ];
31
+ /**
32
+ * Top-level editor for `Database` elements in form mode. Has two tabs:
33
+ * - VIEW (default): Schema → Table → Column tree (left) + React-Flow ERD
34
+ * canvas (right). The interactive form mode.
35
+ * - GRAMMAR: read-only Pure DSL preview, regenerated on tab switch by
36
+ * `setSelectedTab` so it always reflects the current metamodel state.
37
+ * Mirrors what global Text Mode would render for this element — included
38
+ * here for users who want to peek at the grammar without leaving form
39
+ * mode.
40
+ */
41
+ export const DatabaseEditor = observer(() => {
42
+ const editorStore = useEditorStore();
43
+ const editorState = editorStore.tabManagerState.getCurrentEditorState(DatabaseEditorState);
44
+ const { selectedTab, database } = editorState;
45
+ // Resizable left panel: dragging the splitter all the way left snaps the
46
+ // panel to flex=0 (collapsed). The toggle button in the panel header (and
47
+ // the expand-rail rendered when collapsed) drives the same flag, so both
48
+ // controls stay in sync via `editorState.isSidePanelCollapsed`.
49
+ const sidePanelCollapseProps = getCollapsiblePanelGroupProps(editorState.isSidePanelCollapsed, {
50
+ // Default width when first opened (in pixels). React-reflex owns the
51
+ // exact width after the first user-drag.
52
+ size: 320,
53
+ onStopResize: (handleProps) => {
54
+ // If the user drags the splitter to (or near) zero, persist it as
55
+ // collapsed so the toggle button and rail stay in sync. Mirrors
56
+ // what `getCollapsiblePanelGroupProps` does internally for the
57
+ // styling class but lifts that signal back up to MobX.
58
+ const flexGrow = Number(handleProps.domElement.style.flexGrow);
59
+ if (flexGrow <= 0.01) {
60
+ editorState.setSidePanelCollapsed(true);
61
+ }
62
+ else if (editorState.isSidePanelCollapsed) {
63
+ editorState.setSidePanelCollapsed(false);
64
+ }
65
+ },
66
+ });
67
+ return (_jsxs("div", { className: clsx('database-editor', {
68
+ // Local light-theme opt-in. Scoped to this editor only — the rest
69
+ // of Studio remains in its configured theme. SCSS overrides hang
70
+ // off this modifier class.
71
+ 'database-editor--light': editorState.theme === 'light',
72
+ }), children: [_jsxs("div", { className: "database-editor__tabs__header", children: [_jsx("div", { className: "database-editor__tabs", children: TABS.map((tab) => (_jsx("button", { type: "button", onClick: () => editorState.setSelectedTab(tab), className: clsx('database-editor__tab', {
73
+ 'database-editor__tab--active': tab === selectedTab,
74
+ }), children: prettyCONSTName(tab) }, tab))) }), _jsxs("div", { className: "database-editor__read-only-badge", title: "This editor is read-only", children: [_jsx(LockIcon, {}), _jsx("span", { className: "database-editor__read-only-badge__label", children: "READ ONLY" })] }), _jsx("button", { type: "button", className: "database-editor__theme-toggle", onClick: () => editorState.toggleTheme(), title: editorState.theme === 'dark'
75
+ ? 'Switch to light theme (this editor only)'
76
+ : 'Switch to dark theme', children: editorState.theme === 'dark' ? _jsx(SunIcon, {}) : _jsx(MoonIcon, {}) })] }), _jsxs("div", { className: "database-editor__content", children: [database instanceof INTERNAL__LakehouseGeneratedDatabase && (_jsxs("div", { className: "database-editor__generated-banner", title: `Generated from ${database.generatorElement.path}\nOwned by ${database.OWNER.path}`, children: [_jsx(InfoCircleIcon, {}), _jsxs("span", { className: "database-editor__generated-banner__text", children: ["This database is generated by", ' ', _jsx("span", { className: "database-editor__generated-banner__path", children: database.generatorElement.path }), ' — owned by ', _jsx("span", { className: "database-editor__generated-banner__path", children: database.OWNER.path }), "."] })] })), _jsxs("div", { className: "database-editor__content__body", children: [selectedTab === DATABASE_EDITOR_TAB.VIEW && (_jsx("div", { className: "database-diagram", children: _jsxs(ResizablePanelGroup, { orientation: "vertical", children: [_jsx(ResizablePanel, { ...sidePanelCollapseProps.collapsiblePanel, direction: 1, minSize: 0, children: _jsxs("div", { className: "database-diagram__side-panel-wrapper", children: [_jsxs("div", { className: "database-diagram__side-panel-wrapper__header", children: [_jsx("span", { className: "database-diagram__side-panel-wrapper__header__title", children: "Database" }), _jsx("button", { type: "button", className: "database-diagram__side-panel-wrapper__header__action", onClick: () => editorState.toggleSidePanelCollapsed(), title: "Collapse panel", children: _jsx(ChevronLeftIcon, {}) })] }), _jsx("div", { className: "database-diagram__side-panel-wrapper__body", children: _jsx(DatabaseSchemaTree, { editorState: editorState }) })] }) }), _jsx(ResizablePanelSplitter, { children: _jsx(ResizablePanelSplitterLine, { color: "var(--color-dark-grey-200)" }) }), _jsx(ResizablePanel, { ...sidePanelCollapseProps.remainingPanel, minSize: 200, children: _jsxs("div", { className: "database-diagram__canvas-area", children: [editorState.isSidePanelCollapsed && (_jsx("button", { type: "button", className: "database-diagram__expand-rail", onClick: () => editorState.toggleSidePanelCollapsed(), title: "Expand panel", children: _jsx(ChevronRightIcon, {}) })), _jsx("div", { className: "database-diagram__canvas-container", children: _jsx(DatabaseDiagramCanvas, { editorState: editorState }) })] }) })] }) })), selectedTab === DATABASE_EDITOR_TAB.GRAMMAR && (_jsx("div", { className: "database-editor__grammar", children: _jsx(CodeEditor, { inputValue: editorState.textContent, isReadOnly: true, language: CODE_EDITOR_LANGUAGE.PURE }) }))] })] })] }));
77
+ });
78
+ //# sourceMappingURL=DatabaseEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseEditor.js","sourceRoot":"","sources":["../../../../../src/components/editor/editor-group/database-editor/DatabaseEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { type DatabaseEditorState } from '../../../../stores/editor/editor-state/element-editor-state/DatabaseEditorState.js';
17
+ /**
18
+ * The full side-panel tree. Renders schemas → (tables, views) → columns plus
19
+ * a flat "Joins" section at the bottom (joins are cross-relation
20
+ * relationships and don't naturally fit in the tree hierarchy).
21
+ *
22
+ * State (selection, expansion) lives entirely in `DatabaseEditorState` so it
23
+ * survives reprocessing and so other components (the canvas) can react to it.
24
+ */
25
+ export declare const DatabaseSchemaTree: ((props: {
26
+ editorState: DatabaseEditorState;
27
+ }) => import("react/jsx-runtime").JSX.Element) & {
28
+ displayName: string;
29
+ };
30
+ //# sourceMappingURL=DatabaseSchemaTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseSchemaTree.d.ts","sourceRoot":"","sources":["../../../../../src/components/editor/editor-group/database-editor/DatabaseSchemaTree.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiCH,OAAO,EACL,KAAK,mBAAmB,EAGzB,MAAM,oFAAoF,CAAC;AA2pB5F;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,WACrB;IAAE,WAAW,EAAE,mBAAmB,CAAA;CAAE;;CAqU7C,CAAC"}
@@ -0,0 +1,331 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Copyright (c) 2020-present, Goldman Sachs
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { observer } from 'mobx-react-lite';
18
+ import { useState } from 'react';
19
+ import { ChevronDownIcon, ChevronRightIcon, CompressIcon, CopyIcon, ExpandAllIcon, ExternalLinkIcon, EyeIcon, FilterIcon, KeyIcon, PURE_DatabaseIcon, PURE_DatabaseSchemaIcon, PURE_DatabaseTableIcon, PURE_DatabaseTableJoinIcon, PURE_DataProductIcon, SearchIcon, TimesIcon, clsx, } from '@finos/legend-art';
20
+ import {} from '@finos/legend-graph';
21
+ import { DatabaseAnnotationDisplay } from './DatabaseAnnotationDisplay.js';
22
+ import { getRelationNodeId, getSchemaNodeId, } from '../../../../stores/editor/editor-state/element-editor-state/DatabaseEditorState.js';
23
+ import { getColumnTypeLabel, getTableColumns, isCrossDatabaseJoin, isPrimaryKey, isSelfJoin, matchesSearch, resolveFilterFormula, resolveJoinFormula, resolveViewColumnFormula, resolveViewGroupByFormula, summarizeMilestoning, } from './DatabaseDiagramHelper.js';
24
+ /**
25
+ * Small inline copy-to-clipboard button rendered next to rendered Pure code
26
+ * (filter/join/view-column/groupBy formulas). Two-state visual: shows the
27
+ * default copy icon, briefly flips to a "Copied!" label after a successful
28
+ * write, then resets. Click stops propagation so the surrounding row's
29
+ * click handler (which usually selects/focuses the row) doesn't fire.
30
+ */
31
+ const CopyFormulaButton = ({ value, label = 'Copy', }) => {
32
+ const [copied, setCopied] = useState(false);
33
+ return (_jsx("button", { type: "button", className: clsx('database-diagram__copy-btn', {
34
+ 'database-diagram__copy-btn--copied': copied,
35
+ }), title: copied ? 'Copied!' : label, onClick: (event) => {
36
+ event.stopPropagation();
37
+ // `navigator.clipboard` may be unavailable in test/insecure contexts;
38
+ // fall through silently in that case rather than throwing.
39
+ navigator.clipboard
40
+ .writeText(value)
41
+ .then(() => {
42
+ setCopied(true);
43
+ window.setTimeout(() => setCopied(false), 1200);
44
+ })
45
+ .catch(() => {
46
+ /* no-op \u2014 copy failures are non-fatal */
47
+ });
48
+ }, children: _jsx(CopyIcon, {}) }));
49
+ };
50
+ /**
51
+ * Pure-CSS shimmer placeholder shown in place of formula text while the
52
+ * batched engine call is still in flight. We swap from skeleton to text
53
+ * once the corresponding `is...Loading` flag flips false on the editor
54
+ * state. Compact one-line bar so layout doesn't shift on resolve.
55
+ */
56
+ const FormulaSkeleton = () => (_jsx("span", { className: "database-diagram__skeleton", "aria-label": "Loading formula", "aria-busy": true }));
57
+ /**
58
+ * Empty-state row shown when a side-panel section has zero rows of its
59
+ * primary kind (e.g. a database with no joins). Lighter than rendering
60
+ * nothing because users sometimes wonder if the panel is broken when a
61
+ * section is silently absent.
62
+ */
63
+ const EmptySectionRow = ({ message }) => (_jsx("div", { className: "database-diagram__side-panel__empty", children: message }));
64
+ /**
65
+ * Predicates that determine whether a tree node should be rendered under
66
+ * the current search filter. A node is shown when it OR any descendant
67
+ * matches the (already lowercased) query. Empty query short-circuits so
68
+ * everything is shown, which keeps the no-filter render path cheap.
69
+ */
70
+ const relationMatchesSearch = (rel, query) => {
71
+ if (!query) {
72
+ return true;
73
+ }
74
+ if (matchesSearch(rel.name, query)) {
75
+ return true;
76
+ }
77
+ // For tables walk Column.name; for views walk ColumnMapping.columnName.
78
+ // Either way the comparison is a flat substring on visible identifiers.
79
+ if ('columnMappings' in rel) {
80
+ return rel.columnMappings.some((m) => matchesSearch(m.columnName, query));
81
+ }
82
+ return getTableColumns(rel).some((c) => matchesSearch(c.name, query));
83
+ };
84
+ const schemaMatchesSearch = (schema, query) => {
85
+ if (!query) {
86
+ return true;
87
+ }
88
+ if (matchesSearch(schema.name, query)) {
89
+ return true;
90
+ }
91
+ return (schema.tables.some((t) => relationMatchesSearch(t, query)) ||
92
+ schema.views.some((v) => relationMatchesSearch(v, query)));
93
+ };
94
+ /**
95
+ * Renders one column under an expanded Table. Clicking focuses the column,
96
+ * which (per `DatabaseEditorState.focusOnColumn`) selects the parent table,
97
+ * marks the specific column, and requests a canvas pan.
98
+ *
99
+ * Columns aren't expandable — they're leaves of the tree.
100
+ */
101
+ const DatabaseTreeTableColumnRow = observer((props) => {
102
+ const { editorState, table, column } = props;
103
+ const isSelected = editorState.selectedColumn === column;
104
+ const isPK = isPrimaryKey(table, column.name);
105
+ return (_jsxs("button", { type: "button", className: clsx('database-diagram__tree__column', {
106
+ 'database-diagram__tree__column--selected': isSelected,
107
+ 'database-diagram__tree__column--pk': isPK,
108
+ }), onClick: () => editorState.focusOnColumn(table, column), title: `${table.schema.name}.${table.name}.${column.name}: ${getColumnTypeLabel(column)}`, children: [_jsx("span", { className: "database-diagram__tree__column__icon", children: isPK ? (_jsx(KeyIcon, {})) : (_jsx("span", { className: "database-diagram__tree__column__bullet", children: "\u2022" })) }), _jsxs("span", { className: "database-diagram__tree__column__name", children: [column.name, column.nullable === true && (_jsx("span", { className: "database-diagram__tree__column__nullable", title: "Nullable", children: "?" }))] }), _jsx("span", { className: "database-diagram__tree__column__type", children: getColumnTypeLabel(column) }), _jsx(DatabaseAnnotationDisplay, { stereotypes: column.stereotypes, taggedValues: column.taggedValues, layout: "compact" })] }));
109
+ });
110
+ /**
111
+ * Renders one column-mapping under an expanded View. Visually similar to a
112
+ * table-column row but the secondary text is the formula placeholder rather
113
+ * than a SQL type. Not selectable individually in the MVP — clicking just
114
+ * focuses the parent view.
115
+ */
116
+ const DatabaseTreeViewColumnRow = observer((props) => {
117
+ const { editorState, view, columnMapping } = props;
118
+ const isPK = isPrimaryKey(view, columnMapping.columnName);
119
+ const isSelected = editorState.selectedRelation === view &&
120
+ editorState.selectedViewColumnName === columnMapping.columnName;
121
+ // Pull the live formula from the editor state. Re-renders when the
122
+ // batched engine call resolves and updates `viewColumnFormulas`.
123
+ const formula = resolveViewColumnFormula(editorState.viewColumnFormulas, view.schema.name, view.name, columnMapping.columnName);
124
+ const isLoading = editorState.isLoadingViewColumnFormulas &&
125
+ !editorState.viewColumnFormulas.has(`${view.schema.name}.${view.name}.${columnMapping.columnName}`);
126
+ return (_jsxs("button", { type: "button", className: clsx('database-diagram__tree__column', 'database-diagram__tree__column--view', {
127
+ 'database-diagram__tree__column--pk': isPK,
128
+ 'database-diagram__tree__column--selected': isSelected,
129
+ }), onClick: () => editorState.focusOnViewColumn(view, columnMapping.columnName), title: `${view.schema.name}.${view.name}.${columnMapping.columnName}: ${formula}`, children: [_jsx("span", { className: "database-diagram__tree__column__icon", children: isPK ? (_jsx(KeyIcon, {})) : (_jsx("span", { className: "database-diagram__tree__column__bullet", children: "\u2022" })) }), _jsx("span", { className: "database-diagram__tree__column__name", children: columnMapping.columnName }), _jsx("span", { className: "database-diagram__tree__column__type", children: isLoading ? _jsx(FormulaSkeleton, {}) : formula }), !isLoading && (_jsx(CopyFormulaButton, { value: formula, label: "Copy formula" }))] }));
130
+ });
131
+ /**
132
+ * Renders one Table row plus (when expanded) its Column children. Clicking
133
+ * the row both *selects the table on the canvas* (with a pan-to) AND toggles
134
+ * expansion. Bundling these is intentional — when a user navigates to a
135
+ * relation, they almost always want to see its columns too.
136
+ */
137
+ const DatabaseTreeTableRow = observer((props) => {
138
+ const { editorState, table } = props;
139
+ const query = editorState.searchText.trim().toLowerCase();
140
+ if (!relationMatchesSearch(table, query)) {
141
+ return null;
142
+ }
143
+ const id = getRelationNodeId(table.schema.name, table.name);
144
+ // When a filter is active force-expand the row so matches deeper in
145
+ // the tree are immediately visible without an extra click.
146
+ const isExpanded = query !== '' || editorState.expandedRelationIds.has(id);
147
+ const isSelected = editorState.selectedRelation === table;
148
+ const columns = getTableColumns(table);
149
+ // When filtering, only show columns that match the query (or all
150
+ // columns if the table itself matched by name).
151
+ const tableNameMatches = matchesSearch(table.name, query);
152
+ const visibleColumns = query === '' || tableNameMatches
153
+ ? columns
154
+ : columns.filter((c) => matchesSearch(c.name, query));
155
+ return (_jsxs("div", { className: "database-diagram__tree__table", children: [_jsxs("button", { type: "button", className: clsx('database-diagram__tree__table__row', {
156
+ 'database-diagram__tree__table__row--selected': isSelected,
157
+ }), onClick: () => {
158
+ editorState.focusOnRelation(table);
159
+ editorState.toggleRelationExpanded(id);
160
+ }, title: `${table.schema.name}.${table.name}`, children: [_jsx("span", { className: "database-diagram__tree__caret", children: isExpanded ? _jsx(ChevronDownIcon, {}) : _jsx(ChevronRightIcon, {}) }), _jsx(PURE_DatabaseTableIcon, {}), _jsx("span", { className: "database-diagram__tree__table__name", children: table.name }), _jsx("span", { className: "database-diagram__tree__table__count", children: columns.length }), _jsx(DatabaseAnnotationDisplay, { stereotypes: table.stereotypes, taggedValues: table.taggedValues, layout: "compact" })] }), isExpanded && (_jsxs("div", { className: "database-diagram__tree__table__children", children: [table.milestoning.map((milestoning) => {
161
+ const summary = summarizeMilestoning(milestoning);
162
+ return (_jsxs("div", { className: clsx('database-diagram__tree__table__meta-row', `database-diagram__tree__table__meta-row--milestoning-${summary.kind}`), title: summary.description, children: [_jsx("span", { className: "database-diagram__tree__table__meta-row__label", children: "milestoning" }), _jsx("span", { className: "database-diagram__tree__table__meta-row__value", children: summary.label })] }, summary.label));
163
+ }), visibleColumns.map((column) => (_jsx(DatabaseTreeTableColumnRow, { editorState: editorState, table: table, column: column }, column.name)))] }))] }));
164
+ });
165
+ /**
166
+ * Renders the View → Filter mapping reference under an expanded view. Shows
167
+ * `<owning-database>.<filterName>`. When the referenced filter belongs to
168
+ * the database currently being edited, clicking navigates to it via
169
+ * `focusOnFilter`; cross-database references are non-interactive (filters
170
+ * from other databases aren't reachable from this editor).
171
+ */
172
+ const DatabaseTreeViewFilterRow = observer((props) => {
173
+ const { editorState, view, filterMapping } = props;
174
+ const ownerPath = filterMapping.filter.ownerReference.valueForSerialization ?? '';
175
+ const filterValue = filterMapping.filter.value;
176
+ // Filters live on a Database; if the owning DB matches the one we're
177
+ // editing we can navigate. Otherwise the row is informational.
178
+ const isLocal = filterValue.owner === editorState.database;
179
+ const display = `${ownerPath}.${filterMapping.filterName}`;
180
+ const formula = isLocal
181
+ ? resolveFilterFormula(editorState.filterFormulas, filterValue.name)
182
+ : undefined;
183
+ return (_jsxs("button", { type: "button", className: clsx('database-diagram__tree__column', 'database-diagram__tree__column--view', 'database-diagram__tree__column--view-meta'), onClick: () => {
184
+ if (isLocal) {
185
+ editorState.focusOnFilter(filterValue);
186
+ }
187
+ else {
188
+ editorState.focusOnRelation(view);
189
+ }
190
+ }, disabled: !isLocal, title: formula
191
+ ? `${display}: ${formula}`
192
+ : `${display}${isLocal ? '' : ' (external)'}`, children: [_jsx("span", { className: "database-diagram__tree__column__icon", children: _jsx(FilterIcon, {}) }), _jsx("span", { className: "database-diagram__tree__column__name", children: "filter" }), _jsx("span", { className: "database-diagram__tree__column__type", children: display })] }));
193
+ });
194
+ /**
195
+ * Renders one row per `View.groupBy.columns[i]` Pure expression. Each row
196
+ * lazily reads its rendered formula from `viewGroupByFormulas` — until the
197
+ * batched engine call resolves it falls back to a static placeholder.
198
+ *
199
+ * Rows aren't clickable: the underlying RelationalOperationElement isn't a
200
+ * navigable graph node and the parent view is already focused via the
201
+ * surrounding tree row.
202
+ */
203
+ const DatabaseTreeViewGroupByRow = observer((props) => {
204
+ const { editorState, view, index } = props;
205
+ const formula = resolveViewGroupByFormula(editorState.viewGroupByFormulas, view.schema.name, view.name, index);
206
+ const isLoading = editorState.isLoadingViewGroupByFormulas &&
207
+ !editorState.viewGroupByFormulas.has(`${view.schema.name}.${view.name}.groupBy[${index}]`);
208
+ return (_jsxs("div", { className: clsx('database-diagram__tree__column', 'database-diagram__tree__column--view', 'database-diagram__tree__column--view-meta', 'database-diagram__tree__column--readonly'), title: `group by [${index}]: ${formula}`, children: [_jsx("span", { className: "database-diagram__tree__column__icon", children: _jsx("span", { className: "database-diagram__tree__column__bullet", children: "\u00B7" }) }), _jsx("span", { className: "database-diagram__tree__column__name", children: `[${index}]` }), _jsx("span", { className: "database-diagram__tree__column__type", children: isLoading ? _jsx(FormulaSkeleton, {}) : formula }), !isLoading && (_jsx(CopyFormulaButton, { value: formula, label: "Copy expression" }))] }));
209
+ });
210
+ /**
211
+ * Renders one View row plus (when expanded) its column-mapping children.
212
+ * Visually distinct from the table row via the eye icon. Same click semantics
213
+ * as tables (select + expand).
214
+ */
215
+ const DatabaseTreeViewRow = observer((props) => {
216
+ const { editorState, view } = props;
217
+ const query = editorState.searchText.trim().toLowerCase();
218
+ if (!relationMatchesSearch(view, query)) {
219
+ return null;
220
+ }
221
+ const id = getRelationNodeId(view.schema.name, view.name);
222
+ // Same auto-expand-on-filter behavior as tables.
223
+ const isExpanded = query !== '' || editorState.expandedRelationIds.has(id);
224
+ const isSelected = editorState.selectedRelation === view;
225
+ const groupBy = view.groupBy;
226
+ const groupByCount = groupBy?.columns.length ?? 0;
227
+ const viewNameMatches = matchesSearch(view.name, query);
228
+ const visibleMappings = query === '' || viewNameMatches
229
+ ? view.columnMappings
230
+ : view.columnMappings.filter((m) => matchesSearch(m.columnName, query));
231
+ return (_jsxs("div", { className: "database-diagram__tree__table database-diagram__tree__table--view", children: [_jsxs("button", { type: "button", className: clsx('database-diagram__tree__table__row', {
232
+ 'database-diagram__tree__table__row--selected': isSelected,
233
+ }), onClick: () => {
234
+ editorState.focusOnRelation(view);
235
+ editorState.toggleRelationExpanded(id);
236
+ }, title: `${view.schema.name}.${view.name} (view)`, children: [_jsx("span", { className: "database-diagram__tree__caret", children: isExpanded ? _jsx(ChevronDownIcon, {}) : _jsx(ChevronRightIcon, {}) }), _jsx(EyeIcon, {}), _jsx("span", { className: "database-diagram__tree__table__name", children: view.name }), _jsx("span", { className: "database-diagram__tree__table__count", children: view.columnMappings.length }), view.distinct === true && (_jsx("span", { className: "database-diagram__tree__table__view-tag database-diagram__tree__table__view-tag--distinct", title: "View applies DISTINCT", children: "DISTINCT" })), view.filter && (_jsx("span", { className: "database-diagram__tree__table__view-tag database-diagram__tree__table__view-tag--filtered", title: `Filtered by ${view.filter.filter.ownerReference.valueForSerialization ?? ''}.${view.filter.filterName}`, children: "FILTERED" })), groupByCount > 0 && (_jsx("span", { className: "database-diagram__tree__table__view-tag database-diagram__tree__table__view-tag--grouped", title: `GROUP BY ${groupByCount} expression${groupByCount === 1 ? '' : 's'}`, children: `GROUP BY (${groupByCount})` })), _jsx(DatabaseAnnotationDisplay, { stereotypes: view.stereotypes, taggedValues: view.taggedValues, layout: "compact" })] }), isExpanded && (_jsxs("div", { className: "database-diagram__tree__table__children", children: [visibleMappings.map((mapping) => (_jsx(DatabaseTreeViewColumnRow, { editorState: editorState, view: view, columnMapping: mapping }, mapping.columnName))), query === '' && view.filter && (_jsx(DatabaseTreeViewFilterRow, { editorState: editorState, view: view, filterMapping: view.filter })), query === '' &&
237
+ groupBy?.columns.map((_, index) => (_jsx(DatabaseTreeViewGroupByRow
238
+ // Ordering is the only identity for groupBy columns.
239
+ // eslint-disable-next-line react/no-array-index-key
240
+ , { editorState: editorState, view: view, index: index }, `groupBy:${index}`)))] }))] }));
241
+ });
242
+ /**
243
+ * Renders one Schema header plus (when expanded) its Table and View children.
244
+ * Tables come before views within each schema — both kinds are siblings in
245
+ * the tree, distinguished only by icon and the column-row content.
246
+ *
247
+ * Schemas don't have a "selected" state — they only toggle.
248
+ */
249
+ const DatabaseTreeSchemaRow = observer((props) => {
250
+ const { editorState, schema } = props;
251
+ const query = editorState.searchText.trim().toLowerCase();
252
+ if (!schemaMatchesSearch(schema, query)) {
253
+ return null;
254
+ }
255
+ const schemaId = getSchemaNodeId(schema.name);
256
+ // Force-expand under search so matches are immediately visible.
257
+ const isExpanded = query !== '' || editorState.expandedSchemaIds.has(schemaId);
258
+ const totalChildren = schema.tables.length + schema.views.length;
259
+ return (_jsxs("div", { className: "database-diagram__tree__schema", children: [_jsxs("button", { type: "button", className: "database-diagram__tree__schema__row", onClick: () => editorState.toggleSchemaExpanded(schemaId), children: [_jsx("span", { className: "database-diagram__tree__caret", children: isExpanded ? _jsx(ChevronDownIcon, {}) : _jsx(ChevronRightIcon, {}) }), _jsx(PURE_DatabaseSchemaIcon, {}), _jsx("span", { className: "database-diagram__tree__schema__name", children: schema.name }), _jsx("span", { className: "database-diagram__tree__schema__count", children: totalChildren }), _jsx(DatabaseAnnotationDisplay, { stereotypes: schema.stereotypes, taggedValues: schema.taggedValues, layout: "compact" })] }), isExpanded && (_jsxs("div", { className: "database-diagram__tree__schema__children", children: [schema.tables.map((table) => (_jsx(DatabaseTreeTableRow, { editorState: editorState, table: table }, `table:${table.name}`))), schema.views.map((view) => (_jsx(DatabaseTreeViewRow, { editorState: editorState, view: view }, `view:${view.name}`)))] }))] }));
260
+ });
261
+ /**
262
+ * Renders one Lakehouse `IncludeStore` reference: an `ExternalLinkIcon`-
263
+ * suffixed button whose body shows the generator element path and a small
264
+ * `storeType` badge to differentiate the kinds of generator (DataProduct vs
265
+ * IngestDefinition vs whatever future types appear). Clicking opens the
266
+ * generator element in a new tab — same affordance as the classic
267
+ * "Included Stores" rows above. Kept as a named sub-component (not an
268
+ * inline IIFE) so the JSX in `DatabaseSchemaTree` stays readable.
269
+ */
270
+ const LakehouseStoreRow = observer((props) => {
271
+ const { editorState, spec } = props;
272
+ const path = spec.packageableElementPointer.valueForSerialization ??
273
+ spec.packageableElementPointer.value.path;
274
+ return (_jsxs("button", { type: "button", className: "database-diagram__side-panel__included-store", title: `${path}\n(generator: ${spec.storeType})\n\n(click to open)`, onClick: () => editorState.editorStore.graphEditorMode.openElement(spec.packageableElementPointer.value), children: [_jsx(PURE_DataProductIcon, {}), _jsx("span", { className: "database-diagram__side-panel__included-store__path", children: path }), _jsx("span", { className: "database-diagram__side-panel__included-store__type", children: spec.storeType }), _jsx("span", { className: "database-diagram__side-panel__included-store__open", children: _jsx(ExternalLinkIcon, {}) })] }));
275
+ });
276
+ /**
277
+ * The full side-panel tree. Renders schemas → (tables, views) → columns plus
278
+ * a flat "Joins" section at the bottom (joins are cross-relation
279
+ * relationships and don't naturally fit in the tree hierarchy).
280
+ *
281
+ * State (selection, expansion) lives entirely in `DatabaseEditorState` so it
282
+ * survives reprocessing and so other components (the canvas) can react to it.
283
+ */
284
+ export const DatabaseSchemaTree = observer((props) => {
285
+ const { editorState } = props;
286
+ const { database } = editorState;
287
+ const query = editorState.searchText.trim().toLowerCase();
288
+ // Pre-compute filtered counts so each section header surfaces "showing
289
+ // N of M" feedback when the user is filtering. Cheap walks on the
290
+ // already-typed query \u2014 we don't memoize because the per-render cost
291
+ // is dominated by row JSX, not these filters.
292
+ const visibleSchemas = query === ''
293
+ ? database.schemas
294
+ : database.schemas.filter((s) => schemaMatchesSearch(s, query));
295
+ const visibleJoins = query === ''
296
+ ? database.joins
297
+ : database.joins.filter((j) => matchesSearch(j.name, query));
298
+ const visibleFilters = query === ''
299
+ ? database.filters
300
+ : database.filters.filter((f) => matchesSearch(f.name, query));
301
+ return (_jsxs("div", { className: "database-diagram__side-panel", children: [_jsxs("div", { className: "database-diagram__side-panel__toolbar", children: [_jsxs("div", { className: "database-diagram__side-panel__search", children: [_jsx(SearchIcon, {}), _jsx("input", { type: "text", className: "database-diagram__side-panel__search__input", placeholder: "Filter schemas, tables, columns...", value: editorState.searchText, onChange: (e) => editorState.setSearchText(e.target.value), spellCheck: false }), editorState.searchText !== '' && (_jsx("button", { type: "button", className: "database-diagram__side-panel__search__clear", title: "Clear filter", onClick: () => editorState.setSearchText(''), children: _jsx(TimesIcon, {}) }))] }), _jsx("button", { type: "button", className: "database-diagram__side-panel__toolbar__btn", title: "Expand all schemas", onClick: () => editorState.expandAllSchemas(), children: _jsx(ExpandAllIcon, {}) }), _jsx("button", { type: "button", className: "database-diagram__side-panel__toolbar__btn", title: "Collapse all", onClick: () => editorState.collapseAll(), children: _jsx(CompressIcon, {}) })] }), (database.stereotypes.length > 0 ||
302
+ database.taggedValues.length > 0) && (_jsxs("div", { className: "database-diagram__side-panel__section", children: [_jsx("div", { className: "database-diagram__side-panel__section__header", children: "Annotations" }), _jsx("div", { className: "database-diagram__side-panel__annotations", children: _jsx(DatabaseAnnotationDisplay, { stereotypes: database.stereotypes, taggedValues: database.taggedValues, layout: "block" }) })] })), _jsxs("div", { className: "database-diagram__side-panel__section", children: [_jsxs("div", { className: "database-diagram__side-panel__section__header", children: ["Schemas", ' ', _jsx("span", { className: "database-diagram__side-panel__section__count", children: query === ''
303
+ ? `(${database.schemas.length})`
304
+ : `(${visibleSchemas.length}/${database.schemas.length})` })] }), database.schemas.length === 0 ? (_jsx(EmptySectionRow, { message: "No schemas defined." })) : visibleSchemas.length === 0 ? (_jsx(EmptySectionRow, { message: "No schemas match the current filter." })) : (database.schemas.map((schema) => (_jsx(DatabaseTreeSchemaRow, { editorState: editorState, schema: schema }, schema.name))))] }), _jsxs("div", { className: "database-diagram__side-panel__section", children: [_jsxs("div", { className: "database-diagram__side-panel__section__header", children: ["Joins", ' ', _jsx("span", { className: "database-diagram__side-panel__section__count", children: query === ''
305
+ ? `(${database.joins.length})`
306
+ : `(${visibleJoins.length}/${database.joins.length})` })] }), database.joins.length === 0 ? (_jsx(EmptySectionRow, { message: "No joins defined." })) : visibleJoins.length === 0 ? (_jsx(EmptySectionRow, { message: "No joins match the current filter." })) : (visibleJoins.map((join) => {
307
+ const isSelected = editorState.selectedJoin === join;
308
+ const formula = resolveJoinFormula(editorState.joinFormulas, join.name);
309
+ const isLoading = editorState.isLoadingJoinFormulas &&
310
+ !editorState.joinFormulas.has(join.name);
311
+ const selfJoin = isSelfJoin(join);
312
+ const crossDb = !selfJoin && isCrossDatabaseJoin(join, database);
313
+ return (_jsxs("button", { type: "button", className: clsx('database-diagram__side-panel__join', {
314
+ 'database-diagram__side-panel__join--selected': isSelected,
315
+ }), onClick: () => editorState.focusOnJoin(join), title: `${join.name}: ${formula}`, children: [_jsx("span", { className: "database-diagram__side-panel__join__icon", children: _jsx(PURE_DatabaseTableJoinIcon, {}) }), _jsxs("span", { className: "database-diagram__side-panel__join__body", children: [_jsxs("span", { className: "database-diagram__side-panel__join__name", children: [join.name, selfJoin && (_jsx("span", { className: "database-diagram__side-panel__join__marker database-diagram__side-panel__join__marker--self", title: "Self-join (source and target are the same relation)", children: "SELF" })), crossDb && (_jsx("span", { className: "database-diagram__side-panel__join__marker database-diagram__side-panel__join__marker--cross-db", title: "Cross-database join (one or both endpoints live in an included store)", children: "CROSS-DB" }))] }), _jsx("span", { className: "database-diagram__side-panel__join__formula", children: isLoading ? _jsx(FormulaSkeleton, {}) : formula })] }), !isLoading && (_jsx(CopyFormulaButton, { value: formula, label: "Copy join formula" }))] }, join.name));
316
+ }))] }), _jsxs("div", { className: "database-diagram__side-panel__section", children: [_jsxs("div", { className: "database-diagram__side-panel__section__header", children: ["Filters", ' ', _jsx("span", { className: "database-diagram__side-panel__section__count", children: query === ''
317
+ ? `(${database.filters.length})`
318
+ : `(${visibleFilters.length}/${database.filters.length})` })] }), database.filters.length === 0 ? (_jsx(EmptySectionRow, { message: "No filters defined." })) : visibleFilters.length === 0 ? (_jsx(EmptySectionRow, { message: "No filters match the current filter." })) : (visibleFilters.map((filter) => {
319
+ const isSelected = editorState.selectedFilter === filter;
320
+ const formula = resolveFilterFormula(editorState.filterFormulas, filter.name);
321
+ const isLoading = editorState.isLoadingFilterFormulas &&
322
+ !editorState.filterFormulas.has(filter.name);
323
+ return (_jsxs("button", { type: "button", className: clsx('database-diagram__side-panel__filter', {
324
+ 'database-diagram__side-panel__filter--selected': isSelected,
325
+ }), onClick: () => editorState.focusOnFilter(filter), title: `${filter.name}: ${formula}`, children: [_jsx("span", { className: "database-diagram__side-panel__filter__icon", children: _jsx(FilterIcon, {}) }), _jsxs("span", { className: "database-diagram__side-panel__filter__body", children: [_jsx("span", { className: "database-diagram__side-panel__filter__name", children: filter.name }), _jsx("span", { className: "database-diagram__side-panel__filter__formula", children: isLoading ? _jsx(FormulaSkeleton, {}) : formula })] }), !isLoading && (_jsx(CopyFormulaButton, { value: formula, label: "Copy filter formula" }))] }, filter.name));
326
+ }))] }), database.includes.length > 0 && (_jsxs("div", { className: "database-diagram__side-panel__section", children: [_jsxs("div", { className: "database-diagram__side-panel__section__header", children: ["Included Stores", ' ', _jsxs("span", { className: "database-diagram__side-panel__section__count", children: ["(", database.includes.length, ")"] })] }), database.includes.map((ref) => {
327
+ const path = ref.valueForSerialization ?? ref.value.path;
328
+ return (_jsxs("button", { type: "button", className: "database-diagram__side-panel__included-store", title: `${path}\n\n(click to open)`, onClick: () => editorState.editorStore.graphEditorMode.openElement(ref.value), children: [_jsx(PURE_DatabaseIcon, {}), _jsx("span", { className: "database-diagram__side-panel__included-store__path", children: path }), _jsx("span", { className: "database-diagram__side-panel__included-store__open", children: _jsx(ExternalLinkIcon, {}) })] }, path));
329
+ })] })), database.includedStoreSpecifications.length > 0 && (_jsxs("div", { className: "database-diagram__side-panel__section", children: [_jsxs("div", { className: "database-diagram__side-panel__section__header", children: ["Lakehouse Stores", ' ', _jsxs("span", { className: "database-diagram__side-panel__section__count", children: ["(", database.includedStoreSpecifications.length, ")"] })] }), database.includedStoreSpecifications.map((spec) => (_jsx(LakehouseStoreRow, { editorState: editorState, spec: spec }, `${spec.storeType}:${spec.packageableElementPointer.value.path}`)))] }))] }));
330
+ });
331
+ //# sourceMappingURL=DatabaseSchemaTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseSchemaTree.js","sourceRoot":"","sources":["../../../../../src/components/editor/editor-group/database-editor/DatabaseSchemaTree.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,IAAI,GACL,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAQN,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAEL,iBAAiB,EACjB,eAAe,GAChB,MAAM,oFAAoF,CAAC;AAC5F,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AAOpC;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAgD,CAAC,EACtE,KAAK,EACL,KAAK,GAAG,MAAM,GACf,EAAE,EAAE;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,CACL,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,4BAA4B,EAAE;YAC5C,oCAAoC,EAAE,MAAM;SAC7C,CAAC,EACF,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EACjC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,sEAAsE;YACtE,2DAA2D;YAC3D,SAAS,CAAC,SAAS;iBAChB,SAAS,CAAC,KAAK,CAAC;iBAChB,IAAI,CAAC,GAAG,EAAE;gBACT,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;YAClD,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,8CAA8C;YAChD,CAAC,CAAC,CAAC;QACP,CAAC,YAED,KAAC,QAAQ,KAAG,GACL,CACV,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAa,GAAG,EAAE,CAAC,CACtC,eACE,SAAS,EAAC,4BAA4B,gBAC3B,iBAAiB,eACjB,IAAI,GACf,CACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAkC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CACtE,cAAK,SAAS,EAAC,qCAAqC,YAAE,OAAO,GAAO,CACrE,CAAC;AAEF;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,CAAC,GAAiB,EAAE,KAAa,EAAW,EAAE;IAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,wEAAwE;IACxE,wEAAwE;IACxE,IAAI,gBAAgB,IAAI,GAAG,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,KAAa,EAAW,EAAE;IACrE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,0BAA0B,GAAG,QAAQ,CACzC,CAAC,KAIA,EAAE,EAAE;IACH,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,KAAK,MAAM,CAAC;IACzD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,gCAAgC,EAAE;YAChD,0CAA0C,EAAE,UAAU;YACtD,oCAAoC,EAAE,IAAI;SAC3C,CAAC,EACF,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,EACvD,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,CAAC,MAAM,CAAC,EAAE,aAEzF,eAAM,SAAS,EAAC,sCAAsC,YACnD,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,OAAO,KAAG,CACZ,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,wCAAwC,uBAAS,CAClE,GACI,EACP,gBAAM,SAAS,EAAC,sCAAsC,aACnD,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,CAC3B,eACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAC,UAAU,kBAGX,CACR,IACI,EACP,eAAM,SAAS,EAAC,sCAAsC,YACnD,kBAAkB,CAAC,MAAM,CAAC,GACtB,EACP,KAAC,yBAAyB,IACxB,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,YAAY,EAAE,MAAM,CAAC,YAAY,EACjC,MAAM,EAAC,SAAS,GAChB,IACK,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,QAAQ,CACxC,CAAC,KAIA,EAAE,EAAE;IACH,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,UAAU,GACd,WAAW,CAAC,gBAAgB,KAAK,IAAI;QACrC,WAAW,CAAC,sBAAsB,KAAK,aAAa,CAAC,UAAU,CAAC;IAClE,mEAAmE;IACnE,iEAAiE;IACjE,MAAM,OAAO,GAAG,wBAAwB,CACtC,WAAW,CAAC,kBAAkB,EAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,IAAI,CAAC,IAAI,EACT,aAAa,CAAC,UAAU,CACzB,CAAC;IACF,MAAM,SAAS,GACb,WAAW,CAAC,2BAA2B;QACvC,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,CACjC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,UAAU,EAAE,CAC/D,CAAC;IACJ,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACb,gCAAgC,EAChC,sCAAsC,EACtC;YACE,oCAAoC,EAAE,IAAI;YAC1C,0CAA0C,EAAE,UAAU;SACvD,CACF,EACD,OAAO,EAAE,GAAG,EAAE,CACZ,WAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAE/D,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,aAAa,CAAC,UAAU,KAAK,OAAO,EAAE,aAEjF,eAAM,SAAS,EAAC,sCAAsC,YACnD,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,OAAO,KAAG,CACZ,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,wCAAwC,uBAAS,CAClE,GACI,EACP,eAAM,SAAS,EAAC,sCAAsC,YACnD,aAAa,CAAC,UAAU,GACpB,EACP,eAAM,SAAS,EAAC,sCAAsC,YACnD,SAAS,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,OAAO,GACrC,EACN,CAAC,SAAS,IAAI,CACb,KAAC,iBAAiB,IAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAC,cAAc,GAAG,CAC3D,IACM,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,QAAQ,CACnC,CAAC,KAAyD,EAAE,EAAE;IAC5D,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,oEAAoE;IACpE,2DAA2D;IAC3D,MAAM,UAAU,GAAG,KAAK,KAAK,EAAE,IAAI,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,WAAW,CAAC,gBAAgB,KAAK,KAAK,CAAC;IAC1D,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,iEAAiE;IACjE,gDAAgD;IAChD,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,cAAc,GAClB,KAAK,KAAK,EAAE,IAAI,gBAAgB;QAC9B,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,CACL,eAAK,SAAS,EAAC,+BAA+B,aAC5C,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE;oBACpD,8CAA8C,EAAE,UAAU;iBAC3D,CAAC,EACF,OAAO,EAAE,GAAG,EAAE;oBACZ,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;oBACnC,WAAW,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC,EACD,KAAK,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,aAE3C,eAAM,SAAS,EAAC,+BAA+B,YAC5C,UAAU,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,KAAC,gBAAgB,KAAG,GACnD,EACP,KAAC,sBAAsB,KAAG,EAC1B,eAAM,SAAS,EAAC,qCAAqC,YAClD,KAAK,CAAC,IAAI,GACN,EACP,eAAM,SAAS,EAAC,sCAAsC,YACnD,OAAO,CAAC,MAAM,GACV,EACP,KAAC,yBAAyB,IACxB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,MAAM,EAAC,SAAS,GAChB,IACK,EACR,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,yCAAyC,aAQrD,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;wBACrC,MAAM,OAAO,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;wBAClD,OAAO,CACL,eAIE,SAAS,EAAE,IAAI,CACb,yCAAyC,EACzC,wDAAwD,OAAO,CAAC,IAAI,EAAE,CACvE,EACD,KAAK,EAAE,OAAO,CAAC,WAAW,aAE1B,eAAM,SAAS,EAAC,gDAAgD,4BAEzD,EACP,eAAM,SAAS,EAAC,gDAAgD,YAC7D,OAAO,CAAC,KAAK,GACT,KAZF,OAAO,CAAC,KAAK,CAad,CACP,CAAC;oBACJ,CAAC,CAAC,EACD,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC9B,KAAC,0BAA0B,IAEzB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,IAHT,MAAM,CAAC,IAAI,CAIhB,CACH,CAAC,IACE,CACP,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,QAAQ,CACxC,CAAC,KAIA,EAAE,EAAE;IACH,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IACnD,MAAM,SAAS,GACb,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;IAC/C,qEAAqE;IACrE,+DAA+D;IAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,QAAQ,CAAC;IAC3D,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,aAAa,CAAC,UAAU,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC;QACpE,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACb,gCAAgC,EAChC,sCAAsC,EACtC,2CAA2C,CAC5C,EACD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,EACD,QAAQ,EAAE,CAAC,OAAO,EAClB,KAAK,EACH,OAAO;YACL,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,EAAE;YAC1B,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,aAGjD,eAAM,SAAS,EAAC,sCAAsC,YACpD,KAAC,UAAU,KAAG,GACT,EACP,eAAM,SAAS,EAAC,sCAAsC,uBAAc,EACpE,eAAM,SAAS,EAAC,sCAAsC,YAAE,OAAO,GAAQ,IAChE,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,0BAA0B,GAAG,QAAQ,CACzC,CAAC,KAAsE,EAAE,EAAE;IACzE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAC3C,MAAM,OAAO,GAAG,yBAAyB,CACvC,WAAW,CAAC,mBAAmB,EAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,IAAI,CAAC,IAAI,EACT,KAAK,CACN,CAAC;IACF,MAAM,SAAS,GACb,WAAW,CAAC,4BAA4B;QACxC,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAClC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,YAAY,KAAK,GAAG,CACrD,CAAC;IACJ,OAAO,CACL,eACE,SAAS,EAAE,IAAI,CACb,gCAAgC,EAChC,sCAAsC,EACtC,2CAA2C,EAC3C,0CAA0C,CAC3C,EACD,KAAK,EAAE,aAAa,KAAK,MAAM,OAAO,EAAE,aAExC,eAAM,SAAS,EAAC,sCAAsC,YACpD,eAAM,SAAS,EAAC,wCAAwC,uBAAS,GAC5D,EACP,eAAM,SAAS,EAAC,sCAAsC,YAAE,IAAI,KAAK,GAAG,GAAQ,EAC5E,eAAM,SAAS,EAAC,sCAAsC,YACnD,SAAS,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,OAAO,GACrC,EACN,CAAC,SAAS,IAAI,CACb,KAAC,iBAAiB,IAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAC,iBAAiB,GAAG,CAC9D,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,QAAQ,CAClC,CAAC,KAAuD,EAAE,EAAE;IAC1D,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,iDAAiD;IACjD,MAAM,UAAU,GAAG,KAAK,KAAK,EAAE,IAAI,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,WAAW,CAAC,gBAAgB,KAAK,IAAI,CAAC;IACzD,MAAM,OAAO,GAA+B,IAAI,CAAC,OAAO,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,eAAe,GACnB,KAAK,KAAK,EAAE,IAAI,eAAe;QAC7B,CAAC,CAAC,IAAI,CAAC,cAAc;QACrB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5E,OAAO,CACL,eAAK,SAAS,EAAC,mEAAmE,aAChF,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE;oBACpD,8CAA8C,EAAE,UAAU;iBAC3D,CAAC,EACF,OAAO,EAAE,GAAG,EAAE;oBACZ,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;oBAClC,WAAW,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC,EACD,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,SAAS,aAEhD,eAAM,SAAS,EAAC,+BAA+B,YAC5C,UAAU,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,KAAC,gBAAgB,KAAG,GACnD,EACP,KAAC,OAAO,KAAG,EACX,eAAM,SAAS,EAAC,qCAAqC,YAClD,IAAI,CAAC,IAAI,GACL,EACP,eAAM,SAAS,EAAC,sCAAsC,YACnD,IAAI,CAAC,cAAc,CAAC,MAAM,GACtB,EACN,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,CACzB,eACE,SAAS,EAAC,2FAA2F,EACrG,KAAK,EAAC,uBAAuB,yBAGxB,CACR,EACA,IAAI,CAAC,MAAM,IAAI,CACd,eACE,SAAS,EAAC,2FAA2F,EACrG,KAAK,EAAE,eACL,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,qBAAqB,IAAI,EAC7D,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,yBAGvB,CACR,EACA,YAAY,GAAG,CAAC,IAAI,CACnB,eACE,SAAS,EAAC,0FAA0F,EACpG,KAAK,EAAE,YAAY,YAAY,cAAc,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,YAE3E,aAAa,YAAY,GAAG,GACxB,CACR,EACD,KAAC,yBAAyB,IACxB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,MAAM,EAAC,SAAS,GAChB,IACK,EACR,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,yCAAyC,aACrD,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAChC,KAAC,yBAAyB,IAExB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,OAAO,IAHjB,OAAO,CAAC,UAAU,CAIvB,CACH,CAAC,EAGD,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,CAC9B,KAAC,yBAAyB,IACxB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,IAAI,CAAC,MAAM,GAC1B,CACH,EACA,KAAK,KAAK,EAAE;wBACX,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CACjC,KAAC,0BAA0B;wBACzB,qDAAqD;wBACrD,oDAAoD;4BAEpD,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,IAHP,WAAW,KAAK,EAAE,CAIvB,CACH,CAAC,IACA,CACP,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,QAAQ,CACpC,CAAC,KAA2D,EAAE,EAAE;IAC9D,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,gEAAgE;IAChE,MAAM,UAAU,GACd,KAAK,KAAK,EAAE,IAAI,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IACjE,OAAO,CACL,eAAK,SAAS,EAAC,gCAAgC,aAC7C,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,aAEzD,eAAM,SAAS,EAAC,+BAA+B,YAC5C,UAAU,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,KAAC,gBAAgB,KAAG,GACnD,EACP,KAAC,uBAAuB,KAAG,EAC3B,eAAM,SAAS,EAAC,sCAAsC,YACnD,MAAM,CAAC,IAAI,GACP,EACP,eAAM,SAAS,EAAC,uCAAuC,YACpD,aAAa,GACT,EACP,KAAC,yBAAyB,IACxB,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,YAAY,EAAE,MAAM,CAAC,YAAY,EACjC,MAAM,EAAC,SAAS,GAChB,IACK,EACR,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,0CAA0C,aACtD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,KAAC,oBAAoB,IAEnB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,IAFP,SAAS,KAAK,CAAC,IAAI,EAAE,CAG1B,CACH,CAAC,EACD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC1B,KAAC,mBAAmB,IAElB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,IAFL,QAAQ,IAAI,CAAC,IAAI,EAAE,CAGxB,CACH,CAAC,IACE,CACP,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAG,QAAQ,CAChC,CAAC,KAA+D,EAAE,EAAE;IAClE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,IAAI,GACR,IAAI,CAAC,yBAAyB,CAAC,qBAAqB;QACpD,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5C,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8CAA8C,EACxD,KAAK,EAAE,GAAG,IAAI,iBAAiB,IAAI,CAAC,SAAS,sBAAsB,EACnE,OAAO,EAAE,GAAG,EAAE,CACZ,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CACjD,IAAI,CAAC,yBAAyB,CAAC,KAAK,CACrC,aAGH,KAAC,oBAAoB,KAAG,EACxB,eAAM,SAAS,EAAC,oDAAoD,YACjE,IAAI,GACA,EACP,eAAM,SAAS,EAAC,oDAAoD,YACjE,IAAI,CAAC,SAAS,GACV,EACP,eAAM,SAAS,EAAC,oDAAoD,YAClE,KAAC,gBAAgB,KAAG,GACf,IACA,CACV,CAAC;AACJ,CAAC,CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CACxC,CAAC,KAA2C,EAAE,EAAE;IAC9C,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IACjC,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,uEAAuE;IACvE,kEAAkE;IAClE,0EAA0E;IAC1E,8CAA8C;IAC9C,MAAM,cAAc,GAClB,KAAK,KAAK,EAAE;QACV,CAAC,CAAC,QAAQ,CAAC,OAAO;QAClB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,MAAM,YAAY,GAChB,KAAK,KAAK,EAAE;QACV,CAAC,CAAC,QAAQ,CAAC,KAAK;QAChB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,MAAM,cAAc,GAClB,KAAK,KAAK,EAAE;QACV,CAAC,CAAC,QAAQ,CAAC,OAAO;QAClB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAM3C,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,sCAAsC,aACnD,KAAC,UAAU,KAAG,EACd,gBACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,6CAA6C,EACvD,WAAW,EAAC,oCAAoC,EAChD,KAAK,EAAE,WAAW,CAAC,UAAU,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1D,UAAU,EAAE,KAAK,GACjB,EACD,WAAW,CAAC,UAAU,KAAK,EAAE,IAAI,CAChC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,6CAA6C,EACvD,KAAK,EAAC,cAAc,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,YAE5C,KAAC,SAAS,KAAG,GACN,CACV,IACG,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAC,oBAAoB,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE,YAE7C,KAAC,aAAa,KAAG,GACV,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4CAA4C,EACtD,KAAK,EAAC,cAAc,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,YAExC,KAAC,YAAY,KAAG,GACT,IACL,EAEL,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBAC/B,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CACrC,eAAK,SAAS,EAAC,uCAAuC,aACpD,cAAK,SAAS,EAAC,+CAA+C,4BAExD,EACN,cAAK,SAAS,EAAC,2CAA2C,YACxD,KAAC,yBAAyB,IACxB,WAAW,EAAE,QAAQ,CAAC,WAAW,EACjC,YAAY,EAAE,QAAQ,CAAC,YAAY,EACnC,MAAM,EAAC,OAAO,GACd,GACE,IACF,CACP,EACD,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,+CAA+C,wBACpD,GAAG,EACX,eAAM,SAAS,EAAC,8CAA8C,YAC3D,KAAK,KAAK,EAAE;oCACX,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG;oCAChC,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,GACtD,IACH,EACL,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,KAAC,eAAe,IAAC,OAAO,EAAC,qBAAqB,GAAG,CAClD,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAChC,KAAC,eAAe,IAAC,OAAO,EAAC,sCAAsC,GAAG,CACnE,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC/B,KAAC,qBAAqB,IAEpB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,IAFT,MAAM,CAAC,IAAI,CAGhB,CACH,CAAC,CACH,IACG,EAEN,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,+CAA+C,sBACtD,GAAG,EACT,eAAM,SAAS,EAAC,8CAA8C,YAC3D,KAAK,KAAK,EAAE;oCACX,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG;oCAC9B,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,GAClD,IACH,EACL,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC7B,KAAC,eAAe,IAAC,OAAO,EAAC,mBAAmB,GAAG,CAChD,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC9B,KAAC,eAAe,IAAC,OAAO,EAAC,oCAAoC,GAAG,CACjE,CAAC,CAAC,CAAC,CACF,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBACxB,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,KAAK,IAAI,CAAC;wBACrD,MAAM,OAAO,GAAG,kBAAkB,CAChC,WAAW,CAAC,YAAY,EACxB,IAAI,CAAC,IAAI,CACV,CAAC;wBACF,MAAM,SAAS,GACb,WAAW,CAAC,qBAAqB;4BACjC,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;wBAClC,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;wBACjE,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,oCAAoC,EAAE;gCACpD,8CAA8C,EAAE,UAAU;6BAC3D,CAAC,EACF,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,EAC5C,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,aAEjC,eAAM,SAAS,EAAC,0CAA0C,YACxD,KAAC,0BAA0B,KAAG,GACzB,EACP,gBAAM,SAAS,EAAC,0CAA0C,aACxD,gBAAM,SAAS,EAAC,0CAA0C,aACvD,IAAI,CAAC,IAAI,EACT,QAAQ,IAAI,CACX,eACE,SAAS,EAAC,6FAA6F,EACvG,KAAK,EAAC,qDAAqD,qBAGtD,CACR,EACA,OAAO,IAAI,CACV,eACE,SAAS,EAAC,iGAAiG,EAC3G,KAAK,EAAC,uEAAuE,yBAGxE,CACR,IACI,EAMP,eAAM,SAAS,EAAC,6CAA6C,YAC1D,SAAS,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,OAAO,GACrC,IACF,EACN,CAAC,SAAS,IAAI,CACb,KAAC,iBAAiB,IAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAC,mBAAmB,GACzB,CACH,KA7CI,IAAI,CAAC,IAAI,CA8CP,CACV,CAAC;oBACJ,CAAC,CAAC,CACH,IACG,EAUN,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,+CAA+C,wBACpD,GAAG,EACX,eAAM,SAAS,EAAC,8CAA8C,YAC3D,KAAK,KAAK,EAAE;oCACX,CAAC,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG;oCAChC,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,GACtD,IACH,EACL,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,KAAC,eAAe,IAAC,OAAO,EAAC,qBAAqB,GAAG,CAClD,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAChC,KAAC,eAAe,IAAC,OAAO,EAAC,sCAAsC,GAAG,CACnE,CAAC,CAAC,CAAC,CACF,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;wBAC5B,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,KAAK,MAAM,CAAC;wBACzD,MAAM,OAAO,GAAG,oBAAoB,CAClC,WAAW,CAAC,cAAc,EAC1B,MAAM,CAAC,IAAI,CACZ,CAAC;wBACF,MAAM,SAAS,GACb,WAAW,CAAC,uBAAuB;4BACnC,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBAC/C,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,sCAAsC,EAAE;gCACtD,gDAAgD,EAC9C,UAAU;6BACb,CAAC,EACF,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,EAChD,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,aAEnC,eAAM,SAAS,EAAC,4CAA4C,YAC1D,KAAC,UAAU,KAAG,GACT,EACP,gBAAM,SAAS,EAAC,4CAA4C,aAC1D,eAAM,SAAS,EAAC,4CAA4C,YACzD,MAAM,CAAC,IAAI,GACP,EACP,eAAM,SAAS,EAAC,+CAA+C,YAC5D,SAAS,CAAC,CAAC,CAAC,KAAC,eAAe,KAAG,CAAC,CAAC,CAAC,OAAO,GACrC,IACF,EACN,CAAC,SAAS,IAAI,CACb,KAAC,iBAAiB,IAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAC,qBAAqB,GAC3B,CACH,KAzBI,MAAM,CAAC,IAAI,CA0BT,CACV,CAAC;oBACJ,CAAC,CAAC,CACH,IACG,EAYL,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAC/B,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,+CAA+C,gCAC5C,GAAG,EACnB,gBAAM,SAAS,EAAC,8CAA8C,kBAC1D,QAAQ,CAAC,QAAQ,CAAC,MAAM,SACrB,IACH,EACL,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;wBAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;wBACzD,OAAO,CACL,kBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8CAA8C,EACxD,KAAK,EAAE,GAAG,IAAI,qBAAqB,EACnC,OAAO,EAAE,GAAG,EAAE,CACZ,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CACjD,GAAG,CAAC,KAAK,CACV,aAGH,KAAC,iBAAiB,KAAG,EACrB,eAAM,SAAS,EAAC,oDAAoD,YACjE,IAAI,GACA,EACP,eAAM,SAAS,EAAC,oDAAoD,YAClE,KAAC,gBAAgB,KAAG,GACf,KAhBF,IAAI,CAiBF,CACV,CAAC;oBACJ,CAAC,CAAC,IACE,CACP,EAYA,QAAQ,CAAC,2BAA2B,CAAC,MAAM,GAAG,CAAC,IAAI,CAClD,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,+CAA+C,iCAC3C,GAAG,EACpB,gBAAM,SAAS,EAAC,8CAA8C,kBAC1D,QAAQ,CAAC,2BAA2B,CAAC,MAAM,SACxC,IACH,EACL,QAAQ,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAClD,KAAC,iBAAiB,IAEhB,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,IAFL,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,CAGrE,CACH,CAAC,IACE,CACP,IACG,CACP,CAAC;AACJ,CAAC,CACF,CAAC"}