Repository navigation
Commit 19e58e2
Part of #19332
Flight G2b of ruling 5861442317.
Clause-②: no
## Status: draft, no open gap
The first round stopped at one red test outside the claim's surface,
`packages/lint/src/validate-predicate-path-refs.test.ts`, the lint
census of every predicate the shipped metadata forms carry. The claim
both admitted mechanically moved population pins and forbade
`packages/lint/**`. The seat answered A and amended claim `5873857698`
in place (its "Amended 2026-09-28T17:27Z" line): that one file joined
the surface for its census pin only. The patch round landed it in
`16037890` (**Pins moved** below), and the file reads 54 of 54.
Under the claim's second amendment ("Amended 2026-09-28T17:51Z"),
`2bcad436` corrects one G2a text: the `indexes.fields` sub-row's help
text (and its code comment and four catalogue leaves) now reads "Saving
does not check them; publishing and os validate refuse a name that is
not a field of this object. A field that is not a stored column (a
formula, say) makes the SQL driver skip the whole index, with a warning
in the server log." Each clause was measured on this tree after
`4b2d9041` (#20479): `ObjectSchema.safeParse` accepts a misspelt column;
`os validate`'s rules and the runtime publish gate
(`runRuntimeAuthoringRules`, type `object`) both return
`object-field-ref-unknown` at `error` on it; and an in-memory SQLite
`SqlDriver` sync skips an index on a formula field (and one on a
misspelt name) with `[sql-driver] skipping declared index … column(s)
not materialized` at `warn`, while the index on a stored column is
created.
## What
Four live keys had no form row, so an author could reach them only
through the Source tab. Each is now a row with hand-written sub-rows, as
the ruling says: 「**G2 (…) — hand-written curated sub-rows**, plus … one
nested `subset` row for `inlineColumns`」. The four-locale catalogue rows
are in this PR.
| key | form, section | row, sub-rows (face) | the row each copies |
|:--|:--|:--|:--|
| `object.activityMilestones` | `object.form.ts`, Advanced, after
`validations` | `type: 'repeater'`: `field` (`widget: 'text'`,
required), `value`, `summary` (text, required), `type` (text) | the
`fieldGroups` repeater face (declared, labelled sub-rows); the text
sub-rows copy the plain text rows in Basics |
| `object.publicSharing` | `object.form.ts`, Advanced, after
`requiredPermissions` | `type: 'composite'`: `enabled` (switch),
`allowedAudiences` and `allowedPermissions` (`widget: 'multiselect'`
with inline options), `maxExpiryDays` (number, `min: 1`), `redactFields`
(`widget: 'string-tags'`), `eligibility` (`type: 'code'`, `language:
'expression'`) | the `access` / `lifecycle` composite face; `enabled`
the `enable` toggles; the two lists the multiselect objectui derives for
an array of enum (the derived `appearance.allowedVisualizations` on the
view and page forms); `redactFields` the `highlightFields` row;
`eligibility` the `fields.visibleWhen` predicate rows |
| `object.userActions` | `object.form.ts`, Advanced, under `managedBy` |
`type: 'composite'`: `create`, `import`, `edit`, `delete` (`widget:
'json'`), `exportCsv` (switch) | the composite face; the four union keys
the G1a `requiredPermissions` row (`json` on a union); `exportCsv` the
`enable` toggles |
| `field.inlineColumns` | `field.form.ts`, Configuration, between
`inlineTitle` and `inlineAmountField`, gated `data.type ==
'master_detail'` like both | `type: 'repeater'` over a curated subset:
`name` (text, required), `label` (text), `width` (number),
`defaultHidden` (switch) | the `fieldGroups` repeater face; the gate
copies its two sibling rows |
**Shapes (dispatch assumption 2), confirmed on this base:**
`activityMilestones` is `z.array(strictObject(…))` at
`object.zod.ts:2093`, four keys; `publicSharing` is a `strictObject` at
`:2286`, six keys; `userActions` a `strictObject` at `:1769`, five keys;
`inlineColumns` is `z.array(InlineGridColumnSchema)` at
`field.zod.ts:1460`, the item schema at `:890`, twenty keys. The gate's
own `keysOf` read the same sets.
**Ledger:** one nested `subset` row at `field` / `inlineColumns` in
`metadata-form-zod-reconciliation.test.ts`. Its shape is the `object` /
`fields` subset row at the top of the ledger (and its two depth-two
children `fields.options`, `fields.summaryOperations`), which is the
ledger's `subset` precedent. The other three keys need no row: every key
they declare is offered.
**Row titles:** the two new repeaters' row schemas carry a JSON Schema
`title` on every property (**Row titles** below).
## Faces that needed a reason
- **`activityMilestones.field` pins `widget: 'text'`.** Read at the
`.objectui-sha` pin on `main`, `dd3f7e1b`: with no `widget`,
`SchemaForm`'s `resolveFieldWidget` runs its name conventions, and
`detectFieldRefWidget` turns a string property named `field` into the
`field-ref` picker whenever `widgetContext.objectFields` is present.
`ResourceEditPage` always hands that over as a load state, and on an
object draft it is `idle` (the draft names no `object` / `objectName` /
`data.object` / `interfaceConfig.source`). `FieldRefWidget` then renders
a select offering only "None", so a new milestone could not name its
field. An explicit `widget` skips the conventions, and `text` is a
passthrough hint, so the face is a plain input.
- **`redactFields` pins `widget: 'string-tags'`** for the same reason: a
string list named `...Fields` becomes `field-multi` by the same
convention.
- **`userActions.create` / `import` / `edit` / `delete` take `widget:
'json'`**, the ruling's union rule (「Union-typed values take `json`」).
Each is a boolean or a strict `{ enabled, visibleWhen, disabledWhen }`
object. At the pin, `json` is a passthrough hint: `resolveFieldFace`
picks the stored value's union branch. A new entry or a stored boolean
renders the switch (the first arm), and a stored object renders its
three keys as a nested form, whose `setField` merges each edit into it.
No face writes one arm over the other. The object arm is written in
source and edited here once stored.
- **`allowedAudiences` / `allowedPermissions` take `widget:
'multiselect'`** with inline options. Every member is a spellable option
value. `MultiSelectWidget` writes `undefined` when every choice is
cleared, so the form cannot store the empty list `getPolicy` reads as
"any audience".
- **The objectui faces re-checked here are the ones G2a did not use**,
read at `dd3f7e1b` (G2a read the repeater face at `f8a9d0fb`): the
declared composite (`CompositeField`, `pickSubSchema` reading
`properties[NAME]` after `inlineSchemaRefs`), the multiselect widget,
the switch and number branches of the scalar chain, and the `json` hint
on a union sub-row. Code readings only, no browser run.
## `inlineColumns`: the curated subset
- **Offered:** `name`, plus the three keys that apply to a column of any
type, `label`, `width` and `defaultHidden`. An entry that names only a
field is what the key's own describe recommends, because objectui's
`hydrateColumns` completes it from the child field.
- **Deliberately not offered (recorded in the `subset` row):**
- `type`: declaring it opts the column out of that hydration.
- `options`, `reference`, `displayField`, `idField`, `autofill`,
`multiple`, `accept`, `prefix`, `step`, `scale`, `computed`, `expr`:
each applies to one cell type only. A column takes its type from the
child field at render, and no sub-row `visibleWhen` here can see it, so
each would be offered on every column.
- `required`, `readonlyWhen`, `requiredWhen`: hydration copies them from
the child field, where the rule the server enforces lives.
- The nested reading below shows the row is load-bearing: without it,
the gate's `zodOnly` for `field.inlineColumns` is exactly those sixteen
keys.
## Where a misspelt field name is refused, read from the code
The ruling's 「a misspelling is refused loudly at parse」 does not hold
for three of this flight's four name positions. Each help text claims
only what is measured.
| position | parse | publish door / `os validate` | runtime with a miss
| help text claims |
|:--|:--|:--|:--|:--|
| `publicSharing.redactFields[]` | accepts | **refused**:
`validate-object-field-refs` owns it at `error` (`runtimeTypes` includes
`object`); probe below | the redaction never binds (fails open) |
"refused at publish" |
| `activityMilestones[].field` | accepts (probe) | not judged:
`validate-object-field-refs` leaves it out by name; probe below |
`matchMilestone` compares `after[field] === value`, so the milestone
never fires | "Nothing checks it when you save or publish … never fires"
|
| a `{token}` in `activityMilestones[].summary` | accepts | not judged |
`renderMilestoneSummary` renders it empty | "a token that names no field
renders empty" |
| `inlineColumns[].name` | accepts (probe) | not judged; probe below |
`hydrateColumns` leaves an unknown name unhydrated, a plain text column
| "Nothing checks it when you save or publish … renders a plain text
column" |
Seat 2's #20479 (for #20432), which landed on `main` as `4b2d9041`
during this flight, extends `validate-object-field-refs` to four
field-level lists and `indexes[].fields`. Read on `origin/main`, its
list positions still do not include `activityMilestones[].field` or
`inlineColumns[].name`, so these texts stay true (**Out-of-scope
finding** below).
## Other help-text claims, each read from its consumer
- `activityMilestones`: an update that moves the field into the value
writes the summary in place of the field-change entry, and the first
match wins (`audit-writers.ts` `matchMilestone`). The comparison is
strict, and `value` is a string, so a milestone on a number or boolean
field never fires. A lookup, master-detail or user token shows the
referenced title (`REFERENCE_FIELD_TYPES`). An unset `type` is
`updated`: the update branch starts from `activityTypeFor('update')` and
a milestone replaces it only when it names one. (The schema's describe
says the default is "completed"; see Acceptance notes.)
- `publicSharing` (`share-link-service.ts`): `enabled` is re-read on
every redemption; unset audiences default to `['link_only']` and
permissions to `['view']`; `createLink` refuses any other with 422.
Every audience still needs the token: `resolveToken` adds a signed-in
check for `signed_in` and an allowlist check for `email`.
`maxExpiryDays` defaults to 365, and a link created without an expiry is
stored with none (`expiresAt ?? null`), so the cap does not force one.
`eligibility` binds `record`, is checked at mint and at every
redemption, and a predicate that does not compile or faults refuses.
- `userActions` (`resolveCrudAffordances`): the per-bucket defaults in
the help text are `CRUD_AFFORDANCE_DEFAULTS` verbatim. On an
`engine-owned` or `append-only` object, turning a verb on also passes
plugin-security's `assertEngineOwnedWriteAllowed`, so users can make
that write through the data API.
- `inlineColumns`: read only when the field sets `inlineEdit`
(`attachInlineSubforms`). Unset, `deriveColumns` curates past six
columns into the column chooser. `defaultHidden` never hides a required
column (`GridField`: `c.defaultHidden && !c.required`).
## Row titles (admitted by the claim from the start)
- **The guard.** `repeater-item-titles.test.ts` (#17232) requires a JSON
Schema `title` on every authorable property of every repeater's row
schema, and forbids a ledger entry. Both new repeaters are new carriers:
`object:activityMilestones` and `field:inlineColumns`.
- **The change.** 24 `.meta({ title })` calls, and nothing else in
either file:
- `object.zod.ts`, the `activityMilestones` entry: `field` 'Field',
`value` 'Value', `summary` 'Summary', `type` 'Type'.
- `field.zod.ts`, `InlineGridColumnSchema`, all twenty properties: Name,
Label, Type, Width, Required, Options, Prefix, Step, Reference, Display
Field, ID Field, Multiple, Accept, Default Hidden, Computed, Expression,
Scale, Autofill, Read-only When, Required When.
- The four offered sub-rows' titles equal their declared labels.
- **Byte proof.** Stripping exactly the added calls line by line gives
each file's base blob byte for byte: `object.zod.ts` sha256 prefix
`8979b5feea7ed0ff` both ways (4 removed), `field.zod.ts`
`24713de3b50d5f71` both ways (20 removed).
- **Reverse verification.** Run through `scripts/ablation-replace.mjs`
in wrap mode, on the committed state. Deleting the `Summary` title reads
`object:activityMilestones … expected [ 'summary' ] to deeply equal []`,
1 failed of 29. Deleting the `Default Hidden` title reads the same for
`field:inlineColumns` with `[ 'defaultHidden' ]`. The tool proved each
mutation landed (anchor 1 → 0, blob changed) and each restore (blob
equals HEAD, `git diff HEAD` empty).
- **No accept set moves.** `check:generated` reads all 15 artifacts up
to date on this head, `check:authorable-surface` and `check:api-surface`
included.
## Residue of the reconciliation gate (dispatch assumption 1)
The test file's own helper block was copied verbatim into a probe that
was never committed, and run with the gate's own functions. At base it
is lines 1-838, sha256 prefix `5e04d44fc5c5edb3`, the prefix G2a read.
On this branch it is lines 1-851, and it differs from the base block
only by the 13 inserted ledger lines. Residue = offerable root keys −
offered − root `omit` rows, per type, with `view` apart.
Controls, asserted inside the probe: lit, `name` is offered by 17 of 17
forms; dark, `object.zzFabricated19332G2b` and `object.name` are in no
residue.
| tree | residue | per type | view |
|:--|:--|:--|:--|
| base `e956924e` | **4** | object 3, field 1 | 42 |
| this branch (`82c5b111`, forms and ledger as on the head) | **0** |
none | 42 |
Removed: `object.activityMilestones`, `object.publicSharing`,
`object.userActions`, `field.inlineColumns`. Added: none.
Nested reading on the branch, through the gate's own
`reconcileNestedLists`:
- `field.inlineColumns` reads `zodOnly = []` with the `subset` row, and
without it `zodOnly` = `accept, autofill, computed, displayField, expr,
idField, multiple, options, prefix, readonlyWhen, reference, required,
requiredWhen, scale, step, type`.
- `object.activityMilestones`, `object.publicSharing` and
`object.userActions` read `formOnly = [] · retired = [] · zodOnly = []`
with or without any row of their own.
## Pins moved (measured, mechanical)
| file | pin | from → to | why |
|:--|:--|:--|:--|
| `object-collapsed-sections-echo-decisions.test.ts` | collapsed-section
leaves / `advanced` | 69 → 105 / 60 → 96 | three new Advanced rows with
fifteen sub-rows: 18 rows, 36 leaves |
| `object-lifecycle-panel-echo-decisions.test.ts` | translated `.label`
control, per locale | 634 → 657 | 23 new row labels |
| `field-panel-echo-decisions.test.ts` | the field form's repeater row
properties / walked parents | 6 → 10 / `['options']` → `['options',
'inlineColumns']` | the new `inlineColumns` repeater and its four
children, all translated |
| `packages/lint/src/validate-predicate-path-refs.test.ts` (admitted by
the claim's 17:27Z amendment) | predicates / literal comparisons | 81 →
82 / 56 → 57 | the one new predicate, `field :: inlineColumns` on
`data.type == 'master_detail'`. Measured, not inferred: the shipped
corpus, keyed `FORM::FIELD::SOURCE`, was enumerated at the merge base
`e956924e` (81 predicates, 56 comparisons) and on this branch (82, 57),
and the difference is exactly that one entry added and none removed |
## Verification
Test runs went through `scripts/pm/os-verify-lock.sh`. The table is the
first round's, at `66b73be5`, and the lint row is the patch round's, at
`16037890`. After the merge and the G2a text correction, these re-ran at
the final head `2bcad436`: `pnpm --filter @objectstack/spec test` `Test
Files 572 passed (572)` · `Tests 16791 passed \| 1 todo (16792)`; `pnpm
--filter @objectstack/platform-objects test` `Test Files 55 passed (55)`
· `Tests 911 passed (911)` (the text change moves no pin); lint
`validate-predicate-path-refs.test.ts` +
`validate-object-field-refs.test.ts` 2 files, 114 passed; `pnpm
check:i18n` OK (9 packages in sync) after the three translated leaves
were authored and a second `--write` left no source-hash row; `pnpm
--filter @objectstack/spec check:generated` `All 15 generated artifacts
are up to date`.
| run | result |
|:--|:--|
| `pnpm --filter @objectstack/spec test` | `Test Files 569 passed (569)`
· `Tests 16698 passed \| 1 todo (16699)` |
| `pnpm --filter @objectstack/spec test:repo` | `Test Files 38 passed
(38)` · `Tests 690 passed (690)` |
| `repeater-item-titles.test.ts` +
`metadata-form-zod-reconciliation.test.ts` |
`repeater-item-titles.test.ts` 29 +
`metadata-form-zod-reconciliation.test.ts` 57: `Test Files 2 passed (2)`
· `Tests 86 passed (86)` |
| `pnpm --filter @objectstack/platform-objects test` | `Test Files 55
passed (55)` · `Tests 911 passed (911)` (before the pin moves: 4 failed,
the three pins above) |
| `pnpm --filter @objectstack/spec typecheck` / platform-objects
`typecheck` | exit 0 both; `check:test-typecheck: OK` (53 file(s) / 251
error(s) / 138 pinned; 1 / 3 / 2) |
| `pnpm check:i18n` | `check-i18n-bundles: OK (9 package(s) — all
bundles in sync, no undeclared authoring keys)` |
| `pnpm --filter @objectstack/spec check:generated` | `All 15 generated
artifacts are up to date` |
| metadata-protocol `src/protocol.meta-types-*.test.ts` | 4 files, 58
passed |
| cli unit `test/i18n-coverage.test.ts`,
`test/i18n-duplicate-demand.test.ts` | 2 files, 27 passed |
| lint `src/validate-predicate-path-refs.test.ts` at `16037890` | `Test
Files 1 passed (1)` · `Tests 54 passed (54)` (2 failed before the pin
move, the two pins above) |
Catalogues: `node scripts/check-i18n-bundles.mjs --write` regenerated
the 46 `en` leaves (23 rows, a label and a help text each). The 138
translated leaves were then authored in zh-CN, ja-JP and es-ES, with no
`en` echo. A second `--write` kept every translated value and left no
source-hash row.
Gates: `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 87 commands at the final head
`2bcad436` (change set vs merge base `9801da12`, after the merge
`e809f0bd`: the 14 files of this diff). That is the first round's 86
plus `check:docs-transcript-drift`, which the lint test file brings in.
All 87 ran on that head, and each exit code went to disk before it was
read. In every round `pnpm check:dual-build-cjs-loads` first exited 3
(PREREQUISITE NOT MET: nine packages had no `dist/` in the fresh
worktree); later gates in the same run built them, and the rerun exited
0 (`104 published require entry point(s) across 66 package(s) load`),
which is the code `ran.list` records. `--ran` reports: `87 derived
famil(ies) accounted for — 87 run, 0 NOT-MEASURED (a DERIVED zero — all
87 recorded an exit code and none of them is 3)`.
Reach probe (built `@objectstack/spec` and `@objectstack/lint` of this
tree, never committed): an object with `activityMilestones: [{ field:
'statsu', … summary: 'Done: {titel}' }]` and
`publicSharing.redactFields: ['titel']`, and a child `master_detail`
field with `inlineColumns: [{ name: 'quantiy' }]`.
`ObjectSchema.safeParse` and `FieldSchema.safeParse` both succeed. The
reference-integrity suite, which the publish door and `os validate` run,
returns exactly one finding, `object-field-ref-unknown @
objects[0].publicSharing.redactFields[0]` (the lit control), and none
for the milestone field, the token or the column.
## Acceptance notes
- **`activityMilestones[].type`'s describe says the default is
"completed".** The runtime writes `updated`: the update branch's
`activityTypeFor('update')`, replaced only by a milestone that names a
type. The help text states the runtime. The showcase milestone names
`type: 'completed'` explicitly, so no measured author relies on the
describe. Carrier: none.
- **The `public` audience's TSDoc (`object.zod.ts`) says "search engines
may index; no token check".** `resolveToken` has no branch for `public`:
it redeems like `link_only`, token required. The option label says only
"Public", and the help text says every audience needs the link. Carrier:
none.
- **`maxExpiryDays` does not force an expiry.** A link created without
one never expires. That matches the key's describe ("Reject links with
expiry beyond this many days"), and the help text says it outright.
Whether a capped object should require an expiry is a product question.
Carrier: none.
- **An untouched `userActions` switch reads off** even where the
`managedBy` default offers the entry, a switch having no unset state.
The composite's help text names the defaults. Carrier: none.
- **Existing object-form rows named `field` meet the same `field-ref`
convention.** `lifecycle.ttl.field` has `type: 'text'` and no `widget`,
so by the reading above it renders the "None"-only picker on an object
draft. This is a code reading at `dd3f7e1b`, not browser-run, and it is
outside this flight's rows. (`fields.summaryOperations.field` sits
inside the `fields` row, which the Studio object page hides as
canvas-owned.) Carrier: none.
- **Concurrency.** `origin/main` was merged once, with
`scripts/pm/os-regen-merge.sh`, at `9801da12` (`e809f0bd`), because
#20456's `e967cbd2` edited three `view` `why` texts in the
reconciliation ledger. It merged without conflict, `main`'s side was
taken for every generated artifact it moved, and `check:generated` then
read all 15 up to date. `origin/main` has moved since (to `3062e500`),
not onto a file of this diff. Seat 2's #20475 regenerates
`en.metadata-forms.generated.ts` too and is not on `main` yet: ordinary
concurrency.
- **G2a's `indexes.fields` help text went stale when #20479 landed, and
is corrected here** (Status, second paragraph), under the claim's 17:51Z
amendment. No other G2a row changes.
## Out-of-scope finding (folded into #20432 by the seat; not filed by
this run)
- **class c · reach: the save door and the publish door, measured (probe
above).** `activityMilestones[].field` and `inlineColumns[].name` name
fields of the owning object, and no authoring door judges them. A
misspelt milestone field silently never fires, and a misspelt column
renders as plain text. `validate-object-field-refs` leaves the first out
by name. Its extension #20479, landed as `4b2d9041`, reaches four
field-level lists and `indexes[].fields`, but neither of these.
- Dedupe words: `activityMilestones field unknown` · `inlineColumns name
unknown field` · `milestone never fires misspelt field` · `inline grid
column reference integrity`.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 45f428d commit 19e58e2
14 files changed
Lines changed: 628 additions & 42 deletions
File tree
- .changeset
- packages
- lint/src
- platform-objects/src/apps/translations
- spec/src
- data
- system
| 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 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
605 | 605 | | |
606 | 606 | | |
607 | 607 | | |
608 | | - | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
609 | 618 | | |
610 | 619 | | |
611 | 620 | | |
| |||
701 | 710 | | |
702 | 711 | | |
703 | 712 | | |
704 | | - | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
705 | 717 | | |
706 | 718 | | |
707 | 719 | | |
| |||
Lines changed: 93 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
293 | 293 | | |
294 | 294 | | |
295 | 295 | | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
296 | 316 | | |
297 | 317 | | |
298 | 318 | | |
| |||
307 | 327 | | |
308 | 328 | | |
309 | 329 | | |
310 | | - | |
| 330 | + | |
311 | 331 | | |
312 | 332 | | |
313 | 333 | | |
| |||
333 | 353 | | |
334 | 354 | | |
335 | 355 | | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
336 | 384 | | |
337 | 385 | | |
338 | 386 | | |
339 | 387 | | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
340 | 412 | | |
341 | 413 | | |
342 | 414 | | |
| |||
622 | 694 | | |
623 | 695 | | |
624 | 696 | | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
| 707 | + | |
| 708 | + | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
625 | 717 | | |
626 | 718 | | |
627 | 719 | | |
| |||
0 commit comments