gitx.do 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/durable-object/object-store.d.ts +113 -0
  4. package/dist/durable-object/object-store.d.ts.map +1 -0
  5. package/dist/durable-object/object-store.js +387 -0
  6. package/dist/durable-object/object-store.js.map +1 -0
  7. package/dist/durable-object/schema.d.ts +17 -0
  8. package/dist/durable-object/schema.d.ts.map +1 -0
  9. package/dist/durable-object/schema.js +43 -0
  10. package/dist/durable-object/schema.js.map +1 -0
  11. package/dist/durable-object/wal.d.ts +111 -0
  12. package/dist/durable-object/wal.d.ts.map +1 -0
  13. package/dist/durable-object/wal.js +200 -0
  14. package/dist/durable-object/wal.js.map +1 -0
  15. package/dist/index.d.ts +24 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +101 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/adapter.d.ts +231 -0
  20. package/dist/mcp/adapter.d.ts.map +1 -0
  21. package/dist/mcp/adapter.js +502 -0
  22. package/dist/mcp/adapter.js.map +1 -0
  23. package/dist/mcp/sandbox.d.ts +261 -0
  24. package/dist/mcp/sandbox.d.ts.map +1 -0
  25. package/dist/mcp/sandbox.js +983 -0
  26. package/dist/mcp/sandbox.js.map +1 -0
  27. package/dist/mcp/sdk-adapter.d.ts +413 -0
  28. package/dist/mcp/sdk-adapter.d.ts.map +1 -0
  29. package/dist/mcp/sdk-adapter.js +672 -0
  30. package/dist/mcp/sdk-adapter.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +133 -0
  32. package/dist/mcp/tools.d.ts.map +1 -0
  33. package/dist/mcp/tools.js +1604 -0
  34. package/dist/mcp/tools.js.map +1 -0
  35. package/dist/ops/blame.d.ts +148 -0
  36. package/dist/ops/blame.d.ts.map +1 -0
  37. package/dist/ops/blame.js +754 -0
  38. package/dist/ops/blame.js.map +1 -0
  39. package/dist/ops/branch.d.ts +215 -0
  40. package/dist/ops/branch.d.ts.map +1 -0
  41. package/dist/ops/branch.js +608 -0
  42. package/dist/ops/branch.js.map +1 -0
  43. package/dist/ops/commit-traversal.d.ts +209 -0
  44. package/dist/ops/commit-traversal.d.ts.map +1 -0
  45. package/dist/ops/commit-traversal.js +755 -0
  46. package/dist/ops/commit-traversal.js.map +1 -0
  47. package/dist/ops/commit.d.ts +221 -0
  48. package/dist/ops/commit.d.ts.map +1 -0
  49. package/dist/ops/commit.js +606 -0
  50. package/dist/ops/commit.js.map +1 -0
  51. package/dist/ops/merge-base.d.ts +223 -0
  52. package/dist/ops/merge-base.d.ts.map +1 -0
  53. package/dist/ops/merge-base.js +581 -0
  54. package/dist/ops/merge-base.js.map +1 -0
  55. package/dist/ops/merge.d.ts +385 -0
  56. package/dist/ops/merge.d.ts.map +1 -0
  57. package/dist/ops/merge.js +1203 -0
  58. package/dist/ops/merge.js.map +1 -0
  59. package/dist/ops/tag.d.ts +182 -0
  60. package/dist/ops/tag.d.ts.map +1 -0
  61. package/dist/ops/tag.js +608 -0
  62. package/dist/ops/tag.js.map +1 -0
  63. package/dist/ops/tree-builder.d.ts +82 -0
  64. package/dist/ops/tree-builder.d.ts.map +1 -0
  65. package/dist/ops/tree-builder.js +246 -0
  66. package/dist/ops/tree-builder.js.map +1 -0
  67. package/dist/ops/tree-diff.d.ts +243 -0
  68. package/dist/ops/tree-diff.d.ts.map +1 -0
  69. package/dist/ops/tree-diff.js +657 -0
  70. package/dist/ops/tree-diff.js.map +1 -0
  71. package/dist/pack/delta.d.ts +68 -0
  72. package/dist/pack/delta.d.ts.map +1 -0
  73. package/dist/pack/delta.js +343 -0
  74. package/dist/pack/delta.js.map +1 -0
  75. package/dist/pack/format.d.ts +84 -0
  76. package/dist/pack/format.d.ts.map +1 -0
  77. package/dist/pack/format.js +261 -0
  78. package/dist/pack/format.js.map +1 -0
  79. package/dist/pack/full-generation.d.ts +327 -0
  80. package/dist/pack/full-generation.d.ts.map +1 -0
  81. package/dist/pack/full-generation.js +1159 -0
  82. package/dist/pack/full-generation.js.map +1 -0
  83. package/dist/pack/generation.d.ts +118 -0
  84. package/dist/pack/generation.d.ts.map +1 -0
  85. package/dist/pack/generation.js +459 -0
  86. package/dist/pack/generation.js.map +1 -0
  87. package/dist/pack/index.d.ts +181 -0
  88. package/dist/pack/index.d.ts.map +1 -0
  89. package/dist/pack/index.js +552 -0
  90. package/dist/pack/index.js.map +1 -0
  91. package/dist/refs/branch.d.ts +224 -0
  92. package/dist/refs/branch.d.ts.map +1 -0
  93. package/dist/refs/branch.js +170 -0
  94. package/dist/refs/branch.js.map +1 -0
  95. package/dist/refs/storage.d.ts +208 -0
  96. package/dist/refs/storage.d.ts.map +1 -0
  97. package/dist/refs/storage.js +421 -0
  98. package/dist/refs/storage.js.map +1 -0
  99. package/dist/refs/tag.d.ts +230 -0
  100. package/dist/refs/tag.d.ts.map +1 -0
  101. package/dist/refs/tag.js +188 -0
  102. package/dist/refs/tag.js.map +1 -0
  103. package/dist/storage/lru-cache.d.ts +188 -0
  104. package/dist/storage/lru-cache.d.ts.map +1 -0
  105. package/dist/storage/lru-cache.js +410 -0
  106. package/dist/storage/lru-cache.js.map +1 -0
  107. package/dist/storage/object-index.d.ts +140 -0
  108. package/dist/storage/object-index.d.ts.map +1 -0
  109. package/dist/storage/object-index.js +166 -0
  110. package/dist/storage/object-index.js.map +1 -0
  111. package/dist/storage/r2-pack.d.ts +394 -0
  112. package/dist/storage/r2-pack.d.ts.map +1 -0
  113. package/dist/storage/r2-pack.js +1062 -0
  114. package/dist/storage/r2-pack.js.map +1 -0
  115. package/dist/tiered/cdc-pipeline.d.ts +316 -0
  116. package/dist/tiered/cdc-pipeline.d.ts.map +1 -0
  117. package/dist/tiered/cdc-pipeline.js +771 -0
  118. package/dist/tiered/cdc-pipeline.js.map +1 -0
  119. package/dist/tiered/migration.d.ts +242 -0
  120. package/dist/tiered/migration.d.ts.map +1 -0
  121. package/dist/tiered/migration.js +592 -0
  122. package/dist/tiered/migration.js.map +1 -0
  123. package/dist/tiered/parquet-writer.d.ts +248 -0
  124. package/dist/tiered/parquet-writer.d.ts.map +1 -0
  125. package/dist/tiered/parquet-writer.js +555 -0
  126. package/dist/tiered/parquet-writer.js.map +1 -0
  127. package/dist/tiered/read-path.d.ts +141 -0
  128. package/dist/tiered/read-path.d.ts.map +1 -0
  129. package/dist/tiered/read-path.js +204 -0
  130. package/dist/tiered/read-path.js.map +1 -0
  131. package/dist/types/objects.d.ts +53 -0
  132. package/dist/types/objects.d.ts.map +1 -0
  133. package/dist/types/objects.js +291 -0
  134. package/dist/types/objects.js.map +1 -0
  135. package/dist/types/storage.d.ts +117 -0
  136. package/dist/types/storage.d.ts.map +1 -0
  137. package/dist/types/storage.js +8 -0
  138. package/dist/types/storage.js.map +1 -0
  139. package/dist/utils/hash.d.ts +31 -0
  140. package/dist/utils/hash.d.ts.map +1 -0
  141. package/dist/utils/hash.js +60 -0
  142. package/dist/utils/hash.js.map +1 -0
  143. package/dist/utils/sha1.d.ts +26 -0
  144. package/dist/utils/sha1.d.ts.map +1 -0
  145. package/dist/utils/sha1.js +127 -0
  146. package/dist/utils/sha1.js.map +1 -0
  147. package/dist/wire/capabilities.d.ts +236 -0
  148. package/dist/wire/capabilities.d.ts.map +1 -0
  149. package/dist/wire/capabilities.js +437 -0
  150. package/dist/wire/capabilities.js.map +1 -0
  151. package/dist/wire/pkt-line.d.ts +67 -0
  152. package/dist/wire/pkt-line.d.ts.map +1 -0
  153. package/dist/wire/pkt-line.js +145 -0
  154. package/dist/wire/pkt-line.js.map +1 -0
  155. package/dist/wire/receive-pack.d.ts +302 -0
  156. package/dist/wire/receive-pack.d.ts.map +1 -0
  157. package/dist/wire/receive-pack.js +885 -0
  158. package/dist/wire/receive-pack.js.map +1 -0
  159. package/dist/wire/smart-http.d.ts +321 -0
  160. package/dist/wire/smart-http.d.ts.map +1 -0
  161. package/dist/wire/smart-http.js +654 -0
  162. package/dist/wire/smart-http.js.map +1 -0
  163. package/dist/wire/upload-pack.d.ts +333 -0
  164. package/dist/wire/upload-pack.d.ts.map +1 -0
  165. package/dist/wire/upload-pack.js +850 -0
  166. package/dist/wire/upload-pack.js.map +1 -0
  167. package/package.json +61 -0
@@ -0,0 +1,657 @@
1
+ /**
2
+ * Tree Diff Operations
3
+ *
4
+ * This module provides functionality for comparing Git trees and detecting
5
+ * changes between them, including added, deleted, modified, renamed, and
6
+ * copied files.
7
+ */
8
+ /**
9
+ * Status of a file in a diff
10
+ */
11
+ export var DiffStatus;
12
+ (function (DiffStatus) {
13
+ /** File was added */
14
+ DiffStatus["ADDED"] = "A";
15
+ /** File was deleted */
16
+ DiffStatus["DELETED"] = "D";
17
+ /** File was modified */
18
+ DiffStatus["MODIFIED"] = "M";
19
+ /** File was renamed */
20
+ DiffStatus["RENAMED"] = "R";
21
+ /** File was copied */
22
+ DiffStatus["COPIED"] = "C";
23
+ /** File type changed (e.g., file to symlink) */
24
+ DiffStatus["TYPE_CHANGED"] = "T";
25
+ /** Unmerged (conflict) */
26
+ DiffStatus["UNMERGED"] = "U";
27
+ })(DiffStatus || (DiffStatus = {}));
28
+ /**
29
+ * File mode constants for Git objects
30
+ */
31
+ export var FileMode;
32
+ (function (FileMode) {
33
+ /** Regular file (not executable) */
34
+ FileMode["REGULAR"] = "100644";
35
+ /** Executable file */
36
+ FileMode["EXECUTABLE"] = "100755";
37
+ /** Symbolic link */
38
+ FileMode["SYMLINK"] = "120000";
39
+ /** Git submodule (gitlink) */
40
+ FileMode["GITLINK"] = "160000";
41
+ /** Directory (tree) */
42
+ FileMode["TREE"] = "040000";
43
+ })(FileMode || (FileMode = {}));
44
+ /**
45
+ * Check if a file appears to be binary based on its content
46
+ *
47
+ * A file is considered binary if it contains null bytes in the first
48
+ * 8000 bytes (similar to Git's heuristic).
49
+ *
50
+ * @param content - File content to check
51
+ * @returns true if the file appears to be binary
52
+ */
53
+ export function isBinaryContent(content) {
54
+ // Check first 8000 bytes for null bytes
55
+ const checkLength = Math.min(content.length, 8000);
56
+ for (let i = 0; i < checkLength; i++) {
57
+ if (content[i] === 0x00) {
58
+ return true;
59
+ }
60
+ }
61
+ return false;
62
+ }
63
+ /**
64
+ * Calculate similarity between two blobs for rename/copy detection
65
+ *
66
+ * Uses a simple heuristic based on shared content.
67
+ *
68
+ * @param store - Object store for retrieving blob contents
69
+ * @param oldSha - SHA of the old blob
70
+ * @param newSha - SHA of the new blob
71
+ * @returns Promise resolving to similarity percentage (0-100)
72
+ */
73
+ export async function calculateSimilarity(store, oldSha, newSha) {
74
+ // If same SHA, 100% similar
75
+ if (oldSha === newSha) {
76
+ return 100;
77
+ }
78
+ const [oldBlob, newBlob] = await Promise.all([
79
+ store.getBlob(oldSha),
80
+ store.getBlob(newSha)
81
+ ]);
82
+ if (!oldBlob || !newBlob) {
83
+ return 0;
84
+ }
85
+ // Use a simple character-by-character comparison for similarity
86
+ // This is a basic approach; a more sophisticated algorithm would use
87
+ // something like xdiff or Myers diff
88
+ const oldStr = new TextDecoder().decode(oldBlob);
89
+ const newStr = new TextDecoder().decode(newBlob);
90
+ if (oldStr === newStr) {
91
+ return 100;
92
+ }
93
+ // Count matching characters at each position
94
+ const maxLen = Math.max(oldStr.length, newStr.length);
95
+ if (maxLen === 0) {
96
+ return 100;
97
+ }
98
+ let matches = 0;
99
+ const minLen = Math.min(oldStr.length, newStr.length);
100
+ for (let i = 0; i < minLen; i++) {
101
+ if (oldStr[i] === newStr[i]) {
102
+ matches++;
103
+ }
104
+ }
105
+ return Math.round((matches / maxLen) * 100);
106
+ }
107
+ /**
108
+ * Parse a file mode string and determine its type
109
+ *
110
+ * @param mode - File mode string (e.g., '100644', '040000')
111
+ * @returns Object with mode information
112
+ */
113
+ export function parseMode(mode) {
114
+ return {
115
+ isFile: mode === FileMode.REGULAR || mode === FileMode.EXECUTABLE,
116
+ isDirectory: mode === FileMode.TREE,
117
+ isSymlink: mode === FileMode.SYMLINK,
118
+ isSubmodule: mode === FileMode.GITLINK,
119
+ isExecutable: mode === FileMode.EXECUTABLE
120
+ };
121
+ }
122
+ /**
123
+ * Check if a mode change represents a significant type change
124
+ *
125
+ * @param oldMode - Old file mode
126
+ * @param newMode - New file mode
127
+ * @returns true if the mode change is significant (e.g., file to symlink)
128
+ */
129
+ export function isModeChangeSignificant(oldMode, newMode) {
130
+ if (oldMode === newMode) {
131
+ return false;
132
+ }
133
+ const oldParsed = parseMode(oldMode);
134
+ const newParsed = parseMode(newMode);
135
+ // Type changes are significant (file to symlink, file to submodule, etc.)
136
+ if (oldParsed.isFile && newParsed.isSymlink)
137
+ return true;
138
+ if (oldParsed.isFile && newParsed.isSubmodule)
139
+ return true;
140
+ if (oldParsed.isSymlink && newParsed.isFile)
141
+ return true;
142
+ if (oldParsed.isSymlink && newParsed.isSubmodule)
143
+ return true;
144
+ if (oldParsed.isSubmodule && newParsed.isFile)
145
+ return true;
146
+ if (oldParsed.isSubmodule && newParsed.isSymlink)
147
+ return true;
148
+ // Regular to executable is not significant
149
+ return false;
150
+ }
151
+ /**
152
+ * Simple glob pattern matching
153
+ */
154
+ function matchGlob(pattern, path) {
155
+ // Convert glob pattern to regex
156
+ const regexPattern = pattern
157
+ .replace(/\./g, '\\.')
158
+ .replace(/\*\*/g, '<<<DOUBLESTAR>>>')
159
+ .replace(/\*/g, '[^/]*')
160
+ .replace(/<<<DOUBLESTAR>>>/g, '.*')
161
+ .replace(/\?/g, '.');
162
+ const regex = new RegExp(`^${regexPattern}$`);
163
+ return regex.test(path);
164
+ }
165
+ /**
166
+ * Filter diff entries by pathspecs
167
+ *
168
+ * @param entries - Diff entries to filter
169
+ * @param pathspecs - Glob patterns to include
170
+ * @param excludePaths - Paths to exclude
171
+ * @returns Filtered entries
172
+ */
173
+ export function filterByPathspecs(entries, pathspecs, excludePaths) {
174
+ if (!pathspecs && !excludePaths) {
175
+ return entries;
176
+ }
177
+ return entries.filter(entry => {
178
+ // Check exclude paths first
179
+ if (excludePaths) {
180
+ for (const pattern of excludePaths) {
181
+ if (matchGlob(pattern, entry.path)) {
182
+ return false;
183
+ }
184
+ }
185
+ }
186
+ // If no include pathspecs, include everything not excluded
187
+ if (!pathspecs || pathspecs.length === 0) {
188
+ return true;
189
+ }
190
+ // Check if path matches any include pattern
191
+ for (const pattern of pathspecs) {
192
+ if (matchGlob(pattern, entry.path)) {
193
+ return true;
194
+ }
195
+ }
196
+ return false;
197
+ });
198
+ }
199
+ /**
200
+ * Recursively walk a tree and collect all entries with full paths
201
+ *
202
+ * @param store - Object store for retrieving tree contents
203
+ * @param treeSha - SHA of the tree to walk
204
+ * @param prefix - Path prefix for entries
205
+ * @returns Promise resolving to flat list of entries with full paths
206
+ */
207
+ export async function walkTree(store, treeSha, prefix) {
208
+ const tree = await store.getTree(treeSha);
209
+ if (!tree) {
210
+ return [];
211
+ }
212
+ const results = [];
213
+ for (const entry of tree.entries) {
214
+ const fullPath = prefix ? `${prefix}/${entry.name}` : entry.name;
215
+ if (entry.mode === FileMode.TREE) {
216
+ // Recurse into subdirectory
217
+ const subEntries = await walkTree(store, entry.sha, fullPath);
218
+ results.push(...subEntries);
219
+ }
220
+ else {
221
+ results.push({ ...entry, fullPath });
222
+ }
223
+ }
224
+ return results;
225
+ }
226
+ /**
227
+ * Helper to get type category for mode comparison
228
+ */
229
+ function getModeType(mode) {
230
+ if (mode === FileMode.REGULAR || mode === FileMode.EXECUTABLE) {
231
+ return 'file';
232
+ }
233
+ if (mode === FileMode.SYMLINK) {
234
+ return 'symlink';
235
+ }
236
+ if (mode === FileMode.GITLINK) {
237
+ return 'submodule';
238
+ }
239
+ if (mode === FileMode.TREE) {
240
+ return 'tree';
241
+ }
242
+ return 'unknown';
243
+ }
244
+ /**
245
+ * Compare two trees and return the differences
246
+ *
247
+ * @param store - Object store for retrieving tree contents
248
+ * @param oldTreeSha - SHA of the old tree (null for initial commit comparison)
249
+ * @param newTreeSha - SHA of the new tree (null to compare against empty)
250
+ * @param options - Diff options
251
+ * @returns Promise resolving to diff result
252
+ */
253
+ export async function diffTrees(store, oldTreeSha, newTreeSha, options = {}) {
254
+ const { detectRenames: enableRenames = false, detectCopies: enableCopies = false, similarityThreshold = 50, pathspecs, excludePaths, detectBinary = false, recursive = true } = options;
255
+ // Handle null on both sides
256
+ if (oldTreeSha === null && newTreeSha === null) {
257
+ return {
258
+ entries: [],
259
+ stats: { added: 0, deleted: 0, modified: 0, renamed: 0, copied: 0 }
260
+ };
261
+ }
262
+ // Get old tree entries
263
+ let oldEntries = new Map();
264
+ if (oldTreeSha !== null) {
265
+ const oldTree = await store.getTree(oldTreeSha);
266
+ if (!oldTree) {
267
+ throw new Error(`Tree not found: ${oldTreeSha}`);
268
+ }
269
+ if (recursive) {
270
+ const entries = await walkTree(store, oldTreeSha);
271
+ for (const entry of entries) {
272
+ oldEntries.set(entry.fullPath, entry);
273
+ }
274
+ }
275
+ else {
276
+ for (const entry of oldTree.entries) {
277
+ oldEntries.set(entry.name, { ...entry, fullPath: entry.name });
278
+ }
279
+ }
280
+ }
281
+ // Get new tree entries
282
+ let newEntries = new Map();
283
+ if (newTreeSha !== null) {
284
+ const newTree = await store.getTree(newTreeSha);
285
+ if (!newTree) {
286
+ throw new Error(`Tree not found: ${newTreeSha}`);
287
+ }
288
+ if (recursive) {
289
+ const entries = await walkTree(store, newTreeSha);
290
+ for (const entry of entries) {
291
+ newEntries.set(entry.fullPath, entry);
292
+ }
293
+ }
294
+ else {
295
+ for (const entry of newTree.entries) {
296
+ newEntries.set(entry.name, { ...entry, fullPath: entry.name });
297
+ }
298
+ }
299
+ }
300
+ const diffEntries = [];
301
+ // Find deleted and modified files
302
+ for (const [path, oldEntry] of oldEntries) {
303
+ const newEntry = newEntries.get(path);
304
+ if (!newEntry) {
305
+ // File was deleted
306
+ diffEntries.push({
307
+ path,
308
+ status: DiffStatus.DELETED,
309
+ oldMode: oldEntry.mode,
310
+ newMode: null,
311
+ oldSha: oldEntry.sha,
312
+ newSha: null
313
+ });
314
+ }
315
+ else if (oldEntry.sha !== newEntry.sha || oldEntry.mode !== newEntry.mode) {
316
+ // File was modified or type changed
317
+ const oldType = getModeType(oldEntry.mode);
318
+ const newType = getModeType(newEntry.mode);
319
+ if (oldType !== newType) {
320
+ // Type changed (e.g., file to symlink)
321
+ diffEntries.push({
322
+ path,
323
+ status: DiffStatus.TYPE_CHANGED,
324
+ oldMode: oldEntry.mode,
325
+ newMode: newEntry.mode,
326
+ oldSha: oldEntry.sha,
327
+ newSha: newEntry.sha
328
+ });
329
+ }
330
+ else {
331
+ // Content or mode modified
332
+ diffEntries.push({
333
+ path,
334
+ status: DiffStatus.MODIFIED,
335
+ oldMode: oldEntry.mode,
336
+ newMode: newEntry.mode,
337
+ oldSha: oldEntry.sha,
338
+ newSha: newEntry.sha
339
+ });
340
+ }
341
+ }
342
+ }
343
+ // Find added files
344
+ for (const [path, newEntry] of newEntries) {
345
+ if (!oldEntries.has(path)) {
346
+ diffEntries.push({
347
+ path,
348
+ status: DiffStatus.ADDED,
349
+ oldMode: null,
350
+ newMode: newEntry.mode,
351
+ oldSha: null,
352
+ newSha: newEntry.sha
353
+ });
354
+ }
355
+ }
356
+ // Detect binary files if enabled
357
+ if (detectBinary) {
358
+ for (const entry of diffEntries) {
359
+ const sha = entry.newSha || entry.oldSha;
360
+ if (sha) {
361
+ const blob = await store.getBlob(sha);
362
+ if (blob) {
363
+ entry.isBinary = isBinaryContent(blob);
364
+ }
365
+ }
366
+ }
367
+ }
368
+ // Detect renames if enabled
369
+ let finalEntries = diffEntries;
370
+ if (enableRenames) {
371
+ finalEntries = await detectRenames(store, finalEntries, { similarityThreshold });
372
+ }
373
+ // Detect copies if enabled
374
+ if (enableCopies) {
375
+ // Build map of existing paths from old tree
376
+ const existingPaths = new Map();
377
+ for (const [path, entry] of oldEntries) {
378
+ existingPaths.set(path, entry.sha);
379
+ }
380
+ finalEntries = await detectCopies(store, finalEntries, existingPaths, { similarityThreshold });
381
+ }
382
+ // Apply path filters
383
+ if (pathspecs || excludePaths) {
384
+ finalEntries = filterByPathspecs(finalEntries, pathspecs, excludePaths);
385
+ }
386
+ // Calculate stats
387
+ const stats = {
388
+ added: 0,
389
+ deleted: 0,
390
+ modified: 0,
391
+ renamed: 0,
392
+ copied: 0
393
+ };
394
+ for (const entry of finalEntries) {
395
+ switch (entry.status) {
396
+ case DiffStatus.ADDED:
397
+ stats.added++;
398
+ break;
399
+ case DiffStatus.DELETED:
400
+ stats.deleted++;
401
+ break;
402
+ case DiffStatus.MODIFIED:
403
+ case DiffStatus.TYPE_CHANGED:
404
+ stats.modified++;
405
+ break;
406
+ case DiffStatus.RENAMED:
407
+ stats.renamed++;
408
+ break;
409
+ case DiffStatus.COPIED:
410
+ stats.copied++;
411
+ break;
412
+ }
413
+ }
414
+ return { entries: finalEntries, stats };
415
+ }
416
+ /**
417
+ * Detect renames in a set of diff entries
418
+ *
419
+ * This function takes a list of added and deleted files and attempts to
420
+ * match them based on content similarity to detect renames.
421
+ *
422
+ * @param store - Object store for retrieving blob contents
423
+ * @param entries - Initial diff entries (before rename detection)
424
+ * @param options - Diff options (particularly similarityThreshold)
425
+ * @returns Promise resolving to entries with renames detected
426
+ */
427
+ export async function detectRenames(store, entries, options = {}) {
428
+ const { similarityThreshold = 50 } = options;
429
+ const deleted = entries.filter(e => e.status === DiffStatus.DELETED);
430
+ const added = entries.filter(e => e.status === DiffStatus.ADDED);
431
+ const other = entries.filter(e => e.status !== DiffStatus.DELETED && e.status !== DiffStatus.ADDED);
432
+ const matchedDeleted = new Set();
433
+ const matchedAdded = new Set();
434
+ const renames = [];
435
+ // Try to match deleted files with added files
436
+ for (const del of deleted) {
437
+ if (matchedDeleted.has(del.path))
438
+ continue;
439
+ let bestMatch = null;
440
+ let bestSimilarity = 0;
441
+ for (const add of added) {
442
+ if (matchedAdded.has(add.path))
443
+ continue;
444
+ // Check if same SHA (exact rename)
445
+ if (del.oldSha === add.newSha) {
446
+ bestMatch = add;
447
+ bestSimilarity = 100;
448
+ break;
449
+ }
450
+ // Calculate similarity if both SHAs exist
451
+ if (del.oldSha && add.newSha) {
452
+ const similarity = await calculateSimilarity(store, del.oldSha, add.newSha);
453
+ if (similarity >= similarityThreshold && similarity > bestSimilarity) {
454
+ bestMatch = add;
455
+ bestSimilarity = similarity;
456
+ }
457
+ }
458
+ }
459
+ if (bestMatch && bestSimilarity >= similarityThreshold) {
460
+ matchedDeleted.add(del.path);
461
+ matchedAdded.add(bestMatch.path);
462
+ renames.push({
463
+ path: bestMatch.path,
464
+ oldPath: del.path,
465
+ status: DiffStatus.RENAMED,
466
+ oldMode: del.oldMode,
467
+ newMode: bestMatch.newMode,
468
+ oldSha: del.oldSha,
469
+ newSha: bestMatch.newSha,
470
+ similarity: bestSimilarity
471
+ });
472
+ }
473
+ }
474
+ // Collect unmatched deleted and added entries
475
+ const result = [...other, ...renames];
476
+ for (const del of deleted) {
477
+ if (!matchedDeleted.has(del.path)) {
478
+ result.push(del);
479
+ }
480
+ }
481
+ for (const add of added) {
482
+ if (!matchedAdded.has(add.path)) {
483
+ result.push(add);
484
+ }
485
+ }
486
+ return result;
487
+ }
488
+ /**
489
+ * Detect copies in a set of diff entries
490
+ *
491
+ * This function takes a list of diff entries and attempts to detect
492
+ * if any added files are copies of existing files.
493
+ *
494
+ * @param store - Object store for retrieving blob contents
495
+ * @param entries - Initial diff entries
496
+ * @param existingPaths - Map of existing paths to their SHAs
497
+ * @param options - Diff options
498
+ * @returns Promise resolving to entries with copies detected
499
+ */
500
+ export async function detectCopies(store, entries, existingPaths, options = {}) {
501
+ const { similarityThreshold = 50 } = options;
502
+ const result = [];
503
+ for (const entry of entries) {
504
+ if (entry.status !== DiffStatus.ADDED) {
505
+ result.push(entry);
506
+ continue;
507
+ }
508
+ let bestMatch = null;
509
+ let bestSimilarity = 0;
510
+ for (const [path, sha] of existingPaths) {
511
+ // Check for exact match
512
+ if (sha === entry.newSha) {
513
+ bestMatch = { path, sha };
514
+ bestSimilarity = 100;
515
+ break;
516
+ }
517
+ // Calculate similarity
518
+ if (entry.newSha) {
519
+ const similarity = await calculateSimilarity(store, sha, entry.newSha);
520
+ if (similarity >= similarityThreshold && similarity > bestSimilarity) {
521
+ bestMatch = { path, sha };
522
+ bestSimilarity = similarity;
523
+ }
524
+ }
525
+ }
526
+ if (bestMatch && bestSimilarity >= similarityThreshold) {
527
+ result.push({
528
+ path: entry.path,
529
+ oldPath: bestMatch.path,
530
+ status: DiffStatus.COPIED,
531
+ oldMode: entry.newMode, // Use same mode for copied source
532
+ newMode: entry.newMode,
533
+ oldSha: bestMatch.sha,
534
+ newSha: entry.newSha,
535
+ similarity: bestSimilarity
536
+ });
537
+ }
538
+ else {
539
+ result.push(entry);
540
+ }
541
+ }
542
+ return result;
543
+ }
544
+ /**
545
+ * Compare a tree to the index (staging area)
546
+ *
547
+ * @param store - Object store for retrieving tree contents
548
+ * @param treeSha - SHA of the tree to compare (typically HEAD)
549
+ * @param index - Index entries to compare against
550
+ * @param options - Diff options
551
+ * @returns Promise resolving to diff result
552
+ */
553
+ export async function diffTreeToIndex(store, treeSha, index, options = {}) {
554
+ // Get tree entries
555
+ const treeEntries = new Map();
556
+ if (treeSha !== null) {
557
+ const entries = await walkTree(store, treeSha);
558
+ for (const entry of entries) {
559
+ treeEntries.set(entry.fullPath, { mode: entry.mode, sha: entry.sha });
560
+ }
561
+ }
562
+ // Build index map
563
+ const indexEntries = new Map();
564
+ for (const entry of index) {
565
+ if (entry.stage === 0) {
566
+ indexEntries.set(entry.path, entry);
567
+ }
568
+ }
569
+ const diffEntries = [];
570
+ // Find deleted and modified files
571
+ for (const [path, treeEntry] of treeEntries) {
572
+ const indexEntry = indexEntries.get(path);
573
+ if (!indexEntry) {
574
+ // File was deleted (in index)
575
+ diffEntries.push({
576
+ path,
577
+ status: DiffStatus.DELETED,
578
+ oldMode: treeEntry.mode,
579
+ newMode: null,
580
+ oldSha: treeEntry.sha,
581
+ newSha: null
582
+ });
583
+ }
584
+ else if (treeEntry.sha !== indexEntry.sha || treeEntry.mode !== indexEntry.mode) {
585
+ // File was modified
586
+ diffEntries.push({
587
+ path,
588
+ status: DiffStatus.MODIFIED,
589
+ oldMode: treeEntry.mode,
590
+ newMode: indexEntry.mode,
591
+ oldSha: treeEntry.sha,
592
+ newSha: indexEntry.sha
593
+ });
594
+ }
595
+ }
596
+ // Find added files
597
+ for (const [path, indexEntry] of indexEntries) {
598
+ if (!treeEntries.has(path)) {
599
+ diffEntries.push({
600
+ path,
601
+ status: DiffStatus.ADDED,
602
+ oldMode: null,
603
+ newMode: indexEntry.mode,
604
+ oldSha: null,
605
+ newSha: indexEntry.sha
606
+ });
607
+ }
608
+ }
609
+ // Apply filters if needed
610
+ let finalEntries = diffEntries;
611
+ if (options.pathspecs || options.excludePaths) {
612
+ finalEntries = filterByPathspecs(finalEntries, options.pathspecs, options.excludePaths);
613
+ }
614
+ // Calculate stats
615
+ const stats = {
616
+ added: 0,
617
+ deleted: 0,
618
+ modified: 0,
619
+ renamed: 0,
620
+ copied: 0
621
+ };
622
+ for (const entry of finalEntries) {
623
+ switch (entry.status) {
624
+ case DiffStatus.ADDED:
625
+ stats.added++;
626
+ break;
627
+ case DiffStatus.DELETED:
628
+ stats.deleted++;
629
+ break;
630
+ case DiffStatus.MODIFIED:
631
+ stats.modified++;
632
+ break;
633
+ case DiffStatus.RENAMED:
634
+ stats.renamed++;
635
+ break;
636
+ case DiffStatus.COPIED:
637
+ stats.copied++;
638
+ break;
639
+ }
640
+ }
641
+ return { entries: finalEntries, stats };
642
+ }
643
+ /**
644
+ * Compare a tree to working directory entries
645
+ *
646
+ * @param store - Object store for retrieving tree contents
647
+ * @param treeSha - SHA of the tree to compare
648
+ * @param workingEntries - Working directory file entries
649
+ * @param options - Diff options
650
+ * @returns Promise resolving to diff result
651
+ */
652
+ export async function diffTreeToWorktree(store, treeSha, workingEntries, options = {}) {
653
+ // This is essentially the same as diffTreeToIndex
654
+ // Working directory entries are represented the same way
655
+ return diffTreeToIndex(store, treeSha, workingEntries, options);
656
+ }
657
+ //# sourceMappingURL=tree-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-diff.js","sourceRoot":"","sources":["../../src/ops/tree-diff.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH;;GAEG;AACH,MAAM,CAAN,IAAY,UAeX;AAfD,WAAY,UAAU;IACpB,qBAAqB;IACrB,yBAAW,CAAA;IACX,uBAAuB;IACvB,2BAAa,CAAA;IACb,wBAAwB;IACxB,4BAAc,CAAA;IACd,uBAAuB;IACvB,2BAAa,CAAA;IACb,sBAAsB;IACtB,0BAAY,CAAA;IACZ,gDAAgD;IAChD,gCAAkB,CAAA;IAClB,0BAA0B;IAC1B,4BAAc,CAAA;AAChB,CAAC,EAfW,UAAU,KAAV,UAAU,QAerB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,QAWX;AAXD,WAAY,QAAQ;IAClB,oCAAoC;IACpC,8BAAkB,CAAA;IAClB,sBAAsB;IACtB,iCAAqB,CAAA;IACrB,oBAAoB;IACpB,8BAAkB,CAAA;IAClB,8BAA8B;IAC9B,8BAAkB,CAAA;IAClB,uBAAuB;IACvB,2BAAe,CAAA;AACjB,CAAC,EAXW,QAAQ,KAAR,QAAQ,QAWnB;AAyFD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAmB;IACjD,wCAAwC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAkB,EAClB,MAAc,EACd,MAAc;IAEd,4BAA4B;IAC5B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACrB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;KACtB,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,CAAA;IACV,CAAC;IAED,gEAAgE;IAChE,qEAAqE;IACrE,qCAAqC;IACrC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEhD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACrD,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,IAAY;IAQZ,OAAO;QACL,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,UAAU;QACjE,WAAW,EAAE,IAAI,KAAK,QAAQ,CAAC,IAAI;QACnC,SAAS,EAAE,IAAI,KAAK,QAAQ,CAAC,OAAO;QACpC,WAAW,EAAE,IAAI,KAAK,QAAQ,CAAC,OAAO;QACtC,YAAY,EAAE,IAAI,KAAK,QAAQ,CAAC,UAAU;KAC3C,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAe,EACf,OAAe;IAEf,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAEpC,0EAA0E;IAC1E,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IACxD,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,WAAW;QAAE,OAAO,IAAI,CAAA;IAC1D,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxD,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,WAAW;QAAE,OAAO,IAAI,CAAA;IAC7D,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAC1D,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAE7D,2CAA2C;IAC3C,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,OAAe,EAAE,IAAY;IAC9C,gCAAgC;IAChC,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAClC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEtB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAA;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAoB,EACpB,SAAoB,EACpB,YAAuB;IAEvB,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QAC5B,4BAA4B;QAC5B,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;gBACnC,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,OAAO,KAAK,CAAA;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,4CAA4C;QAC5C,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAkB,EAClB,OAAe,EACf,MAAe;IAEf,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAA4C,EAAE,CAAA;IAE3D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAEhE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,4BAA4B;YAC5B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,IAAI,KAAK,QAAQ,CAAC,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC9D,OAAO,MAAM,CAAA;IACf,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAA;IACpB,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAA;IACf,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAkB,EAClB,UAAyB,EACzB,UAAyB,EACzB,UAAuB,EAAE;IAEzB,MAAM,EACJ,aAAa,EAAE,aAAa,GAAG,KAAK,EACpC,YAAY,EAAE,YAAY,GAAG,KAAK,EAClC,mBAAmB,GAAG,EAAE,EACxB,SAAS,EACT,YAAY,EACZ,YAAY,GAAG,KAAK,EACpB,SAAS,GAAG,IAAI,EACjB,GAAG,OAAO,CAAA;IAEX,4BAA4B;IAC5B,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO;YACL,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;SACpE,CAAA;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,UAAU,GAAkD,IAAI,GAAG,EAAE,CAAA;IACzE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;YACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,UAAU,GAAkD,IAAI,GAAG,EAAE,CAAA;IACzE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;QAClD,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;YACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAgB,EAAE,CAAA;IAEnC,kCAAkC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAErC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,mBAAmB;YACnB,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,OAAO;gBAC1B,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,QAAQ,CAAC,GAAG;gBACpB,MAAM,EAAE,IAAI;aACb,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5E,oCAAoC;YACpC,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAE1C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,uCAAuC;gBACvC,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI;oBACJ,MAAM,EAAE,UAAU,CAAC,YAAY;oBAC/B,OAAO,EAAE,QAAQ,CAAC,IAAI;oBACtB,OAAO,EAAE,QAAQ,CAAC,IAAI;oBACtB,MAAM,EAAE,QAAQ,CAAC,GAAG;oBACpB,MAAM,EAAE,QAAQ,CAAC,GAAG;iBACrB,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI;oBACJ,MAAM,EAAE,UAAU,CAAC,QAAQ;oBAC3B,OAAO,EAAE,QAAQ,CAAC,IAAI;oBACtB,OAAO,EAAE,QAAQ,CAAC,IAAI;oBACtB,MAAM,EAAE,QAAQ,CAAC,GAAG;oBACpB,MAAM,EAAE,QAAQ,CAAC,GAAG;iBACrB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,KAAK;gBACxB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,QAAQ,CAAC,GAAG;aACrB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAA;YACxC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACrC,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,YAAY,GAAG,WAAW,CAAA;IAC9B,IAAI,aAAa,EAAE,CAAC;QAClB,YAAY,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,2BAA2B;IAC3B,IAAI,YAAY,EAAE,CAAC;QACjB,4CAA4C;QAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;QAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;YACvC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QACpC,CAAC;QACD,YAAY,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAChG,CAAC;IAED,qBAAqB;IACrB,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;QAC9B,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;IACzE,CAAC;IAED,kBAAkB;IAClB,MAAM,KAAK,GAAG;QACZ,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;KACV,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,UAAU,CAAC,KAAK;gBACnB,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,MAAK;YACP,KAAK,UAAU,CAAC,OAAO;gBACrB,KAAK,CAAC,OAAO,EAAE,CAAA;gBACf,MAAK;YACP,KAAK,UAAU,CAAC,QAAQ,CAAC;YACzB,KAAK,UAAU,CAAC,YAAY;gBAC1B,KAAK,CAAC,QAAQ,EAAE,CAAA;gBAChB,MAAK;YACP,KAAK,UAAU,CAAC,OAAO;gBACrB,KAAK,CAAC,OAAO,EAAE,CAAA;gBACf,MAAK;YACP,KAAK,UAAU,CAAC,MAAM;gBACpB,KAAK,CAAC,MAAM,EAAE,CAAA;gBACd,MAAK;QACT,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;AACzC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAkB,EAClB,OAAoB,EACpB,UAAuB,EAAE;IAEzB,MAAM,EAAE,mBAAmB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAA;IAE5C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,CAAA;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,CAAC,CAAA;IAEnG,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;IACxC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IACtC,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,8CAA8C;IAC9C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QAE1C,IAAI,SAAS,GAAqB,IAAI,CAAA;QACtC,IAAI,cAAc,GAAG,CAAC,CAAA;QAEtB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAQ;YAExC,mCAAmC;YACnC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC9B,SAAS,GAAG,GAAG,CAAA;gBACf,cAAc,GAAG,GAAG,CAAA;gBACpB,MAAK;YACP,CAAC;YAED,0CAA0C;YAC1C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;gBAC3E,IAAI,UAAU,IAAI,mBAAmB,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;oBACrE,SAAS,GAAG,GAAG,CAAA;oBACf,cAAc,GAAG,UAAU,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,IAAI,cAAc,IAAI,mBAAmB,EAAE,CAAC;YACvD,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC5B,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAChC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,OAAO,EAAE,GAAG,CAAC,IAAI;gBACjB,MAAM,EAAE,UAAU,CAAC,OAAO;gBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,UAAU,EAAE,cAAc;aAC3B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,MAAM,GAAgB,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,CAAA;IAElD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAkB,EAClB,OAAoB,EACpB,aAAkC,EAClC,UAAuB,EAAE;IAEzB,MAAM,EAAE,mBAAmB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAA;IAE5C,MAAM,MAAM,GAAgB,EAAE,CAAA;IAE9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QAED,IAAI,SAAS,GAAyC,IAAI,CAAA;QAC1D,IAAI,cAAc,GAAG,CAAC,CAAA;QAEtB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,aAAa,EAAE,CAAC;YACxC,wBAAwB;YACxB,IAAI,GAAG,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzB,SAAS,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;gBACzB,cAAc,GAAG,GAAG,CAAA;gBACpB,MAAK;YACP,CAAC;YAED,uBAAuB;YACvB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;gBACtE,IAAI,UAAU,IAAI,mBAAmB,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;oBACrE,SAAS,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;oBACzB,cAAc,GAAG,UAAU,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,IAAI,cAAc,IAAI,mBAAmB,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,SAAS,CAAC,IAAI;gBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,kCAAkC;gBAC1D,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE,SAAS,CAAC,GAAG;gBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,UAAU,EAAE,cAAc;aAC3B,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAkB,EAClB,OAAsB,EACtB,KAAmB,EACnB,UAAuB,EAAE;IAEzB,mBAAmB;IACnB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAA;IAEpE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAA;IAClD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAgB,EAAE,CAAA;IAEnC,kCAAkC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,8BAA8B;YAC9B,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,OAAO;gBAC1B,OAAO,EAAE,SAAS,CAAC,IAAI;gBACvB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,SAAS,CAAC,GAAG;gBACrB,MAAM,EAAE,IAAI;aACb,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;YAClF,oBAAoB;YACpB,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,QAAQ;gBAC3B,OAAO,EAAE,SAAS,CAAC,IAAI;gBACvB,OAAO,EAAE,UAAU,CAAC,IAAI;gBACxB,MAAM,EAAE,SAAS,CAAC,GAAG;gBACrB,MAAM,EAAE,UAAU,CAAC,GAAG;aACvB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,YAAY,EAAE,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,KAAK;gBACxB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,CAAC,IAAI;gBACxB,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,UAAU,CAAC,GAAG;aACvB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,YAAY,GAAG,WAAW,CAAA;IAC9B,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAC9C,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IACzF,CAAC;IAED,kBAAkB;IAClB,MAAM,KAAK,GAAG;QACZ,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;KACV,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,UAAU,CAAC,KAAK;gBACnB,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,MAAK;YACP,KAAK,UAAU,CAAC,OAAO;gBACrB,KAAK,CAAC,OAAO,EAAE,CAAA;gBACf,MAAK;YACP,KAAK,UAAU,CAAC,QAAQ;gBACtB,KAAK,CAAC,QAAQ,EAAE,CAAA;gBAChB,MAAK;YACP,KAAK,UAAU,CAAC,OAAO;gBACrB,KAAK,CAAC,OAAO,EAAE,CAAA;gBACf,MAAK;YACP,KAAK,UAAU,CAAC,MAAM;gBACpB,KAAK,CAAC,MAAM,EAAE,CAAA;gBACd,MAAK;QACT,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;AACzC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAkB,EAClB,OAAsB,EACtB,cAA4B,EAC5B,UAAuB,EAAE;IAEzB,kDAAkD;IAClD,yDAAyD;IACzD,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;AACjE,CAAC"}