Commit 16a1182
authored
test(bench): add JS/TS super.method() class-inheritance fixtures (#1325)
* feat(resolver): phase 8.4 — barrel file re-export chain resolution for call edges
The JS/WASM call-edge path (buildImportedNamesMap) was mapping imported
symbol names to the barrel file itself rather than the actual definition
file. For example, `Button` imported from `components/index.ts` (a barrel)
was mapped to `components/index.ts` instead of `components/Button.ts`,
so resolveCallTargets could not find the node and the call edge was dropped.
The native engine already traced through barrels correctly in
buildImportedNamesForNative. This PR mirrors that behavior in the WASM/JS
fallback path and caches results to avoid redundant DFS walks across files.
Changes:
- PipelineContext: add barrelExportCache (build-scoped Map keyed by
"barrelPath|symbolName") to avoid repeated traversal of the reexportMap
- resolve-imports: export resolveBarrelExportCached, a cache-aware wrapper
around resolveBarrelExport; reset cache at the start of each build run
- build-edges/buildImportedNamesMap: add barrel tracing via traceBarrel
helper — matches the logic already in buildImportedNamesForNative
- build-edges: replace all resolveBarrelExport calls with the cached variant
(emitTypeOnlySymbolEdges, buildBarrelEdges, buildImportedNamesForNative,
makeContextLookup) for consistency and performance
Also opens #1297 for the pre-existing WASM-only failure where barrel-through
import edges are not emitted on full builds.
* fix(resolver): remove unreachable ?? null after confirmed .has() check in resolveBarrelExportCached
* test(wasm): document #1297 guard in chained-barrel regression test
The "emits barrel-through edges on full build" assertion in this test
also guards #1297 (barrel-through import edges missing on WASM full
builds). The fix was delivered by the phase 8.4 changes to
buildBarrelEdges — switching to resolveBarrelExportCached which
initialises ctx.barrelExportCache before the edge-building pass.
Closes #1297
* feat(resolver): phase 8.5 — enhanced dynamic dispatch resolution (CHA + RTA)
Introduces Class Hierarchy Analysis (CHA) and Rapid Type Analysis (RTA) to
improve call-graph coverage for OOP codebases.
CHA: when a call targets an interface or abstract method (e.g. worker.doWork()
where worker: IWorker), emit additional call edges to all known concrete
implementations reachable via the class/interface hierarchy.
RTA filter: CHA targets are narrowed to types actually instantiated in the
program via new X() — prevents dead/test-only implementations from inflating
the dispatch fan-out.
this/self/super dispatch: inside a method body, this.method() now resolves
through the class's own method table and parent hierarchy via qualified-name
lookup (e.g. ClassName.method), rather than relying solely on global name
matching which may miss inherited or ambiguous methods.
Implementation:
- src/domain/graph/builder/cha.ts (new): ChaContext, buildChaContext,
resolveThisDispatch, resolveChaTargets
- ExtractorOutput.newExpressions: dedicated RTA instantiation list extracted
from all new X() expressions in JS/TS files (not just assigned ones)
- WASM path: CHA dispatch runs inline in buildFileCallEdges
- Native path: DB-based CHA expansion post-pass in tryNativeOrchestrator
(interface dispatch only; this/super dispatch is a known gap for native)
- build-edges.ts: buildChaPostPass wired for native FFI path (fallback mode)
Test: tests/integration/phase-8.5-cha-dispatch.test.ts covers CHA dispatch,
RTA filter, this-dispatch (wasm only), and super-dispatch (wasm only) across
the cha-dispatch fixture with IWorker/ConcreteWorker/MockWorker/GhostWorker.
* fix(resolver): document Phase 8.2 side-effect and strengthen barrel test assertion (#1302)
- Add caller_file check to the barrel call resolution test assertion to
future-proof it against fixture growth (greptile review)
- Add comment in propagateReturnTypesAcrossFiles documenting the Phase 8.4
barrel-tracing side-effect on cross-file return-type propagation
* fix(cha): propagate newExpressions through WASM worker serialization for C# RTA (#1302)
C# extractor never populated newExpressions, so WASM CHA had no RTA seed for
C# instantiated types. Additionally, newExpressions was stripped during worker
thread serialization (SerializedExtractorOutput lacked the field, and neither
serializeExtractorOutput nor deserializeResult handled it).
- csharp.ts: populate newExpressions in extractCSharpSymbols and push type
names in handleCsObjectCreation
- wasm-worker-protocol.ts: add newExpressions field to SerializedExtractorOutput
- wasm-worker-entry.ts: include newExpressions in serializeExtractorOutput
- wasm-worker-pool.ts: restore newExpressions in deserializeResult
* fix(parity): re-classify roles after CHA post-pass for native engine (#1302)
The Rust orchestrator classifies roles as part of its internal pipeline, before
the JS runPostNativeCha post-pass adds CHA call edges. Implementor methods
(e.g. UserRepository.Save) had no incoming edges at classification time and
were tagged dead-ffi, diverging from the WASM engine which classifies roles
after all edges (including CHA) are inserted.
runPostNativeCha now returns the Set of target node IDs for newly inserted
edges. tryNativeOrchestrator uses this set to query the affected files and
re-runs classifyNodeRoles (incremental) on those files only, bringing native
and WASM role results into alignment.
* fix(cha): add debug log + transaction wrapper to runPostNativeCha (#1302)
* fix(bench): add CHA-expanded C# edges to expected-edges manifest (#1302)
Phase 8.5 CHA+RTA correctly expands IRepository interface dispatch to
UserRepository concrete implementations (UserRepository.FindById,
UserRepository.Save, UserRepository.Delete). These are genuine runtime
dispatch edges — the manifest was incomplete, not the resolver wrong.
Adding them restores C# precision to 100% and improves recall 52.6%→60.9%.
* fix(cha): extend RTA query to non-class nodes, skip filter without evidence (#1302)
When the native engine records constructor calls against `constructor`-kind or `function`-kind nodes
instead of `class`-kind nodes, the `instantiated` set was always empty and runPostNativeCha returned
early — silently skipping all CHA interface dispatch. Fix adds a fallback query for those node
kinds, and when no constructor-call evidence exists at all, proceeds without the RTA filter so
interface dispatch still expands correctly.
* docs(bench): jelly vs codegraph call resolution comparison on JS/TS fixtures (#1301)
Run Jelly 0.13.0 on the JavaScript and TypeScript hand-annotated fixture
projects and compare its precision/recall against codegraph's on the same
expected-edges.json ground truth.
Key findings:
- JS: codegraph 100%/83% P/R vs Jelly 94%/94% — Jelly resolves receiver-typed
calls through constructor-assigned properties (this.prop = new Foo()); codegraph does not yet
- TS: codegraph 100%/72% P/R vs Jelly 100%/56% — codegraph leads on callbacks
and barrel re-exports; Jelly leads on interface dispatch (5/5 vs 0/5)
- TS interface-dispatched gap is the highest-priority recall improvement
(codegraph's CHA post-pass not yet wired for TypeScript)
- Java: no suitable Java call graph tool runs on raw .java source without compilation;
documents javacg-static as the recommended tool once a build step is added
Adds:
- docs/benchmarks/RESOLUTION-COMPARISON.md — full comparison with per-mode breakdown
- scripts/compare-jelly.mjs — runs Jelly on a fixture dir and computes P/R vs ground truth
* Revert "research(bench): Jelly vs codegraph call resolution comparison on JS/TS fixtures (#1301)"
This reverts commit cbaa4a2.
* feat(stats): by_technique breakdown in codegraph stats (Phase 8.6 follow-up) (#1303)
* feat(resolver): phase 8.3d — object property write tracking in points-to analysis
Walk assignment_expression nodes in extractTypeMapWalk (WASM) and
match_js_type_map (native). When LHS is a simple member_expression
(obj.prop) and RHS is an identifier, seed typeMap['obj.prop'] = { type:
fn, confidence: 0.85 }. This covers patterns like:
handlers.auth = authMiddleware;
router.use(handlers.auth); // -> edge: caller -> authMiddleware
Extend resolveByMethodOrGlobal (TS) and resolve_call_targets (Rust) with
a composite key lookup (step 4.5): when a call has receiver + name, check
typeMap['receiver.name'] for a direct pts target before falling through to
the no-match return. Skips BUILTIN_GLOBALS / builtin objects (console,
Math, etc.) and chained writes (a.b.c = x).
Closes #1292
* fix(extractor): add process/window/document/globalThis to BUILTIN_GLOBALS (#1295)
Adds the four names present in Rust's is_js_builtin_global but absent
from the TypeScript BUILTIN_GLOBALS set, restoring dual-engine parity
for property-write pts tracking. Also adds prop.type guard in
handlePropWriteTypeMap consistent with the adjacent fnRefBindings block.
* test(extractor): fix misleading test name and add higher-confidence promotion test (#1295)
Renames 'higher-confidence entry wins' to accurately describe equal-confidence
first-write behavior. Removes stale inner comment. Adds explicit test for
strict-higher-confidence promotion via setTypeMapEntry. Extends BUILTIN_GLOBALS
test to cover process/window/document/globalThis.
* fix(resolver): fall through on empty pts results in step 4.5 TS path (#1295)
* fix(extractor): sync is_js_builtin_global with full TS BUILTIN_GLOBALS set (#1295)
* feat(stats): by_technique breakdown in codegraph stats (Phase 8.6 follow-up)
Closes #1300
- DB migration v17: adds `technique TEXT` column + index to `edges` table
- Tags call edges at insertion: `ts-native` for direct/native-path calls,
`points-to` for pts post-pass and pts-fallback edges; non-call edges get NULL
- Upgrades pts edges to `ts-native` in-place when a direct call supersedes them
- Native bulkInsertEdges path: technique is backfilled via a post-insert SQL UPDATE
(pts edges targeted first; remaining NULL calls tagged ts-native as baseline)
- Preserves technique through incremental-build reverse-dep edge reconnection
- `computeQualityMetrics` / `buildStatsFromNative` expose `byTechnique` in
`callerCoverage`; the JSON output and `printQuality` display it when present
docs check acknowledged
Impact: 20 functions changed, 23 affected
* fix(stats): scope technique UPDATE to batch source IDs; honour testFilter (#1303)
- applyEdgeTechniquesAfterNativeInsert: scope the catch-all 'ts-native' UPDATE
to source_ids in the current batch — prevents mis-tagging pre-migration
NULL-technique edges from unchanged files on the first incremental build
after a v16->v17 migration
- countCallEdgesByTechnique: accept testFilter (JOIN on source node) so
byTechnique counts are consistent with --no-tests
- buildStatsFromNative: thread noTests into countCallEdgesByTechnique
* fix(builder): backfill technique column after native orchestrator (#1303)
The Rust orchestrator writes edges without the technique column. Add a
post-orchestrator step that tags all new 'calls' edges as 'ts-native':
full builds use a global UPDATE, incremental builds scope to changed-file
source nodes to avoid overwriting existing technique values.
* test(pts): assert technique column on property-write pts edges (#1303)
- readCallEdges: SELECT e.technique in addition to existing columns
- readEngine: read build_meta engine to detect native vs WASM path
- Assertions check technique is 'ts-native' (native orchestrator) or
'points-to' (JS path), confirming the technique backfill is working
* fix(stats): guard quiet incremental in backfillEdgeTechniques (#1303)
Quiet incremental builds (no files changed) insert no new edges — running
the global UPDATE would mis-tag pre-migration NULL-technique edges from
unchanged files as 'ts-native'. Return early when changedFiles is defined
but empty.
* fix(cha): add missing technique field to CHA dispatch EdgeRowTuple pushes
The merge commit ad3fb07 added the 6th technique field to EdgeRowTuple but
missed updating two CHA dispatch pushes in buildChaPostPass (line 691) and
buildFileCallEdges (line 1024). Both are now tagged with 'cha' to identify
the dispatch mechanism consistently with other technique-labeled edges.
* fix(cha): correct inaccurate cycle guard comment in resolveThisDispatch
The comment said 'cap at 20' but no numeric limit exists — only the
visited set guards against cycles. Replace with accurate description.
* fix(cha): scope existingPairs dedup and compute file-pair-aware confidence in runPostNativeCha
Two improvements to the native orchestrator CHA post-pass:
1. existingPairs full-scan replaced with scoped query: instead of loading
every calls edge in the DB, seed the seen-pairs Set from only the
source_ids present in callToMethods. This avoids O(all-edges) memory
usage on large codebases.
2. Hardcoded confidence 0.8 replaced with file-pair-aware formula matching
the WASM path: computeConfidence(callerFile, targetFile, null) - 0.1.
The callToMethods query now joins src nodes to get caller_file; the
findMethodStmt returns method_file so both sides are available.
* feat(cha): transitive multi-level class hierarchy expansion in CHA dispatch
Two separate gaps prevented abstract-class hierarchies from working in CHA:
1. `resolveChaTargets` (cha.ts) and `runPostNativeCha` (native-orchestrator.ts)
both did a single-level `implementors.get(typeName)` lookup. For a hierarchy
like IJob → AbstractJob (non-instantiated) → PrintJob/ScanJob the expansion
returned nothing because AbstractJob was skipped by the RTA filter and
PrintJob/ScanJob were never visited. Fixed by replacing the single-level
lookup with a BFS traversal that traverses all nodes regardless of RTA
admission, emitting edges only for instantiated leaf types.
2. `abstract class X implements Y` uses the node type `abstract_class_declaration`
in tree-sitter-typescript — a distinct node from `class_declaration`. Neither
the WASM extractor (JS walk-path, query patterns) nor the Rust extractor
handled this node type, so `implements`/`extends` relations on abstract classes
were silently dropped and the implementors map was empty for any interface
whose only direct implementor was an abstract class. Fixed in:
- src/extractors/javascript.ts (walk switch, kindMaps, JS_CLASS_TYPES,
extractReturnTypeMapWalk)
- src/domain/parser.ts + wasm-worker-entry.ts (added query pattern)
- crates/codegraph-core/src/extractors/javascript.rs (match_js_node,
handle_export_declaration, JS_CLASS_KINDS)
Closes #1311
* fix(cha): drop zero-confidence edges and scope seenByPair to calls in CHA post-passes (#1302)
Two parity gaps between the native-orchestrator and WASM/FFI CHA paths:
1. runPostNativeCha used Math.max(0, conf - 0.1) which still pushed
zero-confidence edges. buildFileCallEdges and buildChaPostPass both
guard with `if (conf > 0)` to skip them entirely. Switch to the
same guard to match.
2. buildChaPostPass seeded seenByPair from all allEdgeRows including
import/extends/implements edges. If a file-level call shares a
(source_id, target_id) pair with a pre-existing import edge the CHA
call edge would be silently suppressed. Restrict seeding to rows
where row[2] === 'calls', matching buildParamFlowPtsPostPass intent.
* fix(cha): chunk IN-clause params in applyEdgeTechniques and backfillEdgeTechniques (#1302)
Both applyEdgeTechniquesAfterNativeInsert (build-edges.ts) and
backfillEdgeTechniquesAfterNativeOrchestrator (native-orchestrator.ts)
built unbounded IN-clause placeholders from sourceIds / changedFiles
and spread them as variadic SQLite args. On codebases with > 999
distinct callers or changed files, SQLite threw "too many SQL variables".
Fix: iterate in CHUNK_SIZE=500 batches (same pattern used elsewhere)
and wrap in a transaction for atomicity.
* test(cha): skip transitive CHA native tests until Rust binary updated (#1302)
The transitive multi-level CHA tests (IJob → AbstractJob → PrintJob/ScanJob)
rely on the Rust extractor emitting implements/extends edges for
abstract_class_declaration nodes. The pre-compiled native binary (v3.11.2)
predates that fix, so mark those tests with skipIf(engine === 'native')
until the binary is rebuilt — matching the same pattern used for
this-dispatch and super-dispatch.
Also add 429 rate-limit guard to embedding-regression.test.ts: catch
HuggingFace 429 errors in beforeAll and skip individual tests gracefully
rather than failing the whole suite when the model download is throttled.
* fix(cha): tag runPostNativeCha edges with technique='cha' (#1302)
The newEdges tuple in runPostNativeCha was typed as 5 elements, so
batchInsertEdges wrote technique=NULL. backfillEdgeTechniquesAfterNativeOrchestrator
then overwrote those NULLs with 'ts-native', mislabelling all CHA-expanded
edges from the native orchestrator path. Fix extends the tuple to 6 elements
with 'cha' at index 5, matching buildChaPostPass and buildFileCallEdges.
* fix(cha): guard CHA dedup against ptsEdgeRows to prevent duplicate edges (#1302)
The CHA expansion loop in buildFileCallEdges checked seenCallEdges
but not ptsEdgeRows, so a pts-alias edge and a CHA-expanded edge for
the same (caller.id, target.id) pair could both be written to allEdgeRows.
batchInsertEdges uses plain INSERT INTO (no OR IGNORE), so both rows
would persist and inflate the target's fan-in count, skewing role
classification and dead-code detection. Add !ptsEdgeRows.has(edgeKey)
to the guard, matching the pattern used in the pts expansion loop.
* test(bench): add JS/TS super.method() class-inheritance fixtures (#1315)
Add resolution benchmark fixtures that verify super.method() dispatch
through the class hierarchy in both JavaScript and TypeScript.
JavaScript fixture covers:
- Instance super.method() (Dog.speak → Animal.speak, 2-level)
- Multi-level super.method() (Puppy.speak → Dog.speak, stops at nearest parent)
- Static super.method() (DoubleCounter.count → Counter.count)
TypeScript fixture covers:
- Multi-level super.method() chain (PrefixLogger.log → TimestampLogger.log → Logger.log)
All edges resolve correctly via the CHA resolveThisDispatch path
(Phase 8.5) and are annotated with mode class-inheritance.
* fix(cha): export CHA_DISPATCH_PENALTY and consume it in native-orchestrator (#1325)
The constant was defined but not exported, causing native-orchestrator.ts
to duplicate the magic number 0.1 inline. If tuned in one place the other
would silently diverge, producing different confidence values between the
WASM and native paths for the same CHA edge.
* test: replace skipIf/silent-pass patterns with todo and ctx.skip (#1325)
- Convert it.skipIf(engine === 'native') for this/super/transitive CHA
gaps to it.todo() with issue #1326 reference so the native accuracy
gap is tracked as pending work, not silently hidden
- Replace if (rateLimited) return in embedding-regression tests with
ctx.skip() so rate-limited runs show as skipped in Vitest output
instead of green passes
* feat(resolver): resolve prototype-based method calls (#1317)
Three patterns now resolved for pre-ES6 OOP:
- `Foo.prototype.bar = function(){}` → emits Foo.bar as a method definition
- `Foo.prototype.bar = identifier` → seeds typeMap['Foo.bar'] for alias dispatch
- `Foo.prototype = { bar: fn }` → emits definitions per property
Extractor: new extractPrototypeMethodsWalk pass, called from both the
query path and manual-walk path in the JS extractor.
Resolver: resolveByMethodOrGlobal gains two new fallbacks:
- Inline new-expression receivers: extracts the class name from `new Foo()`
when typeMap has no entry for the raw receiver text
- Prototype alias lookup: after a symbol-DB miss for TypeName.method,
checks typeMap['TypeName.method'] for identifier-aliased methods
Adds prototypes.js and prototypes2.js benchmark fixtures; JavaScript
benchmark stays at 100% precision / 100% recall. Filed #1327 for
native Rust engine parity.
Closes #1317
* fix(test): retry rmSync with backoff on Windows EBUSY in embedding-regression afterAll (#1325)1 parent 34988f8 commit 16a1182
12 files changed
Lines changed: 411 additions & 65 deletions
File tree
- src
- domain/graph/builder
- stages
- extractors
- tests
- benchmarks/resolution/fixtures
- javascript
- typescript
- integration
- search
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
73 | 73 | | |
74 | 74 | | |
75 | 75 | | |
76 | | - | |
| 76 | + | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
81 | 90 | | |
82 | 91 | | |
83 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
84 | 108 | | |
| 109 | + | |
85 | 110 | | |
86 | 111 | | |
87 | 112 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
81 | | - | |
| 81 | + | |
82 | 82 | | |
83 | 83 | | |
84 | 84 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| 55 | + | |
55 | 56 | | |
56 | 57 | | |
57 | 58 | | |
| |||
467 | 468 | | |
468 | 469 | | |
469 | 470 | | |
470 | | - | |
| 471 | + | |
471 | 472 | | |
472 | 473 | | |
473 | 474 | | |
| |||
534 | 535 | | |
535 | 536 | | |
536 | 537 | | |
537 | | - | |
| 538 | + | |
538 | 539 | | |
539 | 540 | | |
540 | | - | |
| 541 | + | |
| 542 | + | |
541 | 543 | | |
542 | 544 | | |
543 | 545 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
345 | 345 | | |
346 | 346 | | |
347 | 347 | | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
348 | 351 | | |
349 | 352 | | |
350 | 353 | | |
| |||
476 | 479 | | |
477 | 480 | | |
478 | 481 | | |
479 | | - | |
| 482 | + | |
480 | 483 | | |
481 | 484 | | |
482 | 485 | | |
| |||
612 | 615 | | |
613 | 616 | | |
614 | 617 | | |
| 618 | + | |
| 619 | + | |
615 | 620 | | |
616 | 621 | | |
617 | 622 | | |
| |||
1162 | 1167 | | |
1163 | 1168 | | |
1164 | 1169 | | |
1165 | | - | |
| 1170 | + | |
1166 | 1171 | | |
1167 | 1172 | | |
1168 | 1173 | | |
| |||
1275 | 1280 | | |
1276 | 1281 | | |
1277 | 1282 | | |
1278 | | - | |
| 1283 | + | |
1279 | 1284 | | |
1280 | 1285 | | |
1281 | 1286 | | |
| |||
1442 | 1447 | | |
1443 | 1448 | | |
1444 | 1449 | | |
1445 | | - | |
| 1450 | + | |
1446 | 1451 | | |
1447 | 1452 | | |
1448 | 1453 | | |
| |||
1531 | 1536 | | |
1532 | 1537 | | |
1533 | 1538 | | |
1534 | | - | |
| 1539 | + | |
1535 | 1540 | | |
1536 | 1541 | | |
1537 | 1542 | | |
| |||
1924 | 1929 | | |
1925 | 1930 | | |
1926 | 1931 | | |
1927 | | - | |
| 1932 | + | |
1928 | 1933 | | |
1929 | 1934 | | |
1930 | 1935 | | |
| |||
2035 | 2040 | | |
2036 | 2041 | | |
2037 | 2042 | | |
2038 | | - | |
| 2043 | + | |
2039 | 2044 | | |
2040 | 2045 | | |
2041 | 2046 | | |
| |||
2078 | 2083 | | |
2079 | 2084 | | |
2080 | 2085 | | |
| 2086 | + | |
| 2087 | + | |
| 2088 | + | |
| 2089 | + | |
| 2090 | + | |
| 2091 | + | |
| 2092 | + | |
| 2093 | + | |
| 2094 | + | |
| 2095 | + | |
| 2096 | + | |
| 2097 | + | |
| 2098 | + | |
| 2099 | + | |
| 2100 | + | |
| 2101 | + | |
| 2102 | + | |
| 2103 | + | |
| 2104 | + | |
| 2105 | + | |
| 2106 | + | |
| 2107 | + | |
| 2108 | + | |
| 2109 | + | |
| 2110 | + | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + | |
| 2114 | + | |
| 2115 | + | |
| 2116 | + | |
| 2117 | + | |
| 2118 | + | |
| 2119 | + | |
| 2120 | + | |
| 2121 | + | |
| 2122 | + | |
| 2123 | + | |
| 2124 | + | |
| 2125 | + | |
| 2126 | + | |
| 2127 | + | |
| 2128 | + | |
| 2129 | + | |
| 2130 | + | |
| 2131 | + | |
| 2132 | + | |
| 2133 | + | |
| 2134 | + | |
| 2135 | + | |
| 2136 | + | |
| 2137 | + | |
| 2138 | + | |
| 2139 | + | |
| 2140 | + | |
| 2141 | + | |
| 2142 | + | |
| 2143 | + | |
| 2144 | + | |
| 2145 | + | |
| 2146 | + | |
| 2147 | + | |
| 2148 | + | |
| 2149 | + | |
| 2150 | + | |
| 2151 | + | |
| 2152 | + | |
| 2153 | + | |
| 2154 | + | |
| 2155 | + | |
| 2156 | + | |
| 2157 | + | |
| 2158 | + | |
| 2159 | + | |
| 2160 | + | |
| 2161 | + | |
| 2162 | + | |
| 2163 | + | |
| 2164 | + | |
| 2165 | + | |
| 2166 | + | |
| 2167 | + | |
| 2168 | + | |
| 2169 | + | |
| 2170 | + | |
| 2171 | + | |
| 2172 | + | |
| 2173 | + | |
| 2174 | + | |
| 2175 | + | |
| 2176 | + | |
| 2177 | + | |
| 2178 | + | |
| 2179 | + | |
| 2180 | + | |
| 2181 | + | |
| 2182 | + | |
| 2183 | + | |
| 2184 | + | |
| 2185 | + | |
| 2186 | + | |
| 2187 | + | |
| 2188 | + | |
| 2189 | + | |
| 2190 | + | |
| 2191 | + | |
| 2192 | + | |
| 2193 | + | |
| 2194 | + | |
| 2195 | + | |
| 2196 | + | |
| 2197 | + | |
| 2198 | + | |
| 2199 | + | |
| 2200 | + | |
| 2201 | + | |
| 2202 | + | |
| 2203 | + | |
| 2204 | + | |
| 2205 | + | |
| 2206 | + | |
| 2207 | + | |
| 2208 | + | |
| 2209 | + | |
| 2210 | + | |
| 2211 | + | |
| 2212 | + | |
| 2213 | + | |
| 2214 | + | |
| 2215 | + | |
| 2216 | + | |
| 2217 | + | |
| 2218 | + | |
| 2219 | + | |
| 2220 | + | |
| 2221 | + | |
| 2222 | + | |
| 2223 | + | |
| 2224 | + | |
| 2225 | + | |
| 2226 | + | |
| 2227 | + | |
| 2228 | + | |
| 2229 | + | |
| 2230 | + | |
| 2231 | + | |
| 2232 | + | |
| 2233 | + | |
| 2234 | + | |
Lines changed: 49 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
131 | 180 | | |
132 | 181 | | |
133 | 182 | | |
0 commit comments