slopmeter 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -5099,8 +5099,10 @@ var svgBuilder = {
5099
5099
  var esm_default = svgBuilder;
5100
5100
 
5101
5101
  // src/lib/utils.ts
5102
- import { readFile, readdir } from "fs/promises";
5102
+ import { createReadStream } from "fs";
5103
+ import { readdir } from "fs/promises";
5103
5104
  import { join } from "path";
5105
+ import { createInterface } from "readline";
5104
5106
  function formatLocalDate(date) {
5105
5107
  const y = date.getFullYear();
5106
5108
  const m = String(date.getMonth() + 1).padStart(2, "0");
@@ -5192,9 +5194,22 @@ async function listFilesRecursive(rootDir, extension) {
5192
5194
  }
5193
5195
  return files;
5194
5196
  }
5195
- async function readJsonLines(filePath) {
5196
- const content = await readFile(filePath, "utf8");
5197
- return content.split(/\r?\n/).filter((line) => line.trim() !== "").map((line) => JSON.parse(line.trim()));
5197
+ async function forEachJsonLine(filePath, onLine) {
5198
+ const readline = createInterface({
5199
+ input: createReadStream(filePath, { encoding: "utf8" }),
5200
+ crlfDelay: Number.POSITIVE_INFINITY
5201
+ });
5202
+ try {
5203
+ for await (const line of readline) {
5204
+ const trimmed = line.trim();
5205
+ if (trimmed === "") {
5206
+ continue;
5207
+ }
5208
+ await onLine(JSON.parse(trimmed));
5209
+ }
5210
+ } finally {
5211
+ readline.close();
5212
+ }
5198
5213
  }
5199
5214
  function getRecentWindowStart(endDate, days = 30) {
5200
5215
  const start = new Date(endDate);
@@ -5932,23 +5947,12 @@ function createClaudeTokenTotals(usage) {
5932
5947
  total: input + output
5933
5948
  };
5934
5949
  }
5935
- async function parseClaudeFile(filePath) {
5936
- const entries = [];
5937
- const lines = await readJsonLines(filePath);
5938
- for (const line of lines) {
5939
- const parsed = parseClaudeLogEntry(line);
5940
- if (parsed) {
5941
- entries.push(parsed);
5942
- }
5943
- }
5944
- return entries;
5945
- }
5946
- async function parseClaudeFiles() {
5950
+ async function getClaudeFiles() {
5947
5951
  const projectDirs = getClaudeProjectDirs();
5948
5952
  const files = (await Promise.all(
5949
5953
  projectDirs.map((projectDir) => listFilesRecursive(projectDir, ".jsonl"))
5950
5954
  )).flat();
5951
- return Promise.all(files.map((file) => parseClaudeFile(file)));
5955
+ return files;
5952
5956
  }
5953
5957
  function createUniqueHash(messageId, requestId) {
5954
5958
  if (!messageId || !requestId) {
@@ -5957,39 +5961,43 @@ function createUniqueHash(messageId, requestId) {
5957
5961
  return `${messageId}:${requestId}`;
5958
5962
  }
5959
5963
  async function loadClaudeRows(startDate, endDate) {
5960
- const sessions = await parseClaudeFiles();
5964
+ const files = await getClaudeFiles();
5961
5965
  const totals = /* @__PURE__ */ new Map();
5962
5966
  const modelTotals = /* @__PURE__ */ new Map();
5963
5967
  const recentModelTotals = /* @__PURE__ */ new Map();
5964
5968
  const recentStart = getRecentWindowStart(endDate, 30);
5965
5969
  const processedHashes = /* @__PURE__ */ new Set();
5966
- for (const session of sessions) {
5967
- for (const entry of session) {
5970
+ for (const file of files) {
5971
+ await forEachJsonLine(file, async (line) => {
5972
+ const entry = parseClaudeLogEntry(line);
5973
+ if (!entry) {
5974
+ return;
5975
+ }
5968
5976
  const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);
5969
5977
  if (uniqueHash && processedHashes.has(uniqueHash)) {
5970
- continue;
5978
+ return;
5971
5979
  }
5972
5980
  if (uniqueHash) {
5973
5981
  processedHashes.add(uniqueHash);
5974
5982
  }
5975
5983
  const timestamp = new Date(entry.timestamp);
5976
5984
  if (timestamp < startDate || timestamp > endDate) {
5977
- continue;
5985
+ return;
5978
5986
  }
5979
5987
  const tokenTotals = createClaudeTokenTotals(entry.usage);
5980
5988
  if (tokenTotals.total <= 0) {
5981
- continue;
5989
+ return;
5982
5990
  }
5983
5991
  const modelName = entry.model && entry.model !== "<synthetic>" ? normalizeModelName(entry.model) : void 0;
5984
5992
  addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);
5985
5993
  if (!modelName) {
5986
- continue;
5994
+ return;
5987
5995
  }
5988
5996
  addModelTokenTotals(modelTotals, modelName, tokenTotals);
5989
5997
  if (timestamp >= recentStart) {
5990
5998
  addModelTokenTotals(recentModelTotals, modelName, tokenTotals);
5991
5999
  }
5992
- }
6000
+ });
5993
6001
  }
5994
6002
  return createUsageSummary(
5995
6003
  "claude",
@@ -6070,32 +6078,29 @@ function extractCodexModel(payload) {
6070
6078
  }
6071
6079
  return void 0;
6072
6080
  }
6073
- async function parseCodexFile(filePath) {
6074
- return readJsonLines(filePath);
6075
- }
6076
- async function parseCodexFiles() {
6081
+ async function getCodexFiles() {
6077
6082
  const codexHome = process.env.CODEX_HOME?.trim() ? resolve2(process.env.CODEX_HOME) : join3(homedir2(), ".codex");
6078
6083
  const sessionsDir = join3(codexHome, "sessions");
6079
6084
  const files = await listFilesRecursive(sessionsDir, ".jsonl");
6080
- return Promise.all(files.map((file) => parseCodexFile(file)));
6085
+ return files;
6081
6086
  }
6082
6087
  async function loadCodexRows(start, end) {
6083
- const sessions = await parseCodexFiles();
6088
+ const files = await getCodexFiles();
6084
6089
  const totals = /* @__PURE__ */ new Map();
6085
6090
  const recentStart = getRecentWindowStart(end, 30);
6086
6091
  const modelTotals = /* @__PURE__ */ new Map();
6087
6092
  const recentModelTotals = /* @__PURE__ */ new Map();
6088
- for (const session of sessions) {
6093
+ for (const file of files) {
6089
6094
  let previousTotals = null;
6090
6095
  let currentModel;
6091
- for (const entry of session) {
6096
+ await forEachJsonLine(file, async (entry) => {
6092
6097
  const extractedModel = extractCodexModel(entry.payload);
6093
6098
  if (entry.type === "turn_context") {
6094
6099
  currentModel = extractedModel ?? currentModel;
6095
- continue;
6100
+ return;
6096
6101
  }
6097
6102
  if (entry.type !== "event_msg" || entry.payload?.type !== "token_count") {
6098
- continue;
6103
+ return;
6099
6104
  }
6100
6105
  const info = entry.payload.info;
6101
6106
  const lastUsage = normalizeCodexUsage(info?.last_token_usage);
@@ -6108,7 +6113,7 @@ async function loadCodexRows(start, end) {
6108
6113
  previousTotals = totalUsage;
6109
6114
  }
6110
6115
  if (!rawUsage) {
6111
- continue;
6116
+ return;
6112
6117
  }
6113
6118
  const usage = {
6114
6119
  input: rawUsage.input_tokens,
@@ -6117,11 +6122,11 @@ async function loadCodexRows(start, end) {
6117
6122
  total: rawUsage.total_tokens
6118
6123
  };
6119
6124
  if (usage.total <= 0) {
6120
- continue;
6125
+ return;
6121
6126
  }
6122
6127
  const date = new Date(entry.timestamp);
6123
6128
  if (date < start || date > end) {
6124
- continue;
6129
+ return;
6125
6130
  }
6126
6131
  const modelName = extractedModel ?? currentModel;
6127
6132
  const normalizedModelName = modelName ? normalizeModelName(modelName) : void 0;
@@ -6132,7 +6137,7 @@ async function loadCodexRows(start, end) {
6132
6137
  addModelTokenTotals(recentModelTotals, normalizedModelName, usage);
6133
6138
  }
6134
6139
  }
6135
- }
6140
+ });
6136
6141
  }
6137
6142
  return createUsageSummary("codex", totals, modelTotals, recentModelTotals, end);
6138
6143
  }
@@ -6146,7 +6151,7 @@ var providerStatusLabel = {
6146
6151
  };
6147
6152
 
6148
6153
  // src/lib/open-code.ts
6149
- import { readFile as readFile2 } from "fs/promises";
6154
+ import { readFile } from "fs/promises";
6150
6155
  import { homedir as homedir3 } from "os";
6151
6156
  import { join as join4, resolve as resolve3 } from "path";
6152
6157
  function sumOpenCodeTokens(tokens) {
@@ -6162,23 +6167,23 @@ function sumOpenCodeTokens(tokens) {
6162
6167
  };
6163
6168
  }
6164
6169
  async function parseOpenCodeFile(filePath) {
6165
- const content = await readFile2(filePath, "utf8");
6170
+ const content = await readFile(filePath, "utf8");
6166
6171
  return JSON.parse(content);
6167
6172
  }
6168
- async function parseOpenCodeFiles() {
6173
+ async function getOpenCodeFiles() {
6169
6174
  const baseDir = process.env.OPENCODE_DATA_DIR?.trim() ? resolve3(process.env.OPENCODE_DATA_DIR) : join4(homedir3(), ".local", "share", "opencode");
6170
6175
  const messagesDir = join4(baseDir, "storage", "message");
6171
- const files = await listFilesRecursive(messagesDir, ".json");
6172
- return Promise.all(files.map((file) => parseOpenCodeFile(file)));
6176
+ return listFilesRecursive(messagesDir, ".json");
6173
6177
  }
6174
6178
  async function loadOpenCodeRows(start, end) {
6175
- const messages = await parseOpenCodeFiles();
6179
+ const files = await getOpenCodeFiles();
6176
6180
  const totals = /* @__PURE__ */ new Map();
6177
6181
  const dedupe = /* @__PURE__ */ new Set();
6178
6182
  const recentStart = getRecentWindowStart(end, 30);
6179
6183
  const modelTotals = /* @__PURE__ */ new Map();
6180
6184
  const recentModelTotals = /* @__PURE__ */ new Map();
6181
- for (const message of messages) {
6185
+ for (const file of files) {
6186
+ const message = await parseOpenCodeFile(file);
6182
6187
  if (dedupe.has(message.id)) {
6183
6188
  continue;
6184
6189
  }
@@ -6210,18 +6215,20 @@ async function loadOpenCodeRows(start, end) {
6210
6215
  // src/providers.ts
6211
6216
  async function aggregateUsage({
6212
6217
  start,
6213
- end
6218
+ end,
6219
+ providers
6214
6220
  }) {
6215
- const [claude, codex, opencode] = await Promise.all([
6216
- loadClaudeRows(start, end),
6217
- loadCodexRows(start, end),
6218
- loadOpenCodeRows(start, end)
6219
- ]);
6220
- return {
6221
- claude: hasUsage(claude) ? claude : null,
6222
- codex: hasUsage(codex) ? codex : null,
6223
- opencode: hasUsage(opencode) ? opencode : null
6221
+ const requestedProviders = providers?.length ? providers : providerIds;
6222
+ const rowsByProvider = {
6223
+ claude: null,
6224
+ codex: null,
6225
+ opencode: null
6224
6226
  };
6227
+ for (const provider of requestedProviders) {
6228
+ const summary = provider === "claude" ? await loadClaudeRows(start, end) : provider === "codex" ? await loadCodexRows(start, end) : await loadOpenCodeRows(start, end);
6229
+ rowsByProvider[provider] = hasUsage(summary) ? summary : null;
6230
+ }
6231
+ return rowsByProvider;
6225
6232
  }
6226
6233
 
6227
6234
  // src/cli.ts
@@ -6312,8 +6319,8 @@ function getDateWindow() {
6312
6319
  end.setHours(23, 59, 59, 999);
6313
6320
  return { start, end };
6314
6321
  }
6315
- function printProviderAvailability(rowsByProvider) {
6316
- for (const provider of providerIds) {
6322
+ function printProviderAvailability(rowsByProvider, providers) {
6323
+ for (const provider of providers) {
6317
6324
  const found = rowsByProvider[provider] ? "found" : "not found";
6318
6325
  process.stdout.write(`${providerStatusLabel[provider]} ${found}
6319
6326
  `);
@@ -6382,12 +6389,18 @@ async function main() {
6382
6389
  const { start, end } = getDateWindow();
6383
6390
  const colorMode = values.dark ? "dark" : "light";
6384
6391
  const format = inferFormat(values.format, values.output);
6385
- const rowsByProvider = await aggregateUsage({ start, end });
6392
+ const requestedProviders = getRequestedProviders(values);
6393
+ const inspectedProviders = requestedProviders.length > 0 ? requestedProviders : providerIds;
6394
+ const rowsByProvider = await aggregateUsage({
6395
+ start,
6396
+ end,
6397
+ providers: inspectedProviders
6398
+ });
6386
6399
  spinner.stop();
6387
- printProviderAvailability(rowsByProvider);
6400
+ printProviderAvailability(rowsByProvider, inspectedProviders);
6388
6401
  const exportProviders = selectProvidersToRender(
6389
6402
  rowsByProvider,
6390
- getRequestedProviders(values)
6403
+ requestedProviders
6391
6404
  );
6392
6405
  const outputPath = resolve4(
6393
6406
  values.output ?? `./heatmap-last-year.${format}`
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n) {\n for (const provider of providerIds) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const rowsByProvider = await aggregateUsage({ start, end });\n\n spinner.stop();\n printProviderAvailability(rowsByProvider);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n getRequestedProviders(values),\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function totalsToRows(totals: DailyTotalsByDate): DailyUsage[] {\n return [...totals.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([date, { tokens, models }]) => ({\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n }));\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport async function readJsonLines<T>(filePath: string): Promise<T[]> {\n const content = await readFile(filePath, \"utf8\");\n\n return content\n .split(/\\r?\\n/)\n .filter((line) => line.trim() !== \"\")\n .map((line) => JSON.parse(line.trim()) as T);\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(daily),\n current: computeCurrentStreak(daily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n): UsageSummary {\n const daily = totalsToRows(totals);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some((row) => row.total > 0);\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const index = Math.ceil((value / max) * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const footerTopPadding = 32;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n\n for (const row of daily) {\n valueByDate.set(formatLocalDate(row.date), row.total);\n maxValue = Math.max(maxValue, row.total);\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n\n svg = svg.rect({\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n });\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonLines,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nasync function parseClaudeFile(filePath: string) {\n const entries: ClaudeLogEntry[] = [];\n const lines = await readJsonLines<ClaudeRawLogEntry>(filePath);\n\n for (const line of lines) {\n const parsed = parseClaudeLogEntry(line);\n\n if (parsed) {\n entries.push(parsed);\n }\n }\n\n return entries;\n}\n\nasync function parseClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return Promise.all(files.map((file) => parseClaudeFile(file)));\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const sessions = await parseClaudeFiles();\n\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n\n for (const session of sessions) {\n for (const entry of session) {\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n continue;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n continue;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n continue;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n }\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n readJsonLines,\n} from \"./utils\";\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function parseCodexFile(filePath: string) {\n return readJsonLines<CodexEventEntry>(filePath);\n}\n\nasync function parseCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n const sessionsDir = join(codexHome, \"sessions\");\n\n const files = await listFilesRecursive(sessionsDir, \".jsonl\");\n\n return Promise.all(files.map((file) => parseCodexFile(file)));\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const sessions = await parseCodexFiles();\n\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const session of sessions) {\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n for (const entry of session) {\n const extractedModel = extractCodexModel(entry.payload);\n\n if (entry.type === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n continue;\n }\n\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") {\n continue;\n }\n\n const info = entry.payload.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n continue;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n continue;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (normalizedModelName) {\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n }\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n const content = await readFile(filePath, \"utf8\");\n\n return JSON.parse(content) as OpenCodeMessage;\n}\n\nasync function parseOpenCodeFiles() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n const files = await listFilesRecursive(messagesDir, \".json\");\n\n return Promise.all(files.map((file) => parseOpenCodeFile(file)));\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const messages = await parseOpenCodeFiles();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const message of messages) {\n if (dedupe.has(message.id)) {\n continue;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n}\n\nexport async function aggregateUsage({\n start,\n end,\n}: AggregateUsageOptions): Promise<Record<ProviderId, UsageSummary | null>> {\n const [claude, codex, opencode] = await Promise.all([\n loadClaudeRows(start, end),\n loadCodexRows(start, end),\n loadOpenCodeRows(start, end),\n ]);\n\n return {\n claude: hasUsage(claude) ? claude : null,\n codex: hasUsage(codex) ? codex : null,\n opencode: hasUsage(opencode) ? opencode : null,\n };\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","join","join","homedir","join","resolve","resolve","join","homedir","readFile","homedir","join","resolve","readFile","resolve","join","homedir","resolve"]}
1
+ {"version":3,"sources":["../src/cli.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/content/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/attributes/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/element.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/definitions.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/elements/index.ts","../../../node_modules/.bun/svg-builder@3.0.4/node_modules/svg-builder/src/index.ts","../src/lib/utils.ts","../src/graph.ts","../src/lib/claude-code.ts","../src/lib/codex.ts","../src/lib/interfaces.ts","../src/lib/open-code.ts","../src/providers.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, extname, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport ora, { type Ora } from \"ora\";\nimport ow from \"ow\";\nimport sharp from \"sharp\";\nimport { heatmapThemes, renderUsageHeatmapsSvg, type ColorMode } from \"./graph\";\nimport type {\n JsonExportPayload,\n JsonUsageSummary,\n UsageSummary,\n} from \"./interfaces\";\nimport type { ProviderId } from \"./providers\";\nimport { formatLocalDate } from \"./lib/utils\";\nimport { aggregateUsage, providerIds, providerStatusLabel } from \"./providers\";\n\ntype OutputFormat = \"png\" | \"svg\" | \"json\";\ninterface CliArgValues {\n output?: string;\n format?: string;\n help: boolean;\n dark: boolean;\n claude: boolean;\n codex: boolean;\n opencode: boolean;\n}\n\nconst PNG_BASE_WIDTH = 1000;\nconst PNG_SCALE = 4;\nconst PNG_RENDER_WIDTH = PNG_BASE_WIDTH * PNG_SCALE;\nconst JSON_EXPORT_VERSION = \"2026-03-03\";\n\nconst HELP_TEXT = `slopmeter\n\nGenerate rolling 1-year usage heatmap image(s) (today is the latest day).\n\nUsage:\n slopmeter [--claude] [--codex] [--opencode] [--dark] [--format png|svg|json] [--output ./heatmap-last-year.png]\n\nOptions:\n --claude Render Claude Code graph\n --codex Render Codex graph\n --opencode Render Open Code graph\n --dark Render with the dark theme\n -f, --format Output format: png, svg, or json (default: png)\n -o, --output Output file path (default: ./heatmap-last-year.png)\n -h, --help Show this help\n`;\n\nfunction printHelp() {\n process.stdout.write(HELP_TEXT);\n}\n\nfunction validateArgs(values: unknown): asserts values is CliArgValues {\n ow(\n values,\n ow.object.exactShape({\n output: ow.optional.string.nonEmpty,\n format: ow.optional.string.nonEmpty,\n help: ow.boolean,\n dark: ow.boolean,\n claude: ow.boolean,\n codex: ow.boolean,\n opencode: ow.boolean,\n }),\n );\n}\n\nfunction inferFormat(\n formatArg: string | undefined,\n outputArg: string | undefined,\n) {\n if (formatArg) {\n ow(formatArg, ow.string.oneOf([\"png\", \"svg\", \"json\"] as const));\n\n return formatArg;\n }\n\n if (outputArg) {\n const outputExtension = extname(outputArg).toLowerCase();\n\n if (outputExtension === \".svg\") {\n return \"svg\" as const;\n }\n\n if (outputExtension === \".json\") {\n return \"json\" as const;\n }\n }\n\n return \"png\" as const;\n}\n\nasync function writeOutputImage(\n outputPath: string,\n format: Exclude<OutputFormat, \"json\">,\n svg: string,\n background: string,\n) {\n if (format === \"svg\") {\n writeFileSync(outputPath, svg, \"utf8\");\n\n return;\n }\n\n const pngBuffer = await sharp(Buffer.from(svg), { density: 192 })\n .resize({ width: PNG_RENDER_WIDTH })\n .flatten({ background })\n .png()\n .toBuffer();\n\n writeFileSync(outputPath, pngBuffer);\n}\n\nfunction writeOutputJson(outputPath: string, payload: JsonExportPayload) {\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n}\n\nfunction toJsonUsageSummary(summary: UsageSummary): JsonUsageSummary {\n return {\n provider: summary.provider,\n insights: summary.insights,\n daily: summary.daily.map((row) => ({\n date: formatLocalDate(row.date),\n input: row.input,\n output: row.output,\n cache: row.cache,\n total: row.total,\n breakdown: row.breakdown,\n })),\n };\n}\n\nfunction getDateWindow() {\n const start = new Date();\n\n start.setHours(0, 0, 0, 0);\n start.setFullYear(start.getFullYear() - 1);\n\n const end = new Date();\n\n end.setHours(23, 59, 59, 999);\n\n return { start, end };\n}\n\nfunction printProviderAvailability(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n providers: ProviderId[],\n) {\n for (const provider of providers) {\n const found = rowsByProvider[provider] ? \"found\" : \"not found\";\n\n process.stdout.write(`${providerStatusLabel[provider]} ${found}\\n`);\n }\n}\n\nfunction getRequestedProviders(values: CliArgValues) {\n return providerIds.filter((id) => values[id]);\n}\n\nfunction selectProvidersToRender(\n rowsByProvider: Record<ProviderId, UsageSummary | null>,\n requested: ProviderId[],\n) {\n const providersToRender =\n requested.length > 0\n ? requested.filter((provider) => rowsByProvider[provider])\n : providerIds.filter((provider) => rowsByProvider[provider]);\n\n if (requested.length > 0 && providersToRender.length < requested.length) {\n const missing = requested.filter((provider) => !rowsByProvider[provider]);\n\n throw new Error(\n `Requested provider data not found: ${missing.map((provider) => providerStatusLabel[provider]).join(\", \")}`,\n );\n }\n\n if (providersToRender.length === 0) {\n throw new Error(\n \"No usage data found for Claude code, Codex, or Open code.\",\n );\n }\n\n return providersToRender.map((provider) => rowsByProvider[provider]!);\n}\n\nfunction printRunSummary(\n outputPath: string,\n format: OutputFormat,\n colorMode: ColorMode,\n startDate: Date,\n endDate: Date,\n rendered: ProviderId[],\n) {\n process.stdout.write(\n `${JSON.stringify(\n {\n output: outputPath,\n format,\n colorMode,\n startDate: formatLocalDate(startDate),\n endDate: formatLocalDate(endDate),\n rendered,\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function main() {\n let spinner: Ora | undefined;\n\n const parsed = parseArgs({\n options: {\n output: { type: \"string\", short: \"o\" },\n format: { type: \"string\", short: \"f\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n dark: { type: \"boolean\", default: false },\n claude: { type: \"boolean\", default: false },\n codex: { type: \"boolean\", default: false },\n opencode: { type: \"boolean\", default: false },\n },\n allowPositionals: false,\n });\n\n validateArgs(parsed.values);\n\n const { values } = parsed;\n\n if (values.help) {\n printHelp();\n\n return;\n }\n\n try {\n spinner = ora({\n text: \"Analyzing usage data...\",\n spinner: \"dots\",\n }).start();\n\n const { start, end } = getDateWindow();\n const colorMode: ColorMode = values.dark ? \"dark\" : \"light\";\n const format = inferFormat(values.format, values.output);\n const requestedProviders = getRequestedProviders(values);\n const inspectedProviders =\n requestedProviders.length > 0 ? requestedProviders : providerIds;\n const rowsByProvider = await aggregateUsage({\n start,\n end,\n providers: inspectedProviders,\n });\n\n spinner.stop();\n printProviderAvailability(rowsByProvider, inspectedProviders);\n\n const exportProviders = selectProvidersToRender(\n rowsByProvider,\n requestedProviders,\n );\n\n const outputPath = resolve(\n values.output ?? `./heatmap-last-year.${format}`,\n );\n\n mkdirSync(dirname(outputPath), { recursive: true });\n\n if (format === \"json\") {\n spinner.start(\"Preparing JSON export...\");\n\n const payload: JsonExportPayload = {\n version: JSON_EXPORT_VERSION,\n start: formatLocalDate(start),\n end: formatLocalDate(end),\n providers: exportProviders.map((provider) =>\n toJsonUsageSummary(provider),\n ),\n };\n\n spinner.text = \"Writing output file...\";\n writeOutputJson(outputPath, payload);\n } else {\n spinner.start(\"Rendering heatmaps...\");\n\n const svg = renderUsageHeatmapsSvg({\n startDate: start,\n endDate: end,\n colorMode,\n sections: exportProviders.map(({ provider, daily, insights }) => ({\n daily,\n insights,\n title: heatmapThemes[provider].title,\n colors: heatmapThemes[provider].colors,\n })),\n });\n const background = colorMode === \"dark\" ? \"#171717\" : \"#ffffff\";\n\n spinner.text = \"Writing output file...\";\n await writeOutputImage(outputPath, format, svg, background);\n }\n\n spinner.succeed(\"Analysis complete\");\n\n printRunSummary(\n outputPath,\n format,\n colorMode,\n start,\n end,\n exportProviders.map(({ provider }) => provider),\n );\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (spinner) {\n spinner.fail(`Failed: ${message}`);\n } else {\n process.stderr.write(`${message}\\n`);\n }\n\n process.exitCode = 1;\n }\n}\n\nvoid main();\n",null,null,null,null,null,null,"import { createReadStream } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { DailyUsage, Insights, ModelUsage, UsageSummary } from \"../interfaces\";\n\nexport function formatLocalDate(date: Date) {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n\n return `${y}-${m}-${d}`;\n}\n\nexport interface DailyTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\nexport interface ModelTokenTotals {\n input: number;\n output: number;\n cache: { input: number; output: number };\n total: number;\n}\n\ninterface TokenTotals {\n tokens: DailyTokenTotals;\n models: Map<string, ModelTokenTotals>;\n}\n\nexport type DailyTotalsByDate = Map<string, TokenTotals>;\n\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction cloneTokenTotals(\n totals: DailyTokenTotals | ModelTokenTotals,\n): ModelTokenTotals {\n return {\n input: totals.input,\n output: totals.output,\n cache: { input: totals.cache.input, output: totals.cache.output },\n total: totals.total,\n };\n}\n\nfunction mergeTokenTotals(\n target: DailyTokenTotals | ModelTokenTotals,\n source: DailyTokenTotals | ModelTokenTotals,\n) {\n target.input += source.input;\n target.output += source.output;\n target.cache.input += source.cache.input;\n target.cache.output += source.cache.output;\n target.total += source.total;\n}\n\nexport function addModelTokenTotals(\n modelTotals: Map<string, ModelTokenTotals>,\n modelName: string,\n tokenTotals: DailyTokenTotals | ModelTokenTotals,\n) {\n const existing = modelTotals.get(modelName);\n\n if (!existing) {\n modelTotals.set(modelName, cloneTokenTotals(tokenTotals));\n\n return;\n }\n\n mergeTokenTotals(existing, tokenTotals);\n}\n\nexport function addDailyTokenTotals(\n totals: DailyTotalsByDate,\n date: Date,\n tokenTotals: DailyTokenTotals,\n modelName?: string,\n) {\n const key = formatLocalDate(date);\n const existing = totals.get(key);\n\n if (!existing) {\n const models = new Map<string, ModelTokenTotals>();\n\n if (modelName) {\n models.set(modelName, cloneTokenTotals(tokenTotals));\n }\n totals.set(key, { tokens: cloneTokenTotals(tokenTotals), models });\n\n return;\n }\n\n mergeTokenTotals(existing.tokens, tokenTotals);\n\n if (modelName) {\n addModelTokenTotals(existing.models, modelName, tokenTotals);\n }\n}\n\nexport function totalsToRows(totals: DailyTotalsByDate): DailyUsage[] {\n return [...totals.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([date, { tokens, models }]) => ({\n date: new Date(`${date}T00:00:00`),\n input: tokens.input,\n output: tokens.output,\n cache: { input: tokens.cache.input, output: tokens.cache.output },\n total: tokens.total,\n breakdown: [...models.entries()]\n .sort(([, a], [, b]) => b.total - a.total)\n .map(([name, t]) => ({\n name,\n tokens: {\n input: t.input,\n output: t.output,\n cache: { input: t.cache.input, output: t.cache.output },\n total: t.total,\n },\n })),\n }));\n}\n\nexport async function listFilesRecursive(rootDir: string, extension: string) {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop()!;\n\n let entries;\n\n try {\n entries = await readdir(currentDir, {\n withFileTypes: true,\n encoding: \"utf8\",\n });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n stack.push(fullPath);\n continue;\n }\n\n if (entry.isFile() && fullPath.endsWith(extension)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport async function forEachJsonLine<T>(\n filePath: string,\n onLine: (value: T) => void | Promise<void>,\n) {\n const readline = createInterface({\n input: createReadStream(filePath, { encoding: \"utf8\" }),\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n try {\n for await (const line of readline) {\n const trimmed = line.trim();\n\n if (trimmed === \"\") {\n continue;\n }\n\n await onLine(JSON.parse(trimmed) as T);\n }\n } finally {\n readline.close();\n }\n}\n\nexport function getRecentWindowStart(endDate: Date, days = 30) {\n const start = new Date(endDate);\n\n start.setDate(start.getDate() - (days - 1));\n start.setHours(0, 0, 0, 0);\n\n return start;\n}\n\nexport function normalizeModelName(modelName: string) {\n return modelName.replace(/-\\d{8}$/, \"\");\n}\n\nexport function getTopModel(\n modelTotals: Map<string, ModelTokenTotals>,\n): ModelUsage | undefined {\n let bestModel: string | undefined;\n let bestTotals: ModelTokenTotals | undefined;\n\n for (const [modelName, totals] of modelTotals) {\n if (!bestTotals || totals.total > bestTotals.total) {\n bestModel = modelName;\n bestTotals = totals;\n }\n }\n\n if (!bestTotals || bestTotals.total <= 0) {\n return undefined;\n }\n\n return {\n name: bestModel!,\n tokens: {\n input: bestTotals.input,\n output: bestTotals.output,\n cache: { input: bestTotals.cache.input, output: bestTotals.cache.output },\n total: bestTotals.total,\n },\n };\n}\n\nfunction startOfDay(date: Date) {\n const day = new Date(date);\n\n day.setHours(0, 0, 0, 0);\n\n return day;\n}\n\nfunction isConsecutiveDay(prevDate: Date, currDate: Date): boolean {\n const prev = startOfDay(prevDate);\n const curr = startOfDay(currDate);\n const diff = curr.getTime() - prev.getTime();\n\n return diff === ONE_DAY_MS;\n}\n\nexport function computeLongestStreak(daily: DailyUsage[]): number {\n if (daily.length === 0) {\n return 0;\n }\n\n let longest = 1;\n let running = 1;\n\n for (let i = 1; i < daily.length; i += 1) {\n if (isConsecutiveDay(daily[i - 1].date, daily[i].date)) {\n running += 1;\n if (running > longest) {\n longest = running;\n }\n } else {\n running = 1;\n }\n }\n\n return longest;\n}\n\nexport function computeCurrentStreak(daily: DailyUsage[], end: Date): number {\n if (daily.length === 0) {\n return 0;\n }\n\n const endDay = startOfDay(end);\n const lastEntry = daily[daily.length - 1];\n const lastEntryDay = startOfDay(lastEntry.date);\n\n // If the last active day isn't the end date, check if it's consecutive\n if (\n lastEntryDay.getTime() !== endDay.getTime() &&\n !isConsecutiveDay(lastEntryDay, endDay)\n ) {\n return 0;\n }\n\n let current = 1;\n\n for (let i = daily.length - 2; i >= 0; i -= 1) {\n if (!isConsecutiveDay(daily[i].date, daily[i + 1].date)) {\n break;\n }\n current += 1;\n }\n\n return current;\n}\n\nexport function getProviderInsights(\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n daily: DailyUsage[],\n end: Date,\n): Insights {\n const mostUsedModel = getTopModel(modelTotals);\n const recentMostUsedModel = getTopModel(recentModelTotals);\n\n return {\n mostUsedModel,\n recentMostUsedModel,\n streaks: {\n longest: computeLongestStreak(daily),\n current: computeCurrentStreak(daily, end),\n },\n };\n}\n\nexport function createUsageSummary(\n provider: UsageSummary[\"provider\"],\n totals: DailyTotalsByDate,\n modelTotals: Map<string, ModelTokenTotals>,\n recentModelTotals: Map<string, ModelTokenTotals>,\n end: Date,\n): UsageSummary {\n const daily = totalsToRows(totals);\n\n return {\n provider,\n daily,\n insights: getProviderInsights(modelTotals, recentModelTotals, daily, end),\n };\n}\n\nexport function hasUsage(summary: UsageSummary) {\n return summary.daily.some((row) => row.total > 0);\n}\n","import svgBuilder, { type SVGBuilderInstance } from \"svg-builder\";\nimport type { DailyUsage, Insights, ModelUsage } from \"./interfaces\";\nimport type { ProviderId } from \"./lib/interfaces\";\nimport { formatLocalDate } from \"./lib/utils\";\n\ninterface HeatmapTheme {\n title: string;\n colors: {\n light: string[];\n dark: string[];\n };\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\ninterface CalendarGrid {\n weeks: (string | null)[][];\n monthLabels: (string | null)[];\n}\n\ninterface SectionLayout {\n width: number;\n height: number;\n gridTop: number;\n leftLabelWidth: number;\n cellSize: number;\n gap: number;\n headerCaptionY: number;\n headerValueY: number;\n titleY: number;\n monthLabelY: number;\n legendY: number;\n footerCaptionY: number;\n footerValueY: number;\n}\n\ninterface DrawHeatmapSectionOptions {\n x: number;\n y: number;\n grid: CalendarGrid;\n layout: SectionLayout;\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n colorMode: ColorMode;\n palette: SurfacePalette;\n}\n\ninterface RenderUsageHeatmapsSvgSection {\n daily: DailyUsage[];\n insights?: Insights;\n title: string;\n colors: HeatmapTheme[\"colors\"];\n}\n\ninterface ModelUsageRow {\n caption: string;\n data: ModelUsage;\n}\n\ninterface RenderUsageHeatmapsSvgOptions {\n startDate: Date;\n endDate: Date;\n sections: RenderUsageHeatmapsSvgSection[];\n colorMode: ColorMode;\n}\n\ninterface SurfacePalette {\n background: string;\n text: string;\n muted: string;\n}\n\nexport const heatmapThemes: Record<ProviderId, HeatmapTheme> = {\n claude: {\n title: \"Claude Code\",\n colors: {\n light: [\n \"#fff7ed\", // orange-50\n \"#fed7aa\", // orange-200\n \"#fdba74\", // orange-300\n \"#f97316\", // orange-500\n \"#c2410c\", // orange-700\n ],\n dark: [\n \"#292524\", // stone-800\n \"#9a3412\", // orange-800\n \"#c2410c\", // orange-700\n \"#f97316\", // orange-500\n \"#fdba74\", // orange-300\n ],\n },\n },\n codex: {\n title: \"Codex\",\n colors: {\n light: [\n \"#e0e7ff\", // indigo-100\n \"#a5b4fc\", // indigo-300\n \"#818cf8\", // indigo-400\n \"#4f46e5\", // indigo-600\n \"#312e81\", // indigo-900\n ],\n dark: [\n \"#1e1b4b\", // indigo-950\n \"#312e81\", // indigo-900\n \"#4338ca\", // indigo-700\n \"#818cf8\", // indigo-400\n \"#c7d2fe\", // indigo-200\n ],\n },\n },\n opencode: {\n title: \"Open Code\",\n colors: {\n light: [\n \"#f5f5f5\", // neutral-100\n \"#d4d4d4\", // neutral-300\n \"#a3a3a3\", // neutral-400\n \"#525252\", // neutral-600\n \"#171717\", // neutral-900\n ],\n dark: [\n \"#262626\", // neutral-800\n \"#525252\", // neutral-600\n \"#737373\", // neutral-500\n \"#a3a3a3\", // neutral-400\n \"#fafafa\", // neutral-50\n ],\n },\n },\n};\n\nconst daysOfWeekMonday = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst numberFormatter = new Intl.NumberFormat(\"en-US\");\nconst fontFamily =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\nconst providerTitleFontSize = 20;\nconst metricCaptionFontSize = 9;\nconst metricValueFontSize = 14;\nconst captionValueGap = 4;\n\nconst surfacePalettes: Record<ColorMode, SurfacePalette> = {\n light: {\n background: \"#ffffff\",\n text: \"#0f172a\",\n muted: \"#737373\",\n },\n dark: {\n background: \"#171717\",\n text: \"#fafafa\",\n muted: \"#a3a3a3\",\n },\n};\n\nfunction formatTokenTotal(value: number) {\n const units = [\n { size: 1_000_000_000_000, suffix: \"T\" },\n { size: 1_000_000_000, suffix: \"B\" },\n { size: 1_000_000, suffix: \"M\" },\n { size: 1_000, suffix: \"K\" },\n ];\n\n for (const unit of units) {\n if (value >= unit.size) {\n const scaled = value / unit.size;\n const precision = scaled >= 100 ? 0 : scaled >= 10 ? 1 : 2;\n const compact = scaled\n .toFixed(precision)\n .replace(/\\.0+$/, \"\")\n .replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n\n return `${compact}${unit.suffix}`;\n }\n }\n\n return numberFormatter.format(value);\n}\n\nfunction truncateText(value: string, maxLength: number) {\n if (value.length <= maxLength) {\n return value;\n }\n\n return `${value.slice(0, Math.max(maxLength - 3, 1))}...`;\n}\n\nfunction escapeXml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction caption(value: string) {\n return value.toUpperCase();\n}\n\nfunction getAllDays(start: Date, end: Date) {\n const days: string[] = [];\n const curr = new Date(start);\n\n while (curr <= end) {\n days.push(formatLocalDate(curr));\n curr.setDate(curr.getDate() + 1);\n }\n\n return days;\n}\n\nfunction getMondayBasedWeekday(dateIso: string) {\n const sundayBased = new Date(`${dateIso}T00:00:00`).getDay();\n\n return (sundayBased + 6) % 7;\n}\n\nfunction padToWeekStartMonday(days: string[]) {\n const firstDay = getMondayBasedWeekday(days[0]);\n const padding = new Array(firstDay).fill(null);\n\n return [...padding, ...days];\n}\n\nfunction chunkByWeek(days: (string | null)[]): (string | null)[][] {\n const weeks: (string | null)[][] = [];\n\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n\n return weeks;\n}\n\nfunction getMonthLabel(week: (string | null)[]) {\n const lastDay = [...week].reverse().find(Boolean);\n\n if (!lastDay) {\n return null;\n }\n\n return new Date(`${lastDay}T00:00:00`).toLocaleString(\"en-US\", {\n month: \"short\",\n });\n}\n\nfunction defaultColourMap(value: number, max: number, colorCount: number) {\n if (max <= 0 || value <= 0) {\n return 0;\n }\n\n const index = Math.ceil((value / max) * (colorCount - 1));\n\n return Math.min(Math.max(index, 0), colorCount - 1);\n}\n\nfunction getCalendarGrid(startDate: Date, endDate: Date) {\n const allDays = getAllDays(startDate, endDate);\n const paddedDays = padToWeekStartMonday(allDays);\n const weeks = chunkByWeek(paddedDays);\n\n const monthLabels = weeks.map((week, i) => {\n const label = getMonthLabel(week);\n const prevLabel = i > 0 ? getMonthLabel(weeks[i - 1]) : null;\n\n return label !== prevLabel ? label : null;\n });\n\n return { weeks, monthLabels };\n}\n\nfunction getSectionLayout(weekCount: number) {\n const cellSize = 11;\n const gap = 2;\n const leftLabelWidth = 34;\n const rightPadding = 20;\n const headerCaptionY = 0;\n const headerValueY =\n headerCaptionY + metricCaptionFontSize + captionValueGap;\n const topMetricHeight = headerValueY + metricValueFontSize;\n const topPadding = Math.max(providerTitleFontSize, topMetricHeight) + 20;\n const monthHeaderHeight = 20;\n const titleY = 0;\n const monthLabelY = topPadding + 4;\n const gridTop = topPadding + monthHeaderHeight;\n const gridHeight = 7 * cellSize + 6 * gap;\n const gridWidth = weekCount * cellSize + Math.max(weekCount - 1, 0) * gap;\n const legendY = gridTop + gridHeight + 28;\n const legendBottomY = legendY + cellSize;\n const footerTopPadding = 32;\n const footerCaptionY = legendBottomY + footerTopPadding;\n const footerValueY =\n footerCaptionY + metricCaptionFontSize + captionValueGap;\n const statsBottomPadding = 12;\n const width = leftLabelWidth + gridWidth + rightPadding;\n const height = footerValueY + metricValueFontSize + statsBottomPadding;\n\n return {\n width,\n height,\n gridTop,\n leftLabelWidth,\n cellSize,\n gap,\n headerCaptionY,\n headerValueY,\n titleY,\n monthLabelY,\n legendY,\n footerCaptionY,\n footerValueY,\n };\n}\n\nfunction drawHeatmapSection(\n svg: SVGBuilderInstance,\n {\n x,\n y,\n grid,\n layout,\n daily,\n insights,\n title,\n colors,\n colorMode,\n palette,\n }: DrawHeatmapSectionOptions,\n) {\n const colorsForMode = colors[colorMode];\n const valueByDate = new Map<string, number>();\n const rightEdge = x + layout.width - 8;\n const leftColumnX = x + 8;\n let maxValue = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalTokens = 0;\n\n for (const row of daily) {\n valueByDate.set(formatLocalDate(row.date), row.total);\n maxValue = Math.max(maxValue, row.total);\n totalInputTokens += row.input;\n totalOutputTokens += row.output;\n totalTokens += row.total;\n }\n\n const topMetricGap = 120;\n const headerLast30DaysX = rightEdge - topMetricGap * 3;\n const headerInputX = rightEdge - topMetricGap * 2;\n const headerOutputX = rightEdge - topMetricGap;\n const totalTokensLabel = formatTokenTotal(totalTokens);\n const totalInputLabel = formatTokenTotal(totalInputTokens);\n const totalOutputLabel = formatTokenTotal(totalOutputTokens);\n const longestStreak = insights?.streaks.longest ?? 0;\n const currentStreak = insights?.streaks.current ?? 0;\n\n svg = svg.text(\n {\n x: leftColumnX,\n y: y + layout.titleY,\n fill: palette.text,\n \"font-size\": providerTitleFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n title,\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Input tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerInputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalInputLabel,\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Output tokens\"),\n );\n\n svg = svg.text(\n {\n x: headerOutputX,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalOutputLabel,\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Total tokens\"),\n );\n\n svg = svg.text(\n {\n x: rightEdge,\n y: y + layout.headerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n totalTokensLabel,\n );\n\n for (let i = 0; i < 7; i += 1) {\n const dayY =\n y +\n layout.gridTop +\n i * (layout.cellSize + layout.gap) +\n layout.cellSize / 2;\n\n const dayLabel = i === 0 || i === 6 ? daysOfWeekMonday[i] : \"\";\n\n svg = svg.text(\n {\n x: x + layout.leftLabelWidth - 6,\n y: dayY,\n fill: palette.muted,\n \"font-size\": 10,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"middle\",\n \"font-family\": fontFamily,\n },\n dayLabel,\n );\n }\n\n for (let weekIndex = 0; weekIndex < grid.weeks.length; weekIndex += 1) {\n const monthLabel = grid.monthLabels[weekIndex];\n\n if (monthLabel) {\n const monthX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n\n svg = svg.text(\n {\n x: monthX,\n y: y + layout.monthLabelY,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-family\": fontFamily,\n },\n monthLabel,\n );\n }\n\n const week = grid.weeks[weekIndex];\n\n for (let dayIndex = 0; dayIndex < week.length; dayIndex += 1) {\n const day = week[dayIndex];\n\n if (!day) {\n continue;\n }\n\n const value = valueByDate.get(day) ?? 0;\n const colorIndex = defaultColourMap(\n value,\n maxValue,\n colorsForMode.length,\n );\n const fill = colorsForMode[colorIndex];\n\n const dayX =\n x + layout.leftLabelWidth + weekIndex * (layout.cellSize + layout.gap);\n const dayY =\n y + layout.gridTop + dayIndex * (layout.cellSize + layout.gap);\n\n svg = svg.rect({\n x: dayX,\n y: dayY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill,\n });\n }\n }\n\n const legendStartX = x + layout.leftLabelWidth;\n const legendY = y + layout.legendY;\n\n svg = svg.text(\n {\n x: legendStartX,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"Less\"),\n );\n\n for (let i = 0; i < colorsForMode.length; i += 1) {\n const legendX = legendStartX + 28 + i * (layout.cellSize + 3);\n\n svg = svg.rect({\n x: legendX,\n y: legendY,\n width: layout.cellSize,\n height: layout.cellSize,\n rx: 3,\n ry: 3,\n fill: colorsForMode[i],\n });\n }\n\n svg = svg.text(\n {\n x: legendStartX + 28 + colorsForMode.length * (layout.cellSize + 3) + 6,\n y: legendY + 10,\n fill: palette.muted,\n \"font-size\": 10,\n \"font-weight\": 600,\n \"font-family\": fontFamily,\n },\n caption(\"More\"),\n );\n\n const rightColumnX = rightEdge;\n const leftSecondaryX = leftColumnX + 250;\n const rightPrimaryX = rightColumnX - 160;\n\n const leftRows: ModelUsageRow[] = [];\n\n if (insights?.mostUsedModel) {\n leftRows.push({ caption: \"Most used model\", data: insights.mostUsedModel });\n }\n\n if (insights?.recentMostUsedModel) {\n leftRows.push({\n caption: \"Recent use (last 30 days)\",\n data: insights.recentMostUsedModel,\n });\n }\n\n for (const [index, row] of leftRows.entries()) {\n const captionY = layout.footerCaptionY;\n const valueY = layout.footerValueY;\n const modelName = truncateText(row.data.name, 20);\n const modelX = index === 0 ? leftColumnX : leftSecondaryX;\n const tokenLabel = `(${formatTokenTotal(row.data.tokens.total)})`;\n\n svg = svg.text(\n {\n x: modelX,\n y: y + captionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(row.caption),\n );\n\n svg = svg.text(\n {\n x: modelX,\n y: y + valueY,\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `<tspan fill=\"${palette.text}\" font-size=\"${metricValueFontSize}\" font-weight=\"600\">${escapeXml(modelName)}</tspan><tspan dx=\"6\" fill=\"${palette.muted}\" font-size=\"${metricValueFontSize}\" font-weight=\"400\">${tokenLabel}</tspan>`,\n );\n }\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Longest streak\"),\n );\n\n svg = svg.text(\n {\n x: rightPrimaryX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(longestStreak)} days`,\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerCaptionY,\n fill: palette.muted,\n \"font-size\": metricCaptionFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n caption(\"Current streak\"),\n );\n\n svg = svg.text(\n {\n x: rightColumnX,\n y: y + layout.footerValueY,\n fill: palette.text,\n \"font-size\": metricValueFontSize,\n \"font-weight\": 600,\n \"text-anchor\": \"end\",\n \"dominant-baseline\": \"hanging\",\n \"font-family\": fontFamily,\n },\n `${numberFormatter.format(currentStreak)} days`,\n );\n\n return svg;\n}\n\nexport function renderUsageHeatmapsSvg({\n startDate,\n endDate,\n sections,\n colorMode,\n}: RenderUsageHeatmapsSvgOptions) {\n const grid = getCalendarGrid(startDate, endDate);\n const layout = getSectionLayout(grid.weeks.length);\n const palette = surfacePalettes[colorMode];\n const horizontalPadding = 18;\n const topPadding = 30;\n const bottomPadding = 18;\n const sectionGap = 40;\n\n const width = horizontalPadding * 2 + layout.width;\n const height =\n topPadding +\n bottomPadding +\n sections.length * layout.height +\n Math.max(sections.length - 1, 0) * sectionGap;\n\n let svg = svgBuilder\n .create()\n .width(width)\n .height(height)\n .viewBox(`0 0 ${width} ${height}`)\n .rect({\n x: -2,\n y: -2,\n width: width + 4,\n height: height + 4,\n fill: palette.background,\n });\n\n sections.forEach((section, index) => {\n const sectionY = topPadding + index * (layout.height + sectionGap);\n\n svg = drawHeatmapSection(svg, {\n x: horizontalPadding,\n y: sectionY,\n grid,\n layout,\n daily: section.daily,\n insights: section.insights,\n title: section.title,\n colors: section.colors,\n colorMode,\n palette,\n });\n });\n\n return svg.render();\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n forEachJsonLine,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\nconst CLAUDE_CONFIG_DIR_ENV = \"CLAUDE_CONFIG_DIR\";\nconst CLAUDE_PROJECTS_DIR_NAME = \"projects\";\n\ninterface ClaudeUsagePayload {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n}\n\ninterface ClaudeRawLogEntry {\n timestamp?: string;\n requestId?: string;\n message?: {\n usage?: ClaudeUsagePayload;\n model?: string;\n id?: string;\n };\n}\n\ninterface ClaudeLogEntry {\n timestamp: string;\n usage: ClaudeUsagePayload;\n model?: string;\n messageId?: string;\n requestId?: string;\n}\n\nfunction getClaudeConfigPaths() {\n const envPaths = (process.env[CLAUDE_CONFIG_DIR_ENV] ?? \"\").trim();\n\n if (envPaths !== \"\") {\n return envPaths\n .split(\",\")\n .map((path) => path.trim())\n .filter((path) => path !== \"\")\n .map((path) => resolve(path));\n }\n\n const xdgConfigHome =\n process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), \".config\");\n\n return [join(xdgConfigHome, \"claude\"), join(homedir(), \".claude\")];\n}\n\nfunction getClaudeProjectDirs() {\n const unique = new Set<string>();\n const dirs: string[] = [];\n\n for (const basePath of getClaudeConfigPaths()) {\n const projectsDir = join(basePath, CLAUDE_PROJECTS_DIR_NAME);\n\n if (existsSync(projectsDir) && !unique.has(projectsDir)) {\n unique.add(projectsDir);\n dirs.push(projectsDir);\n }\n }\n\n return dirs;\n}\n\nfunction parseClaudeLogEntry(entry: ClaudeRawLogEntry): ClaudeLogEntry | null {\n if (!entry.timestamp || !entry.message?.usage) {\n return null;\n }\n\n return {\n timestamp: entry.timestamp,\n usage: entry.message.usage,\n model: entry.message.model,\n messageId: entry.message.id,\n requestId: entry.requestId,\n };\n}\n\nfunction createClaudeTokenTotals(usage: ClaudeUsagePayload): DailyTokenTotals {\n const cacheReadInput = usage.cache_read_input_tokens ?? 0;\n const cacheCreationInput = usage.cache_creation_input_tokens ?? 0;\n const input = (usage.input_tokens ?? 0) + cacheReadInput;\n const output = (usage.output_tokens ?? 0) + cacheCreationInput;\n\n return {\n input,\n output,\n cache: { input: cacheReadInput, output: cacheCreationInput },\n total: input + output,\n };\n}\n\nasync function getClaudeFiles() {\n const projectDirs = getClaudeProjectDirs();\n const files = (\n await Promise.all(\n projectDirs.map((projectDir) => listFilesRecursive(projectDir, \".jsonl\")),\n )\n ).flat();\n\n return files;\n}\n\nfunction createUniqueHash(messageId?: string, requestId?: string) {\n if (!messageId || !requestId) {\n return null;\n }\n\n return `${messageId}:${requestId}`;\n}\n\nexport async function loadClaudeRows(\n startDate: Date,\n endDate: Date,\n): Promise<UsageSummary> {\n const files = await getClaudeFiles();\n const totals: DailyTotalsByDate = new Map();\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n const recentStart = getRecentWindowStart(endDate, 30);\n const processedHashes = new Set<string>();\n\n for (const file of files) {\n await forEachJsonLine<ClaudeRawLogEntry>(file, async (line) => {\n const entry = parseClaudeLogEntry(line);\n\n if (!entry) {\n return;\n }\n\n const uniqueHash = createUniqueHash(entry.messageId, entry.requestId);\n\n if (uniqueHash && processedHashes.has(uniqueHash)) {\n return;\n }\n\n if (uniqueHash) {\n processedHashes.add(uniqueHash);\n }\n\n const timestamp = new Date(entry.timestamp);\n\n if (timestamp < startDate || timestamp > endDate) {\n return;\n }\n\n const tokenTotals = createClaudeTokenTotals(entry.usage);\n\n if (tokenTotals.total <= 0) {\n return;\n }\n\n const modelName =\n entry.model && entry.model !== \"<synthetic>\"\n ? normalizeModelName(entry.model)\n : undefined;\n\n addDailyTokenTotals(totals, timestamp, tokenTotals, modelName);\n\n if (!modelName) {\n return;\n }\n\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (timestamp >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n });\n }\n\n return createUsageSummary(\n \"claude\",\n totals,\n modelTotals,\n recentModelTotals,\n endDate,\n );\n}\n","import { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n forEachJsonLine,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface CodexRawUsage {\n input_tokens?: number;\n cached_input_tokens?: number;\n cache_read_input_tokens?: number;\n output_tokens?: number;\n reasoning_output_tokens?: number;\n total_tokens?: number;\n}\n\ninterface CodexEventInfo {\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n last_token_usage?: CodexRawUsage;\n total_token_usage?: CodexRawUsage;\n}\n\ninterface CodexEventPayload {\n type?: string;\n info?: CodexEventInfo;\n model?: string;\n model_name?: string;\n metadata?: { model?: string };\n}\n\ninterface CodexEventEntry {\n type?: string;\n timestamp: string;\n payload?: CodexEventPayload;\n}\n\ninterface CodexNormalizedUsage {\n input_tokens: number;\n cached_input_tokens: number;\n output_tokens: number;\n reasoning_output_tokens: number;\n total_tokens: number;\n}\n\nfunction normalizeCodexUsage(value?: CodexRawUsage) {\n if (!value) {\n return null;\n }\n\n const input = value.input_tokens ?? 0;\n const cached =\n value.cached_input_tokens ?? value.cache_read_input_tokens ?? 0;\n const output = value.output_tokens ?? 0;\n const reasoning = value.reasoning_output_tokens ?? 0;\n const total = value.total_tokens ?? 0;\n\n return {\n input_tokens: input,\n cached_input_tokens: cached,\n output_tokens: output,\n reasoning_output_tokens: reasoning,\n total_tokens: total > 0 ? total : input + output,\n };\n}\n\nfunction subtractCodexUsage(\n current: CodexNormalizedUsage,\n previous: CodexNormalizedUsage | null,\n) {\n return {\n input_tokens: Math.max(\n current.input_tokens - (previous?.input_tokens ?? 0),\n 0,\n ),\n cached_input_tokens: Math.max(\n current.cached_input_tokens - (previous?.cached_input_tokens ?? 0),\n 0,\n ),\n output_tokens: Math.max(\n current.output_tokens - (previous?.output_tokens ?? 0),\n 0,\n ),\n reasoning_output_tokens: Math.max(\n current.reasoning_output_tokens -\n (previous?.reasoning_output_tokens ?? 0),\n 0,\n ),\n total_tokens: Math.max(\n current.total_tokens - (previous?.total_tokens ?? 0),\n 0,\n ),\n };\n}\n\nfunction asNonEmptyString(value?: string) {\n const trimmed = value?.trim();\n\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nfunction extractCodexModel(payload?: CodexEventPayload) {\n const directModel =\n asNonEmptyString(payload?.model) ?? asNonEmptyString(payload?.model_name);\n\n if (directModel) {\n return directModel;\n }\n\n if (payload?.info) {\n const infoModel =\n asNonEmptyString(payload.info.model) ??\n asNonEmptyString(payload.info.model_name);\n\n if (infoModel) {\n return infoModel;\n }\n\n if (payload.info.metadata) {\n const model = asNonEmptyString(payload.info.metadata.model);\n\n if (model) {\n return model;\n }\n }\n }\n\n if (payload?.metadata) {\n return asNonEmptyString(payload.metadata.model);\n }\n\n return undefined;\n}\n\nasync function getCodexFiles() {\n const codexHome = process.env.CODEX_HOME?.trim()\n ? resolve(process.env.CODEX_HOME)\n : join(homedir(), \".codex\");\n\n const sessionsDir = join(codexHome, \"sessions\");\n\n const files = await listFilesRecursive(sessionsDir, \".jsonl\");\n\n return files;\n}\n\nexport async function loadCodexRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getCodexFiles();\n const totals: DailyTotalsByDate = new Map();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const file of files) {\n let previousTotals: CodexNormalizedUsage | null = null;\n let currentModel: string | undefined;\n\n await forEachJsonLine<CodexEventEntry>(file, async (entry) => {\n const extractedModel = extractCodexModel(entry.payload);\n\n if (entry.type === \"turn_context\") {\n currentModel = extractedModel ?? currentModel;\n\n return;\n }\n\n if (entry.type !== \"event_msg\" || entry.payload?.type !== \"token_count\") {\n return;\n }\n\n const info = entry.payload.info;\n const lastUsage = normalizeCodexUsage(info?.last_token_usage);\n const totalUsage = normalizeCodexUsage(info?.total_token_usage);\n let rawUsage = lastUsage;\n\n if (!rawUsage && totalUsage) {\n rawUsage = subtractCodexUsage(totalUsage, previousTotals);\n }\n\n if (totalUsage) {\n previousTotals = totalUsage;\n }\n\n if (!rawUsage) {\n return;\n }\n\n const usage: DailyTokenTotals = {\n input: rawUsage.input_tokens,\n output: rawUsage.output_tokens,\n cache: { input: rawUsage.cached_input_tokens, output: 0 },\n total: rawUsage.total_tokens,\n };\n\n if (usage.total <= 0) {\n return;\n }\n\n const date = new Date(entry.timestamp);\n\n if (date < start || date > end) {\n return;\n }\n\n const modelName = extractedModel ?? currentModel;\n const normalizedModelName = modelName\n ? normalizeModelName(modelName)\n : undefined;\n\n addDailyTokenTotals(totals, date, usage, normalizedModelName);\n\n if (normalizedModelName) {\n addModelTokenTotals(modelTotals, normalizedModelName, usage);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, normalizedModelName, usage);\n }\n }\n });\n }\n\n return createUsageSummary(\"codex\", totals, modelTotals, recentModelTotals, end);\n}\n","import type { UsageSummary } from \"../interfaces\";\n\nexport type ProviderId = UsageSummary[\"provider\"];\n\nexport const providerIds: ProviderId[] = [\"claude\", \"codex\", \"opencode\"];\n\nexport const providerStatusLabel: Record<ProviderId, string> = {\n claude: \"Claude code\",\n codex: \"Codex\",\n opencode: \"Open Code\",\n};\n","import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport type { UsageSummary } from \"../interfaces\";\nimport {\n type DailyTotalsByDate,\n type DailyTokenTotals,\n type ModelTokenTotals,\n addDailyTokenTotals,\n addModelTokenTotals,\n createUsageSummary,\n getRecentWindowStart,\n listFilesRecursive,\n normalizeModelName,\n} from \"./utils\";\n\ninterface OpenCodeTokenCache {\n read?: number;\n write?: number;\n}\n\ninterface OpenCodeTokens {\n input?: number;\n output?: number;\n cache?: OpenCodeTokenCache;\n}\n\ninterface OpenCodeMessage {\n id: string;\n providerID: string;\n modelID: string;\n time: { created: number };\n tokens?: OpenCodeTokens;\n}\n\nfunction sumOpenCodeTokens(tokens?: OpenCodeTokens): DailyTokenTotals {\n const cacheInput = tokens?.cache?.read ?? 0;\n const cacheOutput = tokens?.cache?.write ?? 0;\n const input = (tokens?.input ?? 0) + cacheInput;\n const output = (tokens?.output ?? 0) + cacheOutput;\n\n return {\n input,\n output,\n cache: { input: cacheInput, output: cacheOutput },\n total: input + output,\n };\n}\n\nasync function parseOpenCodeFile(filePath: string) {\n const content = await readFile(filePath, \"utf8\");\n\n return JSON.parse(content) as OpenCodeMessage;\n}\n\nasync function getOpenCodeFiles() {\n const baseDir = process.env.OPENCODE_DATA_DIR?.trim()\n ? resolve(process.env.OPENCODE_DATA_DIR)\n : join(homedir(), \".local\", \"share\", \"opencode\");\n\n const messagesDir = join(baseDir, \"storage\", \"message\");\n\n return listFilesRecursive(messagesDir, \".json\");\n}\n\nexport async function loadOpenCodeRows(\n start: Date,\n end: Date,\n): Promise<UsageSummary> {\n const files = await getOpenCodeFiles();\n const totals: DailyTotalsByDate = new Map();\n const dedupe = new Set<string>();\n const recentStart = getRecentWindowStart(end, 30);\n const modelTotals = new Map<string, ModelTokenTotals>();\n const recentModelTotals = new Map<string, ModelTokenTotals>();\n\n for (const file of files) {\n const message = await parseOpenCodeFile(file);\n\n if (dedupe.has(message.id)) {\n continue;\n }\n\n dedupe.add(message.id);\n\n const tokenTotals = sumOpenCodeTokens(message.tokens);\n\n if (tokenTotals.total <= 0) {\n continue;\n }\n\n const date = new Date(message.time.created);\n\n if (date < start || date > end) {\n continue;\n }\n\n const modelName = normalizeModelName(message.modelID);\n\n addDailyTokenTotals(totals, date, tokenTotals, modelName);\n addModelTokenTotals(modelTotals, modelName, tokenTotals);\n\n if (date >= recentStart) {\n addModelTokenTotals(recentModelTotals, modelName, tokenTotals);\n }\n }\n\n return createUsageSummary(\n \"opencode\",\n totals,\n modelTotals,\n recentModelTotals,\n end,\n );\n}\n","import type { UsageSummary } from \"./interfaces\";\nimport { loadClaudeRows } from \"./lib/claude-code\";\nimport { loadCodexRows } from \"./lib/codex\";\nimport {\n providerIds,\n providerStatusLabel,\n type ProviderId,\n} from \"./lib/interfaces\";\nimport { loadOpenCodeRows } from \"./lib/open-code\";\nimport { hasUsage } from \"./lib/utils\";\n\nexport { providerIds, providerStatusLabel, type ProviderId };\n\ninterface AggregateUsageOptions {\n start: Date;\n end: Date;\n providers?: ProviderId[];\n}\n\nexport async function aggregateUsage({\n start,\n end,\n providers,\n}: AggregateUsageOptions): Promise<Record<ProviderId, UsageSummary | null>> {\n const requestedProviders = providers?.length ? providers : providerIds;\n const rowsByProvider: Record<ProviderId, UsageSummary | null> = {\n claude: null,\n codex: null,\n opencode: null,\n };\n\n for (const provider of requestedProviders) {\n const summary =\n provider === \"claude\"\n ? await loadClaudeRows(start, end)\n : provider === \"codex\"\n ? await loadCodexRows(start, end)\n : await loadOpenCodeRows(start, end);\n\n rowsByProvider[provider] = hasUsage(summary) ? summary : null;\n }\n\n return rowsByProvider;\n}\n"],"mappings":"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AC,MAAM,QAAQ,eAAe,GAAG;AACnC;IACF;AACA,oBAAgB,QAAQ,SAAU,SAAe;AAC/C,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,UAAI,KAAK,iBAAiB,QAAQ,IAAI,MAAM,IAAI;AAC9C,cAAM,IAAI,MAAM,KAAK,OAAO,qBAAqB,OAAO,YAAY;MACtE;IACF,EAAE,KAAK,IAAI,CAAC;EACd;EAEA,KAAM,OAAoC;AACxC,QAAI,UAAU,MAAM,KAAK,MACvB;AAEF,QAAK,OAAO;AACV,WAAK,QAAQ,OAAO;AAClB,cAAM,QAAQ,MAAM,IAAI;AACxB,YAAI,UAAU,QAAW;AACvB;QACF;AACA,mBAAW,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;MACjD;IACF;AACA,eAAW;AACX,SAAK,OAAO;EACd;;;;AC7KK,IAAM,gBAAgB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,kBAAkB;EAC7B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKK,IAAM,4BAAoE;EAC/E,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,uBAAuB;IACnB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,oBAAoB;IAChB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,qBAAqB;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,sBAAsB;IAClB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,eAAe;IACX;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,gBAAgB;IACZ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,iBAAiB;IACb;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,KAAK;IACD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,WAAW;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,kBAAkB;IACd;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,UAAU;IACN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,YAAY;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,SAAS;IACL;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,OAAO;IACH;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEJ,QAAQ;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;I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","names":["resolve","registry","join","join","homedir","join","resolve","resolve","join","homedir","homedir","join","resolve","resolve","join","homedir","resolve"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slopmeter",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "CLI for generating yearly usage heatmaps for Claude Code, Codex, and Open Code.",
5
5
  "type": "module",
6
6
  "engines": {