mcp-compose 0.0.7 → 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 (44) hide show
  1. package/README.md +58 -11
  2. package/dist/bin/mcp-compose.js +8 -8
  3. package/dist/bin/mcp-compose.js.map +1 -1
  4. package/dist/bin/mcp-gateway.d.ts +3 -0
  5. package/dist/bin/mcp-gateway.d.ts.map +1 -0
  6. package/dist/bin/mcp-gateway.js +41 -0
  7. package/dist/bin/mcp-gateway.js.map +1 -0
  8. package/dist/package.json +4 -3
  9. package/dist/src/command.d.ts +4 -0
  10. package/dist/src/command.d.ts.map +1 -0
  11. package/dist/src/command.js +66 -0
  12. package/dist/src/command.js.map +1 -0
  13. package/dist/src/config.d.ts +2 -2
  14. package/dist/src/config.d.ts.map +1 -1
  15. package/dist/src/config.js +16 -3
  16. package/dist/src/config.js.map +1 -1
  17. package/dist/src/gateway.d.ts +22 -0
  18. package/dist/src/gateway.d.ts.map +1 -0
  19. package/dist/src/gateway.js +405 -0
  20. package/dist/src/gateway.js.map +1 -0
  21. package/dist/src/index.d.ts +3 -1
  22. package/dist/src/index.d.ts.map +1 -1
  23. package/dist/src/index.js +3 -1
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/oauth.d.ts +37 -0
  26. package/dist/src/oauth.d.ts.map +1 -0
  27. package/dist/src/oauth.js +317 -0
  28. package/dist/src/oauth.js.map +1 -0
  29. package/dist/src/pm2.d.ts +2 -2
  30. package/dist/src/pm2.d.ts.map +1 -1
  31. package/dist/src/pm2.js +17 -18
  32. package/dist/src/pm2.js.map +1 -1
  33. package/dist/src/sync.js +1 -1
  34. package/dist/src/sync.js.map +1 -1
  35. package/dist/src/types.d.ts +19 -2
  36. package/dist/src/types.d.ts.map +1 -1
  37. package/dist/src/validation.d.ts.map +1 -1
  38. package/dist/src/validation.js +31 -17
  39. package/dist/src/validation.js.map +1 -1
  40. package/package.json +4 -3
  41. package/dist/src/supergateway.d.ts +0 -9
  42. package/dist/src/supergateway.d.ts.map +0 -1
  43. package/dist/src/supergateway.js +0 -54
  44. package/dist/src/supergateway.js.map +0 -1
@@ -0,0 +1,405 @@
1
+ import { createServer as createHttpServer } from 'node:http';
2
+ import { spawn } from 'node:child_process';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { OAuthClient } from './oauth.js';
5
+ // --- Helpers ---
6
+ const REQUEST_TIMEOUT_MS = 120_000;
7
+ const MAX_NOTIFICATION_BUFFER = 1000;
8
+ function isJsonRpcMessage(value) {
9
+ return typeof value === 'object' && value !== null && 'jsonrpc' in value;
10
+ }
11
+ function hasRequestId(msg) {
12
+ return msg.id !== undefined && msg.id !== null;
13
+ }
14
+ function readBody(req) {
15
+ return new Promise((resolve, reject) => {
16
+ const chunks = [];
17
+ req.on('data', (chunk) => { chunks.push(chunk); });
18
+ req.on('end', () => { resolve(Buffer.concat(chunks).toString('utf8')); });
19
+ req.on('error', reject);
20
+ });
21
+ }
22
+ function sendSSE(res, msg) {
23
+ res.write(`event: message\nid: ${randomUUID()}\ndata: ${JSON.stringify(msg)}\n\n`);
24
+ }
25
+ function makeErrorResponse(id, code, message) {
26
+ return JSON.stringify({ jsonrpc: '2.0', error: { code, message }, id });
27
+ }
28
+ // --- Stdio Backend ---
29
+ function createStdioBackend(command, logger) {
30
+ const child = spawn(command, { stdio: ['pipe', 'pipe', 'pipe'], shell: true });
31
+ // stdio: ['pipe','pipe','pipe'] guarantees non-null streams
32
+ if (!child.stdout || !child.stderr || !child.stdin) {
33
+ throw new Error('Failed to create stdio pipes');
34
+ }
35
+ const childStdout = child.stdout;
36
+ const childStderr = child.stderr;
37
+ const childStdin = child.stdin;
38
+ const pendingRequests = new Map();
39
+ let stdoutBuffer = '';
40
+ const backend = {
41
+ onServerMessage: null,
42
+ onClose: null,
43
+ sendRequest(msg) {
44
+ return new Promise((resolve) => {
45
+ const timer = setTimeout(() => {
46
+ pendingRequests.delete(msg.id);
47
+ resolve({ jsonrpc: '2.0', id: msg.id, error: { code: -32000, message: 'Request timeout' } });
48
+ }, REQUEST_TIMEOUT_MS);
49
+ pendingRequests.set(msg.id, { resolve, timer });
50
+ childStdin.write(JSON.stringify(msg) + '\n');
51
+ });
52
+ },
53
+ sendNotification(msg) {
54
+ childStdin.write(JSON.stringify(msg) + '\n');
55
+ },
56
+ close() {
57
+ for (const [, pending] of pendingRequests) {
58
+ clearTimeout(pending.timer);
59
+ }
60
+ pendingRequests.clear();
61
+ child.kill('SIGTERM');
62
+ },
63
+ };
64
+ childStdout.on('data', (chunk) => {
65
+ stdoutBuffer += chunk.toString('utf8');
66
+ const lines = stdoutBuffer.split(/\r?\n/);
67
+ stdoutBuffer = lines.pop() ?? '';
68
+ for (const line of lines) {
69
+ if (!line.trim())
70
+ continue;
71
+ try {
72
+ const parsed = JSON.parse(line);
73
+ if (!isJsonRpcMessage(parsed))
74
+ continue;
75
+ // Route response to pending request, or forward as server-initiated message
76
+ if (hasRequestId(parsed) && pendingRequests.has(parsed.id)) {
77
+ const pending = pendingRequests.get(parsed.id);
78
+ if (pending) {
79
+ pendingRequests.delete(parsed.id);
80
+ clearTimeout(pending.timer);
81
+ pending.resolve(parsed);
82
+ }
83
+ }
84
+ else {
85
+ backend.onServerMessage?.(parsed);
86
+ }
87
+ }
88
+ catch {
89
+ logger('debug', `Non-JSON stdout: ${line.slice(0, 200)}`);
90
+ }
91
+ }
92
+ });
93
+ childStderr.on('data', (chunk) => {
94
+ logger('debug', `stderr: ${chunk.toString('utf8').trimEnd()}`);
95
+ });
96
+ child.on('exit', (code, signal) => {
97
+ logger('info', `subprocess exited (code=${String(code)}, signal=${String(signal)})`);
98
+ for (const [, pending] of pendingRequests) {
99
+ clearTimeout(pending.timer);
100
+ pending.resolve({ jsonrpc: '2.0', error: { code: -32000, message: 'Server process exited' } });
101
+ }
102
+ pendingRequests.clear();
103
+ backend.onClose?.();
104
+ });
105
+ child.on('error', (err) => {
106
+ logger('info', `subprocess error: ${err.message}`);
107
+ });
108
+ return backend;
109
+ }
110
+ // --- Proxy Backend ---
111
+ function createProxyBackend(remoteUrl, headers, oauthClient, logger) {
112
+ let remoteSessionId;
113
+ let accessToken;
114
+ async function forwardToRemote(msg, retryCount = 0) {
115
+ const reqHeaders = {
116
+ 'Content-Type': 'application/json',
117
+ 'Accept': 'application/json, text/event-stream',
118
+ ...headers,
119
+ };
120
+ if (accessToken) {
121
+ reqHeaders['Authorization'] = `Bearer ${accessToken}`;
122
+ }
123
+ if (remoteSessionId) {
124
+ reqHeaders['Mcp-Session-Id'] = remoteSessionId;
125
+ }
126
+ const res = await fetch(remoteUrl, {
127
+ method: 'POST',
128
+ headers: reqHeaders,
129
+ body: JSON.stringify(msg),
130
+ });
131
+ if (res.status === 401 && retryCount < 2) {
132
+ const wwwAuth = res.headers.get('www-authenticate') ?? undefined;
133
+ logger('info', 'Received 401, starting OAuth flow...');
134
+ accessToken = await oauthClient.handleUnauthorized(wwwAuth);
135
+ logger('info', 'OAuth completed, retrying request...');
136
+ return await forwardToRemote(msg, retryCount + 1);
137
+ }
138
+ const sessionHeader = res.headers.get('mcp-session-id');
139
+ if (sessionHeader) {
140
+ remoteSessionId = sessionHeader;
141
+ }
142
+ if (res.status === 202)
143
+ return undefined;
144
+ if (!res.ok) {
145
+ const text = await res.text();
146
+ logger('info', `Remote error: ${String(res.status)} ${text.slice(0, 200)}`);
147
+ return {
148
+ jsonrpc: '2.0',
149
+ id: hasRequestId(msg) ? msg.id : null,
150
+ error: { code: -32000, message: `Remote server error: ${String(res.status)}` },
151
+ };
152
+ }
153
+ return await res.json();
154
+ }
155
+ const backend = {
156
+ onServerMessage: null,
157
+ onClose: null,
158
+ async sendRequest(msg) {
159
+ const response = await forwardToRemote(msg);
160
+ return response ?? { jsonrpc: '2.0', id: msg.id, error: { code: -32000, message: 'No response from remote' } };
161
+ },
162
+ sendNotification(msg) {
163
+ void forwardToRemote(msg);
164
+ },
165
+ close() {
166
+ // Send DELETE to close remote session
167
+ if (remoteSessionId) {
168
+ const reqHeaders = { ...headers, 'Mcp-Session-Id': remoteSessionId };
169
+ if (accessToken)
170
+ reqHeaders['Authorization'] = `Bearer ${accessToken}`;
171
+ void fetch(remoteUrl, { method: 'DELETE', headers: reqHeaders }).catch(() => { });
172
+ }
173
+ },
174
+ };
175
+ return backend;
176
+ }
177
+ // --- Gateway ---
178
+ export function createGateway(options) {
179
+ const logLevel = options.logLevel ?? 'info';
180
+ const { port } = options;
181
+ const sessions = new Map();
182
+ function logger(level, msg) {
183
+ if (logLevel === 'none')
184
+ return;
185
+ if (logLevel === 'info' && level === 'debug')
186
+ return;
187
+ process.stderr.write(`[${new Date().toISOString()}] [${level}] ${msg}\n`);
188
+ }
189
+ // For proxy mode, share a single OAuthClient across all sessions
190
+ const sharedOAuthClient = options.mode === 'proxy'
191
+ ? new OAuthClient({ serverUrl: options.url, headers: options.headers ?? {} })
192
+ : undefined;
193
+ function createBackend() {
194
+ if (options.mode === 'stdio') {
195
+ return createStdioBackend(options.command, logger);
196
+ }
197
+ if (!sharedOAuthClient) {
198
+ throw new Error('OAuthClient not initialized for proxy mode');
199
+ }
200
+ return createProxyBackend(options.url, options.headers ?? {}, sharedOAuthClient, logger);
201
+ }
202
+ function createSession() {
203
+ const id = randomUUID();
204
+ const backend = createBackend();
205
+ const session = {
206
+ id,
207
+ backend,
208
+ sseResponses: new Set(),
209
+ notificationBuffer: [],
210
+ };
211
+ backend.onServerMessage = (msg) => {
212
+ if (session.sseResponses.size > 0) {
213
+ for (const sseRes of session.sseResponses) {
214
+ sendSSE(sseRes, msg);
215
+ }
216
+ }
217
+ else if (session.notificationBuffer.length < MAX_NOTIFICATION_BUFFER) {
218
+ session.notificationBuffer.push(msg);
219
+ }
220
+ };
221
+ backend.onClose = () => {
222
+ for (const sseRes of session.sseResponses) {
223
+ sseRes.end();
224
+ }
225
+ session.sseResponses.clear();
226
+ sessions.delete(id);
227
+ };
228
+ sessions.set(id, session);
229
+ logger('info', `Session ${id.slice(0, 8)} created`);
230
+ return session;
231
+ }
232
+ function destroySession(session) {
233
+ session.backend.close();
234
+ for (const sseRes of session.sseResponses) {
235
+ sseRes.end();
236
+ }
237
+ session.sseResponses.clear();
238
+ sessions.delete(session.id);
239
+ logger('info', `Session ${session.id.slice(0, 8)} destroyed`);
240
+ }
241
+ // --- HTTP handlers ---
242
+ async function handlePost(req, res) {
243
+ const body = await readBody(req);
244
+ let message;
245
+ try {
246
+ message = JSON.parse(body);
247
+ }
248
+ catch {
249
+ res.writeHead(400, { 'Content-Type': 'application/json' });
250
+ res.end(makeErrorResponse(null, -32700, 'Parse error'));
251
+ return;
252
+ }
253
+ if (!isJsonRpcMessage(message)) {
254
+ res.writeHead(400, { 'Content-Type': 'application/json' });
255
+ res.end(makeErrorResponse(null, -32600, 'Invalid Request'));
256
+ return;
257
+ }
258
+ if (message.method === 'initialize') {
259
+ const session = createSession();
260
+ if (hasRequestId(message)) {
261
+ const response = await session.backend.sendRequest(message);
262
+ res.writeHead(200, { 'Content-Type': 'application/json', 'Mcp-Session-Id': session.id });
263
+ res.end(JSON.stringify(response));
264
+ }
265
+ else {
266
+ session.backend.sendNotification(message);
267
+ res.writeHead(202, { 'Mcp-Session-Id': session.id });
268
+ res.end();
269
+ }
270
+ return;
271
+ }
272
+ const sessionId = req.headers['mcp-session-id'];
273
+ if (typeof sessionId !== 'string') {
274
+ res.writeHead(400, { 'Content-Type': 'application/json' });
275
+ res.end(makeErrorResponse(message.id ?? null, -32000, 'Missing Mcp-Session-Id header'));
276
+ return;
277
+ }
278
+ const session = sessions.get(sessionId);
279
+ if (!session) {
280
+ res.writeHead(404, { 'Content-Type': 'application/json' });
281
+ res.end(makeErrorResponse(message.id ?? null, -32000, 'Session not found or expired'));
282
+ return;
283
+ }
284
+ if (hasRequestId(message) && message.method !== undefined) {
285
+ const response = await session.backend.sendRequest(message);
286
+ res.writeHead(200, { 'Content-Type': 'application/json', 'Mcp-Session-Id': sessionId });
287
+ res.end(JSON.stringify(response));
288
+ return;
289
+ }
290
+ session.backend.sendNotification(message);
291
+ res.writeHead(202);
292
+ res.end();
293
+ }
294
+ function handleGet(req, res) {
295
+ const sessionId = req.headers['mcp-session-id'];
296
+ if (typeof sessionId !== 'string') {
297
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
298
+ res.end('Missing Mcp-Session-Id header');
299
+ return;
300
+ }
301
+ const session = sessions.get(sessionId);
302
+ if (!session) {
303
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
304
+ res.end('Session not found');
305
+ return;
306
+ }
307
+ res.writeHead(200, {
308
+ 'Content-Type': 'text/event-stream',
309
+ 'Cache-Control': 'no-cache',
310
+ 'Connection': 'keep-alive',
311
+ 'X-Accel-Buffering': 'no',
312
+ });
313
+ session.sseResponses.add(res);
314
+ for (const msg of session.notificationBuffer) {
315
+ sendSSE(res, msg);
316
+ }
317
+ session.notificationBuffer = [];
318
+ req.on('close', () => { session.sseResponses.delete(res); });
319
+ }
320
+ function handleDelete(req, res) {
321
+ const sessionId = req.headers['mcp-session-id'];
322
+ if (typeof sessionId !== 'string') {
323
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
324
+ res.end('Missing Mcp-Session-Id header');
325
+ return;
326
+ }
327
+ const session = sessions.get(sessionId);
328
+ if (!session) {
329
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
330
+ res.end('Session not found');
331
+ return;
332
+ }
333
+ destroySession(session);
334
+ res.writeHead(200);
335
+ res.end();
336
+ }
337
+ // --- HTTP server ---
338
+ const httpServer = createHttpServer((req, res) => {
339
+ res.setHeader('Access-Control-Allow-Origin', '*');
340
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
341
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept, Mcp-Session-Id, MCP-Protocol-Version, Last-Event-ID');
342
+ res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
343
+ if (req.method === 'OPTIONS') {
344
+ res.writeHead(204);
345
+ res.end();
346
+ return;
347
+ }
348
+ const urlPath = new URL(req.url ?? '/', `http://localhost:${String(port)}`).pathname;
349
+ if (urlPath === '/health' || urlPath === '/healthz') {
350
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
351
+ res.end('ok');
352
+ return;
353
+ }
354
+ if (urlPath !== '/mcp') {
355
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
356
+ res.end('Not Found');
357
+ return;
358
+ }
359
+ const dispatch = async () => {
360
+ switch (req.method) {
361
+ case 'POST':
362
+ await handlePost(req, res);
363
+ break;
364
+ case 'GET':
365
+ handleGet(req, res);
366
+ break;
367
+ case 'DELETE':
368
+ handleDelete(req, res);
369
+ break;
370
+ default:
371
+ res.writeHead(405, { 'Content-Type': 'text/plain' });
372
+ res.end('Method Not Allowed');
373
+ }
374
+ };
375
+ dispatch().catch((err) => {
376
+ const errMsg = err instanceof Error ? err.message : String(err);
377
+ logger('info', `Error: ${req.method ?? '?'} ${urlPath}: ${errMsg}`);
378
+ if (!res.headersSent) {
379
+ res.writeHead(500, { 'Content-Type': 'application/json' });
380
+ res.end(makeErrorResponse(null, -32603, 'Internal error'));
381
+ }
382
+ });
383
+ });
384
+ return {
385
+ start() {
386
+ return new Promise((resolve, reject) => {
387
+ httpServer.once('error', reject);
388
+ httpServer.listen(port, '127.0.0.1', () => {
389
+ httpServer.removeListener('error', reject);
390
+ logger('info', `Gateway listening on http://127.0.0.1:${String(port)}/mcp`);
391
+ resolve();
392
+ });
393
+ });
394
+ },
395
+ stop() {
396
+ return new Promise((resolve) => {
397
+ for (const session of sessions.values()) {
398
+ destroySession(session);
399
+ }
400
+ httpServer.close(() => { resolve(); });
401
+ });
402
+ },
403
+ };
404
+ }
405
+ //# sourceMappingURL=gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/gateway.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  export type * from './types.js';
2
2
  export * from './config.js';
3
+ export * from './gateway.js';
4
+ export * from './oauth.js';
3
5
  export * from './pm2.js';
4
- export * from './supergateway.js';
6
+ export * from './command.js';
5
7
  export * from './sync.js';
6
8
  export * from './validation.js';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,YAAY,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  export * from './config.js';
2
+ export * from './gateway.js';
3
+ export * from './oauth.js';
2
4
  export * from './pm2.js';
3
- export * from './supergateway.js';
5
+ export * from './command.js';
4
6
  export * from './sync.js';
5
7
  export * from './validation.js';
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface OAuthTokens {
2
+ access_token: string;
3
+ token_type: string;
4
+ expires_in?: number;
5
+ refresh_token?: string;
6
+ scope?: string;
7
+ }
8
+ export interface OAuthClientOptions {
9
+ serverUrl: string;
10
+ headers?: Record<string, string>;
11
+ authTimeout?: number;
12
+ }
13
+ export declare class OAuthClient {
14
+ private readonly hash;
15
+ private readonly serverUrl;
16
+ private readonly headers;
17
+ private readonly authTimeout;
18
+ private stored;
19
+ private authServerUrl;
20
+ private authServerMetadata;
21
+ /** Deduplicates concurrent handleUnauthorized() calls into a single auth flow. */
22
+ private pendingAuth;
23
+ constructor(options: OAuthClientOptions);
24
+ /**
25
+ * Get a valid access token, loading from disk cache if available.
26
+ */
27
+ getAccessToken(): Promise<string | undefined>;
28
+ /**
29
+ * Handle a 401 response from the remote server.
30
+ * Deduplicates concurrent calls — only one auth flow runs at a time;
31
+ * subsequent callers wait for the same result.
32
+ */
33
+ handleUnauthorized(wwwAuthenticate?: string): Promise<string>;
34
+ private executeAuthFlow;
35
+ private discover;
36
+ }
37
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/oauth.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8BD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+QD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,kBAAkB,CAAiC;IAC3D,kFAAkF;IAClF,OAAO,CAAC,WAAW,CAAgC;gBAEvC,OAAO,EAAE,kBAAkB;IAOvC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKnD;;;;OAIG;IACG,kBAAkB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAarD,eAAe;YAqFf,QAAQ;CAQvB"}