@qodalis/cli-todo 2.0.0-beta.9 → 2.0.0-rc.2
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/package.json +2 -2
- package/public-api.d.mts +9 -5
- package/public-api.d.ts +9 -5
- package/public-api.js +86 -62
- package/public-api.js.map +1 -1
- package/public-api.mjs +87 -63
- package/public-api.mjs.map +1 -1
- package/umd/index.global.js +301 -131
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qodalis/cli-todo",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-rc.2",
|
|
4
4
|
"description": "@qodalis/cli extension for managing TODO tasks with add, list, complete, and remove commands.",
|
|
5
5
|
"author": "Nicolae Lupei, Qodalis Solutions",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"umd": "./umd/index.global.js",
|
|
21
21
|
"unpkg": "./umd/index.global.js",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@qodalis/cli-core": "2.0.0-
|
|
23
|
+
"@qodalis/cli-core": "2.0.0-rc.2"
|
|
24
24
|
},
|
|
25
25
|
"sideEffects": false,
|
|
26
26
|
"main": "./public-api.js",
|
package/public-api.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _qodalis_cli_core from '@qodalis/cli-core';
|
|
2
1
|
import { ICliCommandProcessor, CliProcessorMetadata, ICliConfigurationOption, CliStateConfiguration, CliProcessCommand, ICliExecutionContext, ICliCompletionProvider, ICliCompletionContext, ICliModule } from '@qodalis/cli-core';
|
|
3
2
|
|
|
4
3
|
type TodoItem = {
|
|
@@ -18,14 +17,13 @@ declare function lineThroughText(text: string): string;
|
|
|
18
17
|
declare class CliTodoCommandProcessor implements ICliCommandProcessor {
|
|
19
18
|
command: string;
|
|
20
19
|
description: string;
|
|
21
|
-
author:
|
|
20
|
+
author: any;
|
|
22
21
|
version: string;
|
|
23
22
|
processors?: ICliCommandProcessor[];
|
|
24
23
|
metadata?: CliProcessorMetadata;
|
|
25
24
|
configurationOptions?: ICliConfigurationOption[];
|
|
26
25
|
stateConfiguration?: CliStateConfiguration;
|
|
27
26
|
private todos;
|
|
28
|
-
private nextId;
|
|
29
27
|
getTodos(): TodoItem[];
|
|
30
28
|
constructor();
|
|
31
29
|
processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
|
|
@@ -34,7 +32,12 @@ declare class CliTodoCommandProcessor implements ICliCommandProcessor {
|
|
|
34
32
|
private formatTodoLine;
|
|
35
33
|
private registerSubProcessors;
|
|
36
34
|
private loadFromOldStorage;
|
|
37
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Change the list and save it, atomically: `change` gets the latest saved
|
|
37
|
+
* list (another tab may have changed it) to edit in place, or returns a
|
|
38
|
+
* new one.
|
|
39
|
+
*/
|
|
40
|
+
private changeTodos;
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
declare class CliTodoIdCompletionProvider implements ICliCompletionProvider {
|
|
@@ -46,4 +49,5 @@ declare class CliTodoIdCompletionProvider implements ICliCompletionProvider {
|
|
|
46
49
|
|
|
47
50
|
declare const todoModule: ICliModule;
|
|
48
51
|
|
|
49
|
-
export { CliTodoCommandProcessor, CliTodoIdCompletionProvider,
|
|
52
|
+
export { CliTodoCommandProcessor, CliTodoIdCompletionProvider, formatRelativeDate, isOverdue, lineThroughText, migrateTodoItem, parseDueDate, todoModule };
|
|
53
|
+
export type { TodoItem };
|
package/public-api.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as _qodalis_cli_core from '@qodalis/cli-core';
|
|
2
1
|
import { ICliCommandProcessor, CliProcessorMetadata, ICliConfigurationOption, CliStateConfiguration, CliProcessCommand, ICliExecutionContext, ICliCompletionProvider, ICliCompletionContext, ICliModule } from '@qodalis/cli-core';
|
|
3
2
|
|
|
4
3
|
type TodoItem = {
|
|
@@ -18,14 +17,13 @@ declare function lineThroughText(text: string): string;
|
|
|
18
17
|
declare class CliTodoCommandProcessor implements ICliCommandProcessor {
|
|
19
18
|
command: string;
|
|
20
19
|
description: string;
|
|
21
|
-
author:
|
|
20
|
+
author: any;
|
|
22
21
|
version: string;
|
|
23
22
|
processors?: ICliCommandProcessor[];
|
|
24
23
|
metadata?: CliProcessorMetadata;
|
|
25
24
|
configurationOptions?: ICliConfigurationOption[];
|
|
26
25
|
stateConfiguration?: CliStateConfiguration;
|
|
27
26
|
private todos;
|
|
28
|
-
private nextId;
|
|
29
27
|
getTodos(): TodoItem[];
|
|
30
28
|
constructor();
|
|
31
29
|
processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
|
|
@@ -34,7 +32,12 @@ declare class CliTodoCommandProcessor implements ICliCommandProcessor {
|
|
|
34
32
|
private formatTodoLine;
|
|
35
33
|
private registerSubProcessors;
|
|
36
34
|
private loadFromOldStorage;
|
|
37
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Change the list and save it, atomically: `change` gets the latest saved
|
|
37
|
+
* list (another tab may have changed it) to edit in place, or returns a
|
|
38
|
+
* new one.
|
|
39
|
+
*/
|
|
40
|
+
private changeTodos;
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
declare class CliTodoIdCompletionProvider implements ICliCompletionProvider {
|
|
@@ -46,4 +49,5 @@ declare class CliTodoIdCompletionProvider implements ICliCompletionProvider {
|
|
|
46
49
|
|
|
47
50
|
declare const todoModule: ICliModule;
|
|
48
51
|
|
|
49
|
-
export { CliTodoCommandProcessor, CliTodoIdCompletionProvider,
|
|
52
|
+
export { CliTodoCommandProcessor, CliTodoIdCompletionProvider, formatRelativeDate, isOverdue, lineThroughText, migrateTodoItem, parseDueDate, todoModule };
|
|
53
|
+
export type { TodoItem };
|
package/public-api.js
CHANGED
|
@@ -89,7 +89,7 @@ function lineThroughText(text) {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// src/lib/version.ts
|
|
92
|
-
var LIBRARY_VERSION = "2.0.0-
|
|
92
|
+
var LIBRARY_VERSION = "2.0.0-rc.2";
|
|
93
93
|
var API_VERSION = 2;
|
|
94
94
|
|
|
95
95
|
// src/lib/processors/cli-todo-command-processor.ts
|
|
@@ -127,7 +127,6 @@ var CliTodoCommandProcessor = class {
|
|
|
127
127
|
}
|
|
128
128
|
};
|
|
129
129
|
this.todos = [];
|
|
130
|
-
this.nextId = 1;
|
|
131
130
|
this.registerSubProcessors();
|
|
132
131
|
}
|
|
133
132
|
getTodos() {
|
|
@@ -137,26 +136,26 @@ var CliTodoCommandProcessor = class {
|
|
|
137
136
|
context.executor.showHelp(command, context);
|
|
138
137
|
}
|
|
139
138
|
writeDescription(context) {
|
|
140
|
-
const { writer } = context;
|
|
141
|
-
writer.writeln(this.description);
|
|
139
|
+
const { writer, translator: t } = context;
|
|
140
|
+
writer.writeln(t.t("cli.todo.description", this.description));
|
|
142
141
|
writer.writeln();
|
|
143
|
-
writer.writeln(writer.wrapInColor("Commands:", cliCore.CliForegroundColor.Yellow));
|
|
144
|
-
writer.writeln(` ${writer.wrapInColor("todo ls", cliCore.CliForegroundColor.Cyan)} List all tasks`);
|
|
145
|
-
writer.writeln(` ${writer.wrapInColor("todo ls --pending", cliCore.CliForegroundColor.Cyan)} List pending tasks only`);
|
|
146
|
-
writer.writeln(` ${writer.wrapInColor("todo ls --completed", cliCore.CliForegroundColor.Cyan)} List completed tasks only`);
|
|
147
|
-
writer.writeln(` ${writer.wrapInColor("todo ls --overdue", cliCore.CliForegroundColor.Cyan)} List overdue tasks only`);
|
|
148
|
-
writer.writeln(` ${writer.wrapInColor("todo add <text>", cliCore.CliForegroundColor.Cyan)} Add a new task`);
|
|
149
|
-
writer.writeln(` ${writer.wrapInColor("todo add <text> --due <date>", cliCore.CliForegroundColor.Cyan)} Add with due date`);
|
|
150
|
-
writer.writeln(` ${writer.wrapInColor("todo edit <id> <new text>", cliCore.CliForegroundColor.Cyan)} Edit a task`);
|
|
151
|
-
writer.writeln(` ${writer.wrapInColor("todo done <id>", cliCore.CliForegroundColor.Cyan)} Mark a task as done`);
|
|
152
|
-
writer.writeln(` ${writer.wrapInColor("todo toggle <id>", cliCore.CliForegroundColor.Cyan)} Toggle done/undone`);
|
|
153
|
-
writer.writeln(` ${writer.wrapInColor("todo rm <id>", cliCore.CliForegroundColor.Cyan)} Remove a task`);
|
|
154
|
-
writer.writeln(` ${writer.wrapInColor("todo rm --all", cliCore.CliForegroundColor.Cyan)} Remove all tasks`);
|
|
142
|
+
writer.writeln(writer.wrapInColor(t.t("cli.todo.help.commands", "Commands:"), cliCore.CliForegroundColor.Yellow));
|
|
143
|
+
writer.writeln(` ${writer.wrapInColor("todo ls", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_all", "List all tasks")}`);
|
|
144
|
+
writer.writeln(` ${writer.wrapInColor("todo ls --pending", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_pending", "List pending tasks only")}`);
|
|
145
|
+
writer.writeln(` ${writer.wrapInColor("todo ls --completed", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_completed", "List completed tasks only")}`);
|
|
146
|
+
writer.writeln(` ${writer.wrapInColor("todo ls --overdue", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.list_overdue", "List overdue tasks only")}`);
|
|
147
|
+
writer.writeln(` ${writer.wrapInColor("todo add <text>", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.add", "Add a new task")}`);
|
|
148
|
+
writer.writeln(` ${writer.wrapInColor("todo add <text> --due <date>", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.add_due", "Add with due date")}`);
|
|
149
|
+
writer.writeln(` ${writer.wrapInColor("todo edit <id> <new text>", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.edit", "Edit a task")}`);
|
|
150
|
+
writer.writeln(` ${writer.wrapInColor("todo done <id>", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.done", "Mark a task as done")}`);
|
|
151
|
+
writer.writeln(` ${writer.wrapInColor("todo toggle <id>", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.toggle", "Toggle done/undone")}`);
|
|
152
|
+
writer.writeln(` ${writer.wrapInColor("todo rm <id>", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.remove", "Remove a task")}`);
|
|
153
|
+
writer.writeln(` ${writer.wrapInColor("todo rm --all", cliCore.CliForegroundColor.Cyan)} ${t.t("cli.todo.help.remove_all", "Remove all tasks")}`);
|
|
155
154
|
writer.writeln();
|
|
156
|
-
writer.writeln(writer.wrapInColor("Due date formats:", cliCore.CliForegroundColor.Yellow));
|
|
155
|
+
writer.writeln(writer.wrapInColor(t.t("cli.todo.help.due_formats", "Due date formats:"), cliCore.CliForegroundColor.Yellow));
|
|
157
156
|
writer.writeln(` today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD`);
|
|
158
157
|
writer.writeln();
|
|
159
|
-
writer.writeln(writer.wrapInColor("Examples:", cliCore.CliForegroundColor.Yellow));
|
|
158
|
+
writer.writeln(writer.wrapInColor(t.t("cli.common.examples", "Examples:"), cliCore.CliForegroundColor.Yellow));
|
|
160
159
|
writer.writeln(` todo add Buy groceries --due tomorrow`);
|
|
161
160
|
writer.writeln(` todo ls --pending`);
|
|
162
161
|
writer.writeln(` todo edit 3 Buy organic groceries`);
|
|
@@ -166,7 +165,6 @@ var CliTodoCommandProcessor = class {
|
|
|
166
165
|
async initialize(context) {
|
|
167
166
|
context.state.select((x) => x["todos"]).subscribe((todos) => {
|
|
168
167
|
this.todos = (todos || []).map(migrateTodoItem);
|
|
169
|
-
this.nextId = this.todos.length > 0 ? Math.max(...this.todos.map((t) => t.id)) + 1 : 1;
|
|
170
168
|
});
|
|
171
169
|
}
|
|
172
170
|
formatTodoLine(todo, writer) {
|
|
@@ -263,7 +261,7 @@ var CliTodoCommandProcessor = class {
|
|
|
263
261
|
}
|
|
264
262
|
],
|
|
265
263
|
processCommand: async (command, context) => {
|
|
266
|
-
const text = command.value;
|
|
264
|
+
const text = cliCore.joinShellWords(command.value ?? "");
|
|
267
265
|
if (!text) {
|
|
268
266
|
context.writer.writeError("Please provide a task description.");
|
|
269
267
|
return;
|
|
@@ -280,15 +278,17 @@ var CliTodoCommandProcessor = class {
|
|
|
280
278
|
}
|
|
281
279
|
dueDate = parsed;
|
|
282
280
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
281
|
+
let newItem;
|
|
282
|
+
await this.changeTodos(context, (todos) => {
|
|
283
|
+
newItem = {
|
|
284
|
+
id: nextIdOf(todos),
|
|
285
|
+
text,
|
|
286
|
+
completed: false,
|
|
287
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
288
|
+
dueDate
|
|
289
|
+
};
|
|
290
|
+
todos.push(newItem);
|
|
291
|
+
});
|
|
292
292
|
let msg = `Added: "${text}"`;
|
|
293
293
|
if (dueDate) {
|
|
294
294
|
msg += ` (${formatRelativeDate(dueDate)})`;
|
|
@@ -312,10 +312,8 @@ var CliTodoCommandProcessor = class {
|
|
|
312
312
|
}
|
|
313
313
|
],
|
|
314
314
|
processCommand: async (command, context) => {
|
|
315
|
-
const
|
|
316
|
-
const
|
|
317
|
-
const idStr = spaceIndex === -1 ? raw : raw.substring(0, spaceIndex);
|
|
318
|
-
const newText = spaceIndex === -1 ? void 0 : raw.substring(spaceIndex + 1).trim();
|
|
315
|
+
const [idStr = "", ...words] = command.positionals ?? [];
|
|
316
|
+
const newText = words.length ? words.join(" ") : void 0;
|
|
319
317
|
const id = parseInt(idStr, 10);
|
|
320
318
|
if (isNaN(id)) {
|
|
321
319
|
context.writer.writeError("Usage: todo edit <id> <new text> [--due <date>]");
|
|
@@ -327,32 +325,33 @@ var CliTodoCommandProcessor = class {
|
|
|
327
325
|
return;
|
|
328
326
|
}
|
|
329
327
|
const dueArg = command.args["due"];
|
|
330
|
-
|
|
328
|
+
const edit = {};
|
|
331
329
|
if (newText) {
|
|
332
|
-
|
|
333
|
-
changed = true;
|
|
330
|
+
edit.text = newText;
|
|
334
331
|
}
|
|
335
332
|
if (dueArg) {
|
|
336
333
|
if (dueArg === "none") {
|
|
337
|
-
|
|
338
|
-
changed = true;
|
|
334
|
+
edit.dueDate = void 0;
|
|
339
335
|
} else {
|
|
340
336
|
const parsed = parseDueDate(dueArg);
|
|
341
337
|
if (!parsed) {
|
|
342
338
|
context.writer.writeError(`Invalid due date: "${dueArg}".`);
|
|
343
339
|
return;
|
|
344
340
|
}
|
|
345
|
-
|
|
346
|
-
changed = true;
|
|
341
|
+
edit.dueDate = parsed;
|
|
347
342
|
}
|
|
348
343
|
}
|
|
349
|
-
if (
|
|
344
|
+
if (Object.keys(edit).length === 0) {
|
|
350
345
|
context.writer.writeError("Nothing to update. Provide new text or --due.");
|
|
351
346
|
return;
|
|
352
347
|
}
|
|
353
|
-
|
|
348
|
+
let updated;
|
|
349
|
+
await this.changeTodos(context, (todos) => {
|
|
350
|
+
const item = todos.find((t) => t.id === id);
|
|
351
|
+
if (item) updated = Object.assign(item, edit);
|
|
352
|
+
});
|
|
354
353
|
context.writer.writeSuccess(`Updated task #${id}.`);
|
|
355
|
-
context.process.output(todo);
|
|
354
|
+
context.process.output(updated ?? { ...todo, ...edit });
|
|
356
355
|
}
|
|
357
356
|
},
|
|
358
357
|
// ── done ────────────────────────────────────────────
|
|
@@ -363,7 +362,7 @@ var CliTodoCommandProcessor = class {
|
|
|
363
362
|
acceptsRawInput: true,
|
|
364
363
|
valueRequired: true,
|
|
365
364
|
processCommand: async (command, context) => {
|
|
366
|
-
const id = parseInt(command.
|
|
365
|
+
const id = parseInt(command.positionals?.[0] ?? "", 10);
|
|
367
366
|
if (isNaN(id)) {
|
|
368
367
|
context.writer.writeError("Please provide a valid task ID.");
|
|
369
368
|
return;
|
|
@@ -377,11 +376,16 @@ var CliTodoCommandProcessor = class {
|
|
|
377
376
|
context.writer.writeInfo(`Task #${id} is already done.`);
|
|
378
377
|
return;
|
|
379
378
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
379
|
+
const completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
380
|
+
await this.changeTodos(context, (todos) => {
|
|
381
|
+
const item = todos.find((t) => t.id === id);
|
|
382
|
+
if (item) {
|
|
383
|
+
item.completed = true;
|
|
384
|
+
item.completedAt = completedAt;
|
|
385
|
+
}
|
|
386
|
+
});
|
|
383
387
|
context.writer.writeSuccess(`Done: "${todo.text}"`);
|
|
384
|
-
context.process.output(todo);
|
|
388
|
+
context.process.output({ ...todo, completed: true, completedAt });
|
|
385
389
|
}
|
|
386
390
|
},
|
|
387
391
|
// ── toggle ──────────────────────────────────────────
|
|
@@ -391,7 +395,7 @@ var CliTodoCommandProcessor = class {
|
|
|
391
395
|
acceptsRawInput: true,
|
|
392
396
|
valueRequired: true,
|
|
393
397
|
processCommand: async (command, context) => {
|
|
394
|
-
const id = parseInt(command.
|
|
398
|
+
const id = parseInt(command.positionals?.[0] ?? "", 10);
|
|
395
399
|
if (isNaN(id)) {
|
|
396
400
|
context.writer.writeError("Please provide a valid task ID.");
|
|
397
401
|
return;
|
|
@@ -401,12 +405,18 @@ var CliTodoCommandProcessor = class {
|
|
|
401
405
|
context.writer.writeError(`Task #${id} not found.`);
|
|
402
406
|
return;
|
|
403
407
|
}
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
await this.
|
|
407
|
-
|
|
408
|
+
const completed = !todo.completed;
|
|
409
|
+
const completedAt = completed ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
|
|
410
|
+
await this.changeTodos(context, (todos) => {
|
|
411
|
+
const item = todos.find((t) => t.id === id);
|
|
412
|
+
if (item) {
|
|
413
|
+
item.completed = completed;
|
|
414
|
+
item.completedAt = completedAt;
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
const status = completed ? "done" : "reopened";
|
|
408
418
|
context.writer.writeSuccess(`Task #${id} marked as ${status}.`);
|
|
409
|
-
context.process.output(todo);
|
|
419
|
+
context.process.output({ ...todo, completed, completedAt });
|
|
410
420
|
}
|
|
411
421
|
},
|
|
412
422
|
// ── rm ──────────────────────────────────────────────
|
|
@@ -439,12 +449,11 @@ var CliTodoCommandProcessor = class {
|
|
|
439
449
|
context.writer.writeInfo("Cancelled.");
|
|
440
450
|
return;
|
|
441
451
|
}
|
|
442
|
-
this.
|
|
443
|
-
await this.saveToStorage(context);
|
|
452
|
+
await this.changeTodos(context, () => []);
|
|
444
453
|
context.writer.writeSuccess("Removed all tasks.");
|
|
445
454
|
return;
|
|
446
455
|
}
|
|
447
|
-
const id = parseInt(command.
|
|
456
|
+
const id = parseInt(command.positionals?.[0] ?? "", 10);
|
|
448
457
|
if (isNaN(id)) {
|
|
449
458
|
context.writer.writeError("Please provide a valid task ID.");
|
|
450
459
|
return;
|
|
@@ -465,8 +474,11 @@ var CliTodoCommandProcessor = class {
|
|
|
465
474
|
return;
|
|
466
475
|
}
|
|
467
476
|
}
|
|
468
|
-
const removed = this.todos
|
|
469
|
-
await this.
|
|
477
|
+
const removed = this.todos[index];
|
|
478
|
+
await this.changeTodos(
|
|
479
|
+
context,
|
|
480
|
+
(todos) => todos.filter((t) => t.id !== id)
|
|
481
|
+
);
|
|
470
482
|
context.writer.writeSuccess(`Removed: "${removed.text}"`);
|
|
471
483
|
}
|
|
472
484
|
}
|
|
@@ -481,12 +493,24 @@ var CliTodoCommandProcessor = class {
|
|
|
481
493
|
return [];
|
|
482
494
|
}
|
|
483
495
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
496
|
+
/**
|
|
497
|
+
* Change the list and save it, atomically: `change` gets the latest saved
|
|
498
|
+
* list (another tab may have changed it) to edit in place, or returns a
|
|
499
|
+
* new one.
|
|
500
|
+
*/
|
|
501
|
+
async changeTodos(context, change) {
|
|
502
|
+
await context.state.update((state) => {
|
|
503
|
+
const todos = (state["todos"] ?? []).map(
|
|
504
|
+
(t) => ({ ...migrateTodoItem(t) })
|
|
505
|
+
);
|
|
506
|
+
return { todos: change(todos) ?? todos };
|
|
507
|
+
});
|
|
487
508
|
localStorage.removeItem("todo-items");
|
|
488
509
|
}
|
|
489
510
|
};
|
|
511
|
+
function nextIdOf(todos) {
|
|
512
|
+
return todos.length > 0 ? Math.max(...todos.map((t) => t.id)) + 1 : 1;
|
|
513
|
+
}
|
|
490
514
|
|
|
491
515
|
// src/lib/completion/cli-todo-id-completion-provider.ts
|
|
492
516
|
var TODO_ID_SUBCOMMANDS = /* @__PURE__ */ new Set(["rm", "done", "complete", "toggle", "edit"]);
|
package/public-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/todo/src/lib/utilities/index.ts","../../packages/plugins/todo/src/lib/version.ts","../../packages/plugins/todo/src/lib/processors/cli-todo-command-processor.ts","../../packages/plugins/todo/src/lib/completion/cli-todo-id-completion-provider.ts","../../packages/plugins/todo/src/public-api.ts"],"names":["DefaultLibraryAuthor","CliForegroundColor","CliIcon","getPluginConfigValue","todoProcessor","ICliCompletionProvider_TOKEN"],"mappings":"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","file":"public-api.js","sourcesContent":["export type TodoItem = {\n id: number;\n text: string;\n completed: boolean;\n createdAt: string;\n completedAt?: string;\n dueDate?: string;\n};\n\nconst DAY_NAMES = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction startOfDay(date: Date): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\nexport function parseDueDate(input: string): string | null {\n const trimmed = input.trim().toLowerCase();\n const now = new Date();\n const today = startOfDay(now);\n\n if (trimmed === 'today') {\n return today.toISOString();\n }\n\n if (trimmed === 'tomorrow') {\n const d = new Date(today);\n d.setDate(d.getDate() + 1);\n return d.toISOString();\n }\n\n if (trimmed === 'yesterday') {\n const d = new Date(today);\n d.setDate(d.getDate() - 1);\n return d.toISOString();\n }\n\n if (trimmed === 'next week') {\n const d = new Date(today);\n d.setDate(d.getDate() + 7);\n return d.toISOString();\n }\n\n if (trimmed === 'next month') {\n const d = new Date(today);\n d.setMonth(d.getMonth() + 1);\n return d.toISOString();\n }\n\n const dayIndex = DAY_NAMES.indexOf(trimmed);\n if (dayIndex !== -1) {\n const d = new Date(today);\n const currentDay = d.getDay();\n let daysUntil = dayIndex - currentDay;\n if (daysUntil <= 0) daysUntil += 7;\n d.setDate(d.getDate() + daysUntil);\n return d.toISOString();\n }\n\n // Try ISO format YYYY-MM-DD\n const isoMatch = trimmed.match(/^\\d{4}-\\d{2}-\\d{2}$/);\n if (isoMatch) {\n const d = new Date(trimmed + 'T00:00:00');\n if (!isNaN(d.getTime())) {\n return startOfDay(d).toISOString();\n }\n }\n\n return null;\n}\n\nexport function formatRelativeDate(isoDate: string): string {\n const target = startOfDay(new Date(isoDate));\n const today = startOfDay(new Date());\n const diffMs = target.getTime() - today.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'due: today';\n if (diffDays === 1) return 'due: tomorrow';\n if (diffDays === -1) return 'overdue: yesterday';\n if (diffDays > 1 && diffDays <= 14) return `due: in ${diffDays} days`;\n if (diffDays < -1) return `overdue: ${Math.abs(diffDays)} days ago`;\n\n // Far future: show month + day\n const d = new Date(isoDate);\n return `due: ${MONTH_NAMES[d.getMonth()]} ${d.getDate()}`;\n}\n\nexport function isOverdue(todo: TodoItem): boolean {\n if (todo.completed || !todo.dueDate) return false;\n const target = startOfDay(new Date(todo.dueDate));\n const today = startOfDay(new Date());\n return target.getTime() < today.getTime();\n}\n\nexport function migrateTodoItem(item: any): TodoItem {\n return {\n id: item.id,\n text: item.text,\n completed: item.completed ?? false,\n createdAt: item.createdAt ?? new Date().toISOString(),\n completedAt: item.completedAt,\n dueDate: item.dueDate,\n };\n}\n\nexport function lineThroughText(text: string): string {\n return text\n .split('')\n .map((char) => char + '\\u0336')\n .join('');\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.9';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliIcon,\n CliProcessCommand,\n CliProcessorMetadata,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliConfigurationOption,\n ICliExecutionContext,\n getPluginConfigValue,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n TodoItem,\n formatRelativeDate,\n isOverdue,\n lineThroughText,\n migrateTodoItem,\n parseDueDate,\n} from '../utilities';\n\nexport class CliTodoCommandProcessor implements ICliCommandProcessor {\n command = 'todo';\n\n description = 'Manage your tasks from the terminal. Add, list, edit, complete, and remove TODO items.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors?: ICliCommandProcessor[] = [];\n\n metadata?: CliProcessorMetadata = {\n icon: '📝',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n configurationOptions?: ICliConfigurationOption[] = [\n {\n key: 'showCompletedFirst',\n label: 'Show Completed First',\n description: 'List completed tasks before pending ones',\n type: 'boolean',\n defaultValue: false,\n },\n {\n key: 'confirmBeforeDelete',\n label: 'Confirm Before Delete',\n description: 'Ask for confirmation before removing tasks',\n type: 'boolean',\n defaultValue: false,\n },\n ];\n\n stateConfiguration?: CliStateConfiguration = {\n initialState: {\n todos: this.loadFromOldStorage() ?? [],\n },\n };\n\n private todos: TodoItem[] = [];\n\n private nextId = 1;\n\n getTodos(): TodoItem[] {\n return this.todos;\n }\n\n constructor() {\n this.registerSubProcessors();\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln(this.description!);\n writer.writeln();\n writer.writeln(writer.wrapInColor('Commands:', CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('todo ls', CliForegroundColor.Cyan)} List all tasks`);\n writer.writeln(` ${writer.wrapInColor('todo ls --pending', CliForegroundColor.Cyan)} List pending tasks only`);\n writer.writeln(` ${writer.wrapInColor('todo ls --completed', CliForegroundColor.Cyan)} List completed tasks only`);\n writer.writeln(` ${writer.wrapInColor('todo ls --overdue', CliForegroundColor.Cyan)} List overdue tasks only`);\n writer.writeln(` ${writer.wrapInColor('todo add <text>', CliForegroundColor.Cyan)} Add a new task`);\n writer.writeln(` ${writer.wrapInColor('todo add <text> --due <date>', CliForegroundColor.Cyan)} Add with due date`);\n writer.writeln(` ${writer.wrapInColor('todo edit <id> <new text>', CliForegroundColor.Cyan)} Edit a task`);\n writer.writeln(` ${writer.wrapInColor('todo done <id>', CliForegroundColor.Cyan)} Mark a task as done`);\n writer.writeln(` ${writer.wrapInColor('todo toggle <id>', CliForegroundColor.Cyan)} Toggle done/undone`);\n writer.writeln(` ${writer.wrapInColor('todo rm <id>', CliForegroundColor.Cyan)} Remove a task`);\n writer.writeln(` ${writer.wrapInColor('todo rm --all', CliForegroundColor.Cyan)} Remove all tasks`);\n writer.writeln();\n writer.writeln(writer.wrapInColor('Due date formats:', CliForegroundColor.Yellow));\n writer.writeln(` today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD`);\n writer.writeln();\n writer.writeln(writer.wrapInColor('Examples:', CliForegroundColor.Yellow));\n writer.writeln(` todo add Buy groceries --due tomorrow`);\n writer.writeln(` todo ls --pending`);\n writer.writeln(` todo edit 3 Buy organic groceries`);\n writer.writeln(` todo done 1`);\n writer.writeln(` todo toggle 2`);\n }\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n context.state\n .select<TodoItem[]>((x) => x['todos'])\n .subscribe((todos) => {\n this.todos = (todos || []).map(migrateTodoItem);\n this.nextId =\n this.todos.length > 0\n ? Math.max(...this.todos.map((t) => t.id)) + 1\n : 1;\n });\n }\n\n private formatTodoLine(todo: TodoItem, writer: any): string {\n const check = todo.completed\n ? writer.wrapInColor(CliIcon.CheckIcon, CliForegroundColor.Green)\n : ' ';\n\n const text = todo.completed ? lineThroughText(todo.text) : todo.text;\n let suffix = '';\n\n if (todo.completed) {\n suffix = writer.wrapInColor(' done', CliForegroundColor.Green);\n } else if (todo.dueDate) {\n const rel = formatRelativeDate(todo.dueDate);\n const color = isOverdue(todo) ? CliForegroundColor.Red : CliForegroundColor.Yellow;\n suffix = ' ' + writer.wrapInColor(rel, color);\n }\n\n return ` [${check}] #${todo.id} - ${text}${suffix}`;\n }\n\n private registerSubProcessors(): void {\n this.processors = [\n // ── ls ──────────────────────────────────────────────\n {\n command: 'ls',\n aliases: ['list'],\n description: 'List TODO items',\n parameters: [\n {\n name: 'pending',\n description: 'Show only pending tasks',\n type: 'boolean',\n required: false,\n },\n {\n name: 'completed',\n description: 'Show only completed tasks',\n type: 'boolean',\n required: false,\n },\n {\n name: 'overdue',\n description: 'Show only overdue tasks',\n type: 'boolean',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n if (this.todos.length === 0) {\n context.writer.writeWarning('No tasks yet.');\n context.writer.writeln('Use \"todo add <text>\" to create one.');\n context.process.output([]);\n return;\n }\n\n let filtered = [...this.todos];\n const args = command.args;\n\n if (args['pending']) {\n filtered = filtered.filter((t) => !t.completed);\n } else if (args['completed']) {\n filtered = filtered.filter((t) => t.completed);\n } else if (args['overdue']) {\n filtered = filtered.filter((t) => isOverdue(t));\n }\n\n const showCompletedFirst = getPluginConfigValue(context, 'todo', 'showCompletedFirst', false);\n if (showCompletedFirst) {\n filtered.sort((a, b) => (a.completed === b.completed ? 0 : a.completed ? -1 : 1));\n }\n\n const doneCount = this.todos.filter((t) => t.completed).length;\n context.writer.writeln(\n context.writer.wrapInColor(\n `Todos (${doneCount}/${this.todos.length} done)`,\n CliForegroundColor.Cyan,\n ),\n );\n\n if (filtered.length === 0) {\n context.writer.writeln(' No matching tasks.');\n } else {\n filtered.forEach((todo) => {\n context.writer.writeln(\n this.formatTodoLine(todo, context.writer),\n );\n });\n }\n\n context.process.output(filtered);\n },\n },\n\n // ── add ─────────────────────────────────────────────\n {\n command: 'add',\n description: 'Add a new task',\n acceptsRawInput: true,\n valueRequired: true,\n parameters: [\n {\n name: 'due',\n description: 'Due date (today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD)',\n type: 'string',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n const text = command.value;\n if (!text) {\n context.writer.writeError('Please provide a task description.');\n return;\n }\n\n let dueDate: string | undefined;\n const dueArg = command.args['due'];\n if (dueArg) {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(\n `Invalid due date: \"${dueArg}\". Use: today, tomorrow, monday..sunday, next week, next month, or YYYY-MM-DD.`,\n );\n return;\n }\n dueDate = parsed;\n }\n\n const newItem: TodoItem = {\n id: this.nextId++,\n text,\n completed: false,\n createdAt: new Date().toISOString(),\n dueDate,\n };\n\n this.todos.push(newItem);\n await this.saveToStorage(context);\n\n let msg = `Added: \"${text}\"`;\n if (dueDate) {\n msg += ` (${formatRelativeDate(dueDate)})`;\n }\n context.writer.writeSuccess(msg);\n context.process.output(newItem);\n },\n },\n\n // ── edit ────────────────────────────────────────────\n {\n command: 'edit',\n description: 'Edit a task\\'s text or due date',\n acceptsRawInput: true,\n valueRequired: true,\n parameters: [\n {\n name: 'due',\n description: 'New due date (or \"none\" to remove)',\n type: 'string',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n const raw = command.value || '';\n const spaceIndex = raw.indexOf(' ');\n\n const idStr = spaceIndex === -1 ? raw : raw.substring(0, spaceIndex);\n const newText = spaceIndex === -1 ? undefined : raw.substring(spaceIndex + 1).trim();\n\n const id = parseInt(idStr, 10);\n if (isNaN(id)) {\n context.writer.writeError('Usage: todo edit <id> <new text> [--due <date>]');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const dueArg = command.args['due'];\n let changed = false;\n\n if (newText) {\n todo.text = newText;\n changed = true;\n }\n\n if (dueArg) {\n if (dueArg === 'none') {\n todo.dueDate = undefined;\n changed = true;\n } else {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(`Invalid due date: \"${dueArg}\".`);\n return;\n }\n todo.dueDate = parsed;\n changed = true;\n }\n }\n\n if (!changed) {\n context.writer.writeError('Nothing to update. Provide new text or --due.');\n return;\n }\n\n await this.saveToStorage(context);\n context.writer.writeSuccess(`Updated task #${id}.`);\n context.process.output(todo);\n },\n },\n\n // ── done ────────────────────────────────────────────\n {\n command: 'done',\n aliases: ['complete'],\n description: 'Mark a task as done',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (command, context) => {\n const id = parseInt(command.value || '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n if (todo.completed) {\n context.writer.writeInfo(`Task #${id} is already done.`);\n return;\n }\n\n todo.completed = true;\n todo.completedAt = new Date().toISOString();\n await this.saveToStorage(context);\n context.writer.writeSuccess(`Done: \"${todo.text}\"`);\n context.process.output(todo);\n },\n },\n\n // ── toggle ──────────────────────────────────────────\n {\n command: 'toggle',\n description: 'Toggle a task between done and undone',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (command, context) => {\n const id = parseInt(command.value || '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n todo.completed = !todo.completed;\n todo.completedAt = todo.completed ? new Date().toISOString() : undefined;\n await this.saveToStorage(context);\n\n const status = todo.completed ? 'done' : 'reopened';\n context.writer.writeSuccess(`Task #${id} marked as ${status}.`);\n context.process.output(todo);\n },\n },\n\n // ── rm ──────────────────────────────────────────────\n {\n command: 'rm',\n aliases: ['remove'],\n description: 'Remove a task by ID',\n acceptsRawInput: true,\n parameters: [\n {\n name: 'all',\n description: 'Remove all tasks',\n type: 'boolean',\n defaultValue: false,\n aliases: ['a'],\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n if (command.args['all'] || command.args['a']) {\n if (this.todos.length === 0) {\n context.writer.writeInfo('No tasks to remove.');\n return;\n }\n\n const confirmed = await context.reader.readConfirm(\n `Remove all ${this.todos.length} tasks?`,\n false,\n );\n\n if (!confirmed) {\n context.writer.writeInfo('Cancelled.');\n return;\n }\n\n this.todos = [];\n await this.saveToStorage(context);\n context.writer.writeSuccess('Removed all tasks.');\n return;\n }\n\n const id = parseInt(command.value!, 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const index = this.todos.findIndex((t) => t.id === id);\n if (index === -1) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const confirmBeforeDelete = getPluginConfigValue(context, 'todo', 'confirmBeforeDelete', false);\n if (confirmBeforeDelete) {\n const confirmed = await context.reader.readConfirm(\n `Remove task #${id}: \"${this.todos[index].text}\"?`,\n false,\n );\n if (!confirmed) {\n context.writer.writeInfo('Cancelled.');\n return;\n }\n }\n\n const removed = this.todos.splice(index, 1)[0];\n await this.saveToStorage(context);\n context.writer.writeSuccess(`Removed: \"${removed.text}\"`);\n },\n },\n ];\n }\n\n private loadFromOldStorage(): TodoItem[] {\n const data = localStorage.getItem('todo-items');\n if (!data) return [];\n try {\n return (JSON.parse(data) as any[]).map(migrateTodoItem);\n } catch {\n return [];\n }\n }\n\n private async saveToStorage(context: ICliExecutionContext): Promise<void> {\n context.state.updateState({ todos: this.todos });\n await context.state.persist();\n localStorage.removeItem('todo-items');\n }\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n} from '@qodalis/cli-core';\nimport { CliTodoCommandProcessor } from '../processors/cli-todo-command-processor';\n\nconst TODO_ID_SUBCOMMANDS = new Set(['rm', 'done', 'complete', 'toggle', 'edit']);\n\nexport class CliTodoIdCompletionProvider\n implements ICliCompletionProvider\n{\n priority = 50;\n\n constructor(\n private readonly todoProcessor: CliTodoCommandProcessor,\n ) {}\n\n getCompletions(context: ICliCompletionContext): string[] {\n const { tokens, tokenIndex, token } = context;\n\n if (tokenIndex !== 2 || tokens.length < 2) {\n return [];\n }\n\n const rootCommand = tokens[0].toLowerCase();\n if (rootCommand !== 'todo') {\n return [];\n }\n\n const subCommand = tokens[1].toLowerCase();\n if (!TODO_ID_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n const todos = this.todoProcessor.getTodos();\n const lowerPrefix = token.toLowerCase();\n\n // For 'done' and 'complete', only show non-completed todos\n const filtered =\n subCommand === 'done' || subCommand === 'complete'\n ? todos.filter((t) => !t.completed)\n : todos;\n\n return filtered\n .map((t) => String(t.id))\n .filter((id) => id.startsWith(lowerPrefix))\n .sort((a, b) => Number(a) - Number(b));\n }\n}\n","/*\n * Public API Surface of todo\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-todo-command-processor';\nexport * from './lib/completion/cli-todo-id-completion-provider';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliTodoCommandProcessor } from './lib/processors/cli-todo-command-processor';\nimport { CliTodoIdCompletionProvider } from './lib/completion/cli-todo-id-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst todoProcessor = new CliTodoCommandProcessor();\n\nexport const todoModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-todo',\n processors: [todoProcessor],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: new CliTodoIdCompletionProvider(todoProcessor),\n multi: true,\n },\n ],\n translations: {\n es: { 'cli.todo.description': 'Gestionar tus tareas desde la terminal' },\n fr: { 'cli.todo.description': 'Gérer vos tâches depuis le terminal' },\n de: { 'cli.todo.description': 'Aufgaben über das Terminal verwalten' },\n pt: { 'cli.todo.description': 'Gerenciar suas tarefas pelo terminal' },\n it: { 'cli.todo.description': 'Gestire le attività dal terminale' },\n ja: { 'cli.todo.description': 'ターミナルからタスクを管理' },\n ko: { 'cli.todo.description': '터미널에서 할 일 관리' },\n zh: { 'cli.todo.description': '从终端管理你的任务' },\n ru: { 'cli.todo.description': 'Управление задачами из терминала' },\n ro: { 'cli.todo.description': 'Gestionează sarcinile tale din terminal' },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/todo/src/lib/utilities/index.ts","../../packages/plugins/todo/src/lib/version.ts","../../packages/plugins/todo/src/lib/processors/cli-todo-command-processor.ts","../../packages/plugins/todo/src/lib/completion/cli-todo-id-completion-provider.ts","../../packages/plugins/todo/src/public-api.ts"],"names":["DefaultLibraryAuthor","CliForegroundColor","CliIcon","getPluginConfigValue","joinShellWords","todoProcessor","ICliCompletionProvider_TOKEN"],"mappings":";;;;;AASA,IAAM,SAAA,GAAY,CAAC,QAAA,EAAU,QAAA,EAAU,WAAW,WAAA,EAAa,UAAA,EAAY,UAAU,UAAU,CAAA;AAC/F,IAAM,WAAA,GAAc,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,KAAK,CAAA;AAEvG,SAAS,WAAW,IAAA,EAAkB;AAClC,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,IAAI,CAAA;AACvB,EAAA,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACrB,EAAA,OAAO,CAAA;AACX;AAEO,SAAS,aAAa,KAAA,EAA8B;AACvD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAE5B,EAAA,IAAI,YAAY,OAAA,EAAS;AACrB,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC7B;AAEA,EAAA,IAAI,YAAY,UAAA,EAAY;AACxB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAC,CAAA;AACzB,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACzB;AAEA,EAAA,IAAI,YAAY,WAAA,EAAa;AACzB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAC,CAAA;AACzB,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACzB;AAEA,EAAA,IAAI,YAAY,WAAA,EAAa;AACzB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAQ,GAAI,CAAC,CAAA;AACzB,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACzB;AAEA,EAAA,IAAI,YAAY,YAAA,EAAc;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,QAAA,EAAS,GAAI,CAAC,CAAA;AAC3B,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACzB;AAEA,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAC1C,EAAA,IAAI,aAAa,EAAA,EAAI;AACjB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,KAAK,CAAA;AACxB,IAAA,MAAM,UAAA,GAAa,EAAE,MAAA,EAAO;AAC5B,IAAA,IAAI,YAAY,QAAA,GAAW,UAAA;AAC3B,IAAA,IAAI,SAAA,IAAa,GAAG,SAAA,IAAa,CAAA;AACjC,IAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAE,OAAA,EAAQ,GAAI,SAAS,CAAA;AACjC,IAAA,OAAO,EAAE,WAAA,EAAY;AAAA,EACzB;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,qBAAqB,CAAA;AACpD,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,MAAM,CAAA,mBAAI,IAAI,IAAA,CAAK,OAAA,GAAU,WAAW,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG;AACrB,MAAA,OAAO,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,IACrC;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAEO,SAAS,mBAAmB,OAAA,EAAyB;AACxD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,UAAA,iBAAW,IAAI,IAAA,EAAM,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,EAAQ,GAAI,MAAM,OAAA,EAAQ;AAChD,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,UAAU,GAAA,GAAO,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAE1D,EAAA,IAAI,QAAA,KAAa,GAAG,OAAO,YAAA;AAC3B,EAAA,IAAI,QAAA,KAAa,GAAG,OAAO,eAAA;AAC3B,EAAA,IAAI,QAAA,KAAa,IAAI,OAAO,oBAAA;AAC5B,EAAA,IAAI,WAAW,CAAA,IAAK,QAAA,IAAY,EAAA,EAAI,OAAO,WAAW,QAAQ,CAAA,KAAA,CAAA;AAC9D,EAAA,IAAI,WAAW,EAAA,EAAI,OAAO,YAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,CAAA,SAAA,CAAA;AAGxD,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,OAAO,CAAA;AAC1B,EAAA,OAAO,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,EAAS,CAAA,CAAA;AAC3D;AAEO,SAAS,UAAU,IAAA,EAAyB;AAC/C,EAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,SAAS,OAAO,KAAA;AAC5C,EAAA,MAAM,SAAS,UAAA,CAAW,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAC,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,UAAA,iBAAW,IAAI,IAAA,EAAM,CAAA;AACnC,EAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,GAAI,KAAA,CAAM,OAAA,EAAQ;AAC5C;AAEO,SAAS,gBAAgB,IAAA,EAAqB;AACjD,EAAA,OAAO;AAAA,IACH,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAA,EAAW,KAAK,SAAA,IAAa,KAAA;AAAA,IAC7B,WAAW,IAAA,CAAK,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IACpD,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAS,IAAA,CAAK;AAAA,GAClB;AACJ;AAEO,SAAS,gBAAgB,IAAA,EAAsB;AAClD,EAAA,OAAO,IAAA,CACF,KAAA,CAAM,EAAE,CAAA,CACR,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,GAAO,QAAQ,CAAA,CAC7B,IAAA,CAAK,EAAE,CAAA;AAChB;;;AC/GO,IAAM,eAAA,GAAkB,YAAA;AACxB,IAAM,WAAA,GAAc,CAAA;;;ACoBpB,IAAM,0BAAN,MAA8D;AAAA,EA8CjE,WAAA,GAAc;AA7Cd,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AAEV,IAAA,IAAA,CAAA,WAAA,GAAc,wFAAA;AAEd,IAAA,IAAA,CAAA,MAAA,GAASA,4BAAA;AAET,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAEV,IAAA,IAAA,CAAA,UAAA,GAAsC,EAAC;AAEvC,IAAA,IAAA,CAAA,QAAA,GAAkC;AAAA,MAC9B,IAAA,EAAM,WAAA;AAAA,MACN,mBAAA,EAAqB,gBAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACxB;AAEA,IAAA,IAAA,CAAA,oBAAA,GAAmD;AAAA,MAC/C;AAAA,QACI,GAAA,EAAK,oBAAA;AAAA,QACL,KAAA,EAAO,sBAAA;AAAA,QACP,WAAA,EAAa,0CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA,OAClB;AAAA,MACA;AAAA,QACI,GAAA,EAAK,qBAAA;AAAA,QACL,KAAA,EAAO,uBAAA;AAAA,QACP,WAAA,EAAa,4CAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc;AAAA;AAClB,KACJ;AAEA,IAAA,IAAA,CAAA,kBAAA,GAA6C;AAAA,MACzC,YAAA,EAAc;AAAA,QACV,KAAA,EAAO,IAAA,CAAK,kBAAA,EAAmB,IAAK;AAAC;AACzC,KACJ;AAEA,IAAA,IAAA,CAAQ,QAAoB,EAAC;AAOzB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC/B;AAAA,EANA,QAAA,GAAuB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAMA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA,EAAE,GAAI,OAAA;AAClC,IAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA,CAAE,sBAAA,EAAwB,IAAA,CAAK,WAAY,CAAC,CAAA;AAC7D,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,CAAE,CAAA,CAAE,0BAA0B,WAAW,CAAA,EAAGC,0BAAA,CAAmB,MAAM,CAAC,CAAA;AACxG,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,WAAWA,0BAAA,CAAmB,IAAI,CAAC,CAAA,oBAAA,EAAuB,CAAA,CAAE,CAAA,CAAE,wBAAA,EAA0B,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAClJ,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,qBAAqBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,CAAA,CAAE,4BAAA,EAA8B,yBAAyB,CAAC,CAAA,CAAE,CAAA;AAC/J,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,uBAAuBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,QAAA,EAAW,CAAA,CAAE,CAAA,CAAE,8BAAA,EAAgC,2BAA2B,CAAC,CAAA,CAAE,CAAA;AACnK,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,qBAAqBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,CAAA,CAAE,4BAAA,EAA8B,yBAAyB,CAAC,CAAA,CAAE,CAAA;AAC/J,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,mBAAmBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,YAAA,EAAe,CAAA,CAAE,CAAA,CAAE,mBAAA,EAAqB,gBAAgB,CAAC,CAAA,CAAE,CAAA;AAC7I,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,gCAAgCA,0BAAA,CAAmB,IAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,CAAA,CAAE,uBAAA,EAAyB,mBAAmB,CAAC,CAAA,CAAE,CAAA;AACvJ,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,6BAA6BA,0BAAA,CAAmB,IAAI,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,CAAA,CAAE,oBAAA,EAAsB,aAAa,CAAC,CAAA,CAAE,CAAA;AAC3I,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,kBAAkBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,aAAA,EAAgB,CAAA,CAAE,CAAA,CAAE,oBAAA,EAAsB,qBAAqB,CAAC,CAAA,CAAE,CAAA;AACnJ,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,oBAAoBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,WAAA,EAAc,CAAA,CAAE,CAAA,CAAE,sBAAA,EAAwB,oBAAoB,CAAC,CAAA,CAAE,CAAA;AACpJ,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,gBAAgBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,eAAA,EAAkB,CAAA,CAAE,CAAA,CAAE,sBAAA,EAAwB,eAAe,CAAC,CAAA,CAAE,CAAA;AAC/I,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,WAAA,CAAY,iBAAiBA,0BAAA,CAAmB,IAAI,CAAC,CAAA,cAAA,EAAiB,CAAA,CAAE,CAAA,CAAE,0BAAA,EAA4B,kBAAkB,CAAC,CAAA,CAAE,CAAA;AACtJ,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,CAAE,CAAA,CAAE,6BAA6B,mBAAmB,CAAA,EAAGA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AACnH,IAAA,MAAA,CAAO,QAAQ,CAAA,oEAAA,CAAsE,CAAA;AACrF,IAAA,MAAA,CAAO,OAAA,EAAQ;AACf,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,CAAA,CAAE,CAAA,CAAE,uBAAuB,WAAW,CAAA,EAAGA,0BAAA,CAAmB,MAAM,CAAC,CAAA;AACrG,IAAA,MAAA,CAAO,QAAQ,CAAA,uCAAA,CAAyC,CAAA;AACxD,IAAA,MAAA,CAAO,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AACpC,IAAA,MAAA,CAAO,QAAQ,CAAA,mCAAA,CAAqC,CAAA;AACpD,IAAA,MAAA,CAAO,QAAQ,CAAA,aAAA,CAAe,CAAA;AAC9B,IAAA,MAAA,CAAO,QAAQ,CAAA,eAAA,CAAiB,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,WAAW,OAAA,EAA8C;AAC3D,IAAA,OAAA,CAAQ,KAAA,CACH,MAAA,CAAmB,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA,CACpC,SAAA,CAAU,CAAC,KAAA,KAAU;AAClB,MAAA,IAAA,CAAK,KAAA,GAAA,CAAS,KAAA,IAAS,EAAC,EAAG,IAAI,eAAe,CAAA;AAAA,IAClD,CAAC,CAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CAAe,MAAgB,MAAA,EAAqB;AACxD,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,GACb,MAAA,CAAO,YAAYC,eAAA,CAAQ,SAAA,EAAWD,0BAAA,CAAmB,KAAK,CAAA,GAC9D,GAAA;AAEN,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,GAAY,gBAAgB,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAA;AAChE,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,MAAA,GAAS,MAAA,CAAO,WAAA,CAAY,QAAA,EAAUA,0BAAA,CAAmB,KAAK,CAAA;AAAA,IAClE,CAAA,MAAA,IAAW,KAAK,OAAA,EAAS;AACrB,MAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA;AAC3C,MAAA,MAAM,QAAQ,SAAA,CAAU,IAAI,CAAA,GAAIA,0BAAA,CAAmB,MAAMA,0BAAA,CAAmB,MAAA;AAC5E,MAAA,MAAA,GAAS,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,GAAA,EAAK,KAAK,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,CAAA,GAAA,EAAM,KAAK,CAAA,GAAA,EAAM,IAAA,CAAK,EAAE,CAAA,GAAA,EAAM,IAAI,GAAG,MAAM,CAAA,CAAA;AAAA,EACtD;AAAA,EAEQ,qBAAA,GAA8B;AAClC,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA;AAAA,MAEd;AAAA,QACI,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,QAChB,WAAA,EAAa,iBAAA;AAAA,QACb,UAAA,EAAY;AAAA,UACR;AAAA,YACI,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa,yBAAA;AAAA,YACb,IAAA,EAAM,SAAA;AAAA,YACN,QAAA,EAAU;AAAA,WACd;AAAA,UACA;AAAA,YACI,IAAA,EAAM,WAAA;AAAA,YACN,WAAA,EAAa,2BAAA;AAAA,YACb,IAAA,EAAM,SAAA;AAAA,YACN,QAAA,EAAU;AAAA,WACd;AAAA,UACA;AAAA,YACI,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EAAa,yBAAA;AAAA,YACb,IAAA,EAAM,SAAA;AAAA,YACN,QAAA,EAAU;AAAA;AACd,SACJ;AAAA,QACA,cAAA,EAAgB,OAAO,OAAA,EAAS,OAAA,KAAY;AACxC,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACzB,YAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,eAAe,CAAA;AAC3C,YAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,sCAAsC,CAAA;AAC7D,YAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AACzB,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAC7B,UAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAErB,UAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACjB,YAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,SAAS,CAAA;AAAA,UAClD,CAAA,MAAA,IAAW,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1B,YAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAAA,UACjD,CAAA,MAAA,IAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AACxB,YAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,UAClD;AAEA,UAAA,MAAM,kBAAA,GAAqBE,4BAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,sBAAsB,KAAK,CAAA;AAC5F,UAAA,IAAI,kBAAA,EAAoB;AACpB,YAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,SAAA,GAAY,CAAA,GAAI,CAAA,CAAE,SAAA,GAAY,EAAA,GAAK,CAAE,CAAA;AAAA,UACpF;AAEA,UAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AACxD,UAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,YACX,QAAQ,MAAA,CAAO,WAAA;AAAA,cACX,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,MAAM,CAAA,MAAA,CAAA;AAAA,cACxCF,0BAAA,CAAmB;AAAA;AACvB,WACJ;AAEA,UAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,YAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,sBAAsB,CAAA;AAAA,UACjD,CAAA,MAAO;AACH,YAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,KAAS;AACvB,cAAA,OAAA,CAAQ,MAAA,CAAO,OAAA;AAAA,gBACX,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,OAAA,CAAQ,MAAM;AAAA,eAC5C;AAAA,YACJ,CAAC,CAAA;AAAA,UACL;AAEA,UAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA,QACnC;AAAA,OACJ;AAAA;AAAA,MAGA;AAAA,QACI,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,gBAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,UAAA,EAAY;AAAA,UACR;AAAA,YACI,IAAA,EAAM,KAAA;AAAA,YACN,WAAA,EAAa,+EAAA;AAAA,YACb,IAAA,EAAM,QAAA;AAAA,YACN,QAAA,EAAU;AAAA;AACd,SACJ;AAAA,QACA,cAAA,EAAgB,OAAO,OAAA,EAAS,OAAA,KAAY;AACxC,UAAA,MAAM,IAAA,GAAOG,sBAAA,CAAe,OAAA,CAAQ,KAAA,IAAS,EAAE,CAAA;AAC/C,UAAA,IAAI,CAAC,IAAA,EAAM;AACP,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,oCAAoC,CAAA;AAC9D,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,OAAA;AACJ,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACjC,UAAA,IAAI,MAAA,EAAQ;AACR,YAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,YAAA,IAAI,CAAC,MAAA,EAAQ;AACT,cAAA,OAAA,CAAQ,MAAA,CAAO,UAAA;AAAA,gBACX,sBAAsB,MAAM,CAAA,8EAAA;AAAA,eAChC;AACA,cAAA;AAAA,YACJ;AACA,YAAA,OAAA,GAAU,MAAA;AAAA,UACd;AAIA,UAAA,IAAI,OAAA;AACJ,UAAA,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAC,KAAA,KAAU;AACvC,YAAA,OAAA,GAAU;AAAA,cACN,EAAA,EAAI,SAAS,KAAK,CAAA;AAAA,cAClB,IAAA;AAAA,cACA,SAAA,EAAW,KAAA;AAAA,cACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC;AAAA,aACJ;AACA,YAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,UACtB,CAAC,CAAA;AAED,UAAA,IAAI,GAAA,GAAM,WAAW,IAAI,CAAA,CAAA,CAAA;AACzB,UAAA,IAAI,OAAA,EAAS;AACT,YAAA,GAAA,IAAO,CAAA,EAAA,EAAK,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,UAC3C;AACA,UAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,GAAG,CAAA;AAC/B,UAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,QAClC;AAAA,OACJ;AAAA;AAAA,MAGA;AAAA,QACI,OAAA,EAAS,MAAA;AAAA,QACT,WAAA,EAAa,gCAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,UAAA,EAAY;AAAA,UACR;AAAA,YACI,IAAA,EAAM,KAAA;AAAA,YACN,WAAA,EAAa,oCAAA;AAAA,YACb,IAAA,EAAM,QAAA;AAAA,YACN,QAAA,EAAU;AAAA;AACd,SACJ;AAAA,QACA,cAAA,EAAgB,OAAO,OAAA,EAAS,OAAA,KAAY;AACxC,UAAA,MAAM,CAAC,QAAQ,EAAA,EAAI,GAAG,KAAK,CAAA,GAAI,OAAA,CAAQ,eAAe,EAAC;AACvD,UAAA,MAAM,UAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAEjD,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAC7B,UAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACX,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,iDAAiD,CAAA;AAC3E,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC/C,UAAA,IAAI,CAAC,IAAA,EAAM;AACP,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,MAAA,EAAS,EAAE,CAAA,WAAA,CAAa,CAAA;AAClD,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AACjC,UAAA,MAAM,OAA0B,EAAC;AAEjC,UAAA,IAAI,OAAA,EAAS;AACT,YAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AAAA,UAChB;AAEA,UAAA,IAAI,MAAA,EAAQ;AACR,YAAA,IAAI,WAAW,MAAA,EAAQ;AACnB,cAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,YACnB,CAAA,MAAO;AACH,cAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,cAAA,IAAI,CAAC,MAAA,EAAQ;AACT,gBAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,mBAAA,EAAsB,MAAM,CAAA,EAAA,CAAI,CAAA;AAC1D,gBAAA;AAAA,cACJ;AACA,cAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,YACnB;AAAA,UACJ;AAEA,UAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAChC,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,+CAA+C,CAAA;AACzE,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,OAAA;AACJ,UAAA,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAC,KAAA,KAAU;AACvC,YAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C,YAAA,IAAI,IAAA,EAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,UAChD,CAAC,CAAA;AACD,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAA,CAAG,CAAA;AAClD,UAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAA,IAAW,EAAE,GAAG,IAAA,EAAM,GAAG,MAAM,CAAA;AAAA,QAC1D;AAAA,OACJ;AAAA;AAAA,MAGA;AAAA,QACI,OAAA,EAAS,MAAA;AAAA,QACT,OAAA,EAAS,CAAC,UAAU,CAAA;AAAA,QACpB,WAAA,EAAa,qBAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,OAAO,OAAA,EAAS,OAAA,KAAY;AACxC,UAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAC,CAAA,IAAK,IAAI,EAAE,CAAA;AACtD,UAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACX,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,iCAAiC,CAAA;AAC3D,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC/C,UAAA,IAAI,CAAC,IAAA,EAAM;AACP,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,MAAA,EAAS,EAAE,CAAA,WAAA,CAAa,CAAA;AAClD,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,KAAK,SAAA,EAAW;AAChB,YAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,CAAA,MAAA,EAAS,EAAE,CAAA,iBAAA,CAAmB,CAAA;AACvD,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,UAAA,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAC,KAAA,KAAU;AACvC,YAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C,YAAA,IAAI,IAAA,EAAM;AACN,cAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,cAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,YACvB;AAAA,UACJ,CAAC,CAAA;AACD,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAClD,UAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,GAAG,MAAM,SAAA,EAAW,IAAA,EAAM,aAAa,CAAA;AAAA,QACpE;AAAA,OACJ;AAAA;AAAA,MAGA;AAAA,QACI,OAAA,EAAS,QAAA;AAAA,QACT,WAAA,EAAa,uCAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,aAAA,EAAe,IAAA;AAAA,QACf,cAAA,EAAgB,OAAO,OAAA,EAAS,OAAA,KAAY;AACxC,UAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAC,CAAA,IAAK,IAAI,EAAE,CAAA;AACtD,UAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACX,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,iCAAiC,CAAA;AAC3D,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC/C,UAAA,IAAI,CAAC,IAAA,EAAM;AACP,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,MAAA,EAAS,EAAE,CAAA,WAAA,CAAa,CAAA;AAClD,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,SAAA,GAAY,CAAC,IAAA,CAAK,SAAA;AACxB,UAAA,MAAM,cAAc,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,aAAY,GAAI,MAAA;AAC3D,UAAA,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAC,KAAA,KAAU;AACvC,YAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C,YAAA,IAAI,IAAA,EAAM;AACN,cAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,cAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,YACvB;AAAA,UACJ,CAAC,CAAA;AAED,UAAA,MAAM,MAAA,GAAS,YAAY,MAAA,GAAS,UAAA;AACpC,UAAA,OAAA,CAAQ,OAAO,YAAA,CAAa,CAAA,MAAA,EAAS,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,CAAG,CAAA;AAC9D,UAAA,OAAA,CAAQ,QAAQ,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,aAAa,CAAA;AAAA,QAC9D;AAAA,OACJ;AAAA;AAAA,MAGA;AAAA,QACI,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,QAClB,WAAA,EAAa,qBAAA;AAAA,QACb,eAAA,EAAiB,IAAA;AAAA,QACjB,UAAA,EAAY;AAAA,UACR;AAAA,YACI,IAAA,EAAM,KAAA;AAAA,YACN,WAAA,EAAa,kBAAA;AAAA,YACb,IAAA,EAAM,SAAA;AAAA,YACN,YAAA,EAAc,KAAA;AAAA,YACd,OAAA,EAAS,CAAC,GAAG,CAAA;AAAA,YACb,QAAA,EAAU;AAAA;AACd,SACJ;AAAA,QACA,cAAA,EAAgB,OAAO,OAAA,EAAS,OAAA,KAAY;AACxC,UAAA,IAAI,QAAQ,IAAA,CAAK,KAAK,KAAK,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AAC1C,YAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACzB,cAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,qBAAqB,CAAA;AAC9C,cAAA;AAAA,YACJ;AAEA,YAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,MAAA,CAAO,WAAA;AAAA,cACnC,CAAA,WAAA,EAAc,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,OAAA,CAAA;AAAA,cAC/B;AAAA,aACJ;AAEA,YAAA,IAAI,CAAC,SAAA,EAAW;AACZ,cAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,YAAY,CAAA;AACrC,cAAA;AAAA,YACJ;AAEA,YAAA,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,MAAM,EAAE,CAAA;AACxC,YAAA,OAAA,CAAQ,MAAA,CAAO,aAAa,oBAAoB,CAAA;AAChD,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,cAAc,CAAC,CAAA,IAAK,IAAI,EAAE,CAAA;AACtD,UAAA,IAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACX,YAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,iCAAiC,CAAA;AAC3D,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACrD,UAAA,IAAI,UAAU,EAAA,EAAI;AACd,YAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,MAAA,EAAS,EAAE,CAAA,WAAA,CAAa,CAAA;AAClD,YAAA;AAAA,UACJ;AAEA,UAAA,MAAM,mBAAA,GAAsBD,4BAAA,CAAqB,OAAA,EAAS,MAAA,EAAQ,uBAAuB,KAAK,CAAA;AAC9F,UAAA,IAAI,mBAAA,EAAqB;AACrB,YAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,MAAA,CAAO,WAAA;AAAA,cACnC,gBAAgB,EAAE,CAAA,GAAA,EAAM,KAAK,KAAA,CAAM,KAAK,EAAE,IAAI,CAAA,EAAA,CAAA;AAAA,cAC9C;AAAA,aACJ;AACA,YAAA,IAAI,CAAC,SAAA,EAAW;AACZ,cAAA,OAAA,CAAQ,MAAA,CAAO,UAAU,YAAY,CAAA;AACrC,cAAA;AAAA,YACJ;AAAA,UACJ;AAEA,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAChC,UAAA,MAAM,IAAA,CAAK,WAAA;AAAA,YAAY,OAAA;AAAA,YAAS,CAAC,UAC7B,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE;AAAA,WACnC;AACA,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,QAC5D;AAAA;AACJ,KACJ;AAAA,EACJ;AAAA,EAEQ,kBAAA,GAAiC;AACrC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,IAAA,IAAI;AACA,MAAA,OAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAY,IAAI,eAAe,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,EAAC;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,WAAA,CACV,OAAA,EACA,MAAA,EACa;AACb,IAAA,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU;AAClC,MAAA,MAAM,KAAA,GAAA,CAAU,KAAA,CAAM,OAAO,CAAA,IAAgC,EAAC,EAAG,GAAA;AAAA,QAC7D,CAAC,CAAA,MAAO,EAAE,GAAG,eAAA,CAAgB,CAAC,CAAA,EAAE;AAAA,OACpC;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,KAAK,KAAA,EAAM;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,YAAA,CAAa,WAAW,YAAY,CAAA;AAAA,EACxC;AACJ;AAGA,SAAS,SAAS,KAAA,EAA2B;AACzC,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,IAAI,CAAA,GAAI,CAAA;AACxE;;;ACrfA,IAAM,mBAAA,uBAA0B,GAAA,CAAI,CAAC,MAAM,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAM,CAAC,CAAA;AAEzE,IAAM,8BAAN,MAEP;AAAA,EAGI,YACqBE,cAAAA,EACnB;AADmB,IAAA,IAAA,CAAA,aAAA,GAAAA,cAAAA;AAHrB,IAAA,IAAA,CAAA,QAAA,GAAW,EAAA;AAAA,EAIR;AAAA,EAEH,eAAe,OAAA,EAA0C;AACrD,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAM,GAAI,OAAA;AAEtC,IAAA,IAAI,UAAA,KAAe,CAAA,IAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACvC,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY;AAC1C,IAAA,IAAI,gBAAgB,MAAA,EAAQ;AACxB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY;AACzC,IAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,UAAU,CAAA,EAAG;AACtC,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,QAAA,EAAS;AAC1C,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,EAAY;AAGtC,IAAA,MAAM,QAAA,GACF,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,UAAA,GAClC,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAS,CAAA,GAChC,KAAA;AAEV,IAAA,OAAO,QAAA,CACF,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAC,CAAA,CACvB,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,WAAW,WAAW,CAAC,CAAA,CACzC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EAC7C;AACJ;AChCA,IAAM,aAAA,GAAgB,IAAI,uBAAA,EAAwB;AAE3C,IAAM,UAAA,GAAyB;AAAA,EAClC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,mBAAA;AAAA,EACN,UAAA,EAAY,CAAC,aAAa,CAAA;AAAA,EAC1B,QAAA,EAAU;AAAA,IACN;AAAA,MACI,OAAA,EAASC,oCAAA;AAAA,MACT,QAAA,EAAU,IAAI,2BAAA,CAA4B,aAAa,CAAA;AAAA,MACvD,KAAA,EAAO;AAAA;AACX,GACJ;AAAA,EACA,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,sBAAA,EAAwB,wCAAA,EAAyC;AAAA,IACvE,EAAA,EAAI,EAAE,sBAAA,EAAwB,2CAAA,EAAsC;AAAA,IACpE,EAAA,EAAI,EAAE,sBAAA,EAAwB,yCAAA,EAAuC;AAAA,IACrE,EAAA,EAAI,EAAE,sBAAA,EAAwB,sCAAA,EAAuC;AAAA,IACrE,EAAA,EAAI,EAAE,sBAAA,EAAwB,sCAAA,EAAoC;AAAA,IAClE,EAAA,EAAI,EAAE,sBAAA,EAAwB,gFAAA,EAAgB;AAAA,IAC9C,EAAA,EAAI,EAAE,sBAAA,EAAwB,2DAAA,EAAe;AAAA,IAC7C,EAAA,EAAI,EAAE,sBAAA,EAAwB,wDAAA,EAAY;AAAA,IAC1C,EAAA,EAAI,EAAE,sBAAA,EAAwB,mLAAA,EAAmC;AAAA,IACjE,EAAA,EAAI,EAAE,sBAAA,EAAwB,8CAAA;AAA0C;AAEhF","file":"public-api.js","sourcesContent":["export type TodoItem = {\n id: number;\n text: string;\n completed: boolean;\n createdAt: string;\n completedAt?: string;\n dueDate?: string;\n};\n\nconst DAY_NAMES = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\nconst MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction startOfDay(date: Date): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\nexport function parseDueDate(input: string): string | null {\n const trimmed = input.trim().toLowerCase();\n const now = new Date();\n const today = startOfDay(now);\n\n if (trimmed === 'today') {\n return today.toISOString();\n }\n\n if (trimmed === 'tomorrow') {\n const d = new Date(today);\n d.setDate(d.getDate() + 1);\n return d.toISOString();\n }\n\n if (trimmed === 'yesterday') {\n const d = new Date(today);\n d.setDate(d.getDate() - 1);\n return d.toISOString();\n }\n\n if (trimmed === 'next week') {\n const d = new Date(today);\n d.setDate(d.getDate() + 7);\n return d.toISOString();\n }\n\n if (trimmed === 'next month') {\n const d = new Date(today);\n d.setMonth(d.getMonth() + 1);\n return d.toISOString();\n }\n\n const dayIndex = DAY_NAMES.indexOf(trimmed);\n if (dayIndex !== -1) {\n const d = new Date(today);\n const currentDay = d.getDay();\n let daysUntil = dayIndex - currentDay;\n if (daysUntil <= 0) daysUntil += 7;\n d.setDate(d.getDate() + daysUntil);\n return d.toISOString();\n }\n\n // Try ISO format YYYY-MM-DD\n const isoMatch = trimmed.match(/^\\d{4}-\\d{2}-\\d{2}$/);\n if (isoMatch) {\n const d = new Date(trimmed + 'T00:00:00');\n if (!isNaN(d.getTime())) {\n return startOfDay(d).toISOString();\n }\n }\n\n return null;\n}\n\nexport function formatRelativeDate(isoDate: string): string {\n const target = startOfDay(new Date(isoDate));\n const today = startOfDay(new Date());\n const diffMs = target.getTime() - today.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'due: today';\n if (diffDays === 1) return 'due: tomorrow';\n if (diffDays === -1) return 'overdue: yesterday';\n if (diffDays > 1 && diffDays <= 14) return `due: in ${diffDays} days`;\n if (diffDays < -1) return `overdue: ${Math.abs(diffDays)} days ago`;\n\n // Far future: show month + day\n const d = new Date(isoDate);\n return `due: ${MONTH_NAMES[d.getMonth()]} ${d.getDate()}`;\n}\n\nexport function isOverdue(todo: TodoItem): boolean {\n if (todo.completed || !todo.dueDate) return false;\n const target = startOfDay(new Date(todo.dueDate));\n const today = startOfDay(new Date());\n return target.getTime() < today.getTime();\n}\n\nexport function migrateTodoItem(item: any): TodoItem {\n return {\n id: item.id,\n text: item.text,\n completed: item.completed ?? false,\n createdAt: item.createdAt ?? new Date().toISOString(),\n completedAt: item.completedAt,\n dueDate: item.dueDate,\n };\n}\n\nexport function lineThroughText(text: string): string {\n return text\n .split('')\n .map((char) => char + '\\u0336')\n .join('');\n}\n","\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.2';\nexport const API_VERSION = 2;\n ","import {\n CliForegroundColor,\n CliIcon,\n CliProcessCommand,\n CliProcessorMetadata,\n CliStateConfiguration,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliConfigurationOption,\n ICliExecutionContext,\n getPluginConfigValue,\n joinShellWords,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport {\n TodoItem,\n formatRelativeDate,\n isOverdue,\n lineThroughText,\n migrateTodoItem,\n parseDueDate,\n} from '../utilities';\n\nexport class CliTodoCommandProcessor implements ICliCommandProcessor {\n command = 'todo';\n\n description = 'Manage your tasks from the terminal. Add, list, edit, complete, and remove TODO items.';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n processors?: ICliCommandProcessor[] = [];\n\n metadata?: CliProcessorMetadata = {\n icon: '📝',\n requiredCoreVersion: '>=2.0.0 <3.0.0',\n requiredCliVersion: '>=2.0.0 <3.0.0',\n };\n\n configurationOptions?: ICliConfigurationOption[] = [\n {\n key: 'showCompletedFirst',\n label: 'Show Completed First',\n description: 'List completed tasks before pending ones',\n type: 'boolean',\n defaultValue: false,\n },\n {\n key: 'confirmBeforeDelete',\n label: 'Confirm Before Delete',\n description: 'Ask for confirmation before removing tasks',\n type: 'boolean',\n defaultValue: false,\n },\n ];\n\n stateConfiguration?: CliStateConfiguration = {\n initialState: {\n todos: this.loadFromOldStorage() ?? [],\n },\n };\n\n private todos: TodoItem[] = [];\n\n getTodos(): TodoItem[] {\n return this.todos;\n }\n\n constructor() {\n this.registerSubProcessors();\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer, translator: t } = context;\n writer.writeln(t.t('cli.todo.description', this.description!));\n writer.writeln();\n writer.writeln(writer.wrapInColor(t.t('cli.todo.help.commands', 'Commands:'), CliForegroundColor.Yellow));\n writer.writeln(` ${writer.wrapInColor('todo ls', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_all', 'List all tasks')}`);\n writer.writeln(` ${writer.wrapInColor('todo ls --pending', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_pending', 'List pending tasks only')}`);\n writer.writeln(` ${writer.wrapInColor('todo ls --completed', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_completed', 'List completed tasks only')}`);\n writer.writeln(` ${writer.wrapInColor('todo ls --overdue', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.list_overdue', 'List overdue tasks only')}`);\n writer.writeln(` ${writer.wrapInColor('todo add <text>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.add', 'Add a new task')}`);\n writer.writeln(` ${writer.wrapInColor('todo add <text> --due <date>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.add_due', 'Add with due date')}`);\n writer.writeln(` ${writer.wrapInColor('todo edit <id> <new text>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.edit', 'Edit a task')}`);\n writer.writeln(` ${writer.wrapInColor('todo done <id>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.done', 'Mark a task as done')}`);\n writer.writeln(` ${writer.wrapInColor('todo toggle <id>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.toggle', 'Toggle done/undone')}`);\n writer.writeln(` ${writer.wrapInColor('todo rm <id>', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.remove', 'Remove a task')}`);\n writer.writeln(` ${writer.wrapInColor('todo rm --all', CliForegroundColor.Cyan)} ${t.t('cli.todo.help.remove_all', 'Remove all tasks')}`);\n writer.writeln();\n writer.writeln(writer.wrapInColor(t.t('cli.todo.help.due_formats', 'Due date formats:'), CliForegroundColor.Yellow));\n writer.writeln(` today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD`);\n writer.writeln();\n writer.writeln(writer.wrapInColor(t.t('cli.common.examples', 'Examples:'), CliForegroundColor.Yellow));\n writer.writeln(` todo add Buy groceries --due tomorrow`);\n writer.writeln(` todo ls --pending`);\n writer.writeln(` todo edit 3 Buy organic groceries`);\n writer.writeln(` todo done 1`);\n writer.writeln(` todo toggle 2`);\n }\n\n async initialize(context: ICliExecutionContext): Promise<void> {\n context.state\n .select<TodoItem[]>((x) => x['todos'])\n .subscribe((todos) => {\n this.todos = (todos || []).map(migrateTodoItem);\n });\n }\n\n private formatTodoLine(todo: TodoItem, writer: any): string {\n const check = todo.completed\n ? writer.wrapInColor(CliIcon.CheckIcon, CliForegroundColor.Green)\n : ' ';\n\n const text = todo.completed ? lineThroughText(todo.text) : todo.text;\n let suffix = '';\n\n if (todo.completed) {\n suffix = writer.wrapInColor(' done', CliForegroundColor.Green);\n } else if (todo.dueDate) {\n const rel = formatRelativeDate(todo.dueDate);\n const color = isOverdue(todo) ? CliForegroundColor.Red : CliForegroundColor.Yellow;\n suffix = ' ' + writer.wrapInColor(rel, color);\n }\n\n return ` [${check}] #${todo.id} - ${text}${suffix}`;\n }\n\n private registerSubProcessors(): void {\n this.processors = [\n // ── ls ──────────────────────────────────────────────\n {\n command: 'ls',\n aliases: ['list'],\n description: 'List TODO items',\n parameters: [\n {\n name: 'pending',\n description: 'Show only pending tasks',\n type: 'boolean',\n required: false,\n },\n {\n name: 'completed',\n description: 'Show only completed tasks',\n type: 'boolean',\n required: false,\n },\n {\n name: 'overdue',\n description: 'Show only overdue tasks',\n type: 'boolean',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n if (this.todos.length === 0) {\n context.writer.writeWarning('No tasks yet.');\n context.writer.writeln('Use \"todo add <text>\" to create one.');\n context.process.output([]);\n return;\n }\n\n let filtered = [...this.todos];\n const args = command.args;\n\n if (args['pending']) {\n filtered = filtered.filter((t) => !t.completed);\n } else if (args['completed']) {\n filtered = filtered.filter((t) => t.completed);\n } else if (args['overdue']) {\n filtered = filtered.filter((t) => isOverdue(t));\n }\n\n const showCompletedFirst = getPluginConfigValue(context, 'todo', 'showCompletedFirst', false);\n if (showCompletedFirst) {\n filtered.sort((a, b) => (a.completed === b.completed ? 0 : a.completed ? -1 : 1));\n }\n\n const doneCount = this.todos.filter((t) => t.completed).length;\n context.writer.writeln(\n context.writer.wrapInColor(\n `Todos (${doneCount}/${this.todos.length} done)`,\n CliForegroundColor.Cyan,\n ),\n );\n\n if (filtered.length === 0) {\n context.writer.writeln(' No matching tasks.');\n } else {\n filtered.forEach((todo) => {\n context.writer.writeln(\n this.formatTodoLine(todo, context.writer),\n );\n });\n }\n\n context.process.output(filtered);\n },\n },\n\n // ── add ─────────────────────────────────────────────\n {\n command: 'add',\n description: 'Add a new task',\n acceptsRawInput: true,\n valueRequired: true,\n parameters: [\n {\n name: 'due',\n description: 'Due date (today, tomorrow, monday..sunday, next week, next month, YYYY-MM-DD)',\n type: 'string',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n const text = joinShellWords(command.value ?? '');\n if (!text) {\n context.writer.writeError('Please provide a task description.');\n return;\n }\n\n let dueDate: string | undefined;\n const dueArg = command.args['due'];\n if (dueArg) {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(\n `Invalid due date: \"${dueArg}\". Use: today, tomorrow, monday..sunday, next week, next month, or YYYY-MM-DD.`,\n );\n return;\n }\n dueDate = parsed;\n }\n\n // The id comes from the latest saved list: two tabs\n // adding at once never get the same id\n let newItem!: TodoItem;\n await this.changeTodos(context, (todos) => {\n newItem = {\n id: nextIdOf(todos),\n text,\n completed: false,\n createdAt: new Date().toISOString(),\n dueDate,\n };\n todos.push(newItem);\n });\n\n let msg = `Added: \"${text}\"`;\n if (dueDate) {\n msg += ` (${formatRelativeDate(dueDate)})`;\n }\n context.writer.writeSuccess(msg);\n context.process.output(newItem);\n },\n },\n\n // ── edit ────────────────────────────────────────────\n {\n command: 'edit',\n description: 'Edit a task\\'s text or due date',\n acceptsRawInput: true,\n valueRequired: true,\n parameters: [\n {\n name: 'due',\n description: 'New due date (or \"none\" to remove)',\n type: 'string',\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n const [idStr = '', ...words] = command.positionals ?? [];\n const newText = words.length ? words.join(' ') : undefined;\n\n const id = parseInt(idStr, 10);\n if (isNaN(id)) {\n context.writer.writeError('Usage: todo edit <id> <new text> [--due <date>]');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const dueArg = command.args['due'];\n const edit: Partial<TodoItem> = {};\n\n if (newText) {\n edit.text = newText;\n }\n\n if (dueArg) {\n if (dueArg === 'none') {\n edit.dueDate = undefined;\n } else {\n const parsed = parseDueDate(dueArg);\n if (!parsed) {\n context.writer.writeError(`Invalid due date: \"${dueArg}\".`);\n return;\n }\n edit.dueDate = parsed;\n }\n }\n\n if (Object.keys(edit).length === 0) {\n context.writer.writeError('Nothing to update. Provide new text or --due.');\n return;\n }\n\n let updated: TodoItem | undefined;\n await this.changeTodos(context, (todos) => {\n const item = todos.find((t) => t.id === id);\n if (item) updated = Object.assign(item, edit);\n });\n context.writer.writeSuccess(`Updated task #${id}.`);\n context.process.output(updated ?? { ...todo, ...edit });\n },\n },\n\n // ── done ────────────────────────────────────────────\n {\n command: 'done',\n aliases: ['complete'],\n description: 'Mark a task as done',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (command, context) => {\n const id = parseInt(command.positionals?.[0] ?? '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n if (todo.completed) {\n context.writer.writeInfo(`Task #${id} is already done.`);\n return;\n }\n\n const completedAt = new Date().toISOString();\n await this.changeTodos(context, (todos) => {\n const item = todos.find((t) => t.id === id);\n if (item) {\n item.completed = true;\n item.completedAt = completedAt;\n }\n });\n context.writer.writeSuccess(`Done: \"${todo.text}\"`);\n context.process.output({ ...todo, completed: true, completedAt });\n },\n },\n\n // ── toggle ──────────────────────────────────────────\n {\n command: 'toggle',\n description: 'Toggle a task between done and undone',\n acceptsRawInput: true,\n valueRequired: true,\n processCommand: async (command, context) => {\n const id = parseInt(command.positionals?.[0] ?? '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const todo = this.todos.find((t) => t.id === id);\n if (!todo) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const completed = !todo.completed;\n const completedAt = completed ? new Date().toISOString() : undefined;\n await this.changeTodos(context, (todos) => {\n const item = todos.find((t) => t.id === id);\n if (item) {\n item.completed = completed;\n item.completedAt = completedAt;\n }\n });\n\n const status = completed ? 'done' : 'reopened';\n context.writer.writeSuccess(`Task #${id} marked as ${status}.`);\n context.process.output({ ...todo, completed, completedAt });\n },\n },\n\n // ── rm ──────────────────────────────────────────────\n {\n command: 'rm',\n aliases: ['remove'],\n description: 'Remove a task by ID',\n acceptsRawInput: true,\n parameters: [\n {\n name: 'all',\n description: 'Remove all tasks',\n type: 'boolean',\n defaultValue: false,\n aliases: ['a'],\n required: false,\n },\n ],\n processCommand: async (command, context) => {\n if (command.args['all'] || command.args['a']) {\n if (this.todos.length === 0) {\n context.writer.writeInfo('No tasks to remove.');\n return;\n }\n\n const confirmed = await context.reader.readConfirm(\n `Remove all ${this.todos.length} tasks?`,\n false,\n );\n\n if (!confirmed) {\n context.writer.writeInfo('Cancelled.');\n return;\n }\n\n await this.changeTodos(context, () => []);\n context.writer.writeSuccess('Removed all tasks.');\n return;\n }\n\n const id = parseInt(command.positionals?.[0] ?? '', 10);\n if (isNaN(id)) {\n context.writer.writeError('Please provide a valid task ID.');\n return;\n }\n\n const index = this.todos.findIndex((t) => t.id === id);\n if (index === -1) {\n context.writer.writeError(`Task #${id} not found.`);\n return;\n }\n\n const confirmBeforeDelete = getPluginConfigValue(context, 'todo', 'confirmBeforeDelete', false);\n if (confirmBeforeDelete) {\n const confirmed = await context.reader.readConfirm(\n `Remove task #${id}: \"${this.todos[index].text}\"?`,\n false,\n );\n if (!confirmed) {\n context.writer.writeInfo('Cancelled.');\n return;\n }\n }\n\n const removed = this.todos[index];\n await this.changeTodos(context, (todos) =>\n todos.filter((t) => t.id !== id),\n );\n context.writer.writeSuccess(`Removed: \"${removed.text}\"`);\n },\n },\n ];\n }\n\n private loadFromOldStorage(): TodoItem[] {\n const data = localStorage.getItem('todo-items');\n if (!data) return [];\n try {\n return (JSON.parse(data) as any[]).map(migrateTodoItem);\n } catch {\n return [];\n }\n }\n\n /**\n * Change the list and save it, atomically: `change` gets the latest saved\n * list (another tab may have changed it) to edit in place, or returns a\n * new one.\n */\n private async changeTodos(\n context: ICliExecutionContext,\n change: (todos: TodoItem[]) => TodoItem[] | void,\n ): Promise<void> {\n await context.state.update((state) => {\n const todos = ((state['todos'] as TodoItem[] | undefined) ?? []).map(\n (t) => ({ ...migrateTodoItem(t) }),\n );\n return { todos: change(todos) ?? todos };\n });\n localStorage.removeItem('todo-items');\n }\n}\n\n/** The id for a new task: one more than the highest. */\nfunction nextIdOf(todos: TodoItem[]): number {\n return todos.length > 0 ? Math.max(...todos.map((t) => t.id)) + 1 : 1;\n}\n","import {\n ICliCompletionProvider,\n ICliCompletionContext,\n} from '@qodalis/cli-core';\nimport { CliTodoCommandProcessor } from '../processors/cli-todo-command-processor';\n\nconst TODO_ID_SUBCOMMANDS = new Set(['rm', 'done', 'complete', 'toggle', 'edit']);\n\nexport class CliTodoIdCompletionProvider\n implements ICliCompletionProvider\n{\n priority = 50;\n\n constructor(\n private readonly todoProcessor: CliTodoCommandProcessor,\n ) {}\n\n getCompletions(context: ICliCompletionContext): string[] {\n const { tokens, tokenIndex, token } = context;\n\n if (tokenIndex !== 2 || tokens.length < 2) {\n return [];\n }\n\n const rootCommand = tokens[0].toLowerCase();\n if (rootCommand !== 'todo') {\n return [];\n }\n\n const subCommand = tokens[1].toLowerCase();\n if (!TODO_ID_SUBCOMMANDS.has(subCommand)) {\n return [];\n }\n\n const todos = this.todoProcessor.getTodos();\n const lowerPrefix = token.toLowerCase();\n\n // For 'done' and 'complete', only show non-completed todos\n const filtered =\n subCommand === 'done' || subCommand === 'complete'\n ? todos.filter((t) => !t.completed)\n : todos;\n\n return filtered\n .map((t) => String(t.id))\n .filter((id) => id.startsWith(lowerPrefix))\n .sort((a, b) => Number(a) - Number(b));\n }\n}\n","/*\n * Public API Surface of todo\n */\n\nexport * from './lib/utilities';\nexport * from './lib/processors/cli-todo-command-processor';\nexport * from './lib/completion/cli-todo-id-completion-provider';\n\nimport {\n ICliModule,\n ICliCompletionProvider_TOKEN,\n} from '@qodalis/cli-core';\nimport { CliTodoCommandProcessor } from './lib/processors/cli-todo-command-processor';\nimport { CliTodoIdCompletionProvider } from './lib/completion/cli-todo-id-completion-provider';\nimport { API_VERSION } from './lib/version';\n\nconst todoProcessor = new CliTodoCommandProcessor();\n\nexport const todoModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-todo',\n processors: [todoProcessor],\n services: [\n {\n provide: ICliCompletionProvider_TOKEN,\n useValue: new CliTodoIdCompletionProvider(todoProcessor),\n multi: true,\n },\n ],\n translations: {\n es: { 'cli.todo.description': 'Gestionar tus tareas desde la terminal' },\n fr: { 'cli.todo.description': 'Gérer vos tâches depuis le terminal' },\n de: { 'cli.todo.description': 'Aufgaben über das Terminal verwalten' },\n pt: { 'cli.todo.description': 'Gerenciar suas tarefas pelo terminal' },\n it: { 'cli.todo.description': 'Gestire le attività dal terminale' },\n ja: { 'cli.todo.description': 'ターミナルからタスクを管理' },\n ko: { 'cli.todo.description': '터미널에서 할 일 관리' },\n zh: { 'cli.todo.description': '从终端管理你的任务' },\n ru: { 'cli.todo.description': 'Управление задачами из терминала' },\n ro: { 'cli.todo.description': 'Gestionează sarcinile tale din terminal' },\n },\n};\n"]}
|