Repository navigation
Commit 492e79e
fix(plugin-view): the registered object-view reads a named view's grid members (objectui#10885) (#10937)
Part of #10885
Clause-②: no
Member 1 of objectui#10885: route 2, the registered `object-view`
renderer's own grid path, reads a named grid view's grid members off the
named view. Member 2 is not taken and member 3 is not in this PR (see
Acceptance notes), so #10885 remains open.
Claim `5865109811`, seat `domain:ui#2`, PM session
`session_014mXUNuFomfj24w7s1pZzhN`
(`https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN`), mode
`subagent`.
## What changed
- **`packages/plugin-view/src/ObjectView.tsx`**, the `gridSchema` memo:
the `object-grid` node `ObjectView` hands `ObjectGrid` when no host
passes `renderListView`.
- Ten members are read off the active named view first. `pagination` and
`selection` then fall back to the node's `table`, as they did before.
`rowHeight`, `resizable`, `searchableFields`, `conditionalFormatting`,
`rowActions`, `bulkActions`, `bulkActionDefs` and `exportOptions` are
named-view sourced, like `grouping` / `rowColor` beside them. There is
no `activeView` rung and no new node read.
- A named view's `hiddenFields` is subtracted from the resolved column
projection, in both the `fields` and the `columns` slot (new helper
`withoutHiddenFields`). It is not relayed as a key: `object-grid` does
not declare it, and `ObjectGrid` has no read of it.
- A named view's `exportOptions` written in the protocol's legacy
bare-array spelling is lifted to `{ formats }` (new helper
`gridExportOptions`). That is the lift the protocol's own parse makes,
and the one `ListView` makes for the delegation. `ObjectGrid` reads
`exportOptions.formats`.
- `conditionalFormatting` and `bulkActionDefs` carry a type assertion to
the grid's declared element type. The protocol's expression wire is
wider than that type (measured by `tsc`), and `ObjectGrid` hands both to
the shared evaluator, which reads the wire.
- **The objectui#5097 HOST-COMPOSITION fence (the delegation) is
byte-identical.** The text between the two `#region` markers hashes to
`40bc2292` on the base and on the head.
- **Docs** (the docs-driven rule of AGENTS.md section 5): one prose
paragraph each in `packages/plugin-view/README.md` and
`content/docs/plugins/plugin-view.mdx`, beside the objectui#10758
paragraph. Neither gains a code fence.
- **Changeset** `.changeset/10885-object-view-route2-named-grid.md`:
`'@object-ui/plugin-view': patch`, with the claim's `Clause-②: no` line.
`@object-ui/app-shell` gains only a test file, so it is not listed;
`check-changeset-presence` passes.
- **No shared helper.** The order allowed one helper for both routes
only if the delegation's behaviour and pins stay untouched.
`objectViewHostSurface.test.tsx` section 1b derives the fence's
named-view read set by name from the fence text, and walks the rungs of
the `renderListView` literal. Moving the reads out of the fence changes
both derivations, so those pins would have to be edited. The two sinks
also differ: `ListView` subtracts `hiddenFields` and lifts
`exportOptions` itself, and `ObjectGrid` does neither. So the two routes
share the precedence, not the code.
## H1: reproduced on `main` (`733fd5ac65`)
Read from the DOM through the real stack: the real `ViewPreview`, the
real `SchemaRenderer` and registry, the registered `object-view`
renderer and the real `ObjectGrid`. The pin file
`ViewPreview.routeTwoGridMembers-10885.test.tsx` was run on an untouched
base tree.
- A stored grid view `{ type: 'grid', columns: ['name', 'amount',
'stage'], hiddenFields: ['amount'] }` still draws the hidden column. The
header span reading `Budget Amount` is rendered (`expected SPAN to be
null`).
- The same view with `rowHeight: 'compact'` draws no row-height control:
`Unable to find an element with the title: Row height: compact.`
- **Lit control, green on the base:** `columns: ['name', 'stage']` off
the same named view IS honoured on route 2. `Pipeline Stage` is drawn
and `Record Owner`, which is not projected, is not.
## Members, per route
The measured set is bucket ① of the objectui#7924 ruling, all 23
members. Route 2 takes a member when three things hold: the installed
`@objectstack/spec` 17.4.0 declares it under the same name on a named
view (`ObjectListViewSchema`) and on `object-grid`
(`ComponentPropsMap['object-grid']`), and `ObjectGrid` reads it. The pin
re-derives both declarations.
| member | delegation (route 3, unchanged) | route 2 before | route 2
after |
|---|---|---|---|
| `pagination` | named, host, node | `table.pagination` | named, then
`table.pagination` |
| `selection` | named, host, node | `table.selection` | named, then
`table.selection` |
| `rowHeight` | named, host (through the fold) | none | named |
| `resizable` | named, host, node | none | named |
| `searchableFields` | named, host, node | none | named |
| `conditionalFormatting` | named, host, node | none | named |
| `rowActions` | named, host, node | none | named |
| `bulkActions` | named, host, node | none | named |
| `bulkActionDefs` | named, host | none | named |
| `exportOptions` | named, host | none | named (a bare array lifted to
`{ formats }`) |
| `hiddenFields` | named, host, node | none | named, subtracted from the
projection (not relayed) |
| `navigation` | named, host, node | none | none: excluded (Acceptance
notes) |
| `inlineEdit` | named, host, node | none | none: excluded (Acceptance
notes) |
| `description` | named, host | none | none: `object-grid` does not
declare it |
| `emptyState` | named, host, node | none | none: `object-grid` does not
declare it |
| `addRecord`, `allowPrinting`, `aria`, `compactToolbar`,
`filterableFields`, `sharing`, `showRecordCount`, `userFilters` | named,
host, node | none | none: list chrome with no `object-grid` slot |
Route 2's named-view reads on the grid node go from 5 (`columns`,
`filter`, `sort`, `grouping`, `rowColor`) to 16.
The ten are not the whole set that meets the test. Outside bucket ①,
`label` and `data` are also declared on both and read by `ObjectGrid`,
and `navigation` meets it too; none of the three is read off the named
view on route 2 (Acceptance notes).
## Pins and ablation
Red on the base `733fd5ac65` (the two new files copied onto an untouched
base worktree), green on the head `56ad7e8774`.
-
**`packages/plugin-view/src/__tests__/ObjectView.routeTwoNamedGridMembers-10885.test.tsx`**,
11 tests. It mounts through `SchemaRenderer` and the registered
renderer, with `ObjectGrid` mocked as the sink.
- Member set, 3 tests, green on both trees: each relayed member is
declared on both protocol schemas; `hiddenFields` is declared on the
named view and not on `object-grid`; the full fixture parses under the
strict `ObjectListViewSchema`. The control is `allowExport`, which is on
neither.
- THE FIX, red on the base: `pagination did not arrive from the named
view: expected { pageSize: 100 } to deeply equal { pageSize: 5, …(1) }`.
The bare-array `exportOptions` lift is also red on the base.
- The node control is green on both: `table.pagination` and
`table.selection` apply when the named view omits them, and the other
eight stay undefined although the node's `table` carries them.
- `hiddenFields`, 5 tests. Four are red on the base: both slots lose the
hidden field and no `hiddenFields` key reaches the grid; an
object-shaped column keeps its shape; the node's `table.columns` is
narrowed too; hiding every projected field keeps `[]`. One is green on
both: with no projection anywhere, nothing is invented.
-
**`packages/app-shell/src/views/metadata-admin/previews/ViewPreview.routeTwoGridMembers-10885.test.tsx`**,
4 tests, the whole real stack with DOM readings. `hiddenFields` and
`rowHeight` are red on the base. The lit `columns` control and the
neither-declared control are green on both.
- **Base: 8 failed, 7 passed (15). Head: 15 passed.**
- The delegation's objectui#10884 pins
(`ObjectView.namedViewProtocolKeys-8980.test.tsx`,
`objectViewHostSurface.test.tsx`) are untouched and green.
**Ablation**, run with `ablation-replace.mjs` on the committed head
`695a6ce635` (the later `56ad7e8774` changes one test-header comment
only). The directions were predicted before the run.
- Leg A put the base's two `table` rungs back in place of the ten member
rungs: anchor 1 → 0, blob `dcce880456e3` → `57515b34b699`.
- Leg B neutralised the `hiddenFields` read: anchor 1 → 0, blob →
`a01a7bdbbcf4`.
- On disk, the named `rowHeight` reads went 2 → 1 (the fence's own
stays) and the `gridExportOptions` call 1 → 0.
- The run covered the whole `packages/plugin-view/` suite, both
ViewPreview pin files and three types census files. **Result: 8 failed,
789 passed, 59 files.** The 8 are exactly the new rows.
- The restore was proven: the blob equals HEAD (`dcce880456e3`) and `git
diff HEAD` is empty.
## Consumer sweep
`git grep` over test files for `'object-view'`, `ObjectView` mounts and
imports, `ViewPreview`, and the tests that read plugin-view's
`ObjectView.tsx`, plus the objectui#7924 / objectui#7779 census tests.
Everything ran on the head under the verify lock.
- **Batch A: 75 files, 1882 tests passed**, `VERDICT command-exit 0`, at
`695a6ce635`. It covers the whole `packages/plugin-view/` suite and the
ten `packages/types` tests that read named views or the object-view
docs. The census `object-view-unmirrored-keys-7779`,
`schema-reference-named-list-view-keys-7923` and
`object-view-listviews-by-reference-7928` are among those ten. The rest
are from plugin-map, plugin-list, plugin-grid, core, react, examples and
`scripts`.
- **Batch B: 38 files, 350 tests passed**, `VERDICT command-exit 0`, at
`695a6ce635`. It covers app-shell's `ViewPreview`,
`StudioDesignSurface`, `ResourceEditPage` and `AppContent` tests, the
`ObjectView.*` tests (the relay census `ObjectView.relayRungCensus-7559`
among them), and five `apps/console` tests.
- **The 18 tests that read the changed markdown** (from
`scripts/markdown-test-inputs.mjs --list`): 829 tests passed.
- **Census: no number moved.** The census counts a member as read when
any route reads it off a named view. Every member route 2 now reads was
already read by the delegation, so the partition stays 43 read / 21
unread of 64, with bucket ① empty. No census test was edited.
## Gates
Each exit was captured redirect-first.
- **Exit 0 at the head `56ad7e8774`:**
- `check-changeset-presence` ("3 source file(s) of 2 released package(s)
changed, and this change declares 1 changeset(s)"),
`check-changeset-no-major`, `check-changeset-fixed`,
`check-changeset-overwrite`, and `check-changeset-claims` (6 pending
paragraphs name a touched file; each was read, and none is made false);
- `check:pending-changeset-literals`, `check:new-line-citations` ("0 new
citation(s)"), `check:control-bytes`, `check:test-path-roots`, and the
three `check:vi-mock-*` gates;
- `check:spec-symbols`, `check:phantom-deps` and
`check:handler-key-reads`;
- `check:doc-types`, `check:doc-fences`, `check:doc-example-ids`,
`check:doc-example-readers`, `check-doc-expression-carriage` and
`check-doc-links`;
- `check-governed-queue-guard --test` on the 6 paths: "An ordinary pull
request".
- **`type-check` exit 0 at `695a6ce635`** for `@object-ui/plugin-view`
and for `@object-ui/app-shell`. Each runs `tsc --noEmit && tsc -p
tsconfig.test.json`, after its dependency closure was built.
`--listFilesOnly` finds each new test file in its package's test
program. The app-shell run used a 6144 MB heap, because its test program
is the largest in the repo.
- **ESLint `--no-inline-config`** on the 3 edited TS/TSX files, which is
the whole population: `eslint.config.js` covers them with `files:
['**/*.{ts,tsx}']`, and `--format json` reports 3 files.
- 0 errors. `ObjectView.tsx` has 60 warnings, per rule identical to the
base (53 / 4 / 3). The new pins have 6 and 1 `no-explicit-any` warnings.
- Not type-aware: `projectService` / `parserOptions` have 0 hits against
a `languageOptions` control of 1, so no untouched file's verdict can
move.
- **NOT MEASURED:**
- `check:readme-exports`, reason: prerequisite not met. 86 self-imports
could not be judged because the workspace dists are not all built. This
diff adds no fenced block to any README.
- `check:doc-snippets` and `check:doc-examples`: not run, because no
fenced block was added.
- The full app-shell and types suites, and the repo-wide lint: CI runs
them.
## Serial
- PR objectui#10914 (head `2b3d2061a2`) edits `ObjectView.tsx` in one
comment of the view-switcher icon map. This PR's hunks are the column
helpers and `gridSchema`. `git merge-tree --write-tree` against its head
is clean (tree `4a03a230b6`). Against a fresh `origin/main`
(`733fd5ac65`) it is clean too (tree `749f02ef74`).
- `ViewPreview.tsx` is not edited (PR objectui#10906). The pin is a new
file.
- `packages/plugin-grid/src/ObjectGrid.tsx` is not edited (PR
objectui#10278).
## Fix round 1
The contract review of `56ad7e8774` failed on wording only. The code,
the precedence, the `hiddenFields` composition, the `exportOptions`
lift, the fence, the census, the pins, the ablation and the semver level
all held. One commit, `097ba79141`, text only:
- **Changeset, third paragraph**, replaced with the review's text: it
names the ten as ten members read off the named view first, and adds
that `label`, `data` and `navigation`, also declared on both a named
view and `object-grid`, are still not read off the named view on this
path.
- **README and docs paragraphs**, the same edit in each: "Ten grid
members …" instead of "The grid members …", and the sentence that
`label`, `data` and `navigation`, also declared on both, are not read
off the named view on this path.
- **The `withoutHiddenFields` docblock** now states its one divergence
from `ListView`: an entry with no field identity is kept, where
`ListView` drops such an entry whenever `hiddenFields` is non-empty.
Comment only: the diff of `ObjectView.tsx` changes no code line.
- **Re-run at `097ba79141`**, under the verify lock:
- the two pin files, `object-view-unmirrored-keys-7779` and the 18 tests
that read the changed markdown: 21 files, 1077 tests passed, `VERDICT
command-exit 0`;
- sweep batch A (the whole `packages/plugin-view/` suite and every test
that reads plugin-view's `ObjectView.tsx`): 75 files, 1882 tests passed,
`VERDICT command-exit 0`.
- **Gates at `097ba79141`, exit 0 each:** `check-changeset-claims`,
`check:pending-changeset-literals`, `check:control-bytes`,
`check:new-line-citations` ("0 new citation(s)"), `check-doc-links`,
`check:doc-fences`, `check-changeset-presence`,
`check-changeset-overwrite` and `check:handler-key-reads`.
- **Fence:** the text between the two `#region` markers still hashes to
`40bc2292`.
- **Serial:** `git merge-tree --write-tree` is clean against a fresh
`origin/main` (`733fd5ac65`, tree `46037fd4fc`) and against PR
objectui#10914's head (`2b3d2061a2`, tree `605c556b1d`).
## Acceptance notes
- **Premise correction for member 1.** The card says `ObjectGrid` reads
each of the eight members. Measured: it reads seven. It has no
`hiddenFields` read, and `object-grid` does not declare the key.
- `hiddenFields` is therefore honoured the way the protocol composes it
(objectstack#15184 ruling B: `columns` projects, `hiddenFields`
subtracts). It is subtracted from a declared projection, as `ListView`
does for the delegation.
- With no `columns` anywhere, the grid derives its own columns and the
hidden field still shows. `ListView` has the same limit.
- **The full set beyond the eight.** `searchableFields`,
`bulkActionDefs` and `exportOptions` are also taken: each is declared on
both schemas and read by `ObjectGrid`.
- **`navigation` is excluded.** It is declared on both schemas, but
`ObjectView` passes `ObjectGrid` its own `onRowClick`, and
`useNavigationOverlay` obeys an `onRowClick` first. Relayed, the member
would be read by nothing.
- Route 2's row click is owned by `ObjectView`'s `navigationConfig`,
which reads the node's `navigation`.
- Making it read the named view would also move the delegation's click
path, because the delegation hands `ListView` the same `handleRowClick`.
That is outside this rung.
- **`inlineEdit` is excluded.** `ObjectGrid` reads `editable`, not
`inlineEdit`. `ListView` translates one into the other under its
objectui#4647 grant gate. That is a key translation with a permission
contract, a new host path, not the named-view-first rung.
- **`fieldOrder`, `label` and `data`, which are not in bucket ①.** The
delegation reads all three off a named view, and route 2 reads none of
them.
- `fieldOrder` is the composition's third key, so route 2 does not apply
a named view's order.
- `ObjectGrid` reads `label` for its caption and export filename, while
route 2 passes `table.title`.
- `ObjectGrid` reads `data` for its fetch source; route 2 passes none.
- **Member 4 of objectui#10885.** `fieldOrder`, `label`, `data`,
`navigation` and `inlineEdit` on route 2 are member 4 of objectui#10885,
recorded by the seat on the card.
- **Member 2 is not taken.** The delegation does not relay a named
view's eight view-kind blocks.
- The rung this PR adds is on route 2. Covering member 2 would add
named-view reads inside the objectui#5097 fence.
- That moves the delegation's behaviour and its pinned named-view read
set (`objectViewHostSurface.test.tsx` section 1b), and this order keeps
both untouched.
- Reach is unchanged: no in-tree host passes both `listViews` and
`renderListView`.
- **Member 3 is not in this PR.** The three census changesets are
untouched, and #10885 remains open for its own prose-only PR. This
change moves no census figure: 43 read / 21 unread of 64, with bucket ①
empty.
- **Type narrowness, noted.** The protocol's named view declares a
`conditionalFormatting` rule's `condition` as an expression input, which
admits the `{ dialect, source }` wire, and a `bulkActionDefs` `visible`
wire that may carry `ast` and no `source`. `ObjectGridSchema` in
`@object-ui/types` spells neither; the spec's `object-grid` declares
both slots loosely (`conditionalFormatting` as unknown, `bulkActionDefs`
as an array of unknown), so the gap is against the named view's wire,
not against `object-grid`. The runtime reads both through the shared
evaluator. The two rungs assert the declared type. Widening the declared
`condition` type would be a Clause-② type move, so it belongs on the
backlog; not filed here.
- **An observation, not filed.** The protocol's `object-grid` also
accepts `exportOptions` as a bare format array, and keeps it an array at
parse. `ObjectGrid` reads only `exportOptions.formats`. This is a source
reading, not a measured render. Carrier: PR objectui#10278, which holds
`ObjectGrid.tsx`.
- **Beyond the claimed file surface:** the README and docs paragraphs
(the docs-driven rule of AGENTS.md section 5), and the app-shell pin
file (the order's `ViewPreview` pin).
---
_Generated by [Claude
Code](https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 9ce90ba commit 492e79e
6 files changed
Lines changed: 516 additions & 4 deletions
File tree
- .changeset
- content/docs/plugins
- packages
- app-shell/src/views/metadata-admin/previews
- plugin-view
- src
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
431 | 431 | | |
432 | 432 | | |
433 | 433 | | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
434 | 446 | | |
435 | 447 | | |
436 | 448 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
497 | 497 | | |
498 | 498 | | |
499 | 499 | | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
500 | 512 | | |
501 | 513 | | |
502 | 514 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
244 | 244 | | |
245 | 245 | | |
246 | 246 | | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
247 | 304 | | |
248 | 305 | | |
249 | 306 | | |
| |||
2202 | 2259 | | |
2203 | 2260 | | |
2204 | 2261 | | |
| 2262 | + | |
| 2263 | + | |
2205 | 2264 | | |
2206 | 2265 | | |
2207 | 2266 | | |
| |||
2214 | 2273 | | |
2215 | 2274 | | |
2216 | 2275 | | |
2217 | | - | |
2218 | | - | |
| 2276 | + | |
| 2277 | + | |
| 2278 | + | |
| 2279 | + | |
| 2280 | + | |
| 2281 | + | |
| 2282 | + | |
| 2283 | + | |
| 2284 | + | |
| 2285 | + | |
2219 | 2286 | | |
2220 | 2287 | | |
2221 | 2288 | | |
| |||
2233 | 2300 | | |
2234 | 2301 | | |
2235 | 2302 | | |
2236 | | - | |
2237 | | - | |
| 2303 | + | |
| 2304 | + | |
| 2305 | + | |
| 2306 | + | |
| 2307 | + | |
| 2308 | + | |
| 2309 | + | |
| 2310 | + | |
| 2311 | + | |
| 2312 | + | |
| 2313 | + | |
| 2314 | + | |
| 2315 | + | |
| 2316 | + | |
| 2317 | + | |
| 2318 | + | |
| 2319 | + | |
| 2320 | + | |
| 2321 | + | |
| 2322 | + | |
| 2323 | + | |
| 2324 | + | |
| 2325 | + | |
| 2326 | + | |
| 2327 | + | |
| 2328 | + | |
| 2329 | + | |
| 2330 | + | |
| 2331 | + | |
| 2332 | + | |
| 2333 | + | |
| 2334 | + | |
| 2335 | + | |
| 2336 | + | |
| 2337 | + | |
2238 | 2338 | | |
2239 | 2339 | | |
2240 | 2340 | | |
| |||
0 commit comments