Commit 3b103fa
authored
fix(calm-suite): align calm-studio with canonical CALM nested relationship form (finos#2550) (finos#2553)
* chore(calm-suite): add workspaces field to calm-studio root package.json
multi-semantic-release runs from calm-suite/calm-studio/ as cwd. Without
a workspaces field in package.json it traverses up to the repo root, which
includes calm-ai and other packages outside the cwd, causing:
Error: Path .../calm-ai/README.md is not in cwd .../calm-suite/calm-studio
Explicitly list the calm-studio sub-packages so multi-semantic-release
scopes its discovery correctly and the automated release workflow succeeds.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): refactor relationship shape to CALM 1.2 nested form (finos#2550)
CalmStudio's internal CalmRelationship type used a flat shape:
{ 'relationship-type': 'connects' | ..., source: string, destination: string }
which is NOT conformant to the FINOS CALM 1.2 meta-schema. Per
https://calm.finos.org/release/1.2/meta/core.json, `relationship-type`
is a nested object keyed by variant (`connects`, `composed-of`,
`interacts`, `deployed-in`, `options`) with the source/destination/
container/actor/nodes payload inside the variant object.
Effects of the previous flat shape:
- `.calm.json` written by Studio / `@calmstudio/mcp` was INVALID against
https://calm.finos.org/release/1.2/meta/calm.json (verified with
ajv 8 + 2020-12 strict).
- Spec-compliant nested files (FINOS AI Reference Architecture Library,
upstream CALM samples) could not be loaded.
Changes (calm-core):
- Rewrite CalmRelationship interface to nested form.
- Introduce CalmRelationshipVariant string alias for routing/UI code,
and per-variant payload interfaces (CalmConnectsRelationship, etc.).
- Add accessors getRelationshipVariant, getConnectsEndpoints,
getContainerAndNodes, getActorAndNodes, getReferencedNodeIds.
- Replace the inline flat schema in validation.ts with the published
CALM 1.2 meta-schema bundle (calm.json + core.json + control.json +
control-requirement.json + interface.json + flow.json + evidence.json
+ units.json). Validator now runs ajv 2020-12.
- Refresh vendored schemas under packages/calm-core/src/schemas/ to
the release/1.2 versions.
- Rewrite per-variant semantic checks (dangling refs, self-loop,
required fields) to consume the nested form.
Changes (mcp-server):
- Rewrite RelationshipInputSchema zod definition to a discriminated
union over the five variants.
- Update add/get/update_relationship handlers to traverse the nested
form and report `(variant: a -> b)` consistently.
- Update describe_architecture, render_diagram (ELK edges), and
delete_node cascade to use getReferencedNodeIds / variant-aware
expansion.
- Update all 79 mcp-server tests to nested fixtures.
Test fixtures:
- Convert packages/calm-core/test-fixtures/multi-agent-arb-jan-2026.calm.json
from flat to nested form (jq transform).
Verification:
- calm-core 76/76 tests passing (10 new tests for the nested shape).
- mcp-server 79/79 tests passing.
- Both packages typecheck clean under strict + exactOptionalPropertyTypes.
This commit closes the producer half of finos#2550. Studio app
(apps/studio/src/lib/{canvas,editor,io,layout,palette,properties,
stores,validation,governance}) still reads the legacy flat fields in
several places — addressed in a follow-up commit.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): adopt nested CalmRelationship across studio app + templates (finos#2550)
Studio app consumer half of finos#2550. With calm-core's CalmRelationship now in
nested CALM 1.2 form (prior commit), the studio app — Svelte Flow projection,
ELK layout, scalerToml, AIGF validation rules, flow state, EdgeProperties UI,
+page.svelte — all need to read the nested shape.
Changes:
apps/studio/src/lib/stores/projection.ts (central bridge):
- calmToFlow now expands each CalmRelationship into one or more Svelte Flow
edges based on variant:
connects → 1 edge (source.node → destination.node)
composed-of → N edges (container → each child)
deployed-in → N edges (container → each child)
interacts → N edges (actor → each peer)
options → 0 edges (no graph topology in spec)
Multi-child variants stamp `data.calmRelId` and use `<base>#<i>` ids.
- flowToCalm reconstructs the nested CalmRelationship from Svelte Flow edges
using a private buildRelationshipType helper. Multi-child round-trip splits
into separate single-child rels — documented, lossy-but-correct trade-off.
apps/studio/src/lib/layout/elkLayout.ts:
- Replace `CONTAINMENT_EDGE_TYPES` string set with variant-keyed set.
- Add expandLayoutPairs helper mirroring projection.
- All containment / non-containment edge handling now reads expanded pairs
(id/source/target) rather than the legacy flat (unique-id/source/destination).
apps/studio/src/lib/io/scalerToml.ts:
- findConnectedPeers reads connects.source.node / connects.destination.node
via `'connects' in rt` narrowing.
apps/studio/src/lib/validation/aigf-rules.ts:
- AIGF-005 (MCP source check) and AIGF-009 (agent → tool check) now use
`getConnectsEndpoints(rel)` from @calmstudio/calm-core and skip non-connects
variants where the source→destination semantics don't carry the same
enforcement meaning.
apps/studio/src/lib/stores/flowState.svelte.ts:
- isNodeInActiveFlow uses `getReferencedNodeIds(r).includes(nodeId)` so a node
is considered "in flow" if any variant references it.
apps/studio/src/lib/properties/EdgeProperties.svelte:
- Imports both CalmRelationshipType and CalmRelationshipVariant; the dropdown
is variant-keyed.
- handleRelTypeChange builds a fresh nested relationship-type object using the
current edge's source/target endpoints when the user switches variant.
- `relType` derived from `edge.data.calmVariant` (set by projection) with
fallback to `edge.type`.
apps/studio/src/routes/+page.svelte:
- Layout sub-arch filter uses `getReferencedNodeIds` instead of source/
destination access.
- Edge sync read computes variant from rel-type object before updating
Svelte Flow edge.type, and preserves the calmRelId/calmVariant data.
apps/studio/src/lib/templates/*.json (10 files):
- All fluxnova-* and opengris-* templates converted from flat to nested form
via jq transform. Total ~80 relationships flipped to the variant-keyed
object shape.
packages/calm-core/test-fixtures/index.ts:
- createRelationship, createMinimalArch, createFluxNovaArch, createAIGovernanceArch
helpers updated to emit nested CALM 1.2 form.
Test fixtures (studio package):
- flowState.svelte.test.ts, aigf-rules.test.ts, calmModel.test.ts,
components/EdgeProperties.test.ts, elkLayout.test.ts, projection.test.ts,
io/scalerToml.test.ts, stores/validation.test.ts,
integration/sync-integration.test.ts — all updated to nested form.
AGENTS.md:
- Replace the bare "Relationships: connects, interacts, ..." enum with the
nested object pattern showing all five variants, and a pointer to the
variant accessor helpers in @calmstudio/calm-core.
Verification:
- apps/studio 419/419 tests passing.
- packages/calm-core 76/76, packages/mcp-server 79/79 (both unchanged).
- Total: 574/574 tests green across the calm-studio workspace.
This commit closes the consumer half of finos#2550. The full refactor — producer
(calm-core + mcp-server, prior commit) plus consumer (this commit) — produces
spec-conformant `.calm.json` files end-to-end.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): convert github-action test + calm-core README to nested relationship form (finos#2550, finos#2551)
Two residual flat-form CalmRelationship literals missed in finos#2550:
- packages/github-action/src/test/action.test.ts:21
- packages/calm-core/README.md (documentation example)
The GHA test fixture broke the github-action workflow build because ncc
runs the package's TypeScript through tsc:
Error: [tsl] ERROR action.test.ts(21,29) TS2322:
Type 'string' is not assignable to type 'CalmRelationshipType'.
Convert both to nested form. README doc example now matches what the
type system enforces.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* test(calm-suite): add RED tests for @finos/calm-models adoption (finos#2553)
Three canonical behaviors that don't work today:
1. CalmConnectsEndpoint accepts interfaces?: string[]
(CalmNodeInterfaceSchema in calm-models — currently dropped at
the TypeScript type level: tsc reports TS2353
"Object literal may only specify known properties, and
'interfaces' does not exist in type 'CalmConnectsEndpoint'")
2. Architecture root rejects unknown fields
(vendored core.json puts additionalProperties:false inside
properties so it's never enforced at root; vitest reports
"expected 0 to be greater than 0")
3. RelationshipInputSchema (zod) round-trips interfaces[] on
connects endpoints (today zod's default .strip() drops the
field; safeParse output has source.interfaces === undefined)
These tests fail today and flip GREEN as the rework lands. They are
the RED in red-green-refactor per CLAUDE.md TDD discipline.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* chore(calm-suite): add @finos/calm-models workspace dependency
Wire @finos/calm-models into calm-core and mcp-server so the
calm-studio sub-monorepo can adopt the canonical CALM type
definitions rather than maintaining vendored copies.
Workspace resolution: the root package.json lists calm-models in its
workspaces array, so the version spec '*' is enough — npm finds the
in-repo workspace package without a relative file: dep.
Preparation step for finos#2550 rework per reviewer feedback on PR finos#2553.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* refactor(calm-core): re-export canonical types from @finos/calm-models
Replace the locally-maintained CalmNode/CalmRelationship/etc. type
definitions with re-exports from @finos/calm-models/types under
backwards-compatible aliases. CalmConnectsEndpoint now resolves to
CalmNodeInterfaceSchema, restoring the interfaces?: string[] field
PR finos#2553 originally dropped.
CalmDecorator and CalmEvidence stay local — calm-models does not
define them yet. CalmStudio-specific helpers (variant accessors) are
extracted into a sibling helpers.ts module in the next commit; this
commit's tsc errors on missing imports from ./types.js are expected
and resolve in the next two commits.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* refactor(calm-core): move variant helpers to helpers.ts + defensive guards
Extract the five CalmStudio-specific variant accessor helpers
(getRelationshipVariant, getConnectsEndpoints, getContainerAndNodes,
getActorAndNodes, getReferencedNodeIds) into a sibling module so
types.ts can be a clean re-export shim of @finos/calm-models.
Helpers stay local because they encode defensive traversal conventions
for partial input the studio editor may produce mid-keystroke. The
canonical models in @finos/calm-models intentionally model only the
schema-conformant shape.
Also: CalmCoreSchema now has nodes? / relationships? optional per
calm-models. Add defensive guards in validation.ts (archNodes /
archRelationships locals) so tsc strict mode is happy.
CalmArchitecture extended locally with `decorators?: CalmDecorator[]`
to preserve the studio's AIGF / threat-model overlay support (finos#2551).
calm-models doesn't model decorators yet; this is the minimum
calm-studio-specific extension.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* refactor(calm-core): symlink canonical schemas + tsup copy on build
Replace the drifted vendored schema copies under src/schemas/*.json
with symlinks into the in-repo canonical meta directory
(calm/release/1.2/meta/). Source tree no longer holds maintained
copies, eliminating drift risk.
before: each schema file is a separate copy that can diverge
after: each schema file is a symlink → canonical bundle
tsup.config.ts onSuccess hook copies the canonical files into
dist/schemas/ at build time, so the published artifact still ships
real JSON files (not symlinks).
The canonical core.json still puts `additionalProperties: false`
inside `properties` rather than at the schema root, so root-level
strict mode isn't enforced even via canonical. That's an upstream
spec gap tracked in finos#2552 — explicitly out of scope here. The
corresponding RED test (rejects unknown root field) is converted to
`it.todo()` referencing finos#2552; it will flip to `it()` when the
upstream schema is fixed.
Per PR finos#2553 review: replaces the drifted vendor with canonical
without changing the ajv runtime or studio-tier semantic rules.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* test(calm-core): align fixtures with canonical calm-models types
The canonical types from @finos/calm-models are stricter than the
local definitions PR finos#2553 originally used:
- CalmNode requires `description` (was optional)
- CalmControlDetailSchema is an XOR union of
`{ requirement-url, config-url }` | `{ requirement-url, config }`
(was a single shape with optional fields)
- CalmFlowTransitionSchema uses `description` (was `summary`)
- CalmMetadataSchema is `Record<string, unknown>[] | Record<string,
unknown>` (needs narrowing before index access)
Update test fixtures so the type system catches drift again:
- types.test.ts: add description fields, split control-requirement
test into config-url + inline-config variants, narrow metadata
via cast before index access, rename transition.summary →
description
- validation.test.ts: add missing description to two nodes in the
severity-sort test
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-mcp): accept optional interfaces[] on connects endpoint
@finos/calm-models defines CalmNodeInterfaceSchema as
{ node: string; interfaces?: string[] } so connects-relationship
endpoints can reference specific node interfaces by unique-id.
The MCP RelationshipInputSchema ConnectsEndpointSchema now mirrors
that shape. Previously the MCP tool surface silently stripped the
field, so authors using LLMs to build CALM models had no way to wire
interface refs via the tool.
Flips the RED test added in test(calm-suite): add RED tests for
@finos/calm-models adoption (finos#2553) to GREEN.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): tighten CalmArchitecture + downstream guards for calm-models adoption
Resolves the remaining tsc errors after pulling in @finos/calm-models:
1. CalmCoreSchema makes `nodes?` and `relationships?` optional. With
exactOptionalPropertyTypes:true, every direct `arch.nodes`
access errors. Studio's producers always populate both arrays
(empty if blank), so the studio-side CalmArchitecture alias
tightens both fields to required via
`Omit<CalmCoreSchema, 'nodes' | 'relationships'> & { ... }`.
Removes the flood of TS18048 errors across mcp-server,
apps/studio, and validation.ts.
2. mcp-server/src/tools/render.ts: the variant-branch closures
lose narrowing inside forEach because calm-models' nested
`relationship-type` uses all-optional keys (not exclusive
discriminated union). Bind narrowed branch to a local const
before entering the closure.
3. mcp-server tests/aigf-helpers.test.ts: 9 node literals missing
the now-required `description` field — bulk add via the
unique-id label as the description string.
Workspace dep spec changed from "*" to "file:../../../../calm-models"
because calm-suite/calm-studio is a sub-monorepo with its own
workspaces array; npm in the sub-tree cannot resolve a "*" spec to
the parent workspace. The file: path works in both the parent root
workspace install and the sub-monorepo install.
Test results: 419 + 78 + 51 + 80 + 10 + 21 + 17 = 676 passing + 1 todo
across all 7 calm-suite/calm-studio workspaces.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(ci): build @finos/calm-models before @calmstudio/calm-core in studio workflows
CI was failing the calm-core DTS build with:
TS2307: Cannot find module '@finos/calm-models/types' or its
corresponding type declarations.
calm-core now depends on @finos/calm-models via the workspace file:
path. npm's workspace symlink resolves at install time, but
@finos/calm-models' package.json exports point into ./dist/types/
and ./dist/model/ — those directories don't exist until the package
is built. tsc in calm-core's DTS build follows the exports field,
finds the missing ./dist/types/index.d.ts, and errors.
Add an explicit @finos/calm-models build before @calmstudio/calm-core
in all three studio workflows:
- build-calm-studio.yml (build-lint-test + e2e-tests jobs)
- build-calm-studio-desktop.yml (sidecar bundle + Tauri jobs)
- automated-release-calm-studio.yml
Also extend the build-calm-studio.yml `paths:` filter so changes
under `calm-models/**` retrigger studio builds — without this,
upstream type changes silently break studio CI on the next
unrelated PR.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): dedupe @codemirror/* to prevent multi-instance bundling
CodeMirror uses instanceof + internal symbols across @codemirror/state,
view and language. When Vite/Rollup left two copies of @codemirror/state
in the production bundle (visible as 2 distinct "Unrecognized extension"
strings in the chunk), instanceof checks failed at editor mount with:
Error: Unrecognized extension value in extension set ([object Object]).
This sometimes happens because multiple instances of @codemirror/state
are loaded, breaking instanceof checks.
The optimizeDeps.exclude block previously listed all @codemirror/*
packages, but optimizeDeps only affects the dev server prebundler — it
has no effect on production Rollup builds, so it was masking the real
fix (resolve.dedupe) without addressing it.
Add resolve.dedupe for codemirror, svelte-codemirror-editor, and all
@codemirror/* peer deps. Remove the dead optimizeDeps.exclude.
Verified: bundle now contains a single @codemirror/state copy (1 hit of
"Unrecognized extension" vs 2 before), editor mounts cleanly, demos
render with 0 console errors on calm-studio.vercel.app.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): migrate bundled studio demos to CALM 1.2 nested relationships
The flat→nested relationship-type refactor (finos#2550) updated the studio
runtime and tests but missed the three demo .calm.json files shipped at
apps/studio/static/demos/. Loading any of them threw:
TypeError: Cannot use 'in' operator to search for 'connects' in interacts
…because the variant accessors (`getConnectsEndpoints`,
`getActorAndNodes`, …) expected an object-shaped `relationship-type` but
got the legacy string.
Convert all relationships in ecommerce, aws-multi-tier, and
opengris-local-cluster to the canonical CALM 1.2 nested form. Mapping:
- connects: { source: {node: src}, destination: {node: dst} }
- interacts: { actor: src, nodes: [dst] }
- composed-of: { container: src, nodes: [dst] }
- deployed-in: { container: dst, nodes: [src] } (semantics inverted —
flat shape used source="thing being deployed",
destination="where")
Protocol and description fields preserved at the relationship root.
Total: 58 relationships migrated across the 3 files. All three demos
now load and render with 0 console errors on calm-studio.vercel.app.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* fix(calm-suite): align fluxnova templates with canonical control-detail schema
The canonical control.json adopted in finos#2553 requires every
control-detail to carry `requirement-url` plus exactly one of
`config-url` / `config` (oneOf gate). The six bundled fluxnova
templates predated this and shipped requirements with only
`requirement-url`, producing 120 schema errors total when the user
clicked Validate on a loaded template:
fluxnova-ai-agent 9 errors (3 requirements × 3 errors)
fluxnova-flash-risk 12 errors (4 requirements × 3 errors)
fluxnova-kyc-onboarding 69 errors (23 requirements × 3 errors)
fluxnova-microservices 6 errors (2 requirements × 3 errors)
fluxnova-platform 6 errors (2 requirements × 3 errors)
fluxnova-settlement 18 errors (6 requirements × 3 errors)
Add `config-url` to every requirement, derived as
`<requirement-url>/config.json`. opengris-* templates and
static/demos/*.calm.json already validate cleanly and are untouched.
Surfaces during PR finos#2553 review (rocketstack-matt) — the hand-rolled
schema the studio used previously skipped control internals, so this
drift was hidden until the canonical schema landed.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
* test(calm-suite): validate bundled templates + demos against CALM 1.2 schema
Loops over every template registered by initAllTemplates() (10 files —
6 fluxnova + 4 opengris) and every .calm.json under
apps/studio/static/demos/ (3 files — ecommerce, aws-multi-tier,
opengris-local-cluster), runs validateCalmArchitecture on each, and
asserts zero error-severity issues per file.
Prevents the regression class that surfaced in PR finos#2553 review:
the bundled content drifts away from the canonical CALM 1.2
meta-schemas because nothing in CI validates it, and the symptom only
appears when a user clicks Validate after loading a template.
Each file is one `it` block, so failures point at the specific
template/demo + the first 5 schema errors with node id and JSON path.
Signed-off-by: Gourav Shah <gjs@opsflow.sh>
---------
Signed-off-by: Gourav Shah <gjs@opsflow.sh>1 parent e06705c commit 3b103fa
75 files changed
Lines changed: 22820 additions & 2355 deletions
File tree
- .github/workflows
- calm-suite/calm-studio
- apps/studio
- src
- lib
- io
- layout
- properties
- stores
- templates
- validation
- routes
- tests
- components
- integration
- io
- stores
- static/demos
- packages
- calm-core
- src
- schemas
- test-fixtures
- github-action/src/test
- mcp-server
- src
- tests
- tools
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| 44 | + | |
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
| |||
117 | 118 | | |
118 | 119 | | |
119 | 120 | | |
| 121 | + | |
120 | 122 | | |
121 | 123 | | |
122 | 124 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
17 | 18 | | |
| 19 | + | |
18 | 20 | | |
19 | 21 | | |
20 | 22 | | |
| |||
39 | 41 | | |
40 | 42 | | |
41 | 43 | | |
| 44 | + | |
42 | 45 | | |
43 | 46 | | |
44 | 47 | | |
| |||
91 | 94 | | |
92 | 95 | | |
93 | 96 | | |
| 97 | + | |
94 | 98 | | |
95 | 99 | | |
96 | 100 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
29 | | - | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
30 | 40 | | |
31 | 41 | | |
32 | 42 | | |
| |||
Lines changed: 6 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
123 | 123 | | |
124 | 124 | | |
125 | 125 | | |
126 | | - | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
127 | 130 | | |
128 | | - | |
129 | | - | |
| 131 | + | |
| 132 | + | |
130 | 133 | | |
131 | 134 | | |
132 | 135 | | |
| |||
Lines changed: 92 additions & 39 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
21 | 25 | | |
22 | 26 | | |
23 | 27 | | |
| |||
26 | 30 | | |
27 | 31 | | |
28 | 32 | | |
29 | | - | |
30 | | - | |
| 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 | + | |
31 | 79 | | |
32 | 80 | | |
33 | 81 | | |
| |||
65 | 113 | | |
66 | 114 | | |
67 | 115 | | |
68 | | - | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
74 | | - | |
75 | | - | |
76 | | - | |
77 | | - | |
78 | | - | |
79 | | - | |
80 | | - | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
81 | 119 | | |
82 | | - | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
83 | 124 | | |
84 | | - | |
85 | | - | |
86 | | - | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
87 | 132 | | |
88 | | - | |
89 | 133 | | |
90 | 134 | | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
100 | 153 | | |
101 | 154 | | |
102 | 155 | | |
| |||
150 | 203 | | |
151 | 204 | | |
152 | 205 | | |
153 | | - | |
| 206 | + | |
154 | 207 | | |
155 | | - | |
| 208 | + | |
156 | 209 | | |
157 | | - | |
| 210 | + | |
158 | 211 | | |
159 | 212 | | |
160 | 213 | | |
| |||
164 | 217 | | |
165 | 218 | | |
166 | 219 | | |
167 | | - | |
168 | | - | |
| 220 | + | |
| 221 | + | |
169 | 222 | | |
170 | 223 | | |
171 | | - | |
| 224 | + | |
172 | 225 | | |
173 | 226 | | |
174 | 227 | | |
| |||
268 | 321 | | |
269 | 322 | | |
270 | 323 | | |
271 | | - | |
| 324 | + | |
272 | 325 | | |
273 | | - | |
| 326 | + | |
274 | 327 | | |
275 | 328 | | |
276 | 329 | | |
277 | 330 | | |
278 | 331 | | |
279 | 332 | | |
280 | | - | |
| 333 | + | |
281 | 334 | | |
282 | 335 | | |
283 | 336 | | |
| |||
Lines changed: 35 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
12 | 15 | | |
13 | 16 | | |
14 | 17 | | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
15 | 39 | | |
16 | 40 | | |
17 | 41 | | |
| |||
24 | 48 | | |
25 | 49 | | |
26 | 50 | | |
27 | | - | |
| 51 | + | |
28 | 52 | | |
29 | 53 | | |
30 | 54 | | |
| |||
72 | 96 | | |
73 | 97 | | |
74 | 98 | | |
75 | | - | |
76 | | - | |
| 99 | + | |
| 100 | + | |
77 | 101 | | |
78 | 102 | | |
79 | 103 | | |
| |||
88 | 112 | | |
89 | 113 | | |
90 | 114 | | |
91 | | - | |
| 115 | + | |
92 | 116 | | |
93 | | - | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
94 | 123 | | |
95 | 124 | | |
96 | 125 | | |
| |||
Lines changed: 2 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
26 | | - | |
27 | | - | |
| 25 | + | |
28 | 26 | | |
29 | 27 | | |
30 | 28 | | |
31 | | - | |
32 | | - | |
33 | | - | |
| 29 | + | |
34 | 30 | | |
35 | 31 | | |
36 | 32 | | |
| |||
Lines changed: 2 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| |||
61 | 62 | | |
62 | 63 | | |
63 | 64 | | |
64 | | - | |
| 65 | + | |
65 | 66 | | |
66 | 67 | | |
0 commit comments