@cloudwarriors-ai/rlm 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/application/handlers/llm-query-handler.d.ts +67 -0
  2. package/dist/application/handlers/llm-query-handler.d.ts.map +1 -0
  3. package/dist/application/handlers/llm-query-handler.js +169 -0
  4. package/dist/application/handlers/llm-query-handler.js.map +1 -0
  5. package/dist/application/query-handler.d.ts +23 -2
  6. package/dist/application/query-handler.d.ts.map +1 -1
  7. package/dist/application/query-handler.js +213 -143
  8. package/dist/application/query-handler.js.map +1 -1
  9. package/dist/cli/commands/query.d.ts +1 -0
  10. package/dist/cli/commands/query.d.ts.map +1 -1
  11. package/dist/cli/commands/query.js +1 -0
  12. package/dist/cli/commands/query.js.map +1 -1
  13. package/dist/cli/config-loader.d.ts +3 -0
  14. package/dist/cli/config-loader.d.ts.map +1 -1
  15. package/dist/cli/config-loader.js +1 -0
  16. package/dist/cli/config-loader.js.map +1 -1
  17. package/dist/cli/index.js +6 -4
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/domain/constants.d.ts +124 -0
  20. package/dist/domain/constants.d.ts.map +1 -0
  21. package/dist/domain/constants.js +148 -0
  22. package/dist/domain/constants.js.map +1 -0
  23. package/dist/domain/errors/index.d.ts +1 -0
  24. package/dist/domain/errors/index.d.ts.map +1 -1
  25. package/dist/domain/errors/index.js +2 -0
  26. package/dist/domain/errors/index.js.map +1 -1
  27. package/dist/domain/errors/token-budget-error.d.ts +47 -0
  28. package/dist/domain/errors/token-budget-error.d.ts.map +1 -0
  29. package/dist/domain/errors/token-budget-error.js +41 -0
  30. package/dist/domain/errors/token-budget-error.js.map +1 -0
  31. package/dist/domain/interfaces/code-executor.d.ts +32 -3
  32. package/dist/domain/interfaces/code-executor.d.ts.map +1 -1
  33. package/dist/domain/interfaces/event-emitter.d.ts +55 -1
  34. package/dist/domain/interfaces/event-emitter.d.ts.map +1 -1
  35. package/dist/domain/interfaces/llm-provider.d.ts +4 -0
  36. package/dist/domain/interfaces/llm-provider.d.ts.map +1 -1
  37. package/dist/domain/services/cost-calculator.d.ts.map +1 -1
  38. package/dist/domain/services/cost-calculator.js +9 -4
  39. package/dist/domain/services/cost-calculator.js.map +1 -1
  40. package/dist/domain/types/config.d.ts +17 -0
  41. package/dist/domain/types/config.d.ts.map +1 -1
  42. package/dist/domain/types/config.js +41 -0
  43. package/dist/domain/types/config.js.map +1 -1
  44. package/dist/domain/types/index-schema.d.ts +206 -0
  45. package/dist/domain/types/index-schema.d.ts.map +1 -0
  46. package/dist/domain/types/index-schema.js +41 -0
  47. package/dist/domain/types/index-schema.js.map +1 -0
  48. package/dist/domain/types/index.d.ts +2 -0
  49. package/dist/domain/types/index.d.ts.map +1 -1
  50. package/dist/domain/types/index.js +4 -0
  51. package/dist/domain/types/index.js.map +1 -1
  52. package/dist/domain/utils/timer.d.ts +34 -0
  53. package/dist/domain/utils/timer.d.ts.map +1 -0
  54. package/dist/domain/utils/timer.js +39 -0
  55. package/dist/domain/utils/timer.js.map +1 -0
  56. package/dist/factory/create-rlm.d.ts +39 -6
  57. package/dist/factory/create-rlm.d.ts.map +1 -1
  58. package/dist/factory/create-rlm.js +41 -14
  59. package/dist/factory/create-rlm.js.map +1 -1
  60. package/dist/factory/default-config.d.ts +2 -0
  61. package/dist/factory/default-config.d.ts.map +1 -1
  62. package/dist/factory/default-config.js +2 -0
  63. package/dist/factory/default-config.js.map +1 -1
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.js +1 -1
  66. package/dist/infrastructure/llm/openrouter-provider.d.ts +2 -0
  67. package/dist/infrastructure/llm/openrouter-provider.d.ts.map +1 -1
  68. package/dist/infrastructure/llm/openrouter-provider.js +50 -18
  69. package/dist/infrastructure/llm/openrouter-provider.js.map +1 -1
  70. package/dist/infrastructure/llm/prompts/index.d.ts +1 -1
  71. package/dist/infrastructure/llm/prompts/index.d.ts.map +1 -1
  72. package/dist/infrastructure/llm/prompts/index.js +1 -1
  73. package/dist/infrastructure/llm/prompts/index.js.map +1 -1
  74. package/dist/infrastructure/llm/prompts/system-prompt.d.ts +14 -1
  75. package/dist/infrastructure/llm/prompts/system-prompt.d.ts.map +1 -1
  76. package/dist/infrastructure/llm/prompts/system-prompt.js +186 -52
  77. package/dist/infrastructure/llm/prompts/system-prompt.js.map +1 -1
  78. package/dist/infrastructure/logging/debug-logger.d.ts +29 -0
  79. package/dist/infrastructure/logging/debug-logger.d.ts.map +1 -0
  80. package/dist/infrastructure/logging/debug-logger.js +35 -0
  81. package/dist/infrastructure/logging/debug-logger.js.map +1 -0
  82. package/dist/infrastructure/sandbox/prelude/rlm_prelude.py +637 -41
  83. package/dist/infrastructure/sandbox/process-manager.d.ts +1 -0
  84. package/dist/infrastructure/sandbox/process-manager.d.ts.map +1 -1
  85. package/dist/infrastructure/sandbox/process-manager.js +19 -6
  86. package/dist/infrastructure/sandbox/process-manager.js.map +1 -1
  87. package/dist/infrastructure/sandbox/python-executor.d.ts +5 -1
  88. package/dist/infrastructure/sandbox/python-executor.d.ts.map +1 -1
  89. package/dist/infrastructure/sandbox/python-executor.js +124 -6
  90. package/dist/infrastructure/sandbox/python-executor.js.map +1 -1
  91. package/package.json +5 -2
  92. package/src/infrastructure/sandbox/prelude/rlm_prelude.py +637 -41
@@ -0,0 +1,67 @@
1
+ import type { RLMConfig } from '../../domain/types/config.js';
2
+ import type { SessionState, RLMSession } from '../../domain/types/session.js';
3
+ import type { ILLMProvider } from '../../domain/interfaces/llm-provider.js';
4
+ import type { IEventEmitter } from '../../domain/interfaces/event-emitter.js';
5
+ import type { LLMQueryCommand } from '../../domain/interfaces/code-executor.js';
6
+ import type { QueryResult } from '../query-handler.js';
7
+ /**
8
+ * Response from handling an llm_query command
9
+ */
10
+ export type LLMQueryResponse = {
11
+ result: string;
12
+ } | {
13
+ error: string;
14
+ } | undefined;
15
+ /**
16
+ * Function signature for executing a recursive query
17
+ */
18
+ export type RecursiveExecutor = (session: RLMSession, state: SessionState, config: RLMConfig) => Promise<QueryResult>;
19
+ /**
20
+ * Dependencies for the LLM Query Handler
21
+ */
22
+ export interface LLMQueryHandlerDeps {
23
+ readonly llmProvider: ILLMProvider;
24
+ readonly eventEmitter: IEventEmitter;
25
+ readonly executeRecursive: RecursiveExecutor;
26
+ }
27
+ /**
28
+ * Context for handling an llm_query command
29
+ */
30
+ export interface LLMQueryContext {
31
+ readonly session: RLMSession;
32
+ readonly state: SessionState;
33
+ readonly config: RLMConfig;
34
+ }
35
+ /**
36
+ * Handles llm_query commands during Python code execution.
37
+ *
38
+ * This handler implements the recursive RLM pattern where sub-queries
39
+ * are executed as full RLM cycles, not just direct LLM calls.
40
+ */
41
+ export declare class LLMQueryHandler {
42
+ private readonly deps;
43
+ constructor(deps: LLMQueryHandlerDeps);
44
+ /**
45
+ * Handle an llm_query command from Python code execution
46
+ *
47
+ * @param command - The llm_query command with query and context variables
48
+ * @param context - The current execution context (session, state, config)
49
+ * @returns Response with result or error, or undefined if not handled
50
+ */
51
+ handle(command: LLMQueryCommand | {
52
+ type: string;
53
+ }, context: LLMQueryContext): Promise<LLMQueryResponse>;
54
+ /**
55
+ * Emit token check event for observability
56
+ */
57
+ private emitTokenCheck;
58
+ /**
59
+ * Create sub-session and sub-state for recursive execution
60
+ */
61
+ private createSubSessionAndState;
62
+ /**
63
+ * Accumulate usage from sub-state back to parent state
64
+ */
65
+ private accumulateUsage;
66
+ }
67
+ //# sourceMappingURL=llm-query-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-query-handler.d.ts","sourceRoot":"","sources":["../../../src/application/handlers/llm-query-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,SAAS,KACd,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,mBAAmB;IAEtD;;;;;;OAMG;IACG,MAAM,CACV,OAAO,EAAE,eAAe,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAC3C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC;IA2F5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsDhC;;OAEG;IACH,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,169 @@
1
+ import { canRecurse } from '../../domain/services/limit-checker.js';
2
+ import { LlmQueryCapacityError } from '../../domain/errors/index.js';
3
+ import { LLM_QUERY_MAX_CHARS } from '../../domain/constants.js';
4
+ import { createDebugLogger } from '../../infrastructure/logging/debug-logger.js';
5
+ const dbg = createDebugLogger('LQH');
6
+ /**
7
+ * Handles llm_query commands during Python code execution.
8
+ *
9
+ * This handler implements the recursive RLM pattern where sub-queries
10
+ * are executed as full RLM cycles, not just direct LLM calls.
11
+ */
12
+ export class LLMQueryHandler {
13
+ deps;
14
+ constructor(deps) {
15
+ this.deps = deps;
16
+ }
17
+ /**
18
+ * Handle an llm_query command from Python code execution
19
+ *
20
+ * @param command - The llm_query command with query and context variables
21
+ * @param context - The current execution context (session, state, config)
22
+ * @returns Response with result or error, or undefined if not handled
23
+ */
24
+ async handle(command, context) {
25
+ if (command.type !== 'llm_query') {
26
+ return undefined;
27
+ }
28
+ const llmCommand = command;
29
+ const { session, state, config } = context;
30
+ // Check recursion limit
31
+ if (!canRecurse(state, config)) {
32
+ return { error: 'Maximum recursion depth reached' };
33
+ }
34
+ const subContext = llmCommand.contextVariables.join('\n\n');
35
+ dbg('RECURSIVE_START', {
36
+ depth: state.currentDepth + 1,
37
+ contextSize: subContext.length,
38
+ queryLen: llmCommand.query.length,
39
+ });
40
+ // Validate llm_query() capacity limit (per MIT paper: ~500K chars)
41
+ if (subContext.length > LLM_QUERY_MAX_CHARS) {
42
+ const error = new LlmQueryCapacityError({
43
+ providedChars: subContext.length,
44
+ maxChars: LLM_QUERY_MAX_CHARS,
45
+ hint: 'Use smaller chunks or get_units_safe() to stay within limit',
46
+ });
47
+ return { error: error.message };
48
+ }
49
+ // Emit token check event for observability
50
+ this.emitTokenCheck(session, state, subContext);
51
+ // Create sub-session and sub-state
52
+ const { subSession, subState } = this.createSubSessionAndState(session, state, config, llmCommand.query, subContext);
53
+ // Use subModel for recursive calls if configured (per MIT paper)
54
+ const subConfig = config.subModel
55
+ ? { ...config, model: config.subModel }
56
+ : config;
57
+ try {
58
+ const recursiveStart = Date.now();
59
+ this.deps.eventEmitter.emit({
60
+ type: 'rlm.recursive.started',
61
+ sessionId: subSession.id,
62
+ timestamp: new Date(),
63
+ query: llmCommand.query,
64
+ depth: subState.currentDepth,
65
+ });
66
+ // RECURSIVE: Execute full RLM cycle - sub-LLM writes code to analyze
67
+ const result = await this.deps.executeRecursive(subSession, subState, subConfig);
68
+ dbg('RECURSIVE_END', {
69
+ depth: subState.currentDepth,
70
+ success: result.success,
71
+ durationMs: Date.now() - recursiveStart,
72
+ answerLen: result.answer.length,
73
+ });
74
+ // Accumulate usage back to parent
75
+ this.accumulateUsage(state, subState);
76
+ this.deps.eventEmitter.emit({
77
+ type: 'rlm.recursive.completed',
78
+ sessionId: subSession.id,
79
+ timestamp: new Date(),
80
+ depth: subState.currentDepth,
81
+ resultLength: result.answer.length,
82
+ });
83
+ if (result.success) {
84
+ return { result: result.answer };
85
+ }
86
+ else {
87
+ return { error: result.error ?? 'Sub-query failed' };
88
+ }
89
+ }
90
+ catch (error) {
91
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
92
+ return { error: errorMessage };
93
+ }
94
+ }
95
+ /**
96
+ * Emit token check event for observability
97
+ */
98
+ emitTokenCheck(session, state, subContext) {
99
+ const contextTokens = this.deps.llmProvider.estimateTokens(subContext);
100
+ const modelLimit = this.deps.llmProvider.getModelContextLimit();
101
+ this.deps.eventEmitter.emit({
102
+ type: 'rlm.token_check',
103
+ sessionId: session.id,
104
+ timestamp: new Date(),
105
+ contextTokens,
106
+ limit: modelLimit,
107
+ depth: state.currentDepth + 1,
108
+ action: contextTokens > modelLimit * 0.9 ? 'warning' : 'ok',
109
+ });
110
+ }
111
+ /**
112
+ * Create sub-session and sub-state for recursive execution
113
+ */
114
+ createSubSessionAndState(session, state, config, query, subContext) {
115
+ const subSessionId = `${session.id}-r${state.recursiveCalls}`;
116
+ const subSession = {
117
+ id: subSessionId,
118
+ query,
119
+ context: [{
120
+ name: 'context',
121
+ content: subContext,
122
+ metadata: {
123
+ source: 'variable',
124
+ sizeBytes: Buffer.byteLength(subContext, 'utf-8'),
125
+ estimatedTokens: this.deps.llmProvider.estimateTokens(subContext),
126
+ createdAt: new Date(),
127
+ },
128
+ }],
129
+ config,
130
+ status: 'running',
131
+ currentDepth: state.currentDepth + 1,
132
+ usage: {
133
+ totalTokens: 0,
134
+ costUsd: 0,
135
+ llmCalls: 0,
136
+ recursiveCalls: 0,
137
+ maxDepthReached: 0,
138
+ executionTimeMs: 0,
139
+ },
140
+ trace: { steps: [], warnings: [], recoveredErrors: [] },
141
+ createdAt: new Date(),
142
+ cancellationRequested: false,
143
+ };
144
+ const subState = {
145
+ sessionId: subSessionId,
146
+ currentDepth: state.currentDepth + 1,
147
+ maxDepthReached: state.currentDepth + 1,
148
+ totalTokens: 0,
149
+ totalCostUsd: 0,
150
+ llmCalls: 0,
151
+ recursiveCalls: 0,
152
+ startTime: Date.now(),
153
+ pythonVariables: new Map([['context', subContext]]),
154
+ cancellationRequested: false,
155
+ };
156
+ return { subSession, subState };
157
+ }
158
+ /**
159
+ * Accumulate usage from sub-state back to parent state
160
+ */
161
+ accumulateUsage(state, subState) {
162
+ state.totalTokens += subState.totalTokens;
163
+ state.totalCostUsd += subState.totalCostUsd;
164
+ state.llmCalls += subState.llmCalls;
165
+ state.recursiveCalls += 1 + subState.recursiveCalls;
166
+ state.maxDepthReached = Math.max(state.maxDepthReached, subState.maxDepthReached);
167
+ }
168
+ }
169
+ //# sourceMappingURL=llm-query-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-query-handler.js","sourceRoot":"","sources":["../../../src/application/handlers/llm-query-handler.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,11 @@ export interface QueryResult {
16
16
  error?: string;
17
17
  /** Execution steps performed */
18
18
  steps: ExecutionStep[];
19
+ /**
20
+ * Confidence level if set_result_final() was called (0.0-1.0)
21
+ * Signals early termination - no further processing needed
22
+ */
23
+ finalAnswerConfidence?: number;
19
24
  }
20
25
  /**
21
26
  * Handles execution of RLM queries
@@ -33,14 +38,30 @@ export declare class QueryHandler {
33
38
  * Generate Python code for the query
34
39
  */
35
40
  private generateCode;
41
+ /**
42
+ * Generate a direct answer for recursive calls (depth > 0)
43
+ *
44
+ * Unlike generateCode(), this method asks the LLM to provide a direct
45
+ * text answer rather than writing Python code. This matches the MIT paper's
46
+ * intended behavior for llm_query() calls.
47
+ */
48
+ private generateDirectAnswer;
36
49
  /**
37
50
  * Execute Python code and handle commands
38
51
  */
39
52
  private executeCode;
40
53
  /**
41
- * Handle llm_query command from Python
54
+ * Create execution context for Python code execution
55
+ */
56
+ private createExecutionContext;
57
+ /**
58
+ * Record execution step in trace
59
+ */
60
+ private recordExecutionStep;
61
+ /**
62
+ * Process set_variable commands from execution result
42
63
  */
43
- private handleLLMQueryCommand;
64
+ private processVariableCommands;
44
65
  /**
45
66
  * Attempt to recover from an error by asking the LLM to fix the code
46
67
  */
@@ -1 +1 @@
1
- {"version":3,"file":"query-handler.d.ts","sourceRoot":"","sources":["../../src/application/query-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,2BAA2B,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,uCAAuC,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAgB3E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IAEf,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IAEjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gCAAgC;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa;IAG9C;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,WAAW,CAAC;IA2CvB;;OAEG;YACW,YAAY;IAyF1B;;OAEG;YACW,WAAW;IAkKzB;;OAEG;YACW,qBAAqB;IAyFnC;;OAEG;YACW,gBAAgB;CAyC/B"}
1
+ {"version":3,"file":"query-handler.d.ts","sourceRoot":"","sources":["../../src/application/query-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,2BAA2B,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAmB,MAAM,uCAAuC,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AA0B3E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IAEf,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IAEjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,gCAAgC;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IAEvB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,aAAa;IAG9C;;OAEG;IACG,OAAO,CACX,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,WAAW,CAAC;IAgEvB;;OAEG;YACW,YAAY;IA6G1B;;;;;;OAMG;YACW,oBAAoB;IAiHlC;;OAEG;YACW,WAAW;IA0HzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;YACW,gBAAgB;CA4C/B"}