@rabby-wallet/rabby-logger 0.2.1-alpha

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.
@@ -0,0 +1,64 @@
1
+ import type { AppLogWriter, AppLogWriterState } from "./writer";
2
+ export type LoggingFileSystemEntry = {
3
+ name: string;
4
+ path: string;
5
+ size: number;
6
+ mtimeMs?: number;
7
+ };
8
+ export interface LoggingFileSystemAdapter {
9
+ mkdir(path: string): Promise<void>;
10
+ readFile(path: string, encoding: "base64"): Promise<string>;
11
+ writeFile(path: string, contents: string, encoding: "base64"): Promise<void>;
12
+ appendFile(path: string, contents: string, encoding: "base64"): Promise<void>;
13
+ moveFile(from: string, to: string): Promise<void>;
14
+ listFiles(path: string): Promise<LoggingFileSystemEntry[]>;
15
+ unlink(path: string): Promise<void>;
16
+ }
17
+ export type RollingZipWriterState = AppLogWriterState & {
18
+ rootDir: string;
19
+ activeArchiveTempPath: string | null;
20
+ activeArchivePath: string | null;
21
+ activeEntryPath: string | null;
22
+ activeEntryBytes: number;
23
+ };
24
+ export type RollingZipWriterOptions = {
25
+ fs: LoggingFileSystemAdapter;
26
+ rootDir: string;
27
+ archivePrefix?: string;
28
+ maxEntryBytes?: number;
29
+ maxArchivedBytes?: number;
30
+ now?: () => Date;
31
+ onError?: (error: unknown) => void;
32
+ };
33
+ export declare class RollingZipLogWriter implements AppLogWriter {
34
+ readonly rootDir: string;
35
+ private readonly fs;
36
+ private readonly archivePrefix;
37
+ private readonly maxEntryBytes;
38
+ private readonly maxArchivedBytes;
39
+ private readonly now;
40
+ private readonly onError?;
41
+ private rootDirReady;
42
+ private archiveCounter;
43
+ private entryCounter;
44
+ private currentArchive;
45
+ constructor(options: RollingZipWriterOptions);
46
+ private ensureRootDir;
47
+ private makeArchiveBaseName;
48
+ private makeEntryName;
49
+ private isManagedArchiveFile;
50
+ private isFinalizedManagedArchiveFile;
51
+ private listManagedArchiveFiles;
52
+ private pruneOldArchivesIfNeeded;
53
+ private createArchiveState;
54
+ private restoreLatestArchiveIfPossible;
55
+ private createArchive;
56
+ private ensureArchive;
57
+ private closeCurrentEntry;
58
+ private ensureEntry;
59
+ writeLine(line: string): Promise<void>;
60
+ flush(): Promise<void>;
61
+ finalizeArchive(): Promise<string | null>;
62
+ getState(): RollingZipWriterState;
63
+ }
64
+ //# sourceMappingURL=rollingZipWriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollingZipWriter.d.ts","sourceRoot":"","sources":["../src/rollingZipWriter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEhE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,wBAAwB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,CAAC;AAqFF,qBAAa,mBAAoB,YAAW,YAAY;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA2B;IAEpD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAA6B;gBAEvC,OAAO,EAAE,uBAAuB;IAW5C,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,6BAA6B;YAIvB,uBAAuB;YAOvB,wBAAwB;YAiCxB,kBAAkB;YAqClB,8BAA8B;YAsE9B,aAAa;YAgBb,aAAa;YAab,iBAAiB;YAajB,WAAW;IA0BnB,SAAS,CAAC,IAAI,EAAE,MAAM;IAUtB,KAAK;IAIL,eAAe;IAoBrB,QAAQ,IAAI,qBAAqB;CASlC"}
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RollingZipLogWriter = void 0;
4
+ const fflate_1 = require("fflate");
5
+ const format_1 = require("./format");
6
+ const DEFAULT_MAX_ENTRY_BYTES = 1024 * 1024;
7
+ const DEFAULT_MAX_ARCHIVED_BYTES = 500 * 1024 * 1024;
8
+ const BASE64_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
9
+ const BASE64_LOOKUP = new Uint8Array(256).fill(255);
10
+ const EMPTY_CHUNK = new Uint8Array(0);
11
+ for (let index = 0; index < BASE64_TABLE.length; index += 1) {
12
+ BASE64_LOOKUP[BASE64_TABLE.charCodeAt(index)] = index;
13
+ }
14
+ function u8ToBase64(input) {
15
+ var _a, _b, _c;
16
+ let output = "";
17
+ for (let index = 0; index < input.length; index += 3) {
18
+ const byte1 = (_a = input[index]) !== null && _a !== void 0 ? _a : 0;
19
+ const byte2 = (_b = input[index + 1]) !== null && _b !== void 0 ? _b : 0;
20
+ const byte3 = (_c = input[index + 2]) !== null && _c !== void 0 ? _c : 0;
21
+ const combined = byte1 * 65536 + byte2 * 256 + byte3;
22
+ output += BASE64_TABLE[Math.floor(combined / 262144) % 64];
23
+ output += BASE64_TABLE[Math.floor(combined / 4096) % 64];
24
+ output +=
25
+ index + 1 < input.length
26
+ ? BASE64_TABLE[Math.floor(combined / 64) % 64]
27
+ : "=";
28
+ output += index + 2 < input.length ? BASE64_TABLE[combined % 64] : "=";
29
+ }
30
+ return output;
31
+ }
32
+ function base64ToU8(input) {
33
+ const sanitized = input.replace(/\s+/g, "");
34
+ if (!sanitized) {
35
+ return EMPTY_CHUNK;
36
+ }
37
+ const padding = (sanitized.endsWith("==") ? 2 : 0) || (sanitized.endsWith("=") ? 1 : 0);
38
+ const output = new Uint8Array(Math.floor((sanitized.length * 3) / 4) - padding);
39
+ let outIndex = 0;
40
+ for (let index = 0; index < sanitized.length; index += 4) {
41
+ const code0 = BASE64_LOOKUP[sanitized.charCodeAt(index)] || 0;
42
+ const code1 = BASE64_LOOKUP[sanitized.charCodeAt(index + 1)] || 0;
43
+ const code2 = sanitized[index + 2] === "="
44
+ ? 0
45
+ : BASE64_LOOKUP[sanitized.charCodeAt(index + 2)] || 0;
46
+ const code3 = sanitized[index + 3] === "="
47
+ ? 0
48
+ : BASE64_LOOKUP[sanitized.charCodeAt(index + 3)] || 0;
49
+ const combined = code0 * 262144 + code1 * 4096 + code2 * 64 + code3;
50
+ output[outIndex++] = Math.floor(combined / 65536) % 256;
51
+ if (sanitized[index + 2] !== "=" && outIndex < output.length) {
52
+ output[outIndex++] = Math.floor(combined / 256) % 256;
53
+ }
54
+ if (sanitized[index + 3] !== "=" && outIndex < output.length) {
55
+ output[outIndex++] = combined % 256;
56
+ }
57
+ }
58
+ return output;
59
+ }
60
+ class RollingZipLogWriter {
61
+ constructor(options) {
62
+ this.rootDirReady = null;
63
+ this.archiveCounter = 0;
64
+ this.entryCounter = 0;
65
+ this.currentArchive = null;
66
+ this.fs = options.fs;
67
+ this.rootDir = options.rootDir;
68
+ this.archivePrefix = options.archivePrefix || "rabby-mobile-logs";
69
+ this.maxEntryBytes = options.maxEntryBytes || DEFAULT_MAX_ENTRY_BYTES;
70
+ this.maxArchivedBytes =
71
+ options.maxArchivedBytes || DEFAULT_MAX_ARCHIVED_BYTES;
72
+ this.now = options.now || (() => new Date());
73
+ this.onError = options.onError;
74
+ }
75
+ ensureRootDir() {
76
+ if (!this.rootDirReady) {
77
+ this.rootDirReady = this.fs.mkdir(this.rootDir);
78
+ }
79
+ return this.rootDirReady;
80
+ }
81
+ makeArchiveBaseName(date) {
82
+ return [
83
+ this.archivePrefix,
84
+ (0, format_1.formatFileTimestamp)(date),
85
+ String(this.archiveCounter++).padStart(3, "0"),
86
+ ].join("-");
87
+ }
88
+ makeEntryName(date) {
89
+ return [
90
+ "logs",
91
+ (0, format_1.formatDateFolder)(date),
92
+ `${(0, format_1.formatFileTimestamp)(date)}-${String(this.entryCounter++).padStart(3, "0")}.log`,
93
+ ].join("/");
94
+ }
95
+ isManagedArchiveFile(file) {
96
+ return (file.name.startsWith(this.archivePrefix) &&
97
+ (file.name.endsWith(".zip") || file.name.endsWith(".zip.partial")));
98
+ }
99
+ isFinalizedManagedArchiveFile(file) {
100
+ return file.name.startsWith(this.archivePrefix) && file.name.endsWith(".zip");
101
+ }
102
+ async listManagedArchiveFiles() {
103
+ await this.ensureRootDir();
104
+ return (await this.fs.listFiles(this.rootDir)).filter((file) => this.isManagedArchiveFile(file));
105
+ }
106
+ async pruneOldArchivesIfNeeded(excludePaths = []) {
107
+ if (this.maxArchivedBytes <= 0) {
108
+ return;
109
+ }
110
+ const excluded = new Set(excludePaths);
111
+ const archivedFiles = (await this.listManagedArchiveFiles())
112
+ .filter((file) => this.isFinalizedManagedArchiveFile(file))
113
+ .sort((left, right) => {
114
+ const leftMtime = left.mtimeMs || 0;
115
+ const rightMtime = right.mtimeMs || 0;
116
+ if (leftMtime !== rightMtime) {
117
+ return leftMtime - rightMtime;
118
+ }
119
+ return left.name.localeCompare(right.name);
120
+ });
121
+ let totalBytes = archivedFiles.reduce((sum, file) => sum + file.size, 0);
122
+ let index = 0;
123
+ while (totalBytes >= this.maxArchivedBytes && index < archivedFiles.length) {
124
+ const target = archivedFiles[index++];
125
+ if (excluded.has(target.path)) {
126
+ continue;
127
+ }
128
+ await this.fs.unlink(target.path);
129
+ totalBytes -= target.size;
130
+ }
131
+ }
132
+ async createArchiveState(options) {
133
+ let archiveState;
134
+ const zip = new fflate_1.Zip((error, chunk) => {
135
+ var _a;
136
+ if (error) {
137
+ (_a = this.onError) === null || _a === void 0 ? void 0 : _a.call(this, error);
138
+ return;
139
+ }
140
+ if (!chunk || !chunk.length) {
141
+ return;
142
+ }
143
+ archiveState.fileWriteQueue = archiveState.fileWriteQueue.then(() => this.fs.appendFile(options.tempPath, u8ToBase64(chunk), "base64"));
144
+ });
145
+ archiveState = {
146
+ tempPath: options.tempPath,
147
+ finalPath: options.finalPath,
148
+ replaceFinalOnFinalize: options.replaceFinalOnFinalize,
149
+ zip,
150
+ fileWriteQueue: Promise.resolve(),
151
+ currentEntry: null,
152
+ currentEntryPath: null,
153
+ currentEntryBytes: 0,
154
+ };
155
+ await this.fs.writeFile(options.tempPath, "", "base64");
156
+ this.currentArchive = archiveState;
157
+ return archiveState;
158
+ }
159
+ async restoreLatestArchiveIfPossible() {
160
+ var _a;
161
+ const latestArchive = (await this.listManagedArchiveFiles())
162
+ .filter((file) => this.isFinalizedManagedArchiveFile(file))
163
+ .sort((left, right) => {
164
+ const rightMtime = right.mtimeMs || 0;
165
+ const leftMtime = left.mtimeMs || 0;
166
+ if (rightMtime !== leftMtime) {
167
+ return rightMtime - leftMtime;
168
+ }
169
+ return right.name.localeCompare(left.name);
170
+ })[0];
171
+ if (!latestArchive) {
172
+ return null;
173
+ }
174
+ try {
175
+ await this.pruneOldArchivesIfNeeded([latestArchive.path]);
176
+ const archivedBase64 = await this.fs.readFile(latestArchive.path, "base64");
177
+ const archivedEntries = (0, fflate_1.unzipSync)(base64ToU8(archivedBase64));
178
+ const entryNames = Object.keys(archivedEntries).sort((left, right) => left.localeCompare(right));
179
+ const logEntryNames = entryNames.filter((name) => name.endsWith(".log"));
180
+ const latestEntryPath = logEntryNames[logEntryNames.length - 1] || null;
181
+ const latestEntryBytes = latestEntryPath
182
+ ? (archivedEntries[latestEntryPath] || EMPTY_CHUNK).byteLength
183
+ : 0;
184
+ const continueLatestEntry = !!latestEntryPath && latestEntryBytes < this.maxEntryBytes;
185
+ this.entryCounter = Math.max(this.entryCounter, logEntryNames.length);
186
+ const archive = await this.createArchiveState({
187
+ finalPath: latestArchive.path,
188
+ tempPath: `${latestArchive.path}.partial`,
189
+ replaceFinalOnFinalize: true,
190
+ });
191
+ for (const entryName of entryNames) {
192
+ const entryBytes = archivedEntries[entryName] || EMPTY_CHUNK;
193
+ const entry = new fflate_1.ZipDeflate(entryName, {
194
+ level: 6,
195
+ });
196
+ archive.zip.add(entry);
197
+ if (continueLatestEntry && entryName === latestEntryPath) {
198
+ entry.push(entryBytes, false);
199
+ archive.currentEntry = entry;
200
+ archive.currentEntryPath = entryName;
201
+ archive.currentEntryBytes = entryBytes.byteLength;
202
+ }
203
+ else {
204
+ entry.push(entryBytes, true);
205
+ }
206
+ await archive.fileWriteQueue;
207
+ }
208
+ return archive;
209
+ }
210
+ catch (error) {
211
+ this.currentArchive = null;
212
+ (_a = this.onError) === null || _a === void 0 ? void 0 : _a.call(this, error);
213
+ return null;
214
+ }
215
+ }
216
+ async createArchive() {
217
+ await this.ensureRootDir();
218
+ await this.pruneOldArchivesIfNeeded();
219
+ const now = this.now();
220
+ const baseName = this.makeArchiveBaseName(now);
221
+ const finalPath = `${this.rootDir}/${baseName}.zip`;
222
+ const tempPath = `${finalPath}.partial`;
223
+ return this.createArchiveState({
224
+ finalPath,
225
+ tempPath,
226
+ replaceFinalOnFinalize: false,
227
+ });
228
+ }
229
+ async ensureArchive() {
230
+ if (this.currentArchive) {
231
+ return this.currentArchive;
232
+ }
233
+ const restoredArchive = await this.restoreLatestArchiveIfPossible();
234
+ if (restoredArchive) {
235
+ return restoredArchive;
236
+ }
237
+ return this.createArchive();
238
+ }
239
+ async closeCurrentEntry() {
240
+ var _a;
241
+ if (!((_a = this.currentArchive) === null || _a === void 0 ? void 0 : _a.currentEntry)) {
242
+ return;
243
+ }
244
+ this.currentArchive.currentEntry.push(EMPTY_CHUNK, true);
245
+ await this.currentArchive.fileWriteQueue;
246
+ this.currentArchive.currentEntry = null;
247
+ this.currentArchive.currentEntryPath = null;
248
+ this.currentArchive.currentEntryBytes = 0;
249
+ }
250
+ async ensureEntry(nextLineBytes) {
251
+ const archive = await this.ensureArchive();
252
+ if (archive.currentEntry &&
253
+ archive.currentEntryBytes > 0 &&
254
+ archive.currentEntryBytes + nextLineBytes > this.maxEntryBytes) {
255
+ await this.closeCurrentEntry();
256
+ }
257
+ if (!archive.currentEntry) {
258
+ await this.pruneOldArchivesIfNeeded([archive.finalPath]);
259
+ const entry = new fflate_1.ZipDeflate(this.makeEntryName(this.now()), {
260
+ level: 6,
261
+ });
262
+ archive.zip.add(entry);
263
+ archive.currentEntry = entry;
264
+ archive.currentEntryPath = entry.filename;
265
+ archive.currentEntryBytes = 0;
266
+ }
267
+ return archive;
268
+ }
269
+ async writeLine(line) {
270
+ var _a;
271
+ const lineBytes = (0, fflate_1.strToU8)(line);
272
+ const archive = await this.ensureEntry(lineBytes.length);
273
+ archive.currentEntryBytes += lineBytes.length;
274
+ (_a = archive.currentEntry) === null || _a === void 0 ? void 0 : _a.push(lineBytes, false);
275
+ await archive.fileWriteQueue;
276
+ }
277
+ async flush() {
278
+ var _a;
279
+ await ((_a = this.currentArchive) === null || _a === void 0 ? void 0 : _a.fileWriteQueue);
280
+ }
281
+ async finalizeArchive() {
282
+ const archive = this.currentArchive;
283
+ if (!archive) {
284
+ return null;
285
+ }
286
+ try {
287
+ await this.closeCurrentEntry();
288
+ archive.zip.end();
289
+ await archive.fileWriteQueue;
290
+ if (archive.replaceFinalOnFinalize) {
291
+ await this.fs.unlink(archive.finalPath).catch(() => undefined);
292
+ }
293
+ await this.fs.moveFile(archive.tempPath, archive.finalPath);
294
+ return archive.finalPath;
295
+ }
296
+ finally {
297
+ this.currentArchive = null;
298
+ }
299
+ }
300
+ getState() {
301
+ var _a, _b, _c, _d;
302
+ return {
303
+ rootDir: this.rootDir,
304
+ activeArchiveTempPath: ((_a = this.currentArchive) === null || _a === void 0 ? void 0 : _a.tempPath) || null,
305
+ activeArchivePath: ((_b = this.currentArchive) === null || _b === void 0 ? void 0 : _b.finalPath) || null,
306
+ activeEntryPath: ((_c = this.currentArchive) === null || _c === void 0 ? void 0 : _c.currentEntryPath) || null,
307
+ activeEntryBytes: ((_d = this.currentArchive) === null || _d === void 0 ? void 0 : _d.currentEntryBytes) || 0,
308
+ };
309
+ }
310
+ }
311
+ exports.RollingZipLogWriter = RollingZipLogWriter;
312
+ //# sourceMappingURL=rollingZipWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollingZipWriter.js","sourceRoot":"","sources":["../src/rollingZipWriter.ts"],"names":[],"mappings":";;;AAAA,mCAA6D;AAE7D,qCAAiE;AAiDjE,MAAM,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5C,MAAM,0BAA0B,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,MAAM,YAAY,GAChB,kEAAkE,CAAC;AACrE,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAEtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;IAC5D,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CAAC,KAAiB;;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAA,KAAK,CAAC,KAAK,CAAC,mCAAI,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;QAErD,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM;YACJ,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM;gBACtB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;gBAC9C,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GACX,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CACjD,CAAC;IACF,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,KAAK,GACT,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YAC1B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,KAAK,GACT,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;YAC1B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC;QAEpE,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;QAExD,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACxD,CAAC;QAED,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAa,mBAAmB;IAe9B,YAAY,OAAgC;QALpC,iBAAY,GAAyB,IAAI,CAAC;QAC1C,mBAAc,GAAG,CAAC,CAAC;QACnB,iBAAY,GAAG,CAAC,CAAC;QACjB,mBAAc,GAAwB,IAAI,CAAC;QAGjD,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,mBAAmB,CAAC;QAClE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC;QACtE,IAAI,CAAC,gBAAgB;YACnB,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;QACzD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,mBAAmB,CAAC,IAAU;QACpC,OAAO;YACL,IAAI,CAAC,aAAa;YAClB,IAAA,4BAAmB,EAAC,IAAI,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;SAC/C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,IAAU;QAC9B,OAAO;YACL,MAAM;YACN,IAAA,yBAAgB,EAAC,IAAI,CAAC;YACtB,GAAG,IAAA,4BAAmB,EAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAClE,CAAC,EACD,GAAG,CACJ,MAAM;SACR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAEO,oBAAoB,CAAC,IAA4B;QACvD,OAAO,CACL,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;YACxC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC;IAEO,6BAA6B,CAAC,IAA4B;QAChE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7D,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAChC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,eAAyB,EAAE;QAChE,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;aACzD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;aAC1D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YAEtC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC7B,OAAO,SAAS,GAAG,UAAU,CAAC;YAChC,CAAC;YAED,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEL,IAAI,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,UAAU,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;YAC3E,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,OAIhC;QACC,IAAI,YAA0B,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,YAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,YAAY,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAClE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,YAAY,GAAG;YACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;YACtD,GAAG;YACH,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE;YACjC,YAAY,EAAE,IAAI;YAClB,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,CAAC;SACrB,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC;QACnC,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,8BAA8B;;QAC1C,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;aACzD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;aAC1D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAEpC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,OAAO,UAAU,GAAG,SAAS,CAAC;YAChC,CAAC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAER,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,wBAAwB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAE1D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5E,MAAM,eAAe,GAAG,IAAA,kBAAS,EAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAC1B,CAAC;YACF,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACzE,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;YACxE,MAAM,gBAAgB,GAAG,eAAe;gBACtC,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,CAAC,UAAU;gBAC9D,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,mBAAmB,GACvB,CAAC,CAAC,eAAe,IAAI,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC;YAE7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;YAEtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC;gBAC5C,SAAS,EAAE,aAAa,CAAC,IAAI;gBAC7B,QAAQ,EAAE,GAAG,aAAa,CAAC,IAAI,UAAU;gBACzC,sBAAsB,EAAE,IAAI;aAC7B,CAAC,CAAC;YAEH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC;gBAC7D,MAAM,KAAK,GAAG,IAAI,mBAAU,CAAC,SAAS,EAAE;oBACtC,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBAEH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEvB,IAAI,mBAAmB,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;oBACzD,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBAC9B,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;oBAC7B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBACrC,OAAO,CAAC,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBAED,MAAM,OAAO,CAAC,cAAc,CAAC;YAC/B,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,GAAG,SAAS,UAAU,CAAC;QAExC,OAAO,IAAI,CAAC,kBAAkB,CAAC;YAC7B,SAAS;YACT,QAAQ;YACR,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACpE,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,iBAAiB;;QAC7B,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,YAAY,CAAA,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;QAEzC,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,aAAqB;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE3C,IACE,OAAO,CAAC,YAAY;YACpB,OAAO,CAAC,iBAAiB,GAAG,CAAC;YAC7B,OAAO,CAAC,iBAAiB,GAAG,aAAa,GAAG,IAAI,CAAC,aAAa,EAC9D,CAAC;YACD,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAEzD,MAAM,KAAK,GAAG,IAAI,mBAAU,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;gBAC3D,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;YAC7B,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC1C,OAAO,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;;QAC1B,MAAM,SAAS,GAAG,IAAA,gBAAO,EAAC,IAAI,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEzD,OAAO,CAAC,iBAAiB,IAAI,SAAS,CAAC,MAAM,CAAC;QAC9C,MAAA,OAAO,CAAC,YAAY,0CAAE,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,OAAO,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,MAAM,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,cAAc,CAAA,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,OAAO,CAAC,cAAc,CAAC;YAC7B,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5D,OAAO,OAAO,CAAC,SAAS,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,QAAQ;;QACN,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,qBAAqB,EAAE,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,QAAQ,KAAI,IAAI;YAC5D,iBAAiB,EAAE,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,SAAS,KAAI,IAAI;YACzD,eAAe,EAAE,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,gBAAgB,KAAI,IAAI;YAC9D,gBAAgB,EAAE,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,iBAAiB,KAAI,CAAC;SAC9D,CAAC;IACJ,CAAC;CACF;AAlUD,kDAkUC"}
@@ -0,0 +1,73 @@
1
+ export declare const RABBY_LOG_PROTOCOL_PREFIX = "@rabby-log/";
2
+ export declare const RABBY_LOG_PROTOCOL_V1 = "@rabby-log/v1";
3
+ export type RabbyLogParseIssueKind = "invalid-line" | "invalid-json" | "unsupported-file" | "unsupported-format";
4
+ export type RabbyLogParseIssue = {
5
+ kind: RabbyLogParseIssueKind;
6
+ inputName: string;
7
+ fileName: string;
8
+ archiveName?: string;
9
+ entryName?: string;
10
+ lineNumber?: number;
11
+ message: string;
12
+ rawLine?: string;
13
+ };
14
+ export type RabbyParsedLogRecord = {
15
+ id: string;
16
+ inputName: string;
17
+ fileName: string;
18
+ archiveName?: string;
19
+ entryName?: string;
20
+ lineNumber: number;
21
+ protocolVersion: string;
22
+ headerFields: Record<string, string>;
23
+ headerTokens: string[];
24
+ timestamp: string | null;
25
+ timestampMs: number | null;
26
+ level: string | null;
27
+ source: string | null;
28
+ method: string | null;
29
+ env: string | null;
30
+ sessionId: string | null;
31
+ sequence: number | null;
32
+ format: string | null;
33
+ platform?: string;
34
+ message: string;
35
+ body: unknown;
36
+ rawLine: string;
37
+ };
38
+ export type RabbyParsedLogFile = {
39
+ inputName: string;
40
+ fileName: string;
41
+ archiveName?: string;
42
+ entryName?: string;
43
+ records: RabbyParsedLogRecord[];
44
+ issues: RabbyLogParseIssue[];
45
+ };
46
+ export type RabbyParsedLogInput = {
47
+ inputName: string;
48
+ kind: "log" | "zip";
49
+ files: RabbyParsedLogFile[];
50
+ records: RabbyParsedLogRecord[];
51
+ issues: RabbyLogParseIssue[];
52
+ };
53
+ export type RabbyMergedLogDataset = {
54
+ inputs: RabbyParsedLogInput[];
55
+ files: RabbyParsedLogFile[];
56
+ records: RabbyParsedLogRecord[];
57
+ issues: RabbyLogParseIssue[];
58
+ };
59
+ export type ParseLineContext = {
60
+ inputName: string;
61
+ fileName: string;
62
+ lineNumber: number;
63
+ archiveName?: string;
64
+ entryName?: string;
65
+ };
66
+ export type ParseLineResult = {
67
+ ok: true;
68
+ record: RabbyParsedLogRecord;
69
+ } | {
70
+ ok: false;
71
+ issue: RabbyLogParseIssue;
72
+ };
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RABBY_LOG_PROTOCOL_V1 = exports.RABBY_LOG_PROTOCOL_PREFIX = void 0;
4
+ exports.RABBY_LOG_PROTOCOL_PREFIX = "@rabby-log/";
5
+ exports.RABBY_LOG_PROTOCOL_V1 = "@rabby-log/v1";
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAa,QAAA,yBAAyB,GAAG,aAAa,CAAC;AAC1C,QAAA,qBAAqB,GAAG,eAAe,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type AppLogWriterState = {
2
+ rootDir?: string;
3
+ activeArchiveTempPath?: string | null;
4
+ activeArchivePath?: string | null;
5
+ activeEntryPath?: string | null;
6
+ activeEntryBytes?: number;
7
+ };
8
+ export interface AppLogWriter {
9
+ writeLine(line: string): Promise<void>;
10
+ flush(): Promise<void>;
11
+ finalizeArchive(): Promise<string | null>;
12
+ getState(): AppLogWriterState;
13
+ }
14
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,QAAQ,IAAI,iBAAiB,CAAC;CAC/B"}
package/dist/writer.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@rabby-wallet/rabby-logger",
3
+ "version": "0.2.1-alpha",
4
+ "description": "Rabby log parser and platform-agnostic logger core with rolling zip writer",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "rabby",
8
+ "logger",
9
+ "logs",
10
+ "parser",
11
+ "react-native",
12
+ "browser-extension"
13
+ ],
14
+ "sideEffects": false,
15
+ "engines": {
16
+ "node": ">=22"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public",
20
+ "registry": "https://registry.npmjs.org/"
21
+ },
22
+ "main": "./dist/index.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.js",
29
+ "default": "./dist/index.js"
30
+ }
31
+ },
32
+ "dependencies": {
33
+ "fflate": "^0.8.2"
34
+ }
35
+ }