@adriangalilea/utils 0.13.0 → 0.15.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.
package/dist/bot/llm.js CHANGED
@@ -8,10 +8,21 @@
8
8
  * `AsyncGenerator` of `{type, text}` with
9
9
  * `content` / `reasoning` separation.
10
10
  *
11
- * `ctx.startStream()` — OUTPUT. Debounced `editMessageText` to
12
- * Telegram, local Markdown parse via
13
- * `@gramio/format`, 4000-char split on
14
- * paragraph / line / word boundary.
11
+ * `ctx.startStream()` — OUTPUT (low-level). Debounced
12
+ * `editMessageText` to Telegram, local
13
+ * Markdown parse via `@gramio/format`,
14
+ * 4000-char split on paragraph / line /
15
+ * word boundary.
16
+ *
17
+ * `ctx.startChatStream()` — OUTPUT (high-level). Consumes a fetch
18
+ * `Response` (or any `AsyncIterable<LLMChunk>`)
19
+ * and renders BOTH phases of a thinking
20
+ * model: `reasoning` chunks go into one
21
+ * `<blockquote expandable>` message;
22
+ * `content` chunks go into a streamed
23
+ * markdown message below it. Returns
24
+ * `{ content, reasoning }` once the
25
+ * source generator ends.
15
26
  *
16
27
  * `ctx.llm.add / .get / …` — HISTORY. Per-(user, thread) conversation
17
28
  * buffer in OpenAI `ChatMessage` shape.
@@ -30,12 +41,10 @@
30
41
  *
31
42
  * Peer deps: `gramio`, `@gramio/session`, `@gramio/format`, `marked`.
32
43
  *
33
- * @example
44
+ * @example high-level — thinking model in ~10 LOC
34
45
  * import { Bot } from 'gramio'
35
46
  * import { session } from '@gramio/session'
36
- * import {
37
- * llmStream, llmHistory, streamChat,
38
- * } from '@adriangalilea/utils/bot/llm'
47
+ * import { llmStream, llmHistory } from '@adriangalilea/utils/bot/llm'
39
48
  *
40
49
  * const userSession = session({ storage, key: 'session', initial: () => ({}) })
41
50
  * const chat = llmHistory({ session: userSession, maxTurns: 20, retentionDays: 7 })
@@ -46,33 +55,33 @@
46
55
  * .extend(chat.plugin)
47
56
  * .on('message', async (ctx) => {
48
57
  * ctx.llm.add({ role: 'user', content: ctx.text ?? '' })
49
- * const messages = ctx.llm.get()
50
- *
51
58
  * const response = await fetch(process.env.LLM_URL!, {
52
59
  * method: 'POST',
53
60
  * headers: { 'Content-Type': 'application/json' },
54
61
  * body: JSON.stringify({
55
62
  * model: process.env.LLM_MODEL,
56
- * messages: [{ role: 'system', content: 'You are helpful.' }, ...messages],
63
+ * messages: [{ role: 'system', content: 'You are helpful.' }, ...ctx.llm.get()],
57
64
  * stream: true,
58
65
  * }),
59
66
  * })
60
- *
61
- * const stream = ctx.startStream()
62
- * let assistant = ''
63
- * for await (const chunk of streamChat(response)) {
64
- * if (chunk.type === 'content') {
65
- * assistant += chunk.text
66
- * await stream.append(chunk.text)
67
- * }
68
- * }
69
- * await stream.end()
70
- * ctx.llm.add({ role: 'assistant', content: assistant })
67
+ * const { content } = await ctx.startChatStream(response)
68
+ * ctx.llm.add({ role: 'assistant', content })
71
69
  * })
72
70
  *
73
71
  * bot.start()
72
+ *
73
+ * @example low-level — manual loop when you need to map/filter chunks
74
+ * import { streamChat } from '@adriangalilea/utils/bot/llm'
75
+ *
76
+ * const stream = ctx.startStream()
77
+ * for await (const chunk of streamChat(response)) {
78
+ * if (chunk.type === 'content') await stream.append(chunk.text)
79
+ * // reasoning chunks dropped here
80
+ * }
81
+ * await stream.end()
74
82
  */
75
83
  import { Plugin } from 'gramio';
84
+ import { expandableBlockquote } from '@gramio/format';
76
85
  import { markdownToFormattable } from '@gramio/format/markdown';
77
86
  /**
78
87
  * Parse an OpenAI-compatible chat-completions SSE response into a
@@ -152,6 +161,18 @@ export class MarkdownStreamer {
152
161
  inFlight = false;
153
162
  dirty = false;
154
163
  ended = false;
164
+ /**
165
+ * `true` after `.end()` returns if the stream finished with un-flushed
166
+ * buffer or an outstanding error that the streamer couldn't recover
167
+ * from. Useful for partial-response diagnostics in catch blocks:
168
+ *
169
+ * try { for await (...) await stream.append(...) }
170
+ * finally {
171
+ * await stream.end()
172
+ * if (stream.wasPartial) logger.warn('LLM stream cut off')
173
+ * }
174
+ */
175
+ wasPartial = false;
155
176
  chatId;
156
177
  threadId;
157
178
  // Match gramio's `bot.api` shape structurally. `text` accepts string or any
@@ -229,8 +250,14 @@ export class MarkdownStreamer {
229
250
  }
230
251
  while (this.inFlight)
231
252
  await sleep(50);
232
- if (this.dirty)
253
+ if (this.dirty) {
233
254
  await this.flushNow();
255
+ // If `dirty` is still set after the final flush, an edit error
256
+ // re-armed it and there's nothing more we'll do. Mark partial
257
+ // so the caller can log / fall back.
258
+ if (this.dirty)
259
+ this.wasPartial = true;
260
+ }
234
261
  }
235
262
  scheduleFlush() {
236
263
  if (this.debounceTimer)
@@ -297,6 +324,13 @@ export const llmStream = (defaults = {}) => new Plugin('@adriangalilea/utils/bot
297
324
  // gramio's `message` scope guarantees `ctx.chat`. `ctx.bot.api` is on
298
325
  // every Context. Structural compat → no cast needed.
299
326
  startStream: (opts = {}) => new MarkdownStreamer(ctx, { ...defaults, ...opts }),
327
+ /**
328
+ * One-call helper for chat completions: consumes a `Response`
329
+ * (or any `AsyncIterable<LLMChunk>`), renders reasoning to an
330
+ * expandable blockquote message + content to a streamed markdown
331
+ * message, returns `{ content, reasoning }` when the stream ends.
332
+ */
333
+ startChatStream: (source, opts = {}) => consumeChatStream(ctx, source, { ...defaults, ...opts }),
300
334
  }));
301
335
  function findSplit(text, maxLen) {
302
336
  // Prefer paragraph break, then line, then space. Reject splits in the
@@ -309,6 +343,144 @@ function findSplit(text, maxLen) {
309
343
  return maxLen;
310
344
  }
311
345
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
346
+ /**
347
+ * One-shot helper that consumes an LLM stream and renders BOTH phases
348
+ * (reasoning, content) to Telegram with the canonical pattern:
349
+ *
350
+ * - reasoning chunks → one message containing a single
351
+ * `<blockquote expandable>…</blockquote>` (HTML), debounced edits,
352
+ * stays expanded after the stream ends so the user can review it
353
+ * collapsed/uncollapsed at will
354
+ * - content chunks → a fresh `MarkdownStreamer` message below the
355
+ * reasoning one (auto-threaded via SendMixin)
356
+ *
357
+ * Returns when the source generator ends. Equivalent to (and replaces)
358
+ * the ~50 LOC of bookkeeping every thinking-model bot would otherwise
359
+ * write by hand around `streamChat` + `ctx.startStream`.
360
+ *
361
+ * Accepts either a raw `fetch` `Response` (wrapped with `streamChat`
362
+ * internally) or an `AsyncIterable<LLMChunk>` (when you want to map /
363
+ * filter chunks before the stream hits Telegram).
364
+ *
365
+ * @example via ctx.startChatStream from the llmStream plugin
366
+ * const response = await fetch(LLM_URL, { method: 'POST', body })
367
+ * const { content } = await ctx.startChatStream(response)
368
+ * ctx.llm.add({ role: 'assistant', content })
369
+ *
370
+ * @example standalone, framework-agnostic
371
+ * const { content, reasoning } = await consumeChatStream(ctx, response)
372
+ */
373
+ export const consumeChatStream = async (ctx, source, opts = {}) => {
374
+ const chatId = ctx.chat.id;
375
+ const threadId = ctx.threadId;
376
+ const bot = ctx.bot;
377
+ const debounceMs = opts.debounceMs ?? DEFAULT_DEBOUNCE_MS;
378
+ const gen = source instanceof Response ? streamChat(source) : source;
379
+ // ─── reasoning state ────────────────────────────────────────────
380
+ let reasoning = '';
381
+ let reasoningMessageId;
382
+ let reasoningTimer;
383
+ let reasoningDirty = false;
384
+ let reasoningInFlight = false;
385
+ // Same graceful-degradation pipeline as the content phase:
386
+ // markdownToFormattable parses the reasoning (lists, code blocks,
387
+ // bold — thinking models do emit markdown) into a FormattableString
388
+ // with native Telegram entities, and `expandableBlockquote` wraps
389
+ // the whole thing in a collapsed-by-default block quotation by
390
+ // adding the `expandable_blockquote` entity over the full text.
391
+ // Malformed mid-stream markdown degrades to plain text inside the
392
+ // blockquote instead of failing the message.
393
+ const renderReasoning = () => expandableBlockquote(markdownToFormattable(reasoning));
394
+ const sendReasoningMessage = async () => {
395
+ const params = {
396
+ chat_id: chatId,
397
+ ...(threadId !== undefined && { message_thread_id: threadId }),
398
+ text: renderReasoning(),
399
+ };
400
+ const sent = await bot.api.sendMessage(params);
401
+ reasoningMessageId = sent.message_id;
402
+ };
403
+ const flushReasoning = async () => {
404
+ if (!reasoningDirty || reasoningMessageId === undefined)
405
+ return;
406
+ reasoningInFlight = true;
407
+ reasoningDirty = false;
408
+ try {
409
+ await bot.api.editMessageText({
410
+ chat_id: chatId,
411
+ message_id: reasoningMessageId,
412
+ text: renderReasoning(),
413
+ });
414
+ }
415
+ catch (e) {
416
+ const msg = String(e?.message ?? e);
417
+ // "message is not modified" is benign when reasoning chunks
418
+ // arrive faster than the debounce can render.
419
+ if (!msg.includes('message is not modified')) {
420
+ reasoningDirty = true;
421
+ opts.onError?.(e);
422
+ }
423
+ }
424
+ finally {
425
+ reasoningInFlight = false;
426
+ }
427
+ };
428
+ const scheduleReasoningFlush = () => {
429
+ if (reasoningTimer)
430
+ return;
431
+ reasoningTimer = setTimeout(async () => {
432
+ reasoningTimer = undefined;
433
+ if (reasoningInFlight) {
434
+ scheduleReasoningFlush();
435
+ return;
436
+ }
437
+ await flushReasoning();
438
+ if (reasoningDirty)
439
+ scheduleReasoningFlush();
440
+ }, debounceMs);
441
+ };
442
+ // ─── content state ──────────────────────────────────────────────
443
+ let contentStreamer;
444
+ let content = '';
445
+ // ─── main loop ──────────────────────────────────────────────────
446
+ for await (const chunk of gen) {
447
+ if (chunk.type === 'reasoning') {
448
+ reasoning += chunk.text;
449
+ if (reasoningMessageId === undefined) {
450
+ await sendReasoningMessage();
451
+ }
452
+ else {
453
+ reasoningDirty = true;
454
+ scheduleReasoningFlush();
455
+ }
456
+ }
457
+ else if (chunk.type === 'content') {
458
+ if (!contentStreamer) {
459
+ // Close out reasoning cleanly before content starts: flush any
460
+ // pending edit, drop the debounce. The blockquote stays in
461
+ // the chat as a finished message.
462
+ if (reasoningTimer) {
463
+ clearTimeout(reasoningTimer);
464
+ reasoningTimer = undefined;
465
+ }
466
+ if (reasoningDirty)
467
+ await flushReasoning();
468
+ contentStreamer = new MarkdownStreamer({ chat: { id: chatId }, threadId, bot }, opts);
469
+ }
470
+ content += chunk.text;
471
+ await contentStreamer.append(chunk.text);
472
+ }
473
+ }
474
+ // Trailing reasoning (model emitted reasoning but no content yet).
475
+ if (reasoningTimer) {
476
+ clearTimeout(reasoningTimer);
477
+ reasoningTimer = undefined;
478
+ }
479
+ if (reasoningDirty)
480
+ await flushReasoning();
481
+ await contentStreamer?.end();
482
+ return { content, reasoning };
483
+ };
312
484
  const GENERAL_THREAD = 'general';
313
485
  const threadKey = (ctx) => {
314
486
  // Message events: ctx.threadId. Callback events: ctx.message.threadId.
@@ -355,7 +527,31 @@ export const llmHistory = (opts) => {
355
527
  maxTurns: opts.maxTurns,
356
528
  retentionDays: opts.retentionDays,
357
529
  });
358
- return { plugin };
530
+ const itemLabel = opts.menuLabels?.item ?? {
531
+ en: '🧹 Clear this thread',
532
+ es: '🧹 Limpiar este hilo',
533
+ };
534
+ const clearedToast = opts.menuLabels?.cleared ?? {
535
+ en: '🧹 Cleared.',
536
+ es: '🧹 Limpio.',
537
+ };
538
+ const menuItem = {
539
+ id: 'llmClear',
540
+ label: itemLabel,
541
+ // Destructive action → red. Consistent with `botMenu`'s 🗑 Forget.
542
+ style: 'danger',
543
+ action: (ctx) => {
544
+ // The `llm` decoration comes from llmHistory's own plugin — not
545
+ // on MenuCtx's static shape, so we narrow here. Return the
546
+ // polyglot toast: the menu plugin owns the single
547
+ // answerCallbackQuery for this tap (calling ctx.answer here
548
+ // would be a double-answer → rejected → action throws).
549
+ const c = ctx;
550
+ c.llm?.clear();
551
+ return clearedToast;
552
+ },
553
+ };
554
+ return { plugin, menuItem };
359
555
  };
360
556
  const buildHistoryPlugin = (args) => {
361
557
  const { sessionPlugin, maxTurns, retentionDays } = args;
@@ -1 +1 @@
1
- {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/bot/llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/bot/llm.ts"],"names":[],"mappings":"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"}
@@ -72,7 +72,21 @@
72
72
  import { Plugin } from 'gramio';
73
73
  import type { Storage } from '@gramio/storage';
74
74
  import { type Polyglot } from '../say/index.js';
75
- type MenuCtx = {
75
+ /**
76
+ * Shape of the `ctx` an action / label / predicate sees.
77
+ *
78
+ * - Static fields (`bot`, `from`, `chat`, `session`, `threadId`,
79
+ * `message`) come from gramio's `CallbackQueryContext`.
80
+ * - Common reply methods (`send`, `reply`, `answer`, `editText`) are
81
+ * declared as optional so action callbacks can call them without
82
+ * `as unknown as` casts. They exist at runtime on every callback ctx
83
+ * gramio dispatches.
84
+ * - Plugin-decorated fields (`ctx.llm`, `ctx.say`, `ctx.lang`, …)
85
+ * live on the real gramio ctx but aren't declared here — narrow
86
+ * them via a local type assertion where you use them. The menu
87
+ * stays plugin-agnostic.
88
+ */
89
+ export type MenuCtx = {
76
90
  bot: unknown;
77
91
  from?: {
78
92
  id: number;
@@ -84,6 +98,20 @@ type MenuCtx = {
84
98
  session?: {
85
99
  language?: string;
86
100
  };
101
+ threadId?: number;
102
+ message?: {
103
+ threadId?: number;
104
+ };
105
+ send?: (text: string | {
106
+ toString(): string;
107
+ }, params?: object) => Promise<unknown>;
108
+ reply?: (text: string | {
109
+ toString(): string;
110
+ }, params?: object) => Promise<unknown>;
111
+ answer?: (params: object) => Promise<unknown>;
112
+ editText?: (text: string | {
113
+ toString(): string;
114
+ }, params?: object) => Promise<unknown>;
87
115
  };
88
116
  /**
89
117
  * Anything a button or header can render as. Authoring a polyglot
@@ -97,25 +125,77 @@ type MenuCtx = {
97
125
  */
98
126
  type Label = string | Polyglot<string> | ((ctx: MenuCtx) => string | Polyglot<string>);
99
127
  type Predicate = (ctx: MenuCtx) => boolean;
100
- type Action = (ctx: MenuCtx) => Promise<void> | void;
128
+ /**
129
+ * What a menu action's return value means:
130
+ *
131
+ * - `undefined` / `void` — menu sends an empty `answerCallbackQuery`
132
+ * (just clears the loading spinner).
133
+ * - `string` — menu sends `answerCallbackQuery({ text })`. The string
134
+ * pops as a toast on top of the chat.
135
+ * - `Polyglot<string>` — menu resolves at `ctx.session?.language` and
136
+ * sends as toast.
137
+ *
138
+ * DO NOT call `ctx.answer(...)` from inside an action — Telegram
139
+ * rejects the second answer ("query is too old"), the action throws,
140
+ * and `refresh: true` never runs. Return the toast instead; the menu
141
+ * sends the single answer.
142
+ */
143
+ type ActionResult = void | string | Polyglot<string>;
144
+ type Action = (ctx: MenuCtx) => Promise<ActionResult> | ActionResult;
145
+ /**
146
+ * Telegram's inline-keyboard-button colour modes
147
+ * ([Bot API InlineKeyboardButton.style](https://core.telegram.org/bots/api#inlinekeyboardbutton)):
148
+ *
149
+ * - `primary` — blue, "selected / active / default action"
150
+ * - `success` — green, "positive / approve / confirm"
151
+ * - `danger` — red, "destructive / reject / forget"
152
+ *
153
+ * On clients that don't render the style (older Telegram releases),
154
+ * the button falls back to the app-default look — no breakage. Use
155
+ * `style` instead of emoji markers (●/○) to mark active state, which
156
+ * is consistent with how Telegram itself surfaces selection state.
157
+ */
158
+ export type ButtonStyle = 'primary' | 'success' | 'danger';
159
+ type StyleResolver = ButtonStyle | ((ctx: MenuCtx) => ButtonStyle | undefined);
160
+ /**
161
+ * An entry in the menu. Three variants:
162
+ *
163
+ * - `action` — callback button; taps run `action(ctx)`. If
164
+ * `refresh: true`, the current menu message
165
+ * re-renders right after — useful for selections /
166
+ * toggles whose visible state depends on what the
167
+ * action mutated (typical: `style` based on session).
168
+ * - `url` — link button (Telegram opens it externally).
169
+ * - `submenu` — nested item tree, navigated to via callback.
170
+ *
171
+ * `style` (`primary` / `success` / `danger`) maps to Telegram's
172
+ * coloured inline-button modes; the resolver form `(ctx) => style`
173
+ * is for state-dependent colouring (e.g. blue on the currently-selected
174
+ * language).
175
+ */
101
176
  export type MenuItem = {
102
177
  id: string;
103
178
  label: Label;
104
179
  action: Action;
105
180
  order?: number;
106
181
  visible?: Predicate;
182
+ style?: StyleResolver;
183
+ /** Re-render the menu message after the action runs. */
184
+ refresh?: boolean;
107
185
  } | {
108
186
  id: string;
109
187
  label: Label;
110
188
  url: string;
111
189
  order?: number;
112
190
  visible?: Predicate;
191
+ style?: StyleResolver;
113
192
  } | {
114
193
  id: string;
115
194
  label: Label;
116
195
  submenu: MenuItem[];
117
196
  order?: number;
118
197
  visible?: Predicate;
198
+ style?: StyleResolver;
119
199
  };
120
200
  export type PersonalDataOptions = {
121
201
  /**
@@ -188,5 +268,67 @@ export declare class BotMenu {
188
268
  get plugin(): Plugin<{}, import("gramio").DeriveDefinitions, {}>;
189
269
  }
190
270
  export declare const botMenu: (opts: BotMenuOptions) => BotMenu;
271
+ export type ToggleMenuItemOptions = {
272
+ /** Item id within the menu. Must be unique among siblings. */
273
+ id: string;
274
+ /**
275
+ * Reads the current boolean value. Typically `(ctx) =>
276
+ * ctx.session?.someField ?? false`. Storage-agnostic — return
277
+ * `false` by default so the toggle starts in the OFF state.
278
+ */
279
+ read: (ctx: MenuCtx) => boolean;
280
+ /**
281
+ * Persists the new value. Typically `(ctx, v) => {
282
+ * (ctx.session as any).someField = v }`. The menu plugin does NOT
283
+ * own a session — write through whatever your bot already uses.
284
+ */
285
+ write: (ctx: MenuCtx, value: boolean) => void | Promise<void>;
286
+ /**
287
+ * Button labels for each state. Polyglot literals resolve against
288
+ * `ctx.session?.language` (set by `bot/language`); strings render
289
+ * as-is. Use functions for runtime composition (e.g. emoji ✓/✗ +
290
+ * dynamic name).
291
+ */
292
+ label: {
293
+ off: Label;
294
+ on: Label;
295
+ };
296
+ /**
297
+ * Optional toast shown via `ctx.answer({ text })` after a tap. Same
298
+ * polyglot resolution as `label`. Omit to stay silent.
299
+ */
300
+ toast?: {
301
+ off?: Label;
302
+ on?: Label;
303
+ };
304
+ order?: number;
305
+ visible?: Predicate;
306
+ };
307
+ /**
308
+ * Convenience factory for a boolean-toggle `MenuItem`. The label
309
+ * tracks `read(ctx)` and the action flips it through `write(ctx, v)`.
310
+ * Storage is the caller's concern — pass closures that read/write the
311
+ * field wherever you keep it (typically `ctx.session.something`).
312
+ *
313
+ * The current menu message is NOT auto-re-rendered after a tap — the
314
+ * new label is visible the next time the user re-opens or navigates.
315
+ * The optional `toast` gives immediate feedback in the meantime.
316
+ *
317
+ * @example
318
+ * toggleMenuItem({
319
+ * id: 'thinking',
320
+ * read: (ctx) => (ctx.session as { thinking?: boolean }).thinking ?? false,
321
+ * write: (ctx, v) => { (ctx.session as { thinking?: boolean }).thinking = v },
322
+ * label: {
323
+ * off: { en: '💭 Thinking: OFF', es: '💭 Razonamiento: OFF' },
324
+ * on: { en: '💭 Thinking: ON', es: '💭 Razonamiento: ON' },
325
+ * },
326
+ * toast: {
327
+ * off: { en: 'Thinking off.', es: 'Razonamiento off.' },
328
+ * on: { en: 'Thinking on.', es: 'Razonamiento on.' },
329
+ * },
330
+ * })
331
+ */
332
+ export declare const toggleMenuItem: (opts: ToggleMenuItemOptions) => MenuItem;
191
333
  export {};
192
334
  //# sourceMappingURL=menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/bot/menu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/bot/menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH,OAAO,EAGL,MAAM,EACP,MAAM,QAAQ,CAAA;AACf,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAIpD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,EAAE,OAAO,CAAA;IACZ,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACrB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACnF,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACpF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACxF,CAAA;AAED;;;;;;;;;GASG;AACH,KAAK,KAAK,GACN,MAAM,GACN,QAAQ,CAAC,MAAM,CAAC,GAChB,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AACjD,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;AAE1C;;;;;;;;;;;;;;GAcG;AACH,KAAK,YAAY,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;AACpD,KAAK,MAAM,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;AAEpE;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE1D,KAAK,aAAa,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC,CAAA;AAc9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,QAAQ,GAChB;IACE,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,GACD;IACE,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB,GACD;IACE,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAA;IACZ,OAAO,EAAE,QAAQ,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB,CAAA;AAEL,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sEAAsE;IACtE,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAA;IACd;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAA;CACnC,CAAA;AAkBD,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;CACvC,CAAA;AAED,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,KAAK,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAA;CAC1C,CAAA;AAED,qBAAa,OAAO;IAClB,gBAAgB;IAChB,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;IAC3B,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;gBAEhB,IAAI,EAAE,cAAc;IAiBhC,8CAA8C;IAC9C,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAKzB,8EAA8E;IAC9E,IAAI,MAAM,uDAET;CACF;AAED,eAAO,MAAM,OAAO,GAAI,MAAM,cAAc,KAAG,OAA4B,CAAA;AAI3E,MAAM,MAAM,qBAAqB,GAAG;IAClC,8DAA8D;IAC9D,EAAE,EAAE,MAAM,CAAA;IACV;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;IAC/B;;;;OAIG;IACH,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7D;;;;;OAKG;IACH,KAAK,EAAE;QACL,GAAG,EAAE,KAAK,CAAA;QACV,EAAE,EAAE,KAAK,CAAA;KACV,CAAA;IACD;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,GAAG,CAAC,EAAE,KAAK,CAAA;QACX,EAAE,CAAC,EAAE,KAAK,CAAA;KACX,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,qBAAqB,KAAG,QA0B3D,CAAA"}