From bf19f1e4c0b44084ec33b68ee7ed3f0bddd6e744 Mon Sep 17 00:00:00 2001 From: Adam Wright Date: Fri, 4 Sep 2026 20:56:25 +0000 Subject: [PATCH] fix(pptx): draw inhibition as inhibition, not as activation An adversarial pass over yesterday's PowerPoint work, against the diagram it claims to reproduce. **Arrowheads carried no meaning.** The model had `arrow: boolean` and the exporter turned every true into a filled triangle line end. The diagram draws four heads and three of them say something a triangle does not: catalysis is a hollow circle, positive regulation a hollow green triangle, and negative regulation a bar across the line. So a slide drew inhibition as activation -- a figure asserting the opposite of the pathway. OOXML line ends cannot fix this: they are always filled, always the line's own colour, and there is no bar among them. Arrowheads are now geometry the page computes and the exporter merely spells, which is the same division everything else here follows. R-HSA-109606 exports 129 of them: 84 filled triangles, 17 filled circles, 11 hollow circles, 9 hollow triangles and 8 bars -- and the 8 bars and 20 hollow heads match, one for one, the 8 red and 20 green marks the site's own SVG draws. **Framed exports put shapes off the slide.** Keeping a glyph that crosses the frame is right; keeping the parts of it that fall outside is not. An SVG has a viewBox and never draws them; a slide has nothing of the sort, so a connector spanning the diagram arrived as an object 31 inches off the side of an 11 inch slide. Connectors are now clipped to the frame -- per segment, so one crossing the frame twice comes back as two runs rather than a line joining them through the middle -- glyph boxes are clipped with them, and an arrowhead is drawn only where the end it marks is in view. Both fixtures now assert the invariant that broke: every shape lies inside the extent the page declares. Also: a text run keeps its alpha, and a filled shape with no border no longer asks for a zero-width outline, which PowerPoint draws as a hairline -- on a 16px arrowhead that is most of the arrowhead. RENDER_CACHE_KEY goes to v5. v4 was published this morning and the output has changed again; the second time in one day that a correct build served a stale file, so the note about it now says to treat the key as part of the change. Not defects, though they looked like ones on the way past: the analysis overlay is carried in full -- the colours a run adds are all exported -- and the 69 greys the SVG "draws" and the slide does not carry every one have fill-opacity="0". The instrument that found them ignored opacity. Co-Authored-By: Claude Opus 5 --- .../src/app/render/render-shapes.model.ts | 17 +- .../src/app/render/render.component.ts | 289 +- tools/render/README.md | 6 + tools/render/fixtures/shapes-apoptosis.json | 4192 +++++++++++++++-- .../fixtures/shapes-framed-reaction.json | 996 ++++ tools/render/pptx.mjs | 43 +- tools/render/pptx.spec.mjs | 131 +- tools/render/service.mjs | 11 +- 8 files changed, 5194 insertions(+), 491 deletions(-) create mode 100644 tools/render/fixtures/shapes-framed-reaction.json diff --git a/projects/pathway-browser/src/app/render/render-shapes.model.ts b/projects/pathway-browser/src/app/render/render-shapes.model.ts index 208c38d..c4d87d2 100644 --- a/projects/pathway-browser/src/app/render/render-shapes.model.ts +++ b/projects/pathway-browser/src/app/render/render-shapes.model.ts @@ -51,6 +51,18 @@ export interface RenderNodeShape { dashed: boolean; } +/** + * A polyline, and also the shape every arrowhead is drawn as. + * + * An arrowhead is geometry, not a line decoration. The diagram draws four of + * them and three carry meaning a triangle does not: catalysis is a hollow + * circle, positive regulation a hollow triangle, and negative regulation a bar + * across the line. OOXML's line ends offer `triangle`, `oval`, `stealth`, + * `diamond` and `arrow`, always filled and always the line's own colour -- so a + * tee has no spelling there at all, and an export that reached for the nearest + * line end drew inhibition as activation. Handing over the points instead means + * the exporter needs to know none of that. + */ export interface RenderEdgeShape { kind: 'edge'; id: string; @@ -59,8 +71,9 @@ export interface RenderEdgeShape { points: { x: number; y: number }[]; stroke: ShapeColour; strokeWidth: number; - /** Reactions draw arrowheads; a plain link does not. */ - arrow: boolean; + /** Closed and filled, for an arrowhead; open and stroked, for a connector. */ + closed: boolean; + fill: ShapeColour; /** A broken line, which the diagram uses for the links between glyphs. */ dashed: boolean; } diff --git a/projects/pathway-browser/src/app/render/render.component.ts b/projects/pathway-browser/src/app/render/render.component.ts index 4dec3e6..aa7bab9 100644 --- a/projects/pathway-browser/src/app/render/render.component.ts +++ b/projects/pathway-browser/src/app/render/render.component.ts @@ -434,6 +434,21 @@ export class RenderComponent { !framed || (box.x2 >= extent.x1 && box.x1 <= extent.x2 && box.y2 >= extent.y1 && box.y1 <= extent.y2); + // Keeping a glyph that merely crosses the frame is right; keeping the parts + // of it that fall outside is not. An SVG has a viewBox and simply does not + // draw them, and a slide has nothing of the sort -- a connector that ran the + // width of the diagram arrived as an object sitting 31 inches off the side + // of an 11 inch slide, which is what a reader would find when they opened it. + const clipBox = (box: { x1: number; y1: number; x2: number; y2: number }) => + framed + ? { + x1: Math.max(box.x1, extent.x1), + y1: Math.max(box.y1, extent.y1), + x2: Math.min(box.x2, extent.x2), + y2: Math.min(box.y2, extent.y2), + } + : box; + // toArray() rather than iterating the collection: a cytoscape collection is // array-like without being an array, and its filter hands back the loose // element type rather than a node. @@ -448,9 +463,11 @@ export class RenderComponent { const nodeUnderlays: RenderNodeShape[] = []; const edges: RenderEdgeShape[] = []; const edgeUnderlays: RenderEdgeShape[] = []; + const arrowheads: (RenderNodeShape | RenderEdgeShape)[] = []; for (const node of visible) { - const box = node.boundingBox({ includeLabels: false, includeOverlays: false }); + const box = clipBox(node.boundingBox({ includeLabels: false, includeOverlays: false })); + if (box.x2 <= box.x1 || box.y2 <= box.y1) continue; const label = String(node.data('displayName') ?? '').trim(); const under = this.underlay(node); if (under) { @@ -458,10 +475,14 @@ export class RenderComponent { kind: 'node', id: `${node.id()}-underlay`, name: `${label || node.id()} highlight`, - x: box.x1 - under.padding, - y: box.y1 - under.padding, - w: box.w + 2 * under.padding, - h: box.h + 2 * under.padding, + x: Math.max(box.x1 - under.padding, framed ? extent.x1 : -Infinity), + y: Math.max(box.y1 - under.padding, framed ? extent.y1 : -Infinity), + w: + Math.min(box.x2 + under.padding, framed ? extent.x2 : Infinity) - + Math.max(box.x1 - under.padding, framed ? extent.x1 : -Infinity), + h: + Math.min(box.y2 + under.padding, framed ? extent.y2 : Infinity) - + Math.max(box.y1 - under.padding, framed ? extent.y1 : -Infinity), geom: this.geometryOf(String(node.style('shape') ?? '')), fill: under.colour, stroke: null, @@ -480,8 +501,8 @@ export class RenderComponent { name: label || String(node.data('schemaClass') ?? node.id()), x: box.x1, y: box.y1, - w: box.w, - h: box.h, + w: box.x2 - box.x1, + h: box.y2 - box.y1, geom: this.geometryOf(String(node.style('shape') ?? '')), fill: this.colour(node.style('background-color'), node.style('background-opacity')), stroke: this.colour(node.style('border-color'), node.style('border-opacity')), @@ -501,34 +522,58 @@ export class RenderComponent { .filter((edge) => within(edge.boundingBox()))) { // Bend points are how the diagram's orthogonal routing is stored; without // them every connector exports as a straight diagonal. - const points = [edge.sourceEndpoint(), ...this.bendPoints(edge), edge.targetEndpoint()]; + const whole = [edge.sourceEndpoint(), ...this.bendPoints(edge), edge.targetEndpoint()].map( + (point) => ({ x: point.x, y: point.y }) + ); + // Unframed, this is the polyline itself; framed, only the parts in view. + const runs = framed ? this.clipRuns(whole, extent) : [whole]; + if (!runs.length) continue; + const points = whole; const width = this.pixels(edge.style('width')) || 1; const under = this.underlay(edge); if (under) { - edgeUnderlays.push({ - kind: 'edge', - id: `${edge.id()}-underlay`, - name: `${String(edge.data('schemaClass') ?? 'connector')} highlight`, - points: points.map((point) => ({ x: point.x, y: point.y })), - stroke: under.colour, - // Cytoscape pads an underlay outwards from the line, so the band is - // the line plus that padding on each side. - strokeWidth: width + 2 * under.padding, - arrow: false, - dashed: false, + // One band per run, or a connector clipped into two pieces keeps its + // tint on the first and loses it on the rest. + runs.forEach((run, at) => { + edgeUnderlays.push({ + kind: 'edge', + id: at === 0 ? `${edge.id()}-underlay` : `${edge.id()}-underlay-${at}`, + name: `${String(edge.data('schemaClass') ?? 'connector')} highlight`, + points: run, + stroke: under.colour, + // Cytoscape pads an underlay outwards from the line, so the band is + // the line plus that padding on each side. + strokeWidth: width + 2 * under.padding, + closed: false, + fill: null, + dashed: false, + }); }); } - edges.push({ - kind: 'edge', - id: String(edge.id()), - name: String(edge.data('schemaClass') ?? 'connector'), - points: points.map((point) => ({ x: point.x, y: point.y })), - stroke: this.colour(edge.style('line-color'), edge.style('opacity')), - strokeWidth: width, - arrow: String(edge.style('target-arrow-shape') ?? 'none') !== 'none', - dashed: this.dashed(edge.style('line-style')), + const stroke = this.colour(edge.style('line-color'), edge.style('opacity')); + const dashed = this.dashed(edge.style('line-style')); + runs.forEach((run, at) => { + edges.push({ + kind: 'edge', + id: at === 0 ? String(edge.id()) : `${edge.id()}-${at}`, + name: String(edge.data('schemaClass') ?? 'connector'), + points: run, + stroke, + strokeWidth: width, + closed: false, + fill: null, + dashed, + }); }); + + // The arrowhead is drawn after its line, so it sits on top of it -- and + // only when the end it marks is in view. + const tip = points[points.length - 1]; + const showsTip = + !framed || + (tip.x >= extent.x1 && tip.x <= extent.x2 && tip.y >= extent.y1 && tip.y <= extent.y2); + if (showsTip) arrowheads.push(...this.arrowhead(edge, points, width)); } return { @@ -544,7 +589,14 @@ export class RenderComponent { // The underlays are how the diagram tints an event by the sub-pathway it // belongs to, and each sits immediately behind the glyph it marks -- so // they go in front of the compartments and behind everything else. - shapes: [...compartments, ...edgeUnderlays, ...edges, ...nodeUnderlays, ...nodes], + shapes: [ + ...compartments, + ...edgeUnderlays, + ...edges, + ...arrowheads, + ...nodeUnderlays, + ...nodes, + ], }; } @@ -625,6 +677,185 @@ export class RenderComponent { return null; } + /** + * A polyline cut down to a rectangle, as the runs that survive. + * + * Liang-Barsky per segment. A connector crossing the frame twice comes back + * as two runs rather than one line joining them through the middle, which is + * what naive clipping to the endpoints would draw. + */ + private clipRuns( + points: { x: number; y: number }[], + box: { x1: number; y1: number; x2: number; y2: number } + ): { x: number; y: number }[][] { + const runs: { x: number; y: number }[][] = []; + let run: { x: number; y: number }[] = []; + + const near = (a: { x: number; y: number }, b: { x: number; y: number }) => + Math.abs(a.x - b.x) < 0.01 && Math.abs(a.y - b.y) < 0.01; + + for (let at = 0; at < points.length - 1; at++) { + const from = points[at]; + const to = points[at + 1]; + const dx = to.x - from.x; + const dy = to.y - from.y; + let enter = 0; + let leave = 1; + let inside = true; + + for (const [p, q] of [ + [-dx, from.x - box.x1], + [dx, box.x2 - from.x], + [-dy, from.y - box.y1], + [dy, box.y2 - from.y], + ]) { + if (p === 0) { + // Parallel to this edge: outside it means the whole segment is out. + if (q < 0) { + inside = false; + break; + } + continue; + } + const at2 = q / p; + if (p < 0) enter = Math.max(enter, at2); + else leave = Math.min(leave, at2); + } + if (!inside || enter > leave) { + if (run.length > 1) runs.push(run); + run = []; + continue; + } + + const start = { x: from.x + dx * enter, y: from.y + dy * enter }; + const end = { x: from.x + dx * leave, y: from.y + dy * leave }; + if (!run.length) run.push(start); + else if (!near(run[run.length - 1], start)) { + if (run.length > 1) runs.push(run); + run = [start]; + } + run.push(end); + // A segment that left the box ends the run. + if (leave < 1) { + runs.push(run); + run = []; + } + } + + if (run.length > 1) runs.push(run); + return runs; + } + + /** + * The mark at the target end of a connector, as geometry. + * + * The diagram uses four, and three of them mean something a triangle does + * not: catalysis is a hollow circle, positive regulation a hollow triangle, + * and negative regulation a bar across the line. Exporting them all as a + * filled triangle drew inhibition as activation, which is a figure that says + * the opposite of what the pathway does. + * + * Built here rather than in the exporter because it is diagram geometry -- + * where the line ends, which way it points -- and because OOXML's own line + * ends cannot express a bar, a hollow head, or a colour of their own. + */ + private arrowhead( + edge: cytoscape.EdgeSingular, + points: { x: number; y: number }[], + width: number + ): (RenderNodeShape | RenderEdgeShape)[] { + const shape = String(edge.style('target-arrow-shape') ?? 'none'); + if (shape === 'none' || points.length < 2) return []; + + const colour = this.colour(edge.style('target-arrow-color'), edge.style('opacity')); + if (!colour) return []; + + const hollow = String(edge.style('target-arrow-fill') ?? 'filled') === 'hollow'; + // Cytoscape scales an arrow by the line's width; measured against the + // exported SVG, a 4px connector carries a 16px head. + const scale = this.pixels(edge.style('arrow-scale')) || 1; + const size = Math.max(6, width * 4 * scale); + + const tip = points[points.length - 1]; + const from = points[points.length - 2]; + const run = Math.hypot(tip.x - from.x, tip.y - from.y) || 1; + // Along the line, and across it. + const ax = (tip.x - from.x) / run; + const ay = (tip.y - from.y) / run; + const cx = -ay; + const cy = ax; + + const name = `${String(edge.data('schemaClass') ?? 'connector')} ${shape}`; + const id = `${edge.id()}-arrow`; + + if (shape === 'tee') { + // A bar across the line's end. Its thickness is the line's, not the + // head's, or inhibition on a hairline connector becomes a black square. + return [ + { + kind: 'edge', + id, + name, + points: [ + { x: tip.x + cx * (size / 2), y: tip.y + cy * (size / 2) }, + { x: tip.x - cx * (size / 2), y: tip.y - cy * (size / 2) }, + ], + stroke: colour, + strokeWidth: Math.max(width, size / 4), + closed: false, + fill: null, + dashed: false, + }, + ]; + } + + if (shape === 'circle') { + // Centred where the line stops, which is how cytoscape seats it. + return [ + { + kind: 'node', + id, + name, + x: tip.x - ax * (size / 2) - size / 2, + y: tip.y - ay * (size / 2) - size / 2, + w: size, + h: size, + geom: 'ellipse', + fill: hollow ? null : colour, + stroke: colour, + strokeWidth: hollow ? Math.max(1, width) : 0, + label: '', + fontSize: 0, + fontColor: null, + bold: false, + dashed: false, + }, + ]; + } + + // Everything else is a triangle: the tip on the line's end, the base back + // along it. `stealth`, `diamond` and the rest do not occur in this diagram, + // and a triangle is the honest approximation if one ever does. + const base = { x: tip.x - ax * size, y: tip.y - ay * size }; + return [ + { + kind: 'edge', + id, + name, + points: [ + { x: tip.x, y: tip.y }, + { x: base.x + cx * (size / 2), y: base.y + cy * (size / 2) }, + { x: base.x - cx * (size / 2), y: base.y - cy * (size / 2) }, + ], + stroke: colour, + strokeWidth: hollow ? Math.max(1, width) : 0, + closed: true, + fill: hollow ? null : colour, + dashed: false, + }, + ]; + } + /** * The band the diagram draws behind a glyph, if it draws one. * diff --git a/tools/render/README.md b/tools/render/README.md index a771927..452b591 100644 --- a/tools/render/README.md +++ b/tools/render/README.md @@ -82,6 +82,12 @@ diagram looks like. R-HSA-109606 comes out as **635 shapes in 32 KB**, against The slide is the size of the diagram, as production's is, so labels land at 5–53pt rather than the 1.65pt that fitting a 5976px diagram onto a 13.3in slide gives. +Arrowheads are geometry rather than OOXML line ends. The diagram draws four and +three of them mean something a triangle does not — catalysis is a hollow circle, +positive regulation a hollow triangle, negative regulation a bar across the line +— while a line end is always filled and always the line's own colour, and has no +spelling for a bar at all. Drawn as line ends, inhibition came out as activation. + Two things a slide of shapes does not carry yet: - **Node decorations.** The style draws them with `background-image` — 140 small diff --git a/tools/render/fixtures/shapes-apoptosis.json b/tools/render/fixtures/shapes-apoptosis.json index f080086..0655b49 100644 --- a/tools/render/fixtures/shapes-apoptosis.json +++ b/tools/render/fixtures/shapes-apoptosis.json @@ -132,7 +132,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -155,7 +156,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -178,7 +180,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -197,7 +200,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -216,7 +220,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -239,7 +244,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -262,7 +268,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -285,7 +292,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -308,7 +316,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -331,7 +340,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -350,7 +360,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -373,7 +384,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -396,7 +408,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -419,7 +432,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -438,7 +452,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -457,7 +472,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -476,7 +492,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -499,7 +516,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -518,7 +536,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -541,7 +560,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -560,7 +580,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -583,7 +604,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -602,7 +624,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -633,7 +656,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -656,7 +680,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -687,7 +712,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -710,7 +736,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -733,7 +760,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -760,7 +788,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -787,7 +816,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -810,7 +840,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -833,7 +864,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -852,7 +884,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -875,7 +908,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -898,7 +932,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -921,7 +956,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -948,7 +984,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -967,7 +1004,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -986,7 +1024,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1005,7 +1044,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1028,7 +1068,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1059,7 +1100,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1078,7 +1120,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1105,7 +1148,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1128,7 +1172,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1151,7 +1196,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1174,7 +1220,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1193,7 +1240,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1212,7 +1260,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1231,7 +1280,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1250,7 +1300,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1269,7 +1320,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1292,7 +1344,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1315,7 +1368,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1334,7 +1388,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1353,7 +1408,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1376,7 +1432,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1399,7 +1456,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1418,7 +1476,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1437,7 +1496,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1456,7 +1516,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1475,7 +1536,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1498,7 +1560,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1521,7 +1584,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1544,7 +1608,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1567,7 +1632,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1590,7 +1656,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1613,7 +1680,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1636,7 +1704,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1659,7 +1728,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1678,7 +1748,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1697,7 +1768,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1716,7 +1788,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1739,7 +1812,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1758,7 +1832,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1777,7 +1852,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1796,7 +1872,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1819,7 +1896,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1838,7 +1916,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1857,7 +1936,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1876,7 +1956,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1895,7 +1976,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1918,7 +2000,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1941,7 +2024,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1964,7 +2048,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -1983,7 +2068,8 @@ ], "stroke": "cc000024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2010,7 +2096,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2033,7 +2120,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2056,7 +2144,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2079,7 +2168,8 @@ ], "stroke": "cccc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2098,7 +2188,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2121,7 +2212,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2140,7 +2232,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2163,7 +2256,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2186,7 +2280,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2205,7 +2300,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2228,7 +2324,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2251,7 +2348,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2274,7 +2372,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2293,7 +2392,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2312,7 +2412,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2335,7 +2436,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2354,7 +2456,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2377,7 +2480,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2396,7 +2500,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2419,7 +2524,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2438,7 +2544,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2457,7 +2564,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2476,7 +2584,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2495,7 +2604,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2514,7 +2624,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2537,7 +2648,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2560,7 +2672,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2579,7 +2692,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2602,7 +2716,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2625,7 +2740,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2644,7 +2760,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2663,7 +2780,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2682,7 +2800,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2705,7 +2824,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2728,7 +2848,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2751,7 +2872,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2774,7 +2896,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2797,7 +2920,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2820,7 +2944,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2843,7 +2968,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2862,7 +2988,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2881,7 +3008,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2904,7 +3032,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2931,7 +3060,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2954,7 +3084,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -2981,7 +3112,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3004,7 +3136,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3023,7 +3156,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3042,7 +3176,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3061,7 +3196,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3080,7 +3216,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3099,7 +3236,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3122,7 +3260,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3141,7 +3280,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3160,7 +3300,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3187,7 +3328,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3210,7 +3352,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3233,7 +3376,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3252,7 +3396,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3271,7 +3416,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3290,7 +3436,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3313,7 +3460,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3336,7 +3484,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3359,7 +3508,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3386,7 +3536,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3405,7 +3556,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3424,7 +3576,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3443,7 +3596,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3466,7 +3620,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3485,7 +3640,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3504,7 +3660,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3527,7 +3684,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3550,7 +3708,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3573,7 +3732,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3592,7 +3752,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3611,7 +3772,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3630,7 +3792,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3653,7 +3816,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3672,7 +3836,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3691,7 +3856,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3710,7 +3876,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3729,7 +3896,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3748,7 +3916,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3767,7 +3936,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3790,7 +3960,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3813,7 +3984,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3836,7 +4008,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3859,7 +4032,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3882,7 +4056,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3905,7 +4080,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3928,7 +4104,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3951,7 +4128,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -3978,7 +4156,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4001,7 +4180,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4024,7 +4204,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4047,7 +4228,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4070,7 +4252,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4093,7 +4276,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4116,7 +4300,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4139,7 +4324,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4158,7 +4344,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4177,7 +4364,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4200,7 +4388,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4219,7 +4408,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4242,7 +4432,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4261,7 +4452,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4280,7 +4472,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4303,7 +4496,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4322,7 +4516,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4341,7 +4536,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4360,7 +4556,8 @@ ], "stroke": "0000cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4379,7 +4576,8 @@ ], "stroke": "00cc0024", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4402,7 +4600,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4425,7 +4624,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4444,7 +4644,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4467,7 +4668,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4490,7 +4692,8 @@ ], "stroke": "cc00cc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4513,7 +4716,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4536,7 +4740,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4559,7 +4764,8 @@ ], "stroke": "00cccc24", "strokeWidth": 44, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4582,7 +4788,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4605,7 +4812,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4628,7 +4836,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4647,7 +4856,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4666,7 +4876,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4689,7 +4900,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4712,7 +4924,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4735,7 +4948,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4758,7 +4972,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4781,7 +4996,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4800,7 +5016,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4823,7 +5040,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4846,7 +5064,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4869,7 +5088,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4888,7 +5108,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4907,7 +5128,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4926,7 +5148,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -4949,7 +5172,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4968,7 +5192,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -4991,7 +5216,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5010,7 +5236,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5033,7 +5260,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5052,7 +5280,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5083,7 +5312,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5106,7 +5336,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5137,7 +5368,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5160,7 +5392,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5183,7 +5416,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5210,7 +5444,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5237,7 +5472,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5260,7 +5496,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5283,7 +5520,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5302,7 +5540,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5325,7 +5564,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5348,7 +5588,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5371,7 +5612,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5398,7 +5640,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5417,7 +5660,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5436,7 +5680,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5455,7 +5700,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5478,7 +5724,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5509,7 +5756,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5528,7 +5776,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5555,7 +5804,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5578,7 +5828,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5601,7 +5852,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5624,7 +5876,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5643,7 +5896,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5662,7 +5916,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5681,7 +5936,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5700,7 +5956,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5719,7 +5976,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5742,7 +6000,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5765,7 +6024,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5784,7 +6044,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5803,7 +6064,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5826,7 +6088,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5849,7 +6112,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -5868,7 +6132,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5887,7 +6152,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5906,7 +6172,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5925,7 +6192,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5948,7 +6216,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5971,7 +6240,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -5994,7 +6264,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6017,7 +6288,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6040,7 +6312,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6063,7 +6336,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6086,7 +6360,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6109,7 +6384,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6128,7 +6404,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6147,7 +6424,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6166,7 +6444,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6189,7 +6468,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6208,7 +6488,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6227,7 +6508,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6246,7 +6528,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6269,7 +6552,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6288,7 +6572,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6307,7 +6592,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6326,7 +6612,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6345,7 +6632,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6368,7 +6656,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6391,7 +6680,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6414,7 +6704,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6433,7 +6724,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6460,7 +6752,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6483,7 +6776,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6506,7 +6800,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6529,7 +6824,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6548,7 +6844,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6571,7 +6868,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6590,7 +6888,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6613,7 +6912,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6636,7 +6936,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6655,7 +6956,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6678,7 +6980,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6701,7 +7004,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6724,7 +7028,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6743,7 +7048,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6762,7 +7068,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6785,7 +7092,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6804,7 +7112,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6827,7 +7136,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6846,7 +7156,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6869,7 +7180,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6888,7 +7200,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6907,7 +7220,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6926,7 +7240,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -6945,7 +7260,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6964,7 +7280,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -6987,7 +7304,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7010,7 +7328,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7029,7 +7348,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7052,7 +7372,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7075,7 +7396,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7094,7 +7416,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7113,7 +7436,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7132,7 +7456,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7155,7 +7480,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7178,7 +7504,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7201,7 +7528,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7224,7 +7552,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7247,7 +7576,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7270,7 +7600,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7293,7 +7624,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7312,7 +7644,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7331,7 +7664,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7354,7 +7688,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7381,7 +7716,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7404,7 +7740,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7431,7 +7768,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7454,7 +7792,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7473,7 +7812,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7492,7 +7832,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7511,7 +7852,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7530,7 +7872,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7549,7 +7892,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7572,7 +7916,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7591,7 +7936,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7610,7 +7956,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7637,7 +7984,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7660,7 +8008,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7683,7 +8032,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7702,7 +8052,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7721,7 +8072,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7740,7 +8092,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7763,7 +8116,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7786,7 +8140,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7809,7 +8164,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7836,7 +8192,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7855,7 +8212,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7874,7 +8232,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7893,7 +8252,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -7916,7 +8276,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7935,7 +8296,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7954,7 +8316,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -7977,7 +8340,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8000,7 +8364,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8023,7 +8388,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8042,7 +8408,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8061,7 +8428,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8080,7 +8448,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8103,7 +8472,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8122,7 +8492,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8141,7 +8512,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8160,7 +8532,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8179,7 +8552,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8198,7 +8572,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8217,7 +8592,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8240,7 +8616,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8263,7 +8640,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8286,7 +8664,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8309,7 +8688,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8332,7 +8712,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8355,7 +8736,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8378,7 +8760,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8401,7 +8784,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8428,7 +8812,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8451,7 +8836,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8474,7 +8860,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8497,7 +8884,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8520,7 +8908,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8543,7 +8932,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8566,7 +8956,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8589,7 +8980,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8608,7 +9000,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8627,7 +9020,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8650,7 +9044,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8669,7 +9064,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8692,7 +9088,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8711,7 +9108,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8730,7 +9128,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8753,7 +9152,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8772,7 +9172,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8791,7 +9192,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8810,7 +9212,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8829,7 +9232,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8852,7 +9256,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8875,7 +9280,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8894,7 +9300,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8917,7 +9324,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8940,7 +9348,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -8963,7 +9372,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -8986,7 +9396,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -9009,7 +9420,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": false, + "closed": false, + "fill": null, "dashed": false }, { @@ -9032,7 +9444,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9051,7 +9464,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9078,7 +9492,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9097,7 +9512,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9120,7 +9536,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9139,7 +9556,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9162,7 +9580,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9189,7 +9608,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9216,7 +9636,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9235,7 +9656,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -9254,7 +9676,8 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": false }, { @@ -9281,7 +9704,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9300,7 +9724,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9323,7 +9748,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9350,7 +9776,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9369,7 +9796,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9392,7 +9820,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9419,7 +9848,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9438,7 +9868,8 @@ ], "stroke": "001f2580", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, "dashed": true }, { @@ -9461,7 +9892,2904 @@ ], "stroke": "001f25", "strokeWidth": 4, - "arrow": true, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2178 --> 2816-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4240, + "y": 1672 + }, + { + "x": 4216, + "y": 1684 + }, + { + "x": 4216, + "y": 1660 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2178 --> 2817-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4182, + "y": 1702 + }, + { + "x": 4155.6, + "y": 1697.1999999999996 + }, + { + "x": 4170, + "y": 1677.9999999999998 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2181 --> 2818-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4698, + "y": 1676 + }, + { + "x": 4674, + "y": 1688 + }, + { + "x": 4674, + "y": 1664 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2819 --| 2181-arrow", + "name": "connector tee", + "points": [ + { + "x": 4581.958649675097, + "y": 1657.9233035011155 + }, + { + "x": 4605.887957327134, + "y": 1656.0825875278813 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2820 --| 2181-arrow", + "name": "connector tee", + "points": [ + { + "x": 4618.296202234586, + "y": 1679.2722838907964 + }, + { + "x": 4603.262815635001, + "y": 1697.9804983258357 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2821 --| 2181-arrow", + "name": "connector tee", + "points": [ + { + "x": 4595.548308975846, + "y": 1699.336879152731 + }, + { + "x": 4575.36901183992, + "y": 1686.3447289419296 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2142 --> 2054-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1472, + "y": 2216 + }, + { + "x": 1446.140409909508, + "y": 2208.8388827441713 + }, + { + "x": 1462.2131397503676, + "y": 2191.0156575741094 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2822 --o 2185-arrow", + "name": "connector circle", + "x": 5588, + "y": 1619.917331319575, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "2860 --> 2822-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5278, + "y": 1672 + }, + { + "x": 5254.176414863925, + "y": 1684.3465295230756 + }, + { + "x": 5253.828625299895, + "y": 1660.349049604985 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2053 --> 2055-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1604, + "y": 2430 + }, + { + "x": 1580.5438988907943, + "y": 2443.031167282892 + }, + { + "x": 1579.501405508163, + "y": 2419.0538194823703 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2841 --> 2311-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4188, + "y": 472 + }, + { + "x": 4200, + "y": 496 + }, + { + "x": 4176, + "y": 496 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --| 2244-arrow", + "name": "connector tee", + "points": [ + { + "x": 4570.770329614269, + "y": 1041.3851648071343 + }, + { + "x": 4548.486889033023, + "y": 1032.471788574636 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --| 2249-arrow", + "name": "connector tee", + "points": [ + { + "x": 5262, + "y": 995 + }, + { + "x": 5238, + "y": 995 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2827 --> 2824-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4276, + "y": 318 + }, + { + "x": 4251.936172948255, + "y": 329.8714880121945 + }, + { + "x": 4252.064513359197, + "y": 305.8718311659202 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2824 --| 2846-arrow", + "name": "connector tee", + "points": [ + { + "x": 4805, + "y": 804 + }, + { + "x": 4805, + "y": 780 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2824 --| 2851-arrow", + "name": "connector tee", + "points": [ + { + "x": 3981.3234472170666, + "y": 1234.4312280821314 + }, + { + "x": 4003.4510177516436, + "y": 1243.7248077066538 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2310 --> 2312-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4370, + "y": 598 + }, + { + "x": 4358, + "y": 574 + }, + { + "x": 4382, + "y": 574 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2312 --| 2841-arrow", + "name": "connector tee", + "points": [ + { + "x": 4207, + "y": 628 + }, + { + "x": 4207, + "y": 652 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2851 --> 2825-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4818, + "y": 358 + }, + { + "x": 4799.02633403899, + "y": 339.0263340389897 + }, + { + "x": 4821.794733192202, + "y": 331.4368676545856 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2828 --> 2826-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5378, + "y": 254 + }, + { + "x": 5353.972973179471, + "y": 265.94579349250625 + }, + { + "x": 5354.027149113678, + "y": 241.94585463908098 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2347 --> 2826-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5484, + "y": 284 + }, + { + "x": 5474.759705792945, + "y": 309.19160500974596 + }, + { + "x": 5458.30253946797, + "y": 291.72272764020323 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2349 --> 2826-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5478, + "y": 284 + }, + { + "x": 5465.788671879645, + "y": 307.89316775852546 + }, + { + "x": 5451.558668920967, + "y": 288.56683815883173 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2350 --> 2826-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5552, + "y": 228 + }, + { + "x": 5569.197611608681, + "y": 207.40286051518427 + }, + { + "x": 5578.796278553062, + "y": 229.39980559605544 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2846 --> 2314-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4824, + "y": 496 + }, + { + "x": 4836, + "y": 520 + }, + { + "x": 4812, + "y": 520 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2313 --> 2315-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4660, + "y": 568 + }, + { + "x": 4633.986885456753, + "y": 561.4183686095398 + }, + { + "x": 4649.657436386419, + "y": 543.240529531126 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2316 --> 2318-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4990, + "y": 322 + }, + { + "x": 4966, + "y": 334 + }, + { + "x": 4966, + "y": 310 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2084 --> 2085-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1666, + "y": 2062 + }, + { + "x": 1689.9999999999998, + "y": 2049.9999999999995 + }, + { + "x": 1690.0000000000002, + "y": 2073.9999999999995 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "3371 --> 3373-arrow", + "name": "connector triangle", + "points": [ + { + "x": 2070, + "y": 692 + }, + { + "x": 2078.4852813742386, + "y": 666.5441558772843 + }, + { + "x": 2095.455844122716, + "y": 683.5147186257614 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "3374 --+ 2144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3772, + "y": 1560 + }, + { + "x": 3769.9806248228238, + "y": 1533.2432789024178 + }, + { + "x": 3792.19375177176, + "y": 1542.3304671997098 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "3375 --+ 2144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3756, + "y": 1560 + }, + { + "x": 3733.6737477739425, + "y": 1545.1158318492949 + }, + { + "x": 3754.51158318493, + "y": 1533.208497328731 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2873 --> 2874-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4820, + "y": 1932 + }, + { + "x": 4808, + "y": 1908 + }, + { + "x": 4832, + "y": 1908 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2875 --> 2876-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3876, + "y": 1950 + }, + { + "x": 3864.732444889634, + "y": 1925.6475421808216 + }, + { + "x": 3888.721433189123, + "y": 1926.3744812202 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2877 --> 2878-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4810, + "y": 1488 + }, + { + "x": 4785.625581727716, + "y": 1499.2199703158135 + }, + { + "x": 4786.399372783979, + "y": 1475.2324475716605 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2366 --o 79-arrow", + "name": "connector circle", + "x": 966, + "y": 2114.082668680425, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2370 --o 321-arrow", + "name": "connector circle", + "x": 166.0790265569492, + "y": 1801.6175423512962, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2370 --o 201-arrow", + "name": "connector circle", + "x": 162.0817579637531, + "y": 1373.80874516225, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "2377 --> 2372-arrow", + "name": "connector triangle", + "points": [ + { + "x": 782, + "y": 3028 + }, + { + "x": 770, + "y": 3004 + }, + { + "x": 794, + "y": 3004 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "321 --> 324-arrow", + "name": "connector triangle", + "points": [ + { + "x": 132, + "y": 2044 + }, + { + "x": 119.71515620808958, + "y": 2020.14454752036 + }, + { + "x": 143.71345570856573, + "y": 2019.8588534786877 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2377 --> 2379-arrow", + "name": "connector triangle", + "points": [ + { + "x": 712, + "y": 2974 + }, + { + "x": 735.6474927882701, + "y": 2961.3194603888983 + }, + { + "x": 736.3329273618432, + "y": 2985.309670463955 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2380 --o 2377-arrow", + "name": "connector circle", + "x": 772, + "y": 2871.917331319575, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "79 --> 81-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1024, + "y": 1958 + }, + { + "x": 1026.9034308699147, + "y": 1984.6752711173406 + }, + { + "x": 1004.4018416280763, + "y": 1976.327907366336 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "83 --> 81-arrow", + "name": "connector triangle", + "points": [ + { + "x": 946, + "y": 1930 + }, + { + "x": 922, + "y": 1942 + }, + { + "x": 922, + "y": 1918 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2016 --> 81-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1034, + "y": 1902 + }, + { + "x": 1023.2237729654993, + "y": 1877.4261738652506 + }, + { + "x": 1047.1933246870992, + "y": 1878.6347226915498 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "84 --o 83-arrow", + "name": "connector circle", + "x": 717.9173313195749, + "y": 1918, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "85 --> 86-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1166, + "y": 2534 + }, + { + "x": 1154.318905362254, + "y": 2509.843178436226 + }, + { + "x": 1178.3168004683716, + "y": 2510.161031351539 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "87 --o 85-arrow", + "name": "connector circle", + "x": 1197.791370675913, + "y": 1891.5924944689255, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "131 --> 89-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1592, + "y": 2582 + }, + { + "x": 1576.891649062812, + "y": 2604.1751602465183 + }, + { + "x": 1565.1948612404724, + "y": 2583.2184153981607 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2053 --> 89-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1606, + "y": 2526 + }, + { + "x": 1580.4543930453378, + "y": 2517.7889120502873 + }, + { + "x": 1597.2415061869729, + "y": 2500.6368616664427 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "88 --> 89-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1508, + "y": 2554 + }, + { + "x": 1484.1363377672708, + "y": 2566.2688884925333 + }, + { + "x": 1483.866691866336, + "y": 2542.2704033093364 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "127 --> 2394-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1168, + "y": 3012 + }, + { + "x": 1193.6140184634914, + "y": 3004.0048728495462 + }, + { + "x": 1189.7645127984579, + "y": 3027.694138480521 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2144 --> 2146-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3872, + "y": 1576 + }, + { + "x": 3848, + "y": 1588 + }, + { + "x": 3848, + "y": 1564 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "127 --> 2408-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1390, + "y": 3032 + }, + { + "x": 1367.267490012995, + "y": 3046.255980839308 + }, + { + "x": 1364.9557093363505, + "y": 3022.367580513981 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "127 --> 121-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1328, + "y": 2950 + }, + { + "x": 1340, + "y": 2974 + }, + { + "x": 1316, + "y": 2974 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "321 --> 2427-arrow", + "name": "connector triangle", + "points": [ + { + "x": 208, + "y": 1876 + }, + { + "x": 183.99999999999997, + "y": 1888 + }, + { + "x": 184.00000000000003, + "y": 1864 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "201 --> 2428-arrow", + "name": "connector triangle", + "points": [ + { + "x": 178, + "y": 1292 + }, + { + "x": 154, + "y": 1304 + }, + { + "x": 154, + "y": 1280 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "124 --> 126-arrow", + "name": "connector triangle", + "points": [ + { + "x": 982, + "y": 3158 + }, + { + "x": 958, + "y": 3170 + }, + { + "x": 958, + "y": 3146 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "291 --> 2431-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1522, + "y": 1282 + }, + { + "x": 1498.1548009437904, + "y": 1294.3047341283645 + }, + { + "x": 1497.8490932635825, + "y": 1270.3066812320512 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "381 --> 2432-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1532, + "y": 1354 + }, + { + "x": 1508.0669114089083, + "y": 1366.1329003330186 + }, + { + "x": 1507.9338265789302, + "y": 1342.133269326938 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "128 --o 127-arrow", + "name": "connector circle", + "x": 1318, + "y": 3190.082668680425, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "2175 --> 2177-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3844, + "y": 822 + }, + { + "x": 3820, + "y": 834 + }, + { + "x": 3820, + "y": 810 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "129 --> 130-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1548, + "y": 2918 + }, + { + "x": 1524, + "y": 2930 + }, + { + "x": 1524, + "y": 2906 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2353 --> 132-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1674, + "y": 2782 + }, + { + "x": 1681.7711931290848, + "y": 2756.3171544148536 + }, + { + "x": 1699.208992345568, + "y": 2772.80724715218 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "131 --> 133-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1580, + "y": 2634 + }, + { + "x": 1555.38728234516, + "y": 2644.6871010869704 + }, + { + "x": 1556.6826885375197, + "y": 2620.7220865283102 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2883 --> 2949-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5166, + "y": 1814 + }, + { + "x": 5142.363162512078, + "y": 1826.7003902920176 + }, + { + "x": 5141.657585273633, + "y": 1802.7107641848731 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "134 --> 135-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1232, + "y": 960 + }, + { + "x": 1209.2620022952067, + "y": 974.2472264099654 + }, + { + "x": 1206.959420249152, + "y": 950.3579376821447 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "136 --> 135-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1232, + "y": 950 + }, + { + "x": 1207.214613508037, + "y": 960.2803023517802 + }, + { + "x": 1208.904526223398, + "y": 936.3398722174977 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2883 --> 2951-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5120, + "y": 1858 + }, + { + "x": 5098.233853704545, + "y": 1842.3081270893226 + }, + { + "x": 5119.493810551268, + "y": 1831.1719592172294 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2185 --> 2186-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5704, + "y": 1698 + }, + { + "x": 5677.187793194495, + "y": 1696.948540909588 + }, + { + "x": 5688.753843189026, + "y": 1675.9193591013484 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "3207 --> 3210-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4062, + "y": 2658 + }, + { + "x": 4050, + "y": 2634 + }, + { + "x": 4074, + "y": 2634 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2185 --> 2187-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5658, + "y": 1218 + }, + { + "x": 5670.313353907908, + "y": 1241.8407490557365 + }, + { + "x": 5646.315413100156, + "y": 1242.1551325597684 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2350 --> 2187-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5658, + "y": 1148 + }, + { + "x": 5646.099275157725, + "y": 1123.950618547903 + }, + { + "x": 5670.099070256312, + "y": 1124.0497912549222 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2187 --o 2244-arrow", + "name": "connector circle", + "x": 4586.200591208251, + "y": 1038.2005912082504, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2187 --o 2249-arrow", + "name": "connector circle", + "x": 5267.2245298643575, + "y": 997.1137484164071, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "138 --> 139-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1536, + "y": 1096 + }, + { + "x": 1512, + "y": 1108 + }, + { + "x": 1512, + "y": 1084 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "140 --> 141-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1236, + "y": 564 + }, + { + "x": 1211.0413163457217, + "y": 573.852111968794 + }, + { + "x": 1213.1431002323977, + "y": 549.9443202578537 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "142 --> 141-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1236, + "y": 570 + }, + { + "x": 1213.3131520632123, + "y": 584.3285355390237 + }, + { + "x": 1210.9250628067084, + "y": 560.4476429739841 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "143 --> 144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1540, + "y": 782 + }, + { + "x": 1516, + "y": 794 + }, + { + "x": 1516, + "y": 770 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2971 --> 2976-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5794, + "y": 2094 + }, + { + "x": 5782, + "y": 2070 + }, + { + "x": 5806, + "y": 2070 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2465 --+ 140-arrow", + "name": "connector triangle", + "points": [ + { + "x": 876, + "y": 514 + }, + { + "x": 870.1791449991281, + "y": 487.80615249607604 + }, + { + "x": 893.462565002616, + "y": 493.62700749694807 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2491 --> 2465-arrow", + "name": "connector triangle", + "points": [ + { + "x": 770, + "y": 400 + }, + { + "x": 745.6926257504729, + "y": 411.3644866621166 + }, + { + "x": 746.3239861205905, + "y": 387.37279259764824 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2977 --> 2979-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3882, + "y": 2154 + }, + { + "x": 3858, + "y": 2166 + }, + { + "x": 3858, + "y": 2142 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "1952 --> 1955-arrow", + "name": "connector triangle", + "points": [ + { + "x": 2508, + "y": 742 + }, + { + "x": 2484, + "y": 754 + }, + { + "x": 2484, + "y": 730 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2981 --> 2983-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4242, + "y": 1320 + }, + { + "x": 4218, + "y": 1332 + }, + { + "x": 4218, + "y": 1308 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "1956 --> 1959-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3052, + "y": 732 + }, + { + "x": 3075.721147188839, + "y": 719.4577842449817 + }, + { + "x": 3076.2664609173185, + "y": 743.4515882980602 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "3239 --> 3240-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3110, + "y": 2686 + }, + { + "x": 3133.9387778785376, + "y": 2673.878328758705 + }, + { + "x": 3134.0606037201587, + "y": 2697.878019558053 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2475 --+ 134-arrow", + "name": "connector triangle", + "points": [ + { + "x": 902, + "y": 1010 + }, + { + "x": 915.5698781468499, + "y": 1033.1486156622734 + }, + { + "x": 891.6230343582912, + "y": 1034.745071914844 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2494 --> 2475-arrow", + "name": "connector triangle", + "points": [ + { + "x": 788, + "y": 1124 + }, + { + "x": 764, + "y": 1136 + }, + { + "x": 764, + "y": 1112 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2483 --+ 142-arrow", + "name": "connector triangle", + "points": [ + { + "x": 876, + "y": 624 + }, + { + "x": 888, + "y": 648 + }, + { + "x": 864, + "y": 648 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2493 --> 2483-arrow", + "name": "connector triangle", + "points": [ + { + "x": 756, + "y": 720 + }, + { + "x": 732, + "y": 732 + }, + { + "x": 732, + "y": 708 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2487 --+ 136-arrow", + "name": "connector triangle", + "points": [ + { + "x": 892, + "y": 908 + }, + { + "x": 880, + "y": 884 + }, + { + "x": 904, + "y": 884 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2490 --> 2487-arrow", + "name": "connector triangle", + "points": [ + { + "x": 758, + "y": 834 + }, + { + "x": 734, + "y": 846 + }, + { + "x": 734, + "y": 822 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2244 --> 2498-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4656, + "y": 1036 + }, + { + "x": 4629.246220717769, + "y": 1033.9420169782902 + }, + { + "x": 4641.594118848028, + "y": 1013.362186761189 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2347 --> 2499-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4578, + "y": 818 + }, + { + "x": 4551.254231285743, + "y": 820.1595962315859 + }, + { + "x": 4560.224861786178, + "y": 797.8991427675461 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2244 --> 2499-arrow", + "name": "connector triangle", + "points": [ + { + "x": 4626, + "y": 874 + }, + { + "x": 4638, + "y": 898 + }, + { + "x": 4614, + "y": 898 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2249 --> 2252-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5410, + "y": 990 + }, + { + "x": 5384.199605092974, + "y": 997.3715414020074 + }, + { + "x": 5388.622529934179, + "y": 973.7826089155836 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "201 --> 204-arrow", + "name": "connector triangle", + "points": [ + { + "x": 128, + "y": 1198 + }, + { + "x": 140, + "y": 1222 + }, + { + "x": 116, + "y": 1222 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2349 --> 2253-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5282, + "y": 842 + }, + { + "x": 5255.448743301986, + "y": 845.876953411657 + }, + { + "x": 5262.967683251865, + "y": 823.0851666885828 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2249 --> 2253-arrow", + "name": "connector triangle", + "points": [ + { + "x": 5346, + "y": 898 + }, + { + "x": 5358, + "y": 922 + }, + { + "x": 5334, + "y": 922 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2051 --> 2017-arrow", + "name": "connector triangle", + "points": [ + { + "x": 760, + "y": 1618 + }, + { + "x": 785.1905057909098, + "y": 1627.2432904313418 + }, + { + "x": 767.7196711294723, + "y": 1643.6983788915331 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2016 --> 2018-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1140, + "y": 1664 + }, + { + "x": 1116, + "y": 1676 + }, + { + "x": 1116, + "y": 1652 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2531 --+ 2144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3746, + "y": 1570 + }, + { + "x": 3719.42109271873, + "y": 1573.6826196835495 + }, + { + "x": 3727.1065598843984, + "y": 1550.9464459851138 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2531 --+ 2175-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3768, + "y": 836 + }, + { + "x": 3763.919877594492, + "y": 862.5207956358038 + }, + { + "x": 3744.335290048052, + "y": 848.6483794570756 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2786 --> 2788-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1766, + "y": 686 + }, + { + "x": 1752.5485231068856, + "y": 662.7823823488712 + }, + { + "x": 1776.5032079850344, + "y": 661.3082478948312 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2019 --> 2020-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1564, + "y": 1670 + }, + { + "x": 1539.7475429884573, + "y": 1681.481216351209 + }, + { + "x": 1540.2635527121072, + "y": 1657.4867642014913 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2021 --> 2022-arrow", + "name": "connector triangle", + "points": [ + { + "x": 1606, + "y": 1454 + }, + { + "x": 1617.2892358151269, + "y": 1478.3424147263672 + }, + { + "x": 1593.2996097079824, + "y": 1477.6368374879216 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2791 --+ 2786-arrow", + "name": "connector triangle", + "points": [ + { + "x": 952, + "y": 280 + }, + { + "x": 940, + "y": 256 + }, + { + "x": 964, + "y": 256 + } + ], + "stroke": "0c9509", + "strokeWidth": 4, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "321 --> 2793-arrow", + "name": "connector triangle", + "points": [ + { + "x": 190, + "y": 1956 + }, + { + "x": 166, + "y": 1944 + }, + { + "x": 185.2, + "y": 1929.6 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "3058 --o 2883-arrow", + "name": "connector circle", + "x": 5042.881903101013, + "y": 1848.0632955480437, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": null, + "stroke": "0c9509", + "strokeWidth": 4, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "201 --> 2813-arrow", + "name": "connector triangle", + "points": [ + { + "x": 166, + "y": 1260 + }, + { + "x": 155.37176019458406, + "y": 1284.6381922761914 + }, + { + "x": 139.91250229579742, + "y": 1266.2803235213821 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2436-arrow", + "name": "connector circle", + "x": 2205.9821462335735, + "y": 856.3878238577374, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2532-arrow", + "name": "connector circle", + "x": 3438.22111262668, + "y": 1089.4798269499029, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2437-arrow", + "name": "connector circle", + "x": 2206.0522542006343, + "y": 882.3240092193436, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2533-arrow", + "name": "connector circle", + "x": 3499.801907544541, + "y": 1120.493704274949, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2789-arrow", + "name": "connector circle", + "x": 1881.84861353803, + "y": 688.9428572251769, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2438-arrow", + "name": "connector circle", + "x": 2206.0816472665365, + "y": 849.4362516283661, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2790-arrow", + "name": "connector circle", + "x": 1828.9442302073269, + "y": 667.3344375196442, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2439-arrow", + "name": "connector circle", + "x": 2205.9301269046146, + "y": 861.283218818022, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2440-arrow", + "name": "connector circle", + "x": 2205.917331319575, + "y": 866, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "3688-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3932, + "y": 1430 + }, + { + "x": 3956.199914079815, + "y": 1418.4084445163912 + }, + { + "x": 3955.7931928347757, + "y": 1442.4049979736865 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "2382-arrow", + "name": "connector triangle", + "points": [ + { + "x": 686, + "y": 2778 + }, + { + "x": 661.8095979226099, + "y": 2789.6113929971475 + }, + { + "x": 662.1966443558482, + "y": 2765.6145141363763 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2450-arrow", + "name": "connector circle", + "x": 2996.774304765681, + "y": 937.8039834669643, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2451-arrow", + "name": "connector circle", + "x": 2514.0786852726683, + "y": 870.3999738102125, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2452-arrow", + "name": "connector circle", + "x": 2975.971344866005, + "y": 893.4719221620784, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2453-arrow", + "name": "connector circle", + "x": 3013.0873092069705, + "y": 938.7545324260818, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2454-arrow", + "name": "connector circle", + "x": 2976.0934984837972, + "y": 900.6542002021604, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2455-arrow", + "name": "connector circle", + "x": 2976.6220902990126, + "y": 921.273537422652, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2973-arrow", + "name": "connector circle", + "x": 5806.082668680425, + "y": 1852, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2974-arrow", + "name": "connector circle", + "x": 5638.7034148551775, + "y": 1809.795014764555, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "3678-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3902, + "y": 1360 + }, + { + "x": 3927.800394907026, + "y": 1352.6284585979924 + }, + { + "x": 3923.3774700658214, + "y": 1376.2173910844162 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", "dashed": false }, { diff --git a/tools/render/fixtures/shapes-framed-reaction.json b/tools/render/fixtures/shapes-framed-reaction.json new file mode 100644 index 0000000..a3f3e67 --- /dev/null +++ b/tools/render/fixtures/shapes-framed-reaction.json @@ -0,0 +1,996 @@ +{ + "x": 3197.8181818181815, + "y": 992.1363636363637, + "width": 1036.3636363636365, + "height": 647.7272727272727, + "shapes": [ + { + "kind": "node", + "id": "262-outer", + "name": "cytosol", + "x": 3197.8181818181815, + "y": 992.1363636363637, + "w": 1036.3636363636365, + "h": 647.7272727272727, + "geom": "roundRect", + "fill": "e5834a0f", + "stroke": "e5834a", + "strokeWidth": 4, + "label": "cytosol", + "fontSize": 16, + "fontColor": "e5834a", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "262-inner", + "name": "262-inner", + "x": 3197.8181818181815, + "y": 992.1363636363637, + "w": 1036.3636363636365, + "h": 647.7272727272727, + "geom": "roundRect", + "fill": "e5834a0f", + "stroke": "e5834a", + "strokeWidth": 4, + "label": "", + "fontSize": 16, + "fontColor": "e5834a", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "90-outer", + "name": "mitochondrial outer membrane", + "x": 3197.8181818181815, + "y": 992.1363636363637, + "w": 576.1818181818185, + "h": 647.7272727272727, + "geom": "roundRect", + "fill": "e5834a0f", + "stroke": "e5834a", + "strokeWidth": 4, + "label": "mitochondrial outer membrane", + "fontSize": 16, + "fontColor": "e5834a", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "91-outer", + "name": "mitochondrial inner membrane", + "x": 3197.8181818181815, + "y": 1015, + "w": 225.18181818181847, + "h": 624.8636363636365, + "geom": "roundRect", + "fill": "e5834a0f", + "stroke": "e5834a", + "strokeWidth": 4, + "label": "mitochondrial inner membrane", + "fontSize": 16, + "fontColor": "e5834a", + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --- 2828", + "name": "connector", + "points": [ + { + "x": 4146, + "y": 1154 + }, + { + "x": 4062.0000000000005, + "y": 1153.9999999999998 + }, + { + "x": 4060.9256838294455, + "y": 992.1363636363637 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --- 2841", + "name": "connector", + "points": [ + { + "x": 4188, + "y": 1126 + }, + { + "x": 4188, + "y": 992.1363636363637 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --- 2846", + "name": "connector", + "points": [ + { + "x": 4230, + "y": 1166 + }, + { + "x": 4234.181818181818, + "y": 1167.5681818181818 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --- 2851", + "name": "connector", + "points": [ + { + "x": 4162, + "y": 1182 + }, + { + "x": 4075.9999999999995, + "y": 1256 + }, + { + "x": 3986, + "y": 1256 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --- 2981", + "name": "connector", + "points": [ + { + "x": 4180, + "y": 1182 + }, + { + "x": 4138, + "y": 1319.9999999999998 + }, + { + "x": 4190, + "y": 1320 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --| 2244", + "name": "connector", + "points": [ + { + "x": 4230, + "y": 1152 + }, + { + "x": 4234.181818181818, + "y": 1152 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2823 --| 2249", + "name": "connector", + "points": [ + { + "x": 4188, + "y": 1182 + }, + { + "x": 4188, + "y": 1212 + }, + { + "x": 4234.181818181818, + "y": 1211.9130285909946 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2824 --| 2851", + "name": "connector", + "points": [ + { + "x": 4032.7746107483676, + "y": 992.1363636363637 + }, + { + "x": 4034, + "y": 1140 + }, + { + "x": 3992.387232484355, + "y": 1239.0780178943926 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2851 --> 2825", + "name": "connector", + "points": [ + { + "x": 3986, + "y": 1256 + }, + { + "x": 3986.497855917667, + "y": 992.1363636363637 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "3374 --+ 2144", + "name": "connector", + "points": [ + { + "x": 3808, + "y": 1472 + }, + { + "x": 3772, + "y": 1560 + } + ], + "stroke": "0561a6", + "strokeWidth": 8, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "3375 --+ 2144", + "name": "connector", + "points": [ + { + "x": 3656, + "y": 1348 + }, + { + "x": 3636, + "y": 1350 + }, + { + "x": 3756, + "y": 1560 + } + ], + "stroke": "0561a6", + "strokeWidth": 8, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2145 --- 2144", + "name": "connector", + "points": [ + { + "x": 3686, + "y": 1576 + }, + { + "x": 3764, + "y": 1576 + } + ], + "stroke": "0561a6", + "strokeWidth": 8, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2146 --- 2178", + "name": "connector", + "points": [ + { + "x": 3952, + "y": 1606 + }, + { + "x": 4011.517906336089, + "y": 1639.8636363636365 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2144 --> 2146", + "name": "connector", + "points": [ + { + "x": 3764, + "y": 1576 + }, + { + "x": 3872, + "y": 1576 + } + ], + "stroke": "0561a6", + "strokeWidth": 8, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2187 --- 2851", + "name": "connector", + "points": [ + { + "x": 4234.181818181818, + "y": 1256.2502876869964 + }, + { + "x": 4075.9999999999995, + "y": 1256 + }, + { + "x": 3986, + "y": 1256 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2982 --- 2981", + "name": "connector", + "points": [ + { + "x": 4096, + "y": 1320 + }, + { + "x": 4138, + "y": 1320 + }, + { + "x": 4190, + "y": 1320 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2981 --> 2983", + "name": "connector", + "points": [ + { + "x": 4190, + "y": 1320 + }, + { + "x": 4234.181818181818, + "y": 1320 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2531 --+ 2144", + "name": "connector", + "points": [ + { + "x": 3606, + "y": 1124 + }, + { + "x": 3604.0000000000005, + "y": 1522 + }, + { + "x": 3746, + "y": 1570 + } + ], + "stroke": "0561a6", + "strokeWidth": 8, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2531 --+ 2175", + "name": "connector", + "points": [ + { + "x": 3632, + "y": 1028 + }, + { + "x": 3657.403409090909, + "y": 992.1363636363637 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2532", + "name": "connector", + "points": [ + { + "x": 3197.8181818181815, + "y": 1145.8866989990713 + }, + { + "x": 3462.039594137117, + "y": 1099.400525435581 + } + ], + "stroke": "001f2580", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": true + }, + { + "kind": "edge", + "id": "2533", + "name": "connector", + "points": [ + { + "x": 3197.8181818181815, + "y": 1279.0412020412023 + }, + { + "x": 3522.6758164328735, + "y": 1127.4184598977545 + } + ], + "stroke": "001f2580", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": true + }, + { + "kind": "edge", + "id": "3688", + "name": "connector", + "points": [ + { + "x": 4050, + "y": 1432 + }, + { + "x": 3932, + "y": 1430 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "3678", + "name": "connector", + "points": [ + { + "x": 4050, + "y": 1406 + }, + { + "x": 3934, + "y": 1366 + }, + { + "x": 3902, + "y": 1360 + } + ], + "stroke": "001f25", + "strokeWidth": 4, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2824 --| 2851-arrow", + "name": "connector tee", + "points": [ + { + "x": 3981.3234472170666, + "y": 1234.4312280821314 + }, + { + "x": 4003.4510177516436, + "y": 1243.7248077066538 + } + ], + "stroke": "ba1a1a", + "strokeWidth": 6, + "closed": false, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "3374 --+ 2144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3772, + "y": 1560 + }, + { + "x": 3769.3074997637655, + "y": 1524.3243718698902 + }, + { + "x": 3798.9250023623467, + "y": 1536.4406229329463 + } + ], + "stroke": "0c9509", + "strokeWidth": 8, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "3375 --+ 2144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3756, + "y": 1560 + }, + { + "x": 3726.2316636985897, + "y": 1540.1544424657268 + }, + { + "x": 3754.0154442465728, + "y": 1524.277996438308 + } + ], + "stroke": "0c9509", + "strokeWidth": 8, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "edge", + "id": "2144 --> 2146-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3872, + "y": 1576 + }, + { + "x": 3840, + "y": 1592 + }, + { + "x": 3840, + "y": 1560 + } + ], + "stroke": "0561a6", + "strokeWidth": 0, + "closed": true, + "fill": "0561a6", + "dashed": false + }, + { + "kind": "edge", + "id": "2531 --+ 2144-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3746, + "y": 1570 + }, + { + "x": 3710.561456958307, + "y": 1574.9101595780658 + }, + { + "x": 3720.8087465125313, + "y": 1544.595261313485 + } + ], + "stroke": "0c9509", + "strokeWidth": 8, + "closed": true, + "fill": null, + "dashed": false + }, + { + "kind": "node", + "id": "2532-arrow", + "name": "connector circle", + "x": 3438.22111262668, + "y": 1089.4798269499029, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2533-arrow", + "name": "connector circle", + "x": 3499.801907544541, + "y": 1120.493704274949, + "w": 24, + "h": 24, + "geom": "ellipse", + "fill": "001f2580", + "stroke": "001f2580", + "strokeWidth": 0, + "label": "", + "fontSize": 0, + "fontColor": null, + "bold": false, + "dashed": false + }, + { + "kind": "edge", + "id": "3688-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3932, + "y": 1430 + }, + { + "x": 3956.199914079815, + "y": 1418.4084445163912 + }, + { + "x": 3955.7931928347757, + "y": 1442.4049979736865 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "edge", + "id": "3678-arrow", + "name": "connector triangle", + "points": [ + { + "x": 3902, + "y": 1360 + }, + { + "x": 3927.800394907026, + "y": 1352.6284585979924 + }, + { + "x": 3923.3774700658214, + "y": 1376.2173910844162 + } + ], + "stroke": "001f25", + "strokeWidth": 0, + "closed": true, + "fill": "001f25", + "dashed": false + }, + { + "kind": "node", + "id": "2851", + "name": "2851", + "x": 3971, + "y": 1241, + "w": 30, + "h": 30, + "geom": "ellipse", + "fill": "001f25", + "stroke": "001f25", + "strokeWidth": 4, + "label": "", + "fontSize": 16, + "fontColor": "001f25", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2981", + "name": "2981", + "x": 4175, + "y": 1305, + "w": 30, + "h": 30, + "geom": "ellipse", + "fill": "001f25", + "stroke": "001f25", + "strokeWidth": 4, + "label": "", + "fontSize": 16, + "fontColor": "001f25", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2144", + "name": "2144", + "x": 3748, + "y": 1560, + "w": 32, + "h": 32, + "geom": "roundRect", + "fill": "effbff", + "stroke": "0561a6", + "strokeWidth": 6, + "label": "", + "fontSize": 16, + "fontColor": "001f25", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2823", + "name": "XIAP", + "x": 4151, + "y": 1131, + "w": 74, + "h": 46, + "geom": "roundRect", + "fill": "001f29", + "stroke": "000000", + "strokeWidth": 0, + "label": "XIAP", + "fontSize": 6, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "3374", + "name": "GSDMD(1-​275):​cardiolipin", + "x": 3722, + "y": 1393, + "w": 204, + "h": 74, + "geom": "rect", + "fill": null, + "stroke": "000000", + "strokeWidth": 0, + "label": "GSDMD(1-​275):​cardiolipin", + "fontSize": 12, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "3375", + "name": "GSDME:​cardiolipin", + "x": 3660, + "y": 1319, + "w": 236, + "h": 46, + "geom": "rect", + "fill": null, + "stroke": "000000", + "strokeWidth": 0, + "label": "GSDME:​cardiolipin", + "fontSize": 12, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "3674", + "name": "Pyroptosis", + "x": 4054, + "y": 1394, + "w": 176, + "h": 84, + "geom": "rect", + "fill": "006782", + "stroke": "ffffff", + "strokeWidth": 12, + "label": "Pyroptosis", + "fontSize": 12, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2145", + "name": "CYCS", + "x": 3599, + "y": 1555, + "w": 82, + "h": 46, + "geom": "roundRect", + "fill": "001f29", + "stroke": "000000", + "strokeWidth": 0, + "label": "CYCS", + "fontSize": 6, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2146", + "name": "CYCS", + "x": 3877, + "y": 1555, + "w": 82, + "h": 46, + "geom": "roundRect", + "fill": "001f29", + "stroke": "000000", + "strokeWidth": 0, + "label": "CYCS", + "fontSize": 6, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2982", + "name": "SEPT4 dimer", + "x": 3914, + "y": 1301, + "w": 176, + "h": 46, + "geom": "rect", + "fill": null, + "stroke": "000000", + "strokeWidth": 0, + "label": "SEPT4 dimer", + "fontSize": 12, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2496", + "name": "CASP3(1-​277) dimer", + "x": 4214, + "y": 992.1363636363637, + "w": 20.181818181818016, + "h": 60.86363636363626, + "geom": "rect", + "fill": null, + "stroke": "000000", + "strokeWidth": 0, + "label": "CASP3(1-​277) dimer", + "fontSize": 12, + "fontColor": "ffffff", + "bold": false, + "dashed": false + }, + { + "kind": "node", + "id": "2531", + "name": "Activated BAX,​BAK oligomers", + "x": 3473, + "y": 1031, + "w": 270, + "h": 90, + "geom": "roundRect", + "fill": null, + "stroke": "000000", + "strokeWidth": 0, + "label": "Activated BAX,​BAK oligomers", + "fontSize": 12, + "fontColor": "ffffff", + "bold": false, + "dashed": false + } + ] +} diff --git a/tools/render/pptx.mjs b/tools/render/pptx.mjs index beb3821..3a5ac87 100644 --- a/tools/render/pptx.mjs +++ b/tools/render/pptx.mjs @@ -258,7 +258,11 @@ function textBody({ label, fontSize, fontColor, bold, emuPerPx }) { return ( `${body}` + `` + - (colour ? `` : '') + + (colour + ? `` + + (colour.alpha < 1 ? `` : '') + + `` + : '') + `${escapeXml(label)}` ); } @@ -266,13 +270,17 @@ function textBody({ label, fontSize, fontColor, bold, emuPerPx }) { /** A node: a preset rectangle, rounded rectangle or ellipse, with its label. */ function nodeShape(shape, id, place, emuPerPx) { const at = place(shape.x, shape.y, shape.w, shape.h); + const stroke = + shape.strokeWidth > 0 || !shape.fill + ? outline(shape.stroke, shape.strokeWidth, emuPerPx, { dashed: Boolean(shape.dashed) }) + : ''; return ( `` + `` + `` + `` + solidFill(shape.fill) + - outline(shape.stroke, shape.strokeWidth, emuPerPx, { dashed: Boolean(shape.dashed) }) + + stroke + `` + textBody({ ...shape, emuPerPx }) + `` @@ -290,6 +298,8 @@ function nodeShape(shape, id, place, emuPerPx) { * is legal but which PowerPoint handles badly, so both sides have a floor. */ function edgeShape(shape, id, place, emuPerPx) { + // Closed and filled means an arrowhead; the page hands those over as points + // for the same reason it hands over everything else. const points = (shape.points ?? []).filter( (point) => Number.isFinite(point?.x) && Number.isFinite(point?.y) ); @@ -302,14 +312,15 @@ function edgeShape(shape, id, place, emuPerPx) { const cx = Math.max(1, at.cx); const cy = Math.max(1, at.cy); - const path = points - .map((point, index) => { - const x = Math.round((point.x - box.x) * emuPerPx); - const y = Math.round((point.y - box.y) * emuPerPx); - const pt = ``; - return index === 0 ? `${pt}` : `${pt}`; - }) - .join(''); + const path = + points + .map((point, index) => { + const x = Math.round((point.x - box.x) * emuPerPx); + const y = Math.round((point.y - box.y) * emuPerPx); + const pt = ``; + return index === 0 ? `${pt}` : `${pt}`; + }) + .join('') + (shape.closed ? '' : ''); return ( `` + @@ -318,11 +329,13 @@ function edgeShape(shape, id, place, emuPerPx) { `` + `` + `${path}` + - `` + - outline(shape.stroke, shape.strokeWidth, emuPerPx, { - dashed: Boolean(shape.dashed), - extra: shape.arrow ? '' : '', - }) + + `` + + solidFill(shape.fill) + + // A filled arrowhead has no outline to draw; giving it one at width 0 makes + // PowerPoint draw a hairline, which on a small head is most of the head. + (shape.strokeWidth > 0 || !shape.fill + ? outline(shape.stroke, shape.strokeWidth, emuPerPx, { dashed: Boolean(shape.dashed) }) + : '') + `` ); } diff --git a/tools/render/pptx.spec.mjs b/tools/render/pptx.spec.mjs index fbe7ffe..acf39a4 100644 --- a/tools/render/pptx.spec.mjs +++ b/tools/render/pptx.spec.mjs @@ -96,7 +96,25 @@ const EDGE = { ], stroke: 'rgb(0,0,0)', strokeWidth: 1.2, - arrow: true, + closed: false, + fill: null, + dashed: false, +}; + +/** An arrowhead, which the page hands over as a closed, filled polygon. */ +const ARROW = { + kind: 'edge', + id: 'e1-arrow', + name: 'production triangle', + points: [ + { x: 60, y: 20 }, + { x: 48, y: 26 }, + { x: 48, y: 14 }, + ], + stroke: '001f25', + strokeWidth: 0, + closed: true, + fill: '001f25', dashed: false, }; @@ -207,13 +225,40 @@ describe('a slide built from shapes', () => { expect((slide.match(//g) ?? []).length).toBe(1); }); - it('gives a reaction an arrowhead and a plain link none', () => { - const arrow = open(pptx({ shapes: { ...SHAPES, shapes: [EDGE] } })).slide(); - const plain = open( - pptx({ shapes: { ...SHAPES, shapes: [{ ...EDGE, arrow: false }] } }) + it('closes and fills an arrowhead, and leaves a connector open', () => { + // OOXML line ends are always filled and always the line's own colour, so an + // arrowhead drawn as one cannot be hollow, cannot be a bar, and cannot be + // green. The page sends geometry instead; this is the shape of that. + const head = open(pptx({ shapes: { ...SHAPES, shapes: [ARROW] } })).slide(); + expect(head).toContain(''); + expect(head).toContain(''); + expect(head, 'a filled head draws no outline of its own').toContain(''); + + const line = open(pptx({ shapes: { ...SHAPES, shapes: [EDGE] } })).slide(); + expect(line).not.toContain(''); + expect(line).toContain(''); + }); + + it('leaves a hollow arrowhead unfilled and outlined', () => { + const slide = open( + pptx({ + shapes: { + ...SHAPES, + shapes: [{ ...ARROW, fill: null, stroke: '0c9509', strokeWidth: 2 }], + }, + }) ).slide(); - expect(arrow).toContain('tailEnd'); - expect(plain).not.toContain('tailEnd'); + expect(slide).toContain(''); + expect(slide).toContain(''); + expect(slide, 'the outline carries the arrowhead colour').toContain(''); + }); + + it('never spells an arrowhead as a line end', () => { + // A line end would be the obvious way to draw one and cannot say what the + // diagram says: a tee has no line end at all. + const slide = open(pptx({ shapes: REAL })).slide(); + expect(slide).not.toContain('tailEnd'); + expect(slide).not.toContain('headEnd'); }); it('keeps the diagram square, mapping both axes by one scale', () => { @@ -376,10 +421,12 @@ describe('a slide built from a payload the page produced', () => { expect(slide, fill).toContain(``); } } - // And nothing the page coloured may come out unfilled: one noFill per - // uncoloured node, plus one per edge, and no more. - const uncoloured = REAL.shapes.filter((shape) => shape.kind === 'edge' || !shape.fill).length; - expect((slide.match(//g) ?? []).length).toBe(uncoloured); + // And nothing the page coloured may come out unfilled. An outline can be + // noFill too, so strip the outlines first: what is left is one body fill + // per shape, empty exactly where the page sent no colour. + const bodies = slide.replace(/][\s\S]*?<\/a:ln>/g, ''); + const unfilled = REAL.shapes.filter((shape) => !shape.fill).length; + expect((bodies.match(//g) ?? []).length).toBe(unfilled); }); it('keeps every label the page gave it, escaped', () => { @@ -479,6 +526,68 @@ describe('the slide itself', () => { }); }); +describe('a payload framed on one event', () => { + /** + * The same diagram asked for one reaction, which is what `?select=` does. + * + * Here because framing is where the contract "every shape lies inside the + * extent" is easy to break and impossible to notice: an SVG has a viewBox and + * simply does not draw what falls outside, so the same payload looks right in + * one format and puts objects 31 inches off the side of the slide in another. + */ + const FRAMED = JSON.parse( + readFileSync(new URL('./fixtures/shapes-framed-reaction.json', import.meta.url), 'utf8') + ); + + it('is a frame, not the whole diagram', () => { + expect(FRAMED.shapes.length).toBeLessThan(REAL.shapes.length / 4); + expect(FRAMED.width).toBeLessThan(REAL.width / 2); + }); + + it.each([ + ['framed', () => FRAMED], + ['whole', () => REAL], + ])('keeps every %s shape inside the extent it declares', (_name, payload) => { + const page = payload(); + const right = page.x + page.width; + const bottom = page.y + page.height; + // A hair of tolerance: the extent and the geometry are both floats. + const slack = 0.5; + for (const shape of page.shapes) { + const points = + shape.kind === 'edge' + ? shape.points + : [ + { x: shape.x, y: shape.y }, + { x: shape.x + shape.w, y: shape.y + shape.h }, + ]; + for (const point of points) { + expect(point.x, `${shape.name} x`).toBeGreaterThanOrEqual(page.x - slack); + expect(point.x, `${shape.name} x`).toBeLessThanOrEqual(right + slack); + expect(point.y, `${shape.name} y`).toBeGreaterThanOrEqual(page.y - slack); + expect(point.y, `${shape.name} y`).toBeLessThanOrEqual(bottom + slack); + } + } + }); + + it('puts no shape past the edge of the slide it is drawn on', () => { + const { files, drawn } = open(pptx({ title: 'Framed', shapes: FRAMED })); + const [, cx, cy] = //.exec( + strFromU8(files['ppt/presentation.xml']) + ); + const placed = [ + ...drawn().matchAll(//g), + ]; + expect(placed.length).toBeGreaterThan(10); + for (const [, x, y, w, h] of placed) { + expect(Number(x)).toBeGreaterThanOrEqual(0); + expect(Number(y)).toBeGreaterThanOrEqual(0); + expect(Number(x) + Number(w)).toBeLessThanOrEqual(Number(cx)); + expect(Number(y) + Number(h)).toBeLessThanOrEqual(Number(cy)); + } + }); +}); + describe('the tints the diagram paints behind its glyphs', () => { it('draws every underlay the page described', () => { const underlays = REAL.shapes.filter((shape) => shape.name.endsWith('highlight')); diff --git a/tools/render/service.mjs b/tools/render/service.mjs index 6f8e3bf..fec8739 100644 --- a/tools/render/service.mjs +++ b/tools/render/service.mjs @@ -63,8 +63,15 @@ const CACHE = process.env.RENDER_CACHE || path.resolve('.render-cache'); // does: it keys the disk cache AND is the ETag, so it is the only thing that // tells a browser its copy is stale. v2 = full-size differenced GIFs; v3 = // illustrations export as standalone SVG, styles inlined and size written down; -// v4 = PowerPoint is shapes rather than a picture of them. -const CACHE_KEY = process.env.RENDER_CACHE_KEY || 'v4'; +// v4 = PowerPoint is shapes rather than a picture of them; v5 = arrowheads are +// geometry, so a hollow circle and an inhibition bar are no longer both drawn +// as a filled triangle. +// +// v5 exists because v4 was already published and the exporter changed again -- +// the second time in one day that a correct build served a stale file. If you +// changed anything under tools/render that affects output, this line is part of +// the change. +const CACHE_KEY = process.env.RENDER_CACHE_KEY || 'v5'; const CONCURRENCY = Number(process.env.RENDER_CONCURRENCY || 2); // Generous next to a real render, which is 3-8s, but far short of the two // minutes a page that never becomes ready would otherwise hold a browser for.