@teeras/afterhours 0.1.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +101 -15
  2. package/dist/activity.d.ts +35 -1
  3. package/dist/activity.d.ts.map +1 -1
  4. package/dist/activity.js +148 -1
  5. package/dist/activity.js.map +1 -1
  6. package/dist/autosync.d.ts +22 -0
  7. package/dist/autosync.d.ts.map +1 -0
  8. package/dist/autosync.js +85 -0
  9. package/dist/autosync.js.map +1 -0
  10. package/dist/cli.js +112 -9
  11. package/dist/cli.js.map +1 -1
  12. package/dist/cloud.d.ts +5 -0
  13. package/dist/cloud.d.ts.map +1 -1
  14. package/dist/cloud.js +10 -2
  15. package/dist/cloud.js.map +1 -1
  16. package/dist/collect.d.ts +3 -1
  17. package/dist/collect.d.ts.map +1 -1
  18. package/dist/collect.js +19 -7
  19. package/dist/collect.js.map +1 -1
  20. package/dist/detect.d.ts.map +1 -1
  21. package/dist/detect.js +35 -6
  22. package/dist/detect.js.map +1 -1
  23. package/dist/hooks.d.ts +29 -0
  24. package/dist/hooks.d.ts.map +1 -0
  25. package/dist/hooks.js +196 -0
  26. package/dist/hooks.js.map +1 -0
  27. package/dist/index.d.ts +9 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +8 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/install.d.ts +25 -0
  32. package/dist/install.d.ts.map +1 -0
  33. package/dist/install.js +155 -0
  34. package/dist/install.js.map +1 -0
  35. package/dist/moments.d.ts +21 -0
  36. package/dist/moments.d.ts.map +1 -0
  37. package/dist/moments.js +52 -0
  38. package/dist/moments.js.map +1 -0
  39. package/dist/off.d.ts +24 -0
  40. package/dist/off.d.ts.map +1 -0
  41. package/dist/off.js +36 -0
  42. package/dist/off.js.map +1 -0
  43. package/dist/privacy.d.ts +8 -0
  44. package/dist/privacy.d.ts.map +1 -1
  45. package/dist/privacy.js +27 -1
  46. package/dist/privacy.js.map +1 -1
  47. package/dist/qr.d.ts +29 -0
  48. package/dist/qr.d.ts.map +1 -0
  49. package/dist/qr.js +92 -0
  50. package/dist/qr.js.map +1 -0
  51. package/dist/render.d.ts.map +1 -1
  52. package/dist/render.js +61 -1
  53. package/dist/render.js.map +1 -1
  54. package/dist/report.d.ts.map +1 -1
  55. package/dist/report.js +115 -1
  56. package/dist/report.js.map +1 -1
  57. package/dist/runtime.d.ts +18 -0
  58. package/dist/runtime.d.ts.map +1 -0
  59. package/dist/runtime.js +70 -0
  60. package/dist/runtime.js.map +1 -0
  61. package/dist/secret.d.ts +9 -0
  62. package/dist/secret.d.ts.map +1 -0
  63. package/dist/secret.js +32 -0
  64. package/dist/secret.js.map +1 -0
  65. package/dist/setup.d.ts +18 -0
  66. package/dist/setup.d.ts.map +1 -0
  67. package/dist/setup.js +155 -0
  68. package/dist/setup.js.map +1 -0
  69. package/dist/sources/claude.d.ts.map +1 -1
  70. package/dist/sources/claude.js +162 -18
  71. package/dist/sources/claude.js.map +1 -1
  72. package/dist/sources/codex.d.ts.map +1 -1
  73. package/dist/sources/codex.js +240 -21
  74. package/dist/sources/codex.js.map +1 -1
  75. package/dist/sources/cursor.d.ts.map +1 -1
  76. package/dist/sources/cursor.js +1 -0
  77. package/dist/sources/cursor.js.map +1 -1
  78. package/dist/sources/gemini.d.ts.map +1 -1
  79. package/dist/sources/gemini.js +85 -8
  80. package/dist/sources/gemini.js.map +1 -1
  81. package/dist/types.d.ts +109 -6
  82. package/dist/types.d.ts.map +1 -1
  83. package/llms-install.md +29 -0
  84. package/package.json +3 -2
package/dist/setup.js ADDED
@@ -0,0 +1,155 @@
1
+ import { homedir } from "node:os";
2
+ import { ConnectionExpiredError, openVerificationUri, pollDeviceLogin, readCredentials, removeCredentials, startDeviceLogin, syncSnapshot, teerasBaseUrl, writeCredentials, } from "./cloud.js";
3
+ import { collectAfterhours } from "./collect.js";
4
+ import { installHooks } from "./install.js";
5
+ import { tildePath } from "./privacy.js";
6
+ import { qrBlock } from "./qr.js";
7
+ import { renderReport } from "./render.js";
8
+ import { reportFrom } from "./report.js";
9
+ import { hookCommand, installRuntime } from "./runtime.js";
10
+ import { markSyncSuccess } from "./autosync.js";
11
+ /**
12
+ * "Connected" used to mean three different things at once here — account
13
+ * signed in, hooks installed, an agent detected — which made the screen
14
+ * unreadable at a glance. The account gets its own word ("signed in"); an
15
+ * agent is `measuring` once its hooks are in place, or `not found` if the
16
+ * agent itself never showed up. One agent per line: a separator between
17
+ * agents reads as another state when a state is two words.
18
+ *
19
+ * The `agents` label is printed once and the rest of the block indented under
20
+ * it, so the column reads like the single `hooks`/`sync` rows around it
21
+ * rather than like a repeated key.
22
+ */
23
+ function hookLine(results) {
24
+ const label = (result) => result.agent === "claude-code" ? "Claude Code" : "Codex";
25
+ const state = (result) => {
26
+ switch (result.action) {
27
+ case "skipped":
28
+ return "not found";
29
+ case "installed":
30
+ case "already-installed":
31
+ return "measuring";
32
+ case "unreadable":
33
+ return "settings file unreadable, left untouched";
34
+ }
35
+ };
36
+ return results.map((result, index) => ` ${index === 0 ? "agents" : " "} ${label(result).padEnd(12)}${state(result)}`);
37
+ }
38
+ /**
39
+ * The text output is written to be quoted verbatim by a coding agent to its
40
+ * user. Keep every line meaningful when read on a phone, out of context.
41
+ */
42
+ export async function runSetup(options = {}) {
43
+ const home = options.home ?? homedir();
44
+ const json = options.json === true;
45
+ const out = options.out ?? ((text) => process.stdout.write(text));
46
+ const openUri = options.openUri ?? openVerificationUri;
47
+ const isTty = options.isTty ?? process.stdout.isTTY === true;
48
+ // Hooks must survive the npx temp directory, so the runtime is copied into
49
+ // the home first and the fragments point at that absolute path. A hook we
50
+ // cannot run is silent, missing measurement — refuse rather than report it.
51
+ let cliPath;
52
+ try {
53
+ cliPath = installRuntime(home, options.runtimeSourceDir);
54
+ }
55
+ catch (error) {
56
+ // The reason has to survive — "check that your home directory is
57
+ // writable" is wrong guidance for a full disk, and a bare failure with no
58
+ // reason at all is unfixable. `error.code` (EACCES/ENOSPC/EROFS) is both
59
+ // the most diagnostic part and the part that carries no path; when there
60
+ // is no code, the message goes through `tildePath` so a home prefix
61
+ // cannot ride along into a transcript.
62
+ const code = error?.code;
63
+ const reason = typeof code === "string" && code.length > 0
64
+ ? code
65
+ : tildePath(error instanceof Error ? error.message : String(error), home);
66
+ throw new Error(`could not install the local hook command (${reason}). Nothing was changed. EACCES or EROFS means ~/.teeras is not writable; ENOSPC means the disk is full. Clear that, then run \`npx @teeras/afterhours@latest setup\` again.`);
67
+ }
68
+ const hooks = installHooks(home, {
69
+ claude: hookCommand(cliPath),
70
+ codex: hookCommand(cliPath, true),
71
+ });
72
+ if (json) {
73
+ const redacted = hooks.map((result) => ({ ...result, path: tildePath(result.path, home) }));
74
+ out(`${JSON.stringify({ event: "hooks", results: redacted })}\n`);
75
+ }
76
+ // Collected once and reused for both the sync payload and the closing
77
+ // report — the same counts back the ask and the payoff in one breath.
78
+ const snapshot = collectAfterhours({ home });
79
+ let credentials = readCredentials(home);
80
+ let alreadyConnected = false;
81
+ if (credentials) {
82
+ try {
83
+ await syncSnapshot(snapshot, credentials, options.fetcher);
84
+ alreadyConnected = true;
85
+ }
86
+ catch (error) {
87
+ if (!(error instanceof ConnectionExpiredError))
88
+ throw error;
89
+ // The server rejected a token that still looks valid locally. Clear it
90
+ // and reconnect in this same run — setup must never dead-end on stale
91
+ // state or bounce the user to another command.
92
+ removeCredentials(home);
93
+ credentials = null;
94
+ if (json)
95
+ out(`${JSON.stringify({ event: "reconnect", reason: "connection expired" })}\n`);
96
+ else
97
+ out("\n your previous connection expired — reconnecting…\n");
98
+ }
99
+ }
100
+ if (!credentials) {
101
+ const baseUrl = teerasBaseUrl();
102
+ const grant = await startDeviceLogin(baseUrl, options.fetcher);
103
+ if (json) {
104
+ out(`${JSON.stringify({ event: "code", userCode: grant.userCode, verificationUri: grant.verificationUri, expiresIn: grant.expiresIn })}\n`);
105
+ }
106
+ else {
107
+ const host = new URL(grant.verificationUri).host;
108
+ out([
109
+ "",
110
+ " teeras · one tap to connect",
111
+ "",
112
+ " On this computer: open",
113
+ ` ${grant.verificationUri}`,
114
+ " then approve. (Sign in with Google if asked.)",
115
+ "",
116
+ ` On your phone instead: go to ${host}/connect and enter ${grant.userCode}`,
117
+ "",
118
+ " While you work, agent activity counts (never content) sync to your Teeras account.",
119
+ " Waiting here while you continue…",
120
+ "",
121
+ ].join("\n"));
122
+ openUri(grant.verificationUri);
123
+ }
124
+ const token = await pollDeviceLogin(baseUrl, grant, { fetcher: options.fetcher, sleep: options.sleep });
125
+ credentials = {
126
+ baseUrl,
127
+ accessToken: token.accessToken,
128
+ deviceId: token.deviceId,
129
+ connectedAt: new Date().toISOString(),
130
+ expiresAt: token.expiresAt,
131
+ };
132
+ writeCredentials(credentials, home);
133
+ await syncSnapshot(snapshot, credentials, options.fetcher);
134
+ }
135
+ markSyncSuccess(home);
136
+ if (json) {
137
+ out(`${JSON.stringify({ event: "connected", alreadyConnected, deviceId: credentials.deviceId, firstSync: !alreadyConnected })}\n`);
138
+ return;
139
+ }
140
+ // The payoff, not just a status line: the same week report `trs week`
141
+ // prints, so the value lands in the same breath as the ask.
142
+ out(renderReport(snapshot, reportFrom(snapshot)));
143
+ out([
144
+ "",
145
+ alreadyConnected ? " ✓ signed in — refreshed your setup" : " ✓ signed in",
146
+ "",
147
+ ...hookLine(hooks),
148
+ " hooks load when an agent starts, so measuring begins with your next session — not this one.",
149
+ " sync your counts-only week is on web and mobile · updates while you work",
150
+ "",
151
+ ...qrBlock(isTty),
152
+ "",
153
+ ].join("\n"));
154
+ }
155
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAUjD,eAAO,MAAM,YAAY,EAAE,aA2C1B,CAAC"}
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAiB9D,eAAO,MAAM,YAAY,EAAE,aAkL1B,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { readFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { emptySource, finiteNumber, finishSource, inWindow, timestamp } from "../activity.js";
2
+ import { homedir } from "node:os";
3
+ import { basename, isAbsolute, join, resolve, sep } from "node:path";
4
+ import { addToken, delegationEpisode, emptySource, finishSource, humanWaitSamples, inWindow, latencyStats, modelActivityFrom, opaqueEpisodeId, optionalFiniteNumber, timestamp, } from "../activity.js";
4
5
  import { isDirectory, recentFiles } from "../files.js";
6
+ import { readContentFreeHookEvents } from "../hooks.js";
5
7
  import { parseLines, record } from "./shared.js";
6
8
  function isHumanMessage(message) {
7
9
  const content = message.content;
@@ -11,16 +13,27 @@ function isHumanMessage(message) {
11
13
  return false;
12
14
  return content.some((part) => record(part)?.type !== "tool_result");
13
15
  }
16
+ function claudeRoots(home) {
17
+ const roots = [join(home, ".claude")];
18
+ const configured = process.env.CLAUDE_CONFIG_DIR?.trim();
19
+ if (home === homedir() && configured && isAbsolute(configured))
20
+ roots.push(configured);
21
+ return [...new Set(roots.map((root) => resolve(root)))];
22
+ }
14
23
  export const claudeSource = {
15
24
  id: "claude-code",
16
25
  name: "Claude Code",
17
- collect({ home, sinceMs, untilMs }) {
18
- const root = join(home, ".claude");
19
- const source = emptySource("claude-code", "Claude Code", isDirectory(root));
26
+ version: "claude-code-v3",
27
+ collect({ home, sinceMs, untilMs, episodeKeySecret }) {
28
+ const roots = claudeRoots(home);
29
+ const source = emptySource("claude-code", "Claude Code", roots.some(isDirectory));
20
30
  if (!source.configured)
21
31
  return source;
22
32
  const events = [];
23
- for (const path of recentFiles(join(root, "projects"), sinceMs, (name) => name.endsWith(".jsonl"))) {
33
+ const modelTurnEvents = [];
34
+ const episodeIds = new Set();
35
+ for (const path of roots.flatMap((root) => recentFiles(join(root, "projects"), sinceMs, (name) => name.endsWith(".jsonl")))
36
+ .filter((path) => !path.includes(`${sep}subagents${sep}`))) {
24
37
  let rows;
25
38
  try {
26
39
  rows = parseLines(readFileSync(path, "utf8"));
@@ -28,34 +41,165 @@ export const claudeSource = {
28
41
  catch {
29
42
  continue;
30
43
  }
31
- let used = false;
44
+ const humanEvents = [];
45
+ const completedEvents = [];
46
+ const assistantEvents = [];
47
+ const turnDurationSamples = [];
48
+ const sessionTokens = { input: null, cached: null, output: null, reasoning: null };
49
+ let modelFamily = null;
32
50
  for (const row of rows) {
33
51
  const at = timestamp(row.timestamp);
34
52
  if (at == null || !inWindow(at, sinceMs, untilMs))
35
53
  continue;
54
+ // Claude Code times its own turns; the duration is a measurement, not
55
+ // content, and the only value read off the system row.
56
+ if (row.type === "system" && row.subtype === "turn_duration") {
57
+ const duration = optionalFiniteNumber(row.durationMs);
58
+ if (duration != null)
59
+ turnDurationSamples.push(duration);
60
+ continue;
61
+ }
36
62
  const message = record(row.message);
37
63
  if (!message)
38
64
  continue;
39
- if (row.type === "user" && isHumanMessage(message)) {
40
- events.push({ at, kind: "human" });
41
- used = true;
65
+ if (row.type === "user" &&
66
+ row.isMeta !== true &&
67
+ row.isSidechain !== true &&
68
+ isHumanMessage(message)) {
69
+ humanEvents.push({ at, kind: "human" });
42
70
  }
43
71
  if (row.type === "assistant") {
44
72
  const usage = record(message.usage);
45
73
  if (!usage)
46
74
  continue;
47
- source.tokens.input += finiteNumber(usage.input_tokens);
48
- source.tokens.cached +=
49
- finiteNumber(usage.cache_read_input_tokens) + finiteNumber(usage.cache_creation_input_tokens);
50
- source.tokens.output += finiteNumber(usage.output_tokens);
51
- events.push({ at, kind: "agent" });
52
- used = true;
75
+ const input = optionalFiniteNumber(usage.input_tokens);
76
+ const cacheRead = optionalFiniteNumber(usage.cache_read_input_tokens);
77
+ const cacheCreation = optionalFiniteNumber(usage.cache_creation_input_tokens);
78
+ const cached = cacheRead == null && cacheCreation == null
79
+ ? null
80
+ : (cacheRead ?? 0) + (cacheCreation ?? 0);
81
+ const output = optionalFiniteNumber(usage.output_tokens);
82
+ source.tokens.input = addToken(source.tokens.input, input);
83
+ source.tokens.cached = addToken(source.tokens.cached, cached);
84
+ source.tokens.output = addToken(source.tokens.output, output);
85
+ sessionTokens.input = addToken(sessionTokens.input, input);
86
+ sessionTokens.cached = addToken(sessionTokens.cached, cached);
87
+ sessionTokens.output = addToken(sessionTokens.output, output);
88
+ const model = typeof message.model === "string" && /^[a-z0-9][a-z0-9._:-]{0,79}$/i.test(message.model)
89
+ ? message.model
90
+ : null;
91
+ if (model)
92
+ modelFamily = model;
93
+ assistantEvents.push({ at, kind: "agent", model: model ?? undefined });
94
+ if (message.stop_reason === "end_turn")
95
+ completedEvents.push({ at, kind: "agent", model: model ?? undefined });
53
96
  }
54
97
  }
55
- if (used)
98
+ // Every assistant API response is observable agent ACTIVITY (it drives
99
+ // active-minute and runway estimates); `end_turn` responses additionally
100
+ // mark completed user-visible TURNS (they drive turn counts and status).
101
+ const sessionEvents = [...humanEvents, ...assistantEvents];
102
+ if (sessionEvents.length > 0) {
103
+ const id = opaqueEpisodeId(episodeKeySecret, "claude-code", basename(path, ".jsonl"));
104
+ if (episodeIds.has(id))
105
+ continue;
106
+ episodeIds.add(id);
107
+ events.push(...sessionEvents);
108
+ // Turn semantics mirror the episode's: completed turns when the session
109
+ // observed any, otherwise every assistant response.
110
+ modelTurnEvents.push(...(completedEvents.length > 0 ? completedEvents : assistantEvents));
56
111
  source.sessions += 1;
112
+ const episode = delegationEpisode({
113
+ id,
114
+ adapterVersion: "claude-code-v3",
115
+ events: sessionEvents,
116
+ tokens: sessionTokens,
117
+ untilMs,
118
+ confidence: completedEvents.length > 0 ? "high" : "medium",
119
+ modelFamily,
120
+ latency: {
121
+ timeToFirstToken: null,
122
+ turnDuration: latencyStats(turnDurationSamples),
123
+ humanWait: latencyStats(humanWaitSamples(sessionEvents)),
124
+ },
125
+ });
126
+ if (episode) {
127
+ if (completedEvents.length > 0) {
128
+ episode.status = "observed_end";
129
+ episode.agentTurns = completedEvents.length;
130
+ }
131
+ source.episodes.push(episode);
132
+ }
133
+ }
134
+ }
135
+ const hookGroups = new Map();
136
+ for (const event of readContentFreeHookEvents(home, sinceMs, untilMs)) {
137
+ if (event.sourceId !== "claude-code")
138
+ continue;
139
+ const group = hookGroups.get(event.episodeId) ?? [];
140
+ group.push(event);
141
+ hookGroups.set(event.episodeId, group);
142
+ }
143
+ const episodeById = new Map(source.episodes.map((episode) => [episode.id, episode]));
144
+ for (const [id, hookEvents] of hookGroups) {
145
+ const existing = episodeById.get(id);
146
+ const approvalRequests = hookEvents.filter((event) => event.signal === "permission_requested").length;
147
+ const failureEvents = hookEvents.filter((event) => event.signal === "agent_failed").length;
148
+ const modelFamily = hookEvents.find((event) => event.modelFamily)?.modelFamily ?? null;
149
+ const lastSignal = hookEvents.at(-1)?.signal;
150
+ if (existing) {
151
+ existing.approvalRequests = approvalRequests;
152
+ existing.failureEvents = failureEvents;
153
+ existing.modelFamily ??= modelFamily;
154
+ const finalHook = hookEvents.at(-1);
155
+ if (finalHook && finalHook.at > Date.parse(existing.endedAt)) {
156
+ existing.endedAt = new Date(finalHook.at).toISOString();
157
+ }
158
+ if (lastSignal === "human_prompt")
159
+ existing.status = "open";
160
+ if (lastSignal === "agent_stopped" ||
161
+ lastSignal === "agent_failed" ||
162
+ lastSignal === "session_ended")
163
+ existing.status = "observed_end";
164
+ continue;
165
+ }
166
+ const hookActivity = [];
167
+ for (const event of hookEvents) {
168
+ if (event.signal === "human_prompt")
169
+ hookActivity.push({ at: event.at, kind: "human" });
170
+ if (event.signal === "agent_stopped" || event.signal === "agent_failed") {
171
+ hookActivity.push({ at: event.at, kind: "agent" });
172
+ }
173
+ }
174
+ const episode = delegationEpisode({
175
+ id,
176
+ adapterVersion: "claude-hook-v1",
177
+ events: hookActivity,
178
+ tokens: { input: null, cached: null, output: null, reasoning: null },
179
+ untilMs,
180
+ confidence: "medium",
181
+ modelFamily,
182
+ });
183
+ if (!episode)
184
+ continue;
185
+ episode.approvalRequests = approvalRequests;
186
+ episode.failureEvents = failureEvents;
187
+ if (lastSignal === "agent_stopped" ||
188
+ lastSignal === "agent_failed" ||
189
+ lastSignal === "session_ended")
190
+ episode.status = "observed_end";
191
+ source.episodes.push(episode);
192
+ source.sessions += 1;
193
+ events.push(...hookActivity);
194
+ }
195
+ const finished = finishSource(source, events);
196
+ // Buckets and minutes come from dense activity events; the source-level
197
+ // turn count keeps user-visible turn semantics from the episodes.
198
+ if (finished.episodes.length > 0) {
199
+ finished.agentTurns = finished.episodes.reduce((sum, episode) => sum + episode.agentTurns, 0);
57
200
  }
58
- return finishSource(source, events);
201
+ finished.models = modelActivityFrom(events, modelTurnEvents);
202
+ return finished;
59
203
  },
60
204
  };
61
205
  //# sourceMappingURL=claude.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/sources/claude.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,eAAO,MAAM,WAAW,EAAE,aA4CzB,CAAC"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/sources/codex.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAsF9D,eAAO,MAAM,WAAW,EAAE,aA0LzB,CAAC"}