circle-ir 4.17.0 → 4.18.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 (280) hide show
  1. package/dist/analysis/advisories.d.ts +186 -0
  2. package/dist/analysis/advisories.d.ts.map +1 -0
  3. package/dist/analysis/advisories.js +391 -0
  4. package/dist/analysis/advisories.js.map +1 -0
  5. package/dist/analysis/comment-lines.d.ts +14 -0
  6. package/dist/analysis/comment-lines.d.ts.map +1 -0
  7. package/dist/analysis/comment-lines.js +34 -0
  8. package/dist/analysis/comment-lines.js.map +1 -0
  9. package/dist/analysis/config-loader.d.ts.map +1 -1
  10. package/dist/analysis/config-loader.js +59 -5
  11. package/dist/analysis/config-loader.js.map +1 -1
  12. package/dist/analysis/constant-caller-gate.d.ts +2 -2
  13. package/dist/analysis/constant-caller-gate.d.ts.map +1 -1
  14. package/dist/analysis/constant-caller-gate.js +205 -29
  15. package/dist/analysis/constant-caller-gate.js.map +1 -1
  16. package/dist/analysis/constant-propagation/propagator.d.ts +4 -0
  17. package/dist/analysis/constant-propagation/propagator.d.ts.map +1 -1
  18. package/dist/analysis/constant-propagation/propagator.js +99 -0
  19. package/dist/analysis/constant-propagation/propagator.js.map +1 -1
  20. package/dist/analysis/entry-point-detection.d.ts.map +1 -1
  21. package/dist/analysis/entry-point-detection.js +72 -0
  22. package/dist/analysis/entry-point-detection.js.map +1 -1
  23. package/dist/analysis/interprocedural.d.ts.map +1 -1
  24. package/dist/analysis/interprocedural.js +75 -8
  25. package/dist/analysis/interprocedural.js.map +1 -1
  26. package/dist/analysis/maven-declared.d.ts +72 -0
  27. package/dist/analysis/maven-declared.d.ts.map +1 -0
  28. package/dist/analysis/maven-declared.js +216 -0
  29. package/dist/analysis/maven-declared.js.map +1 -0
  30. package/dist/analysis/maven-version.d.ts +28 -0
  31. package/dist/analysis/maven-version.d.ts.map +1 -0
  32. package/dist/analysis/maven-version.js +172 -0
  33. package/dist/analysis/maven-version.js.map +1 -0
  34. package/dist/analysis/passes/constant-propagation-pass.d.ts.map +1 -1
  35. package/dist/analysis/passes/constant-propagation-pass.js +29 -1
  36. package/dist/analysis/passes/constant-propagation-pass.js.map +1 -1
  37. package/dist/analysis/passes/cross-file-pass.d.ts.map +1 -1
  38. package/dist/analysis/passes/cross-file-pass.js +81 -1
  39. package/dist/analysis/passes/cross-file-pass.js.map +1 -1
  40. package/dist/analysis/passes/csharp-sanitizer-credit.d.ts +7 -0
  41. package/dist/analysis/passes/csharp-sanitizer-credit.d.ts.map +1 -1
  42. package/dist/analysis/passes/csharp-sanitizer-credit.js +44 -1
  43. package/dist/analysis/passes/csharp-sanitizer-credit.js.map +1 -1
  44. package/dist/analysis/passes/insecure-cookie-pass.d.ts +2 -0
  45. package/dist/analysis/passes/insecure-cookie-pass.d.ts.map +1 -1
  46. package/dist/analysis/passes/insecure-cookie-pass.js +25 -3
  47. package/dist/analysis/passes/insecure-cookie-pass.js.map +1 -1
  48. package/dist/analysis/passes/interprocedural-pass.d.ts +11 -14
  49. package/dist/analysis/passes/interprocedural-pass.d.ts.map +1 -1
  50. package/dist/analysis/passes/interprocedural-pass.js +562 -0
  51. package/dist/analysis/passes/interprocedural-pass.js.map +1 -1
  52. package/dist/analysis/passes/language-sources-pass.d.ts +18 -1
  53. package/dist/analysis/passes/language-sources-pass.d.ts.map +1 -1
  54. package/dist/analysis/passes/language-sources-pass.js +1057 -14
  55. package/dist/analysis/passes/language-sources-pass.js.map +1 -1
  56. package/dist/analysis/passes/param-source-flow-gate-pass.d.ts.map +1 -1
  57. package/dist/analysis/passes/param-source-flow-gate-pass.js +66 -3
  58. package/dist/analysis/passes/param-source-flow-gate-pass.js.map +1 -1
  59. package/dist/analysis/passes/sink-filter-pass.d.ts +44 -2
  60. package/dist/analysis/passes/sink-filter-pass.d.ts.map +1 -1
  61. package/dist/analysis/passes/sink-filter-pass.js +690 -12
  62. package/dist/analysis/passes/sink-filter-pass.js.map +1 -1
  63. package/dist/analysis/passes/taint-propagation-pass.d.ts.map +1 -1
  64. package/dist/analysis/passes/taint-propagation-pass.js +133 -10
  65. package/dist/analysis/passes/taint-propagation-pass.js.map +1 -1
  66. package/dist/analysis/passes/tls-verify-disabled-pass.d.ts +18 -0
  67. package/dist/analysis/passes/tls-verify-disabled-pass.d.ts.map +1 -1
  68. package/dist/analysis/passes/tls-verify-disabled-pass.js +161 -0
  69. package/dist/analysis/passes/tls-verify-disabled-pass.js.map +1 -1
  70. package/dist/analysis/passes/weak-random-pass.d.ts +6 -0
  71. package/dist/analysis/passes/weak-random-pass.d.ts.map +1 -1
  72. package/dist/analysis/passes/weak-random-pass.js +29 -0
  73. package/dist/analysis/passes/weak-random-pass.js.map +1 -1
  74. package/dist/analysis/promote-cross-file-flows.d.ts +17 -0
  75. package/dist/analysis/promote-cross-file-flows.d.ts.map +1 -0
  76. package/dist/analysis/promote-cross-file-flows.js +32 -0
  77. package/dist/analysis/promote-cross-file-flows.js.map +1 -0
  78. package/dist/analysis/sbom.d.ts +100 -0
  79. package/dist/analysis/sbom.d.ts.map +1 -1
  80. package/dist/analysis/sbom.js +514 -3
  81. package/dist/analysis/sbom.js.map +1 -1
  82. package/dist/analysis/semver-version.d.ts +30 -0
  83. package/dist/analysis/semver-version.d.ts.map +1 -0
  84. package/dist/analysis/semver-version.js +76 -0
  85. package/dist/analysis/semver-version.js.map +1 -0
  86. package/dist/analysis/taint-matcher.d.ts +5 -0
  87. package/dist/analysis/taint-matcher.d.ts.map +1 -1
  88. package/dist/analysis/taint-matcher.js +225 -4
  89. package/dist/analysis/taint-matcher.js.map +1 -1
  90. package/dist/analyzer.d.ts +57 -0
  91. package/dist/analyzer.d.ts.map +1 -1
  92. package/dist/analyzer.js +69 -6
  93. package/dist/analyzer.js.map +1 -1
  94. package/dist/browser/circle-ir.js +2936 -291
  95. package/dist/core/circle-ir-core.cjs +634 -203
  96. package/dist/core/circle-ir-core.js +634 -203
  97. package/dist/core/extractors/dfg.js +205 -2
  98. package/dist/core/extractors/dfg.js.map +1 -1
  99. package/dist/core/extractors/ts-declaration-detail.d.ts +39 -0
  100. package/dist/core/extractors/ts-declaration-detail.d.ts.map +1 -0
  101. package/dist/core/extractors/ts-declaration-detail.js +266 -0
  102. package/dist/core/extractors/ts-declaration-detail.js.map +1 -0
  103. package/dist/graph/analysis-pass.d.ts +4 -1
  104. package/dist/graph/analysis-pass.d.ts.map +1 -1
  105. package/dist/graph/analysis-pass.js +4 -1
  106. package/dist/graph/analysis-pass.js.map +1 -1
  107. package/dist/graph-facts/dead-code.d.ts +62 -0
  108. package/dist/graph-facts/dead-code.d.ts.map +1 -0
  109. package/dist/graph-facts/dead-code.js +90 -0
  110. package/dist/graph-facts/dead-code.js.map +1 -0
  111. package/dist/graph-facts/dependency-calls.d.ts +86 -0
  112. package/dist/graph-facts/dependency-calls.d.ts.map +1 -0
  113. package/dist/graph-facts/dependency-calls.js +93 -0
  114. package/dist/graph-facts/dependency-calls.js.map +1 -0
  115. package/dist/graph-facts/index.d.ts +10 -0
  116. package/dist/graph-facts/index.d.ts.map +1 -0
  117. package/dist/graph-facts/index.js +10 -0
  118. package/dist/graph-facts/index.js.map +1 -0
  119. package/dist/graph-facts/maven-packages.d.ts +42 -0
  120. package/dist/graph-facts/maven-packages.d.ts.map +1 -0
  121. package/dist/graph-facts/maven-packages.js +133 -0
  122. package/dist/graph-facts/maven-packages.js.map +1 -0
  123. package/dist/graph-facts/reach.d.ts +203 -0
  124. package/dist/graph-facts/reach.d.ts.map +1 -0
  125. package/dist/graph-facts/reach.js +219 -0
  126. package/dist/graph-facts/reach.js.map +1 -0
  127. package/dist/graph-facts/removal-reach.d.ts +73 -0
  128. package/dist/graph-facts/removal-reach.d.ts.map +1 -0
  129. package/dist/graph-facts/removal-reach.js +64 -0
  130. package/dist/graph-facts/removal-reach.js.map +1 -0
  131. package/dist/index.d.ts +21 -6
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +20 -3
  134. package/dist/index.js.map +1 -1
  135. package/dist/navigation/go-graph.d.ts +68 -0
  136. package/dist/navigation/go-graph.d.ts.map +1 -0
  137. package/dist/navigation/go-graph.js +753 -0
  138. package/dist/navigation/go-graph.js.map +1 -0
  139. package/dist/navigation/index.d.ts +7 -1
  140. package/dist/navigation/index.d.ts.map +1 -1
  141. package/dist/navigation/index.js +6 -0
  142. package/dist/navigation/index.js.map +1 -1
  143. package/dist/navigation/java-entry-tables.d.ts +43 -0
  144. package/dist/navigation/java-entry-tables.d.ts.map +1 -0
  145. package/dist/navigation/java-entry-tables.js +56 -0
  146. package/dist/navigation/java-entry-tables.js.map +1 -0
  147. package/dist/navigation/java-graph.d.ts +64 -0
  148. package/dist/navigation/java-graph.d.ts.map +1 -0
  149. package/dist/navigation/java-graph.js +466 -0
  150. package/dist/navigation/java-graph.js.map +1 -0
  151. package/dist/navigation/navigation-index.d.ts +51 -1
  152. package/dist/navigation/navigation-index.d.ts.map +1 -1
  153. package/dist/navigation/navigation-index.js +72 -0
  154. package/dist/navigation/navigation-index.js.map +1 -1
  155. package/dist/navigation/python-graph.d.ts +73 -0
  156. package/dist/navigation/python-graph.d.ts.map +1 -0
  157. package/dist/navigation/python-graph.js +867 -0
  158. package/dist/navigation/python-graph.js.map +1 -0
  159. package/dist/navigation/ts-call-edges.d.ts +193 -0
  160. package/dist/navigation/ts-call-edges.d.ts.map +1 -0
  161. package/dist/navigation/ts-call-edges.js +2089 -0
  162. package/dist/navigation/ts-call-edges.js.map +1 -0
  163. package/dist/navigation/ts-entry-tables.d.ts +88 -0
  164. package/dist/navigation/ts-entry-tables.d.ts.map +1 -0
  165. package/dist/navigation/ts-entry-tables.js +50 -0
  166. package/dist/navigation/ts-entry-tables.js.map +1 -0
  167. package/dist/path-set/branches.d.ts +52 -0
  168. package/dist/path-set/branches.d.ts.map +1 -0
  169. package/dist/path-set/branches.js +124 -0
  170. package/dist/path-set/branches.js.map +1 -0
  171. package/dist/path-set/finding-diff.d.ts +63 -0
  172. package/dist/path-set/finding-diff.d.ts.map +1 -0
  173. package/dist/path-set/finding-diff.js +150 -0
  174. package/dist/path-set/finding-diff.js.map +1 -0
  175. package/dist/path-set/index.d.ts +18 -0
  176. package/dist/path-set/index.d.ts.map +1 -0
  177. package/dist/path-set/index.js +12 -0
  178. package/dist/path-set/index.js.map +1 -0
  179. package/dist/path-set/line-diff.d.ts +19 -0
  180. package/dist/path-set/line-diff.d.ts.map +1 -0
  181. package/dist/path-set/line-diff.js +98 -0
  182. package/dist/path-set/line-diff.js.map +1 -0
  183. package/dist/path-set/path-set.d.ts +88 -0
  184. package/dist/path-set/path-set.d.ts.map +1 -0
  185. package/dist/path-set/path-set.js +716 -0
  186. package/dist/path-set/path-set.js.map +1 -0
  187. package/dist/path-set/templates.d.ts +42 -0
  188. package/dist/path-set/templates.d.ts.map +1 -0
  189. package/dist/path-set/templates.js +119 -0
  190. package/dist/path-set/templates.js.map +1 -0
  191. package/dist/path-set/types.d.ts +195 -0
  192. package/dist/path-set/types.d.ts.map +1 -0
  193. package/dist/path-set/types.js +8 -0
  194. package/dist/path-set/types.js.map +1 -0
  195. package/dist/remedy-class/index.d.ts +12 -0
  196. package/dist/remedy-class/index.d.ts.map +1 -0
  197. package/dist/remedy-class/index.js +9 -0
  198. package/dist/remedy-class/index.js.map +1 -0
  199. package/dist/remedy-class/match.d.ts +165 -0
  200. package/dist/remedy-class/match.d.ts.map +1 -0
  201. package/dist/remedy-class/match.js +705 -0
  202. package/dist/remedy-class/match.js.map +1 -0
  203. package/dist/remedy-class/output-context.d.ts +25 -0
  204. package/dist/remedy-class/output-context.d.ts.map +1 -0
  205. package/dist/remedy-class/output-context.js +150 -0
  206. package/dist/remedy-class/output-context.js.map +1 -0
  207. package/dist/remedy-class/sha256.d.ts +18 -0
  208. package/dist/remedy-class/sha256.d.ts.map +1 -0
  209. package/dist/remedy-class/sha256.js +89 -0
  210. package/dist/remedy-class/sha256.js.map +1 -0
  211. package/dist/remedy-class/table.d.ts +130 -0
  212. package/dist/remedy-class/table.d.ts.map +1 -0
  213. package/dist/remedy-class/table.js +457 -0
  214. package/dist/remedy-class/table.js.map +1 -0
  215. package/dist/resolution/cross-file.d.ts +9 -0
  216. package/dist/resolution/cross-file.d.ts.map +1 -1
  217. package/dist/resolution/cross-file.js +60 -5
  218. package/dist/resolution/cross-file.js.map +1 -1
  219. package/dist/stable-ids/builder.d.ts +20 -0
  220. package/dist/stable-ids/builder.d.ts.map +1 -0
  221. package/dist/stable-ids/builder.js +65 -0
  222. package/dist/stable-ids/builder.js.map +1 -0
  223. package/dist/stable-ids/diff.d.ts +18 -0
  224. package/dist/stable-ids/diff.d.ts.map +1 -0
  225. package/dist/stable-ids/diff.js +37 -0
  226. package/dist/stable-ids/diff.js.map +1 -0
  227. package/dist/stable-ids/go.d.ts +28 -0
  228. package/dist/stable-ids/go.d.ts.map +1 -0
  229. package/dist/stable-ids/go.js +160 -0
  230. package/dist/stable-ids/go.js.map +1 -0
  231. package/dist/stable-ids/hash.d.ts +22 -0
  232. package/dist/stable-ids/hash.d.ts.map +1 -0
  233. package/dist/stable-ids/hash.js +167 -0
  234. package/dist/stable-ids/hash.js.map +1 -0
  235. package/dist/stable-ids/index.d.ts +30 -0
  236. package/dist/stable-ids/index.d.ts.map +1 -0
  237. package/dist/stable-ids/index.js +59 -0
  238. package/dist/stable-ids/index.js.map +1 -0
  239. package/dist/stable-ids/java.d.ts +28 -0
  240. package/dist/stable-ids/java.d.ts.map +1 -0
  241. package/dist/stable-ids/java.js +224 -0
  242. package/dist/stable-ids/java.js.map +1 -0
  243. package/dist/stable-ids/moves.d.ts +87 -0
  244. package/dist/stable-ids/moves.d.ts.map +1 -0
  245. package/dist/stable-ids/moves.js +222 -0
  246. package/dist/stable-ids/moves.js.map +1 -0
  247. package/dist/stable-ids/nodes.d.ts +32 -0
  248. package/dist/stable-ids/nodes.d.ts.map +1 -0
  249. package/dist/stable-ids/nodes.js +92 -0
  250. package/dist/stable-ids/nodes.js.map +1 -0
  251. package/dist/stable-ids/normalize.d.ts +35 -0
  252. package/dist/stable-ids/normalize.d.ts.map +1 -0
  253. package/dist/stable-ids/normalize.js +174 -0
  254. package/dist/stable-ids/normalize.js.map +1 -0
  255. package/dist/stable-ids/parse-errors.d.ts +24 -0
  256. package/dist/stable-ids/parse-errors.d.ts.map +1 -0
  257. package/dist/stable-ids/parse-errors.js +46 -0
  258. package/dist/stable-ids/parse-errors.js.map +1 -0
  259. package/dist/stable-ids/python.d.ts +27 -0
  260. package/dist/stable-ids/python.d.ts.map +1 -0
  261. package/dist/stable-ids/python.js +212 -0
  262. package/dist/stable-ids/python.js.map +1 -0
  263. package/dist/stable-ids/ts-parse-errors.d.ts +27 -0
  264. package/dist/stable-ids/ts-parse-errors.d.ts.map +1 -0
  265. package/dist/stable-ids/ts-parse-errors.js +75 -0
  266. package/dist/stable-ids/ts-parse-errors.js.map +1 -0
  267. package/dist/stable-ids/types.d.ts +106 -0
  268. package/dist/stable-ids/types.d.ts.map +1 -0
  269. package/dist/stable-ids/types.js +16 -0
  270. package/dist/stable-ids/types.js.map +1 -0
  271. package/dist/stable-ids/typescript.d.ts +30 -0
  272. package/dist/stable-ids/typescript.d.ts.map +1 -0
  273. package/dist/stable-ids/typescript.js +362 -0
  274. package/dist/stable-ids/typescript.js.map +1 -0
  275. package/dist/types/config.d.ts +9 -0
  276. package/dist/types/config.d.ts.map +1 -1
  277. package/dist/types/index.d.ts +35 -0
  278. package/dist/types/index.d.ts.map +1 -1
  279. package/dist/types/index.js.map +1 -1
  280. package/package.json +3 -3
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Moves and renames between two versions, as facts (`ids@0.1`).
3
+ *
4
+ * `diffStableIds` leaves a moved or renamed declaration as one removal plus
5
+ * one addition. This pairs them, in three steps over what is still unpaired:
6
+ *
7
+ * 1. **Equal body hash** — settles. The pair must be unique on both sides
8
+ * (one removed and one added declaration of the same kind with that
9
+ * hash) and the body must have at least `minTokens` normalized tokens;
10
+ * a smaller or shared body is reported as a candidate, never a fact —
11
+ * unless a settled pair vouches for it: a container settles when one of
12
+ * its members settled into the counterpart (`members`), and a member
13
+ * follows its settled container when the counterpart has the same local
14
+ * name, kind, signature and body (`enclosing`).
15
+ * 2. **Same kind and qualified name, new signature** — settles as
16
+ * `signature-changed` when exactly one removed and one added
17
+ * declaration share them (declarations flagged `unstable:duplicate` are
18
+ * left out).
19
+ * 3. **Similar body** — candidates only (signal): token-bigram similarity at
20
+ * or above `similarityBar`, with the caller sets compared when the caller
21
+ * supplies them. A candidate whose caller sets differ is dropped.
22
+ *
23
+ * Anything not paired stays removed and added, so a missed move costs a
24
+ * "removed + added", never a wrong match.
25
+ */
26
+ import { type StableIdDiff } from './diff.js';
27
+ import { type StableDecl, type StableIdFile, type StableIdScheme } from './types.js';
28
+ export type MoveRelation = 'moved' | 'renamed' | 'moved-renamed' | 'signature-changed';
29
+ /** Why a pair settled. */
30
+ export type MoveEvidence =
31
+ /** Equal body hash, unique on both sides, body of at least `minTokens` tokens. */
32
+ 'body-hash'
33
+ /** A small equal-hash pair one of whose members settled into the other. */
34
+ | 'members'
35
+ /** Its enclosing declaration settled; same local name, kind, signature and body under the new one. */
36
+ | 'enclosing'
37
+ /** Same kind and qualified name, new signature. */
38
+ | 'qualified-name';
39
+ /** Why a pair is only a candidate. */
40
+ export type CandidateEvidence = 'body-hash-small' | 'body-hash-ambiguous' | 'similar-body';
41
+ export interface StableIdMove {
42
+ scheme: StableIdScheme;
43
+ relation: MoveRelation;
44
+ evidence: MoveEvidence;
45
+ from: StableDecl;
46
+ to: StableDecl;
47
+ /** The two commits, when the caller named them. */
48
+ base?: string;
49
+ head?: string;
50
+ }
51
+ export interface MoveCandidate {
52
+ relation: MoveRelation;
53
+ evidence: CandidateEvidence;
54
+ from: StableDecl;
55
+ to: StableDecl;
56
+ /** Token-bigram Dice similarity of the two bodies, 0–1, rounded to 4 places (1 for equal hashes). */
57
+ similarity: number;
58
+ /** `equal` when both caller sets were supplied and match; `unknown` when either was not supplied. */
59
+ callers: 'equal' | 'unknown';
60
+ }
61
+ export interface MoveOptions {
62
+ /** Bodies with fewer normalized tokens never settle by hash alone. Default 12. */
63
+ minTokens?: number;
64
+ /**
65
+ * Bar for similar-body candidates, 0–1. Default 0.8. It is a placeholder
66
+ * until measured on a seeded set: candidates are signal whatever it is.
67
+ */
68
+ similarityBar?: number;
69
+ /** Callers of each declaration at the base version, by declaration id. */
70
+ callersBefore?: ReadonlyMap<string, readonly string[]>;
71
+ /** Callers of each declaration at the head version, by declaration id. */
72
+ callersAfter?: ReadonlyMap<string, readonly string[]>;
73
+ base?: string;
74
+ head?: string;
75
+ }
76
+ export interface MoveDetection {
77
+ /** `diffStableIds`, with every settled pair taken out of `removed` and `added`. */
78
+ diff: StableIdDiff;
79
+ moves: StableIdMove[];
80
+ /** Signal only, sorted by similarity (highest first), then by ids. */
81
+ candidates: MoveCandidate[];
82
+ }
83
+ /** Dice coefficient over token-bigram multisets. */
84
+ export declare function bodySimilarity(a: readonly string[], b: readonly string[]): number;
85
+ /** Pair the removed and added declarations of two versions. */
86
+ export declare function detectMoves(before: readonly StableIdFile[], after: readonly StableIdFile[], options?: MoveOptions): MoveDetection;
87
+ //# sourceMappingURL=moves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.d.ts","sourceRoot":"","sources":["../../src/stable-ids/moves.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAoB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEvG,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAEvF,0BAA0B;AAC1B,MAAM,MAAM,YAAY;AACtB,kFAAkF;AAChF,WAAW;AACb,2EAA2E;GACzE,SAAS;AACX,sGAAsG;GACpG,WAAW;AACb,mDAAmD;GACjD,gBAAgB,CAAC;AAErB,sCAAsC;AACtC,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG,qBAAqB,GAAG,cAAc,CAAC;AAE3F,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,UAAU,CAAC;IACf,qGAAqG;IACrG,UAAU,EAAE,MAAM,CAAC;IACnB,qGAAqG;IACrG,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IACvD,0EAA0E;IAC1E,YAAY,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,mFAAmF;IACnF,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,sEAAsE;IACtE,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAyCD,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOjF;AAWD,+DAA+D;AAC/D,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,GAAE,WAAgB,GACxB,aAAa,CA+Hf"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Moves and renames between two versions, as facts (`ids@0.1`).
3
+ *
4
+ * `diffStableIds` leaves a moved or renamed declaration as one removal plus
5
+ * one addition. This pairs them, in three steps over what is still unpaired:
6
+ *
7
+ * 1. **Equal body hash** — settles. The pair must be unique on both sides
8
+ * (one removed and one added declaration of the same kind with that
9
+ * hash) and the body must have at least `minTokens` normalized tokens;
10
+ * a smaller or shared body is reported as a candidate, never a fact —
11
+ * unless a settled pair vouches for it: a container settles when one of
12
+ * its members settled into the counterpart (`members`), and a member
13
+ * follows its settled container when the counterpart has the same local
14
+ * name, kind, signature and body (`enclosing`).
15
+ * 2. **Same kind and qualified name, new signature** — settles as
16
+ * `signature-changed` when exactly one removed and one added
17
+ * declaration share them (declarations flagged `unstable:duplicate` are
18
+ * left out).
19
+ * 3. **Similar body** — candidates only (signal): token-bigram similarity at
20
+ * or above `similarityBar`, with the caller sets compared when the caller
21
+ * supplies them. A candidate whose caller sets differ is dropped.
22
+ *
23
+ * Anything not paired stays removed and added, so a missed move costs a
24
+ * "removed + added", never a wrong match.
25
+ */
26
+ import { diffStableIds } from './diff.js';
27
+ import { STABLE_ID_SCHEME } from './types.js';
28
+ /** The qualified name of the enclosing scope: everything before the declaration's own name. */
29
+ function enclosing(d) {
30
+ const q = d.qualified_name.replace(/#\d+$/, '');
31
+ if (d.parent === null)
32
+ return '';
33
+ const at = q.lastIndexOf(d.name);
34
+ return at > 0 ? q.slice(0, at) : q;
35
+ }
36
+ function relationOf(from, to) {
37
+ // A module is named by its path: a new name is a move of the file.
38
+ if (from.kind === 'module' && from.parent === null)
39
+ return 'moved';
40
+ const renamed = from.name !== to.name;
41
+ const moved = enclosing(from) !== enclosing(to);
42
+ if (renamed && moved)
43
+ return 'moved-renamed';
44
+ if (renamed)
45
+ return 'renamed';
46
+ if (moved)
47
+ return 'moved';
48
+ return 'signature-changed';
49
+ }
50
+ function groupBy(decls, key) {
51
+ const m = new Map();
52
+ for (const d of decls) {
53
+ const k = key(d);
54
+ const list = m.get(k);
55
+ if (list)
56
+ list.push(d);
57
+ else
58
+ m.set(k, [d]);
59
+ }
60
+ return m;
61
+ }
62
+ function bigrams(tokens) {
63
+ const m = new Map();
64
+ for (let i = 0; i + 1 < tokens.length; i++) {
65
+ const k = tokens[i] + '\u0000' + tokens[i + 1];
66
+ m.set(k, (m.get(k) ?? 0) + 1);
67
+ }
68
+ return m;
69
+ }
70
+ /** Dice coefficient over token-bigram multisets. */
71
+ export function bodySimilarity(a, b) {
72
+ if (a.length < 2 || b.length < 2)
73
+ return a.length === b.length && a.every((t, i) => t === b[i]) ? 1 : 0;
74
+ const x = bigrams(a);
75
+ const y = bigrams(b);
76
+ let shared = 0;
77
+ for (const [k, n] of x)
78
+ shared += Math.min(n, y.get(k) ?? 0);
79
+ return (2 * shared) / (a.length - 1 + (b.length - 1));
80
+ }
81
+ /** Shared-body groups larger than this (removed × added) yield no candidates. */
82
+ const MAX_AMBIGUOUS = 25;
83
+ const round4 = (n) => Math.round(n * 10000) / 10000;
84
+ function byIds(a, b) {
85
+ return a.from.id < b.from.id ? -1 : a.from.id > b.from.id ? 1 : a.to.id < b.to.id ? -1 : a.to.id > b.to.id ? 1 : 0;
86
+ }
87
+ /** Pair the removed and added declarations of two versions. */
88
+ export function detectMoves(before, after, options = {}) {
89
+ const minTokens = options.minTokens ?? 12;
90
+ const bar = options.similarityBar ?? 0.8;
91
+ const diff = diffStableIds(before, after);
92
+ const removed = new Set(diff.removed);
93
+ const added = new Set(diff.added);
94
+ const moves = [];
95
+ const candidates = [];
96
+ const settle = (from, to, evidence) => {
97
+ removed.delete(from);
98
+ added.delete(to);
99
+ const move = { scheme: STABLE_ID_SCHEME, relation: relationOf(from, to), evidence, from, to };
100
+ if (options.base !== undefined)
101
+ move.base = options.base;
102
+ if (options.head !== undefined)
103
+ move.head = options.head;
104
+ moves.push(move);
105
+ };
106
+ // 1. Equal body hash, unique on both sides.
107
+ const hashKey = (d) => `${d.kind}\u0000${d.body_hash}`;
108
+ const removedByHash = groupBy([...removed], hashKey);
109
+ const addedByHash = groupBy([...added], hashKey);
110
+ const hashPaired = new Set();
111
+ const small = [];
112
+ const ambiguous = [];
113
+ for (const [k, olds] of removedByHash) {
114
+ const news = addedByHash.get(k);
115
+ if (!news)
116
+ continue;
117
+ if (olds.length === 1 && news.length === 1) {
118
+ const [from] = olds;
119
+ const [to] = news;
120
+ if (from.token_count >= minTokens)
121
+ settle(from, to, 'body-hash');
122
+ else
123
+ small.push({ relation: relationOf(from, to), evidence: 'body-hash-small', from, to, similarity: 1, callers: 'unknown' });
124
+ hashPaired.add(from).add(to);
125
+ continue;
126
+ }
127
+ // Shared bodies (often trivial ones): every pairing is a candidate, up
128
+ // to a bound; later steps may still settle one of them.
129
+ if (olds.length * news.length > MAX_AMBIGUOUS)
130
+ continue;
131
+ for (const from of olds) {
132
+ for (const to of news) {
133
+ ambiguous.push({ relation: relationOf(from, to), evidence: 'body-hash-ambiguous', from, to, similarity: 1, callers: 'unknown' });
134
+ }
135
+ }
136
+ }
137
+ // 1b. Settled pairs carry their surroundings, to a fixpoint: a small
138
+ // equal-hash pair settles when a member of one settled into the other
139
+ // (a container's body is mostly member placeholders), and a declaration
140
+ // whose enclosing declaration settled follows it when the counterpart
141
+ // under the new parent has the same local name, kind, signature and body.
142
+ const declById = new Map();
143
+ for (const f of [...before, ...after])
144
+ for (const d of f.decls)
145
+ declById.set(d.id, d);
146
+ const local = (d) => {
147
+ const p = d.parent === null ? undefined : declById.get(d.parent);
148
+ return p && d.qualified_name.startsWith(p.qualified_name) ? d.qualified_name.slice(p.qualified_name.length) : d.qualified_name;
149
+ };
150
+ const addedByParent = groupBy([...added], d => d.parent ?? '');
151
+ for (let changed = true; changed;) {
152
+ changed = false;
153
+ const settledTo = new Map(moves.map(m => [m.from.id, m.to.id]));
154
+ for (const c of small) {
155
+ if (!removed.has(c.from) || !added.has(c.to))
156
+ continue;
157
+ if (moves.some(m => m.from.parent === c.from.id && m.to.parent === c.to.id)) {
158
+ settle(c.from, c.to, 'members');
159
+ changed = true;
160
+ }
161
+ }
162
+ for (const from of [...removed]) {
163
+ const newParent = from.parent === null ? undefined : settledTo.get(from.parent);
164
+ if (newParent === undefined)
165
+ continue;
166
+ const match = (addedByParent.get(newParent) ?? []).filter(to => added.has(to) && to.kind === from.kind && to.signature === from.signature
167
+ && to.body_hash === from.body_hash && local(to) === local(from));
168
+ if (match.length === 1) {
169
+ settle(from, match[0], 'enclosing');
170
+ changed = true;
171
+ }
172
+ }
173
+ }
174
+ // 2. Same kind and qualified name, new signature.
175
+ const stable = (d) => !d.flags.includes('unstable:duplicate');
176
+ const nameKey = (d) => `${d.kind}\u0000${d.qualified_name}`;
177
+ const removedByName = groupBy([...removed].filter(stable), nameKey);
178
+ const addedByName = groupBy([...added].filter(stable), nameKey);
179
+ for (const [k, olds] of removedByName) {
180
+ const news = addedByName.get(k);
181
+ if (olds.length === 1 && news?.length === 1 && !hashPaired.has(olds[0]) && !hashPaired.has(news[0])) {
182
+ settle(olds[0], news[0], 'qualified-name');
183
+ }
184
+ }
185
+ for (const c of [...small, ...ambiguous]) {
186
+ if (!removed.has(c.from) || !added.has(c.to))
187
+ continue;
188
+ candidates.push(c);
189
+ hashPaired.add(c.from).add(c.to);
190
+ }
191
+ // 3. Similar bodies (signal), over what steps 1 and 2 did not pair.
192
+ const mapped = new Map(moves.map(m => [m.from.id, m.to.id]));
193
+ const callerSet = (ids, map) => [...new Set(ids.map(id => (map ? mapped.get(id) ?? id : id)))].sort().join('\u0000');
194
+ for (const from of removed) {
195
+ if (hashPaired.has(from) || !from.body_tokens)
196
+ continue;
197
+ for (const to of added) {
198
+ if (hashPaired.has(to) || !to.body_tokens || to.kind !== from.kind)
199
+ continue;
200
+ const similarity = round4(bodySimilarity(from.body_tokens, to.body_tokens));
201
+ if (similarity < bar)
202
+ continue;
203
+ const cb = options.callersBefore?.get(from.id);
204
+ const ca = options.callersAfter?.get(to.id);
205
+ let callers = 'unknown';
206
+ if (cb && ca) {
207
+ if (callerSet(cb, true) !== callerSet(ca, false))
208
+ continue;
209
+ callers = 'equal';
210
+ }
211
+ candidates.push({ relation: relationOf(from, to), evidence: 'similar-body', from, to, similarity, callers });
212
+ }
213
+ }
214
+ moves.sort(byIds);
215
+ candidates.sort((a, b) => b.similarity - a.similarity || byIds(a, b));
216
+ return {
217
+ diff: { ...diff, removed: diff.removed.filter(d => removed.has(d)), added: diff.added.filter(d => added.has(d)) },
218
+ moves,
219
+ candidates,
220
+ };
221
+ }
222
+ //# sourceMappingURL=moves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moves.js","sourceRoot":"","sources":["../../src/stable-ids/moves.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `node` ids for `ids@0.1`: a body id plus a local index.
3
+ *
4
+ * Today's CFG blocks, DFG defs and uses and call sites carry sequential ids
5
+ * per file, so an edit anywhere shifts every id after it. Here each IR node
6
+ * is assigned to the innermost declaration whose span encloses it, and its
7
+ * index counts only the nodes of the same array inside that same body. An
8
+ * edit to one function therefore leaves every other function's node ids
9
+ * unchanged, and the index is safe because a body id names one body version.
10
+ */
11
+ import type { CFG, CallInfo, DFG } from '../types/index.js';
12
+ import type { StableDecl, StableIdFile, StableNodeIds } from './types.js';
13
+ /** The parts of a `CircleIR` that node ids key. */
14
+ export interface NodeIdSource {
15
+ cfg?: Pick<CFG, 'blocks'>;
16
+ dfg?: Pick<DFG, 'defs' | 'uses'>;
17
+ calls?: readonly CallInfo[];
18
+ }
19
+ /**
20
+ * The innermost declaration (with a body) enclosing a 1-based line and a
21
+ * 0-based column, or `null`.
22
+ */
23
+ export declare function declLocator(file: StableIdFile): (line: number, column?: number) => StableDecl | null;
24
+ /**
25
+ * Node ids parallel to the IR arrays: `<body_id>/b<n>` for CFG blocks,
26
+ * `/d<n>` and `/u<n>` for DFG defs and uses, `/c<n>` for call sites, where
27
+ * `n` counts that kind inside that body in array order. Positions are
28
+ * matched by line and, where the IR carries one, column; a CFG block goes to
29
+ * the innermost declaration that encloses all of its lines.
30
+ */
31
+ export declare function assignNodeIds(file: StableIdFile, ir: NodeIdSource): StableNodeIds;
32
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/stable-ids/nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1E,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1B,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC7B;AAmDD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,CAGpG;AAaD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,aAAa,CAQjF"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `node` ids for `ids@0.1`: a body id plus a local index.
3
+ *
4
+ * Today's CFG blocks, DFG defs and uses and call sites carry sequential ids
5
+ * per file, so an edit anywhere shifts every id after it. Here each IR node
6
+ * is assigned to the innermost declaration whose span encloses it, and its
7
+ * index counts only the nodes of the same array inside that same body. An
8
+ * edit to one function therefore leaves every other function's node ids
9
+ * unchanged, and the index is safe because a body id names one body version.
10
+ */
11
+ /** Position compare on (line, column); `column` absent means the whole line. */
12
+ function encloses(d, line, column) {
13
+ if (line < d.start_line || line > d.end_line)
14
+ return false;
15
+ if (column === undefined)
16
+ return true;
17
+ if (line === d.start_line && column < d.start_column)
18
+ return false;
19
+ if (line === d.end_line && column >= d.end_column)
20
+ return false;
21
+ return true;
22
+ }
23
+ /** Ranks spans so the innermost declaration wins; on a tie, the later one in source order. */
24
+ function spanSize(d) {
25
+ return (d.end_line - d.start_line) * 1_000_000 + (d.end_column - d.start_column);
26
+ }
27
+ class Locator {
28
+ spans;
29
+ constructor(file) {
30
+ this.spans = file.decls
31
+ .filter(d => d.body_hash !== '')
32
+ .map(decl => ({ decl, size: spanSize(decl) }));
33
+ }
34
+ /** Innermost declaration enclosing the position. */
35
+ at(line, column) {
36
+ let best = null;
37
+ for (const s of this.spans) {
38
+ if (!encloses(s.decl, line, column))
39
+ continue;
40
+ if (best === null || s.size <= best.size)
41
+ best = s;
42
+ }
43
+ return best?.decl ?? null;
44
+ }
45
+ /** Innermost declaration enclosing a whole line range. */
46
+ range(start, end) {
47
+ let best = null;
48
+ for (const s of this.spans) {
49
+ if (start < s.decl.start_line || end > s.decl.end_line)
50
+ continue;
51
+ if (best === null || s.size <= best.size)
52
+ best = s;
53
+ }
54
+ return best?.decl ?? null;
55
+ }
56
+ }
57
+ /**
58
+ * The innermost declaration (with a body) enclosing a 1-based line and a
59
+ * 0-based column, or `null`.
60
+ */
61
+ export function declLocator(file) {
62
+ const loc = new Locator(file);
63
+ return (line, column) => loc.at(line, column);
64
+ }
65
+ function keyAll(items, tag, find) {
66
+ const counters = new Map();
67
+ return items.map(item => {
68
+ const decl = find(item);
69
+ if (!decl)
70
+ return null;
71
+ const n = counters.get(decl.body_id) ?? 0;
72
+ counters.set(decl.body_id, n + 1);
73
+ return `${decl.body_id}/${tag}${n}`;
74
+ });
75
+ }
76
+ /**
77
+ * Node ids parallel to the IR arrays: `<body_id>/b<n>` for CFG blocks,
78
+ * `/d<n>` and `/u<n>` for DFG defs and uses, `/c<n>` for call sites, where
79
+ * `n` counts that kind inside that body in array order. Positions are
80
+ * matched by line and, where the IR carries one, column; a CFG block goes to
81
+ * the innermost declaration that encloses all of its lines.
82
+ */
83
+ export function assignNodeIds(file, ir) {
84
+ const loc = new Locator(file);
85
+ return {
86
+ cfg_blocks: keyAll(ir.cfg?.blocks ?? [], 'b', b => loc.range(b.start_line, b.end_line)),
87
+ dfg_defs: keyAll(ir.dfg?.defs ?? [], 'd', d => loc.at(d.line, d.column)),
88
+ dfg_uses: keyAll(ir.dfg?.uses ?? [], 'u', u => loc.at(u.line, u.column)),
89
+ calls: keyAll(ir.calls ?? [], 'c', c => loc.at(c.location.line, c.location.column)),
90
+ };
91
+ }
92
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/stable-ids/nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Body normalization for `ids@0.1`: the leaf tokens of a syntax subtree with
3
+ * whitespace, comments and formatting removed, identifiers and literals kept.
4
+ *
5
+ * Formatting a formatter may change and that cannot change meaning is
6
+ * dropped: statement-terminating `;`, a trailing `,` before a closing bracket,
7
+ * the quote style of a plain string, the parentheses around a lone untyped
8
+ * arrow-function parameter, and whitespace inside JSX text.
9
+ */
10
+ import type { Node } from '../core/parser.js';
11
+ export interface EmitOptions {
12
+ /** Subtrees left out entirely (by `node.id`). */
13
+ skip?: ReadonlySet<number>;
14
+ /** Subtrees replaced by one placeholder token (`''` drops the subtree). */
15
+ replace?: ReadonlyMap<number, string>;
16
+ /**
17
+ * Node types whose extent is marked with `⟨` … `⟩` — for grammars where
18
+ * indentation carries the structure (a Python `block`), which leaf tokens
19
+ * alone would lose.
20
+ */
21
+ wrap?: ReadonlySet<string>;
22
+ }
23
+ /** Named children, comments excluded. */
24
+ export declare function namedChildren(node: Node): Node[];
25
+ /** The normalized token stream of `nodes`, in order. */
26
+ export declare function bodyTokens(nodes: readonly Node[], opts?: EmitOptions): string[];
27
+ /** Concatenate tokens, keeping a space only where two words would fuse. */
28
+ export declare function joinTokens(parts: readonly string[]): string;
29
+ /**
30
+ * A type annotation serialized canonically: object-type members and the arms
31
+ * of a union or intersection are sorted, so `{b: string; a: number}` and
32
+ * `{a: number, b: string}` — or `A | B` and `B | A` — serialize the same.
33
+ */
34
+ export declare function canonicalType(node: Node): string;
35
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/stable-ids/normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;;;OAIG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC5B;AAqBD,yCAAyC;AACzC,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,CAOhD;AAmCD,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,EAAE,CAenF;AAKD,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQ3D;AASD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CA4ChD"}