From 0abd03b44177fe858e3d24b4858b85bda5b0f554 Mon Sep 17 00:00:00 2001 From: Ross Johnson <159597299+rosco54@users.noreply.github.com> Date: Sat, 6 Apr 2024 17:27:47 +1100 Subject: [PATCH] MonotoneCubic fixes: Line and area charts with null data points now work. RangeArea with null data points now works. RangeArea with forecast line combo chart now works. Refactored to implement full series interpolation before segmenting (segments relate to each other). Fix libs/monotone-cubic.js splice.slice(): NEEDS TO BE PUSHED UPSTREAM was crashing on single point slices. New sample as a regression test to verify most of the above. --- .../range-area-line-combo-monotoneCubic.html | 308 ++++++++++++++++++ .../range-area-line-combo-monotoneCubic.xml | 217 ++++++++++++ .../range-area-line-combo-monotoneCubic.html | 275 ++++++++++++++++ .../range-area-line-combo-monotoneCubic.html | 294 +++++++++++++++++ src/charts/Line.js | 235 ++++++++----- src/libs/monotone-cubic.js | 2 +- .../range-area-line-combo-monotoneCubic.png | Bin 0 -> 35289 bytes 7 files changed, 1249 insertions(+), 82 deletions(-) create mode 100644 samples/react/rangeArea/range-area-line-combo-monotoneCubic.html create mode 100644 samples/source/rangeArea/range-area-line-combo-monotoneCubic.xml create mode 100644 samples/vanilla-js/rangeArea/range-area-line-combo-monotoneCubic.html create mode 100644 samples/vue/rangeArea/range-area-line-combo-monotoneCubic.html create mode 100644 tests/e2e/snapshots/rangeArea/range-area-line-combo-monotoneCubic.png diff --git a/samples/react/rangeArea/range-area-line-combo-monotoneCubic.html b/samples/react/rangeArea/range-area-line-combo-monotoneCubic.html new file mode 100644 index 000000000..c0fa257f2 --- /dev/null +++ b/samples/react/rangeArea/range-area-line-combo-monotoneCubic.html @@ -0,0 +1,308 @@ + + + + + + + Range Area - Line - monotone cubic (Combo) + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ <div id="chart"> + <ReactApexChart options={this.state.options} series={this.state.series} type="rangeArea" height={350} /> +</div> +
+ + + + + + diff --git a/samples/source/rangeArea/range-area-line-combo-monotoneCubic.xml b/samples/source/rangeArea/range-area-line-combo-monotoneCubic.xml new file mode 100644 index 000000000..73cbc8231 --- /dev/null +++ b/samples/source/rangeArea/range-area-line-combo-monotoneCubic.xml @@ -0,0 +1,217 @@ +Range Area - Line - monotone cubic (Combo) + + + + +chart: { + height: 350, + type: 'rangeArea', + animations: { + speed: 500 + } +}, +colors: ['#d4526e', '#33b2df', '#d4526e', '#33b2df'], +dataLabels: { + enabled: false +}, +fill: { + opacity: [0.24, 0.24, 1, 1] +}, +forecastDataPoints: { + count: 2 +}, +stroke: { + curve: 'monotoneCubic', + width: [0, 0, 2, 2] +}, +legend: { + show: true, + customLegendItems: ['Team B', 'Team A'], + inverseOrder: true +}, +title: { + text: 'MonotoneCubic Range Area, Forecast Line, Missing Data' +}, +markers: { + hover: { + sizeOffset: 5 + } +} + + + +[ + { + type: 'rangeArea', + name: 'Team B Range', + + data: [ + { + x: 'Jan', + y: [null, null] + }, + { + x: 'Feb', + y: [1200, 1800] + }, + { + x: 'Mar', + y: [900, 2900] + }, + { + x: 'Apr', + y: [1400, 2700] + }, + { + x: 'May', + y: [2600, 3900] + }, + { + x: 'Jun', + y: [500, 1700] + }, + { + x: 'Jul', + y: [1900, 2300] + }, + { + x: 'Aug', + y: [1000, 1500] + } + ] + }, + + { + type: 'rangeArea', + name: 'Team A Range', + data: [ + { + x: 'Jan', + y: [3100, 3400] + }, + { + x: 'Feb', + y: [4200, 5200] + }, + { + x: 'Mar', + y: [null, null] + }, + { + x: 'Apr', + y: [3400, 3900] + }, + { + x: 'May', + y: [5100, 5900] + }, + { + x: 'Jun', + y: [5400, 6700] + }, + { + x: 'Jul', + y: [4300, 4600] + }, + { + x: 'Aug', + y: [null, null] + } + ] + }, + + { + type: 'line', + name: 'Team B Median', + data: [ + { + x: 'Jan', + y: 1500 + }, + { + x: 'Feb', + y: 1700 + }, + { + x: 'Mar', + y: 1900 + }, + { + x: 'Apr', + y: 2200 + }, + { + x: 'May', + y: 3000 + }, + { + x: 'Jun', + y: 1000 + }, + { + x: 'Jul', + y: 2100 + }, + { + x: 'Aug', + y: 1200 + }, + { + x: 'Sep', + y: 1800 + }, + { + x: 'Oct', + y: 2000 + } + ] + }, + { + type: 'line', + name: 'Team A Median', + data: [ + { + x: 'Jan', + y: 3300 + }, + { + x: 'Feb', + y: 4900 + }, + { + x: 'Mar', + y: 4300 + }, + { + x: 'Apr', + y: 3700 + }, + { + x: 'May', + y: 5500 + }, + { + x: 'Jun', + y: 5900 + }, + { + x: 'Jul', + y: 4500 + }, + { + x: 'Aug', + y: 2400 + }, + { + x: 'Sep', + y: 2100 + }, + { + x: 'Oct', + y: 1500 + } + ] + } +] + + \ No newline at end of file diff --git a/samples/vanilla-js/rangeArea/range-area-line-combo-monotoneCubic.html b/samples/vanilla-js/rangeArea/range-area-line-combo-monotoneCubic.html new file mode 100644 index 000000000..c7cb36ce5 --- /dev/null +++ b/samples/vanilla-js/rangeArea/range-area-line-combo-monotoneCubic.html @@ -0,0 +1,275 @@ + + + + + + + Range Area - Line - monotone cubic (Combo) + + + + + + + + + + + + + + + + + +
+ + + + + + diff --git a/samples/vue/rangeArea/range-area-line-combo-monotoneCubic.html b/samples/vue/rangeArea/range-area-line-combo-monotoneCubic.html new file mode 100644 index 000000000..2563f449d --- /dev/null +++ b/samples/vue/rangeArea/range-area-line-combo-monotoneCubic.html @@ -0,0 +1,294 @@ + + + + + + + Range Area - Line - monotone cubic (Combo) + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+ + +
+ <div id="chart"> + <apexchart type="rangeArea" height="350" :options="chartOptions" :series="series"></apexchart> + </div> +
+ + + + + diff --git a/src/charts/Line.js b/src/charts/Line.js index 16736b2c8..44ebae3a5 100644 --- a/src/charts/Line.js +++ b/src/charts/Line.js @@ -103,7 +103,8 @@ class Line { }) prevY = firstPrevY.prevY if (w.config.stroke.curve === 'monotoneCubic' && series[i][0] === null) { - // we have to discard the y position if 1st dataPoint is null as it causes issues with monotoneCubic path creation + // we have to discard the y position if 1st dataPoint is null as it + // causes issues with monotoneCubic path creation yArrj.push(null) } else { yArrj.push(prevY) @@ -123,7 +124,7 @@ class Line { }) prevY2 = firstPrevY2.prevY pY2 = prevY2 - y2Arrj.push(prevY2) + y2Arrj.push(yArrj[0] !== null ? prevY2 : null) } let pathsFrom = this._calculatePathsFrom({ @@ -137,6 +138,10 @@ class Line { prevY2, }) + // RangeArea will resume with these for the upper path creation + let rYArrj = [yArrj[0]] + let rY2Arrj = [y2Arrj[0]] + const iteratingOpts = { type, series, @@ -175,31 +180,29 @@ class Line { let rangePaths = this._iterateOverDataPoints({ ...iteratingOpts, series: seriesRangeEnd, + xArrj: [x], + yArrj: rYArrj, + y2Arrj: rY2Arrj, pY: pY2, + areaPaths: paths.areaPaths, pathsFrom: pathsFrom2, iterations: seriesRangeEnd[i].length - 1, isRangeStart: false, }) -// if (w.globals.hasNullValues || w.config.forecastDataPoints.count) { - if (w.config.stroke.curve !== 'monotoneCubic') { - // Path may be segmented by nulls in data. - // paths.linePaths should hold (segments * 2) paths (upper and lower) - // the first n segments belong to the lower and the last n segments - // belong to the upper. - // paths.linePaths and rangePaths.linepaths are actually equivalent - // but we retain the distinction below for consistency with the - // unsegmented paths conditional branch. - let segments = paths.linePaths.length / 2 - for (let s = 0; s < segments; s++) { - paths.linePaths[s] = rangePaths.linePaths[s+segments] + paths.linePaths[s] - } - paths.linePaths.splice(segments) - paths.pathFromLine = rangePaths.pathFromLine + paths.pathFromLine - } else { - paths.linePaths[0] = rangePaths.linePath + paths.linePath - paths.pathFromLine = rangePaths.pathFromLine + paths.pathFromLine + // Path may be segmented by nulls in data. + // paths.linePaths should hold (segments * 2) paths (upper and lower) + // the first n segments belong to the lower and the last n segments + // belong to the upper. + // paths.linePaths and rangePaths.linepaths are actually equivalent + // but we retain the distinction below for consistency with the + // unsegmented paths conditional branch. + let segments = paths.linePaths.length / 2 + for (let s = 0; s < segments; s++) { + paths.linePaths[s] = rangePaths.linePaths[s + segments] + paths.linePaths[s] } + paths.linePaths.splice(segments) + paths.pathFromLine = rangePaths.pathFromLine + paths.pathFromLine } this._handlePaths({ type, realIndex, i, paths }) @@ -623,12 +626,16 @@ class Line { xArrj.push(x) // push current Y that will be used as next series's bottom position - if (isNull && w.config.stroke.curve === 'smooth') { + if (isNull + && (w.config.stroke.curve === 'smooth' + || w.config.stroke.curve === 'monotoneCubic') + ) { yArrj.push(null) + y2Arrj.push(null) } else { yArrj.push(y) + y2Arrj.push(y2) } - y2Arrj.push(y2) let pointsPos = this.lineHelpers.calculatePoints({ series, @@ -769,76 +776,142 @@ class Line { }) { let w = this.w let graphics = new Graphics(this.ctx) - const areaBottomY = this.areaBottomY - - if ( - type === 'rangeArea' && - (w.globals.hasNullValues || w.config.forecastDataPoints.count > 0) && - curve === 'monotoneCubic' - ) { - curve = 'straight' - } - + let rangeArea = type === 'rangeArea' let isLowerRangeAreaPath = (type === 'rangeArea' && isRangeStart) switch (curve) { case 'monotoneCubic': - const shouldRenderMonotone = - type === 'rangeArea' - ? xArrj.length === w.globals.dataPoints - : j === series[i].length - 2 - - const smoothInputs = xArrj - .map((_, i) => { - return [xArrj[i], yArrj[i]] + let yAj = isRangeStart ? yArrj : y2Arrj + let getSmoothInputs = (xArr, yArr) => { + return xArr.map((_, i) => { + return [_, yArr[i]] + }) + .filter((_) => _[1] !== null) + } + let getSegmentLengths = (yArr) => { + // Get the segment lengths so the segments can be extracted from + // the null-filtered smoothInputs array + let segLens = [] + let count = 0 + yArr.forEach((_) => { + if (_ !== null) { + count++ + } else if (count > 0) { + segLens.push(count) + count = 0 + } }) - .filter((_) => _[1] !== null) - - if (shouldRenderMonotone && smoothInputs.length > 1) { - const points = spline.points(smoothInputs) - - linePath += svgPath(points) - if (series[i][0] === null) { - // if the first dataPoint is null, we use the linePath directly - areaPath = linePath - } else { - // else, we append the areaPath - areaPath += svgPath(points) + if (count > 0) { + segLens.push(count) } + return segLens + } + let getSegments = (yArr, points) => { + let segLens = getSegmentLengths(yArr) + let segments = [] + for (let i = 0, len = 0; i < segLens.length; len += segLens[i++]) { + segments[i] = spline.slice(points, len, len + segLens[i]) + } + return segments + } - if (isLowerRangeAreaPath) { - // draw the line to connect y with y2; then draw the other end of range - linePath += graphics.line( - xArrj[xArrj.length - 1], - y2Arrj[y2Arrj.length - 1] - ) - - const xArrjInversed = xArrj.slice().reverse() - const y2ArrjInversed = y2Arrj.slice().reverse() - const smoothInputsY2 = xArrjInversed.map((_, i) => { - return [xArrjInversed[i], y2ArrjInversed[i]] - }) - - const pointsY2 = spline.points(smoothInputsY2) + switch (pathState) { + case 0: + // Find start of segment + if (yAj[j + 1] === null) { + break + } + pathState = 1 + // continue through to pathState 1 + case 1: + if (!(rangeArea + ? xArrj.length === series[i].length + : (j === series[i].length - 2)) + ) { + break + } + // continue through to pathState 2 + case 2: + // Interpolate the full series with nulls excluded then extract the + // null delimited segments with interpolated points included. + const _xAj = isRangeStart ? xArrj : xArrj.slice().reverse() + const _yAj = isRangeStart ? yAj : yAj.slice().reverse() + + const smoothInputs = getSmoothInputs(_xAj, _yAj) + const points = smoothInputs.length > 1 + ? spline.points(smoothInputs) + : smoothInputs + + let smoothInputsLower = [] + if (rangeArea) { + if (isLowerRangeAreaPath) { + // As we won't be needing it, borrow areaPaths to retain our + // rangeArea lower points. + areaPaths = smoothInputs + } else { + // Retrieve the corresponding lower raw interpolated points so we + // can join onto its end points. Note: the upper Y2 segments will + // be in the reverse order relative to the lower segments. + smoothInputsLower = areaPaths.reverse() + } + } - linePath += svgPath(pointsY2) + let segmentCount = 0 + let smoothInputsIndex = 0 + getSegments(_yAj, points).forEach((_) => { + segmentCount++ + let svgPoints = svgPath(_) + let _start = smoothInputsIndex + smoothInputsIndex += _.length + let _end = smoothInputsIndex - 1 + if (isLowerRangeAreaPath) { + linePath = + graphics.move( + smoothInputs[_start][0], + smoothInputs[_start][1] + ) + + svgPoints + } else if (rangeArea) { + linePath = + graphics.move( + smoothInputsLower[_start][0], + smoothInputsLower[_start][1] + ) + + graphics.line( + smoothInputs[_start][0], + smoothInputs[_start][1] + ) + + svgPoints + + graphics.line( + smoothInputsLower[_end][0], + smoothInputsLower[_end][1] + ) + } else { + linePath = + graphics.move( + smoothInputs[_start][0], + smoothInputs[_start][1] + ) + + svgPoints + areaPath = + linePath + + graphics.line(smoothInputs[_end][0], areaBottomY) + + graphics.line(smoothInputs[_start][0], areaBottomY) + + 'z' + areaPaths.push(areaPath) + } + linePaths.push(linePath) + }) - // in range area, we don't have separate line and area path - areaPath = linePath - } else { - areaPath += - graphics.line( - smoothInputs[smoothInputs.length - 1][0], - areaBottomY - ) + - graphics.line(smoothInputs[0][0], areaBottomY) + - graphics.move(smoothInputs[0][0], smoothInputs[0][1]) + - 'z' + if (rangeArea && segmentCount > 1 && !isLowerRangeAreaPath) { + // Reverse the order of the upper path segments + let upperLinePaths = linePaths.slice(segmentCount).reverse() + linePaths.splice(segmentCount) + upperLinePaths.forEach((u) => linePaths.push(u)) } - - linePaths.push(linePath) - areaPaths.push(areaPath) + pathState = 0 + break } break case 'smooth': diff --git a/src/libs/monotone-cubic.js b/src/libs/monotone-cubic.js index 7a28ba661..9298565ba 100644 --- a/src/libs/monotone-cubic.js +++ b/src/libs/monotone-cubic.js @@ -137,7 +137,7 @@ export const spline = { if (start) { // Add additional 'C' points - if (pts[1].length < 6) { + if (end - start > 1 && pts[1].length < 6) { const n = pts[0].length pts[1] = [ diff --git a/tests/e2e/snapshots/rangeArea/range-area-line-combo-monotoneCubic.png b/tests/e2e/snapshots/rangeArea/range-area-line-combo-monotoneCubic.png new file mode 100644 index 0000000000000000000000000000000000000000..edf975e4d6a0b27d5a6a482abc60a651ce773a4e GIT binary patch literal 35289 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

m;pX!i}QMVJecd zHLw~24ZGcMDPK&6mc>vk934o4`Co`m#Q2eTHo<~Qj+1ylC$SQz(0>9?;>SO6mHr8P zUn~RX&XJ^=ZqtuNk6xDXKhcnP(li}UE;u}aENZgUJ^M!|Kkf|X;frY59RjYHB@|V4 zkOuJS-&bn}_;OyLLHhgXTrEDPrzfVmuOwAD-`w5V~YQ;w_PS*roVJ-$Z zNEq(Plxs&e4yl^6D52pp&{m#{bbB@vA6I7f6cZ#K0th<2Z*HU$SHu5foaW@gK z^EF~3WXw6G3L%MXi>Q{6PypbT%gj zhi?hs>O>?0`wHSficPZ|AAIjc+Nm+DVfgV1(uPbtztJ%`E^>u zbBU7XzA~5J{7$-vfo1bJk_KZu`-f=U*KiRwFQnvL9Zw-)Gt$})QO`%-3Me6fJIl{5 zSM&94hQuKyUuw0Jxn$pLy6*E`^do<4u@<8S;5c)8syFjtO(X<7k^TP5TV2!TKT(pX z06$xX;;y>w9LrQ716<+K46sYWj6Z$8wm7jRPE>uqNX0B%-CB&#PT21G%hw7odJ-tj zW(BMu5nRG`oWP>>bw5L|CnkZR?tuaq8lto?Wi$Ep#z}cdy($WUnnt&6vzN8pCgY%0 zC(`}&GwoSXFc$RgVo!aZA7w~Dn`ba6Z36~!&gvjPT@b)@b&fp) z>_Uuz1Dj_qZVwE6=Q=?GFOt3+gE{w2x?B-%wDFhzCW4GeZ;w7VLU=?3b|rLY9>0o! z=XfB_xF>{2hx>-6UWgR3EbjwK@+AuIH@B8%)F)mB#sroL)1Lj~(|dDS7pMqxD*`T! z{jn@GABP@z(EYs(fttLuukL6)9(VpEGd^Glchl4@hI>Vx`t&fSb# zhkF7i+~?8JZrO%&J6Fyws~oi-P3K8vKGc+K=V^-+y%BQlU|p^?wnB)&`gj}IxG#H; zGO*WdoI&p)jBuSNup>J>Z`9hHv~NOzyzF(klU2pEq%EYQs5mbP$%e55cd0OxR5Feb zEp4XVb18!g<(koyRA!U#FZ6Y3)uz zJ;%q|-qogg046PL+~m@J-q~0`5))Emny~44iKLlc_w|VTs!Y!xZTm^H53e%SDQnGN z*WzwR{bh~r)usWNBufj4h^$=TMCxlI5$uQ}86fhU&J)x45-$X`70iba)LQWn%XYJ@ zvz8O{Ik(_szRW}<;zD~_BqIaouNAW(j36o7!BTx*SxMPMqJH=NbZMHIc`bF#>r}Nr z5c*C_T@d=kZOeFF;|02)E^*6bJsA`#M_;EuyeBIs>hcgh$Y zd<2`=Uh0H1LVqg34*@#XAx@H8E^k=&ZRND1a}pN7_b=PXhA{$7{M|)h=yl;ELKNJ= zj8Q=9NBfCISCxKocSY1|Lri?y&2rT2sLSWxf`jv%l5!gfJBmNA60HfrJzdE4n12K} zkO82=09D4#>|~XK?-;Y-SQ*+sJXTVoUyZfEPEeiz&Dgr!VE~jxX(DVdqc|wUliasu z3ASY>4eXylP5q0WlYjGsdg{YBvw?H4cSzCXEcQcgm`N?bWVQoQz>0Ub$9-eh?;-BU z(96IE&l0CURU+FEUCFm-b!j$IofirOU|)6pEbD`-X+SQ_9!ttowAJY5&JN3=Vbp$1 z@k1J>0o==NJFS>-@LS?1*bzv0Ah|c!(@)*cBrpKjHAs>Yh~C{mwF$hKYHYgP*Tu8m z+nIKA2feIwyWPKJ@2AC%>E36Z0;F@yGbS+N@q3lzf0;4y{-MiVQ6eLledv{rt|mt- zg7(0Oy-uvaKQyTjFjD`rb}-<%))&Fd*(6VvYvJdi8 z4m-j}prM>Fj8_>%(y@XZn+NnI!Yb*?gr+{!Jw)H=-M3`Uk6O)VaOOfn%2<`0&~Gro(amTk}@MS+<< zeD*as13Sr)8CFv}0q#@05E`AWBG{A8;y8zpIcWDSJjGJZa)!FYOU=MtX2t&*Wj z6erTs%`;eun6NNnn%9s88p!wCmN-*KSj+&*$fPZ8&f-$UM@n`F7sV+Y%Cjo&+5)=G z)9s)IT6Ts>?}mjrHet*qu;)N_y_YQ|U~G6WTmi^=Q+vb5#xW{U>iwS4)_a8|^q&`N zjh;Yc%&tT&wl%Swz5uBE%Ib^Vr!T|o*?Hi;1g_XBQAU0LHE5vpwg}eet}$*c52;yw z=V-Qrp}>a%ERZ+E>J)nU6TDqWsRM)zK`G)WgiylQ_W+I~&olHcRRppQZ{M=p0Wn_}rgg=XliYvr?rv!In zfW{v_d%fxtc*RHX9$7Wn8aysLgTo`bSy0E_M6W}XL#49w43Asa%x|OsN#y>h2Vr!4 zW|n)0U!(sRVc6{~18ySg>dzOQN_ysP0GfH(IVf6{>kpS>$A)#hDjZ^|TDcbz09`r2 zS2uLxeIT7csYa~eAo4D1)HZMcAVBayz+Y)}EMflHcx#3NU6ki1-7j9p3uDEZs~A-g z8ti*xw1lRnE&%#XdoF)9>as0e$>{MxZ}>;Lopu*$zcn*{uE|ciFQ7zx=cbMp+y#01 z{(m$fqdHtWNs|OI8E=3b2@t1fM*(;WScnZBtza7DnI-^r+D$_5CV?UOKe0QVRGQp^;UhsTnLkryfAl0a5EiTmKOLXc_OQ?zY0My}s9VoXV$jOR0&lo;a ztDzf>4~F#?LdK_u@}qQpX}>tQM$4#262Xx4_E#_wB@yTCGl4V2=m6Fpi=0 zvYvMOj+Fo&6EM5w0m9~;wEzI5Q7fIejVrR$qJX$sB2gxnRGd0N--=Ct+58{82c00- z^%6@6V69lrpG@fh)bZW}HhMu3l&IaT|q~ zRIM&rjq*fXM9=7EY2F`qzZ_w;$#BujYA`SEjcVOX+`^Y@%Ze{5GRJ4ipO=^8x-^wH zR!B?E$M+xX3UB5hzlId7`f+_ZLL=b&o5;+YOn_-9f`o2g!X8WoJ3=VksIsFyPD*^9 zjpm`552Kf%o;9%z0koSH@)mLiNq^541x72M=Up#kk-ir8MXPT=8je^0vNLNZ;+(bH zzHu`U?JI^zcpC^EW*l?fEQz=tiNkk>+*^uba)9QFHUxI&jB66MGH-j_gZE7H=bI(> zl=#y0;irM9spaQgFGBfcU!el5p{SGjlPttd!~uDc9QTc2W7g z>GX|3|4vgrCz6ZCEq@TF5o)gNibV zZpVSVBPuvNSAVDnkW~Jg-@m* z*88(K;??_stNS@T*PKWVCV)!<>qpxef1#9XnOr1-2CcSt<+#%nwkR2WeZ+6W zxnqb@LGwB;XJBhqcJ(JqlK^HZNZbyz-({yD>;I?z~y}v^Fnz4XP`Nnnh zNBqr>xHCftLK)~K+t^Qz!pUcyMF$UeW}kO?5*}L8KB|3%8j`nsVX^vbPeDU(UqqYM)Zt6UeoaLur%Wf(|(og|0- z24+rDIS6!f8p@jAjfH|k!l%Qrm^*G8-o2t%CN~OI&4E}AU+~1Gb#LY9y!~$7mzr^6Lk0e7Z@e4l ztOZlA=~#}g#qiVe3gfom>q{%hF9w*q>LuG7%MA3rKWe{!-hV}zv9MrSuL%Au`7`ft zee@v}&E$3hrdYSw%aIqFuZx&~3g{^jtN_1Jv0JI^qb zVYc*i*!@CeL1%OzgqF{|RQ9diUekRLEWZv;%vYFd;0Fl#fM_DSMRf4s0TGhPmVs<7LPV6h(a zFFpXtG~hE0l`x*PDJ0e#wHsLR9`=;Jc%w!lLkh5ugzz4nxa;+>Vpdc|Nq>cT{TPTY z=PB}huYn3+gduFG*Gs8W>G+8@wfQU%abps|AR+#5_JcQNc zCHnJ!^BHeU0*#(anYZ6{zxrUkjO<~`Jgjr30e7uPlnr9*SbLQs00{r9sRepNo2^n# z0_~IlcOBo-U?!4 zTY;X^*v+f|qBWl{>p%VVJD+98;xnh{b*cKEqflBc)gl5REOh}cC zy(T~x^?Nl|$h6_XDFqBQc{B+CPy{@GBSUERy+jg{3%D{*nRn~|g3yGCxeJE#zBuEW zi(F_W8_Vd0PwER9JmSju<7IdNASZyAw@!E%I{wzxwCOK2TSBPO$)o+8JD1WjVGo!A zHHLd?T~E8SVLS#^Zc4ygEnG3Q1;c3l2~OIE#8{ogSWoE68#)u^(SaZe%LEO{2#|=d zX1nDCJJxZ3`IryXE8CkqT(pRxN5cT7c^6<%amy1Tfu;>&Q3Jk0zx(r-&%mVBf*Ifa z?k@qZZ*f_)>4bLm@ zPidVLji^eoh*J7)-^Qa82$|Fzh|Gt_=Z)m})=tC#eMYZ5ExGZIRWXN2!@`M~6j{sQ zGd@jpfS)H0Hw#J*^40_C7GDu58UJ(XPLPqI8kG~dfd6Fpp@=%lGd528= zkr%kt6)E`#Fmp!<tW0&mx#84bYVBeGlUqOfJ9jJ;)ak7DCA%zOD0RWw5% z8ubEBZes6^`estFd-=SjbV(BWI{-}o4pBf|jFqKBMM?qYW%^Zw!U^Is_n=tRq&o&D z^Rp{cH0V((=BT5gsvlPFjhs=99syh@QO}>#%Sb>#8z)uExXT!r4=jhh4o6^kq^Nrk z&5&n?e15^g*5S>^MI2$NgkeAWPuCt~`nTV5aznoA0$)N`*m?P3GUa18U*O9w73C>S&>!!sfR@_ROUDNa;|jICvKTYQ#>`2AI8&VzTsP60TFKs)dMvS`}vNcVKhG zU;U@`oARty?W>3=AA2-_M(2)t?Ou964(!P1w)lXVvynh&m&TUrN_q^MH=hou^HK>t z(SNU-Rio@6)F8Jj^@d}-^_WmR68?IE1TF@W!XjpYggQvSkWZFFxKWXp1p{u zsHKizE&qOdwZcPi^KP1OzAB@>S~0rmypoc?EF*`$2ke!s=`a|Fsg_GncB7<>)alGn zt`L0~X6ZC|@rR$igD5a1Y4kqjG_WoRPw=+tPgMA12YAeaTmyECh6r~r3bDObyP=gy zrnj{KpDTkBYfVK5(n#qvr|-KGX3NQ}GM!5P;a6rY;A4Q;^bdn3NdZ?Sn$!D#X92qR zu5uYv#KQU8f9jkG;{^8qyi?P#JMWQ@-4$$i2j<3>>ao$H#gLL;7+_4?o(eVGi`Qb; z%HvQ0=6mv^Qx@L|@<=K=HM#ImHOxU)Rk;$KcmlYf3DaTina01jpPcp}Rem`6UW72Z ze7(I#_>P4CO+e3VAhh7)C(_cUa|O!hnua^lDf0n+cv8|*^W(Svdq8jYaV|gw**(z_ zR7kT@*8x_`8v8&X?mfe0ibf`T9H%w>JUbYflJPnd70m;psmPUfENbFq-}+uxZ=7uX9ydf?_%_Ii$01^(;L4On{;Go0#^ zIn_2r1s77a#E2uKMQr=FOj=DZ7=LWk*NGX`h4&eR;e%&3etw9<_A4Ku%>6^UIVTPA z{MXnvCsKsX3R6IX!&5}U;HW_J06Bz(zSvys06mA*TA^=>KU1MW7>6fEDp+$Oqrc$)hS7=5$~mL?F*!6`pvlINva?JE z2F$*oCV2ozMTwkn58g91Oe_i?8y#r;u*iL*Ks)3deoamcr=A}i<^xsL7NasY*!!s9 zYk#paOj9-N`tCRkaGihdG-EA;&xsTn+3{5Si3+>k#%d4*6RcQtqe!{Ci#7pc^WZ zd?ZNVdV!&Bg}0+6eDa>dKsiCQvKQ_Pg`Q#|P!;%E(M?^7J`ZzKphW~pxj%;v7ukt( z&N7KV#=A5wByaDqlCvhRdKN*g<%D1P0tK1~wu5F<@R^r}zw(HXf4zM~x3VT- zm1f&Z!$A7l_Lt6y**xlD!X!aa*|>|^6?em{wiKxRQl+Hb4#3@E?_3|a)gTz)g9IyQ zPCP~{z&*(T^OpfMK!9ISnfOY9(LddIpz*k(OVspCh>*Fol0I?6p#L!AJi2(bs@2d*H6^Ehn*#KEeOFNdXfde9*kemD*LR-K^6y?4ohTM6Drs6nJ^mUycF-2+h$ z%mHx8L?r@tRs9$=t{b$vPw%8CMp3)~H8l1BPtEE&yJRyFI{%sLpi&Gz`w zDsLF*vse49X<4;B5re|!_%Nmx3x-*MJQI`V+&QO@yTyQGT!~sE_<;fqS_P|x4Dnj+ z|0?Y*fU=6(w$X=9>FyQP7=uYd9V((ruK+ue)+aA(dY~X8+eh6T zsq$Fw)Y9x7E<3Zrd-V@%51g|tC~pUrdf{uRXXa>&_AqD0S@oe>YM${(#1@-4RS|e4tVCPEmlE3eypK7f1Z*Ph* zmalddfB^pAT|vyh?)!3713Hr3Sm~qrpFsK@-Y?yDdCpYhpSIL+(ls|gfdE-w!W%vu-&-0T|e`5emIO|c*BJi{A=o6V${S=Eg`n>B79jrx$KY3gvuXe;!*hg zF(`~bAi)^lL?E-2p}%&+77xU#|B?kO?XKT#<(cTSp_P;qh+DD}{|>&n7N^7zuf|U} z+?s5yJ&>~dY91B4tq%?&Zr9X;#0#1zbUWztKe&@ zm>%)qV}#Hvd46M-coAL@+M_CoVxt`j3Nsps)YQRe7-U4D(C4+)92ps>+}on(xnBnD z3hh?u3!&`&un9cOq(~zQ1n{F+KlrjZgHSj{{730H&${_|G8Fw?a(sgFT&f(Bw=xm~ zO%t~0ln*^&kpn$oc?7O&2HH!N@2e^T3*j%!GJzpv>blIOxJ3+&M$ zy`?@o~ybKhNta&6}9i5 zkQwe(jp$!Xl@Yfswq5)6N2s3!{n4MUF(ch>;2`>X$KhA~wp@PkHLj^|_Q>cjuK#^; ztapt#UFrNPgecNh4BMDW>at9uUcp#RC-n*&ofylx-aymMDZGHXq3r zuM5?i&2A&L9w(v=E8@qyJaw}3?)x66(6s}_kJDN$#ttnACAJ5PffhSN0j9^=ft)n{3@aH7dJ1om~vwWU9_$9 zzKf>^)4n&?`OoPxR1rmNGxLS#Xj!}FigcFTV%qw}w_C}Z)i-rWoy|m{VV0-UZW>L) zn)>aGbT?qi2ue{gi4Q^9@G0*$6s4;fxE9Rfq}jZ1tmL2aTRtcfq|uTIU-SF2HcBMX zLH2oNcEhj04aV+WRHV<5raVrqWji338gJhFxiM)MiCyeYX|;5{OXtlfK55_S->Af1 zaAo#))}u#Arz?lvO)jbroAQzhdo?HLq!=DupMjE&I zb;+kKmN$LKJQRT0CLAdekC=Y%P~PKAijZ#hq-HFK8cY^VCA=L*miz1!pfkW`{6gG@ zM)iF6_7ieA)r$lw?7<%Xwdmla#_^tu2dBXTwl22n)n&+lP~+JBK{gsaiOkwWK!o-L z#MAPXjk_;Fh1}98{mJXFj^(nyrpcS*fr@8Pcv6Mw~kAoRb)4^GTD5n2x0h_#-0?$vv1tk(7V`d#>SXhQ}7X-nK9@IBC?D5KbgMhyklsaC`TCN zi$ST3^XQs!)RWIJvTPyas$ULdpUnO#B_q( z?toQIsc!lV9z5;j2O1`<6~o9}6VZ(4j3G&%%|y%)6>_PzwVeHHcYjxMB8eyesXnCT zy~m+D=R5zs8z#lF587+gA$AiE6S;Ugl@vYk`rBZ0Hz_@%pPrhHtc)pJ%eBNEMzYLdpNJ#ypO|w{7>G*?cXoGR{ z(f(t)KAjGIMA50>^UK(_TRmFU`5mtKD8#6Xu=4gB(WZsbm$1Mu?yWkpbPvhGAd4kUG%aP9q{T$k!Bm)Y6;`_Ce z5oD5Zu#lD$!)sOd!$-5$vrfA1m&+4r*&VsjhK0R6+|x|Vi1rS-9j|e!Nk%6%aZn;3 zGdd|#Lt{Jggu}Eas9fI&*toBvNtYTBHkeqCwN+e8L{A(XGj>b~2U>}X6({vd@Mx*d z^JZ|OG7t3>Fk%VyVy&!JFcZuEiP*k2In5x%KG=sNLZm;ajCib+RLF0(#l>Wpm;M7OE_K5XnYJIbFC)NTs{ zk1sHmTW8X?G?RR#gXndzwyn@>j$s)27=0w_3Lpz&|JicKNskxi5fm{Ov8w5^5)zk zWq)S}U#P735&PnM+io5$0h66q0?HgRLG(izlDyHLCsgLIF0?BwA;)W-v7RUER!YOO zj>|3w53GHIY?FKn-L3L2n!JM3>(1+1GFbklaM^vKiv~upwsRJ~biFPhfdp+hzxx)2 z$KasYAB6ev?Rd6<5k$@SkG@k^yqV|Y`0MYycsaVUUETAH~`?`jnMrU{M+k%abc6O6=?aH`k*nB=qU=MHbf zGEp7r3C1WA5^F$iyNAz=H|&X|GYwNp7;_`=^(R)kr2fk}c=68pn`mhmM&Z`OR#bzaBk)cj-<9b~suv^QVjA$}kG>UIKLca(W~ zxM3i^to78_CRG*_lqaOYG;*0j6x611FR;9OaqL~oPOe;nc>T{i9G0KjO}trgUMDL5 z(V-y{Z<|mu^7oR(kXe78CPl8x3&$bsMuwH2H%LfcszgdDuC&q|kTB9hnPZ#S;@%aN zqr*Bn45v|kq@aAbazW1FE4}qp7`F?}-@r-klZ^jKC1bk(S|JJ^tdvw*_j#MHcHVCH z9xoezZhvh&YBa~{sU$X@xm{&zHcP+?ZlB0QGbKT8pVAw+tD_<+Y?hYsqqz-N6cgd=lqKY^O77WBqyz;@GmQCa3Yqd?K0!3ZXQK64+PIvaY`# z%^*Y=B_B27^;Vd~rYBOUx9;W~BqjAscOp>NK zzQKx+N*Dfh{J6o3;bEZs*7u{-tEZ>^Uo$5WEz*;OY7;_CcHWtEp9c1-r0ZyzB5zu$ zZ{eElQ8I#YVyK-92*J>QzPX~F<4kmKt!_eX$RaVeZ$d@STX_fH`(twclVv-1F~L7| zrcYMrn|Sz`0PHn!ufp6UX{~!5YY?T)TE9EgSHn8kk8si<|2_-{iH3cJ75sKvqqTYW zz#0byOoPq{f<6*lo6)U1y3SHk_$cr`i(y=nTO-4Gwx+D|a@%w4%W8FKUT&-Yv}a)# zC-LV>#;L7%d0cyEl3<vo+QGR{OG*J9O2)juVDt_I#+2g_$;(wc9y32&8I0<`0V= z3`C&8p|_!GnWy}S?%wJuJB-DI z>+7mo`xbe^?IzwGMJL-WH_!&5_HDq0>lBV&e7^Nkn#0xFqyd?6uRO*>gF;GP^!$ay zIYPc{)S+-AGcYxn04yibu@CVUoGuy;Zq&_-B?GhXD*hB9X6`rdzEE-1cU&Y*I}LxC z*|O48YaO&xP?=QMb!k-TwvJ|M@xAjnYBOYmS2MOUqNAszl*%>NOsHDW^$WtRhK7~E z94f?0e=YPtv#S43+?c1?v&z{KlDp|ezr`VVL_>L{PE>!rtz}z|Svv1_*!H!AnpND1 z{<{w}n|>0JS1)MhctSm&u{QmVo$mj>)@Nfb3%9l=M^`BC{^MCeWIHLL{a%Rmz}GTM zRWE8U%zm)u-!s|bJ-|2;(DLdzDP<;_I?3j4Ak69| zBLnys4he^G;0j@?39cpD^^^MM>y|Q|NWf@l?UJ)|UUA6|^Fh5nijsV*%pVh>@3KJK zp{eMdg{0Aqph4jm7@L%g%TL9= zZz~N1wvOlo0NgoS6&pJs4j_eCWiS_jCC`F;^)1PO<+J@Xb9c7MbO`GeQdL= z!37-{6>?d`L%Qn~7RX%qVbgAd93TZy0gL!-rbub~Hh*)~;_~UR5xL_GLy;*Bpd7=L z(uA8AVr(Q``=|k5Qa~t*@O8mpOtm6QQfN;M_l@+4puP>K9+0Z$r>N+L%zag!!M0&C z*47vL7*%$Oq(y}wJrfnnjMniJHK!InR`^Eh>0)T%&2<#)NKC-$rvu(RicnS<*3<<<~ijbe&rXhz? zwX_3t{xjS+aalOhK5ub{8#^54ggHo62cw_`{Z2l;CAY!cBwj~9Qfi_el&O16BPH3R zw9J*#*3-KG^p@EFwGygnX(5dB-=I**i%YkaQ}!h92OkA%(8(Ee+y0mkL)@0dEASA& z;&-7)x}Y52>u7O)89QQQ(qeNqYSTP?Zl(3e##>IzpYHdRF3O^=g%~hxE}3F*=4XP^ zj%~e6H2HXPfA+^p>j5>3;@Q33cDVBKL)vr~lr8l9SKtRu)NjE`{a|}l80tAeg|jhu zDUcE?`$R=oMOkP`w7K`3>_Akw#IwW8-Z6vf*Nh81@^S}bZ-i`8E8VhY$EB#sIjE7) zK8mbk#=BX-73aE@6#MU?^r1Q{Vy=zY)wPQ4`LgrdaL+taaiym=N{#|q6j=%p$%KHr zoR`$MA*Y?^B*9gAa!YS!G{lUKRhe);@pbKcF&4t}kx9|uNYUVlwFMy8tWrmYP=Md? zi>rtLqr5SKpB^@^e#?wR3$PZ$8fnE4Bxl6%vUb?zV@sDypB2_EFl3Nozs3FCm{wW6 z=`AsJ3K>zogs~il9qGSP^4y$)(>APf2hYa(TP&6QdmzL9<%P`o3)vsD2OO-RIRS+dK_%3J7CpFSSW_R0qP3A&dhTF1lh2Gs|I!g+) zlrZNSKK)K8x|dO*ajzkK(ppsWj^OU~!s!*0l`f##*LxiWFPT7z;$S>yK1vsW1yBXH z??uiGcR>SeS~xyiRkOGB?+<)rVs%BN-Hodf|CXgfCk#dZ9U^#Qbi$4(%@?|^T&*i` z>K&_M$Y8h5Ab}j|krvEaKmM;i>DD8lcjxn#8whREu68`$sYwGV9`ASk(wjlm>s^CX zF@)UvD>L>aJtftHWS*y(;UxBIJ-59qN-*vq3!K!xpKNkJify!{Aws7i%J$=tXIH~P zVGI!-q#jmRmO_!qhwn)Yp}tx>MgC-r{38JVhr=DaaqJMJ;U{Xz4D7f)oZbhRgX$o+ z-?fu>hsL}Fb{fP)64(Y)G9MDX8BTDJAZ10QNxcIQNXdjhUN!-Jq_h*)j`4X@s|GPe z(BTVFxl#W#kBTF_&6li}jJLLF;!S^btK*xi+`fkvVS!b6xb$K)ZTWM%&A->+oQ*JX{5>K#8G_N zU!#E;1}*TsJ#uynQ^o*HK|~^QEEPLWFdmUw>knyh*?%%rN@}faVY~TE^}$T_L5)lK zwdsK#3tg#;`7UV?ol4@2j}`e59hEqW*ov>4lcCr06kSWwVmrSRF#c%q{^UWB==<=S z8uZYyQn;&kpv1M-2zN-lO7D4^TC&LIv*6VnGhX~C8Wf+(^4>2A{#$H1lYTZ@^uJ-JtIZ$3x;AKc5FbXq zHK)48v@O9vBK;PS_{f5`-cc&Gw%@Nk!);9YfyW6|QOLJGF1O#5J{sPvJi}~#MhT@n zeuDXserMb!9fz4N^zSNmF*T(tc^gHCg2mmCOvhk|QdMh~h$3k3Ov3e^`flc&ULEnb zG{hL5{2$Je)v1*R+<-dTzhsSWx z_JFDuKW`1_066RBMNjf<51!x*lfVf_X3y3aZAEWcpZv|*Zs43Ae$WQa3t?Z%;4FaB z>87$%(3+hu#LsU2cJkds@#_FcS8~AfK;3}v?z_K1tEt3&Ob$lpo$lSsjvD(n-A0s3 zj}@#QT@CIpv@e!N#z9rW0C*#;6VhStpp9EPjHcOCUSF8VUa`nk6FT2sEI*jRjiGsT zjt<_m&9;nP(FBwu-**`v#U zm&JNyJ$&3ZkwDf04Izy#j%Eau2gH_p1UN%mTCJrKGE{M)GgKVEHOSE=GA#&R*>VTf ze(us6vq2%VL;(~5K&+lJa&zh2%y?nC%2o|@jg)6%6QAzkmsEQF_RQG?6QBt1lq9}p zM^So@P~**44#^*1(=g-})kEAEmSqgZs*k`!Z&kH|&L`elW*3`X@}CmmYNxT z)I6nsi{=8Q^!W5BoT+2{7X*$Zo1O-qNs};zLpyq+G7XGoE^l?jFio6}wfNM(gzBbn zrJM~-%fk2mrS9zhzqJ5+&sA%*tEKU#OwEsoyu$uI(lBmPKM*37P9!Bi{(7Fb3!g-V^_g!Nm!wOho)Y2c(VrtMz3)Ee{7rHWw$!RL?h{n@3O+~-z)-5yN z8OuR*#C*GQu9%BK^@5FFzC{8@ElX=68t;sd!*8J`bd0_M$g@!kn=IXlW@XrGu+ zbc6zKLlSAXSiOtV@7OL!V-f|0A%WFjQFru2_)BBh0Ha+wsw~7rg4XFmQQ$F7>s&xu z-`eq+fH(I(;zW$>yx6}g!0M){OU*A~tm1W-kd6tCSB%84)(6+>cKse*SNJ}ey3my#8~>5{ z)v+8q8pcSMs#Yo?I2}Rf^$>}vxI$0Sx)8Gp*NFgm?|)lm+0dhaNR+E(8H4tF#9eOH zq~5(;8lO*kRXC=g)ChuyaEJQxb?5nz^?@2ljpA-znyW?5%<-Wj$kx2P_Mm z-%N9`<>A(FuUB=xAsYV9?fSx)7#@-+*lXPz2TDZr$Lre}sqp{A3$BTeo){ydyLA$~ z%m@T~lHbGVybF+?=2F9BJ?%_{?d)U(CV(PL;Pb~l{pXLzy-GNASti+ zyOf7{1Fh<^ux$8K=0l1Co;CrW)F-y{bPwuVX{r~P66Xn`WEkJ-N#JZsoJw}W|KTt- z;h^!>I=OPhO63rlas_i{b?ME>aiGVcyk@kyE=R46(r-JPZOO z-6zk>N^dwV=H45wA9F3+O~RH9`knqFGZKf8{d6R4=594U;k(3;jD7aGa7BKIs$QAF z$4S0KSXx<6IO~zkJ3XV2lZ2NLNNm0g$df&9OG?)5*vQZfGK#1)4Kp#jQ%Waq_D-lU z$~dpT^HlX0Iy@T0>v6dNUgETKwMC!jYFJ(Rw{(y>Oo{|{WRVW+lt6{M*e&e-^U#rL ze}tmc*qh9*j5uQ@#4Ag%wS8X@lZ)s*dG$6}r)2s~5y(TOz-uAg2!2ui0xk#v(zrpviR2-Y|;e_p7m+reohftskU+KU0v2HJe8UJ(T@}yrAOwl6$ zl9%%ZF$ojcRPvh>;L;dNi(HKD7iq*SdQFL!;h^_U(p^wV_4H&Tz&&qp{M%CmD=zcX?yroNdb7mz&c<28l0J-2?b!HAX@5+qZZ?Y)29`5|kEWfXsF~vTs8$aKn z?%NgDA(IzIh8n_^rFu2XGO4AQld)03fLxynsda1(P1V-_zQ#vlj6vx`zDoFn4q4A} zfA3#F+~T~OoflD?Sy1JSzXDI`G#S%f8czdec_p%t*3ZW`a(Y%;tBj_4@m2x|x-|sqR?{wit z`(WTVEkZ<%3k^(K>ANk&UMlf@*hhPr?jmcHDqU-Li*4W;8R)$=kdfexg%PomLecoB zi{#X7*-LSrJIZGvJh|Y?p0IECPZo<5I5{J^7wk@))G{BiBHBQchPv60$aDYp{Vm7?kxSM>%1?pWinqNiqdI-ME&o<1sV~QGp%JL-72?``3~59wD=YtLjKH_)ek+?e z*b!zqcyXKjJ#tMrDI-w>Znoc2M_07$Ax^R&$$I*rxMD2rJ(~v0M6~2^DT!>cPY(%% z#`dwHyQYHVOVV15KXs(=eVpT!j@U_1DJY-N{4|KaJwLffVUxwST~UPRdSR>Lfwqiz zA0c<}l#-CN-q$indg)H(wk-N)K2nq_d~bj^+^Pr}5(LC8wWo}PAb>a@<+P}WuDS5dS6clfdp7ShEIc>4tStFsma~Z7;BzBzLL_`+W>H9PF#Sd~ zkqD*een3SWBg_Pter0Dflfw6r7ofe=e_AsS1DPYO3OlGe$#j1xt^WFrN1zw3)8vvRCy&%~&w0 zB3arX-`{kWSoD?03U*YFhEK3&ErkKh_byQ#*Wdw5$h4o+`?0Lcsb!WkSvy7S1$qvE znDR2U(OU2cX8E4k2ozB>ECk+HrKiU6d8nZp2Qn)M&&(1M(HcyYgtx3_-GgbLyL4Joh{3#LMHYnXP=;%yZb|}& zwem#F!rm{SP~ehgcpTqBV?2}ko6ydh9JFjpKwtL~-z85}w1nWq!_xH$CEJrUH%+VS zlniPn2=x@LIB`YKgb`Tn3vki{pz-u4mVpUhzQma(nvr@=Aad|G8qvd;OQJ6fTX5hH zC6BHLEha7>ia8KHEavMh?SzL4kXN4pn!u1zTdX74$y-vbTUl|L1r&B_l*$2)!x83| z<2-WaYb9cpyI1>N9IHH`nC?Qne~+^JT={ri8AAG}?6#~txYBoR6#?KX>2)N#oZXqO zv=FZ=7(^}1F(B4(Bl>rx7CPYz>6nQIjU5QBRqI=mH+0hCdp_@3UjEEP|9ZEiB5tI? zee{UR_mxZmHI(Waz00o&Kd7M*22xU<-c`Rtp=2adK3}G=)glk$ZW6ndDuE5ZsM6cu z?xs8MzBh`*_U3!>@v&E8wi*Vcv$K`EC|OF1T$>?0WKZa{PPcK)1nxwYGoh{Mixmea zz{zE&^aOja4G@Hy0;rRV*d+x@PjIv(v4s*IPz#rkB>Y&u9p9T7R@Kp9cu(Fe)XKt( zuOD&0|G32eD47a-_>`MgD0+@g`>&rE1bjid07$G@-~}#a&{e-irf{l>^$TrNdo2-M zr1sOshF-s~_|Ck+KPLQP!RjVXbK}Qsf62Rv*lOyeu2pnYLrM#URp4Nk25l4#O?{&| zG)3P@xS^vwcab4N(Hq*%P@K4e?YYk2A}>Dz-O~1jK8nl7`ICa5QXoEmZ98%3A}O8d zB2a+t_$SdeO9-H&Gj$i$we`b(sQ8ibw<2;5)Ud&hfNHT16qPU##qxc%r{)(@S{#gd zuI}!^_jmK1PeQFLxd#o2`iVQlaWCn^SenHnR1GlPgW}QN5M=)jm85$6F-LZev8(9| z36uq@D5vyJ7dr9Q7cZSCcpmBv{1j-t!vO_^-Kf)@&(VBe;b+`dZ`GM9cq)Qb4T7vJ zc>vLjob8DgO(*uXJlBQq^{V~IU9@fiC#9%J300euH4EVVxmr6Se|!hEe;l)*a9#pO zT3;+j8axrXiXCf#(-Rz3pntykjHq;tm=c|jaK5bHY~yP!aLFiJ@#jb@bFQ{5m`q<`cyI9iLS0kX zKRhmfzF4ywHOnoGHLod(H9z~HvzJ|rWy939q`)zZm2?Q&qQ;+Nhco{&8K{16l4QN2 zzC8BQ)|?ID+G#*@c`YyAKk1Mwv;Ku2rtj>`&C%D@Kw7N0@>j7^(kW~Y8#-?-_8%@L zW8E6~Gk>0+Fg!h$tW>UdWT26xnQ>@m&MeT;Oi1gH69%~CZzCq4qtYh5a!c3hD@+Nn zEl4wky?dUZFSI{QM}YeofnzI0F_x1Uly?QP)2umGpn&|4?hP8C*xtK>03`--F}G!G z%D;{87|4^_4vB#To=^C}&Shy@x*8c|kn_JrEF=4tr z!?(v=Li}Aom@>$``thxH4#qM*v0TSYIH&+6Z`(;3zmA&D;2Um#Woq+0@T5u+L9*nIauLPN7Bj#hmBM1|{`c?>E*DVYbd|fVI z@PkrHsUv6^KkCM020UzLQ>HTug3%l@n(9mvwJRSTSH40rvVqIm5&I`eiar5@&asbU z>4^aVv-rQ|2tbHS^0$~6_@yp>&ou=Be$wNVcyNj+G!u2^@E^MC_-Ka@Z#mx<3@Chd0kWwydSJvq1^_yf}jKoFyL0U?3k zI`7{i`a2Bxb|10IC$h7Z?stvL zX4IOUrbX90rhN=rYptEP6WWGGn2=NNcB|DN8totNx$W+U{c0DLEdW%dmN8YOVFyp% zW1Qke$U;K~x|mv>E*+)IFugAT+X4cG_@s)?4E^aF0%!+Adh_i@K$FXHtgT)}Zt#>$ zC{6c8zp7Ep@PtG5l!)sJyL3^3{2DEHTSnEHVq%*!^zWa7gZ1A3qEGC-uZF$Bk zsqV=W!!Ga@h=a@Jpa;|zdrwoi$hm?DbBy_$F;9M4HZM7LOM&yIa8E$efv zVz^KNR|r6xiEcA`&!)}ZFqsXxK03-`G!H6WDHHrD&1ZwBwLWYmg?(PMi}=Sjw2&^~MaKOQM++mAib(WD2mKx1@q8+VRg4hYfks3nR+ zV^D1db;~1XhcUHT1p=-%KiS{<@Bis%O}u|gBE>A7QSa5q87KwGkFQey;50bJ`$?Nj zo)?wA@{y=2ERr4B=9F=-J2Uk1%;^I-N==POZMxUpi`;~K3ZZ|52E%YJPw@VMH*pk4R3Og>aLF&FqHb#FS%pxnOCsgq$tzOwNNEM0{iPC4O9A zssI%#85YLa{*$BxA_XHWsNAUukOSkUZ=)de^z_6ht;Vnl|4|GKsMMK2+vg&VSePPp z4w_4x#b(u#BvXloNSak}iKBMIHc>@ZWb*p&;l|l_SkAF~os7}F*`(pLiy-~H{=Z<` zPa-WmG3>%{)lVi5k6HIjJ{n?Pw2)#8c)(265>j1Zh*408`Fg^ip{-cA*3uIom+zZs z8zQZ2zBaz3v3_%64VZ$4pW=BjVWGQSS}l;t+vrh!<&hU$z^!o;DDs^pwmE=oGe#`F zfA*J5%@q1BexDB^tn@(0>_Im&e|0bgXhLe{%OTO-Z^BWGwXovL1@mr)Y`+k_yzM4| zhjvVx<++U7Wp;l|%QJ`KVd;8BY-8#KF-HSMq_aN!7s>sbZIQ7W=7nu$J913vDkP@8 zu01zA(PV^|cP0+f2T`ne{4yx6MLO)_vL^Yd9rNw5fbt3THOed1%Og2d#NLZ_Pj7{k&7V+_jy%8v z%zI8wZ7bYG#pEc|xAd0aslMXKQv|kn`Bk|lXP3;IImLMIan#pAJr|k?+mouDUk*5B z;;p^m!%5aIcWm)GsmJh8EOleoadoPsz&%5vu*$2{H>dHV2kY44=Y;0WDAZpde}{9{ z<(Zr95djE*j)mq^4fJyKGw-P?853cD8%;?YgtSD7k6$t@;jem{9hp8`nWKk$XYp|0B9KG*MjIU;_+eohUr0V;Dq6s#Ts( zx0^7WUKsIVs(L7Mb~6t(V1gmA3gXDGaDZ^QB44JW95edU+%&BGyLMR9fe)VSmM!mw0qEi$wwgb!4p1Ngw2|e&lc-H)LD4N1jozJZA?_?;tT@v z%B~p>5E(cHAdsP};;{ieLp~f6GGt`CB_lLZP&A01Iy4avh)rcUTT!TMCEdW!g<^?E zGC;=*_KP|*A9_b*>QJj-=mfzx3sImK|3ClGIe+yf$gDuy0=ne9pdH$5j{*I0S+$Xa zuJfcvk-kRCg}4UO?^Xi8;~TE8^?9P8H~eC?<7VvDw8J>JvWN_^YBOh9^*gbP*OP>f zLA~vq8+uji&h%z|KAZmx2N~v^_kRYBhL(4LIGP4t0d(&-c$7Q!Xs#2^Jfh3}-wUsw z`u^GYu!@)lsV?(^i_f#_1%eyUqotzow=(L#AtxplVv%R$PtLR`!nxq4ZZG9RbCclBb z`tWt{LUdPJREX!-Zjdl$;GNfJxzSJa#0n9;L15CgEe^~Cy_sQk7ZB?^ae;zE)Jg4>&d3%a5aDV$xD1SUz|S z9>jwE2dk~a`@h-msJ7fTPC|2Y^JaVTah>m))pkxsdV8+?pVHERzw%i&E?K@Wt-#7q zEGf)G7-2)#uZt$Odc=b^(@3UEoUcnKlJL)Z+|)OcHw!YLB2F|@akme zmDp@fk~rvv@qMV0B*8jih3fNA@AAeo?PpBNx!V7XEf2%?oa~8ifp@ztG}|tJ1V_Ha!9P6PSIO#_J(5piK6tMT&HL`$FCJVe z-#sxR_IcZ9D>Cd3hznQ@xtQts_<*J6)bf`hsAbv;myprrXjx0mBmai1-^I=4(B;u_ zC0dzPL*?0S2p$SDGtsvX#$ji(8o2dxvD(Yjr7|mp%a(*>()|bdQirpV%~JElZcRx6 zb;NfXy2ki+Z?ddRp7p+TL+P!>`eu9Oxg!8x*Zhq=_VqubS1iWY|7kM+?QvQ&Q1jf? zT{pkl)PW*l@3H8`iHnd|)Ap--fI=l^Fhxw7<6Zi)p{!OhuC=X0-g!NP15@bX4)6e8 z|3a3l`!n2+R&Df;bo|$zvF*VDU}*%KEKg!9R|&pdkdtfIeZ{!(|1-U1sBnH|aC?_R z9JkFrs1-vnYcf^XQdhoDXyom+d~aNMA#qL=n>sP@fhHop?u)rSrtr1reyx$+t~A6t zFUZWI6^m8&hLSh(#PCS%{65 zFLej}|4=U1@*MeQoUEl7RuTS>lIqJx2d`^lkmT8pPJDLGWOI2sE@zL*9;07Z+u1tE zEDgEWk=sfw)o4Oj+7gpoc_lY?PA}IFF+wk1d5I;tYTUzho%H5J8mO}JkF=TI80^cV zy-jwg2F|(9K6GK9Y^!M)*Qk=G{OG?Yi>7H%%W>5TP@@0^SbH9fr-$>X&0ocDz)i;P z(bsCU61H+%kAI%uc|(Y9o`iwA@8f{(+0P=R)3|$&(j3L(=7aIJ&gf42E1NctYd^^T z+JocBRNYOt*>1$n)s^=2WFo)e$D<<p0i6@jLr!;Wf&DM}(Kx2pu(=U&T>$3cZnu`^u6Fga-1e|Kf;Px4`q?l#ir4<3Mh&tN~ngI`PthUo{<#xk@PX?Q&H12V^jC2+HFk2Qg;$9`KYFF(KiXhCA; z@7f)LZmqo=qDwV%Gq!J-T#8qohbuHY7J(XO-_2olA=b2tLZ#JjY3zr zF|VbKW&Np-yEqb9^M(Mdhq=}ia1+`N^(J+(Kj53cI9kIlh4|iX_ZLdJ;jT7VsgZ|= zFY~TV1--Kz{}Mj{%s=JnF~&Z22fU=(aep*pq?6F`kI4`AGzoj2Yhb63NEjszO5Af5 zqdW2=*E{7vzqqk{dqG6vtU|=dFpy4%zqru4J@mtCWUlTgB`!xUS5aSix2=&yFF8XO zh*p7L5Z^4j?Kb%_2#5fq#$LM{_oz8yx-oeU3gM)1ksK6HM#sWzBvV@Q?*Q)z>IMd3Wbc)WL46Z{w4^=&?7~*J#G-<_(MR8chw^)i1-+r~U-LG< zyUQlK>D&1DS^htH5C{r*)ri>p_gY54YXl!AJILytpW6QY8Yw$2-|pmk@gl{2O}}M^ z>y3*ZGKqsu3z_$B-zz$UL61Wyq24wtnf0}lSy)i0AlPkmB{YxL)WeQAvGMCu?YrD8q;NVPYtOKC*?T<@UikHZ- zPS6lTOao!2xL>{9@6L4}Q+V6G^jZ!>lSO*IqK*Hf=rJ_D-3P`Ay#aASku)N$3Y_@O zZ4vK0kA4`oZ?D;6LKEW(KKTPg!=(Sf_5q|rngOY>X=d%h1xplW& zxmM{%Jz$e{ojwjmlz}6=aO>wyKeyS3c1@?7+*vTd)>0b%Ud`pdVX3NuPEEb>Qb_+QKc9Q;2+1F2w^yv_WA;jP2(XlRXH zQUC)rcBFtO&nY)s=w*8`j}+RY=H9;jV$SRV0>B-_?>=Y+K`ordOFUZ^fkTuV>_A;QUEg=IoG#hbED@Lo~3n#+Cea$!P& z+E>LM{0yT@^RM`U1$D))e_Kgp;$W8~Y>;6_*o^u4`9GPDq?uP;g(f1DI{D#3G2Ch% z+3s`!ElcgUztXY=Hnt7}-FYIye^tMUL&b?-E58-Gbi;!~8EBl)faGIDUh<#6zxV!4(O zL=}@~T9Mq@#~oGp^y?>dpj%P#Y`tCF0n(kdATH7Yp_7fYBHY!|BkhBVMUHp>6QNX= z8h|Oy4FqGU3xc(M1)#W<pZb|`j zk;LUhA+Y>$65?}Rc$QWVbpFv1l#A*6C0E|<|N0+Wr_K*Kq5tV1QcVhVb0tF)S)X(OP1@!AU%QomnFZ}Srh2#T|uducf)$t`!gCkkvbaAPloYdgp%lVnu^!Hz!~D_!?_3`Hxh_X`A*;Y|5}dx zQQ}>8en0l1(jbfbsRjx;IzX0u88|ZV@|Fm|U1O_3p}#KiV}XV(GpV%&D4~fD;@`e)s_Yg{r%fNiU(6br3f(-|WX~r@S?weAVUm3pv;57zdc;+J# zW!4h==RvSx&|tWJ<;^LK0jxq2N+&4U<%-1(XB-N+j~Y9}j@-s$GzsO_J^mqi&(PX7 zFy5o=9ziKGm3FqZaMB`m;g>!?Um6#ssH_VcNPV+&Y*#feQ0`PP&F5eE0$?1*uXJD* z9H1gnva75$d&~KNSZX32v;zu`z{M8=By2(tlfuj(Jpfedw!C2#cm>6y09B~Cyd6(>6DFG9PNuFL5AD*1CYGs^gY~osE{t{P;O4b<^a_~{q*PR;YM&e|Ko(xU zn3fAs08}sY)7*SNzU<4;L|