@allternit/workflow-engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +227 -0
  2. package/dist/engine/workflow-engine.d.ts +39 -0
  3. package/dist/engine/workflow-engine.d.ts.bak +39 -0
  4. package/dist/engine/workflow-engine.d.ts.map +1 -0
  5. package/dist/engine/workflow-engine.js +532 -0
  6. package/dist/engine/workflow-engine.js.bak +532 -0
  7. package/dist/engine/workflow-engine.js.map +1 -0
  8. package/dist/index.d.ts +38 -0
  9. package/dist/index.d.ts.bak +38 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +41 -0
  12. package/dist/index.js.bak +41 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/scheduler/index.d.ts +53 -0
  15. package/dist/scheduler/index.d.ts.bak +53 -0
  16. package/dist/scheduler/index.d.ts.map +1 -0
  17. package/dist/scheduler/index.js +135 -0
  18. package/dist/scheduler/index.js.bak +135 -0
  19. package/dist/scheduler/index.js.map +1 -0
  20. package/dist/types.d.ts +402 -0
  21. package/dist/types.d.ts.bak +402 -0
  22. package/dist/types.d.ts.map +1 -0
  23. package/dist/types.js +7 -0
  24. package/dist/types.js.bak +7 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist/visualizer/index.d.ts +81 -0
  27. package/dist/visualizer/index.d.ts.bak +81 -0
  28. package/dist/visualizer/index.d.ts.map +1 -0
  29. package/dist/visualizer/index.js +277 -0
  30. package/dist/visualizer/index.js.bak +277 -0
  31. package/dist/visualizer/index.js.map +1 -0
  32. package/package.json +57 -0
  33. package/src/__tests__/visualizer.test.ts.bak +110 -0
  34. package/src/__tests__/workflow-engine.test.ts.bak +239 -0
  35. package/src/engine/workflow-engine.test.ts.bak +852 -0
  36. package/src/engine/workflow-engine.ts +651 -0
  37. package/src/engine/workflow-engine.ts.bak +651 -0
  38. package/src/index.ts +89 -0
  39. package/src/index.ts.bak +89 -0
  40. package/src/scheduler/index.ts +204 -0
  41. package/src/scheduler/index.ts.bak +204 -0
  42. package/src/scheduler/scheduler.test.ts.bak +521 -0
  43. package/src/types.ts +449 -0
  44. package/src/types.ts.bak +449 -0
  45. package/src/visualizer/index.ts +409 -0
  46. package/src/visualizer/index.ts.bak +409 -0
  47. package/src/visualizer/visualizer.test.ts.bak +844 -0
  48. package/tsconfig.json +22 -0
  49. package/vitest.config.ts.bak +9 -0
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * A2R Workflow Engine
3
+ *
4
+ * Visual workflow orchestration with DAG support.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { createWorkflowEngine, createVisualizer } from '@allternit/workflow-engine';
9
+ *
10
+ * const engine = createWorkflowEngine();
11
+ *
12
+ * // Register workflow
13
+ * engine.registerWorkflow({
14
+ * id: 'my-workflow',
15
+ * name: 'My Workflow',
16
+ * version: '1.0.0',
17
+ * nodes: [
18
+ * { id: 'trigger', type: 'trigger:manual', name: 'Start' },
19
+ * { id: 'http', type: 'http:request', name: 'Fetch Data', config: { method: 'GET' } },
20
+ * { id: 'output', type: 'output:result', name: 'Return Result' },
21
+ * ],
22
+ * connections: [
23
+ * { id: 'c1', source: 'trigger', target: 'http' },
24
+ * { id: 'c2', source: 'http', target: 'output' },
25
+ * ],
26
+ * });
27
+ *
28
+ * // Execute workflow
29
+ * const execution = await engine.execute('my-workflow', { url: 'https://api.example.com' });
30
+ * console.log(execution.status); // 'completed'
31
+ * ```
32
+ */
33
+ // Engine
34
+ export { createWorkflowEngine, globalWorkflowEngine, } from './engine/workflow-engine';
35
+ // Scheduler
36
+ export { createScheduler, globalScheduler, } from './scheduler';
37
+ // Visualizer
38
+ export { createVisualizer, globalVisualizer, } from './visualizer';
39
+ // Version
40
+ export const VERSION = '0.1.0';
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,41 @@
1
+ /**
2
+ * A2R Workflow Engine
3
+ *
4
+ * Visual workflow orchestration with DAG support.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { createWorkflowEngine, createVisualizer } from '@allternit/workflow-engine';
9
+ *
10
+ * const engine = createWorkflowEngine();
11
+ *
12
+ * // Register workflow
13
+ * engine.registerWorkflow({
14
+ * id: 'my-workflow',
15
+ * name: 'My Workflow',
16
+ * version: '1.0.0',
17
+ * nodes: [
18
+ * { id: 'trigger', type: 'trigger:manual', name: 'Start' },
19
+ * { id: 'http', type: 'http:request', name: 'Fetch Data', config: { method: 'GET' } },
20
+ * { id: 'output', type: 'output:result', name: 'Return Result' },
21
+ * ],
22
+ * connections: [
23
+ * { id: 'c1', source: 'trigger', target: 'http' },
24
+ * { id: 'c2', source: 'http', target: 'output' },
25
+ * ],
26
+ * });
27
+ *
28
+ * // Execute workflow
29
+ * const execution = await engine.execute('my-workflow', { url: 'https://api.example.com' });
30
+ * console.log(execution.status); // 'completed'
31
+ * ```
32
+ */
33
+ // Engine
34
+ export { createWorkflowEngine, globalWorkflowEngine, } from './engine/workflow-engine';
35
+ // Scheduler
36
+ export { createScheduler, globalScheduler, } from './scheduler';
37
+ // Visualizer
38
+ export { createVisualizer, globalVisualizer, } from './visualizer';
39
+ // Version
40
+ export const VERSION = '0.1.0';
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AA2BH,SAAS;AACT,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAErB,MAAM,0BAA0B,CAAC;AAElC,YAAY;AACZ,OAAO,EACL,eAAe,EACf,eAAe,GAKhB,MAAM,aAAa,CAAC;AAErB,aAAa;AACb,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAOjB,MAAM,cAAc,CAAC;AAEtB,UAAU;AACV,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Workflow Scheduler
3
+ *
4
+ * Handles parallel execution, queuing, and resource management.
5
+ */
6
+ import type { WorkflowExecution, WorkflowNode } from '../types';
7
+ export interface SchedulerConfig {
8
+ /** Max concurrent tasks */
9
+ maxConcurrency?: number;
10
+ /** Queue size limit */
11
+ queueLimit?: number;
12
+ /** Default task timeout (ms) */
13
+ defaultTimeout?: number;
14
+ /** Enable task prioritization */
15
+ enablePriority?: boolean;
16
+ }
17
+ export interface Task {
18
+ id: string;
19
+ node: WorkflowNode;
20
+ execution: WorkflowExecution;
21
+ priority?: number;
22
+ timeout?: number;
23
+ }
24
+ export interface Scheduler {
25
+ /** Submit task for execution */
26
+ submit(task: Task): Promise<unknown>;
27
+ /** Submit multiple tasks (parallel) */
28
+ submitAll(tasks: Task[]): Promise<unknown[]>;
29
+ /** Cancel task */
30
+ cancel(taskId: string): boolean;
31
+ /** Get queue status */
32
+ getStatus(): SchedulerStatus;
33
+ /** Pause scheduler */
34
+ pause(): void;
35
+ /** Resume scheduler */
36
+ resume(): void;
37
+ }
38
+ export interface SchedulerStatus {
39
+ running: number;
40
+ queued: number;
41
+ completed: number;
42
+ failed: number;
43
+ isPaused: boolean;
44
+ }
45
+ /**
46
+ * Create workflow scheduler
47
+ */
48
+ export declare function createScheduler(config?: SchedulerConfig): Scheduler;
49
+ /**
50
+ * Global scheduler instance
51
+ */
52
+ export declare const globalScheduler: Scheduler;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Workflow Scheduler
3
+ *
4
+ * Handles parallel execution, queuing, and resource management.
5
+ */
6
+ import type { WorkflowExecution, WorkflowNode } from '../types';
7
+ export interface SchedulerConfig {
8
+ /** Max concurrent tasks */
9
+ maxConcurrency?: number;
10
+ /** Queue size limit */
11
+ queueLimit?: number;
12
+ /** Default task timeout (ms) */
13
+ defaultTimeout?: number;
14
+ /** Enable task prioritization */
15
+ enablePriority?: boolean;
16
+ }
17
+ export interface Task {
18
+ id: string;
19
+ node: WorkflowNode;
20
+ execution: WorkflowExecution;
21
+ priority?: number;
22
+ timeout?: number;
23
+ }
24
+ export interface Scheduler {
25
+ /** Submit task for execution */
26
+ submit(task: Task): Promise<unknown>;
27
+ /** Submit multiple tasks (parallel) */
28
+ submitAll(tasks: Task[]): Promise<unknown[]>;
29
+ /** Cancel task */
30
+ cancel(taskId: string): boolean;
31
+ /** Get queue status */
32
+ getStatus(): SchedulerStatus;
33
+ /** Pause scheduler */
34
+ pause(): void;
35
+ /** Resume scheduler */
36
+ resume(): void;
37
+ }
38
+ export interface SchedulerStatus {
39
+ running: number;
40
+ queued: number;
41
+ completed: number;
42
+ failed: number;
43
+ isPaused: boolean;
44
+ }
45
+ /**
46
+ * Create workflow scheduler
47
+ */
48
+ export declare function createScheduler(config?: SchedulerConfig): Scheduler;
49
+ /**
50
+ * Global scheduler instance
51
+ */
52
+ export declare const globalScheduler: Scheduler;
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAoB,MAAM,UAAU,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,uCAAuC;IACvC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,kBAAkB;IAClB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,uBAAuB;IACvB,SAAS,IAAI,eAAe,CAAC;IAC7B,sBAAsB;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,uBAAuB;IACvB,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAE,eAAoB,GAAG,SAAS,CAiJvE;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,WAAoB,CAAC"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Workflow Scheduler
3
+ *
4
+ * Handles parallel execution, queuing, and resource management.
5
+ */
6
+ /**
7
+ * Create workflow scheduler
8
+ */
9
+ export function createScheduler(config = {}) {
10
+ const { maxConcurrency = 5, queueLimit = 100, defaultTimeout = 60000, enablePriority = false, } = config;
11
+ const queue = [];
12
+ const running = new Map();
13
+ let isPaused = false;
14
+ let completed = 0;
15
+ let failed = 0;
16
+ /**
17
+ * Process queue
18
+ */
19
+ async function processQueue() {
20
+ if (isPaused || running.size >= maxConcurrency || queue.length === 0) {
21
+ return;
22
+ }
23
+ // Sort by priority if enabled
24
+ if (enablePriority) {
25
+ queue.sort((a, b) => (b.priority || 0) - (a.priority || 0));
26
+ }
27
+ const task = queue.shift();
28
+ if (!task)
29
+ return;
30
+ const controller = new AbortController();
31
+ running.set(task.id, controller);
32
+ try {
33
+ const timeout = task.timeout || defaultTimeout;
34
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
35
+ // Execute task
36
+ const result = await executeTask(task, controller.signal);
37
+ clearTimeout(timeoutId);
38
+ completed++;
39
+ return;
40
+ }
41
+ catch (error) {
42
+ failed++;
43
+ throw error;
44
+ }
45
+ finally {
46
+ running.delete(task.id);
47
+ // Process next
48
+ processQueue();
49
+ }
50
+ }
51
+ /**
52
+ * Execute task
53
+ */
54
+ async function executeTask(task, signal) {
55
+ if (signal.aborted) {
56
+ throw new Error('Task cancelled');
57
+ }
58
+ // Task execution logic here
59
+ // This would integrate with the workflow engine
60
+ return { taskId: task.id, status: 'completed' };
61
+ }
62
+ /**
63
+ * Submit task
64
+ */
65
+ async function submit(task) {
66
+ if (queue.length >= queueLimit) {
67
+ throw new Error('Queue limit reached');
68
+ }
69
+ queue.push(task);
70
+ // Start processing
71
+ return processQueue();
72
+ }
73
+ /**
74
+ * Submit multiple tasks
75
+ */
76
+ async function submitAll(tasks) {
77
+ return Promise.all(tasks.map(task => submit(task)));
78
+ }
79
+ /**
80
+ * Cancel task
81
+ */
82
+ function cancel(taskId) {
83
+ // Cancel if running
84
+ const controller = running.get(taskId);
85
+ if (controller) {
86
+ controller.abort();
87
+ return true;
88
+ }
89
+ // Remove from queue
90
+ const index = queue.findIndex(t => t.id === taskId);
91
+ if (index >= 0) {
92
+ queue.splice(index, 1);
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ /**
98
+ * Get status
99
+ */
100
+ function getStatus() {
101
+ return {
102
+ running: running.size,
103
+ queued: queue.length,
104
+ completed,
105
+ failed,
106
+ isPaused,
107
+ };
108
+ }
109
+ /**
110
+ * Pause scheduler
111
+ */
112
+ function pause() {
113
+ isPaused = true;
114
+ }
115
+ /**
116
+ * Resume scheduler
117
+ */
118
+ function resume() {
119
+ isPaused = false;
120
+ processQueue();
121
+ }
122
+ return {
123
+ submit,
124
+ submitAll,
125
+ cancel,
126
+ getStatus,
127
+ pause,
128
+ resume,
129
+ };
130
+ }
131
+ /**
132
+ * Global scheduler instance
133
+ */
134
+ export const globalScheduler = createScheduler();
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Workflow Scheduler
3
+ *
4
+ * Handles parallel execution, queuing, and resource management.
5
+ */
6
+ /**
7
+ * Create workflow scheduler
8
+ */
9
+ export function createScheduler(config = {}) {
10
+ const { maxConcurrency = 5, queueLimit = 100, defaultTimeout = 60000, enablePriority = false, } = config;
11
+ const queue = [];
12
+ const running = new Map();
13
+ let isPaused = false;
14
+ let completed = 0;
15
+ let failed = 0;
16
+ /**
17
+ * Process queue
18
+ */
19
+ async function processQueue() {
20
+ if (isPaused || running.size >= maxConcurrency || queue.length === 0) {
21
+ return;
22
+ }
23
+ // Sort by priority if enabled
24
+ if (enablePriority) {
25
+ queue.sort((a, b) => (b.priority || 0) - (a.priority || 0));
26
+ }
27
+ const task = queue.shift();
28
+ if (!task)
29
+ return;
30
+ const controller = new AbortController();
31
+ running.set(task.id, controller);
32
+ try {
33
+ const timeout = task.timeout || defaultTimeout;
34
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
35
+ // Execute task
36
+ const result = await executeTask(task, controller.signal);
37
+ clearTimeout(timeoutId);
38
+ completed++;
39
+ return;
40
+ }
41
+ catch (error) {
42
+ failed++;
43
+ throw error;
44
+ }
45
+ finally {
46
+ running.delete(task.id);
47
+ // Process next
48
+ processQueue();
49
+ }
50
+ }
51
+ /**
52
+ * Execute task
53
+ */
54
+ async function executeTask(task, signal) {
55
+ if (signal.aborted) {
56
+ throw new Error('Task cancelled');
57
+ }
58
+ // Task execution logic here
59
+ // This would integrate with the workflow engine
60
+ return { taskId: task.id, status: 'completed' };
61
+ }
62
+ /**
63
+ * Submit task
64
+ */
65
+ async function submit(task) {
66
+ if (queue.length >= queueLimit) {
67
+ throw new Error('Queue limit reached');
68
+ }
69
+ queue.push(task);
70
+ // Start processing
71
+ return processQueue();
72
+ }
73
+ /**
74
+ * Submit multiple tasks
75
+ */
76
+ async function submitAll(tasks) {
77
+ return Promise.all(tasks.map(task => submit(task)));
78
+ }
79
+ /**
80
+ * Cancel task
81
+ */
82
+ function cancel(taskId) {
83
+ // Cancel if running
84
+ const controller = running.get(taskId);
85
+ if (controller) {
86
+ controller.abort();
87
+ return true;
88
+ }
89
+ // Remove from queue
90
+ const index = queue.findIndex(t => t.id === taskId);
91
+ if (index >= 0) {
92
+ queue.splice(index, 1);
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ /**
98
+ * Get status
99
+ */
100
+ function getStatus() {
101
+ return {
102
+ running: running.size,
103
+ queued: queue.length,
104
+ completed,
105
+ failed,
106
+ isPaused,
107
+ };
108
+ }
109
+ /**
110
+ * Pause scheduler
111
+ */
112
+ function pause() {
113
+ isPaused = true;
114
+ }
115
+ /**
116
+ * Resume scheduler
117
+ */
118
+ function resume() {
119
+ isPaused = false;
120
+ processQueue();
121
+ }
122
+ return {
123
+ submit,
124
+ submitAll,
125
+ cancel,
126
+ getStatus,
127
+ pause,
128
+ resume,
129
+ };
130
+ }
131
+ /**
132
+ * Global scheduler instance
133
+ */
134
+ export const globalScheduler = createScheduler();
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8CH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAA0B,EAAE;IAC1D,MAAM,EACJ,cAAc,GAAG,CAAC,EAClB,UAAU,GAAG,GAAG,EAChB,cAAc,GAAG,KAAK,EACtB,cAAc,GAAG,KAAK,GACvB,GAAG,MAAM,CAAC;IAEX,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IACnD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf;;OAEG;IACH,KAAK,UAAU,YAAY;QACzB,IAAI,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,cAAc,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO;QACT,CAAC;QAED,8BAA8B;QAC9B,IAAI,cAAc,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAEjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;YAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;YAEhE,eAAe;YACf,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAE1D,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,SAAS,EAAE,CAAC;YAEZ,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,CAAC;YACT,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,eAAe;YACf,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,UAAU,WAAW,CAAC,IAAU,EAAE,MAAmB;QACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,4BAA4B;QAC5B,gDAAgD;QAChD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,UAAU,MAAM,CAAC,IAAU;QAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,mBAAmB;QACnB,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,UAAU,SAAS,CAAC,KAAa;QACpC,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,SAAS,MAAM,CAAC,MAAc;QAC5B,oBAAoB;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oBAAoB;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,SAAS;QAChB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;YACT,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS,KAAK;QACZ,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,SAAS,MAAM;QACb,QAAQ,GAAG,KAAK,CAAC;QACjB,YAAY,EAAE,CAAC;IACjB,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS;QACT,MAAM;QACN,SAAS;QACT,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,EAAE,CAAC"}