Repository navigation
Commit d0f7eb5
Part of #23050
Clause-②: no
Slice 6 of the `rest-server.ts` split, by slice 1's pattern (landed note
`6136102437`, steps 1–6), slice 2's getter refinement (`6189011700`) and
slices 3–5's shape (PR #23670, PR #23705's two registrars in one module,
PR #23719): the bodies of `RestServer#registerSecurityExplainEndpoints`
(`GET` / `POST {basePath}/security/explain`, `GET
{basePath}/security/my-delegable-scope`) and
`RestServer#registerSecurityEndpoints` (`GET
{basePath}/security/suggested-bindings` and its `/:id/confirm` and
`/:id/dismiss`) move, unedited, to ONE new module,
`packages/rest/src/security-routes.ts`. It is move-only: routes, the
ordered registrations, every handler, the published `dist/*.d.ts` and
both bundles' export lists are byte-identical, and every reader whose
reading included a moved line now reads it where it is, with its sum
unchanged.
`rest-server.ts` goes from 11,042 to 10,636 lines (base `a515abdd8c`).
The card stays open for the later slices.
## The pattern, applied
**Members the moved bodies read**, from an AST walk of each method
(TypeScript compiler API, base `a515abdd8c`):
`registerSecurityExplainEndpoints` (JSDoc `:10282`, method
`:10308`-`:10601`, body `:10309`-`:10600`) and
`registerSecurityEndpoints` (JSDoc `:10662`, method `:10694`-`:10838`,
body `:10695`-`:10837`).
| kind | member | reads (explain / suggested-binding) | class
declaration |
|---|---|---|---|
| field | `routeManager` | 3 / 3, the `register` calls | `:2010`,
private |
| field | `kernelManager` | 2 / 0, inside the explain family's
`resolveService` | `:2019`, private, not `readonly` |
| field | `securityServiceProvider` | 2 / 2, inside each family's
`resolveService` | `:2089`, private, not `readonly` |
| method | `resolveRequestEnvironmentId` | 1 / 0 | `:2306`, private |
| method | `resolveExecCtx` | 2 / 3 | `:2856`, private |
| method | `enforceAuth` | 2 / 3 | `:2456`, private |
Neither body has a bare `this`, an element access on `this`, or a
`this`-rebinding `function`. Their module-level reads:
- **Imports still used elsewhere in `rest-server.ts`** (AST count
outside both methods): `logError` (12), `sendError as sendEnvelopeError`
(4) and `refuseRepeatedQueryParams` (15). They stay there; the module
imports the same names from the same modules. Its `sendError` import
carries a comment pointing at the dialect note on `rest-server.ts`'s
import, which the explain family's emitter docblock names.
- **Imports ONLY these bodies read** (zero uses outside the two
methods): `ErrorCode` (type, `@objectstack/spec/api`, with its `[#8073]`
comment), `standardErrorCodeForHttpStatus` (`@objectstack/spec/api`,
`[#11683]`), `classifiedRefusalAnswer`, `nestedRefusalEnvelope`,
`sandboxFaultAnswer` (`./error-response.js`), and
`isAudienceBindingSuggestionStatus` with
`unknownAudienceBindingSuggestionStatusMessage` (`@objectstack/core`,
`[#7678]`). They moved with the bodies, as slices 3 and 5 moved theirs,
and each left a pointer comment. Leaving them would fail
`noUnusedLocals`. The `[#8073]` and `[#7678]` comments moved verbatim.
The `[#11683]` comment pointed at `registerSharingEndpoints` as its use,
so in the module it names the explain family's classified-refusal arm,
the use it has there.
- **Nothing declared in `rest-server.ts` is read**, so no `export` was
added anywhere. The explain body's dynamic
`import('@objectstack/spec/security')` moved inside it.
**Host shape (slice 1's shape B, twice, as slice 4):** one host
interface per registrar, `SecurityExplainRouteHost` and
`SecurityRouteHost`. Each lists exactly the members its body reads,
typed `RestServer['m']`. The class keeps both private methods with their
names, docblocks and positions. Each body is now a host literal plus
`.call(host, basePath)`. Methods go as late-bound closures, `(...a) =>
this.m(...a)`. The call sites in `registerRoutes` (`:4812`-`:4813` at
base) are unchanged.
**Fields, checked one by one:**
| field | read when | reassigned after registration? | handed over as |
|---|---|---|---|
| `routeManager` | registration only (six `register` calls, top-level
statements of the two bodies) | its one swap (`:5719` / `:5723`) wraps
`registerMetadataEndpointsInner`, not these registrars | value |
| `kernelManager` | **request time** (the explain family's
`resolveService`) | not by the class (constructor only), but not
`readonly` | **getter** |
| `securityServiceProvider` | **request time** (each family's
`resolveService`) | not by the class (constructor only), but not
`readonly` | **getter**, in both host literals |
The getters are measured, not argued. A one-off vitest file (copied in,
run, deleted) boots a source `RestServer`, drives the door, assigns the
field on the instance AFTER `registerRoutes()`, and drives it again:
- this head (`96504dab66`): `securityServiceProvider` on the explain
family (`GET /api/v1/security/my-delegable-scope`) reads `501
NOT_IMPLEMENTED`, then `200 {"businessUnits":["bu_1"],"positions":[]}`.
On the suggested-binding family (`GET
/api/v1/security/suggested-bindings`) it reads `501 NOT_IMPLEMENTED`,
then `200 {"data":[{"id":"sug_1"}]}`. `kernelManager` on the scoped
explain door (`environmentId: env_1`) reads `501`, then `200
{"env":"env_1"}`. `Tests 3 passed (3)`.
- by-value ablations through `scripts/ablation-replace.mjs`, each getter
in turn replaced by `X: this.X,` with a two-line anchor that names its
host literal. Each landed: anchor 1 → 0, replacement 0 → 1, blob
`4867a14302` → `5c7ebad6df` / `48f2660f00` / `f3c9b53365`. In each run
the ablated door reads `501` then `501` (frozen at registration) while
the other two still read `200` (`Tests 1 failed | 2 passed (3)`, each
run). Restored by the tool and a trap: blob `4867a14302` equals `HEAD`,
`git diff HEAD` empty, the one-off file deleted. The path is source
(relative import), so no `dist` leg applies.
**Mechanism hypotheses from the dispatch, measured:**
- (a) **Confirmed.** The explain family resolves the security service at
request time through its `resolveService`. That reads TWO fields: the
environment kernel's `security` service via `kernelManager` first, then
`securityServiceProvider` as the fallback. Naming a principal other than
the caller is the service's question (`explainAccessForCaller`); the
door hands it the parsed request and the caller's context and reads no
further provider field. Both fields go as getters. The suggested-binding
family reads `securityServiceProvider` only, also a getter, measured
separately.
- (b) **Confirmed.** `registerSecurityEndpoints` builds its paths from
`const dataPath = basePath;`, so the suggested-binding doors answer at
`{basePath}/security/suggested-bindings`, not under `/data` (slice 4's
share family appended `crud.dataPrefix`; this one does not). Every path
expression moved unedited, and the route dumps below are identical.
- (c) **Confirmed.** The bodies, and the `[#7678]` import comment that
moved with them, carry 10 `ADR-NNNN Dk` citations: ADR-0090 D5 ×2, D6 ×2
and D12 ×2, ADR-0105 D8 ×2, and ADR-0112 D5 ×2. They left the anchored
`rest-server.ts`, so `check-adr-anchors` read 1761 decision-letter
citations at base and 1751 at the move-only commit `d6fc91a97d`, **green
both times**. That is the silent narrowing the card forbids. A new
anchor (below) restores 1761 at head.
## The registrar list
`packages/rest/src/rest-server-registrar-files.ts` gains
`security-routes.ts` with a `[#23050 slice 6]` comment (length 6 → 7).
Every reader that pins its length re-reads its number, and every sum is
unchanged:
| reader | sum over the list | change |
|---|---|---|
| `rest-server-query-number-census.test.ts` | 9 = 8 + 1 + 0 + 0 + 0 + 0
+ 0 | length 6 → 7 |
| `rest-server-canonical-query-ast.test.ts` | 4 = 1 + 3 + 0 + 0 + 0 + 0
+ 0 `query:` slots | floor `security-routes.ts: 0`, length 6 → 7 |
| `meta-draft-read-door-census.test.ts` | 8 = 6 + 0 + 0 + 0 + 0 + 2 + 0
| the two bodies read no draft; length 6 → 7 |
| `rest-server-docblock-position.test.ts` | floors 4 + 3 + 3 + 8 + 3 + 8
= 29 | floor `security-routes.ts: 8`: header, two host interfaces, two
functions, and the three blocks that moved with the bodies (the explain
family's `respondError` and `delegableHandler` blocks, the
suggested-binding family's `respondError` block). `rest-server.ts` 167 →
164 blocks, floor 100; length 6 → 7 |
| `execctx-consumer-census.test.ts` | 62 sites = 27 + 9 + 5 + 7 + 8 + 1
+ 5 | mentions 101 → 109 (the seam twice: two forwarders ×2, two
interface members ×2); forwarders 8 = (7 − 1) + `EXTRA_MOVED_REGISTRARS`
2, the map gaining `security-routes.ts: 1` beside `sharing-routes.ts:
1`, as slice 4 counted two registrars in one module |
| `ui-view-route-identity.measurement.test.ts` /
`ui-view-route-tenancy.measurement.test.ts` | `this.enforceAuth(` 55,
`this.resolveExecCtx(` 70 over the list (53 / 68 before, +1 each per new
forwarder); ownership guard 1 | length 6 → 7 |
| dogfood `authz-conformance.test.ts` (realtime tripwires) | 0 hits over
the seven files | length 6 → 7 |
| dogfood `authz-probe-blind-spot.census.ts`, `rest-server.ts` row | 70
/ 19 / 51 unchanged; `this.routeManager.register(` 63 = 27 + 9 + 5 + 7 +
8 + 1 + 6; `private register*Endpoints(` 16 | new control
`security-routes.ts: this.routeManager.register(` 6; `registrar list
length` 7; `enforceAuth` 84 → 92 re-anchored (five call sites moved and
are counted in both readings; the eight new occurrences are the seam
twice; no call site added); `populationRule` names the new module |
Each number above was also counted statically on the tree (`grep -oF`
per file).
## Proof of move-only
- **`.d.ts`:** `packages/rest/dist/index.d.ts` and `index.d.cts` built
at base `a515abdd8c` (this worktree, before any edit), at `96504dab66`
and at the merge head `a12cdcf4e4` are byte-identical: sha256
`7489de84bc6feccb7cb1f28bcbe4a97775324959c61c9bfc35e8a8c45a6f3bc9` for
all six files, `cmp` silent. The head bundles carry a head-only marker
(`readSecurityServiceProvider`, 4 hits in each of `index.js` and
`index.cjs`), so the declaration was rebuilt from the moved source, not
replayed. `SecurityExplainRouteHost`, `SecurityRouteHost` and
`security-routes` appear 0 times in the `.d.ts`; `src/index.ts` is
untouched.
- **Export lists:** the base and head ESM and CJS bundles each load with
39 exports and one sorted export-name list (sha256 `b3246be6a171…` on
all four), and none of the two functions or two host types is among
them.
- **Routes:** a source `RestServer` on a recording mock server, with a
protocol that answers every member, dumped under four configs at base
and at head: `getRoutes()` (functions as arity), the ordered server
registration calls, and a whitespace-free sha256 of every handler's
source. **12 dumps of 12 are byte-identical**, at `96504dab66` and again
at the merge head. default: routes `6931d1a5d182…`, calls
`ccb3bd12f10b…`, handlers `6d4926ef1465…` (75 routes, 6 security);
scoped-optional: `275c72f46c30…` / `339e8c3abc05…` / `92790e91927d…`
(150, 12); scoped-required: `a2aa8183e213…` / `734f33133150…` /
`f6e3fd853aea…` (75, 6); every-provider-set equals default. A second
base run was identical to the first.
- **The handler digest can fail:** a positive control changed one
character of one moved handler (`Delegable scope error:` → `!`, through
`ablation-replace.mjs`; anchor 1 → 0, blob `01fe3b195d` → `0c2c62e946`).
Routes and calls were unchanged, and the handler list differed in
exactly `GET /api/v1/security/my-delegable-scope` (and its scoped twin).
Restored, blob `01fe3b195d` equals `HEAD`.
- **Moved bodies:** base `rest-server.ts` lines 10309-10600 and
10695-10837, one 4-space indent removed, against `security-routes.ts`
lines 110-401 and 411-553: `diff` exits 0 both times (292 + 143 lines).
No moved line has an odd number of backticks, so no template literal
spans the cut and re-indenting changes no runtime string.
- **Moved-line accounting:** `git diff --color-moved=plain
--color-moved-ws=allow-indentation-change` base → move commit over the
two files: 442 deleted and 470 added lines detected as moved.
`rest-server.ts` is +43 / −449: the two stub bodies (host literal plus
`.call`), the slice-6 import and its comment, and four import-pointer
comments.
## Readers re-pointed (sums unchanged, no gate loosened)
- `scripts/check-route-envelope.mjs` (a gate's target paths,
`domain:spec`): `security-routes.ts` is discovered by the `*-routes.ts`
convention and declared `dialectOnly` with ratchet #9559, as the five
earlier modules are, at its measured `stringError 0`, `siblingCode 0`.
Every arm of both families emits the nested `{ error: { code, message }
}` through its family's one emitter (the emitters #7981 and #8073
introduced). So `rest-server.ts` stays at `stringError 17`, `siblingCode
17`, and the sums 17 + 13 + 8 + 1 + 0 + 0 + 0 = 39 and 17 + 15 + 8 + 9 +
4 + 1 + 0 = 54 are unchanged. Output differs from base only in the new
row (16 → 17 modules, 7 → 8 ratcheted). `--self-test` green.
- `scripts/adr-anchors/packages__rest__src__security-routes.ts.json`
(**new**, ADR-0090 + ADR-0105 + ADR-0112): `check-adr-anchors`
decision-letter citations on the anchored surface 1761 (base) → 1751
(move) → 1761 (head); anchored files 67 → 68. Every listed id appears in
the module, and every cited letter is a decision of its record (the
gate's own check, green). The invariant writes "its D6", never "ADR-0090
D6", so it adds no citation of its own (measured with the gate's regex:
0).
- The nine registrar-list readers above.
- `error-response.ts`, the `nestedRefusalEnvelope` docblock (rest lane,
not in the published `.d.ts`): it named `rest-server.ts` as the home of
three families, the suggested-binding one among them. Since slices 3, 4
and this one moved all three, the sentence now names each family's
current home.
**Red before the re-points**, each measured with the move in place
(`d6fc91a97d`): the six `local` list readers read `Test Files 6 failed
(6)`, `Tests 7 failed | 103 passed (110)` (five length pins, plus the
docblock pin's length pin and its new module with no floor).
`rest-server-canonical-query-ast.test.ts` (`repo`) read `Tests 2 failed
| 53 passed | 7 skipped (62)`. The dogfood pair read `Tests 2 failed |
106 passed (108)` (list length; the census row's `registrar list length`
control). `tsc --noEmit` was clean, but `check:test-typecheck` found 2
type errors, the two typed floor tables without the new module.
`check:route-envelope` read `security-routes.ts NOT DECLARED` (MODULES
and EXPRESS_RESPONSE_MODULES). `check-adr-anchors` was green at 1751.
## Readers examined and not re-pointed
- `packages/spec` readers: none reads a moved line by path. No liveness
anchor names either registrar or a symbol of the moved bodies.
`packages/spec/liveness/doc.json`'s note names
`this.registerSecurityEndpoints(bp)`, a call site that stays, as dated
history. The `packages/spec` pointers slices 1–4 carried to the
CRUD-doors slice are unchanged by this slice.
- `objectql-slot-consumer-census`, `auth-gate-allowlist-fault-window`,
`execctx-authz-input-seam-reachability`, runtime
`meta-list-projection-parity`, core `authz-store-unavailable` and
`check-single-authz-resolver`'s `DELEGATORS` row: they read members or
blocks of `rest-server.ts` the moved bodies do not touch.
- No `rest-server.ts#symbol` anchor in the tree names either registrar
or a symbol only the moved ranges hold. No `rest-server.ts:NNNN` line
citation falls in or after the moved ranges (the highest is `:5872`).
`docs/qa/platform-checklist` has no anchor on these doors.
- Gate outputs, base `a515abdd8c` vs merge head `a12cdcf4e4`, identical:
`check-system-context-census`, `check-single-authz-resolver`,
`check-rest-log-declared`, `check:test-source-alias`,
`check:rest-log-spy-declared`, `check:platform-checklist`,
`check-filter-alias-parity`, `check:liveness`,
`check:cross-package-test-inputs`. Identical except the scanned-file
count: `check-meta-type-normalized` (+1, the new module),
`check-dispatcher-error-vocabulary` (+1; 57 sites, 57 classified) and
`check:error-status-conformance` (+2, the new module and one file from
`main`; 463 producer sites). `check-undeclared-dep-imports` +2
specifiers and 1 file (the module's package imports).
`check-scripts-symbol-anchors` +4 file-level anchors (the gate's new
comments). `check-affected-docs` 24 → 25 route sources. The other
differences come from `main`'s two merged commits
(`check-durability-degradation-log-level`: one `objectql/src/plugin.ts`
line shift; `check:nul-bytes` and `check:doc-authoring`: new files).
## Acceptance notes
- `rest-server.ts`'s `resolveSecurityService` docblock (about `:9506`)
says it "Mirrors the resolver in registerSecurityExplainEndpoints". That
docblock ships in the published `.d.ts`, so editing it would break the
byte-identity this slice must keep. It is not edited, and the name still
resolves to the function of that name in `security-routes.ts`, which
holds the resolver.
- Other-lane prose that names `rest-server.ts` for the suggested-binding
route, read by nothing:
`packages/core/src/security/audience-binding-suggestion-status.ts`
(about `:10`, and about `:18`, which says `rest-server.ts` imports the
vocabulary; the importer is now `security-routes.ts`) and
`packages/runtime/src/domains/security.ts` (about `:144`). Not edited
(承接者:无).
- `docs/adr/0112-…`'s Consumers line names `rest-server.ts` for
`@objectstack/rest` as a whole, not as these doors' home. It is a
governed surface and is not edited.
- `scripts/check-route-envelope.mjs`'s count-history comments for
`rest-server.ts` (the #7981 and #8073 entries) say the two registrars
sat in that file when those counts moved. They are dated history,
unchanged.
- `docs/adr/0076-…` (status line and D11) and `docs/adr/0111-…`
(Consumers line) are still carried to the maintainer by the seat; this
slice adds nothing to them.
## Gates and tests
Measured at this branch: base `a515abdd8c`, the move `d6fc91a97d`, the
re-points `96504dab66`, and one merge of `origin/main` `f40d877f81`
(`a12cdcf4e4`, two commits in `objectql`, `plugins/organizations` and
one dogfood test, no file in this diff). All builds and tests went
through `os-verify-lock`. Every exit code was captured to a file before
any pipe.
- At `a12cdcf4e4`: `pnpm install --frozen-lockfile` exit 0. `pnpm turbo
run build --concurrency=2`, the whole workspace, exit 0 (76 tasks, 33
cached).
- `pnpm --filter @objectstack/rest typecheck`: exit 0 (`tsc --noEmit`,
then `check:test-typecheck`: 0 file(s) / 0 error(s)), at `96504dab66`
and at `a12cdcf4e4`.
- `pnpm --filter @objectstack/rest exec vitest run --project local
--maxWorkers=2`: Test Files 285 passed (285), Tests 5870 passed / 326
skipped (6196), at both heads.
- `pnpm --filter @objectstack/rest exec vitest run --project repo
--maxWorkers=2`: Test Files 5 passed (5), Tests 234 passed / 7 skipped
(241), at both heads.
- `pnpm --filter @objectstack/dogfood exec vitest run
test/authz-probe-blind-spot.test.ts test/authz-conformance.test.ts`:
Test Files 2 passed (2), Tests 108 passed (108), at both heads.
- `dispatch-gates --commands --repo objectstack-ai/objectstack`, no
paths, at the final head `a12cdcf4e4` (stderr names that commit; the
`--repo` assertion holds): 79 commands, all run at `a12cdcf4e4`, all
exit 0. `--ran`: `Run reconciliation — 79 derived, 79 run, 0
NOT-MEASURED, 0 UNRUN.` Among them are `pnpm check:route-envelope` (its
`--self-test`, then the scan), `pnpm check:adr-anchors`, `pnpm
check:durability-log-level`, `pnpm check:dispatcher-error-vocabulary`,
`pnpm check:dts-closure`, `pnpm check:dual-build-cjs-loads` and `pnpm
check:pm-dispatch-gates`.
- Lint, the proven narrowing: `eslint --no-inline-config --format json`
over `packages/rest`, the two dogfood files,
`scripts/check-route-envelope.mjs` and the new anchor JSON: 330 files, 0
errors, 0 lint warnings. Its one warning is `File ignored because no
matching configuration was supplied` for the JSON, which `eslint .`
never reads. All 15 changed files are in the result set at 0 / 0. The
published `.d.ts` is byte-identical, so no consumer outside
`packages/rest` can lint differently. Repo-wide `pnpm lint` is CI's.
- `check:dev-prereqs` and `check:skill-frame-freshness` (local-only)
were not run: no `packages/spec` build input and no four-axis frame file
is touched.
- No changeset: nothing any released package publishes changes (`.d.ts`,
export lists and routes byte-identical above). `skip-changeset` is the
seat's to apply on its own check.
**Cross-lane files in this diff:** `scripts/check-route-envelope.mjs`
(`domain:spec`, a gate's target paths),
`scripts/adr-anchors/packages__rest__src__security-routes.ts.json` (a
new entry in `check-adr-anchors`' registry, `domain:devx`), and the
dogfood pair (`packages/qa/dogfood/test/authz-conformance.test.ts`,
`authz-probe-blind-spot.census.ts`). No platform-checklist file is
edited.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Q9PZ5Pzqcus4woVvTZwWNU)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent d0c09e4 commit d0f7eb5
15 files changed
Lines changed: 721 additions & 469 deletions
File tree
- packages
- qa/dogfood/test
- rest/src
- scripts
- adr-anchors
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1627 | 1627 | | |
1628 | 1628 | | |
1629 | 1629 | | |
1630 | | - | |
| 1630 | + | |
| 1631 | + | |
1631 | 1632 | | |
1632 | 1633 | | |
1633 | 1634 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
519 | 519 | | |
520 | 520 | | |
521 | 521 | | |
522 | | - | |
523 | | - | |
524 | | - | |
525 | | - | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
526 | 527 | | |
527 | 528 | | |
528 | 529 | | |
| |||
703 | 704 | | |
704 | 705 | | |
705 | 706 | | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
706 | 720 | | |
707 | 721 | | |
708 | 722 | | |
709 | | - | |
| 723 | + | |
710 | 724 | | |
711 | 725 | | |
712 | 726 | | |
713 | 727 | | |
714 | 728 | | |
| 729 | + | |
715 | 730 | | |
716 | 731 | | |
717 | 732 | | |
718 | 733 | | |
719 | 734 | | |
720 | 735 | | |
721 | 736 | | |
722 | | - | |
| 737 | + | |
723 | 738 | | |
724 | 739 | | |
725 | 740 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
760 | 760 | | |
761 | 761 | | |
762 | 762 | | |
763 | | - | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
764 | 766 | | |
765 | 767 | | |
766 | 768 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
96 | 100 | | |
97 | 101 | | |
98 | 102 | | |
| |||
104 | 108 | | |
105 | 109 | | |
106 | 110 | | |
107 | | - | |
| 111 | + | |
| 112 | + | |
108 | 113 | | |
109 | 114 | | |
110 | 115 | | |
| |||
120 | 125 | | |
121 | 126 | | |
122 | 127 | | |
| 128 | + | |
| 129 | + | |
123 | 130 | | |
124 | 131 | | |
125 | 132 | | |
| 133 | + | |
126 | 134 | | |
127 | 135 | | |
128 | 136 | | |
| |||
598 | 606 | | |
599 | 607 | | |
600 | 608 | | |
601 | | - | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
602 | 620 | | |
603 | | - | |
| 621 | + | |
604 | 622 | | |
605 | | - | |
| 623 | + | |
606 | 624 | | |
607 | 625 | | |
608 | 626 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
246 | 246 | | |
247 | 247 | | |
248 | 248 | | |
249 | | - | |
250 | | - | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
251 | 253 | | |
252 | 254 | | |
253 | 255 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
135 | 135 | | |
136 | 136 | | |
137 | 137 | | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
138 | 143 | | |
139 | 144 | | |
140 | 145 | | |
| |||
143 | 148 | | |
144 | 149 | | |
145 | 150 | | |
| 151 | + | |
146 | 152 | | |
147 | 153 | | |
148 | 154 | | |
| |||
332 | 338 | | |
333 | 339 | | |
334 | 340 | | |
335 | | - | |
| 341 | + | |
| 342 | + | |
336 | 343 | | |
337 | 344 | | |
338 | 345 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
153 | 153 | | |
154 | 154 | | |
155 | 155 | | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
156 | 163 | | |
157 | 164 | | |
158 | 165 | | |
159 | 166 | | |
160 | 167 | | |
161 | 168 | | |
162 | 169 | | |
| 170 | + | |
163 | 171 | | |
164 | 172 | | |
165 | 173 | | |
| |||
189 | 197 | | |
190 | 198 | | |
191 | 199 | | |
192 | | - | |
| 200 | + | |
| 201 | + | |
193 | 202 | | |
194 | 203 | | |
195 | | - | |
| 204 | + | |
196 | 205 | | |
197 | 206 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
321 | 321 | | |
322 | 322 | | |
323 | 323 | | |
324 | | - | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
325 | 327 | | |
326 | 328 | | |
327 | 329 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| 42 | + | |
| 43 | + | |
42 | 44 | | |
43 | 45 | | |
44 | 46 | | |
| |||
0 commit comments