From 4ba2c402be9c0dc0fd76f2f0b75790e8fdb4f824 Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Wed, 17 Jun 2026 10:20:41 +0100 Subject: [PATCH 1/2] feat(chart): add MONOTONE line interpolation via LineInterpolation enum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the boolean smooth flag on ChartSpec.Line with a LineInterpolation enum (LINEAR / SMOOTH / MONOTONE) — one explicit knob for line shape. The new MONOTONE mode emits a Fritsch-Carlson monotone cubic: as smooth as the Catmull-Rom SMOOTH curve but constrained to never overshoot, so the line stays within the value range of the points it spans. All modes render through the same native PDF curve operators with zero tessellation, so geometry stays deterministic and the layout hot path is unchanged. --- CHANGELOG.md | 11 ++ assets/readme/examples/chart-showcase.pdf | Bin 15141 -> 17586 bytes .../features/charts/ChartShowcaseExample.java | 41 +++++- .../examples/flagships/EngineDeckCharts.java | 3 +- .../flagships/FeatureCatalogExample.java | 5 +- .../compose/document/chart/ChartSpec.java | 45 +++---- .../document/chart/LineChartLayout.java | 121 ++++++++++++++---- .../document/chart/LineInterpolation.java | 37 ++++++ .../chart/ChartLayoutResolverTest.java | 65 +++++++++- .../document/dsl/ChartLayoutSnapshotTest.java | 19 +++ .../charts/line_monotone.json | 77 +++++++++++ 11 files changed, 369 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/demcha/compose/document/chart/LineInterpolation.java create mode 100644 src/test/resources/layout-snapshots/charts/line_monotone.json diff --git a/CHANGELOG.md b/CHANGELOG.md index adca5d7ef..3ad6057df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,17 @@ Entries land here as they merge. ### Public API +- **Line-chart interpolation modes** (`@since 1.8.0`). New + `LineInterpolation` enum selects how a line series connects its points: + `LINEAR` (straight, exact), `SMOOTH` (the existing pretty Catmull-Rom + curve, which may overshoot local extremes on sharp swings), and the new + `MONOTONE` (Fritsch-Carlson) — a curve that looks just as smooth but is + constrained to never overshoot, staying within the value range of the + points it spans, for an accurate yet smooth reading of the data. Set it + with `ChartSpec.line().interpolation(LineInterpolation.MONOTONE)` — the + single, explicit knob for line shape. All three render through the same + native PDF curve operators with zero tessellation, so geometry stays + deterministic and the hot path is unchanged. - **`ChartData.Series` rejects non-finite values.** A `NaN` / ±∞ entry now fails at construction — naming the series and the offending index — instead of poisoning axis derivation and surfacing as a misleading diff --git a/assets/readme/examples/chart-showcase.pdf b/assets/readme/examples/chart-showcase.pdf index 5c5cbbbe0eb1af4ace7498a24d4738606669f443..c91ab4cf6a7a533391ca231530f4fbffb4140a97 100644 GIT binary patch delta 8128 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 delta 5711 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 oQm section + .keepTogether() + .softPanel(DocumentColor.WHITE, 8, 16) + .spacing(10) + .addParagraph(p -> p + .text("Volatile price — SMOOTH curve (pretty, overshoots the peaks)") + .textStyle(THEME.text().h3()) + .margin(DocumentInsets.zero())) + .chart(smoothSwingSpec, lineStyle)) + .addSection("MonotoneSwingCard", section -> section + .keepTogether() + .softPanel(DocumentColor.WHITE, 8, 16) + .spacing(10) + .addParagraph(p -> p + .text("Volatile price — MONOTONE curve (smooth, never leaves the data range)") + .textStyle(THEME.text().h3()) + .margin(DocumentInsets.zero())) + .chart(monotoneSwingSpec, lineStyle)) .addSection("HorizontalCard", section -> section .keepTogether() .softPanel(DocumentColor.WHITE, 8, 16) diff --git a/examples/src/main/java/com/demcha/examples/flagships/EngineDeckCharts.java b/examples/src/main/java/com/demcha/examples/flagships/EngineDeckCharts.java index 0c48e8d85..74558cc34 100644 --- a/examples/src/main/java/com/demcha/examples/flagships/EngineDeckCharts.java +++ b/examples/src/main/java/com/demcha/examples/flagships/EngineDeckCharts.java @@ -14,6 +14,7 @@ import com.demcha.compose.document.chart.ChartSpec; import com.demcha.compose.document.chart.ChartStyle; import com.demcha.compose.document.chart.LegendPosition; +import com.demcha.compose.document.chart.LineInterpolation; import com.demcha.compose.document.chart.NumberFormatSpec; import com.demcha.compose.document.chart.PointMarker; import com.demcha.compose.document.chart.SliceLabelMode; @@ -145,7 +146,7 @@ static ChartSpec scalingLineChart(EngineDeckData.BenchRun b) { static ChartSpec memoryAreaChart(EngineDeckData.BenchRun b) { return ChartSpec.line() .data(bySize(b, false)) - .smooth(true) + .interpolation(LineInterpolation.SMOOTH) .area(true) .valueAxis(AxisSpec.builder().baselineAtZero(true) .format(NumberFormatSpec.pattern("#,##0").withSuffix(" MB")).build()) diff --git a/examples/src/main/java/com/demcha/examples/flagships/FeatureCatalogExample.java b/examples/src/main/java/com/demcha/examples/flagships/FeatureCatalogExample.java index 0d575f65b..43a542a8b 100644 --- a/examples/src/main/java/com/demcha/examples/flagships/FeatureCatalogExample.java +++ b/examples/src/main/java/com/demcha/examples/flagships/FeatureCatalogExample.java @@ -9,6 +9,7 @@ import com.demcha.compose.document.chart.ChartSpec; import com.demcha.compose.document.chart.ChartStyle; import com.demcha.compose.document.chart.LegendPosition; +import com.demcha.compose.document.chart.LineInterpolation; import com.demcha.compose.document.chart.PointMarker; import com.demcha.compose.document.chart.SliceLabelMode; import com.demcha.compose.document.chart.ValueLabelMode; @@ -213,13 +214,13 @@ public static Path generate() throws Exception { feature(flow, "Line chart — smooth, area fill, markers, label halos", """ section.chart(ChartSpec.line().data(revenue) - .smooth(true).area(true).valueLabels(ValueLabelMode.OUTSIDE) + .interpolation(LineInterpolation.SMOOTH).area(true).valueLabels(ValueLabelMode.OUTSIDE) .size(ChartSize.fixedHeight(150)).build(), ChartStyle.builder().lineWidth(1.8) .pointMarker(PointMarker.circle(5).withStroke(DocumentStroke.of(WHITE, 1.2))) .build())""", demo -> demo.chart(ChartSpec.line().data(revenue) - .smooth(true).area(true).valueLabels(ValueLabelMode.OUTSIDE) + .interpolation(LineInterpolation.SMOOTH).area(true).valueLabels(ValueLabelMode.OUTSIDE) .size(ChartSize.fixedHeight(150)).build(), ChartStyle.builder().lineWidth(1.8) .pointMarker(PointMarker.circle(5) diff --git a/src/main/java/com/demcha/compose/document/chart/ChartSpec.java b/src/main/java/com/demcha/compose/document/chart/ChartSpec.java index 6e52aa2c3..b7821b6a6 100644 --- a/src/main/java/com/demcha/compose/document/chart/ChartSpec.java +++ b/src/main/java/com/demcha/compose/document/chart/ChartSpec.java @@ -250,7 +250,9 @@ public Bar build() { * from {@link ChartStyle#pointMarker()} so the geometry is reused). * * @param data tabular data - * @param smooth true = curved (Catmull-Rom) segments; false = straight + * @param interpolation how points are connected: {@link LineInterpolation#LINEAR} + * straight, {@link LineInterpolation#SMOOTH} pretty curve, + * {@link LineInterpolation#MONOTONE} smooth without overshoot * @param area fill the region between each series and the axis baseline * (translucent series colour; see {@code ChartStyle.areaOpacity}) * @param valueAxis numeric-axis configuration @@ -261,7 +263,7 @@ public Bar build() { */ record Line( ChartData data, - boolean smooth, + LineInterpolation interpolation, boolean area, AxisSpec valueAxis, LegendPosition legend, @@ -274,6 +276,7 @@ record Line( */ public Line { Objects.requireNonNull(data, "data"); + interpolation = interpolation == null ? LineInterpolation.LINEAR : interpolation; valueAxis = valueAxis == null ? AxisSpec.defaults() : valueAxis; legend = legend == null ? LegendPosition.NONE : legend; valueLabels = valueLabels == null ? ValueLabelMode.NONE : valueLabels; @@ -281,19 +284,19 @@ record Line( } /** - * Backward-compatible constructor without the area and category-label - * toggles (no area fill; category labels shown). + * Convenience constructor without the area and category-label toggles + * (no area fill; category labels shown). * - * @param data tabular data - * @param smooth curved segments - * @param valueAxis numeric-axis configuration - * @param legend legend placement - * @param valueLabels per-point value label mode - * @param size sizing policy + * @param data tabular data + * @param interpolation point-connection mode + * @param valueAxis numeric-axis configuration + * @param legend legend placement + * @param valueLabels per-point value label mode + * @param size sizing policy */ - public Line(ChartData data, boolean smooth, AxisSpec valueAxis, LegendPosition legend, - ValueLabelMode valueLabels, ChartSize size) { - this(data, smooth, false, valueAxis, legend, valueLabels, size, true); + public Line(ChartData data, LineInterpolation interpolation, AxisSpec valueAxis, + LegendPosition legend, ValueLabelMode valueLabels, ChartSize size) { + this(data, interpolation, false, valueAxis, legend, valueLabels, size, true); } @Override @@ -306,7 +309,7 @@ public NumberFormatSpec valueFormat() { */ public static final class Builder { private ChartData data; - private boolean smooth = false; + private LineInterpolation interpolation = LineInterpolation.LINEAR; private boolean area = false; private AxisSpec valueAxis = AxisSpec.defaults(); private LegendPosition legend = LegendPosition.NONE; @@ -326,16 +329,14 @@ public Builder data(ChartData d) { } /** - * Sets smoothing. Curves are Catmull-Rom splines subdivided at a - * fixed step, so geometry stays deterministic. Like any - * interpolating spline, a curve may slightly overshoot local - * extremes between data points on sharp value swings. + * Sets how the line connects its points; see + * {@link LineInterpolation} for the beauty-vs-accuracy trade-offs. * - * @param v true for curved segments + * @param mode point-connection mode * @return this builder */ - public Builder smooth(boolean v) { - this.smooth = v; + public Builder interpolation(LineInterpolation mode) { + this.interpolation = mode; return this; } @@ -412,7 +413,7 @@ public Builder size(ChartSize s) { * @return line spec */ public Line build() { - return new Line(data, smooth, area, valueAxis, legend, valueLabels, size, + return new Line(data, interpolation, area, valueAxis, legend, valueLabels, size, showCategoryLabels); } } diff --git a/src/main/java/com/demcha/compose/document/chart/LineChartLayout.java b/src/main/java/com/demcha/compose/document/chart/LineChartLayout.java index 403206cfb..12ccc66f7 100644 --- a/src/main/java/com/demcha/compose/document/chart/LineChartLayout.java +++ b/src/main/java/com/demcha/compose/document/chart/LineChartLayout.java @@ -13,12 +13,14 @@ /** * Geometry for line charts: straight polylines or native cubic-Bézier * smoothed curves, optional translucent area fills (curved to match in - * smooth mode), point markers, and collision-aware value labels. + * curved modes), point markers, and collision-aware value labels. * - *

Smooth runs compile into a single {@code PathNode} per run whose - * Catmull-Rom-derived control points are pure arithmetic on the data points - * — the exact continuous curve the pre-1.8 fixed-step sampler approximated, - * now rendered with native PDF curve operators and zero tessellation.

+ *

Curved runs ({@link LineInterpolation#SMOOTH} or + * {@link LineInterpolation#MONOTONE}) compile into a single {@code PathNode} + * per run whose control points are pure arithmetic on the data points — + * Catmull-Rom for the pretty (possibly overshooting) curve, Fritsch-Carlson + * for the monotone curve that never overshoots — rendered with native PDF + * curve operators and zero tessellation.

* * @author Artem Demchyshyn * @since 1.8.0 @@ -54,16 +56,17 @@ static List resolve(ChartSpec.Line line, ChartStyle style, double strokeWidth = style.lineWidth() == null ? DEFAULT_LINE_WIDTH : style.lineWidth(); double areaOpacity = style.areaOpacity() == null ? DEFAULT_AREA_OPACITY : style.areaOpacity(); - // Per-series contiguous non-null runs of original data points. Smooth - // mode compiles each run into native Bézier primitives; markers and + // Per-series contiguous non-null runs of original data points. Curved + // modes compile each run into native Bézier primitives; markers and // labels stay on the original data points either way. List>> seriesRuns = new ArrayList<>(); for (int s = 0; s < data.seriesCount(); s++) { seriesRuns.add(sampleSeries(data.series().get(s), f, slotW)); } - boolean smooth = line.smooth(); + LineInterpolation interpolation = line.interpolation(); + boolean curved = interpolation != LineInterpolation.LINEAR; - // Pass 0 — area fills, under every stroke. Smooth runs close the + // Pass 0 — area fills, under every stroke. Curved runs close the // exact stroke curve down to the baseline so fill and stroke edges // coincide. if (line.area()) { @@ -77,8 +80,9 @@ static List resolve(ChartSpec.Line line, ChartStyle style, continue; } String name = "area_s" + s + "_r" + runIndex; - if (smooth && run.size() >= 3) { - emitCurvedArea(out, name, run, f.plotBottomY(), fill); + if (curved && run.size() >= 3) { + emitCurvedArea(out, name, run, curveControls(run, interpolation), + f.plotBottomY(), fill); } else { emitAreaPolygon(out, name, run, f.plotBottomY(), fill); } @@ -87,7 +91,7 @@ static List resolve(ChartSpec.Line line, ChartStyle style, } } - // Pass 1 — series strokes: one native Bézier path per smooth run + // Pass 1 — series strokes: one native Bézier path per curved run // (three or more points), straight segments otherwise. for (int s = 0; s < data.seriesCount(); s++) { DocumentColor color = style.paintForSeries(s, theme.palette()).primaryColor(); @@ -95,8 +99,9 @@ static List resolve(ChartSpec.Line line, ChartStyle style, int n = 0; int runIndex = 0; for (List run : seriesRuns.get(s)) { - if (smooth && run.size() >= 3) { - out.add(bezierRun("line_s" + s + "_curve" + runIndex, run, stroke)); + if (curved && run.size() >= 3) { + out.add(bezierRun("line_s" + s + "_curve" + runIndex, run, + curveControls(run, interpolation), stroke)); } else { for (int i = 1; i < run.size(); i++) { out.add(segment("line_s" + s + "_seg" + n++, @@ -174,6 +179,19 @@ private static List> sampleSeries(ChartData.Series series, return runs; } + /** + * Cubic-Bézier control points for every span of a run, selected by the + * interpolation mode. {@link LineInterpolation#SMOOTH} yields the pretty + * Catmull-Rom curve (may overshoot); {@link LineInterpolation#MONOTONE} + * yields the Fritsch-Carlson curve constrained to the data's range. + * {@code LINEAR} never reaches here (handled as straight segments upstream). + */ + private static List curveControls(List run, LineInterpolation mode) { + return mode == LineInterpolation.MONOTONE + ? monotoneControls(run) + : catmullRomControls(run); + } + /** * Uniform Catmull-Rom control points (tension 0.5, clamped endpoints) * for every span of a run: {@code c1 = p1 + (p2 - p0) / 6}, @@ -195,14 +213,68 @@ private static List catmullRomControls(List points) { return controls; } + /** + * Monotone cubic (Fritsch-Carlson) control points for every span of a run. + * The tangent at each point is the average of the adjacent secant slopes, + * forced to zero at local extrema and then rescaled by the Fritsch-Carlson + * factor so the resulting cubic stays monotone on every span. The curve + * therefore never overshoots — each span stays within the value range of + * its two endpoints and preserves the data's rises and falls — unlike the + * Catmull-Rom curve. Returns one {@code [c1, c2]} pair per span. + */ + private static List monotoneControls(List points) { + int n = points.size(); + double[] secant = new double[n - 1]; + for (int i = 0; i < n - 1; i++) { + double dx = points.get(i + 1)[0] - points.get(i)[0]; + secant[i] = dx == 0.0 ? 0.0 : (points.get(i + 1)[1] - points.get(i)[1]) / dx; + } + double[] tangent = new double[n]; + tangent[0] = secant[0]; + tangent[n - 1] = secant[n - 2]; + for (int i = 1; i < n - 1; i++) { + // Opposite-signed (or zero) neighbouring slopes mark a local + // extremum; a flat tangent there is what prevents the overshoot. + tangent[i] = secant[i - 1] * secant[i] <= 0.0 + ? 0.0 : (secant[i - 1] + secant[i]) / 2.0; + } + // Fritsch-Carlson: clamp each tangent pair into the circle of radius 3 + // that guarantees a monotone span (alpha^2 + beta^2 <= 9). + for (int i = 0; i < n - 1; i++) { + if (secant[i] == 0.0) { + tangent[i] = 0.0; + tangent[i + 1] = 0.0; + continue; + } + double alpha = tangent[i] / secant[i]; + double beta = tangent[i + 1] / secant[i]; + double s = alpha * alpha + beta * beta; + if (s > 9.0) { + double tau = 3.0 / Math.sqrt(s); + tangent[i] = tau * alpha * secant[i]; + tangent[i + 1] = tau * beta * secant[i]; + } + } + List controls = new ArrayList<>(n - 1); + for (int i = 0; i < n - 1; i++) { + double[] p1 = points.get(i); + double[] p2 = points.get(i + 1); + double third = (p2[0] - p1[0]) / 3.0; + double[] c1 = {p1[0] + third, p1[1] + tangent[i] * third}; + double[] c2 = {p2[0] - third, p2[1] - tangent[i + 1] * third}; + controls.add(new double[][]{c1, c2}); + } + return controls; + } + /** * One stroked native-Bézier {@code PathNode} primitive covering a whole - * smooth run. The box is the bounding box of the data points and every - * control point, so normalized coordinates stay within the unit box by - * construction. + * curved run, from precomputed control points. The box is the bounding box + * of the data points and every control point, so normalized coordinates + * stay within the unit box by construction. */ - private static ChartPrimitive bezierRun(String name, List run, DocumentStroke stroke) { - List controls = catmullRomControls(run); + private static ChartPrimitive bezierRun(String name, List run, + List controls, DocumentStroke stroke) { double minX = Double.POSITIVE_INFINITY; double maxX = Double.NEGATIVE_INFINITY; double minY = Double.POSITIVE_INFINITY; @@ -241,14 +313,13 @@ private static ChartPrimitive bezierRun(String name, List run, Documen } /** - * Curved area fill for a smooth run: the exact stroke curve closed down - * to the plot baseline with two straight edges, emitted as one filled - * {@code PathNode}. + * Curved area fill for a curved run: the exact stroke curve (from the same + * precomputed control points) closed down to the plot baseline with two + * straight edges, emitted as one filled {@code PathNode}. */ private static void emitCurvedArea(List out, String name, - List run, double baselineY, - DocumentColor fill) { - List controls = catmullRomControls(run); + List run, List controls, + double baselineY, DocumentColor fill) { double minX = Double.POSITIVE_INFINITY; double maxX = Double.NEGATIVE_INFINITY; double minY = baselineY; diff --git a/src/main/java/com/demcha/compose/document/chart/LineInterpolation.java b/src/main/java/com/demcha/compose/document/chart/LineInterpolation.java new file mode 100644 index 000000000..f9dc19f2a --- /dev/null +++ b/src/main/java/com/demcha/compose/document/chart/LineInterpolation.java @@ -0,0 +1,37 @@ +package com.demcha.compose.document.chart; + +/** + * How a line-chart series connects its data points — the trade-off between a + * pleasing curve and a faithful reading of the numbers. + * + *

All three modes pass through every data point and render with the + * same native PDF operators (straight {@code lineTo} or cubic {@code cubicTo}); + * they differ only in the geometry between points.

+ * + * @author Artem Demchyshyn + * @since 1.8.0 + */ +public enum LineInterpolation { + /** + * Straight segments between consecutive points. Exact by construction — the + * line is literally the data, nothing is interpolated or embellished — at + * the cost of angular joints. + */ + LINEAR, + /** + * Smooth Catmull-Rom curve (tension 0.5). The prettiest option, but an + * interpolating spline may overshoot local extremes between points on + * sharp value swings, so the curve can briefly leave the range of the data + * it connects. Choose this when visual flow matters more than a precise + * reading; choose {@link #MONOTONE} when it does not. + */ + SMOOTH, + /** + * Smooth monotone cubic (Fritsch-Carlson) curve. Looks nearly as smooth as + * {@link #SMOOTH} but is constrained to never overshoot: the curve + * stays within the value range of the two points it spans and preserves the + * data's rises and falls. The accurate-yet-smooth middle ground — smooth + * presentation without misrepresenting the numbers. + */ + MONOTONE +} diff --git a/src/test/java/com/demcha/compose/document/chart/ChartLayoutResolverTest.java b/src/test/java/com/demcha/compose/document/chart/ChartLayoutResolverTest.java index 36ca28bad..15e569ce1 100644 --- a/src/test/java/com/demcha/compose/document/chart/ChartLayoutResolverTest.java +++ b/src/test/java/com/demcha/compose/document/chart/ChartLayoutResolverTest.java @@ -380,7 +380,7 @@ void onePointLineEmitsItsMarkerButNoSegments() { // smooth + area exercise the interpolation and fill paths with a // single sample as well. ChartSpec.Line line = ChartSpec.line().data(data) - .smooth(true).area(true) + .interpolation(LineInterpolation.SMOOTH).area(true) .valueLabels(ValueLabelMode.OUTSIDE).build(); List out = ChartLayoutResolver.resolve( @@ -476,7 +476,7 @@ void areaFillsRenderUnderEveryStroke() { void smoothLineEmitsOneNativeBezierRun() { ChartData data = ChartData.builder().categories("A", "B", "C") .series("S", 1.0, 3.0, 2.0).build(); - ChartSpec.Line line = ChartSpec.line().data(data).smooth(true).build(); + ChartSpec.Line line = ChartSpec.line().data(data).interpolation(LineInterpolation.SMOOTH).build(); List out = ChartLayoutResolver.resolve( line, baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS); @@ -502,7 +502,7 @@ void smoothLineEmitsOneNativeBezierRun() { void smoothAreaClosesTheExactCurveDownToTheBaseline() { ChartData data = ChartData.builder().categories("A", "B", "C") .series("S", 1.0, 3.0, 2.0).build(); - ChartSpec.Line line = ChartSpec.line().data(data).smooth(true).area(true).build(); + ChartSpec.Line line = ChartSpec.line().data(data).interpolation(LineInterpolation.SMOOTH).area(true).build(); List out = ChartLayoutResolver.resolve( line, baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS); @@ -537,7 +537,7 @@ void smoothAreaClosesTheExactCurveDownToTheBaseline() { void twoPointSmoothRunFallsBackToAStraightSegment() { ChartData data = ChartData.builder().categories("A", "B") .series("S", 1.0, 3.0).build(); - ChartSpec.Line line = ChartSpec.line().data(data).smooth(true).build(); + ChartSpec.Line line = ChartSpec.line().data(data).interpolation(LineInterpolation.SMOOTH).build(); List out = ChartLayoutResolver.resolve( line, baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS); @@ -548,6 +548,63 @@ void twoPointSmoothRunFallsBackToAStraightSegment() { .isTrue(); } + @Test + void monotoneLineEmitsOneNativeBezierRun() { + ChartData data = ChartData.builder().categories("A", "B", "C") + .series("S", 1.0, 3.0, 2.0).build(); + ChartSpec.Line line = ChartSpec.line().data(data) + .interpolation(LineInterpolation.MONOTONE).build(); + + List out = ChartLayoutResolver.resolve( + line, baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS); + + // Like SMOOTH, MONOTONE is one native cubic path — no tessellation. + assertThat(out.stream().noneMatch(p -> p.node().name().startsWith("line_s0_seg"))) + .isTrue(); + com.demcha.compose.document.node.PathNode curve = + (com.demcha.compose.document.node.PathNode) byName(out, "line_s0_curve0").node(); + assertThat(curve.segments()).hasSize(3); + assertThat(curve.segments().get(0)) + .isInstanceOf(com.demcha.compose.document.style.DocumentPathSegment.MoveTo.class); + assertThat(curve.segments().get(1)) + .isInstanceOf(com.demcha.compose.document.style.DocumentPathSegment.CubicTo.class); + assertThat(curve.stroke()).isNotNull(); + } + + @Test + void monotoneCurveStaysWithinTheDataRangeWhileSmoothOvershoots() { + // A rise into a flat plateau: Catmull-Rom overshoots above the plateau, + // the monotone curve must not. y grows up, so "above" = larger y. + ChartData data = ChartData.builder().categories("A", "B", "C", "D") + .series("S", 10.0, 80.0, 80.0, 10.0).build(); + + // Straight segments trace the data vertices exactly — the ground-truth + // value range every curve must respect at its data points. + List linear = ChartLayoutResolver.resolve( + ChartSpec.line().data(data).interpolation(LineInterpolation.LINEAR).build(), + baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS); + double dataTop = linear.stream() + .filter(p -> p.node().name().startsWith("line_s0_seg")) + .mapToDouble(p -> p.y() + p.height()).max().orElseThrow(); + double dataBottom = linear.stream() + .filter(p -> p.node().name().startsWith("line_s0_seg")) + .mapToDouble(ChartPrimitive::y).min().orElseThrow(); + + ChartPrimitive monotone = byName(ChartLayoutResolver.resolve( + ChartSpec.line().data(data).interpolation(LineInterpolation.MONOTONE).build(), + baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS), "line_s0_curve0"); + ChartPrimitive smooth = byName(ChartLayoutResolver.resolve( + ChartSpec.line().data(data).interpolation(LineInterpolation.SMOOTH).build(), + baseStyle(), ChartDefaults.DEFAULT_THEME, 200.0, 120.0, METRICS), "line_s0_curve0"); + + double eps = 0.5; + // Monotone: the whole curve (its bounding box) stays inside the data range. + assertThat(monotone.y() + monotone.height()).isLessThanOrEqualTo(dataTop + eps); + assertThat(monotone.y()).isGreaterThanOrEqualTo(dataBottom - eps); + // Smooth: the pretty curve bulges above the plateau — that is the overshoot. + assertThat(smooth.y() + smooth.height()).isGreaterThan(dataTop + eps); + } + @Test void rightLegendReservesAColumnOutsideThePlot() { ChartData data = ChartData.builder().categories("A", "B") diff --git a/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java b/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java index 4614e79a6..5927e4d8b 100644 --- a/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java +++ b/src/test/java/com/demcha/compose/document/dsl/ChartLayoutSnapshotTest.java @@ -68,6 +68,25 @@ void lineMatchesLayoutSnapshot() throws Exception { } } + @Test + void monotoneLineMatchesLayoutSnapshot() throws Exception { + try (DocumentSession document = GraphCompose.document() + .pageSize(360, 260) + .margin(DocumentInsets.of(20)) + .create()) { + ChartSpec spec = ChartSpec.line() + .data(revenue()) + .interpolation(com.demcha.compose.document.chart.LineInterpolation.MONOTONE) + .valueAxis(AxisSpec.builder().baselineAtZero(true).build()) + .legend(LegendPosition.BOTTOM) + .size(ChartSize.fixedHeight(150)) + .build(); + document.pageFlow().name("ChartMonotoneFixture").chart(spec).build(); + + LayoutSnapshotAssertions.assertMatches(document, "charts/line_monotone"); + } + } + @Test void pieChartLowersIntoPolygonFragments() { try (DocumentSession document = GraphCompose.document() diff --git a/src/test/resources/layout-snapshots/charts/line_monotone.json b/src/test/resources/layout-snapshots/charts/line_monotone.json new file mode 100644 index 000000000..290b6ffd9 --- /dev/null +++ b/src/test/resources/layout-snapshots/charts/line_monotone.json @@ -0,0 +1,77 @@ +{ + "formatVersion" : "2.0", + "canvas" : { + "pageWidth" : 360.0, + "pageHeight" : 260.0, + "innerWidth" : 320.0, + "innerHeight" : 220.0, + "margin" : { + "top" : 20.0, + "right" : 20.0, + "bottom" : 20.0, + "left" : 20.0 + } + }, + "totalPages" : 1, + "nodes" : [ { + "path" : "ChartMonotoneFixture[0]", + "entityName" : "ChartMonotoneFixture", + "entityKind" : "ContainerNode", + "parentPath" : null, + "childIndex" : 0, + "depth" : 1, + "layer" : 1, + "computedX" : 20.0, + "computedY" : 90.0, + "placementX" : 20.0, + "placementY" : 90.0, + "placementWidth" : 320.0, + "placementHeight" : 150.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 320.0, + "contentHeight" : 150.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + }, { + "path" : "ChartMonotoneFixture[0]/Chart[0]", + "entityName" : null, + "entityKind" : "Chart", + "parentPath" : "ChartMonotoneFixture[0]", + "childIndex" : 0, + "depth" : 2, + "layer" : 2, + "computedX" : 20.0, + "computedY" : 90.0, + "placementX" : 20.0, + "placementY" : 90.0, + "placementWidth" : 320.0, + "placementHeight" : 150.0, + "startPage" : 0, + "endPage" : 0, + "contentWidth" : 320.0, + "contentHeight" : 150.0, + "margin" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + }, + "padding" : { + "top" : 0.0, + "right" : 0.0, + "bottom" : 0.0, + "left" : 0.0 + } + } ] +} From 4ae5ea4e8fdcfdf9fce36a7f6c53deb9f4e128dd Mon Sep 17 00:00:00 2001 From: DemchaAV Date: Wed, 17 Jun 2026 10:30:18 +0100 Subject: [PATCH 2/2] docs(examples): refresh chart-showcase hero with the SMOOTH-vs-MONOTONE comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hero preview now shows the two volatile-price cards stacked: SMOOTH crests above the data's peak (overshoot) while MONOTONE stays within the value range — the accuracy difference the new interpolation mode adds. --- assets/readme/chart-showcase.png | Bin 63520 -> 65709 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/readme/chart-showcase.png b/assets/readme/chart-showcase.png index 1349119f97214d39fce2475564bfc73ba66b879c..d4a2d37c578ef10ed341b6c387068d81fe15bfdb 100644 GIT binary patch literal 65709 zcmb@uby!qi^gcR@fP#R4fJ*5gA*rM^!XVP!rF0`5Ls*oQhy&6B(%lUT(k;yZqte|2 z%rL{;LC90{`op>dG5$z%{olU#WTj&--5~2LJx=qw*UX23{AU2z#dE zJG(XS<*RK=PqfGWdwf2vR)&#_XJ=>V^&R@gCv;uHT_0w;??k<#o|`YJr{N3XbS}{F zam`-EE`}6y5gO_FCm-QWo4i@W;+GWNljr<~xvu)T(O$W{jUE336ybmOJJ-KnbNS=j z{w;^gLo$mG#xIBBO_yB$e`iF8X^>u?aE~IB_Hrx8B+GNTwUhW@bh#bz{eNqKy>y%G zniy59V~~rVY=uVmr(Mp=3-3KuW93?Y%8IgCd1|u!{acg%A9Oput7hscFHnJ9Z~U``ZYV{9lYafLbDn==wbxKiC!&m#QT7MM z27!#zUy*h0c>mv9YZx1S{#O0yzaEic3Hkrp6aS~KycaSsQ2b?Fus}y|^@JPIr=>Nf zq@?6nS*4Vtq^Qcp!Lfur9=VfbIP<8$K0yD<$m>V9KYkgnZf*`}CB5<|yfCUe>#5LIRE(Xbg~O3Sf&N43$Bi`zYXtw2 z``JoK6FGwzEhXh(?boE_qqR{l^nksp()lk6K!{oL)>|@J|68MDG}00MT2{Zo}-Ac15dfw9qk_hza#F_sKY54=-$@Qa2GX9 z^hVvTpoH_AYCjk~@MTd@*E`EwWLK{Wc0lG@lkM_|h{Vo+55*=T68TJ98+YG~QfiKF zMBCfn1tTvi+OXxIsrjTyy}?9tm`_b!o)ErPd2rw#w3hgK6Fon=n42aFk7G50YH=d! zc0UY$#VsT_H%&BITiH~yBR(g4V+Q<=y^~b_+e$C%JD91eC^3my{Og+tE~4h4%*nHL znXYcR`1VA^HAIg$yFB0Sd?_h1*q~6Y8m6ORP<`F=eRzrjqXBpThxFP zlr#8%_BLIjj$f-2d?o%(DIqN{=2?M`TKZG8uC#`W%fdM!DvCissOWc*&-v1NE5UQ; z*~<9c#LV>XIkvgqbFFPx$2%+;pL!Piw8b@@Fa)f_^YcI9(OBj{qNtlqbfpVl)6rLaDA_lM5sFm5&Wt>`Frv;R`F>dcFnaSX=M7sGbHn_xxON8Si-jTl%-u zFbK5kzRM&sk%ss;F$&q^>CRTK6o=85701tq18zuD|%sCrWkji-)7#9`!4x+147 z7k}w8Gf%>M+S>zWm)xYJ%tGYlZHG*rdjG3dVZ&PCp>T1e_p>W8G3ec)luj2d6O&4p z4n3&5j|U@vy)@G9)vKWsE~Bzila?T?+SiB(x3*SE^JB|x@z1pH3OTk%6^6^ba!_v>+5TEtQu=+-J`tgY-jgp zb<=d4Tq)C;#Ap#L|*wctuqns)=B9cR%>Y%(k`` z9@yM+bmV!l2-l%@Z#WO~y-n%0J9(B?XImK!#_IQP0di(hO*1pMLp{6Q^!afta%RTH z$|@ltA!MP2dAe4J(v++rbHVH^UBr22|M7!}%QtFp!zmF22G$17IkL2!ZeSV3PiSaq zc#KMTS;p|SSF&2(-Z7b(Z)5B7 zGz_w<-WAxdKYC;jv$B7+P+fox_6zCn>+k5uPCvd)LK10VVG$ymSyq;aQLkq^xl3~_ z!%d4l^N)n-W@!5P$@{{-DCIaT3}nx`Kw?2~`^_KTGcZtXsC{y;mCb>bHK(FtpTEIG zUA@duTZDjs;82!_DaxhkH8h9`%>=Ewbpz(^G;D=dMePU+W9!tSwdfxH-{QT;10+><# z2|=!w&NZGhg@~dH8+vK%IdWL)!h3j#ti<@N&Kboe-S*8?<45gauns&!UcM6qzJMd& z$4w63%B0~d)eRmCx2|8C*g;inz5#LDtt{HJyvnp;#Z@?>}8;Pf0u64E|a z$4J>CbTSx8S5~QS*{g0&fA{WS(54*JsBx+3l^m0ZzALhIHPO0g{C!4o33uE1zr|++ znDU~W9BcD{n$x|w_^pYtsi~Cxt}lMBgZbOU{>~Ad7Lum(z|VYg6p3M?*qO>BR(8z@ zIvQ%Ovsv3v;>P1j7I#((wK%IPJxW98@);bE#Dw|q>yNQ$=2vvB_>HkX^RTOL{~QiW zJ@wzxadYb(UHpj(JZwl$-@y~a`ry~z*A+3)jO9k5s!lX?j^2lduYDzU(-nK&25mZF zI!E!ft*)$86eT3klCHE#2dv3J`-b`Kkgar-(aa(nO=WcDjI6P@-*de-ML&eE1RpG*)8K}yp9bmme70`gzURL?MrhtGtzzY~Jo(FO zzb>N+jh%4~yc2+tKuX!nc|vC!j(4ZnT7TA>G}ZX0cV7#dT`kFL8^goG((y@|{pQV^z^O@@mamy~C%4@`$(L z(Y8>G^GqyraH9q%BI)ZL)J;*`ePKLs>|GM!+9+pg{Y2(A^PU)VU#$}oH+B)k#l^(} zrFSec4>p`@H8nnNW0LmspE(e6+rP0@SP;=$oTP2rDq3@pH@MS69Bh7;*oZ{rLp(tETZhY)l#Ka?(Qv!SFN@Pu{?OP4sN+XhRx%9+tRZA&sA!7vSw_o z>~EiLFpp_#vMC;e%m7cj>YQ@%a+j^jZ?iNbu~21ou{Q3x=YNO zf+mvN`un-U!KA*qg~B3TY4e8(JG;8tE=K7#MA9UiK*SiYkQ*6`H83$bnEfDP!Sw6K zwRg;Pd<>Ef`C0{-oiKCntvU91Nu~|XxEE|O%($7n-J&Y5y3#Zk)D5K1pS5%K1^6Vp z^qWb!4B%pz#$$1n(*6=(<)1*sf}mf+Jv}|g-N2xE3^P1q+G3PV!E~EWY|5I z)2}Ca5z4NfX4)7~^Y-l(N1gCU^{;|n-ji+cap$?}G*+Xy7vl{cVR^e&^Pwf?yqL^y z-!$~~|1GWEr;V)ga7STZ{;b)o3x83d)AHmnO)gCRHN)z^e@lN}>YJJEBX@((kJ^^Y zFsipNQ=cRDtlz&YeHK!fM@m;y>!fF^t@E^Uj$XTh<}@18-fuJCzAXa-xjcK;zkgKd zU&tEL{AObi%1EDsm?yQ6uFEtoW8P-^5<=N)RoRno2W|9`{ygtDyknZqTM4i0HlHpI zmMww7p6?=qzaIqiHTO<#!&mrD*+fLtp>a<|#n#r=mR42*k9yl96H6!2qrvAWckfT) zV$;LvPokaYeEwwILvKr~z$_|!$HOyW)t0NRgysRp8U|KQPD{%(Di5hlTipZOmy)=l z65GFXZY78sonm#)@_3Nmu5;BL0|OseLz`axjn5l=wJ*PYq8nTZb98dLJ(8>Isj~Im zzG{(~P3a*O->?l45z&nZMeV${&V_&X?g?33Z~BHmegW%NPi2ErQ!koHHcl?70pFS~ zx*AC9!p%KEc=egR{fukd#Xdfa^l400W#t;ONu1KO!C!S=L`;YW*EJ{(6SR6AOhE7+ zB!G%zHdQcWbwLvXA+M>qUl*Bp-V&sY=r-ExtlK(q$Rpoga_^)UScveuW&7&YLY~hF z)4cfRh7wi$XWM}wK6du9gA!=AMJooQAa3kPN5>BB>l^Z0#SM=eI!vV#xV9ZWQmzL6 z7p4O;u*1(Z8Np|17$&_kQ|aKJBHW{ufdG|ULOs5=(tyeSES8^4H+q79^XF zcP8e4{J1YE=`n<4*4?Q!lcS8&jBGvY9hyuQ`fY2y+I)x)XfPSVAE%wH>`phR7wCXs zEGjPEXI1G%UmJw(tQ&3{9%(uOSrR<%#jnt}xw$#&8Bf%4^y^d0MZsrY)_#5=Nl68X zwgNGWpc{j5(RGHFVLF^}k4d=ZD8&ca%#1P-aph0x>7qUh-ReHCKld+tEa1a&XoJTW zxY6uTs?m*_O=0JSObrgBx&vlmt2dF6@hWV_ZEncqnv0v?thV|5{LT>B0y38GHH^s| zx%$-@--UBXN*=1MNkWxWm2KC*J0_Cb*yK9ZnJ1K3Q0{@;FmyqT*?;pKzB^!3X9SV~ zhh0%&-i0bZ0cGV#fjso?G-hg4= zZn@nB_AH8p6!^+GKGHU}+@&n|yr!UUN|)yBj8FiT>c8l)H~48xU?H`=witV&Z>gxb zJ~uO_o-tQvF%zp!vBAg5iT66YcbUYuyhitgRE1G&%@^n86=@Y1_|#c;t5;}hyAB5) zn(X}~wIz>*J3pi>LDiS^iQ@GCf{?8tGW_Msmvj=TljAyRpH0!FW06%|anG_q4G3k( zd?W`CPgBq$EvfGI`&qpOc5(JF+>o1Rc^UfIglg=}Oats!%q?n5OJE2N-nGG%hXO%_ zlHI+4I7q+HUA`EX{!yr_r&nvWz6)F0TJpsofoA|=uO8UTo5gzTwvvMF?8HQXOb_Pw zS(;k0D;|J55I#R2iKE^!ZvOuLXnfrRHlC;N!^IU@dEhSmp%Ynj2B?Nurr8R=4u`lG zM;xrjh8^WQ^Rf4#AOhx@ub!X3vPt3Wit)1y2yA+Jcj$8Aeg1C! zrR53WO_dyIl&mHtseg^$10;mF*G&u8oeK6$VLrZ#l@c&vU&~}9d!EMiS^?_^!0s+R zz4J`{icQZtz5aVcmNk$Ub*ra8fC`_Q7U(dFd8W=gT)fTZM0^bIie*%U8Q1MbL`Sn{ zxzYuCAFS>4uf|sRy-2{-)+$vdzIccfzNoP6#)wv#Q8dvFk$0NoPqvd0ZRa)KXS2F( zM1-|>MJ--G``gC$HD1XY#f{-U{nhI6lh_dH;o@RuHBNvo3_8K_!K_?dYC$vLfy&Gz z78()K|7Avii-CPfPwypXS0Kh(hWRYi-wWV9y}$XQ+)ALo22REGVe{KU%(R%w# zhcNMwELLzU6-oZJztk2z#Ow>rKWbP|2;r#<_(+O&+4V_Hhb!E3XW|FwzuLGIO|?X z^GLV7{I&N?L{81T$$bNu>-{X?4r#b99%e;F4b%j?Jj~)vLz+tkZ>?oADklagz+Rm| zW0*+UvVMKHg2Ro0U4o23y56-Pm{+cP$_rR$Co4t9FN@H{`ZLnj8x7v^;VUgd@3)`B zw#o|RusbQp9o~}KU;33HTksI-JuR_m^$o-Qp#NRjcyvl805mW` z`+o+L88rZ{Y@iYuX6w9=E7Fc|*EF$O;B93NZJ5%;YqHrjxd9zjbDv3^a$u;VRoMF) z<$SYWUU`0aIGgI74zaX4Qj+U-W1qtT=F-{5u}dqlLLIq^^3=ZzAHRkNZd`*>MRuA8 zps&DL3K{Aa%m(w+?oN$&lqj4G0ZOg-xCQ(Gdn0-#CvBF(f5L9NZ`**-k&_cru)b(s zI60ZHwL8>1`c|^Kw6qk=^n!>84GycjV)$1Uo+{jwX(UqJL1$5Sg!9?>X3t3Vr>(Mp z2cFFgyiaLp@RjduogRJLKpjE8O<<_6Ke;vN#?S=lhQXCnaS!xW%A}N(iYXHX1=}uq z?eP5K;;q?ZB!b!Hyj~Mf2u5`-e>XR+EzVCxCXl-U2Y@))S%8;E6dj^@f_cx+Eswvu zM+LM@JWz@JtYji;C&sH8X?U!t*V|WV}H}_$GXOEM*|+SPVY1I+Q-dgfR?*vQR~| z8tgsT%z7L+3qv!RHhLn$htk>x(hrX8sgIA3!|kR&T`86xNb;bI=mBIgqwxhvi(k;l z8!1i%Clo5iezG4s{rPwBplgdY(q(eS{^i9&am0sLt|$P$6r$5GAi11trLMJ@p=jg5 zx^1of-3SEub%t7TxTmmp^!hi%NM5Z!4s&#>WnR|Y{O>ek4DiO`X;y;#{5ly{DvFBM zwlTBS_L^s*CB`+^o9G@S_Q%I-8(fTYW?5SJY>U3eVYUJ49CkG-dLUd>s#UNx@A?p# z^-pK3z2n2L)wz-Rc~!|ES#DZ*y$Im5q52OGwoWVq~KP;Cg;j-)L<)-DjWmJ%O zwJ3TqAN6BY*Fo90uoig72P|yObCKoV$G`isTgR_meTI^f#Gu!~lx^RUH>vmZLZT%> zG*3!0OsU;E{nOHL;s0#T#M!x6psKR$gGuo3%vxuJxS)W5CEf3g(ci@`Z*2m-c?Jgg zt12UvmHPVn3O#-AXB`a`_lZyS5$_HL0tyjPCwT0DO=bD0Iwf-vRAulmFvfO1GjFxc zA40)2?Yd8)92u#MW_~(bWUD_(*FMu5H!rQ653BY(+n8{is_Jj>^E=v-tIn_g8XgrL zosQ4zvuqw1P;quH85eOC+D4cfCni)+PfA|JX_{K9jLEh2|7m|5LfI| zQjRXu&}^MI`D2#8FWrW6^75`PIC3DN`V#50yMQBFzVVf-?YfjydW*leqzBppa(BAAo&)#pMnR1~W-z`u z{MlpV5%FT4x{idHxG9c>Xm{SHK1Xm?hn9k{rwg zOV*RcT>S>*YOvAl%&bm2cV~Z*p@o+FvsapiehrvC{83fe#Ne%BQid$-MU zn}qD_SV^$S=$d`GC$=vt>mMI-Kg`1JWr z;bEq-=dcYm8^jI5i^A`-@hcPay2k=5oL@+wR1q-sDRleK-3!g0niPOmh6ejDlOAbv z*9rrMkz8w;lmrl`?@2gGNQ(Y6mDkYt0Uk~*^=U_Ie4%GPD^x(6+LpZ=5Qc!q0{}>u zw(XOWbul(ugX8FU9|{G`>p-y+h&O>}7^%wV6r$IM ze;SF;Wf2MtZ22ok?6T0fxpfu^SYOxqR%MuF_f6YiLeAwyX<9C2Qm>H^_zmwq49|GS_WL>w<9K*Zn}dNLrGPF7HQeiR)am$C1Gva8Yul^Uy5H z4x)+2UIpnoT7=jU4ODM_oLmC0IZu2qIkTjuk)B#C^}wQs0=K!+!_R%gIT1wyl!iuM zC08YlaM;h1SaRm4zDMY^#|a0POuqt8_Y?V(irwF5xa3sH>82-Q0*h&}56^8gjMzp2 zO|Ugrfdhny>jH_jf~kepL1JVO2Pf~VJRgVBgB!eW_fYE3j(uTe@nh1;PUZTQ2U+y$ zMF(Nu@D=R$-(mzK)6z=BLMyRWxJcjw6rz$-lMp;q5$~=duMyTh;^v+$w-=|Bl;n{E zaTW9wn6Xp%hG+8z$Oi4E_t;ve>3ZBiL!{FeTcDT4q+tOgA@2V=3^V+p#r&VG%JVBD zckYi%jg>zjn0~qH+GgG^)y^qm|5RN3V<#Y80q0;Y7chNQhbrP%=gj&#)&z~bm!s9| zpHiXdJ#FawQyWz*A<7-xcIBwn_H4qGlWM+e@gN5hlWpH9E*!fbHw-F zRLT2F0<=k#SZIm-B z$B?6Wj87*fsDsfd$EV`r!oun4QDf$4WU@l6R!eiTdWNtj4%Wwow^!^NENPusT_>;v z@jRt&=d+S^MsUN|#iszTcGYX-1a+0Er#!Y9f9%}=C>6%n88-H>p21ir$XFu7qqGWi zw&vV`&SuP;+2>~L_pqrY4M@>{o|c-v{K0pDt!0bF^IhPz86@4;fc^te`wXg5=6?R~ z-)9UvF0sK^=Wn#+?QEw3$tpcv5jL12={gs=vYWFU~XV{ z?PW%Mysh20Hm@-wT8qAZt`D+*$I|@0JPVr@-ql_yc^=DPWM&qG9hwIeBOo4u9|z>O zE_u!H-^pL{rfvRTthVB3Zlnl#U7UE_w8R-ka2)kk1`MV&Xy+80oaF$z6^~!QVbD5- zUx3`iYuZrjg44^<@;f>$p!+a8o4V^>UdIlNS=8gk#*tZQbKKS{P{AEYDFd0)#wG!i z=W8-2hgMtP+$^9EmB#NmA3G5tD9U+^eJWzV0K(6Xe&l2Lv;wu{v1KtJ%`t63!5))M z`f@JkXD7KJp)R`cb}BAefcu~+BHN;3B3j%IhcMB|&+*z8mW#~4x+>I!I1z=##i`-t z`F8|u*0ixIrcItN$L6cj!)t4W5vw&%My7TbYN#&(u0g{FUk(_cLcLN9*Ou8eO0s(+ zd9x}>adGmn#zv~Zz`#rR-$s4!IqV~QwC%>rxcK-Y4UX~mF&XcpzX8?50NYJeYrS5H z2r3af-V#4Qv)lkW23_z4siTcS1IAT&N^6SuBKe=p-kf(aIpbABiTP?jV*2X=BHRJE zE@vzSgQ(jbkWS%Nh6*F`r$@FEw_pVlDoj*5*3mKHC?|Q;2;E zYHh7C+0yxd6Ws7L`8JYJDzM1=ne%w!j1HCh?qSzv{Pa{;r?Nh~YFgm>K@HG^0kZ<& zIE{E6FKr|$_{6O{G*b>!RrLcj1u`%Hqv-;063C6D`3(0*^J2wWS}ztDMvGicZjd;2 zK#zf30y>pi)5>Z9wOI?K+AWZQLgPkydOoT8_^%F0PU?#BbB3x`Vyp8gZUSiyS?!_- z+xoOKlTDg3_da~K&aofQAnY>xlf0__^uxE9z}ai))4zGVX>~N^kg-_m9HozVM z36Y`u5u)&d2bXs2P*OQtSgwUljfi+6ZW_dSYGS2xlM<1r9~HFig-T%TRt?ZTJB4*G zPDzW1v=uj}3KdjZrN$>Jz%~r;5gqMz#&9JlU!AS?EErE)1T2#DnbT+$t@p<727;z- z=3wXMphaOyn%lPv6;3Pm(*{nbo>PrxD-<|g`|D__PJxsQM-^P&N0fi23fO&8+6%Rbv7vE}*Pd8Jwwcnm7qIbMz z+G@cgJ{p%6Uz9HLW&%~_s*Z*)c4s71EhT^T6^~P^s5)!tjYf$}V zfxAI0buK99Z)KP?Z6NbrvZ?<3Q)WnXi_PGf3~wUbPdJ5ty+*2~ zu_`5>{<{0&!Hj^z_5LHs9wAT7@I$HyB8sgdrZh<_4HT#4d#RL*g%V^YP|}qX%kYjk zT7RnGGzLbXytO#&RyiZ}Y=_JOzJ3z4nG>|N%{!#yP5knOO4HsxNr!W60x^x0bh%;B z=rnOa<9K0m=vXr*sE3~YN_okVM8fMq7AvQqzOlX$ssN*mD~M2xT&=x`fMqc@p);QP zJ%31BrER3AN4v3KEA-02;$W!RP#WLNEx^?ThOk(UlQII<4mdYCSoZUq3(eNHfX)TN zLz;wN7vQA=>F&|rt+AiaTA?_iQc;Pb8@Tv$$k(>`)MX;st7x*g=)4Rt?rb`BU5&=n z`o_j713(9LK=FQ?h1b?rn$-LY7FcaIH!*QvTuI|xH+e`Ec(F~l(Ye-Xu@9iJieI3M zk^`U%fBB@t9BK>&awlGY9Syd!v)lWNb>+dV+UwPkMh~j=Lv-h(JWUw5!y*KW7 z;@c5mnwkYFJQbToH8I<}xELL>#&x#|e`YoEr|Q3BX_*a}hf}}ak3cb!gi{bwC?EjttviD)&F%psjB>lw!*|v?Ui6n?}ye{z5#2J?|1cxp7Z4 zU@sQM_Yex`>MJ<-?hHJfFr0IDeqDeLps$qr#(;y-=DhyLPoCf{euiZP;++AD{h?O? zK%m0|(rLf#S8_x;J88dpIev7s+)!2n;=o2nM0l?1-8T5}&++P`kjS9vR!ct0ibtti z+s-MHaQO(3E8@>iRsh|nzQQ-#vidEg;VfDWCx>>IcOS_jp@UMYx zw~&q{q7-uTx_dF(Q-VA(X?1V0&3NVFQd(?n#EGbk!8;QeRcLy~=MHTA&gmF5&g@lh zL{}P^hs4&c_E5e**^>0!^4(jCup~g%GV$l5fM3`RQ$TNsX94;E0I}kqSsr=brKLk# zdi&}at~#f)K6NZa(7>)BkjYD07;}} z&lZIG1UvZ22L6N@V2iHEa3HY+px3cE*2~XO{2S-wNu{kTSh&Pj7jQjKvO^0~QXMV+ zypeKx9G(3>Ffn-8LBg@C`YfZ_*2xLTC!V;jZ6G-U#9336P}wz~M_B7T81t!IscK&U zAlkIEmGSm=*#tY|x&u_b%fz8L@>;e1S$DGe%vQROY{&000kWGnrSPv821N2I85?~z ze+}gUy%Y2?e#fR&6fyBlhjXH1BEs&dr+c2$(~FfLW5CFC#sk086~ojD%FCRJjcxR5 zO?X8F1$}qZW-hSnDV*>a_(9R18g{u~mu{jYWwLT?4(KM+TX}LsC+26!i}XX1>DgH) z)Vab--k zSHR&8b`*g~tMWm;0)F*`xvhc)4VdQ%sX0KXSW{;NV{udnrQ^Xp`HY8;FGI+)050gxKu2@@t^WJ3pFf9YdNm7la%`<`#Z^?q z`FlEhsyMxR73ZJXb9AJVqf}5-)So-Z$;oMB*|F{9%&8z(dz*){0n`8upX)`Ia7;EL zF4EKJNk~Wl8ohgG4U5G&Ccx3ZfP~B?oej#ICaYh*dS%vNUTne}8y*#>lmpn2^uZKK zTuypQN;i?zlvUukSf1HE9R-E0nPx-8Ymo95XmB2T9#22DIPQ0Jv>a6Hu1ak08QEJm z`?|bLGdfCPXEoo^l9)9Vya=Mr63fZoAdlOYQ)rShQ zA^nk@l%&VBc$pm)-$q;{b4L2z($~=77#-a|a4=&fE=u(G_N>;wsHs$lTU$Fl^D9cs z3cN)x{c_I$3JNYxJ}yh^w#E+>Z!rfMC8VcUcpyS=`In2tz;WsF)TCRJ8d+_2R)p1@JX1=bvJpaI* zm5tTb#%6P419Rptxk>EcoAf50ZY#CE^CBmbJ zhxs(h;3mu2l?U48mDR<~GCr>~H9bAKDRqOIiaPafSJl~&&LC$hr!uo- z@6pql>*?{{CXq}LDLJqg@WRaX>zB5HDkF-8G&x93r<;-?B}!gLKe73_WaRiQ2m0*3 z%!FMdNMSeaY)w^Fi|5YuelvueGj56{vA@&84U_;OcZ2$dihwxP&=|``%|t15eB9vL z`b54ZnZT~`zpK*=%JcJ0yIVOC2S*V>#BU_?OxbMxN53G&>&zsw>V$pv2Csk>LQf zyWOU&s_eQkQS0^6C&4bTS#n}tcw7o|RFp2+G~{c^kLr|NbpP|?NrQ=$|B}W-BfF)? z8pTfl3Z0;gEXhF1UwPwW9)uqS<+UPCvp++XE609Kcsu12d)LP15wTZYQZ0rYLHFI+4*1(H9`T!GWDCJ%w32_WR8uuFLu5J-V7llOq>p8{ zNFly_p}kG3hitm{hOd~b!CwdRqkkk}hxmUg*Q39J*E%Zr|Eb#jf3NXYAMm*X(LnX( zeEhPN^(*S#Tzlm|e!~VGGXu_&Ph2EQoL27EL2eCkt)(#rFJMHCV$X@Fpj0=m>DdsW zX}fA^L(vJ(y=k9!5j6%#Q-I3#;QQlO?b=SO&%Z~#TN-Ewjed`6FMjuXbvMJ@1mBJo z9FLziyfTJ1?Wq?lU++y`FqvdR2ztv$27< z2=Aeb$#XlW=WaWXT>kMwKOU#~y}uXR7NmJguQG&OZMEI}*e6OJ&shiu?G21cf%My8Jx3@3tRMGfwW zBa@#Rrqm--jFavf+}YgR2v>&M-01jOV=$H%N7)$v;D ziNl`k8XFtO-WBMYn@ioDg4`=R9d911qvj1|MSRi6T`#YC>@YDf)Zf|HIXT`t3)5H7 z35zv0;EYxphSMTo<|R z<^IHr^TT0)N-6I0e+Z|drcUHF#Y`HzD(3vIahwXmpRJOUlfzGTR8>?Mq=U}EzMZ*- z!|gg0$+b1@>&J!pI{pv1*N;lVBJL6*>NXXB@klr!1?yZV#)lSu=LdZ(`1Hu)vjqXn!pir|lxrD7K}irx$TuNDY}i z-keHFNugktN)7kknJdsL=!#{QwjD|hA*Gu|BB@7-nFIFFNY|#Orb8URjHMg)8D`y> z!WEXo`GxcNxrZfgr^E#5FY4Q55CIENo7OkrY+*`rKQnXpmDO8bF^-7IhZnKE7ZY@} zuOHa?n*0x(% zOjK0T|LA%qt(j0vwqx8Q@!{tWzpoaFe1x^jsD~{$&(8|_+!Bg1efDYvo_xBc zsph?{);u1Y!26uXG~i=@N(jsvtSb0yZ1N07d1D5AZJswu8a?$s_IW%$_P0p|EM>B^ zv$M0(QD+*0T9q;aIV{^YF!TpL>DD>P&d{ zg9?@=e~OKfn;vslAwQJ=cyL4z-5?%D>KrI@;htBXQ*x!XGYZW>l=@WcFdNhNIPj| z&^k$d`0PHD8~;imkwG-z_^nAMW;hnC#EB-gk@n4%grmQvq?~L_C)fC}ntPq4p^MUr31ijmy5+HV=P;l>@kp5|=)*)fG zfJC&?7rh>|`A4aMBsx;X#1KMmlsOrjZ^ImYW2FzAw{WxUG5HIT1BESmcYB1Q(fIaS50r zgnWzsU$@mb>!j&FF`;2xDy%D-*m~t$ar-Vr zhEXox+3uFZGZqfrRDUv_7>*~B7e!vHq{=z4?<}-x>r?Kp!&dGv=IHV2I!Sw6^h^*t zm6*n9JT9)9`Xz<8Fr&Ld1R3E3zK2Yf$L?B#tQW7~1EHqr(b;+hdJ)FBy}FjE;W@R} z6+*bZ8gjePVm*uJKa=0rWqo#^))j$QopgJ@uIbE>fXJB2{P!T4Z?!pe85A-~B^fi4 zyK8-)8l4Lk)#;Q@`w3gPqiCrZDN#bgCJYL;I}#>7M=tguQQ@Ay+Is_yL22F0SEA7? zkmh@{R1Wf_bO9zs^w(izM{s?P$;GB?Z&oQu2yI=YCHz>-T3Fla=Vk|fASW7CJ>Zl> zdD4k8GCSle^F|G9*0-%z5({-qKs1C|=#f$wbC;4r_L$w29-&xu6mp6uc21cH^Q9ln z$n(uz9e!o)uy=gKQs94oNygKK2mE4|ZT|m`_ROT1F2xM`s5+_A_dJN-*&F*Z!O< z;_H~0JW6Z`eC~a0BOq_mnsNTOPrElM{%|B(HywT^C;<-RZ)6ELj1>5R0^;Iz+ zIW2}36yURaer=iinD%pWutFsxPPgNpnHtsancjxHc|Mx()&e|VnVzTn(9|YhdHf=< z&^x1@^kXBFCI9%>`NZYM`(pzIODz@5*^hsS7nnSvBH3F64kxLab^PCZrav?!>OB~T zdA|fZ5Q`|*mm*-st5Ia0ZON0)P88;E-}n>Od)fcZ`nNVdczWEuliqlj@Amay&`hPy zeN(Wev)Rb5fY4XB{ht7xYa<7ODsScATAg!mmHcYTQuqsLJYWbdS%TKExz_CypIb7K=(0cwei=CyzpSYf7bW(ub zaV)R)CI3r^FB{@xeD8%}gHmTEX=|=*K4HGHAz_ZWYrTdRFH2S_k12}jZaB<%*q=}* z?Pk4#W1V|}31`{7dn9D!4wz1tg+SLfMst*+xF!tla1d$Oe(e9AQ7W32tgQljYet@- zx&f7yHj>KMnM)GC@yJjd|K zgz-&+rC_zCFK8MLf_I}iMg*C(-^iWB{B|8qS)i4VN6nA? zeOPcrv&wmHm34xcooJ@q=l(EHNq(>OQbz`&caR^{>ana|wa>zyM}N>D-7`;XyxX>G zahq~o@t3*Ej)k?u4wrQ(eSoj@e%3mHF~#Oq zuaErRRUfAB!FB7WiFPO7#|J5{FsbxL|%difQft+LG#@u ziH2F*6J2BxdMwrUF47(^Ae03Z zBifh_WIjAU`k#992%k>MK`RA?zDifb$J_~4O15&iNMOXJMsVbnZv`XE^2^`cl3~f# za^phJTT!2@(vS4b-XsX9xzZYO#es+a33fL-^V07RWsF1&z9qQ_yML=$yfH1Zt#0NH+7JmVX3KEOguJh%iGr6FC#M>N)ja5}HDIe9&s`xG+Q5(qFqL#nd(> zqaboYguFy}Er&xmpueYRg85ssVceJP62xOpu}#QZnzH^sL#chvc!?oqneCrH9(V78 z1+N^waM-u<3ZBYu+hD!4!^5`ve^aJYmn)J)JFYSoM}a}!2$i{i`qGJ*TFw+IcJJVi zjpsekc|VE{rbb8p@js#@+g@7Vc{$`Gs?iOaFpFBOH}?rCFRc!oZS-+m?gKL+kz3_x zHTtGSnxpYYz^ZUsd7Y7+Fitoa z?5edz7QyfE9^?cG*FOgl5NJ27R}%4Fr{t73Lf)Np*G^5*fJYoB27KefS2Rd5D4j`L zFE~j1qpsMMzx(`Am3@~ItZ_~ikht|<1GC9WYHACuf!Lumacynw33@p>xjL8mdkhTR ziT!81w>GG{-9Vpn#rH+n>4>=U(Q&nMy~8ZNw3cXaC53)|^aad$IreLi!I~WdJH>{m z@K7JLXAQ7=2H%=n4vr6bc($>-ZFLnDPXq+80Gw4-RYk0|hmbaTZ@YVVM8?G6aVMy= zQp%0rt&yWnq9zmyk^7RkQ(oc?|`4q?{aJ>7v1kZ*AyyzR~ zWaIO>xjC>n@b}ml=p$ySfVGVcBQ34Z@$ri*E6-ujxO~NUHh@c)npE-$_(R;+OK*i} z$-~Alb?%j23}(?^-Xr!wvJTUEpq<}#?~07}R>Q4cww2Ab)w#*Bx4Z7&q+V_*M+-X7 zj*pJIjb_O+be~}`{=U9TOH1HRA7QbwYI(O%Dv6Ptu5aNnDP+J zsemdKFh_mIddJR9@--dQdbf$!!}u0R532urpSXc{m6EG0;V;agOp`-~#?rlHWMt7% zQKzL@SDxjU#5p5tL0LqZQO(D2y<&q3+u`(dNqC_S=P@}@0Juw6IzhQ(`<1+B?aVf5 zWXh~iOM>~>E}z=RqpMBOKQnMkv4F}I!EU!EKIyH6$+2mfL=d0;bm}ol=4rUY1S?!g z`6%dG```M%+aVSLgu+;br2?=(s)$DK?R$6c0!@)Ou^)V9$N>fet6KvSZ(Jybs8m>> z$b`oO(dCebM)$K;h7tfUXUPIiE1JC>mFMd0?f0%|pG^1tNjpyy$1WyHN(cjE=F%pB ziUo?lRsBm2A=5Jq37D_YxLj}T5mrY-@@Ko)QV>s#H z>;K`SNqCImVONaCD-~iBsK)*Q+y7FgPak=j#Nc?A4Z;(W(Vbh_JNcc7CTM@;A#UeD9 z!YLYty#8QZ){+kKr6VDVUwEXmfzy|kSa~tdv?U_HShf}K%W?Sxx(a2TU3n{%nxqs+ zml6{Yk$m51kVYq~WS%?kdZGJ+Rz3;;Z`8eaR8-s3Hi%+IL_k4_+9V~4GeIp?pA_jlJfGylBrns;W_n)}DScQt)Z@3YU| zwX2?bsviAWX}nhMk_i8d;@gB;mmhz8SU+7#fwL>+X1UirdVrkmagK5A;wfH|W*VzU zdEZ{5jAtf#^Xc6Bsy80mpgG>>-A4Jvi}(+|sPw{#xxIT}XsG7(4FjQvUEY1T)#!O~ z7EW!;RLApKzpn-aROnrC>yyAgKPJG+_B-E^6J?@l-VGxY0me7`4=_fQ?eCHCS-VFnmFy8 z+0Z}cO!)T%a*6M@86q+^hTwWEeXgY<@Q4vC|5jD}fRV1Z`Z)qjvA&C+y z)LZ$-1*l|C!H4^_UNw$oS9cx#s+dU|XIXv-kAeK$r#Df5CWVjD35sdQ!cHGntN>Kx zI&T47I8=Dsz(~iL@_I6Xcj|^Vf4u02eVcBfc$_z0M3y6$Dy$SNQ(c)xUn7eEn2jG9 zt7OPBUAjo~dHbLI?#R28d75hTcMDxQYvF(S+QqZrYLY#=bybEM8?L48&a9YPwW*D> zl_tY@a$tCe5VEDk)dQE-UR=45-`4wGfJ9x9kuL5RWjK#*-frv8dEb!e2w7)p29#5f z(zQ=>xO^BMj>uZ}|zod4DIr8PP6@AQI z-c!Ia_DTWS0GuQcS=D9M5e1|M3{O_Dz!Q;Of(K>RyEHYATi83*SABYu_GJarY2TUW zMuOQ|&rpoaslC?1UywOE3nVkjq8k01?yjOtG_Ds%u8T>$fd{UM+6Vxw7mY3UdhC&m zJ2K_*^+pdwoyk-c>$jLHgW%e{ksK3CSa9gc8S~C~TViC)XJE`;d4uDwr16+~QMs8G zh6!h!V*wi11`{Dy?}th9<`*mKV4tb8Ru+9biuHaV&TMf-=@wQzK6`uAtXTX3n%Mb3 z_km`L2JQflZZ4(H<;VI>*i%25)_2<5eq7=s^j(}^(le{F=WENpg?+nS>TydzXs-O9G`KVz% zF6urPHgcWT8mH`1Mnqr!W;R`1Z%|qKm_NKS(e#9A!JCWe=^N+H9aM3^vvrU2s#~v; zXjIx5yEnhOkTn=|%yRZLDvssXPWEe7QA+q@_r$LX*CQ60d%dJ-kk(LN*j)P1-oS^R zTr%#;^(BXwwrw(R*xoSWh3T;Rm;+a7@wxM?X}i!9I`XPtu6nNHzzxs!q~=wJEJHQs zA?>y1o88JDV=v^{=(mi1k^C95D zr~a_=nnDWQc|H$f1Mm?!S@k8Is`;IXp2AtTv-c2ri;B?SpyijwVzo={C^zJ9V9Vk| zJZ2b?YfnTa*hq&Gv5)w}qKWL6c!=a=@ol|lcei@Kzg0l4et5w4fZ-Jh(Nhh%4}NZc zVCj${zb&oir70wAIz7q_pZEq_5LyE}Vo2S2Y^ zi6X0D+aXBFW)qIkFtT~Sl_l6aZ7JRls@BSnyfG6+X36cU5TS*vFpM~UeuB=l(}y`& z)4F1K8D1-uJ5_OpVj9L!VT43gm z7aB@pdqQ4p5puIZ_|S@ID=we_l1&Nys4 z+6(zH_>=N|tN#cgkI?Hl^_4P#!HknY~`%i{33@B^e^3)@Z zRT$@aWAw*Ailx0_&sK~CsrrLHC)II$AYzL+v!{)imwSE_$NXfC zta8+FdRDDn#>a~I=KmU_sI%w7!EY{ZLvy?OMwIWhJpuO(H~i9V9L`?Y1<3JvC#Kj{ z)Y=)=p94J`X?j7_6?D+&D0e!+Fyv`I1NgVE8;hpBc4?T55aVq$mI%X4fYixFYn+E11fwJe%NtA~3VdwZ$_ z<;SMHZYr7bgzdZ9Zj$?&u;Yz}*e~_RR${Wtm!~+lzghGU1 z*HBhJ*l)H~fDOdKR>5*G4foTULG=-Ec+}p#Ep+lT(GYdNBc%C8$9wn$h3x=H# zQod(LJ|a8Q4M57319L_t3PM?GY=85Gg=tYr(UV{@ATdA+-lAfUo)BUpvy-mjStDM}vAv(m58J@k+r|+gbi{IHfGQGI;LHc^(f~f-@ zDGg zl>rT-nx?+z6ciQpHa9QMkwbtq=8-NjrBD;Qa2riabP?bV1D{6(qPTti3ei6oiF+p2 zA1B0m*GOa&QE}c6+e?(nWFQQPLLUyBM4INf-M|v&UBzM`P$_9zto}d{`R$vHtt~J& zs;jHLQ}XgS@7_&S<4^iYfr#q+1KEH{2^1^#lOxoN_=0ytI znq5A?Rvu1PtegS91SZpZd)xItjh&apjwXT>Djui!rP)>Po&ARZko@LJG;If$YvN9p z{2hP;k`)<`j*cLYaefwp_WJsVq@<*fF|E+SS=wp(^V#RcBlIRq% z&$`J!dzn)N*||4w-XKst1g=n@C>ED-KId*R_)mlZ<%#XLWG2prw^pGm-Q^JvGMEbA z8-Njy{nefTfxjL=R|~l}$vg!Z!1uOw%RiJ1z%0{M8CteoiZ5}@J=cE}64#V?39(Q4 z=90-ja?PG_)9aQTz?(6={SLPcN2Qwj0lhwPfE@9{m5L`|8s&MKKW(1NGm%DvgHo-M zmp?`7-(X@m<-~b|lqpgJlDI2a3C5qo=OY9LJ znTgl{q-sZYhMs$(rZ1bMXZd&wk1C0!c%3tw>ASGaC6e&Wnw+D#9bX*`U=^836XT@m z@e>@gA1u3WlG+yuZO!J$M&|(Gi)n#)XRNWFiO-JZD+bc-QuZ4Vvw5hzQZk?iCL}?27DK*BjW_ zn*t)v#s|& zg_c86wRc5e^sMOMoy0E*Q-^(yl0yTL;~@Uz29^{8rPoh}Kgl)SrH}h_%-Zse8F31Z zFPn}u532fO;7?5~%n(_4gamxn{>e`@`{*|WfJ89||6HpI^dU+EfTNg+p3M7nk;GWG zcM%yCDnTUTq@fKdrL)h)HOzddA6o#7v zxalmSy08=>n!kkdhv|m zyZyYa?E74|;=m>D-H*e;k5;H*8FBWs6%6gjqI;4rb|jJF^&Z8SyV|_;0j>AS_+Emp zHF9YB`l;6cQM?nJ7HL3(Oqk@h7UrW|3k^zyC*sXg`x*{{fZ*3arreaP2D}kEeiU-q zvlSeBa%%}x$!nef*>k7cKGW%6TjV8w@_pjh9UDO$H&_9lSC8*403=UX+!wKBIP?zI zodZ45MV*DY$7t#6bw5svdM3)JeO;=k<)@Na?m10K;K6nw|EGvwJU+wnk0w|U*G74S zai02jn*%`$Z8N969{(Nrafc*IgDT<;5TnM}=s12Xa}YY;4O>#G`{+J#t9P{5HxSg7zFrX=t6+Ut98gnOKW zWRA@2k{p^sO2ZS34*s9oz!yMKKwq1k>Sg-r3t(Ul^m-Lms=p=>&HPay$6o{q`*|r{ zB8MoOy=U!Y)D;!3z(Jkv-8Yp zg_Gd{A{T#{S}MT8-3P2ACwNieT%12)$phYb)%cAFoEu=T0cKSZEJ$WUeox*^h_X!c zJLb;e3uS;R;iIdBN3OJ-=`lgb!^|zNKva%{hIbLKWkA!I2+>}9%>eeQ&-iJ*w0 zCNh)QQ$;r;5x)ybN=6HPhkOu@AViUe^#% z4*p=6gr`h*QdM(S=mA~X+{TFh1uIVdy}XyqC7MNqqu@hU6uKD(fv=TV+kb%g+ijSP zUg!AigtwUevt0PAHW14GCF&7CB9d+BF+B>!MkD@{VkHBbKRRgcGN) zWeJc-1CqY#*~33OkKhNRI-eP0D!gi5A<$DCP*oxi@9C4oBn?tFLyDgGskB}DUa2<> z!`DY4RlS4*&8R}uz8mExOUVLP$1uKAPf?+ef+H@c3CIAy8OLz)@5hEz%HO#a2df%7 z8iHY<`EexUplM7+2<$>CXfX+|Hw~bit$AsO`vmXOUhw6L^ph?*zw}GczPwm6kRRHa(*r zV*Zy@=!4k?TzzdPqWCy}c0<(q5eGpcwq`anb`cB{fRM#8B$tLm*6^n)<*(~-CzaQM z5AlHyj({+u?{=5acHMrtz2qXY8i>VNu*9jF#S^AykQyUzS9ORJJfo$e$Mk0wI*3%kJvl#*F(` zmx@NA`2**rT*v~m1~UE4kby%3Z@G;K74RBB1oUsq!CGR&?_T_YI+_(Ot+swNC?^wi zjPK3q)zd8=5K#hs4=9%NJz3PHFc0x@ac|$g#nji<*0#5^^Ye#8*cXTWHlABZO%xEE z`YYy23-W%_ZMN-Sq|#Rt-w9LyXm~N+&A9#ScwlnJxxkT z2nq?I7IetAUm1py!bF7}Lk)Fx^`$qj^z^Wy1VzD8G-}vr?iklyM?mGNj{(iU-!AW34hG=U_i^F3QDNTEAID7)_a=;&yFfB%e( z4Ctm2NG}WdmW=P;iHL}ho^|x}^pL4r)iSCkB8hJJ^McFz$KvS1Z`i)-P1Wsjft7fK zkT#Ak*+Sqc8cT|uh0M=`RrgWz9aV`s^3T9^OySDIR)ogJzJPVmJ2gH&o|l*Rl|_T7 zy)9Ov=ert*!|JGj{c?6$lYJuog}V0Xz!!__L2jzoNJqQEvB?h}qCYC6_FK}I0eRJw zP|G8Hz>yop$?b{x_FZLxN0Hi^8~zv}W!-iTsF>-I0yIBl)o+27v>CNG37Xl%kG zVhxP}ELM?+r|@aKq|)+ByxWBSSF{{O(HY_Wz6(=-;pacSq6&(PuAjeX+3`aVT#M#pR3&6j*tLjEl2_s za`j7F(FNO;=E!$Jizw9m?9AerAreFQzRh{F97-jOrVV7`5t=*1U3Gz^Oy!aaPzBIf zw)%LWVIh~VgRAS;aIFz6KP0xU$t-&614oUcNW!|{^>U)~qnx{;eB|1u6W*my9|0IV z_WbxCxNSln_av z-#dMgqqnKr=Z%?zA7u@GH0At9iZB2z#aZ!>SHKS>7T0i9C~kha9ejWw*<_hgY7d&W zH79t9F3b+KFR7A?cu0a9SzCwkpK7&rIG$LK+M3N0<+HHMR)x?Tiw+F$nwno1@hY-B8zjlF&Oh>{qc^@M@WGg zzUK8icqR1^h_rP6&IjY26Rubux$>qOCw)0DzkUQX%{B0 z#1!md%LfQLyz7TMX5%d>RZE3ENJL@80l_*>NX7-sYxW^XWiYCk z^SXtATXL${MZ|HW<}XWyEfjke|7wgZ%$2#RfU6D?ctNh*iHLdr)X&@(kwS1JVP@Bl zCV>-!fZ(^;s|gNYDDJJt{^fN|hleN61BBm;Y#{^o*e@a zA?^c|$Ys?5G`#vKb=+;(j*g=;2y?oeqHbp$00EDZ4~M5tlz?#9GOLI(ereF1k;nu# z=BJ4MWut0019LvxN^qi9tUP#tIC}-5voM$h5@?(F|9TMavV6oZUl5~^knC6 z{D-7tA)UXzeB!T~naAdp|+`Ic21GDf z8#={#4u<{Z$sp!0R|mNJT1(ByyN#;r9(;|Y5Fj*GrY-{*d)4@EP#SfC_LD|tS|pru zjDL%`fWo(6;3=Q)0-fj1qDw6MUbnC%t}lIdOU z)q-VRQn+FI8|dojge<0GV`CKoJR0O=fT&mAq_p)x_E=uEfHUMXAi4*nG@*jUwE434 zEKvV|JPm%V7C+Ithwn%iA)ZJCwx+uMEjX3)*TFA*qU<*3O>PNwVhP}uk;3{EU4nQ# z_ruw%gmvwJf(9woBm6GO)r=4Bl*JNg@z~KLc1m@p-gOwiE7+j^J|Y)61Q0e6a@m5M zC`_O_-m1+kIG+fndStr^ag-<}q{kfrc&3m#eX50$s<&Yz42FP2wE3R_jb~^6n>*h> z?+C6bPFccDiGI~^va9XD8RUuYgqM082su5sq3dx9mgvpt7;YerAxtX~*q@tzQ<-7TIVBOixUN*kAGD zz;AhI#`asyQz4n~e{wxI*qgAJpAMCIr$CbYl>tT}6<|?^9Ec?lt2V*=#zULB*O-~) z*Qr}5u=w7(Juf*n9($)aGpX=6BcKCddKDp+P=rA!}GV3|Ou1;orRY8~YLG1P%dGBvUTC!vVktkZS%8!@$Ix*WTe4 zA^1N4!Vbn+!8@x{WaPKyaDzk(@GPL@`$eRn^Vy=C^N&c%hbeR0a1?LoGy)HmJao?uJi2Gp( z2FT}b;awVxDwCutyaS=DTDJ@d0nPom%NkcwGMOJCP9CkcDhQ!sDrwDwxU+5M93Rd( z@P-lttoBDoD%*v%^~`C0dj_#cL+?AnTq~M}Zv!gMc$37agMpHP?6Jx+191Rwygck= zk^QaB;;qW*u3(^x3v5X@q2tklHzO+R0v~^jp=B*~xEE{6}4=1%{7jQ!MTL*hRI+(K4xacbSXfDctQN zDndVz#OSZyKC1+gtiPAwE#L}AHXLR5pZ*Kt2}cjs40m8KRpa+nmMgt;hqHpjQ~Pc1 zFE&-S=AajzzdGFbCVafi4K)TakM7C+O}GI`i{t+NFBlgW7yahY+W`+h`uM11s0V-h z#vJfaza@NXDzVSxx)nugt8s8pQ#U0ZKvk6O4|1cg;T)1071u<67uM3Gr;8J#3~!+z z0yuXme&rc>8m@b~m@67OT{fP+=WsZE}c<(Jkut9)5 zkYONHIbHi zmaCsX13{LIE1JF=kKSIbZ0?Ip?4bKybt&d>0CHC1^3dw$Yd^GlUQ$i{NN0)Yui!|d zRHixaU^M$ogCd3Ro11&DK)Nj~EX*ZjZ~c#Qp*cQD z!xt>Fd=(%M8lFHA2&kRlX zkS6z&BYQkNA4vZ|&9m~dDRdTxMy8!S5M1A7F>A{eoL^Xo2n`i9848CAy7hId3X?N9 zQG5~J`j=PtCRE=k)GYCn27HYaNtLn&LUh1G=D>05RIkOf z(#VE|qcXFW%bX>z&N#e4D&+o6=gD3tgNyX2V+&6(tlBrqapW0*`L9 z%Aw)8<0XB^OPfP_(tQWuEzVP2pzdNniU zBa4qd`?4fhv-GBqz*ujpF&KUVDpd7U zKz-=w@DOsn#H6G=FRI=x^khk)(ah?3n3bMU=-a=I3x}!4`#XHOZB=L;6{*9y{?1_c zizkAmJXU7;>po1dxyo;R{hdiR{|GWe?IQIO9yPyW-n4z~BY?-$>r9djF8#_cAV5ID zE1#%9$!9fre00Fd%3A#%zcZS#JCM56_V-?Eb69P7stCgE$*WiQC)S5_pr~M6IaBKNefkx0!!G z@nSxt=1-L&grUGbTGJx+=!VJ}91nHp?pcLzGq>Z4uw}rZe=p+Vf>LBA@>`r2O8VfB zaPB#A%mAdt!O4%8Pjkx4)VDEuRBXC7-2`M(+k*C}W!3yI!8#=nLp|R4g58L)-L?-K z%<_u#Iw#|a8#C9I46?L;wMDE2#H5%hMw;9mNV6olT&00sH&T;A zbDLoD()EGyC1Wl#Q6_|){TSDQ&}eB*a_NYsy*RfK-o+D&h-{^io|p$wUv zJ=TrjCML!a_q+R0LvyKbg3f`0*_Q#Pzr8hVr31(K+&|@eIHMr|E?D0--r2igYw~JA z-wv_`Hn}`ArFkkSnk+pS0^~uktv$cx?KR~pkHx4^&F1IG&ivY*sPPO{_B zuJXnMK<~)jI-Q99U`T*1^HDoax&2VsD%$uCJXGLz;P&%ywRP=T?BL6<{8Ir4b@?>R ztkx3^_qHD1&w1F(RzHy+<(Blm1gaj_gBX{UZTg{pwvajjx+AMa+`POp-o?{~8%XW} zB~C~!;3*uk@TQ$F!0wi7V$oOGvaKoaFCsAP!9MCtlB#FDBVfyM3=A+wU~~MQ0LVHm zLT*PnbJi3m9RJ@(@CcGt0_Q^D&-)otl@y+W)ojYPOd}{cJtr*jR-tC-le7@ra0|=L2^B0jWQ^%Cn@?o+eN(Up z7uD_;ug_6JPCJ}m9XvNEp$sLT3%j{6H;>6^(H>N}ot(`~lSRvs#mRB9cEYhP4TRA2 zq2jQ>2cHXd&+8Z%$VPlSH7X+ZpT)o#DU(^Yb8kaZu|M*>QQz5DY=b&-C~kHv7lhcI z*NLAhyQS_&|G<-Gl2wrxf`ahWc(3H##E|r0Xb~XU8jFVjNk~B~4vyKEFrDyF?ax7K zpFeAV{-zZAMd`dw2~ch{tZAf7bYUx6sF>J0bI7pcdB_ipLV*X4A$zLk-ktP&e7X0S zDis-3NWLmw3u$UhSTBpSDi&AMq~~z#_+uQCuB&$ox^as>H+i9FVs2;v|9)YpYyPf4 z)x-GTNdn7~#1c!Atc9ri{lB1Z2+%%q=l}ZxiT~vdURL0>J-_7j67cD#PoIJ#Fj41U zSWqwx6&O%$DtU<|pUndBWoSMFRsC<0lV`rrJ?8ZT;N_n`$8OVEQrH7oDo3{t!0erc z9=Sw?ni{Cayar!DbPW%_K+!mKS@iYAFP$G9{Tv?NXb+tupi=VMKDHv^z#=)es!GT`2B}ewrq0Pgj?#6Aujy4aIBZ zURh)%)Md0B92~Loq0!N;nNR@$tq3;$4}*Zt%m>>`P)CkY^sK@Mia>D; z6aFtH=bXMhYiH{H7NY-B&OBTy-3d+Cj3A?)JLb{CI|7ulw zNXlr4vz+_LWe4c7G4xxjs1P3UG9*t`bOI7qqXshz3sgWv4Ri4D@NjYE1JBGQ zb@j%^hJfAT9U|{ulI_OQl9KVshV-jMMB|H#i<6VT?Qi$fGc$h&pVWHh&-^3X#-=8V zp^~ZP<>lE~$ffk(gY_pUb2h4gUzQ&9=uI z@5o3?^SkWc8`&~Wg9aBFTBY2Af|})1+e-r`-QO?b<3lYtOVGD(WiP7V1EFS33qt~5 zU+vE~fi?qO8kstk72uFV|BDT+@a__;sYa;w*~>gVPo!=T ziJw0=E@7Z+I1i5sDj+ocxKrX0eV~$}VrVEti>2@R+>Z}`zQKjeLqJrNwqpfpv8J}X zy!_N`OKU3+JNvI0$(9_NzJY-Vtqd#LT>lF|u%am3N{xvD0Wn?UC$f-J^fwzWthmU^*MN>+}74c-jwZH74DF@6(rwu3$EB7!TsRZSqWIoFvC5ea$| z7Ch|W){znS;W9^<38)0RdGjXH6M@f)cH~u+53mOapW4~kX=)D2i5w-w#}gA0uGLYy zU#8&wjOpm;s5m)x1|}dxbsJDzMocd=TB?A*G2t(g#^%1>z#yGywKdqZ{OP5 zda{_?dU$vU_*?cW+$67{pyKsdRf+9F#nHA#1zry=;h`AH;X z4}oG?dAx7(PTkjoI8qd?XJ%IZ{MTFP*+L2ZNwBHU=Ce>hm)x#d86A~ZRz?<)!S3o< zeAHE+8n8MPbwfbd8>w)e`4b7viF`hOM4{N&*q{*yY91VAadGkd$E?-XHnVMG`&$d> zYeYmHP|&rt-70(_6Dxn_{CSIk0$KXN9NdBW`V=5GKFrIv9jiKPZN2e0gf%fC;Wb5_ z_G{Go)>eLY_N};>n3&Me8;J^!(2ySj4N8XqlXTaE?M1J0yCrpS%CQ5LhwDu+d!wVH zO9O>W!O~$e)62`5Sy{02l{7UEM}OgVH(sz!S4vk#PmYe>g0@|6@bM|c&2)o6yoW09 zw`rXfqo&aOZqH7`H^6?w4q6wioDF3@np zWJqq@Foe8pf&D`FQe!X^9Ey0CFMl5tqmGiG4;(7BmvdD*>Zb1veSJ%d87#V`{`_Ya&5ey8y}i{c-O5#&S)m!+ojX6@9Cfg2 zm-YU5^>~|53=MO!G2QZ5Mus-7sED^amJfxh>gu{)dGi?0+S(eHK3MU5ixKT|b`};E zc6Li3g`R$M3)&VZB)p?+h~&3b&wehZuRqotU~8a5kPfJgK<6SCU@G(%TAY9t zkckphE3W|-!mnR1AiM>zq`kdeSy|c3%j^C7_bw`Fj=X-QU?za>iq(*jkpbZc>*?m3 zA|jO_0Blit)ZNmuG~E)hQnqnrq{g@mPB)9*>=)3&Wu65L7bIGt4?S2KKX30BQuhhN z!oy2SOOun6k=8~lXRa$jKwX6}kH?>FQH3vpi<~*8nq#ih?%Qwf4TN z>)COtG)nUFSD|$B)vLr~&gP~jA0MCGyu8iTRg901HMDDEVhV)TcH>cHWrC@S>W)Oz z4#LpXj+As}YHG`-)fcwIyLV@xn-q7G7+4K4u{UVcqlXVyH#dJv8E4QkFaT5%8Wsiu zX}^D??F3KYk4NAcWUnQBeUKLOiw&iv{|yH&?4DevW4`Z1v#Q+UcpODOin@ zlbS`ZU(91u8yXtGoSSlcgRMlIriT14K|vq~Wd8D{!qcY#U%pi7uRfHO?ds_%%+CHS zofr@h05`6yV_;yAl9B?^f{&O2ixG1}LtdL%`HH31?c!oFp6kS5(dGZ*r#w{9%uPE=Hm#79>;4G=g z1L5Epdp}#(5*uoZl5a|#bO}K&ih02s{C0(C{yn#sx>t8zG%kFGJ^#c@egMakF)?U` z4EYl0d+DdY>@V6%Mu@XOBba2CBXQ(o?YmDB+mePO)UO+RKcr(rO1i-fCmmH}d~kE* z0hZ1TFaLL{;=024Jz``uKRI4ACYC8S^`FXT#S(#EdY7#|T)P#ylP%_1L+}rxC6iOv zHne`G|FUFsOclLDg4sHAnsB5G`NpdMv%9>BiW=m{d7M}xLgyJhI@+t3-o1Py`jGb4 z8)AV(8($?QtLza`_7yPeZJSK+TQ?GjCN$i4pilI{QP*YMB$ z{{J$l`gbM$k00T8e)%bekToq1WR8DU#v}qD1#5>&oCW#s|6tNt81ubwaNJ)#LW?Q> zPj41gRKRm}_Tg^kO=M7c6bwjIl=oNI-lG=ipU9`a|KGoM?>*Mh>%^p&cJ)u1Qy0&iej|Si zd%I&MNFi7uEx27-Kq3R~gl(59Wk&Au>U2Qn!#hv!HX^%SeLj?AI~A@Mr^KZNSOUkx z_`(@+N+?MEu);qdTHpoum%0NyI%qbC<8e+lMfcWK|OPBIb$I71vyb~;5&AXQw z{J9xQvC4Nkx{`LzA)j3*y72C$R)tRrhx#?+v*OLR@F9-8_2~e#3E7!^FiUEc$TNAU z$i;A7l#US3D8L^__N_w~AS4uTM4h7$1VL1&{p*=TIyq0w!x%cDzm{g+x0@5sxS{hF zDr0W?GICS@JX$fMXMf)p1pcxA4=uI79h1mXuz5CNGD-3A6VELeu66gdRzjdT{^cbl zCFNs0Jdl4mar*!=NoT#hpb6WwzW)37=UgiE!fEc#J(bk|8lnPfGsG1pr#$up0|QA< z?)|FiYZxAeKBO_rx3S7y_CHg0KX{{Up0DUbE7Zo5&3m^~V4NahyHb_kJXh$a;CtnOS(5|#RSesgl zuhiNM1N6$;3M6r7)&dPcK(m(wdM_WlI+t_J;2Ri7ZJ7@gtn68}6QDWmHdm=h+|~9h zk2LJ>GBJ^J#Oi%;J`QLC%5TiJ;mnFW5iJ# zpFk!nON+0Dl_@yQOkmq|B!_2OjA8)9eL(%-n~=3SNYY|??%ug`*{~-NV`^sh)_*1A zo6`*2uKv!jC;A$-bp&S8syIaFU`B8sTInv2WRXU%7*gJ4VIdbWk~C85>+)gP%}kVh z5?$U_l31CTc$V65 z%x?Ajxt;Aq66FZ5c>~(Ib3|>vnA7sP?sO<3Ahe z+n4I6)*CvfIk#R5xIB+|2pLj}6kVwD3Fc3y6tYWe6rmKc4A;6LY&y#1v^hTh<-y1y zr$g^HNfAwU#vGPnRIt;&pk~1!DCQfIvWv<_5O+p zlAZ#QmZVmPnbH+^$9;MrB382MXj!m1NEEo#^g|2bfa>!+hwqnuCrp9_^`Gz!@a*o6 zK@liOH#C)~K<+&Gr?1?FIuMN#DruFJEfyS+d@hmz%9<4}sLMS#Mq>vaVwj z3({gG&K>R#ko^@tJ>HzKKYRMkeza-|h_Ha*i~9qAH+X>QjM6mIZ(GyY^^cdN&O2A= zkXzYXtS^_TA*&yL8vCau!X93-pWhV_+@l0?YxHn(LV`{0;tniP@A{seg{`|2loX2) z6x)GT+VbHPv^Ops-rF6mU@@1~WEzo9RA2!C*w`bD=#BW3i9H?Y$xQ>=d`&z_a^_dSo;+afcRo2 zCnN3m(G8eZW*RDUK7pXwaqqVGv(&+%2wnlciq+eVjZHK(x}ZM4wY3TQXJvvBIZGgh z$j4W_Xa)8}+Bn=dKNyX=DVP$ikcb7i@_2}zmL4?9Zrr@NzwZG0+ad<7pFYWWDHwqO zguZ@wK)_9^n`SS}yQ@Z2n2%>19zK$#L4nzWKKSXkc|bT=BY)F6yHGc|75+ckO>%DT zrk~%o@US-Y-+nAB?R1Tt)Z+Q`(TRyy`s!KbH$ZPgL7@{yx$Sh7Y?`VklR{q1ez+CRY@VQPI=#hOyg$|5_k-3QAAQ9rWp z@wD|Y#KA%1HzD)M7ka^Gy&vS{VmBY3R!~=$M0YDIgTx8r4n5IFtowVYAa-+5l$1;= zFOQ7Q>e-OHYu;B-8YkZWyQ`*dMrTa;J|jH~i&myQZ|}gtzC+px39p}Soi}tTht#h4 zO9dB~x6r&iD~ojCHYiAni^pYT$OaEf&l^vSQ-OfW(4gkfkY+lIx2s1=5F^13eQ;@! z-pnKkX-Ia{%`ml>lxv-prquMbHFXTV{ptq?dx9rs8Q-C@H75Hrrk8TKlsYUpc<6Um zao@9{FunU~&^ldN*)Kl6JUXjz|2BvWD1MV>CQ`a$d_RntN#Fyb=YOQk9%8R!uOys2=TBFF)AfOI=g8|(x*Wo&3Kud9#{wS}CubuQzMj;i7{ zO3H}vaB~BLiRJ12Z$HDogwqE$U>+taCM6`z&CRQ+sVNS>nc&?fad0RSa{UaA;u#pu z>riJwGa@94L@@%EX7sF(vGOOA$Oxu>7Q$Iw;tBdpR#0H<-G2MFs;tb#j*o|jjgG5j z_|MlPF%WF}`!$?r5Cfe8(X4^8|_g=d|Vi%U^%?jY57v|2wn=mG+G&dviMEz2`3>u@8mF_H&U%3TK-=uj z-nC5;avQ%~Dqp-Jra4%hRk1hMzvaH)RDgGB7i2s^oz7rr53IJ^{>VD?>fa)vrfvnH z;hDwB-JX&bCY6&G?&C7On%2k4i+#nhwoE4=F{udcTJykTA`saVABuyaC(GX4X^>j^ zi0-myyUAy#uCLz>I*Wj;fay#^=BNFaTVF@b;vVC*kLE%juC_0Rb;2QjgLLOJ#%=$Y z>DjZu$OXzj6~k_vJ@M8hXnH( z900HRXtK68H&zf?d3yDOKrAN3^`JnBjP?qZ@DuduH>2rnB2O9Ar{f8RhYL?0zIfW6 zI%*C20m0`Tz@PS;_zGLyP&C?Dii$$e=9^aNPWNToG~NBp<>5r@4GLI zX0M+Vk2IHB94XSS`$Se?IF`Kl>KpeF6a=q<&do1|?HtO?cbd^$Gq@=A^$i}H_xPx| z;Uh^{D07|k+NG9Eh#p<7-_1Wi4j8CgBDi$PN?(8i6Yvoh> zsDk`_=q7ho$l1nGITd7B>Eg_X_|ppCNukRRj^Ba|@fHc}l9~~hVUT|U5N&eNVyt>+ zyO+tT)ST(O0FvoHo@2y*sd;_97m&kH@4er(XP zH@ew}w`dGXf$k@35uTn}vcp**X6Rb#aFKASFXy=PtWNIJGiYpvNpf)I(Rbl8xhVdF z8kLdsXMUi{AvfY)bBqD)_ao55MWfn-ed;nmmi5Yj{i5y>`b71}Br8fQSh~w!gl(Y6 z@qADPA;_|IP;5Mt|vo$r8^XQ=UYK0+IeSjyK0|+O8B^?P=xdvNlrR= z7biOtaq!sL>9C(Rh9h+Lbk&$iTEn*XLEo4@E@vXiK>wA1fIt+UaLN^oj_c9Hv8U7n z)L2cf6!bB;83WtE4c?O2Tv$xK&f&iV0U_f=n-*}zV= zZ#0{x4BFtylEwJE75Hb))U3}d_ip0hZGdXGSq3I`5Cd8sFSZ&8R&YC|y`h`cp_SYM=0Ee%bum#~_98MWv;tm$~(u zwcMR&n(NLKuya4Je{Ij!Pja{8bYhT#{bTZwjpH>@W$8C0my#bJozZEl$)_vM>J&*2%>WtO99gQeeJE@4-u7Z9*t&r9x&?X0N@i`-$Ljf%SWN;!jG zH1OT;&S;lyU+F|3s?Bxqy^jpiDGS}7n;99l&sWc|n|{UyDnKQ+O>LiVm1|edu1tYv zc{H?Aag?q@~Rhi0r>jRE>PXW3v5t(M~TNlbwCl^H=s}w9?7WT#x_y*`*G;_ZU?h zNWqr5@cCj&?3Punsf)`PnV3Fc4qaTuCEgkfy_KO~!lvRL_^@hAXY8ft=)NZoP)I#o zY+9K=>|vwT(c>}p8@WH%wNYDG)o0zXb!crY_`GnyeIU2a_m{Rot4>O>Ykkb|ciByl zLS}cB>P}5b*`3iL?cTTOn#Z^AKauGu?rW|15*Wci;uAkmXlrM8|Hh~EZqsiEEoJX3 z6iza=TZuB{@3^e(B?}4-dK*?JEhSMFn2oeleCku{grCffc1?_lY3o<-E`D~NLFz+Q zRoslW!^D&FZ@E9L?sMdN*JIPtx{RY8m-83G)Toxtb?ZLe5VA@MjF)h9tYOL;A+q*1 zJht$;LdD;oX#MF!DLEk>ZPc=e!{RZnB|BxDYT9FIei8RyzJYLTLIfAh|9TbEZfIj= z^ISmlVFj;a|6)_Bk!kd|!LmosqV+5u8yGOy;XD#_)UTRUOX~D2-F0637+*J0YUB4p zY+G7=f5y79a;DtaaXw6iacZ44Qn%NcW_dLSd8Im(d}Jr%Oe;ab!2|vMHggoZCMJQA zkpd>$KHtfAuy>*7!Sj2jeI=cnh6_AqbdWY{6)tza+MXQkzOnP=`Z>>EBdvw5isZ5K z4!iYhVYxcr!_Ioo?s)n1jX-*>GhU;|xx36@Bh~@kSFfe4>wATpSEc{?dDV$?HpG`sQ-iP*YRq^Lx#1 z(@LQEB>ArJ0s+^JPfW*Jb>bjwqfwzhCz5{ooJ1B?&P1K>;*HKIr7c+ML%F*HMa}?E?>5GHqDLWy3pT)!U75$*DZt{(vV*=;lXrC|g9 zxtDe;e5*(P8?akKLJUIwuzx?A+6=SSaksA%bFgyk%C**RZDRT?O{c|Qm*;N`uoxs- zbR3t;`423^7KiLHbm}NF!4#eS`~{1$txD-VUsAubeb54>aO9|{n-UDL=cffVxH!AX z$)J@kH>VwK!$Pw$H>3T^yFhE8n?>V2+rD%0oMNE2952^Q4G(Boo0*!H*!blX7B;ms zxx?#JP+*PNHtJ0JUzELNRF&KJ28tr0q97qCDVtJ|kW^aOgro@4AR!^$U5ZG9h;#`^ zNynx;MM>!v>D(aQckc81k8!`;FL#VHhGzip-s@d!uG#Z>?hqyk+pDJc6RF?+FwXx( zK%h8VNk#j!%fFk1Mn(%o=<#|_xA=l}?~|6oyqrJ22f8Az1~Z++C+7!E3BVzux!*QP zv+6N_`o6g*iT?`D)%EFmtA!Fjcc%iAB;_&xjXkxcQ`DA8`O+l&c}%j~IQOMy9bm@| z-3vZ!Aeb31(Qn(NTBA-84h#UVL|I+kAx1#;)vJc{)kFwwHYe(4_tcV2v`ATXRqbh_ zWX?9V3MqvvHwyhkX1p#H01bJC$T?$L0I9z1NkxGc%B3TEhx>OO>&q!*N7#}AmQRnqfclx+W(t)|2L{mRBj4s1e-sIz z99`X~OyBT066$Bl$MqFhnj?VVt}(UJuwo`+gPr6?U9F(iMgCj5noU(21_mQO+3)Ep z=mfGqGP2gs3%tCh+3OCu316xFY&hPxO8Hrh8U&m46e6_YIFVKXt~eg1cCjZ44T6jANA7yq!sdbBbs zpterPeQ#Y7Ipc9qs$1x6Q#4cWI@Iv%VzR+RS?_B@liuMhKAoLhI5DADy7J+|Aoo7b zQImV2_rV^M2wS`rEnG4@I0!URqvD6&3>x5@pbMJ$KWDsr#8)}Me zXpDGVoS`id%%r(i(~a*9Dak^<8yA$8iXhuM`Uu^K8G}HZqbV?eC~<2$c$$VZ=QC!&C))PfajFW_I4sAv;=8iXcPAjCscA#|MA-U{Iq*AT&?ibynRkNQ;z)C^gaqWq%yLSjs35I zlH45};7NEJn5{D*y-yT-j6>CM#P4;qCz#&9yfRzwJn|8(Q{6+mM3caX8JcHl z2Zy;aUGD_4gy(fupz7=g>OU4=iIuMTU{kw;I+AL8)cjzq1MPXxon_HGv*ewU?8g6q z3OZ)So5BFbdQS%r~8G8(bDun+sm9mVB~xHKS`vVss|<#D~p&g z=pWMJ%~J=FDet~0QQQU*Q`Qomn_qWW}-&Q?~LKbMGo+%ij~ToN5oL z?(fi>2opk16sIW1fbeZ{Ib05`ne16!s+gb^Pw#xhz?)NTu@*+@v@&VxVvr z6pouR8YUhH_+iT3P9=Qa_qr{i+F?@^dDWMecALcfF5Y!~ZXGV8%`vKoxk^pGyQwb@ z+p=hi3OmC^PU3}VQBIX>Ez`C7^VwdT(>a?B{MNc}I9x$nIX##uvZWBv%8f)Kws-b& z_Grwx>vUed;xQ-P7%HV$J7$cKu0L9hgrvEUJ9B|**0j5wgN@7VQI>~it%my!a8ZsD z{~|Xp%rq%t`5eg@LKyhr)vKW_1tvnJ24Nv=?6W}VF^F(9mKJo)?CDk6@4hr;waKUJ zsoe3CZ|0~WPO)xlDb3r#?TiM`%VlSeOrGji96rqC_Fj5TW6f*%J|>2#Ms;&_wb?CM zh2@Kd$#4|I{YG^6$m=)W%>lE%xCHA`$mh?ON=xmB%(@GNP6D$%RT8pN+!CkE+YKYf zq85Dp!+tEha`rBOjMc`{nmBTJm~&X9^85F3mx*96=WxZ8)^XDbDU?1t=~`PtLQJpb z8|Z{-JnnLFt0bV}_Xz-dtj|pj(FnY2!1C_}mi2G(N!9_#=I6vP?wd2y7Sh33S}*B~ zyJvW`@?x?-p67$Vzd{`M@JNS1xp|g5X<~A6Q$cnJ<>OdK!>ygYd)!}vt|V-ualg$9>(S7Aq( zCS^zQ&#?w~2G%;XPyfY1r`m+`rst7gR>R?X%gNdhm*YPd(gm##{?HsrNa(&|Z?~f! zyk3-wJ(krwFkrac_YO(oJnxd9emnA$O;Ftx_BtEGuS-5&b@GP1R;TvL?WF@8&=zre z+PoofKpsjtwI`76xE77)eX_lrN>!{Q@Q~!EVF&T3tSA!lYi!=}qW4|aLSsN8fCZH8 z_B9Cf>kkWGhqrBP9USCme?d=pXV=!g4+xPo%x_uzV4JQ^5tLF$aAKOkACn^eq;onn z^IdYd2yc!t!TI0MFP%2c+#0HCs>1FH#|DH^2lHi^93)8jyszOs^BH@VGG4uh9+?;( zmP~!IIbL@W89uGQL;d6_|L%(C+zmU0p3wRWr47xITEm+1e8nW;+>tdPi(I8N_B!sW z@>a_aR}_p&c|H0dqa;vm*Uhuxo#7}co%3Aq#_?WW&E(?;9F2o3s`Nxxad85m(}ZtcGl&h*~g_pc)!NOnCsLP;i0)+sDh%9ueE3j@0hn`^7&0#8{-n2lXc+% zoCPLkWtvV?r8+fQ@dx9mP&sKqOOCrGCH9-bWIbYE|H@It zIR&akY6IL!1MTt?2WXKlt6#a_F}M$;ckZ~mx+=tT9FO1x-@Muazt*a~^Yb|DV43>Y z^!ym##Fno69JVq+|KGna5!GHoHO9AQE0P5#lUB;!wEc9nIDUmN@Z^S!%ltoPXc$Ck zmj0bVo$PlcHGF!>#Tus@oD@Q36i>$A!oQ{5?5D`Ucy;kV@Gc$GZ^XP=aId7`%45I6VD-Or;>`lj^ zS{m3vD-16le358ls7Ns>QF1F_W8+a|6n~FBrs3b&Z+P8 Bf6$t#aFiL9C*o!wgX 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 literal 63520 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 DIogkr