@yakirmar/mcp-toggl 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +268 -0
- package/dist/cache-manager.d.ts +43 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +484 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1264 -0
- package/dist/index.js.map +1 -0
- package/dist/timeline.d.ts +24 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +55 -0
- package/dist/timeline.js.map +1 -0
- package/dist/toggl-api.d.ts +55 -0
- package/dist/toggl-api.d.ts.map +1 -0
- package/dist/toggl-api.js +402 -0
- package/dist/toggl-api.js.map +1 -0
- package/dist/types.d.ts +268 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +48 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +439 -0
- package/dist/utils.js.map +1 -0
- package/dist/workspace.d.ts +22 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +65 -0
- package/dist/workspace.js.map +1 -0
- package/docs/images/drift-detection.svg +82 -0
- package/docs/images/monthly-heatmap.svg +124 -0
- package/docs/images/weekly-recap.svg +97 -0
- package/package.json +75 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Very Good Plugins
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# MCP Toggl
|
|
2
|
+
|
|
3
|
+
> Talk to your time tracking. Pull reports, start timers, inspect desktop activity, and turn raw Toggl data into useful recaps from Claude or any MCP-compatible client.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@yakirmar/mcp-toggl)
|
|
6
|
+
[](https://modelcontextprotocol.io)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://developers.track.toggl.com/docs/)
|
|
9
|
+
|
|
10
|
+
> **This is a fork** of [`@verygoodplugins/mcp-toggl`](https://github.com/verygoodplugins/mcp-toggl), published as `@yakirmar/mcp-toggl`. It adds full **write and cleanup** support for time entries — see [Fork Additions](#fork-additions).
|
|
11
|
+
|
|
12
|
+
## Fork Additions
|
|
13
|
+
|
|
14
|
+
Upstream can read entries and start/stop timers, but it cannot log past work or remove a mistaken entry. This fork adds three tools that close that loop:
|
|
15
|
+
|
|
16
|
+
| Tool | Why it exists |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| `toggl_create_entry` | Log work you already did — a completed entry on a project or client, with a start time plus either an end time or a length in minutes. Upstream could only start a *running* timer. |
|
|
19
|
+
| `toggl_search_entries` | Find entries (and, crucially, their `id`) by description, project name, client name, tag, time window, or duration. The `id` is what you need to delete something. |
|
|
20
|
+
| `toggl_delete_entry` | Remove an entry by `id`. Pair with `toggl_search_entries` when you don't already know it. |
|
|
21
|
+
|
|
22
|
+
Together these let you say things like *"log 2 hours on the Website project for yesterday's client call"* or *"find the duplicate standup entry from last week and delete it"*.
|
|
23
|
+
|
|
24
|
+
**Timezone handling:** datetimes accept an explicit offset (`2026-07-11T09:00:00Z`, `...+03:00`) for an absolute time. Without an offset — including a bare `YYYY-MM-DD` — the time is interpreted in **the timezone of the machine running the server**.
|
|
25
|
+
|
|
26
|
+
## See What Your Week Actually Looked Like
|
|
27
|
+
|
|
28
|
+
> You ask: "Give me the recap of my week"
|
|
29
|
+
|
|
30
|
+
The MCP server returns hydrated time entries with project, workspace, client, tag, and running-timer context. Your client can turn that into a readable recap:
|
|
31
|
+
|
|
32
|
+
> 32.7 hours across 31 entries and 7 projects. Monday was a light planning day, Tuesday had the long implementation block, Wednesday stayed focused on one project, and Friday turned into a shipping run. The top project took 27% of the week, with two smaller projects close behind.
|
|
33
|
+
|
|
34
|
+

|
|
35
|
+
|
|
36
|
+
The server does not hard-code this prose or chart. It exposes structured Toggl data in a shape that makes synthesis easy.
|
|
37
|
+
|
|
38
|
+
## Catch the Drift
|
|
39
|
+
|
|
40
|
+
> You ask: "Did I actually work on what I said I worked on for that PR review entry?"
|
|
41
|
+
|
|
42
|
+
`toggl_get_timeline` can compare a tracked entry boundary with Toggl Track Desktop activity:
|
|
43
|
+
|
|
44
|
+
> The entry ran 1h 33m. About 67 minutes were in review tools, 5 minutes were scattered across chat apps, and the rest was idle or trimmed timeline space. The entry mostly checks out.
|
|
45
|
+
|
|
46
|
+

|
|
47
|
+
|
|
48
|
+
This is useful before invoicing, after long context-switching days, or whenever a vague entry like "admin" starts hiding too much Slack and browser time.
|
|
49
|
+
|
|
50
|
+
## See Patterns Over Time
|
|
51
|
+
|
|
52
|
+
> You ask: "Show me last month at a glance"
|
|
53
|
+
|
|
54
|
+
Daily and weekly report tools make it straightforward for the client to render heatmaps, spot streaks, and surface intensity changes:
|
|
55
|
+
|
|
56
|
+

|
|
57
|
+
|
|
58
|
+
Toggl is still the source of truth. The MCP layer makes the data easier for an agent to inspect, summarize, and visualize.
|
|
59
|
+
|
|
60
|
+
## Things You Can Ask
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
What am I currently tracking?
|
|
64
|
+
How much time did I spend on the website project this month?
|
|
65
|
+
Start a timer for "PR review" on the Platform project
|
|
66
|
+
Log 2 hours yesterday on the Website project for "client call"
|
|
67
|
+
Find the entries I logged for "standup" last week
|
|
68
|
+
Delete the duplicate entry I created this morning
|
|
69
|
+
Show me yesterday's hours as a chart
|
|
70
|
+
What apps did I use most today?
|
|
71
|
+
Generate a daily report for last Friday
|
|
72
|
+
Compare this week to last week by project
|
|
73
|
+
Which day this month had the most billable work?
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Chart prompts depend on your MCP client. The server returns the structured data; clients such as Claude decide how to render it.
|
|
77
|
+
|
|
78
|
+
## What Makes This Useful
|
|
79
|
+
|
|
80
|
+
**Hydrated responses**: time entries are enriched with `project_name`, `client_name`, `workspace_name`, `tag_names`, and normalized running-timer fields so the client does not need a second lookup for ordinary reporting.
|
|
81
|
+
|
|
82
|
+
**Smart caching**: workspaces, projects, clients, tasks, and tags are cached after first read. `toggl_cache_stats` shows hits, misses, loaded entities, and hit rate.
|
|
83
|
+
|
|
84
|
+
**Desktop activity timeline**: `toggl_get_timeline` summarizes app usage from Toggl Track Desktop and can return raw events when you need sequence analysis.
|
|
85
|
+
|
|
86
|
+
**Privacy controls**: timeline calls support summary-only output with `include_events: false` and title redaction with `redact_titles: true`.
|
|
87
|
+
|
|
88
|
+
**Period shortcuts**: `today`, `yesterday`, `week`, `lastWeek`, `month`, and `lastMonth` are supported on the tools where those periods make sense.
|
|
89
|
+
|
|
90
|
+
**Recoverable errors**: workspace resolution errors include `available_workspaces`, and Toggl quota/rate-limit errors include structured retry hints.
|
|
91
|
+
|
|
92
|
+
## Quick Start
|
|
93
|
+
|
|
94
|
+
### Prerequisites
|
|
95
|
+
|
|
96
|
+
- Node.js `^20.19.0` or `>=22.12.0`
|
|
97
|
+
- A Toggl Track account
|
|
98
|
+
- Your Toggl API token from [track.toggl.com/profile](https://track.toggl.com/profile)
|
|
99
|
+
|
|
100
|
+
### Claude Desktop
|
|
101
|
+
|
|
102
|
+
Add this to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"mcpServers": {
|
|
107
|
+
"mcp-toggl": {
|
|
108
|
+
"command": "npx",
|
|
109
|
+
"args": ["-y", "@yakirmar/mcp-toggl@latest"],
|
|
110
|
+
"env": {
|
|
111
|
+
"TOGGL_API_KEY": "your_api_key_here",
|
|
112
|
+
"TOGGL_DEFAULT_WORKSPACE_ID": "123456"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`TOGGL_DEFAULT_WORKSPACE_ID` is optional. If you have exactly one Toggl workspace, the server can resolve it automatically. If you have multiple workspaces and do not set a default, workspace-scoped tools return the available workspace IDs so the client can retry with `workspace_id`.
|
|
120
|
+
|
|
121
|
+
Restart Claude Desktop, then ask:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
What am I currently tracking?
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Global Install
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm install -g @yakirmar/mcp-toggl
|
|
131
|
+
mcp-toggl --help
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Tools
|
|
135
|
+
|
|
136
|
+
### Reports and Insights
|
|
137
|
+
|
|
138
|
+
| Tool | What it does |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| `toggl_daily_report` | Hours by project and workspace for a date. Use `format: "text"` for display text or `"json"` for structured output. |
|
|
141
|
+
| `toggl_weekly_report` | 7-day breakdown with daily totals and project rollups. Use `week_offset: -1` for last week. |
|
|
142
|
+
| `toggl_get_time_entries` | Raw hydrated entries by period, date range, workspace, or project. |
|
|
143
|
+
| `toggl_get_timeline` | Toggl Track Desktop app usage summary with optional raw events. |
|
|
144
|
+
|
|
145
|
+
### Timer Control
|
|
146
|
+
|
|
147
|
+
| Tool | What it does |
|
|
148
|
+
| --- | --- |
|
|
149
|
+
| `toggl_get_current_entry` | Returns the running timer, elapsed seconds, and hydrated project/workspace context. |
|
|
150
|
+
| `toggl_start_timer` | Starts a timer with description, optional project/task, and tags. |
|
|
151
|
+
| `toggl_stop_timer` | Stops the currently running timer. |
|
|
152
|
+
|
|
153
|
+
### Entry Management
|
|
154
|
+
|
|
155
|
+
Added by this fork. See [Fork Additions](#fork-additions).
|
|
156
|
+
|
|
157
|
+
| Tool | What it does |
|
|
158
|
+
| --- | --- |
|
|
159
|
+
| `toggl_create_entry` | Creates a completed (past) entry. Takes `start` plus exactly one of `end` or `duration_minutes`, with optional `description`, `project_id`, `client_id`, `task_id`, `tags`, and `billable`. |
|
|
160
|
+
| `toggl_search_entries` | Searches entries and returns matches **with their `id`**. Filters combine with AND and include `description`, `project_name`, `client_name`, `tag`, `project_id`, `client_id`, `workspace_id`, `billable`, `start_after`/`start_before`, and `min_duration_minutes`/`max_duration_minutes`. |
|
|
161
|
+
| `toggl_delete_entry` | Deletes an entry by `time_entry_id`. `workspace_id` is optional — it is resolved from the entry when omitted. Irreversible. |
|
|
162
|
+
|
|
163
|
+
**Attaching to a project or client:** Toggl attaches entries to a *project*, not a client directly. If you pass a `client_id` without a `project_id`, the client must have exactly one project (it is resolved for you); when a client has several projects, the tool returns the candidates and asks for a `project_id`.
|
|
164
|
+
|
|
165
|
+
**Searching:** the date window defaults to roughly the last 31 days. Widen it with `period` (`today`, `week`, `lastMonth`, …) or explicit `start_date`/`end_date`. Results are hydrated with names and sorted newest-first (`limit` defaults to 50, max 1000).
|
|
166
|
+
|
|
167
|
+
### Lookups
|
|
168
|
+
|
|
169
|
+
| Tool | What it does |
|
|
170
|
+
| --- | --- |
|
|
171
|
+
| `toggl_check_auth` | Verifies token access and lists available workspaces without exposing the token. |
|
|
172
|
+
| `toggl_list_workspaces` | Lists all accessible workspaces. |
|
|
173
|
+
| `toggl_list_projects` | Lists projects for a workspace using cache-backed reads after first fetch. |
|
|
174
|
+
| `toggl_list_clients` | Lists clients for a workspace using cache-backed reads after first fetch. |
|
|
175
|
+
|
|
176
|
+
### Cache Management
|
|
177
|
+
|
|
178
|
+
| Tool | What it does |
|
|
179
|
+
| --- | --- |
|
|
180
|
+
| `toggl_warm_cache` | Pre-fetches workspace, project, client, and tag data before a heavy reporting session. |
|
|
181
|
+
| `toggl_cache_stats` | Returns hits, misses, hit rate, loaded entity counts, and warm-cache state. |
|
|
182
|
+
| `toggl_clear_cache` | Clears cached data. Useful after creating or renaming Toggl entities. |
|
|
183
|
+
|
|
184
|
+
### Summaries
|
|
185
|
+
|
|
186
|
+
| Tool | What it does |
|
|
187
|
+
| --- | --- |
|
|
188
|
+
| `toggl_project_summary` | Total hours per project for a period or date range. |
|
|
189
|
+
| `toggl_workspace_summary` | Total hours per workspace for a period or date range. |
|
|
190
|
+
|
|
191
|
+
## Timeline Privacy
|
|
192
|
+
|
|
193
|
+
Toggl Track Desktop activity can include window titles. Those titles may contain document names, email subjects, chat text, URLs, OAuth pages, or database names.
|
|
194
|
+
|
|
195
|
+
Summary-only mode returns app totals without raw events:
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
{
|
|
199
|
+
"period": "today",
|
|
200
|
+
"include_events": false
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Events with redacted titles preserve sequence and duration but remove titles:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"period": "today",
|
|
209
|
+
"redact_titles": true,
|
|
210
|
+
"limit": 50
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Full event mode is the default:
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{
|
|
218
|
+
"period": "today"
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
When in doubt, use `include_events: false`.
|
|
223
|
+
|
|
224
|
+
## Configuration Reference
|
|
225
|
+
|
|
226
|
+
| Env var | Required | Default | Notes |
|
|
227
|
+
| --- | --- | --- | --- |
|
|
228
|
+
| `TOGGL_API_KEY` | Yes | - | Preferred env var for your Toggl API token. |
|
|
229
|
+
| `TOGGL_API_TOKEN` | No | - | Supported alias for backwards compatibility. `TOGGL_API_KEY` is preferred. |
|
|
230
|
+
| `TOGGL_TOKEN` | No | - | Supported alias for backwards compatibility. `TOGGL_API_KEY` is preferred. |
|
|
231
|
+
| `TOGGL_DEFAULT_WORKSPACE_ID` | No | - | Used when a tool requires a workspace and none is passed. |
|
|
232
|
+
| `TOGGL_CACHE_TTL` | No | `3600000` | Cache TTL in milliseconds. Default is 1 hour. |
|
|
233
|
+
| `TOGGL_CACHE_SIZE` | No | `1000` | Maximum cached entity budget. |
|
|
234
|
+
| `TOGGL_BATCH_SIZE` | No | `100` | Batch size used by API pagination helpers. |
|
|
235
|
+
|
|
236
|
+
## Caveats
|
|
237
|
+
|
|
238
|
+
**Toggl rate limits and quotas**: Toggl may return rate-limit or quota errors during chatty sessions. The server returns structured retry information when Toggl provides it. Warm the cache before large reporting sessions to avoid repeated project/client/tag fetches.
|
|
239
|
+
|
|
240
|
+
**Running timer duration**: Toggl uses negative duration values for running entries. Read `running` and `elapsed_seconds` from the hydrated response instead.
|
|
241
|
+
|
|
242
|
+
**Timeline availability**: `toggl_get_timeline` requires Toggl Track Desktop timeline sync. If it is not enabled or has not uploaded data yet, the tool returns `enabled: false` with setup guidance.
|
|
243
|
+
|
|
244
|
+
**Timeline totals**: `limit` only limits returned raw events. `summary`, `total_seconds`, and `total_hours` are calculated from all matching events.
|
|
245
|
+
|
|
246
|
+
## Local Development
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
git clone https://github.com/yakirmar/mcp-toggl.git
|
|
250
|
+
cd mcp-toggl
|
|
251
|
+
npm install
|
|
252
|
+
npm run build
|
|
253
|
+
npm test
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Useful commands:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
npm run dev
|
|
260
|
+
npm run lint
|
|
261
|
+
npm run format
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## License
|
|
265
|
+
|
|
266
|
+
MIT.
|
|
267
|
+
|
|
268
|
+
Originally built by [Very Good Plugins](https://verygoodplugins.com). This fork is maintained at [yakirmar/mcp-toggl](https://github.com/yakirmar/mcp-toggl).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Workspace, Project, Client, Task, User, Tag, TimeEntry, HydratedTimeEntry, CacheStats, CacheConfig } from './types.js';
|
|
2
|
+
export declare class CacheManager {
|
|
3
|
+
private workspaces;
|
|
4
|
+
private projects;
|
|
5
|
+
private clients;
|
|
6
|
+
private tasks;
|
|
7
|
+
private users;
|
|
8
|
+
private tags;
|
|
9
|
+
private workspaceList;
|
|
10
|
+
private projectsByWorkspace;
|
|
11
|
+
private clientsByWorkspace;
|
|
12
|
+
private tagsByWorkspace;
|
|
13
|
+
private stats;
|
|
14
|
+
private config;
|
|
15
|
+
private api;
|
|
16
|
+
constructor(config: CacheConfig);
|
|
17
|
+
setAPI(api: any): void;
|
|
18
|
+
private isValid;
|
|
19
|
+
private getCached;
|
|
20
|
+
private getCachedCollection;
|
|
21
|
+
private cacheBucketLimit;
|
|
22
|
+
private setCached;
|
|
23
|
+
private setCachedCollection;
|
|
24
|
+
private setWorkspaceList;
|
|
25
|
+
getWorkspace(id: number | undefined): Promise<Workspace | null>;
|
|
26
|
+
getWorkspaces(): Promise<Workspace[]>;
|
|
27
|
+
getProject(id: number, workspaceId?: number): Promise<Project | null>;
|
|
28
|
+
getProjects(workspaceId: number): Promise<Project[]>;
|
|
29
|
+
getClient(id: number, workspaceId?: number): Promise<Client | null>;
|
|
30
|
+
getClients(workspaceId: number): Promise<Client[]>;
|
|
31
|
+
getTask(id: number, workspaceId: number, projectId: number): Promise<Task | null>;
|
|
32
|
+
getTasks(workspaceId: number, projectId: number): Promise<Task[]>;
|
|
33
|
+
getUser(id: number): Promise<User | null>;
|
|
34
|
+
getTag(id: number, workspaceId: number): Promise<Tag | null>;
|
|
35
|
+
getTags(workspaceId: number): Promise<Tag[]>;
|
|
36
|
+
warmCache(workspaceId?: number): Promise<void>;
|
|
37
|
+
private normalizeTimeEntry;
|
|
38
|
+
hydrateTimeEntries(entries: TimeEntry[]): Promise<HydratedTimeEntry[]>;
|
|
39
|
+
clearCache(): void;
|
|
40
|
+
getStats(): CacheStats;
|
|
41
|
+
pruneExpired(): void;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=cache-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,SAAS,EACT,iBAAiB,EAEjB,UAAU,EACV,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAiD;IACnE,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,IAAI,CAA2C;IACvD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,mBAAmB,CAAiD;IAC5E,OAAO,CAAC,kBAAkB,CAAgD;IAC1E,OAAO,CAAC,eAAe,CAA6C;IAGpE,OAAO,CAAC,KAAK,CAIX;IAEF,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAM;gBAEL,MAAM,EAAE,WAAW;IAI/B,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAKtB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,gBAAgB;IAYlB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAmB/D,aAAa,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAqBrC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAuBrE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAqBpD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuBnE,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqBlD,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAkBjF,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAiBjE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAmBzC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAe5D,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAqB5C,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BpD,OAAO,CAAC,kBAAkB;IA0BpB,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAsD5E,UAAU,IAAI,IAAI;IAmBlB,QAAQ,IAAI,UAAU;IAetB,YAAY,IAAI,IAAI;CAmCrB"}
|