@gitwand/core 2.0.1 → 2.3.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.
Files changed (200) hide show
  1. package/README.md +58 -0
  2. package/dist/__tests__/bench.bench.js +39 -0
  3. package/dist/__tests__/bench.bench.js.map +1 -1
  4. package/dist/__tests__/corpus.d.ts.map +1 -1
  5. package/dist/__tests__/corpus.js +363 -0
  6. package/dist/__tests__/corpus.js.map +1 -1
  7. package/dist/__tests__/diff/block-move.test.d.ts +5 -0
  8. package/dist/__tests__/diff/block-move.test.d.ts.map +1 -0
  9. package/dist/__tests__/diff/block-move.test.js +132 -0
  10. package/dist/__tests__/diff/block-move.test.js.map +1 -0
  11. package/dist/__tests__/diff/histogram.test.d.ts +8 -0
  12. package/dist/__tests__/diff/histogram.test.d.ts.map +1 -0
  13. package/dist/__tests__/diff/histogram.test.js +150 -0
  14. package/dist/__tests__/diff/histogram.test.js.map +1 -0
  15. package/dist/__tests__/diff/parity.test.d.ts +17 -0
  16. package/dist/__tests__/diff/parity.test.d.ts.map +1 -0
  17. package/dist/__tests__/diff/parity.test.js +149 -0
  18. package/dist/__tests__/diff/parity.test.js.map +1 -0
  19. package/dist/__tests__/diff.test.js +6 -2
  20. package/dist/__tests__/diff.test.js.map +1 -1
  21. package/dist/__tests__/format-profiles/integration.test.d.ts +7 -0
  22. package/dist/__tests__/format-profiles/integration.test.d.ts.map +1 -0
  23. package/dist/__tests__/format-profiles/integration.test.js +193 -0
  24. package/dist/__tests__/format-profiles/integration.test.js.map +1 -0
  25. package/dist/__tests__/format-profiles/json-patch.test.d.ts +12 -0
  26. package/dist/__tests__/format-profiles/json-patch.test.d.ts.map +1 -0
  27. package/dist/__tests__/format-profiles/json-patch.test.js +222 -0
  28. package/dist/__tests__/format-profiles/json-patch.test.js.map +1 -0
  29. package/dist/__tests__/format-profiles/registry.test.d.ts +5 -0
  30. package/dist/__tests__/format-profiles/registry.test.d.ts.map +1 -0
  31. package/dist/__tests__/format-profiles/registry.test.js +124 -0
  32. package/dist/__tests__/format-profiles/registry.test.js.map +1 -0
  33. package/dist/__tests__/patterns/make-score.test.d.ts +9 -0
  34. package/dist/__tests__/patterns/make-score.test.d.ts.map +1 -0
  35. package/dist/__tests__/patterns/make-score.test.js +49 -0
  36. package/dist/__tests__/patterns/make-score.test.js.map +1 -0
  37. package/dist/__tests__/structural/grandeur-nature.test.d.ts +31 -0
  38. package/dist/__tests__/structural/grandeur-nature.test.d.ts.map +1 -0
  39. package/dist/__tests__/structural/grandeur-nature.test.js +264 -0
  40. package/dist/__tests__/structural/grandeur-nature.test.js.map +1 -0
  41. package/dist/__tests__/structural/languages.test.d.ts +5 -0
  42. package/dist/__tests__/structural/languages.test.d.ts.map +1 -0
  43. package/dist/__tests__/structural/languages.test.js +74 -0
  44. package/dist/__tests__/structural/languages.test.js.map +1 -0
  45. package/dist/__tests__/structural/matching.test.d.ts +6 -0
  46. package/dist/__tests__/structural/matching.test.d.ts.map +1 -0
  47. package/dist/__tests__/structural/matching.test.js +113 -0
  48. package/dist/__tests__/structural/matching.test.js.map +1 -0
  49. package/dist/__tests__/structural/merge.test.d.ts +6 -0
  50. package/dist/__tests__/structural/merge.test.d.ts.map +1 -0
  51. package/dist/__tests__/structural/merge.test.js +117 -0
  52. package/dist/__tests__/structural/merge.test.js.map +1 -0
  53. package/dist/__tests__/structural/reconstruct.test.d.ts +6 -0
  54. package/dist/__tests__/structural/reconstruct.test.d.ts.map +1 -0
  55. package/dist/__tests__/structural/reconstruct.test.js +104 -0
  56. package/dist/__tests__/structural/reconstruct.test.js.map +1 -0
  57. package/dist/__tests__/structural/structural-index.test.d.ts +14 -0
  58. package/dist/__tests__/structural/structural-index.test.d.ts.map +1 -0
  59. package/dist/__tests__/structural/structural-index.test.js +108 -0
  60. package/dist/__tests__/structural/structural-index.test.js.map +1 -0
  61. package/dist/diff/block-move.d.ts +53 -0
  62. package/dist/diff/block-move.d.ts.map +1 -0
  63. package/dist/diff/block-move.js +192 -0
  64. package/dist/diff/block-move.js.map +1 -0
  65. package/dist/diff/histogram.d.ts +45 -0
  66. package/dist/diff/histogram.d.ts.map +1 -0
  67. package/dist/diff/histogram.js +172 -0
  68. package/dist/diff/histogram.js.map +1 -0
  69. package/dist/diff/index.d.ts +30 -0
  70. package/dist/diff/index.d.ts.map +1 -0
  71. package/dist/diff/index.js +47 -0
  72. package/dist/diff/index.js.map +1 -0
  73. package/dist/diff/lcs.d.ts +34 -0
  74. package/dist/diff/lcs.d.ts.map +1 -0
  75. package/dist/diff/lcs.js +184 -0
  76. package/dist/diff/lcs.js.map +1 -0
  77. package/dist/diff/shared.d.ts +54 -0
  78. package/dist/diff/shared.d.ts.map +1 -0
  79. package/dist/diff/shared.js +164 -0
  80. package/dist/diff/shared.js.map +1 -0
  81. package/dist/diff.d.ts +6 -65
  82. package/dist/diff.d.ts.map +1 -1
  83. package/dist/diff.js +6 -324
  84. package/dist/diff.js.map +1 -1
  85. package/dist/format-profiles/index.d.ts +34 -0
  86. package/dist/format-profiles/index.d.ts.map +1 -0
  87. package/dist/format-profiles/index.js +86 -0
  88. package/dist/format-profiles/index.js.map +1 -0
  89. package/dist/format-profiles/json-patch.d.ts +61 -0
  90. package/dist/format-profiles/json-patch.d.ts.map +1 -0
  91. package/dist/format-profiles/json-patch.js +269 -0
  92. package/dist/format-profiles/json-patch.js.map +1 -0
  93. package/dist/format-profiles/merge-strategies.d.ts +54 -0
  94. package/dist/format-profiles/merge-strategies.d.ts.map +1 -0
  95. package/dist/format-profiles/merge-strategies.js +156 -0
  96. package/dist/format-profiles/merge-strategies.js.map +1 -0
  97. package/dist/format-profiles/profiles/composer.d.ts +18 -0
  98. package/dist/format-profiles/profiles/composer.d.ts.map +1 -0
  99. package/dist/format-profiles/profiles/composer.js +45 -0
  100. package/dist/format-profiles/profiles/composer.js.map +1 -0
  101. package/dist/format-profiles/profiles/helm-values.d.ts +21 -0
  102. package/dist/format-profiles/profiles/helm-values.d.ts.map +1 -0
  103. package/dist/format-profiles/profiles/helm-values.js +40 -0
  104. package/dist/format-profiles/profiles/helm-values.js.map +1 -0
  105. package/dist/format-profiles/profiles/kubernetes.d.ts +22 -0
  106. package/dist/format-profiles/profiles/kubernetes.d.ts.map +1 -0
  107. package/dist/format-profiles/profiles/kubernetes.js +60 -0
  108. package/dist/format-profiles/profiles/kubernetes.js.map +1 -0
  109. package/dist/format-profiles/profiles/package-json.d.ts +18 -0
  110. package/dist/format-profiles/profiles/package-json.d.ts.map +1 -0
  111. package/dist/format-profiles/profiles/package-json.js +36 -0
  112. package/dist/format-profiles/profiles/package-json.js.map +1 -0
  113. package/dist/format-profiles/profiles/tsconfig.d.ts +21 -0
  114. package/dist/format-profiles/profiles/tsconfig.d.ts.map +1 -0
  115. package/dist/format-profiles/profiles/tsconfig.js +47 -0
  116. package/dist/format-profiles/profiles/tsconfig.js.map +1 -0
  117. package/dist/format-profiles/types.d.ts +67 -0
  118. package/dist/format-profiles/types.d.ts.map +1 -0
  119. package/dist/format-profiles/types.js +9 -0
  120. package/dist/format-profiles/types.js.map +1 -0
  121. package/dist/index.d.ts +9 -1
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +10 -1
  124. package/dist/index.js.map +1 -1
  125. package/dist/patterns/insertion-at-boundary.d.ts.map +1 -1
  126. package/dist/patterns/insertion-at-boundary.js +15 -33
  127. package/dist/patterns/insertion-at-boundary.js.map +1 -1
  128. package/dist/patterns/utils.d.ts +11 -8
  129. package/dist/patterns/utils.d.ts.map +1 -1
  130. package/dist/patterns/utils.js +28 -10
  131. package/dist/patterns/utils.js.map +1 -1
  132. package/dist/resolver/format-dispatch.d.ts.map +1 -1
  133. package/dist/resolver/format-dispatch.js +3 -1
  134. package/dist/resolver/format-dispatch.js.map +1 -1
  135. package/dist/resolver/index.d.ts +14 -0
  136. package/dist/resolver/index.d.ts.map +1 -1
  137. package/dist/resolver/index.js +29 -0
  138. package/dist/resolver/index.js.map +1 -1
  139. package/dist/resolver/policy.d.ts.map +1 -1
  140. package/dist/resolver/policy.js +2 -0
  141. package/dist/resolver/policy.js.map +1 -1
  142. package/dist/resolvers/dispatcher.d.ts +22 -2
  143. package/dist/resolvers/dispatcher.d.ts.map +1 -1
  144. package/dist/resolvers/dispatcher.js +8 -3
  145. package/dist/resolvers/dispatcher.js.map +1 -1
  146. package/dist/resolvers/json.d.ts +11 -2
  147. package/dist/resolvers/json.d.ts.map +1 -1
  148. package/dist/resolvers/json.js +55 -7
  149. package/dist/resolvers/json.js.map +1 -1
  150. package/dist/resolvers/yaml.d.ts +8 -2
  151. package/dist/resolvers/yaml.d.ts.map +1 -1
  152. package/dist/resolvers/yaml.js +156 -2
  153. package/dist/resolvers/yaml.js.map +1 -1
  154. package/dist/structural/entities.d.ts +44 -0
  155. package/dist/structural/entities.d.ts.map +1 -0
  156. package/dist/structural/entities.js +315 -0
  157. package/dist/structural/entities.js.map +1 -0
  158. package/dist/structural/index.d.ts +48 -0
  159. package/dist/structural/index.d.ts.map +1 -0
  160. package/dist/structural/index.js +177 -0
  161. package/dist/structural/index.js.map +1 -0
  162. package/dist/structural/matching.d.ts +46 -0
  163. package/dist/structural/matching.d.ts.map +1 -0
  164. package/dist/structural/matching.js +83 -0
  165. package/dist/structural/matching.js.map +1 -0
  166. package/dist/structural/merge.d.ts +45 -0
  167. package/dist/structural/merge.d.ts.map +1 -0
  168. package/dist/structural/merge.js +127 -0
  169. package/dist/structural/merge.js.map +1 -0
  170. package/dist/structural/parsers/adapters/browser.d.ts +22 -0
  171. package/dist/structural/parsers/adapters/browser.d.ts.map +1 -0
  172. package/dist/structural/parsers/adapters/browser.js +27 -0
  173. package/dist/structural/parsers/adapters/browser.js.map +1 -0
  174. package/dist/structural/parsers/adapters/node.d.ts +18 -0
  175. package/dist/structural/parsers/adapters/node.d.ts.map +1 -0
  176. package/dist/structural/parsers/adapters/node.js +42 -0
  177. package/dist/structural/parsers/adapters/node.js.map +1 -0
  178. package/dist/structural/parsers/adapters/tauri.d.ts +26 -0
  179. package/dist/structural/parsers/adapters/tauri.d.ts.map +1 -0
  180. package/dist/structural/parsers/adapters/tauri.js +34 -0
  181. package/dist/structural/parsers/adapters/tauri.js.map +1 -0
  182. package/dist/structural/parsers/grammars/languages.d.ts +32 -0
  183. package/dist/structural/parsers/grammars/languages.d.ts.map +1 -0
  184. package/dist/structural/parsers/grammars/languages.js +73 -0
  185. package/dist/structural/parsers/grammars/languages.js.map +1 -0
  186. package/dist/structural/parsers/grammars/ts.d.ts +26 -0
  187. package/dist/structural/parsers/grammars/ts.d.ts.map +1 -0
  188. package/dist/structural/parsers/grammars/ts.js +46 -0
  189. package/dist/structural/parsers/grammars/ts.js.map +1 -0
  190. package/dist/structural/parsers/loader.d.ts +74 -0
  191. package/dist/structural/parsers/loader.d.ts.map +1 -0
  192. package/dist/structural/parsers/loader.js +181 -0
  193. package/dist/structural/parsers/loader.js.map +1 -0
  194. package/dist/structural/reconstruct.d.ts +28 -0
  195. package/dist/structural/reconstruct.d.ts.map +1 -0
  196. package/dist/structural/reconstruct.js +63 -0
  197. package/dist/structural/reconstruct.js.map +1 -0
  198. package/dist/types.d.ts +25 -0
  199. package/dist/types.d.ts.map +1 -1
  200. package/package.json +16 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-move.js","sourceRoot":"","sources":["../../src/diff/block-move.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * GitWand — Histogram diff
3
+ *
4
+ * Implémentation récursive inspirée de l'algorithme Histogram (Git, JGit) :
5
+ * trouver une **ancre rare** (ligne dont la somme des fréquences `freqA + freqB`
6
+ * est minimale, idéalement 1 + 1), splitter récursivement autour de l'ancre.
7
+ *
8
+ * Vs LCS pur :
9
+ * - LCS aligne sur n'importe quelle ligne commune ; sur du code source, les
10
+ * ancres faibles (`}`, `return;`, lignes vides) produisent des splits hostiles.
11
+ * - Histogram s'ancre sur les lignes uniques d'abord, ce qui produit des diffs
12
+ * plus stables et plus lisibles, et augmente le taux de succès de
13
+ * `non_overlapping` / `insertion_at_boundary` qui dépendent de l'alignement.
14
+ *
15
+ * Référence : Nugroho et al., « How different are different diff algorithms in
16
+ * Git? » Springer EMSE 2019. Histogram domine Myers et LCS sur le code source.
17
+ *
18
+ * @module
19
+ */
20
+ /** Options pour `histogramDiff`. */
21
+ export interface HistogramOptions {
22
+ /** Profondeur max de récursion (défaut 100, garde-fou stack overflow). */
23
+ maxDepth?: number;
24
+ /**
25
+ * Court-circuit DP plein si `(aEnd-aStart) * (bEnd-bStart) ≤ smallInputThreshold`.
26
+ * L'overhead d'indexation Histogram domine sur les petits inputs ; le LCS
27
+ * legacy DP est plus rapide. Défaut 200 (≈ 14×14 cellules).
28
+ */
29
+ smallInputThreshold?: number;
30
+ }
31
+ /**
32
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes via
33
+ * l'algorithme **Histogram**. Retourne les indices des lignes communes dans
34
+ * chaque tableau, en ordre strictement croissant.
35
+ *
36
+ * Contrat : `histogramDiff(a, b).length === lcsLegacy(a, b).length` sur tous
37
+ * les inputs (les paires retournées peuvent différer sur les tie-breaks).
38
+ *
39
+ * @param a - premier tableau de lignes
40
+ * @param b - second tableau de lignes
41
+ * @param opts - options optionnelles
42
+ * @returns paires `[i, j]` telles que `a[i] === b[j]`, ordre croissant
43
+ */
44
+ export declare function histogramDiff(a: string[], b: string[], opts?: HistogramOptions): Array<[number, number]>;
45
+ //# sourceMappingURL=histogram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.d.ts","sourceRoot":"","sources":["../../src/diff/histogram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAKD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAAE,MAAM,EAAE,EACX,CAAC,EAAE,MAAM,EAAE,EACX,IAAI,CAAC,EAAE,gBAAgB,GACtB,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAIzB"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * GitWand — Histogram diff
3
+ *
4
+ * Implémentation récursive inspirée de l'algorithme Histogram (Git, JGit) :
5
+ * trouver une **ancre rare** (ligne dont la somme des fréquences `freqA + freqB`
6
+ * est minimale, idéalement 1 + 1), splitter récursivement autour de l'ancre.
7
+ *
8
+ * Vs LCS pur :
9
+ * - LCS aligne sur n'importe quelle ligne commune ; sur du code source, les
10
+ * ancres faibles (`}`, `return;`, lignes vides) produisent des splits hostiles.
11
+ * - Histogram s'ancre sur les lignes uniques d'abord, ce qui produit des diffs
12
+ * plus stables et plus lisibles, et augmente le taux de succès de
13
+ * `non_overlapping` / `insertion_at_boundary` qui dépendent de l'alignement.
14
+ *
15
+ * Référence : Nugroho et al., « How different are different diff algorithms in
16
+ * Git? » Springer EMSE 2019. Histogram domine Myers et LCS sur le code source.
17
+ *
18
+ * @module
19
+ */
20
+ import { lcsLegacy } from "./lcs.js";
21
+ const DEFAULT_MAX_DEPTH = 100;
22
+ const DEFAULT_SMALL_INPUT_THRESHOLD = 200;
23
+ /**
24
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes via
25
+ * l'algorithme **Histogram**. Retourne les indices des lignes communes dans
26
+ * chaque tableau, en ordre strictement croissant.
27
+ *
28
+ * Contrat : `histogramDiff(a, b).length === lcsLegacy(a, b).length` sur tous
29
+ * les inputs (les paires retournées peuvent différer sur les tie-breaks).
30
+ *
31
+ * @param a - premier tableau de lignes
32
+ * @param b - second tableau de lignes
33
+ * @param opts - options optionnelles
34
+ * @returns paires `[i, j]` telles que `a[i] === b[j]`, ordre croissant
35
+ */
36
+ export function histogramDiff(a, b, opts) {
37
+ const maxDepth = opts?.maxDepth ?? DEFAULT_MAX_DEPTH;
38
+ const smallInputThreshold = opts?.smallInputThreshold ?? DEFAULT_SMALL_INPUT_THRESHOLD;
39
+ return diffWindow(a, 0, a.length, b, 0, b.length, 0, maxDepth, smallInputThreshold);
40
+ }
41
+ /**
42
+ * Coeur récursif. Opère sur les fenêtres `a[aStart..aEnd], b[bStart..bEnd]`.
43
+ * Retourne les paires `[i, j]` en coordonnées **absolues** (par rapport aux
44
+ * tableaux d'origine), pas relatives à la fenêtre.
45
+ */
46
+ function diffWindow(a, aStart, aEnd, b, bStart, bEnd, depth, maxDepth, smallInputThreshold) {
47
+ const n = aEnd - aStart;
48
+ const m = bEnd - bStart;
49
+ // ─── Cas de base ─────────────────────────────────────────────
50
+ if (n <= 0 || m <= 0)
51
+ return [];
52
+ if (n === 1) {
53
+ // Première occurrence dans b — même tie-break que `lcsHirschberg`.
54
+ const target = a[aStart];
55
+ for (let j = bStart; j < bEnd; j++) {
56
+ if (b[j] === target)
57
+ return [[aStart, j]];
58
+ }
59
+ return [];
60
+ }
61
+ if (m === 1) {
62
+ const target = b[bStart];
63
+ for (let i = aStart; i < aEnd; i++) {
64
+ if (a[i] === target)
65
+ return [[i, bStart]];
66
+ }
67
+ return [];
68
+ }
69
+ // ─── Garde-fous : profondeur + petit input ───────────────────
70
+ if (depth >= maxDepth || n * m <= smallInputThreshold) {
71
+ // Fallback DP plein sur la sous-fenêtre. On copie les sous-tableaux
72
+ // pour rester dans le contrat de `lcsLegacy(string[], string[])`.
73
+ const aSub = a.slice(aStart, aEnd);
74
+ const bSub = b.slice(bStart, bEnd);
75
+ const sub = lcsLegacy(aSub, bSub);
76
+ return sub.map(([i, j]) => [i + aStart, j + bStart]);
77
+ }
78
+ // ─── Histogramme : fréquences sur la fenêtre courante ────────
79
+ const freqA = new Map();
80
+ for (let i = aStart; i < aEnd; i++) {
81
+ freqA.set(a[i], (freqA.get(a[i]) ?? 0) + 1);
82
+ }
83
+ const freqB = new Map();
84
+ for (let j = bStart; j < bEnd; j++) {
85
+ freqB.set(b[j], (freqB.get(b[j]) ?? 0) + 1);
86
+ }
87
+ // ─── Indexation des positions de chaque ligne dans la fenêtre b ──
88
+ // (sert à étendre le match pour chaque candidat ancre vers la position de b
89
+ // qui maximise la région contiguë alignée — heuristique JGit Histogram.)
90
+ const posB = new Map();
91
+ for (let j = bStart; j < bEnd; j++) {
92
+ const line = b[j];
93
+ let arr = posB.get(line);
94
+ if (!arr) {
95
+ arr = [];
96
+ posB.set(line, arr);
97
+ }
98
+ arr.push(j);
99
+ }
100
+ // ─── Recherche de l'ancre — variant JGit ─────────────────────
101
+ // Pour chaque ligne candidate (présente dans freqB), parcourir toutes ses
102
+ // positions dans b et étendre le match (forward + backward) tant que les
103
+ // lignes correspondent. Conserver le triplet (i, j, regionLen) qui maximise
104
+ // `regionLen / (freqA + freqB)`. À regionLen + score égaux, conserver le
105
+ // plus petit i (tie-break stable).
106
+ let bestI = -1;
107
+ let bestJ = -1;
108
+ let bestRegionLen = 0;
109
+ let bestScore = Number.POSITIVE_INFINITY;
110
+ for (let i = aStart; i < aEnd; i++) {
111
+ const line = a[i];
112
+ const positions = posB.get(line);
113
+ if (!positions)
114
+ continue;
115
+ const fA = freqA.get(line);
116
+ const fB = positions.length;
117
+ const score = fA + fB;
118
+ // Si le score est strictement pire que le best courant ET que regionLen
119
+ // ne peut pas le battre, skip (optim).
120
+ if (score > bestScore && bestRegionLen >= 1)
121
+ continue;
122
+ for (const j of positions) {
123
+ // Étendre forward
124
+ let fwd = 1;
125
+ while (i + fwd < aEnd &&
126
+ j + fwd < bEnd &&
127
+ a[i + fwd] === b[j + fwd]) {
128
+ fwd++;
129
+ }
130
+ // Étendre backward (mais en restant dans la fenêtre)
131
+ let bwd = 0;
132
+ while (i - bwd - 1 >= aStart &&
133
+ j - bwd - 1 >= bStart &&
134
+ a[i - bwd - 1] === b[j - bwd - 1]) {
135
+ bwd++;
136
+ }
137
+ const regionLen = fwd + bwd;
138
+ // Critère de sélection : prioriser (a) la région la plus longue, (b) à
139
+ // longueur égale le score le plus bas (ancre la plus rare), (c) à score
140
+ // égal le plus petit i (déterminisme).
141
+ if (regionLen > bestRegionLen ||
142
+ (regionLen === bestRegionLen && score < bestScore) ||
143
+ (regionLen === bestRegionLen && score === bestScore && i < bestI)) {
144
+ bestI = i - bwd; // début de la région étendue côté a
145
+ bestJ = j - bwd; // début de la région étendue côté b
146
+ bestRegionLen = regionLen;
147
+ bestScore = score;
148
+ }
149
+ }
150
+ }
151
+ // ─── Pas d'ancre commune ─────────────────────────────────────
152
+ if (bestI === -1) {
153
+ // Aucune ligne de a n'apparaît dans b sur cette fenêtre → pas de LCS.
154
+ return [];
155
+ }
156
+ // ─── Récursion gauche + région étendue + récursion droite ────
157
+ // La région étendue couvre [bestI..bestI+bestRegionLen-1] dans a et
158
+ // [bestJ..bestJ+bestRegionLen-1] dans b (toutes paires matchent).
159
+ const left = diffWindow(a, aStart, bestI, b, bStart, bestJ, depth + 1, maxDepth, smallInputThreshold);
160
+ const right = diffWindow(a, bestI + bestRegionLen, aEnd, b, bestJ + bestRegionLen, bEnd, depth + 1, maxDepth, smallInputThreshold);
161
+ const result = new Array(left.length + bestRegionLen + right.length);
162
+ let k = 0;
163
+ for (let i = 0; i < left.length; i++)
164
+ result[k++] = left[i];
165
+ for (let r = 0; r < bestRegionLen; r++) {
166
+ result[k++] = [bestI + r, bestJ + r];
167
+ }
168
+ for (let i = 0; i < right.length; i++)
169
+ result[k++] = right[i];
170
+ return result;
171
+ }
172
+ //# sourceMappingURL=histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../src/diff/histogram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * GitWand — Sous-arborescence diff
3
+ *
4
+ * Point d'entrée unique pour les algorithmes de diff et leurs helpers.
5
+ *
6
+ * **v2.1 — Histogram par défaut** : `lcs()` route vers `histogramDiff` (ancrage
7
+ * sur lignes rares, splits plus stables sur le code source). Pour rebasculer
8
+ * sur l'algo legacy (DP plein / Hirschberg) :
9
+ *
10
+ * GITWAND_DIFF=lcs node ...
11
+ *
12
+ * Le contrat de longueur est préservé : `histogramDiff(a, b).length ===
13
+ * lcsLegacy(a, b).length` sur tous les inputs (les paires retournées peuvent
14
+ * différer sur les tie-breaks).
15
+ */
16
+ export { lcsLegacy, _lcsHirschberg } from "./lcs.js";
17
+ export { histogramDiff, type HistogramOptions } from "./histogram.js";
18
+ export { detectBlockMove, type MovedBlock, type BlockMoveOptions, } from "./block-move.js";
19
+ /**
20
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes.
21
+ *
22
+ * Backend par défaut : **Histogram** (depuis v2.1). Bascule sur l'algo legacy
23
+ * via `GITWAND_DIFF=lcs`.
24
+ *
25
+ * @returns paires `[i, j]` telles que `a[i] === b[j]`, ordre strictement
26
+ * croissant dans les deux dimensions.
27
+ */
28
+ export declare function lcs(a: string[], b: string[]): Array<[number, number]>;
29
+ export { computeDiff, extractEdits, editsOverlap, mergeNonOverlapping, type DiffOp, type Edit, } from "./shared.js";
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAazB;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAGrE;AAED,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,KAAK,MAAM,EACX,KAAK,IAAI,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * GitWand — Sous-arborescence diff
3
+ *
4
+ * Point d'entrée unique pour les algorithmes de diff et leurs helpers.
5
+ *
6
+ * **v2.1 — Histogram par défaut** : `lcs()` route vers `histogramDiff` (ancrage
7
+ * sur lignes rares, splits plus stables sur le code source). Pour rebasculer
8
+ * sur l'algo legacy (DP plein / Hirschberg) :
9
+ *
10
+ * GITWAND_DIFF=lcs node ...
11
+ *
12
+ * Le contrat de longueur est préservé : `histogramDiff(a, b).length ===
13
+ * lcsLegacy(a, b).length` sur tous les inputs (les paires retournées peuvent
14
+ * différer sur les tie-breaks).
15
+ */
16
+ import { lcsLegacy } from "./lcs.js";
17
+ import { histogramDiff } from "./histogram.js";
18
+ export { lcsLegacy, _lcsHirschberg } from "./lcs.js";
19
+ export { histogramDiff } from "./histogram.js";
20
+ export { detectBlockMove, } from "./block-move.js";
21
+ /**
22
+ * Lit le flag d'environnement de manière safe — `process` n'est pas défini
23
+ * dans tous les runtimes (browser pur, certains worklets). Sur Tauri webview
24
+ * et VS Code extension `process` existe, donc le rollback marche partout où
25
+ * `@gitwand/core` est utilisé en pratique.
26
+ */
27
+ function shouldUseLegacy() {
28
+ if (typeof process === "undefined")
29
+ return false;
30
+ return process.env?.GITWAND_DIFF === "lcs";
31
+ }
32
+ /**
33
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes.
34
+ *
35
+ * Backend par défaut : **Histogram** (depuis v2.1). Bascule sur l'algo legacy
36
+ * via `GITWAND_DIFF=lcs`.
37
+ *
38
+ * @returns paires `[i, j]` telles que `a[i] === b[j]`, ordre strictement
39
+ * croissant dans les deux dimensions.
40
+ */
41
+ export function lcs(a, b) {
42
+ if (shouldUseLegacy())
43
+ return lcsLegacy(a, b);
44
+ return histogramDiff(a, b);
45
+ }
46
+ export { computeDiff, extractEdits, editsOverlap, mergeNonOverlapping, } from "./shared.js";
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diff/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAyB,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,eAAe,GAGhB,MAAM,iBAAiB,CAAC;AAEzB;;;;;GAKG;AACH,SAAS,eAAe;IACtB,IAAI,OAAO,OAAO,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,OAAO,CAAC,GAAG,EAAE,YAAY,KAAK,KAAK,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG,CAAC,CAAW,EAAE,CAAW;IAC1C,IAAI,eAAe,EAAE;QAAE,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,GAGpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * GitWand — Algorithme LCS (Longest Common Subsequence)
3
+ *
4
+ * Stratégie hybride DP plein (Int32Array) ↔ Hirschberg (mémoire O(min(n,m))),
5
+ * équivalente en sortie observable. C'est le **backend legacy** depuis v2.1 :
6
+ * la fonction publique `lcs()` réside dans `./index.ts` et route vers
7
+ * `histogramDiff` par défaut. `GITWAND_DIFF=lcs` rebascule sur ce module pour
8
+ * rollback ou comparaison.
9
+ */
10
+ /**
11
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes.
12
+ * Retourne les indices des lignes communes dans chaque tableau.
13
+ *
14
+ * Stratégie hybride :
15
+ * - petit/moyen (n*m ≤ 4M cellules) → DP plein O(n*m) avec `Int32Array`
16
+ * (4 octets/cellule vs 8-16 octets pour des `number[][]`) ;
17
+ * - gros → Hirschberg récursif, mémoire O(min(n,m)) + O(log n) de pile.
18
+ *
19
+ * Le comportement observable (tie-break, pairs retournées) est identique entre
20
+ * les deux branches — voir `src/__tests__/diff.test.ts`.
21
+ *
22
+ * **Note v2.1** : exporté sous le nom `lcsLegacy` pour disambiguer du wrapper
23
+ * public `lcs` (qui route vers Histogram par défaut). L'algo lui-même n'a pas
24
+ * changé.
25
+ */
26
+ export declare function lcsLegacy(a: string[], b: string[]): Array<[number, number]>;
27
+ /**
28
+ * Implémentation Hirschberg exposée pour les tests (et usage avancé éventuel).
29
+ * L'API publique `lcs()` choisit automatiquement entre cette variante et le DP
30
+ * plein selon la taille de l'input. Exporter sous le préfixe `_` signale son
31
+ * caractère d'interne-testable.
32
+ */
33
+ export declare const _lcsHirschberg: (a: string[], b: string[]) => Array<[number, number]>;
34
+ //# sourceMappingURL=lcs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lcs.d.ts","sourceRoot":"","sources":["../../src/diff/lcs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAS3E;AA+CD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,GAAG,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,KAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAC3D,CAAC"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * GitWand — Algorithme LCS (Longest Common Subsequence)
3
+ *
4
+ * Stratégie hybride DP plein (Int32Array) ↔ Hirschberg (mémoire O(min(n,m))),
5
+ * équivalente en sortie observable. C'est le **backend legacy** depuis v2.1 :
6
+ * la fonction publique `lcs()` réside dans `./index.ts` et route vers
7
+ * `histogramDiff` par défaut. `GITWAND_DIFF=lcs` rebascule sur ce module pour
8
+ * rollback ou comparaison.
9
+ */
10
+ /**
11
+ * Seuil au-delà duquel on bascule sur Hirschberg (mémoire O(min(n,m))) au lieu
12
+ * du DP plein (mémoire O(n*m)). À 4M cellules → ~16MB avec un Int32Array, déjà
13
+ * lourd en mémoire mais tolérable en pic. Au-dessus, Hirschberg est obligatoire
14
+ * pour éviter un OOM sur les gros fichiers (lockfiles, bundles minifiés…).
15
+ */
16
+ const HIRSCHBERG_THRESHOLD = 4_000_000;
17
+ /**
18
+ * Calcule la Longest Common Subsequence entre deux tableaux de lignes.
19
+ * Retourne les indices des lignes communes dans chaque tableau.
20
+ *
21
+ * Stratégie hybride :
22
+ * - petit/moyen (n*m ≤ 4M cellules) → DP plein O(n*m) avec `Int32Array`
23
+ * (4 octets/cellule vs 8-16 octets pour des `number[][]`) ;
24
+ * - gros → Hirschberg récursif, mémoire O(min(n,m)) + O(log n) de pile.
25
+ *
26
+ * Le comportement observable (tie-break, pairs retournées) est identique entre
27
+ * les deux branches — voir `src/__tests__/diff.test.ts`.
28
+ *
29
+ * **Note v2.1** : exporté sous le nom `lcsLegacy` pour disambiguer du wrapper
30
+ * public `lcs` (qui route vers Histogram par défaut). L'algo lui-même n'a pas
31
+ * changé.
32
+ */
33
+ export function lcsLegacy(a, b) {
34
+ const n = a.length;
35
+ const m = b.length;
36
+ if (n === 0 || m === 0)
37
+ return [];
38
+ if (n * m <= HIRSCHBERG_THRESHOLD) {
39
+ return lcsDenseDP(a, b);
40
+ }
41
+ return lcsHirschberg(a, b);
42
+ }
43
+ /**
44
+ * DP plein avec `Int32Array` (mémoire compacte, 4 octets/cellule).
45
+ * Équivalent structurel à l'implémentation historique — même tie-break,
46
+ * mêmes paires retournées.
47
+ */
48
+ function lcsDenseDP(a, b) {
49
+ const n = a.length;
50
+ const m = b.length;
51
+ const W = m + 1;
52
+ // Table DP aplatie : dp[i*W + j] ≡ dp[i][j].
53
+ const dp = new Int32Array((n + 1) * W);
54
+ for (let i = 1; i <= n; i++) {
55
+ const row = i * W;
56
+ const prev = (i - 1) * W;
57
+ for (let j = 1; j <= m; j++) {
58
+ if (a[i - 1] === b[j - 1]) {
59
+ dp[row + j] = dp[prev + (j - 1)] + 1;
60
+ }
61
+ else {
62
+ const up = dp[prev + j];
63
+ const left = dp[row + (j - 1)];
64
+ dp[row + j] = up > left ? up : left;
65
+ }
66
+ }
67
+ }
68
+ // Backtrack : mêmes règles de tie-break que l'implémentation historique.
69
+ const result = [];
70
+ let i = n;
71
+ let j = m;
72
+ while (i > 0 && j > 0) {
73
+ if (a[i - 1] === b[j - 1]) {
74
+ result.push([i - 1, j - 1]);
75
+ i--;
76
+ j--;
77
+ }
78
+ else if (dp[(i - 1) * W + j] > dp[i * W + (j - 1)]) {
79
+ i--;
80
+ }
81
+ else {
82
+ j--;
83
+ }
84
+ }
85
+ result.reverse();
86
+ return result;
87
+ }
88
+ /**
89
+ * Implémentation Hirschberg exposée pour les tests (et usage avancé éventuel).
90
+ * L'API publique `lcs()` choisit automatiquement entre cette variante et le DP
91
+ * plein selon la taille de l'input. Exporter sous le préfixe `_` signale son
92
+ * caractère d'interne-testable.
93
+ */
94
+ export const _lcsHirschberg = (a, b) => lcsHirschberg(a, b);
95
+ /**
96
+ * Hirschberg : divide-and-conquer qui trouve le point de split optimal dans `a`
97
+ * en utilisant seulement 2 lignes de DP (mémoire O(min(n,m))), puis recurse sur
98
+ * les deux moitiés. Les paires LCS retournées peuvent différer de celles du DP
99
+ * plein **sur les ties**, mais la longueur et la validité sont garanties.
100
+ *
101
+ * Stratégie pour rester iso-comportement avec `lcsDenseDP` :
102
+ * - Sous un petit seuil de récursion (`n ≤ 2` ou `m ≤ 2`), on tombe sur des
103
+ * cas triviaux résolus directement (même tie-break que le DP plein).
104
+ * - Le split choisit le `j*` qui maximise `scoreL[j] + scoreR[m - j]`, et en
105
+ * cas d'ex-æquo on prend le **plus petit** `j*` (équivalent au tie-break
106
+ * "j-- d'abord" du backtrack historique).
107
+ */
108
+ function lcsHirschberg(a, b) {
109
+ const n = a.length;
110
+ const m = b.length;
111
+ // Cas de base : une seule ligne à gauche → chercher la première occurrence.
112
+ if (n === 0 || m === 0)
113
+ return [];
114
+ if (n === 1) {
115
+ const target = a[0];
116
+ for (let j = 0; j < m; j++) {
117
+ if (b[j] === target)
118
+ return [[0, j]];
119
+ }
120
+ return [];
121
+ }
122
+ const mid = n >> 1; // n / 2 floor
123
+ // Scores DP pour a[0..mid] contre b (forward), longueur m+1.
124
+ const scoreL = lcsScoreRow(a, 0, mid, b, 0, m, false);
125
+ // Scores DP pour a[mid..n] contre b (reverse), longueur m+1.
126
+ const scoreR = lcsScoreRow(a, mid, n, b, 0, m, true);
127
+ // Trouver le j* qui maximise scoreL[j] + scoreR[m - j].
128
+ // En cas d'ex-æquo, on prend le plus petit j pour rester proche du tie-break
129
+ // historique (backtrack « j-- en premier » ≈ préférer les splits « early »).
130
+ let bestJ = 0;
131
+ let bestScore = scoreL[0] + scoreR[m];
132
+ for (let j = 1; j <= m; j++) {
133
+ const s = scoreL[j] + scoreR[m - j];
134
+ if (s > bestScore) {
135
+ bestScore = s;
136
+ bestJ = j;
137
+ }
138
+ }
139
+ // Récursion + ajustement des indices pour la moitié droite.
140
+ const left = lcsHirschberg(a.slice(0, mid), b.slice(0, bestJ));
141
+ const rightRaw = lcsHirschberg(a.slice(mid), b.slice(bestJ));
142
+ const right = rightRaw.map(([i, j]) => [i + mid, j + bestJ]);
143
+ return left.concat(right);
144
+ }
145
+ /**
146
+ * Calcule la dernière ligne du tableau DP LCS en 2 lignes (mémoire O(m+1)).
147
+ *
148
+ * @param a - tableau source pour la dimension « rows »
149
+ * @param aStart - début (inclus) dans a
150
+ * @param aEnd - fin (exclus) dans a
151
+ * @param b - tableau source pour la dimension « cols »
152
+ * @param bStart - début (inclus) dans b
153
+ * @param bEnd - fin (exclus) dans b
154
+ * @param reverse - si true, parcourt a et b à l'envers (pour Hirschberg)
155
+ */
156
+ function lcsScoreRow(a, aStart, aEnd, b, bStart, bEnd, reverse) {
157
+ const n = aEnd - aStart;
158
+ const m = bEnd - bStart;
159
+ let prev = new Int32Array(m + 1);
160
+ let curr = new Int32Array(m + 1);
161
+ for (let i = 1; i <= n; i++) {
162
+ const ai = reverse ? a[aEnd - i] : a[aStart + i - 1];
163
+ for (let j = 1; j <= m; j++) {
164
+ const bj = reverse ? b[bEnd - j] : b[bStart + j - 1];
165
+ if (ai === bj) {
166
+ curr[j] = prev[j - 1] + 1;
167
+ }
168
+ else {
169
+ const up = prev[j];
170
+ const left = curr[j - 1];
171
+ curr[j] = up > left ? up : left;
172
+ }
173
+ }
174
+ // Swap prev ↔ curr (éviter une réallocation)
175
+ const tmp = prev;
176
+ prev = curr;
177
+ curr = tmp;
178
+ // Reset curr à 0 pour la prochaine itération
179
+ curr.fill(0);
180
+ }
181
+ // Après la boucle, la dernière ligne calculée est dans `prev`.
182
+ return prev;
183
+ }
184
+ //# sourceMappingURL=lcs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lcs.js","sourceRoot":"","sources":["../../src/diff/lcs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * GitWand — Helpers partagés au-dessus du backend diff
3
+ *
4
+ * `computeDiff`, `extractEdits`, `editsOverlap`, `mergeNonOverlapping` n'appartiennent
5
+ * pas à un algorithme particulier — ce sont des opérations *sur* le résultat d'un
6
+ * LCS. On les isole de l'implémentation pour pouvoir échanger librement le backend
7
+ * (`lcsLegacy` ↔ `histogramDiff`) sans toucher cette couche.
8
+ */
9
+ /** Une opération de diff sur une ligne */
10
+ export interface DiffOp {
11
+ type: "keep" | "add" | "remove";
12
+ line: string;
13
+ /** Index dans le tableau source (base pour keep/remove, branch pour add) */
14
+ index: number;
15
+ }
16
+ /**
17
+ * Calcule le diff entre une base et une branche.
18
+ * Retourne la séquence d'opérations (keep, add, remove).
19
+ *
20
+ * Utilise le backend `lcs()` du module index (Histogram par défaut depuis v2.1,
21
+ * `lcsLegacy` si `GITWAND_DIFF=lcs`).
22
+ */
23
+ export declare function computeDiff(base: string[], branch: string[]): DiffOp[];
24
+ /**
25
+ * Représente un changement (edit) d'une branche par rapport à la base.
26
+ * start/end sont les indices dans la base où le changement s'applique.
27
+ */
28
+ export interface Edit {
29
+ /** Index de début dans la base (inclus) — position avant laquelle insérer ou début de la zone supprimée */
30
+ baseStart: number;
31
+ /** Index de fin dans la base (exclus) — fin de la zone supprimée */
32
+ baseEnd: number;
33
+ /** Lignes ajoutées à cette position */
34
+ addedLines: string[];
35
+ /** Source : "ours" ou "theirs" */
36
+ source: "ours" | "theirs";
37
+ }
38
+ /**
39
+ * Extrait les edits (changements groupés) d'un diff.
40
+ * Chaque groupe contigu de add/remove forme un edit.
41
+ */
42
+ export declare function extractEdits(diff: DiffOp[], source: "ours" | "theirs"): Edit[];
43
+ /**
44
+ * Vérifie si deux edits se chevauchent (overlap).
45
+ * Deux edits overlap si leurs zones dans la base se croisent.
46
+ */
47
+ export declare function editsOverlap(a: Edit, b: Edit): boolean;
48
+ /**
49
+ * Tente de fusionner les changements non-overlapping de deux branches.
50
+ *
51
+ * @returns Les lignes fusionnées, ou null si les changements se chevauchent
52
+ */
53
+ export declare function mergeNonOverlapping(base: string[], ours: string[], theirs: string[]): string[] | null;
54
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/diff/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,0CAA0C;AAC1C,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmCtE;AAED;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,2GAA2G;IAC3G,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kCAAkC;IAClC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,GAAG,QAAQ,GACxB,IAAI,EAAE,CAqCR;AAmBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAmBtD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,EAAE,GAAG,IAAI,CAgDjB"}