From e5d3d380c7c6bf28352caebf22ca482314d32195 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sat, 27 Sep 2014 01:02:57 +0200 Subject: [PATCH 1/4] Fixed AttachmentTimeline from missing first key. http://esotericsoftware.com/forum/viewtopic.php?p=16600#p16600 --- .../src/spine/animation/AttachmentTimeline.as | 15 +-- spine-c/src/spine/Animation.c | 2 +- spine-csharp/src/Animation.cs | 2 +- .../com/esotericsoftware/spine/Animation.java | 8 +- .../spine/AnimationState.java | 2 +- .../spine/AttachmentTimelineTests.java | 101 ++++++++++++++++++ .../spine/EventTimelineTests.java | 2 +- 7 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java diff --git a/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as b/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as index 56c96a844..bcc807b0c 100644 --- a/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as +++ b/spine-as3/spine-as3/src/spine/animation/AttachmentTimeline.as @@ -53,14 +53,15 @@ public class AttachmentTimeline implements Timeline { } public function apply (skeleton:Skeleton, lastTime:Number, time:Number, firedEvents:Vector., alpha:Number) : void { - if (time < frames[0]) - return; // Time is before first frame. + var frames:Vector. = this.frames; + if (time < frames[0]) { + if (lastTime > time) apply(skeleton, lastTime, int.MAX_VALUE, null, 0); + return; + } else if (lastTime > time) // + lastTime = -1; - var frameIndex:int; - if (time >= frames[int(frames.length - 1)]) // Time is after last frame. - frameIndex = frames.length - 1; - else - frameIndex = Animation.binarySearch(frames, time, 1) - 1; + var frameIndex:int = time >= frames[frames.length - 1] ? frames.length - 1 : Animation.binarySearch1(frames, time) - 1; + if (frames[frameIndex] < lastTime) return; var attachmentName:String = attachmentNames[frameIndex]; skeleton.slots[slotIndex].attachment = attachmentName == null ? null : skeleton.getAttachmentForSlotIndex(slotIndex, attachmentName); diff --git a/spine-c/src/spine/Animation.c b/spine-c/src/spine/Animation.c index 9b3714e81..755da5738 100644 --- a/spine-c/src/spine/Animation.c +++ b/spine-c/src/spine/Animation.c @@ -479,7 +479,7 @@ void _spAttachmentTimeline_apply (const spTimeline* timeline, spSkeleton* skelet frameIndex = time >= self->frames[self->framesCount - 1] ? self->framesCount - 1 : binarySearch1(self->frames, self->framesCount, time) - 1; - if (self->frames[frameIndex] <= lastTime) return; + if (self->frames[frameIndex] < lastTime) return; attachmentName = self->attachmentNames[frameIndex]; spSlot_setAttachment(skeleton->slots[self->slotIndex], diff --git a/spine-csharp/src/Animation.cs b/spine-csharp/src/Animation.cs index d60878da6..cb824f0df 100644 --- a/spine-csharp/src/Animation.cs +++ b/spine-csharp/src/Animation.cs @@ -444,7 +444,7 @@ namespace Spine { lastTime = -1; int frameIndex = time >= frames[frames.Length - 1] ? frames.Length - 1 : Animation.binarySearch(frames, time) - 1; - if (frames[frameIndex] <= lastTime) return; + if (frames[frameIndex] < lastTime) return; String attachmentName = attachmentNames[frameIndex]; skeleton.slots[slotIndex].Attachment = diff --git a/spine-libgdx/src/com/esotericsoftware/spine/Animation.java b/spine-libgdx/src/com/esotericsoftware/spine/Animation.java index 918917ede..ae330ca46 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/Animation.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/Animation.java @@ -86,8 +86,8 @@ public class Animation { if (skeleton == null) throw new IllegalArgumentException("skeleton cannot be null."); if (loop && duration != 0) { - lastTime %= duration; time %= duration; + lastTime %= duration; } Array timelines = this.timelines; @@ -468,8 +468,8 @@ public class Animation { static public class AttachmentTimeline implements Timeline { int slotIndex; - private final float[] frames; // time, ... - private final String[] attachmentNames; + final float[] frames; // time, ... + final String[] attachmentNames; public AttachmentTimeline (int frameCount) { frames = new float[frameCount]; @@ -511,7 +511,7 @@ public class Animation { lastTime = -1; int frameIndex = (time >= frames[frames.length - 1] ? frames.length : binarySearch(frames, time)) - 1; - if (frames[frameIndex] <= lastTime) return; + if (frames[frameIndex] < lastTime) return; String attachmentName = attachmentNames[frameIndex]; skeleton.slots.get(slotIndex).setAttachment( diff --git a/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java b/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java index e29e85306..a298b2982 100644 --- a/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java +++ b/spine-libgdx/src/com/esotericsoftware/spine/AnimationState.java @@ -304,7 +304,7 @@ public class AnimationState { TrackEntry next, previous; Animation animation; boolean loop; - float delay, time, lastTime, endTime, timeScale = 1; + float delay, time, lastTime = -1, endTime, timeScale = 1; float mixTime, mixDuration; AnimationStateListener listener; float mix = 1; diff --git a/spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java b/spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java new file mode 100644 index 000000000..2d98b20aa --- /dev/null +++ b/spine-libgdx/test/com/esotericsoftware/spine/AttachmentTimelineTests.java @@ -0,0 +1,101 @@ +/****************************************************************************** + * Spine Runtimes Software License + * Version 2.1 + * + * Copyright (c) 2013, Esoteric Software + * All rights reserved. + * + * You are granted a perpetual, non-exclusive, non-sublicensable and + * non-transferable license to install, execute and perform the Spine Runtimes + * Software (the "Software") solely for internal use. Without the written + * permission of Esoteric Software (typically granted by licensing Spine), you + * may not (a) modify, translate, adapt or otherwise create derivative works, + * improvements of the Software or develop new applications using the Software + * or (b) remove, delete, alter or obscure any trademarks or any copyright, + * trademark, patent or other intellectual property or proprietary rights + * notices on or in the Software, including any copy thereof. Redistributions + * in binary or source form must include this license and terms. + * + * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + *****************************************************************************/ + +package com.esotericsoftware.spine; + +import com.badlogic.gdx.utils.Array; +import com.esotericsoftware.spine.Animation.AttachmentTimeline; +import com.esotericsoftware.spine.Animation.Timeline; +import com.esotericsoftware.spine.attachments.Attachment; + +/** Unit tests for {@link AttachmentTimeline}. */ +public class AttachmentTimelineTests { + private final SkeletonData skeletonData; + private final Skeleton skeleton; + private Slot slot; + private AnimationState state; + + public AttachmentTimelineTests () { + skeletonData = new SkeletonData(); + + BoneData boneData = new BoneData("bone", null); + skeletonData.getBones().add(boneData); + + skeletonData.getSlots().add(new SlotData("slot", boneData)); + + Attachment attachment1 = new Attachment("attachment1") {}; + Attachment attachment2 = new Attachment("attachment2") {}; + + Skin skin = new Skin("skin"); + skin.addAttachment(0, "attachment1", attachment1); + skin.addAttachment(0, "attachment2", attachment2); + skeletonData.setDefaultSkin(skin); + + skeleton = new Skeleton(skeletonData); + slot = skeleton.findSlot("slot"); + + AttachmentTimeline timeline = new AttachmentTimeline(2); + timeline.setFrame(0, 0, "attachment1"); + timeline.setFrame(1, 0.5f, "attachment2"); + + Animation animation = new Animation("animation", Array.with((Timeline)timeline), 1); + animation.setDuration(1); + + state = new AnimationState(new AnimationStateData(skeletonData)); + state.setAnimation(0, animation, true); + + test(0, attachment1); + test(0, attachment1); + test(0.25f, attachment1); + test(0f, attachment1); + test(0.25f, attachment2); + test(0.25f, attachment2); + + System.out.println("AttachmentTimeline tests passed."); + } + + private void test (float delta, Attachment attachment) { + state.update(delta); + state.apply(skeleton); + if (slot.getAttachment() != attachment) + throw new FailException("Wrong attachment: " + slot.getAttachment() + " != " + attachment); + + } + + static class FailException extends RuntimeException { + public FailException (String message) { + super(message); + } + } + + static public void main (String[] args) throws Exception { + new AttachmentTimelineTests(); + } +} diff --git a/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java b/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java index 6f667eca1..1509193db 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/EventTimelineTests.java @@ -72,7 +72,7 @@ public class EventTimelineTests { test(0.1f, 0.2f, 0.3f, 0.4f); test(1, 2, 3, 4, 5, 6, 6, 7, 7, 8, 9, 10, 11, 11.01f, 12, 12, 12, 12); - System.out.println("All tests passed."); + System.out.println("EventTimeline tests passed."); } private void test (float... frames) { From 22729a5628138e19c1e7dce94e72d0c5122dd6a2 Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sat, 27 Sep 2014 16:24:08 +0200 Subject: [PATCH 2/4] Updated Skeleton Viewer. --- .../.settings/org.eclipse.jdt.core.prefs | 6 +- spine-libgdx/assets/skin/skin.atlas | 232 +++++++++--------- spine-libgdx/assets/skin/skin.png | Bin 22779 -> 28306 bytes ...{SkeletonTest.java => SkeletonViewer.java} | 31 ++- 4 files changed, 144 insertions(+), 125 deletions(-) rename spine-libgdx/test/com/esotericsoftware/spine/{SkeletonTest.java => SkeletonViewer.java} (95%) diff --git a/spine-libgdx/.settings/org.eclipse.jdt.core.prefs b/spine-libgdx/.settings/org.eclipse.jdt.core.prefs index e6944cba0..6a57c0f46 100644 --- a/spine-libgdx/.settings/org.eclipse.jdt.core.prefs +++ b/spine-libgdx/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault @@ -47,6 +48,7 @@ org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warni org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error @@ -55,7 +57,7 @@ org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning @@ -67,6 +69,7 @@ org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled @@ -90,6 +93,7 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference= org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.6 diff --git a/spine-libgdx/assets/skin/skin.atlas b/spine-libgdx/assets/skin/skin.atlas index 6f8f04bf5..e100bd560 100644 --- a/spine-libgdx/assets/skin/skin.atlas +++ b/spine-libgdx/assets/skin/skin.atlas @@ -1,71 +1,9 @@ skin.png +size: 256,128 format: RGBA8888 -filter: Nearest,Nearest +filter: Linear,Linear repeat: none -default - rotate: false - xy: 1, 50 - size: 254, 77 - orig: 254, 77 - offset: 0, 0 - index: -1 -default-window - rotate: false - xy: 1, 20 - size: 27, 29 - split: 4, 3, 20, 3 - orig: 27, 29 - offset: 0, 0 - index: -1 -default-select - rotate: false - xy: 29, 29 - size: 27, 20 - split: 4, 14, 4, 4 - orig: 27, 20 - offset: 0, 0 - index: -1 -default-round-large - rotate: false - xy: 57, 29 - size: 20, 20 - split: 5, 5, 5, 4 - orig: 20, 20 - offset: 0, 0 - index: -1 -default-scroll - rotate: false - xy: 78, 29 - size: 20, 20 - split: 2, 2, 2, 2 - orig: 20, 20 - offset: 0, 0 - index: -1 -default-slider-knob - rotate: false - xy: 1, 1 - size: 9, 18 - orig: 9, 18 - offset: 0, 0 - index: -1 -default-round-down - rotate: false - xy: 99, 29 - size: 12, 20 - split: 5, 5, 5, 4 - orig: 12, 20 - offset: 0, 0 - index: -1 -default-round - rotate: false - xy: 112, 29 - size: 12, 20 - split: 5, 5, 5, 4 - pad: 4, 4, 1, 1 - orig: 12, 20 - offset: 0, 0 - index: -1 check-off rotate: false xy: 11, 5 @@ -88,27 +26,20 @@ check-on orig: 14, 14 offset: 0, 0 index: -1 -tree-minus +cursor rotate: false - xy: 140, 35 - size: 14, 14 - orig: 14, 14 + xy: 23, 1 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 offset: 0, 0 index: -1 -tree-plus +default rotate: false - xy: 155, 35 - size: 14, 14 - orig: 14, 14 - offset: 0, 0 - index: -1 -default-slider - rotate: false - xy: 29, 20 - size: 8, 8 - split: 2, 2, 2, 2 - orig: 8, 8 - offset: 0, 0 + xy: 1, 50 + size: 253, 77 + orig: 254, 77 + offset: 1, 0 index: -1 default-pane rotate: false @@ -126,36 +57,12 @@ default-rect-pad orig: 5, 3 offset: 0, 0 index: -1 -default-splitpane +default-pane-noborder rotate: false - xy: 17, 1 - size: 5, 3 - split: 0, 5, 0, 0 - orig: 5, 3 - offset: 0, 0 - index: -1 -cursor - rotate: false - xy: 23, 1 - size: 3, 3 - split: 1, 1, 1, 1 - orig: 3, 3 - offset: 0, 0 - index: -1 -default-splitpane-vertical - rotate: false - xy: 125, 29 - size: 3, 5 - split: 0, 0, 0, 5 - orig: 3, 5 - offset: 0, 0 - index: -1 -default-rect-down - rotate: false - xy: 170, 46 - size: 3, 3 - split: 1, 1, 1, 1 - orig: 3, 3 + xy: 129, 33 + size: 1, 1 + split: 0, 0, 0, 0 + orig: 1, 1 offset: 0, 0 index: -1 default-rect @@ -166,6 +73,56 @@ default-rect orig: 3, 3 offset: 0, 0 index: -1 +default-rect-down + rotate: false + xy: 170, 46 + size: 3, 3 + split: 1, 1, 1, 1 + orig: 3, 3 + offset: 0, 0 + index: -1 +default-round + rotate: false + xy: 112, 29 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +default-round-down + rotate: false + xy: 99, 29 + size: 12, 20 + split: 5, 5, 5, 4 + pad: 4, 4, 1, 1 + orig: 12, 20 + offset: 0, 0 + index: -1 +default-round-large + rotate: false + xy: 57, 29 + size: 20, 20 + split: 5, 5, 5, 4 + orig: 20, 20 + offset: 0, 0 + index: -1 +default-scroll + rotate: false + xy: 78, 29 + size: 20, 20 + split: 2, 2, 2, 2 + orig: 20, 20 + offset: 0, 0 + index: -1 +default-select + rotate: false + xy: 29, 29 + size: 27, 20 + split: 4, 14, 4, 4 + orig: 27, 20 + offset: 0, 0 + index: -1 default-select-selection rotate: false xy: 26, 16 @@ -174,12 +131,43 @@ default-select-selection orig: 3, 3 offset: 0, 0 index: -1 -default-pane-noborder +default-slider rotate: false - xy: 129, 33 - size: 1, 1 - split: 0, 0, 0, 0 - orig: 1, 1 + xy: 29, 20 + size: 8, 8 + split: 2, 2, 2, 2 + orig: 8, 8 + offset: 0, 0 + index: -1 +default-slider-knob + rotate: false + xy: 1, 1 + size: 9, 18 + orig: 9, 18 + offset: 0, 0 + index: -1 +default-splitpane + rotate: false + xy: 17, 1 + size: 5, 3 + split: 0, 5, 0, 0 + orig: 5, 3 + offset: 0, 0 + index: -1 +default-splitpane-vertical + rotate: false + xy: 125, 29 + size: 3, 5 + split: 0, 0, 0, 5 + orig: 3, 5 + offset: 0, 0 + index: -1 +default-window + rotate: false + xy: 1, 20 + size: 27, 29 + split: 4, 3, 20, 3 + orig: 27, 29 offset: 0, 0 index: -1 selection @@ -189,6 +177,20 @@ selection orig: 1, 1 offset: 0, 0 index: -1 +tree-minus + rotate: false + xy: 140, 35 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 +tree-plus + rotate: false + xy: 155, 35 + size: 14, 14 + orig: 14, 14 + offset: 0, 0 + index: -1 white rotate: false xy: 174, 48 diff --git a/spine-libgdx/assets/skin/skin.png b/spine-libgdx/assets/skin/skin.png index f51c5bd1f298dd4f4779797b487e848065f8b501..add8b6f0c5cc500c927f0b1faee9f8de2f0e93e9 100644 GIT binary patch literal 28306 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 z zW5;$Tr&aV}x=8>BU_C_e(UB4<(N^gAx0mE3ZAuTKm{f+R>m+qU(wtWtN)bWoOLVHI z4UexGagtVE{yDTjI&g)*dAeD8y#0HEY2H9!KOsgP5!_l9($p2~N3cn8pi?G%HA0n# z$E1_-kIInezz-F*g@T0yC(rNsa@d;uw-t*8R-)ZcmwknXh+aO2wF^=KH~QPx|CVn2 zTkB!oHM4GQ&|+7x$Ou?e5UGUrCPu8-icMkE7cy=60s_}BIJQ(Vg)@@tnvo|RFV0dYK1x2w{k z)8CkK+T%&kS=51IRxr>K2*R&tNKJ%f+}1rpIe0W;X*M-m<3Vt>P* zr7ob`8?)9zY}q$7EgsOw-n9MY2*c|G(~>*dfiO)Zr6POA^3KD9x_j7N+Z-?vet`r-LLGN>)PSC%T{s@dfl)5jXvBCUYxQn?%`zCrP$pkMvmH&7}PRjBFkZH=~ zrlhyE878*v)&k+pNu2)(NB-{LTUUm7Mz12HyG&(pe0#S@WPYyi#6bmxuurDB9}rKM zq{b!tZ<)M~unWf=P{y=c(4z5}7O*+3;jw|z2n{hUxT{xObmX2l_}BB04f0O9$Ku4q zM0KwNdDb8d7$?z3H}QclQlC)j^b9&c1i1BceiXPoqv7@K+*c0M{@0Uyn?uju)D2o{ z0-qY=G9ryh`~d+Z1ysZ(_WJz2oS7488JR1$gyk0JU1|sBB)xUj9{WfUQWB||;~Xpw z=4eu+x?(QSArv3^srbmpf1-LLTdH|&dE>;&4+`GE?c@;Hhu0`IPP}eMykxS=6++EA z$Ix@{0zRcWF`)H0+fx9+k$7jbB{3=3N|W28n}KgHa0`!=iEr-Do5=q3QVmuA91P}u}>n%++lhd+BfkHzQz6}l#zk_|5>4Pd>5 z!oEYV(h>ST)BYZm@!Igap45%wSCs(wIy2Ln=o`@+ zux4(>9C6j^=8uQtUG@ER{e6i1%l}9Mm>pr50dfA2j1x~g*}=W4ZRgIrFzStc2FGO2 z02w~UEtqM`5-L9;uVAREz} z6zc!ZDkW7J!Sg_bD1N)$>wDhW%*g9an&(OA&o*@XF9-x%nuut+Ayte~<>}nHx*e7y zbBmK3B&+l%$o(09n$k=~l_t01SC|fBC)-AhtnqTsoa90a&7+3j+mB@wc&5+dVO_g^ z?B_lbxN`PI!Sr^PWG=3OU$QybXB(kdZ>lR8Wm_PXx^TI{1_P<*ef@ifIF}iz9Me4& zPqX#!K?N$q8T>!dl(cV`ZSq@*TYvdlkRJAGC&he1aQG~=iGg0~*X8$MOj8E$oh!u_ zrXa#t$pS|s@%z1?$Em^w0U;qjfz+;`6RN?bKh<{ItX$EOuCw$)Q&6SoC56vowbANm zvMbAKlbucV;R{ud_BjrrvQ?DzU9-db3Pl#bX+BPMN}8cerD3Z}1txCQH;RdFq}w;b z$4|?u*b?=ADd0B8p{CUoN#K5~6zI#9QSC{Q(idmt4o2+`q;iQf#>5WpDzMK-bn4jZ z+n@^v2*rF}E6Va*ROkSAVIaI8NP;Oo{J>v0EJ2vx#z|tru_EYzbdYd@vv#?0=OeRtTRJMp65iU@(uOv2 z;;n8%SPat#VI#0N4gd&q=LjOTa}*dU?$>LFPAuP$6X`WUKM>bYz$$Z>d9Z}nrBGlIDy2K5D>3Y0V98Hhp) zN}-XspVgBiDT^95PudxbQDwh=KKhm*1V#Ccv^}9ta_Tt`R#0&J6LAjn>Acd`&CM-9 zKDMvvETmJP^s$0{&fx~0YefPUAasQ7PQ-)^CVVn;QUQW>QMj>rkXG=Pve zdI%lb!aj-JXE{<|?4*m+Y4}#|Bu?Z71k=^7-XVX5p!X0LOYR6%^BGCqQFX#M5&Nx= zc~dkBse~4(GM~thBEu3zV2&0USWlPgLhX0(as;H0BFuPvc$L#r0w4=x)LWH7BIKJU zE>wV6*4v1W_E(<$(RuXx3mLPz>xnF$aRxo>%3KL887XP$$pX|kUr!5>VVx@de|l|h z$7d9m2;#N>5W*Y0$y{z+Vt11}?of4C4x_><6T}9|Kr11zD#h;?ZVc9BL)Jc_b_`$c}&r}WRz3aN)iP2y4K^rh@aC#?h-nxBPMa*k|U(w_K zxiX?P;%W1Jm}Q#NJ3K4W66hf#M@< z9#|e)zKVVYVeB9GqzDqh1(94a>(=RsjpP!(vns3RHqpCs(vKunc4oBiyZZq8sM+;$ zYk(o0Za@K?vPKKadQvd|QMdc-<)eN^oggfq?a2&(!qgH-r;-uucMeru7A$ga$J<0D ztQcEiBPsnZ8ld!f#(=Y#sLOOF*YH9LW=N6q8%55q6NXLLdl8BVG0h4%F56ol#ynSD zH}2pf@DDll)MlU8l*GZh3QfTg z5B*IziJ%|^f)Yh3HiEFz%IEZGywc%)Ekf~nJ}P20aQNZ!HvxB(-j#bgv>b>Z=oH;0 zW-PA>@|qlWEhl^?e-h7l69$6|*wD*)`v$e^E6LYjKiMC`o^`<;iVg14)MeOnG4ua3 z|EZ0F_=Fin&)>XmJ6l{>PNcFkoqQLq_!s8v)Gjnb!M^DJV&T6xj0lor;g@#!-U@*O z@nKjfH)+)2Y)E4rCr%t1^z@PU+_Di4t9MvLRPlFf!>Gag(~{qFk#{VpnGZ%grx0&( z-x~(~6b6=Im)Rh2U|q}aSj8W`2%6Trx6d0Cu2mK)sChG(XX6@drUMqM44Ub&fvio9 z3?L)Ln)1MX%}MqX4igbR$uzlmA0M=We+q#4sbOyHoBe0Z>=eyV6^51m%?6&5c~$s^ab{uyor!vluX9$=qEd=bEO zy3HSV%H7dMt6Z1C24WMIF1hI+5(*x#QN=2725ZyE>aE6QieK4=Tyt`Q({+5A{MZkzqkG9i!96J@FR)I-FP*`fH$;l$s#H=DxZCc>!nH#Y>|uEG zirYl1wWawZ6bmT%o~8-Ln#@hxmax*OX9`Igl>irm$}c5_zUpU5R7w$KN)8gK1Ahvc z3ZsRv98JaAmz26Us)}FKbj1@BjuQ3;lxqu}Fdz1=jIo?g1kNT)Q==>3Ur$E5Jg{P< z4sVX<*aq}XhM$KuO+sFjIbg&9a`XZo4~=0NWy?Z4Mh2p#sepNI3$s9gBn$p3W>+r_ z6{aVy{1+5Sd3T@(@hfe-H;+Qnw!Gr<_`71YM}YxJSQP_C4m2O`-VL>X?fGW^jGI6U zQ||T0->iko&VQ7y8Oq(QK2d{BWwSL8-iiGxz7=GF^*Yz9T-K`3JN4R7&vC%*BX`bi#+ctk5Mc&1-cOh6s*8W87EVB$ju&ulmMwK3nm)ln}ewl!PxN! z$%*(BF*xt7fgo@-MIZfm>d!t)93!Pks1PwlaTjcptm{@{8;>qgA7LcVe9Yv0wgy3S zJoXy1IF$r;Ul??Pah}Znt~6~%eJRJo5Om+l6yD+|an6s-Fg6?a&n{COl z8)R5|ur==@DI8#NnW6sGUO_UFFWT)dmkjI^;4nfa=qhZs1X!W${-=>d3i8`jN}yP) z$~#(Zo3b7YtB8^J)KhmXgl{6E=1NL4bbXwzaC)Zh-S@(YFV>8z4STN*@Mp1zpVTjQk!FAV@Z2(&?-4R z!(#*^H=#nfT>bKI;(oJ9OOz>xzvmwVvGIq;*Ca#9?i#7RF(R0J_4%SN9 zym33*?$~nUrBf-Vu$3oR6qsbqj+@5B?-b8-1wF~JbFmlGNOj`0f9OE$PD1Q6N5bba zkA~j|k}_Yc#nZ8E8nn9XuV7*fMRKV?hKA^=nFAkhj*%$uhIz9n#Np&dD9g_a=&hsB z?t(rt;|&)^@A()se%$_fOY?DxTSY(tLO@O1?cDBp{whIw{AX4$Em{-Hag(POgA)5m zE$VGV)(#c%Z0_iXH({b3687+5syZYMG?;Ct-vm1RB z(SfRutcgF~;}?-cl)!x$cz_QTW|4%W2!a8+%kaWkhmeXFXzQ);8?5oMjD~!ufT6W! zD8c%)mv_n9KtTK;O@W%+|`9( zOugG7XIU;9GkR8}d$SO+g5O?{&p+FH1Cq()CByi%O^DE>DZxMYJ}pgnhXcP90Q||{ zs7p|@2^%V?XGkDea09UiDxd!x69`)wP~O{-!U8C}QJkrRIuHOM)hFJhNOkM*km1AWGlb7?)Zu&^**64#xs2**p)@}`mcY%h}8yW{IfpLUoUe3aLLlRng? zV-dXe5{84Ubr&9K8#gSt{G-*4x!vt}*2mkVJpCd05MAWn=h%YXFY;ZC|Aeua5 zQEKG1aRZKvecb9)=y*63Gxkf%Kat33fMWL8>&id??2;PS3qdc<<{dbfHy;G&*Z|B! zB=$luJ({yEmI~Oh{BS{X?S2m~tA;qNC?jaTp{(&ob^!Ax;_sbfayfYb$Bn8`$= z7^_Nf&>9mxeYqwS%pn9D<;t?K@`uv=_)rs%ui7VuL|pGq1vkG4xZ%_~rd(#mof_9CtSfW9j$sYZ6>a$5eRcNQ2V+s$sVr~#k1td?4t+ae^KVp?1MNSzG zcG==?%6r=;*i)=c2@lp^IrvhaLJWtjcAWU{%Jv&E8n@`ugnra#c&YR#DFO_Pj~1-K0+aY&dQBr!uCZhBzg-%baja8#CR6j3n0@|I=vj0jAE z+Upe}d#)S5FqI)0`!-wu?J=&hx`6L2DQ9lPZ+hM6^z9BMZNV!e2}I>w{$!}HqgSa1 zH5g^V?H$NJMw-{%`{MHaDL6XpaV7JyMhqtea^`utX^dau@D!I3wYE2XA~%w2$=G8b;mP*3@?SA0TGe9?h$p>$uXepi6sXjoJ<~m9)4ADaOq_0Q|MbWei0i#|Q`4itxvU)Yj zm9tS|j~#0(?`O(^R>Qu+QpF(MK^lM?qx>TWtGzh5#{+`I7A)wsM(re5P=dqz<#asp z-^rpULak+SU=ZV-(w4 zowcC|PJLEJ3MeJrA5>})sT?20>XqsrdXWHE36?m(sXU1YkFx})AP!#lWd3$RW3+`6 z#nd{<2Hp$m@mi77BbKQCGh3>ht$%ZAb3jnC9Z2lbk2pf!Af8Khr^r~#3>i1zqHQgc zjzy$Y9K+QeLtj@@X-VH-Q9|%y@uuli+wz4Ynx)=(p(sM3XQeaOSL|Y>mHOU+8DstMJ;9PF%MjrX2M6kcM+dA&&j- z(yf&Iv$=&>=>BxBN+Lt2xV`%$Jj23N8rqzmqhZ`VQt{3sQ#MhIv#tNIECtGxVhxe- zR;)>DGp@yReD}4_)5btCjiUW`Mn~6O!3o0U2V)%Z!@m!=Ykre#91l0iS?}2(Cy6;i zAq;8FY>-{$KSJx4#h7Myvl%4X3#q6Qh_mgZ*j+A(t)SFmu`6Uk;_XoecK5F}qa>Dc z1}dd&w>td*<-g|PDXV@r8EO$_FJc1 zsXSJ31q4x2tSfh}+bI3ma9Mj8^DQ$lKRYCTYGdV?Tz%=v`)oLw!YS)`ZJ8$-`VJ{h zv<~um)9H3+Ek+uehRv0i{WIqIfy|fF$lBT2c~n#qk zGEkAIRwh3?pvFXya~xlxatzLiaA0}TI-26)Anqp9arBM99?V@|*U5H>y1hL9 z6PPwD*s!1o*Hg~xh6`T(CFaw(dhdhq<2CgRk-2 zwzXOo)6s{te}{NdB^$QbKY`DYb&^8ne@j8V zpYEwW;zdELv)>Q2x*zCfR%&+&vIUr&{^(&)9-=Narc}%I z`{H|h>Me6?UX^g^+t1c;*n10-td4654;5fL;Gf(2n&6(0d%rHGveLm8YE|56rwc7G z-)&JS>3hviMKdYXjX=d7esnGq|9`(f)$+yaISxssDy>gCKv0GI)?87QOh2*RLZO)Q zfbG3NP&?SQhy$gP`wu$#^S?!t<{G2++iR$U3@0WWYQ!7g(_OWpuM+>5l{7NS?wK!+ zuq?FlJv=+n5>HmuN(KdZMRsOoRKk$r!&e-wf}5uYFUwuNFYosqh#H|98|0;(1``;) z3{6gNAjCCB7S=7-TYXcsbqhs6%V;!Pf-*vVGV!Dpnx2qb)7Uzm2-SQaC!P0YP-pQ8MGmLz5mxDg1{4+8wA|2UkGihMDY37akU-)aU-~vZM80_z4P7$?z9LqMq;9 z<@HB}Jd;nHnIroOpoGC>j~COA9#%%f{CDC@ABv=q^zBv@Yz&98-QsxctR%jbbcNVT zJGt;2)_>mY%8g#8KX4oHJG#zOz~bo}{6^SsfSt6+TZr1rYZKSX*WX0I@zr*rfvkl8 zKOo#5b)Bm9aAlSkM-tUY#7lt$L=y>!18J=rO$j{jGa?eMeRMuMZmXApN3a6lP4s+d4-b>1% zgkG~#DU-99v5q`&Y?43EGdrjFQp4y6rj5ksU7I}b100+b>hX%zj-A_suFBM?Ff&lKhvM?y&r!SN|ufLbl6jfdmOkF zKhe9w0vC^?on(W>D=PL+wnzEBsb1H~rVa<$*XnNI-U zH{}Q)$fJ!|<#pw>6hrzAFeDyMpw`7Glua)zLGMQ#B4dQvJ6uxJ_bR&h1PA}{@8pRJ zC>KuI`P;alhKM!l2OQ(OB#~*`Mji}c-+U*Gi+}VSv*&2i&)RQ!D2{}SUgxX5Ruj~; zn&Hs8cu^D{vXu#M3R}Tdke(+1@s@CdxE*1pV4tSHU61;k4bfH>WphR&)r1+QXak=J z6Q2xHwvy-)$BK7qMfK_}N6|ht8xA|NzmZ<|v|<4%`v}>bs|Mfg()@XhKXKApslgRw zDcj?M3Lten3zMTaFe>{2nb{l+;RatZ16apK1d)1QtW)SaPuJ*L~BSE`=nV*P*Kw$ZV~P4KUz*eBjtWm} zHyaa;`K|B+v6IF>@`*$VqNK{~;yG)X^vWT|0*No0LybDN7Xln3!K-s->einWW83cxDdKX+` zccEQ+LRDrqtGN6X6V$VEKPkWBywwx@f!R)}mY-1BW{NM0cy8c;r?%wgqQf$$%q#0s zi;A<(PBHe=8k03c7p-kOSL;KP0Sh|F^d(XX6X;XNeK|SSj`DmN6Yeqo%(?91{6g#3 zjQB$2KI_a%)?>xlwNo_ZkquzcqZXS^hMr)0%KGfIZxRzC|BTG8k(s%LOeCybFFu<% zYdG^mFlQfQ>w3(j;y-b6;XHt$!YrbeuL^0o%iX$X3R8Em`^g|N8RN96&ShEQHx;Io zXf_Tw@DHz*I9N=TUt<+eyYD0pOra{RMrU3!S_VT&yt+>6^X{RvjoPnhQtI@X_hp1! zqlSZyWl~@H6gnSS75G$yP!V4;EY}|Nq|nDCi(@OI*rS0&0WRzlxFHuUU0NSl71$pS zReUhOpTEUrLs6W=u3W$Wp@OFokdEhDcO1R|iF1Yc?zEP&3+DV(*N4ZKiPb=H&=1G} zEuFF1-Pw9tRihrl<&Z@DrUm8u-#!@TBh0rSBV59edyLoNgM5+B9eZI&S`Gu4s`TMU zc2O+RnQ&a_lo>&4X-QYn8M3$0)r*JDnCxc5sUstD2f7{TFt1-LZCjEDE1ZgT`N-vZ z<{jT*ivw~>c2Hwdp07_R$2}{vPsb4KM9g8S-jDW6X1ZN=skEQrPUU+)!d>aT_ePSM zbo1x7x3^=Nj%tvCj6O|7Y^uOw*7V0#hqV}H&@AgJs$C#&A0nWW-m^IHGh8lAmVZhqpcRIXGObiiR zI6B2e26lF*Rz4VZXw~+f`sE78#f39!pC7y`ko!jf9#Jd^47Yy)nb`aZb^Io1-5=O1 zF8|qEg$3OkOXXe7_v`+)$hnyXs{Qdn1^F*}Bc9WSg^accMS<9)HkL5xZiZ zj>0~LO*7c!z+u4AO~fRT`Hb}^v&xJya*n<=uaxC;X(6X`s*+D*4!0k|q=IV)G>PxQ zM5;>^;dyhq^R<^ENpHiCUmH#X{R1e4E)uv%t6oZWRg1QPqTlU{Zcg{|owX(#^D>4ww@H2-Th5KW}y(+oB; z@h3KdVp2`n7ACWJelT9sb5deoKO@~a%!yF3db3aH?}PkUafSPFxBGG-L5giOFkAFl z$hh=dImnxS*J!FXLtdQR@lhf&Bjz_6ViLuqDjwvUe{mM5<1$uy`I#C?kzo>y>&lF zTupUvDnQ_OQ&@LfX`2pmeQCkX`^=lYuO3arx*e@o9lhXk4+b8|$%g2nwCaUl$CtR%A-c9Qs&h|BxO~Ezs1K#qHrM`@_CSj>!kYD6r$i_7LT3I z0*Xn(!wa?FIJzR9B4iup?M%C^7pBcg^wVb?%Tr#hT&j&LrxFT z?0<<7wS411Lq^V`D%)yT@-E?RnuZeT9SS)_l++No<<{Pbb(Oy?!6wVaxzsV1R1j17 zy586?rAoN8KWiot|6ll*-c`*Y=? ztGg7TF@45_SpZDV(6vCKw4ku*Xq|sW&KKPzq zPX`TZE{*d+FHLGDORLOp6WAdU3VB@^gz;du{e#&(K5fB_IiiUIim?>No^R(n@(NJc zX|)@nE@-k$n5Y&Ibrq`AOuelE@Rz^TsuTzLRi{_}c^;~j@ha|TphGR%*YpG1zOxNs z;B{tae>0_yHeA}y_%BOCQS!7pbbh!lEPtyIi^L+5hQal2<-li&q)!4jbD zU+^gSm6$y=Gi@Xz3z>6DQ+n)wWPZi2f4oG(Z6uS~#mgmsH3AW1odTT(zkG{e>AVmv^Dlb|3mX z_@bBE+P3(t4Vq}qhR6t|t~Qk2huKIF<2l@7EotOvgv$u`WeeS$lZ0?jwcr|LAuO}C3?s)<-|%7@!P2Im~xf5zva-g=G?r*A~=Q{zi!)DXMp1I3)@UEx(}<>?_Dh5tVU7bm7iQ~ zK46AdKmdxi`*nk9KU5oX^&B*&iNDjAOEkdMyHO%Whq#koBLu?R%bMKKQml-yq+ ztI*4vLt~@a{rknE6emhj3DzR~)kFg|db)@4l+$H(shYv&>3p_LLzn(*B&TyvJ7^=$ z*6!*ESiTv$VbN%L)tVVU;%R1DZ!MLfal*zI%bGwrzt3R0eP31Fa2$y7>8e(#51()4 zLVc~5-B0YglHeNxtIdk;Q87x3&a&bbR6fj%?<{MwL=D|Y_uxG&uOmkG-HdSUgJZ}(X8MubTQ#<=;Rz>-8$QJ(9l*>UT5+>97Rdj2ni>X=KN8b1=wbVt!r!;e6 zDn%Y0A3D8uF@j6_sv~C~q6C@hcFK!tpCCag$u$Yy$~3SwMS?GH7I*!9lNDzbe5Qie z8V+sNGtA`P1KFODwiJPBnSEQoD_6IkLF*yj18aW0-RhOG3`YYuj%ZLB{QX&air{?m zO!SDOHawz{rcp}ThpaoTtGwB(=LOELLusr`WoNE7E&WJ(wR}94k`zE3Hpxb^V}cm#|7({cds<&briCwh)4y(}mj= zNjmxQ!&p;yZAtiKz9MBRnS{c8Dpx`mWvtD*Db27{v!>{_kNUilInT*sr7^aMo2e%M zxSo$zS+|83@@Eb0yz8kt&ra_+^RM%YH?fikyv!=&9xH=g_GqQ>x%x>B-p}dwn>Gn{ zSi=Qwv49_ycYKAX$^vitc_6uuX>eQPDC(gH% z0t{eK-^82YqjzmoLbhmFv-7NVP7^1e&Ps9h3fF)hlVzizlym_3nXJp^9^WT~L(8*>T@NUk%m_ikj zrrLYsht_{Nj46Vcr-Q6kO-7rXpbW3-4cQ-=| zh#)DAgmg*?*l>yMGV~D{3FRTI%x^n*f6EAyf}9B0CUX2pXDdCd zoIC;x8FhJo?z-G+R;Mm~R*&}>Hk$o?mB|KlftSUHlV?(87`V6?Ffc*ni&g-pT_2C= z8vUu}V8N^g=%JpJ;W;S1z6RRuP+=Wkl1A7+;_e5$I!gcB)0HJ)zCkwGV5U-&ANNBC z(lD}^YR3oN>`|SxOH-ar7YCLyAN11uR0hr#m{CSI(SzruGq2)7?js!*yzz$IZk$%* ztv@n=$OZ5ghEH}1?e_f{E;2P-+}NY{-H42iAHc=`f~-%hYt)3q4%I;EzNTabOw)h5ywChi z>V)j*FRAXbNl(_|`M*0yM^H5x{L z8Xql#=-9{2P{{vkmPm#%ThzN)G9GY&hth`<0BC;30Po;6PDif06{tD@0Kax|a!X1| zu!OU_fQCgvZWd93g3sEfdZBQZIuonG`mkiS5B+&yE(ohw%O2oIu7?5|2;wrYSgRgi z_Q-wKX61~^7-LB}mOc?|G#8&t%97rAFzI~C)Ghmp0$yXg4fdELoJ^xdRf`rFoUhMu z?A8*rxIUOlsDK&2-XHoq4sb~l5VMapXrQor@kPBh3eUz%zhIlhK>r4b`c&e*h&sS@tfk`ZXUm3+m`7UT zmavJq%+5J`ADdRSS#-H9>x#?K@uf^+y%zOC8lK3Zz$QN@dFa3MnN4` z=e2h3s#z%0MELC09G2rwJMpe~r}KIzukjOMpBj5WgX?Pp*#Ob&tNjUyu`x0xv}YRr zzqWzun^BJKra-ZBDB(?hzntb>a{M&J;!`I#z;<1IKPHN*oXdymqbevUgiwRt>EN`Y zgt}!+x{zD;MU}WFpXuKfV#(4m@y1~w9OVOKZ%U+VlHUF(S(gw_F@4L-R{p7G-dJLR za(Q+W{{kg!EyoNeKW_lcz3k4oPh3a1`M9kSSwVE{jDz;eTe%(X-)iJjsypZ7?-T>IabR|dz&J@4h`&2-B-5$+=hO}xKZBU#^6ZS&3(mDxvD*^*I!F`;T6}n_iv=yry8;?*xTr7fN1GS4-$&{ z6@q2F)`nN>q6M8Rs2V471YF!pu9odl*wV*6KIP>#G;la1EQg& z%^{&gZCIrIk4vL-D2$Uy%@|P2v?U%S5aR-(Nv!>Mz@P)wJ>Ggxggv0SfcRP*?tHV~ z!|l2yStsQ`aR8TDv|-tu0h~38FUsvNA$JM3a4JsXDs_UgTPw(_FUy0efieeLLJxu!=371bYBgxG_=YxOE1O`!b5u~=&b1xv`| zk>qu$F=Px|mj^*WZ!dE6PfTDVxE9XJ)?aI!0U?9!k+z&aE|rJ~;{cE@wZ&ValM5b% z2ARAUE#6xvj(j>rS{xJNqxuOWc(DISxTLY}z6b9pE1SBNV=wP)U+#C$_IF3+X8(`pu>bMiViF`mA?kLU* z6uaaxp+D+$kTVrl>;aZvN~q=>Ll$UI#(Dp`SRb*$2ojO*)Qd$Uskap%dU=xD0n>i5 znIj?x@RUe4ale*3)jlkIva&NQynO|&23T<{O>GThuo9~arU??Bzd)7*jzO8|M$Kz$ ze9rD_!9OV&39UmO&6&BJSmh-A#h1?lXv;?;{rJe-$Bc#iM(GkbxtpY1W}(eRd&;it z5}Uv~gX#~i45-!==lk&}Qb(3XjvkfzX1|tpN4X6SK@l8NtJA6K4Y%cRqLt4J$TdCm zLxlibCwvN!LqI+$x92KxkE09%My+5J{#;r1&lufqW|e>|#$i2?i;9et+GMSwX-#lR zi}{%B{?EyLfeo*RUTS;TvMi${2%b2zMIxT|-8>$_%JzJC>@+etLQsv1%d-Xy3b@R| z$vcrK9Xs@fGQvD3x-&Dk$bpVlupM$->CT)d8Mx;6+PdHOn5V4@>v`8t~;c zwA4&}K(8edOer_BY|=tzfYO1MV~4`6$YsX{GVax&O)AJS7AZSooVZ??escsM3*2^> zKwy;ym$-8Bp|o(Au^n`12`071xxRR!fodo$zt)9C8Pip{dBA^f>@1QGQS50p-3kCr zgBCNutFt*5vw3ZM^!um$ODNO>d=P*_wvZ#sC0|zE(zU zy^8|^1>#?#70PE9C0YT~jObC}xr0LcpUPysrDY)U{hWbG0K$>Q4jp0zl zA8lDei|SDejb+=kABPkIr^)LUrn;h5$FVvZP@T`DPkXk|R;85gAzAVY>`gXv+|`p+ zK7D`b=H)f1DOmE#@D_Zybp#IGLdyGqG(&6d%Tf&vb(I&@nC6d0a&=cUn|^gl z85LpO4NeI9Ri3L>hTiude1nPby1eiptp&C(E%LM#c%n3Pmv0Euf-UTSk7@#j~6sF$g%AdrXz4^Z_S6NHO& z+$YANYJU~SeBVyz@;%n5U^IbGj44V7bvv^Xa)B)x@)6*v4e<&F1Y9;Ap`f(*feAAg zQ(U+B&V1_0jmgBXWSBTVnScF~!&Rzq(}x{q4n`LB0A!y zeI{H!i`yalGUdJ&M~g@XxH5`CZOj>k<7ZZU;Lr!oB~4TwQpsMO+vg9Qh*Ue&cjk20 zSLRP>b?VZbbmIQ@>lYZ=1U+>2yEN=VC6v{;^G4gvFwY#}-c%aYJtzikaBs1j z-7&`1^46R*b8LYDR)-}la$!7dw3d#H4Og?7uW>|j)J;BEMm1MDa(5Ul^p2d=b ze#dX98YpwAQjazC$n0ZbvFg3HlXIu0DpDnxhttp0{E{yZqpVR!HcXMV zfr%iwafEV=sFQ?IFl&jb2w$?JvkL;^{C&JiBWEdw+%#)9nnO;Nu`Y8fPcM`x1B#SO zjvxYdAn#f7AC6PcRHtvN@a4Rdv~F(;RJkY+-s0<}L+&Q$>Bn;`1KSbrJmTt;6+lEw z=TS%{;-%bE!L?uLcCqn@gWvl4{&l2oN-*Alp1=`T;6l$Xirv1kd$~T4Mj(;3OaP6O zh!-$+5T3ocYhf>vOFoQlcp)b4O$$Zjp+G2sDei0hmIG|Ms^boK>D*m{fsPYFaBwXhex*cMdDg zG`_%#R)3f)+Oree!Vrk$M`{m1-u1SO-xX)i+6mhHkO`4w8mhq0HbOHSs z42&uF@yg^wyHz<6O}5^o0AFmu3zn&YX#-iygqfFVA3 z`=6-Ig4?Y5_tLPp!#bsFLQ@_*t@(v(m^|ODwtc-8awkL!+r3v?vn)gjvCc1-NGS{m@>e3?6zt(F(^ z$&B@%_PrtT8!HQ_pUgQ8&ybPAFkD?C%sD|LjY8&-w!(_o3vjlw$FxB?5}TiCy`3`J z{Bhdbu3iPf7Nj95q>6TDTN6QUz8eop0w*(Fi_)Gb5KYya*@YI>_(z9He0v?lGmP1t zh)0W<6w^bjRMP^;doMTA;Ihaal>jnOSuEvCB>QQTV`~AX!A=g%04NRc#L^IE;hr&mH?E8#x z43F|nR1fS)$3l8TC$oL~@5QMCaL;w^S4q@i8jv(it9=*Y9C)KV(YI2F*j?hyOeje%}ITcx`!Nezoo6C3mJ9lyqFW>LT^kK@-$>#LH-z z^XURPIQo2C+Bz4#{?TpikHh~8ov$I?+%xqYYntt2+*A*0G-}?pb!2@hnA`4iinBvT zMNpRAUBkl$*ZD`?AGNr>0!wtuwXRxS3U*P*<$Zz14lo(vuJ*`4;nH|*jLsqFcNYy8 zn1?~|%yHtaRWLLByP^v7-bqj`vi>@~DE|W1Ko-~b@^7t&`#mG=_J%m?Sl5Jk-HI}= zHJP5s#n_8fobQ31bX{%GLbl#Xg&e~aUSSdjQ@$i_WYy3&W__R(mU|Pa5lgx+m8uc) zk+yMM9h|VE#>lh)%&FwpPL*h%WE?vfZa!L$`;b3>lF9shbym8@nO}CyYCcdMZTs}f z7zMt|ZxHaG#!&3sRgBS(U<8kO&0M#+Soo$OPHN#V;=Tv|aadsGhEKoxVaF@$Y%UM+ zHmW$Gh}k`%3e~klhAZ@zNM(xpmP}{y`ihK%5uZ`UAOKvl=S7jqQZR($z-q`d<}CZg zaeflh?#*U(I+Gb2e5F&`dWcsRJmRa7l-C`7aLGSZY=RXD`*7v-L{_fux}Hb85}dAp z-%e;#K>q$fC;u-Ijh=LJF@6b~Ey5;#GkCk~5uW}#SxGm!ciAv{F&EA@<9kOXLP%YX ztX?dB=6BYzv@@v6WnMGrapb+Q(99TmEH42b?U=TWOH}m&BttQ?KQkWWqgDV4boXzs zdXZ>HC!yHnD+7naPM~hqJj%KRj69;ZfLh;vg(d!g4LfTD&k~^ika&+#nSZ1-tz^x&uB&=BC`R}d=10#Li ziQnlmw^)xVFMUGy#t)2&${xD$ozNy8#W-%Y_MZ9;nYD*|z$HZ4Fg`pYPRk7rWwW>j zQdVIT6$aI8<~-s@Kp8P(^+6Yd7+z)F zapQS%kPzIV8Y3^Mh_yW08Piid5o!rcEBwH3a=0)HL;vuQrJ2m8{~54sjYl#P;?3h^ zNvm7XF6QqrVyuv5lQJrauq5hzHk4y5ER~XyGWG@(Vo$(9j-GwUeE8!>rfji?Kfp{U zCa)$%idVAEZp=es(6P*r67lT@Fl!X-TlxG>KzIckh=Ofgl-4>nnz{vPhQg6C+bad8 z;X=)fyu6-oa6TRui3JEh1Ar9n0wt3ZPn-&MEFwFx3Baj2|H6(2EDZr%0|jbzh}VJs zl=-PPMcq4HxbDD7P)}7zfNC-pU=a_AcaBTBL6fS0 znZp~*Zl;c26QF3T%H-y-V)-l0Uis)U3MeF7w<;${fWKYGO>U#fE;IMV5CR@r&9?@^ zqgQ(T`}@ZuRL3(4TV_NY`&X^i_rE)^dG2fV34;M+C(a)k8J*EP7oZOwAOVEi<-n+5 zbACqg6~dPMt3hT@X|h+UA5TeXa;$9I9W3gzt~Q*hi?!Xq6I-%4%&SDNVh-!|VQfE2 zMwRx^V{{UmJyniH8q5w)ZOlxCfY5G`Xi3%Kf>KGR<{5Ycm26W{kTIpxKAu_V|ZMdFMzmSW+!a|U6|Rj4R*1t_?&l&uk2 zWm&7!a*R!h33$k8ZVN(VyH{|;{;B24w;5|FA{)26ZXlFNb7P%S3yZ31Dbc zD$^1!;rsp50lDyoK8WJjx&R5>b#-_H!!hHDTEoV-_pTnWJod>riYkL#)U?_T5((>T z4gG-&u0=}Zxcml5Hne|tnuZ0}oO(67pF1=Mw!O%-S1%&)>}a+!@zY;u(NrreZQW?f zXH-(%dk+LR!Ly!NBY=`Mm}%S$CM=W1qI1)Kbvl48aoXN`0Z1))!m!V`Q74~VvV3si?T3PYadBcx2jFjY!mk9#)7uU*iWCSqoZi%VVcxS* zg-S}D1hMrYA}ro=Oq25H5ZMQ7EPr|Z>Xi}8?N0;GDjm{FHU4@F500Hk!SH#n=(x{! z8Uh>%OuChj2SOm-Ca(~)TBv~2siy=T* zaIK*;s>UvvPs#SUK9T}3pYU&~aZtuO1QB4vB{rsvH&Gcr(4LYk>3dfVxSvBtKTQ@D zC|U6M@5HpB_&FcM)DEvAdrl*cjO51L==wVX(%#WaXa&)PPWOo_@VHrgCK;zMkd63s zZO*D&OBHT3QtgXfw3Kvb{QjSoWULqm}Vt5$dzfTit+n839d%Ce2xu1>s@182-@bJxVy>ytwgflWY-oSn&6 zJ{D9VC^SW|Tsjr}g`7K=3DFhUg+4+0w)6L9&kR}WPfuhGATtas8}`-6rDJ@Pv?t-> zGoPr5MxNQWE8bu4ja~CDoBRuS3G4lX7Agt(d09cHZ$9#)84wEH$fPi&ZxzXj4~8xv zCQ1>cGQHzViqWUjqBhj-pve<7&^VE#{N(|d(9nNbZ z{npdqb3{J-1>b}o?4!e;m*;>=k$RRvKFOhsqxMvNf}HnTvGCLki7QA}p0Qy1Js>R- zqwcrBQ~Q=nI9q}HzLS7i)2bDW*kZ+j+=DdeAv%ac;9`DX(JFY){GcU?-SP|BwfG@| zC!aB`hE7#|d(Z~7cmXI$MqT8*^6kEohkq?K*XGEJKUo_Jc+M4gbAn40KpCfja9_orgL*JVjpq7Ci9%)i z%t^x>H+ev)-A_84Nd9MotDN_%GFkQDMi;u!NbcJS1hUK6R{XoZuQhRe-HKnqu&ZZ_ zf@j3hwk6EjE_MCo_xkn3?RN^e7tvZCNm?Abv`$|qlyFhQTTmlUe1R7sPQ4Ai%LF!JrtZ+^MyWjQO`#xCQRe{|uj{jx!55KpcIL9%i9V7P~|X zrLWg|EuJ(6`QF>;-r!~dBWC>P(CkUH(d#)|CRfX+$RAs!iZ^2Q3ynp$jkZ|n-Vu0Q zuqDMwW1~#WmXewYdns8sS?SxsP(sVGrO4xK8A%`Uo0dg%ir~=IaU-5AS(kOFe3{2=lx{H~_7;Ydv z$@`)*WIxJls!tE`TV`gSyL{OSwA(bK&YI;XAP%b4`Q@czDc>25n8C*oZN<*Ndj+-` z$dvI=?-5`|9MZR}jwoIgt2J%LkXo@k=(m&S6gB_lE^Teij*KR9wqEOqmLb zdhf^@$62qr%?1pga}I~8LE#c(j3AWieOY3LI=I#D8>V0Obz)9YbUh5?$#3JhRANEe zW^QW4kEoNzHuo+eOqfrU#4+Wfd&5dLB|+IU0zRdpdm|O%MuELIG$`L^X*D%%3$-!j zV~X^et;U+(o|`85Z2oMt9H~MO_{mh?`L{@92Mp>Z=m~ips`HxdSIrUZwfLl$FjGhC z$1f3%=X+SQ5z%#zUZk z7r=7t-jVyNI)`~^kmc_K8-8>=6Yf!YpSi1QZ;8v0?;D+3{mW7yemei|QJE4-FCP^j zT-wT1{qgQNs>27diM`8QDq#@<=fT#V3l?{QWIOc%8h0!sbvY*Z#8u$sb)8mFY3k zEh<<>7q}{2E6@Gwzh8iPm0ANVDL4Vp;(vn5&_Z>1xXiI6mzNawKXlBOWB4r7gkmU6 zaJvnAFdhUX*KiIKP3>R5k8&eVdijKQGtXAXs-rhy zVPcO-jr$)KwWXzDKRK#Q6UWA!3kl$~YVvr{y3lsN%%AKlc|s1e+J#aKxxA}ZKkwlA zAG?5!?~ndZgrj_dgOIsjyy}dGzZ+B2s-2#daBEJMQ@jNK#CMDiXm4@H>?Z!#)o*sV zosFL6uJ+u;-DwiG1$0K3)r0f57BxMlp*TRfG&S-GkDIE zqpemoA2c6Jr#EJlCv5>C8rWw)S32EgHmwMERsb-(hKn0{)uEn+@G09tO-eig`@gu+ zEtmGcK=)MZ+4+8azl9FG~pgGn~QpJK7r6m#_uqh2AN0%49#a-66Pji1={)9k_k&3x+2Q4Z$(8hu zbu=mAJX0khsxLnU;!b3C^d$5i_cqhScDFNRhAHXb`#*QOOjXfT=?z}6+$9D7fU=n1 z_C^>j5Y48N`uO~csZ2O-`;xX~JRXG_`;*@(lrn+2i)rglJ-{-bw^c%o%rpr28D8!v z(;d)nJZ%)65Y%j+5pRepeWhu^w>`Z!{6bi3GQ!RaiJjIqSFKnl$GhM$r++zG>)=tZ z^wh5WxO}6JNHs+9DWhVe(Ncj>OPchJu>}6{9$i=D0NYwd4G z+|@ZwGAS3JYJotbQxuFOYrThO$F5u|Y+;-HnXd{`Rf!Asmxf7<4^HjLNH>Hfsy?u2@8^c^aJZ`i=ZM2f+>sombM zTz2Yl0GI5Mdnbz4Z~$S8efW4pSd?}rR<}!M6@-C-Y94s^Ixq|BOg~p!!&kX*_0EYn z#CyWFH~BBz3TF0b0A`@fxQ`*$v#lAr{BhSP?|jKqcgOfU2(F(*m)tL+nPL5%K4z^> z%yp|z!=<(WD~Wd+t23V)=aMYdk8!WJuB^Q|i`nS3!x_5@a&$c-VJmzRI9?j_ zfth{ESYT_UDYr(om23=Tt1RYetOkw&BvP%DHayzw2+iihCWUIL%!;AQ?004*cBN`h z1CH)apTMvQG=$~JqQ4z@>-okx-``2UcG(@@*%b?GVi2-^q%JDp!$T5%zOA?S+m|IW zTShT1nVX}@2TC|1@A0Ca=+l|2@JWQ^>XHZu+!KA*#Wdny_Ieq zzBDAPi+#FjC($D1mbq+`Jh_>m?Y+Yv&&?j42~XO{XYR{gwwa8Ldyki)y1yKm&+#vB zVc6%RMRgpBmixx8%gZAHLoMw}HCZQF6Hvuo5^iaY%^;Oev3x-NKTQis{AzDV$kN4G z>bq4xwWEe}`4LIoG_p9^vY}(`9*qE%C=zlZMMYnBTJV{>-5R0)$n5yHk3903+%cub zoEmy6-X}JN(9UUkl>W`(vv9$2OnE*y#Xs(ftSiaS~4SH&fO5T9A+)7f5XWc@ooaJm`hkcxlS>cB^*bFZ?@QkRKywpfw*nI)r0qF4%SAXbQKTQ*^R%=;_YxQ#l1|L`> zX#}!iSG|M&dg|TA?hlk02fBsBn zU)9p+D(iecv6}dV$jE9f;i6NdpT7RZ60gdkL+UyK;`|rE6-c?zJ8wfF8wI@bo%0&@!Q&=%S)O3 z)Cw&d|7?|d@l43mAH7bO;9pUox3DVX0u%p2;4M3VGnTcJ$!!QljLHoRR)Uhr@KD8$ z7*Ihwl8X0BgjJj+{XB8~=5|-psPKxvqsR6$s0R0?nt9R~>rK?!s#2@_u4#q*z-RXj z#R2`|BbhasK>*}&G^7KTQHnPes3fV^D%W}F8e>g0+G{XJq}XkYe|%QJ{0bY_z>Q8@ zKO3b#KqD6WGv${WY}6&L$D)Aq;~ah`!(XP-^csvKGS|zw@<}AGZDotV{zMi7jq{5l zj==pEL0oqg**dgFH{`rhnw55(U~Wt`_$SC)d4no@j;|jci|{;(d!Hgm)w8>R8VSkk zE%8DC=`Ix%5*|m_S{(}D`0R@C7~UEvOws+LC+Go7G8G?!Ha9G-T4Yq;_zyGf^-?hH zGf1z0n6nnRh{wf$oI5Jhy_v4S5E=e$2jJTSJ%Bxb5D{hbOc8=+9gRlcVG#i$4z)*^ z77?9ujdvCLHO}(^0X7?r9TE*K)FYKAl?u3oMH|PG?So3&5 zP&e9mR|5|Lt_z|FB3ZB{fHpLE$ewJxUIPU!k90Py7;a2*lKjI`tpiz={yd|UoD3td z&^$ks5R){sk&=J025M}!2C#VgOe7>EaHr z)pQV0ws@G+Sv)TQDCyr5oV}iiHN_fek|p|*tJ`;kVghGJ9}uVdntTSEi@1vo^5eap zGM5bez0!vXWOOvlsv|RIIfC9JD>b7{xO6>4jk=h-*N?EUlC#AIRk?~fn>YghL!9_i zLRb{}P-qr_63zXLtL&Vf6sNfg`au4tQj@1jB>2%+C0g~0*Y-Oa%(bZym%suAJ$zw6 z>DQih%v$%Xtp4_Mn0u0UBb_VH3G3G$JAbk%PbhNB59I8SMB6~zCxRPzohAeCc z#QK#tLe`y!x{^1a_d@4_yO>AkaH<5t~?WNzo#IswIkn)wQqC57eHIrlfKj8OHKLrJTH7hoQn zY?MS11my2gW|s~}lV3QJOkxXxIm5UzS4JM}rwY&WhL8WwqB@UQJyor7tLP+D;5YNz zI?OESQlPiK7e4Aapg2i!k_~@M<=zZ6dU&s`tu3^THd>~Mb1@7ilWeD0aAfr^Leo6~ zZq<5m11h=2;bLdh;0P=sAK&h-T$_xH?yn7#H)*z8=zf=MuSs}g)p}3ou11fi&Y4z? znkInDyzbvYRzfUr3txzdaEJ3R=a^!(ET`FOeQ>tvb^w0@Jw?B06Y-?fMITw5Sy%*e z8fM%pxW-2DPk7Jxxr+eQ#bk8!D}Ys9U6cU#o3Xot2LHmtQ>)o^g==sS6})O=BgTBS pq}#(JUo`&#ANK#hC#2OE1d4b8|iMP1r+H1z{R4%0ssJ4NfDt501)s`AOHgm{Jqim9sGx0w-Q47 zwa5ISA-ad!>|+Nb_=6DykI;Wh=sjy!#il*=MZyM2)u_uHp=vf`)TpabbXj_tTXH$` zuOn{(xhgu+hRlkXsd@Cy-4^#eYj@8+S=_hETs*M&{&>aN9a(*Id)t0N`&dKDuEPOs zQ_p)rxW?Ds;s59tvU5qaFzi6j3$dE1%&;bh0sez&+>g!C$YG2CIP~&#e%Rp=1ttZr zsiVdW;Dr1EU&dnwfFlcK0amEkWHCQeIo~4sV<=U{s_W9G9o+8X2?4lYwZV^%)KV9F z)8N|>hT625|NcP$I9iv90`nFVCWA_;&Mk0db2 zA|C$TsCt{2WB~uL z0~M%RX)(0E{eI8mW)SVok;=U$(K5OIktfdmh?lyh*lli@1$Y#PT$4lN`QeB(E<;9e zH4*cAU)q(4R`*FDHw4rF@G>rFBLF0uQL6_+eGmJ`I$t{cJTra2o)9 z78|G_tk9VeXDg@c%j*8@SP|tkhE77%Y-=b(W3P#PG(v4dmk>gEvdM)J==?}CtV-A7 zY;3plJxdJ;$Oq#iMM4Ubg3)ErauFFCw&ElA{{C?3jiKaQs#vE)OB9{Q1af0Dv9UQZ z0MTl~btgB6{<;OCfW;*SfL@enOc6k=XuK9{nqTXSrZr++LMQZ?D%T)fU0p>^pWp-w z(;k9xJ=z6sLP_BLs|SB$%+oM|mbZr%!~yDJB7}c4j!t9*-tW{Lv9|MD9na^g`mx-(Aii@nJ8T&-VP`Ng*_S%2WSopT)dru54c6N`SI0$q7kSAv_%=7#qeSquBW2y0An81&G7abPi2%awV5QrsFZ0uffhz%W)#&af_=ci#)D-ZlVDHFVRO+6w2&lpmvE@UIGfawXK5QtyyehArP5hIL#OkSHtR zVPW#hj}+kB16*+)>>7n34m5w8oXvY%Jej{n8?7gRg7)5=8AzmU@%gzQgo^z!WWe}Dgqa!P`Lp6A z#7aT+1;efHQR4zS3owp4q_YS{{T7EIvv8fSSNp#KQ1Xk4{+qzB=HwAp2Rx-z66_WO zt<;g>MWu{%8f~)<^yz?J&JDTY|6bWt0)y;KSEOlym&#_x#y#*71^kR#R3Skp1Wspb zjF&ZI;`jc40R%n?2sgJR0Ku&i`GgIm4&~ z|GQaGJ~L+dnE_u&{1T`rPgR|O0(k*_e+tEY7Db^h?bc^UM%-}-sn(`Dikt=z{F z@AsGhTX1aMe@EW|Sxzj*e%jP`(I&LGzqe}QgL!$nd0x(Y)rl17M;CS1i)qc?BwO36 zi&`gb^c}>DZ*PaEkFz@V+P>V;#B^~dt&^?0xURk7HBwJ@J#%sL2asv>kI15VY;k%d zuMb}FgEjLO^ATps%j}F4etG>l>8LN7d~i1@P19$9 zau1azhI}0W|bHqd*b)_4`r{xd85>G@9ZhgzH>*cgB?@nzBh&0>GWxd_vd)}Xr82Tz>JrK;p5L^ zhapdDK`m$e{(bFMj}sN2MPR*UeIPzBwY^0FnOoIFE|qo-rZ&EqJNY}|pe;e;d2ECI zv*Xnsyrzwj9I>2TqDx=OJNNt~+}1-bnP?Qg$3tmbg<<}RFH zy;zV?``DFErcEuZU|A&9N zUUbJRw$iW?cQ3p7hR+TBLJfmhG=NGOsmJ^0{#PK3ASvFa{gnHCD#T>x%)h`m6&!-ena)`9RyFg;IXReK`>epEOtHWN#Ti{DOOUn%m?1taWK^r z^4Mz9%SnCv#MNTYhI>_!oyrd4lABNCIs_R06Vw!c%S@y#LBkjaG5l z{bvHhA_d0T%WPJ$i@^Kai>%R3ji6=i&CWm+Z-^Aa=lRowedRT>S*u|r;Roq2HqyTD zl9-iro?Sw1XFm2u5PF|1fVqq(ue3F66_Nk#OtgtD!la)nCS{e*B#r2n8-J6j~6Mxmwvb( z{r!=?<(|k~{INBR%^@>vO9Xl~{aI_fbH34b6f74gVHLCz-+2$U4I+2nt+(|EivNd!azGBlE#n1f&iPNazaRrSB6e~H5i!H6J~2AeHmX%RxpG1RaoH$qXE|a zjnNu;JyPF)h7<)Wf2=fWYgUVmWYet$0H^sQ<`|l-zF2OE9tWLR#BUB3pa>`B`-k5t z&&YSbPA;|pe}st=OzKZfWaVS28ebQGV+T4Ys;XYN%Z!+@1fU@*5&L)BTfz1xuHdpDjIq{0#ZxNNwgp0>aOr==mXPE8Gq>UkA1R<-TH2?U z{C;=7tasQw!26g=sHi=t-T&z!s!7RVt!WRQ$qRnuOBE6+I~hz3!86g~*PV(IGWh}= z)+V$c0>-jm_)@`ED3Re`r0sGMw$7nj7h;ePt03?TnQY?uMoV@VzkO9C@|PhbfMhzL z_!FkbV}C65+1=fpPvs#y-tG1N*tg+#5m_S)h0X!YVZP_S_NmQgzxJ?d zY(ZklXTY5nG&`>l zbaRPVsUGulT)T%cge*EdS0eJZ8c`^e0ghL^U?Hp|Zb1MCe?W}i@)Ku$au(=42rpZ* z(G4V{U{b)ucMv-2^`*2Xq2P@zz#&#-$edC};Imd)?r2D9)vq?a6{N3^&z9LAm>n^R zrtUHO?qXI*crN(TlC}Lh3nqyMJ~hUq2S+&`z@Vj z{vV`&Gpe-^*y6~@?VqO~{diL#6Iw`iB`rgRK(@S`#VZ}1w&MKgTC14IIBk8ffT?sD zLoeA5_)ceeiG{+@pPh;kwMnlSFE%-^3ni_&jZyenbZ?u=jKy-Af3uro$s8gMF{9vp zR?de{(p$!I*wJ3vuw{*7yI7@LV^rZ;75$Q^FFu6a(rQTzS2)6#PD$mKKX(1YYYafp z3eQ1spFwTxb&{iK2q7tp&K~H1|3lLn(^3MSIjW4o6Kv_ZKTnRkRH$d_H;DSYz zD?)~JO|!*nT?e`%D)|fGtKI=;Z(awDYuA`23dLM*r^Ap1TdMg;WCaG`+-sa+Me_WQ>^!GI69L+MgqZtLancfT zR^&^kNTMgDvf-r{!b)d9Wd3@nf>M2cSG4;^(5dr|mhlX=YpicmR+U>Cu_f98<^zN33 zuOuR+fm#ORVPs;q@&=p2Ia*jeH9VhOc zoSGfVWKNt))!hf;?+%MpQDEk6ai?yQtPz`vf-9nfFZW|_%2c!5p7+baL`r1V0)CUe zbot@5`TLXo7}EM-P_@?p_{l#%8*Nua*lFCku<*9AOca8Fi@Vt0+gbuq5+igM$CfR7 z$4=-C{hZGpyNy5L$qT)q~P(kJNoi#HVPR-U~nLg$Yg6OTna^GL;$xbx9{Qq#4X6 z>w{H~(DU8kz&5y!UHVmOmq6`_5wPmv_-XBx*F*q>OU1Xfg$(dPEX#2>cgY=B3GMf@Xg|B30la9+!wulQ?afPt++SGI24^UIFhks|I30!#W z6teh4_o0SQ>ZGx%ms{MCs@F*g%^@2vxzWQQ_=AOV(cO`l)tzUN9`?m;KTy-mKN15G z(UTa$qe=$7KO6TG(ovWcVYubz-UPs6DFFoq1x}n3h$5F;TU*%_n+3$l;26n7PhRrp z0aOo@(ew$xM#xfZUud1$>RdYXK7Nb8Z^JL5BS(p5NxBmw?Jc#86vY$c36FfEPyaxq z1tyNM$68(=xh%gF;azcJ#3XJ>Brz+R=A&GI>!&9u+9+w(=%itXXx)xDx{Gowdq{!+ zzx!L-?Y7?L`)4%6V-iXdzwEcRO71CqGpP_}ROB=JEO!^@S4uM^K5;gT4X z#lPwz^uEFmwB4*k1+=FmU`7`ev2&lke1L#eejG zG9TyBs!GQ5Ctmo_fLIK>Keemk-@c%q+^s9Z%6QcMZoy>Teu6R&grrLbCi+CnNMs@m z@b#uCBfo1!MNVf%aYK42T2ER*(!)*QJ1da7@jW_F}-%t z&uGcW1gR&&#k}vI?9|Dk>#EqP{aoV)_idb z99@bmKv?i`O` z@A5@A^rvVqdXWP06NbnV5RN6ncs_BQTT~(~hcg8hhT3nj@M5&}D*n zctYGhJjv7Xu_x9UCdvZDJ}#zum9KoWub*>z6T505%D^(!lNRL}kUU)C+SY3nuci=B zH!Se(XM!I{4>WZOKB?U2yL~%h7KaHBV@i)Wq8~Z_ic0sfkBzr2Fiv74E6DhlUD%>1pl{wXTuh6wm^jPOZ(Yf3uJf!WVCOZ3 zTHp{u7(L6ALAXJ9aX3q;qp%%w2+&N%a#%_On(BBl0nzon=?ZFnQjf*XuK)PHBFs;5 zIFJA}J#{@PNvIH9@blW&_k(Wr6;*`?(4Z&HT4ieNBpT-O4v=>gFQstTmnJ2=FF)ot zhWKGCyHgr1e=+tskrUGNWIGjYek!<_Gb1TP00Um``$e?z#8D-1GPDQ~*X=zYi2*R& z=|8jNok}Q?I1}}w6;q*Fqxo4)+!qM;;bLH5WIun8736$0IbWmY^jusrrFXWZHj%jNUGZIvEh1X0~3#=s6=Nql;_i`SU#Y-KW>^m`2vFZj$nd zrVxAXQOwWZKLE*5<*-h=_i&vn!f@IB^tYRlUdB-P)AycRuWOs)%esbHVDkv>@X^cS zva)SfvcJX(h|C>v%fA7J%^&AhI3U*-v&L5^q8@$#6acK1sNK;Y?By9f?cXN;#6G!a zVd#99EDThtD(sXnPpeq8QE>@-ppa=8|DuaeJMebbfGY<;h%74yG`d3$@SgV}621_Yve z5RKZLTGf1s{T&CETMx>aP;9<}sNuZ~E^AP$ieuWK>r6_Zc?+4PGVn9($|um1KU?ZY z@&!MOSkC#oxX7B&JhjC9AWI?dJ>JT40TLUDLFo~7!ISFne-sK6Tj~fOG~UEZp2Vm7 z#fph$!rcu@_qjtxF=j;0(K=9q;6y$l$3It7rc-}ZI=@C6%DW7G%`sU43zo;KW4oW(ph~97fO!x#kskhhcLl{Mc9f6vnk=((VLyX zq-9#gG%W;#DDbxt9_wkNLV98WL#z!< zK%=x{V@3_h|Hho3rD%hKW79};{i}+qa;Z&e0J#7z^uI}2bzG5?J+{+dv|GU7(SdQ! zu4d@zbuz=d=d&21NMY0da$@KIv<9AQW|ZLevi{3>#&ph>l`q}Hf+$lKS_{r{CWtrXE&iAnuGn(0&?SF1{NNTS{V`K@ zElR4}k#x0avcEcf*HWgq|K0e6vIm^lEI$w z1Zl<6-!v6N;_4CON+ImR_qx$YxwOIBnX67MP1dRas`36-h-g~Slh^p@y}y$H6H^q7<9HtO z4)yHv%;c=2E;Fp&G(r%B?kBOT(`9r+McxnzrAJ;rAR>uSseAcL+ItZtcqpYtv3Fitsx$ zc^hN&OBmDXO?`W+L1Feu`Z}2@OwC@3ha7Fppi*qpG~e|ThQS;884tC}U`4!0`{3-w z7o}TWirR{+6N*2*G-+qpHN_%5PS1#Wp#!fX1Z5gr&d#jedO#8lP#k;2T;#u66qQr!{ox?& zf3>bQos*GQ^T${=M^?Ab^+jS;ofR~^nx(_n`kVhh2mk1!y$y=mco8OEBaL-#E#|G= zZI1RPTnZleKFA;8DP0T@ygT_33L|_3j>mTedgrBAM;Kb_grU{cek@zXNj zqVt__lHQghNpoyZ7hhF=vfEaYp3N@ahd4%p{IhQ8@_S~Q>jMRIs$nMreG6ck54Fvl zZ5ETCk^KPiY-eurrp>U}`{ZZ}TpM~@E7_C$WXRcl(%cum&1A?vGIXM5td8E?EW#)1NnA z_^kf^W451f=t9;cP-O`_n}wu==~TTTm7@*4D=V-Y@GRKRd=YprnPubRkMInv`?qmOhiMvQb#+=mly&YvTtNIdwqVxHV z28D%keks%8h0-rUSW|hnp#6MxjFdf-5}?`C(jt_aD}q{q=lAkdJDc-7{zjhD`<8BoP6sqW=(%_yZ9A)_*ghb@yRtdzt&O~9#m z*UF%lEo^RJXoybC#KZK;${D0i!?%qY*SzD+4c-X9A<_Fs%~W*(Quo`99ky+z>nxn0 zvX0roQN=I397W3RhyQM=!(Z}cRF6Ndy0o?GA!h)4jl^DOK@-&XsGAmooo9ngt$f)x z8jNgxVmupuTM6nCRc=8OSlXq+8nV~fn-P+#T8Qs;9+ujBR1USGjW*M7s(=2H54JQd zd~JDrvGs~OlEw*7qu+}zvk$G+DzbR;AsBm3hB zG`*=0i0h{|C{3U!u;RVy2}xpXVlIokXB}>^o;;`Ulu71Z{H9LRzk$>c z`2tpKKf4Dfi1{TjO-B(z`M@rXBb*|w-$6WPG`^xZiXr-D%ODog{z(%wP+ul zh*(2-H8nn7{W)5UU%6#i+WqZ*%?UH_mp`BxgfR7vk%y<2g~>w(O>Y_+Ap4O??L!Pk zr~boo9`bBr=>ijFe5HGEWcHdz3e|qG*|npfb6spry*mU`i|D(){m`=1y~tFc79pUq z85Zy{mAIsu_7e-cg^bD1qHIVt>u^D3?JBvsX~W zJ9wh*{M}#6CaW zsa#MrajaBG?l*XZVk}ARAV5eaNXE-G)_*? zeRW|}p3q&=y}($J=H)_sFA#RgvZnlxeyq-1VZ%)FiL+;7kc(-|?nti09Wjeq;k^w} zvUf39)TbhYRpa=zAGEnM94z{*j@s^wPpyKq(ZC;dbkY$3??-fkRRsz zTCsVW1GNMdJsM}KFDs^9NEJEc>XPm<*H@l-*1RgYMol|ZTj`b1U;qM&h$3nfUO%aN zls$kPPCICDrZJ~2p3^3U*-#$!7>FjZ@lg^5f0?hM%w|px+2Gn3N)JU*CI{8{OXcI(Mf;@JMrAZI^p4keU*{^erTrt|4DSJY<4S^AD1!C)XX zg*Tyzg6)@hnYTkN7k7+TUKU3Hxij*M2l@w~){|Mr5l$f$3biPrAmLo5pvP(n9t<5P6+)yMhn@vuU-Nh;cE z1dTeElrRqb*dfCbAryE1PfK%)X~vsE(;_j%{1vC!gwgv_-<|@BSm#bOoA)n6gc1ne zLq<(=lDSsO2?C}nx1=}ZcP?^3=BLnP;I*V=hv6Sv#uY#7i!CDNJOqRti3qyN{E6;g48e|IWZB)WJp7ao3cZmch$xVb zC>p>9X*g7KtZqMr|B7+Rw9-`dYo)>Fb&f;i@!O5j_zHs`rwBFU)(Reev&pY$Fj)T1 z#`6iK?}WTk@^da;4=SkLCepW^37#NpAs4ekuq&EO*Ek;o;85}J@aP&>jbszAZC!hw zZP{z5H2cv*36cq+Ue|V0j!e&NBN=>MQX9~`+9Vi(@FqackNAQ!Jzzfu0j#K|EB?gC z^ZZ$xYpoQ;ky?@T<3-rCJuh?1{qiJ*WX%@?#GT3V@vGT{^svaf-;4(;sKDy+BN$|3HfjH@_wZj)>1d6PWT&)lm%kEScLO(9RpHK ziIAbTpF^4V+=x+MVCa1*uiPFBj}$ieWHV~cS(?uw(vo1%C^T)8fQ23Xf{kjKB_Na4 znH}L*7&B#_{3d=}8aS8Yn=ivVU+@Z|)Hrq_Rbye)>usuDSLC}D{oCubm^p)I(}~;c zkcpy}bC|6D0#fEDw3D{}cl=rX#IpgNAZYt_y6N;pyMc(4P?Q zr^i1c4+SjzobUg_wx+Jy+S=|pU$4Gwa8y+7*o1FVYPw)1jR0cYd$Topx~ArkH49eg zi%IFf0s2D`f8sYlZjf^Lf-2EBQ=wiBFPa20X2`>QD*ew#Ztd|EoretBum#@-oK(S! z0nn=I@XomMCsTm15KZHPX`3t5s&-`W*sfTGQ<|8;{(zC9Pq|4|tFjZZkB zyEdQ%tb@P*jRDeAnvY^MXMH}zW-)V4BT$)NCl$0SZsme9=0e}@u(4Qrys&C13t_p) zvF2Fwa0)`D{7F57wKR4@;c~5dXfK2a^m8E@JPrNeW(^Ue^|GoVdMY97bz-((g8+5MjBOr>jo&m>stRC_(NBlnR^C{D7w#a&6tRB4om=Xwij1?{nuZA z&b3^2GWbIj*!j=+4QZ>pq^w$9Xepq{6S<92eY9&EgQ~BwTFdM}8EyMN31e1h*{2>R zXS^y?%3CCUlLw0z(y7!N&qdtPSmXw*_Jq5mRuc9s_VXN-lgSoiNO6=FmpkGQ?hAwf zlPnf{pytY&A_a9INFq!6IQgvsSl39+2!4g-emLLQ4>|)}<762%6#Bf^)-a^;>WBU# z9@cz#o_$%N<5y8pr!TR5w?P#woGA`4imLr)Fbe^q!Xpe`1FJu8&bDjb2T;V!hk#o0 z5p)`@PpqmH=+~T$Cg%kSyWPrT8WpI5=#na zVwG)%X`Rv9RT=x>%nXK5A@aFol$1!SqKPf^hK!2|YF77i!BcObmoO%u#=v1J`XmEq zcR3j7wWz_E8Zenp%j*55F;wga)^{HiG%kRYp^H&jRuiC1wzTQj*)h z`jkER=^2T(9m#9zEW^y)j!BBR->BH}H+OgBe7(?}qt@4-HK+5pf2~&3toW9L?oXFc zLgpvjZWQ!7&sr(D72n+CkgZh)0Syc?A4oohVcf`5$#N-iNMs4v&Zujr8XqEqXk8+n zR$0vM?mr_O7fA*yx|djzUyUNegcot1ElC+$(jY!#yioex^=$IL+=+|EvEKG{3i_SM z`F0{nk0QCxw_HUM7j!Q{47@%(HGKT|KpzYi44oU0UgIqA<`N-rL6r_&z~0`BB${u>TF~NL zn;^Gp-JZL!3PTS>0JnrFJ5`@6NZK}UgA@NsAIcSBWsQ%mHq-iocK2oH3EpLT<-lIl z?w%eY;W4@i`EWvlW|n`I$FXrICnuQQnEcN)i__H%+Bxy(wPk`*?0!OJVi_e|#rM#_ z>gK|nI*7v}@GX3v^UvU*EeD=w@&5K2hWR1VMlh1Ok(pc}Cv-*8Y7NVLCpV)wsS`ex z-G;@5l~}>Uw2kmmCy3!Z7fRpO$-_(}WFYM258EDBU~|0>E#+E+bZccUh9)}^pj1u2 zp0X=Ci8UX|dfg?RbSjE6E~|l$XDh!)juV)pm#5n&*jd8%+a`AVO0~>a=I5moU0HnO zZasW%S(ko&*ZJv&P& z$KE@m?p_<*?(x(b)n73sq;DT{oFz-mJa$HSn3mTE@0OBL%FOhgF3wwPC}|=d69TBu z#Llb})sxkSkG5w1acQ5KtqaWf(Rz=*lDDV18fkT_X1T=t<81Q1qDn-AMrX>H{TK0F zuF%)#+)*u<7pi^KGbut3UyH=o6UR6562}d(AV1kkM4d2J%OKGD zlQ8)Dx9Cf+4y>5B} zi5ICsQIf8gI-+U)hRLz@1n1i_n-?leI#xt?I3%pqldQ!|YV!>R+6WzS(Sc*ZWlV z=vg*Y$5JK-cpQs*m&@s~N)J)DJIw^OKR%4lcUWEyDhkqqonK%(;iJU_I_e_8uLp3gz?FGvMgTFBHZGBlU?-JHG`RuHIn#!|I$W5g`}*{*U+WyrX9m z*-rK^-ymd@D|Cn&Ngw4DsJG&ip?>s*ie3l>QI z`Puam7b-|bVW=8mYiV0lR8;;~fB7h^6HR79WrF!PSZ1ia_xH7BolaH%cYl8&C%p*F zM5B-tR;iho4a6;K{N6N*`O*uTJ7k5A)@^62Z>SAST|ty1l&&6x`&^uLJ6FPc%jG;j zTNCU4aS${exUMJcM20o8$s$FfUF8dKcVAEhzj@*J&jbJN4mAOtSt$v|)uZcUWMYis zls4Dq{hdzQ1FUG0jQl6^N=qTd$V4b{Gmrwk`O8N{d@oHh1uJ0Ilk zFc>^R9XK{zZueCHk?!Yj-AxOWMkKxdE6t#Ie%}BJJ(NDz+w?@b)BDfH1ez<5*C*>O z&i7#I+ZOjYHc1x#tk>S|yxw1r8}V2Dlxvy+woolxNGm_>cVOQ=7v)Xz#muid>b|!) z45i=58f0hrDEo)mcy`wh#)}5@WbxW_CzrvRQOBp-rK!6lBVqCPeJ`&I=z68)rmP4p zXlEfz|AYn2e{=&|Qv~q(%jrBo*JEPIM}@-v?UMc1to`X>eN+e*b?Yvdm7NN(-kd)C z`=dVZ(|%CjTaEVLi@hHDY~X`=MKC)*IDQE*OhvN z)fF9}`IW$o$AiUe{{&|(Y9NEJ<#~`0qts1u!bN^}6)X~_ky4<@Wi|qpwRCgSZo|UD zvMI#a0&4N_adAl<@(N>WpZH&|hA+m{zQq+;NjDeEzKa7GQKTV|o!sZ|e?L)aV)^NJ z23oGN!+R0?sR$~e82MojdlPHv_f{ zOPUxuGc@yx=}iMR2+#C!`h|6K&(gtX95zRUZHluBlP&Rqb+J5_c{;W?SpY^vB49$t z)Ex%Ig@@F3d?i$8d39Y~uee$)a=vm=_1*W*t(RMzp_?~8a5-z4H%0`h)+5|Xq2VuM zig7uBZOw>+73Jibk4nVTe0ulK!#<$ljB>a1*!{~HX07}x1$yia{Owtw2TBA+B*E4e zk;47A51YTUZg!CE;^Z4Y!l|Q5T3sbhw=Z12o^51|CWXFAc0$67iPwMOHk5Z!_4oVd;MmEwR0qcq4ysRc^^9ViE zI-@3CQelx zMYgQeGEmmLNHBPB16rDgN!Ii=jk2tNDwm1m3^wV<-1O6ZYJ2yM9|bTZ|!!5LFd47|CQ1bdBc5Bl<;JkC>h?M#FQJ z8t4{qlsG*sPYPti9X8g7Y((|w6_ixvo6^G)^kgllXF85RL$+(2e4(!^AA%S5IlvZ| z@frFJ`s~KOTssEFhL4SS&1eoB5JnX?1G~anFzYUPw4C3s>DrvE^#x3mGvgjcs6nMB zHcZUa76|Dl9oiB%fT1*w{e6Vm;RRB)9M8QadXTsYLXfA*6OZrm?G6gXW@iaSa-TP zN*5|dVDDi&hHR;OmFX{dSdb#%8AiA*-Q?H{x@7%UV=BGKs%t4!^rTm|jKTYPzJT4$ z`LCUehL|@u0igE87QiP+L4}5%9qxV~Z@9D+@%;`ZRAhLrqYd=pgZj;zPFN9j$9D*! zC1QI~Bjj0!5F~$_(Y+8tIOxW|Eg;2l+sXuo!|PC>1ocvZP*lt&=Ql`~TZcrSwx?ZT zom{u{18uaZxph+(a=^zT7NYiupWK2Jnq4bYjG0KVGfyGnq%sl@DivbGwD2yW`yT7A zkM*WM1`k>b9xg?3F%5}N0E?ehazQ}lR(C$Zf-#-wM~s5bIg;DBX~e}cg0e_CjSKZ` zP1cc$k;n}P4Nq6lZ>nhc?MU>Jq4$*{dp#<*63H!dj3n5N!DbpbB$^NWv^M3g|5862 zbVnVjz`Hj8^U5E!v((QF^h)YTvjAHRDCl@ov&5Q8ii#L7I$q|zkT@V@!q5}q$roa2 zBh^n+R}xn%t@R7;QSafM7EYz^M?et~Eu)ItIiL0Oc**sl0Woa~&*9aeE`=M}658TWY^%`SX-wE+L;Q?BGhMTm3ZbrX2=chFJ=$kR~z5(odJ<5yQEr zmSR)9mCF>m#=*9*5hlDxJ|&K#ImV;+@&Lw)^eX~FDzrqp8#)AyY>mN>4?|JF!Jj%5 zh4IUpSOBw#kGPd=6;2dIB(OADMqb`K5mrseiCBu@4zX03&r+V+&&p zr1tZmJLR)~D3Aiu8$!{2Wg^jB-Nn6WvS6D=!1=ZP_F>!zMiw$BU^K3cwF~a4FAJqciCNZZJJ+(&*eyS|S zBNNAh=ax1@C3=GWCcZ0E)Qr&lXyxb#kM>$*_aEOY8W`i}ErZyOp9BH=we$>GukXYp z*DO;aEroyD%K(==GBxk;QG~svStxjiKnL`#dU{hVVg!vDo@Av4w&pmdkwR9QQ+*Xb zjM+ma{~h~8c@T3%i+d5f0VZzElh%!1C0l>|9prrQpB8~&{>K|DS3@{K8+FcW4r~--m z?}=Lm*$qZn>P;RIU;K}LHe%(8CZx@ri_=$%4uKl5e5++hClhBeF@>PQ;avT;FoX#w zT)o<;Z9e6PxSasgt2Rnf@3|w*{%!)yBD<$pVM{+;&`I<1k~8^@T)2FMpTpoWZNQ!0 z`+a2tS0Z$D+Sk*sN!U6!2h-4boTAOYnwJwO697y82H4a?mB#+}uJp)zS9WOU9>XOA z%=KnRBw$>(LZ|ABX^QxA8h~M)9wB6>8?9{YVB9{~Whnh6*Z>C-91ulN$)a+3ZWdjIVQ+566S%p?3Del7mj zZUd5I5|=qlQr1}HRIxms@%_>&5{fB*@fRQ_Uw!W`We%koHRv^Z2(q7m9Bw4X7WR?Y z&H%lCNYg#}k$!`fh7zkO;};`9Q3#%(m7jNNupqXII#x-b%n0y$a^4aNmFL4IC2)@?BD`>?Td#d7g=gMT@do);VqIqt27p_G zbJe8y=#d|CY#x0v1s*f8AWJJX;Mjh{^7dUD@L%)PKsicYjaorw8`ES@I?tT72lB%U;{s`i24vIO_{dDI_-ob?9G4 zXfwljO(K_#oD$eXqwHjl>;5L7^U53oTuZLz;9Nh9D+2r|1^P0*r(sOcPUQIDvj6EX z*6?)Y@ULA{3?Kt6USKfNuc#s8F}Nx1V@c#W_`ZLHo1PA}mqe_Ac%?g>kHy>?6!c5;=08^~$KiEcfz z`6YV4Mfr|Cc$FXm%}g|DfN`{-WmTe)FI>}l$EhsUm-pMI8XGP$hDiyi^VNy*GQCmz zl}Vc{^1=CGabb<}m&ZMpvd;e#QWmZ0bQhj)Dc%cjXN-|-Br2*opJR`fl;`UxuEK|} z3zUqD;*g3GJnxv&S{Buu%T*WG2P*bIHp5sYO&z?Jlt=D}v2RqbRiu1I z=ICVq$fS!Z?l(=FG`Su}H5XTW?`e{T>+pDL!#RV+&C);(*BbL4A~SA(M@O+v0myGnnKt`5EpnZt@H< zK3D!+n7gY5Jd5Z0@^b^EG3B(#o3Z4KR!1IhiNdv3DW8aCUn`wPBa1|tO`d;+j~;VW z5;-;LgX^43jl}yhv5)?RC>lc zqPD$s{ag!TsV61TJ0?pt{3K)va4MD<3Z|&IfS!_V&geBQ9g3v`+e5FI>3rrF39w zJj{u|+iQT86!e^}(q8I&{PN{XIlWeY_T9U8oAdV-B}pYQ;l>CAeI7k}^czu=lIGJ# z8eamqlG&crT}q{XXgCK^JU0oFl#tW(;K76b#yzBa*KgUfrId7Ry!;Hy1`)C0_3PL5 zs3nmmi;~R9^Ow?HoxS$0lur@t(XCszpZ4zEyMPu%0G28!27cb&A`KPyAr+L`99rDN zCa2&UTN-NJ8Q~r{ac&&Mwchk>xIoVuzJ~}_X2*^lQ>6$*aE~t^K76=EarlWYayMzx zq#gEsGsm?%bwQDHbkVh&6q6>(;GPapT6Fk}zSyJ~XCI1gO3W z;*#FO!=o9}t5c>-3H!mQvSrH-M|!h`@$xOP`Ocj?O~r9;_wL;bru|DQ&B2(NiJFD| zP+%4WjrO9m;X15)?NzH*4PwhZ#QltXMD}wUV?KpFE1!#t3r{!NxgL(`rsqzP^!`d!s#NL6*S0d)kxFyw@!dXs`XrQ8p7NJ2U0Tj_xYVXio2m4S z`b(EC4Uk0sLgILN#4&LB^WcI73y$LB@(xPRt%%~Ye1Pro^y$;XJ~UFKd?W8>;J|@D z(VR#7`S}e|Jj1eKBZi(ibLJXb7e%V<_pFyBiNdw2lusBr5R5SmXVY_q+Pexd3X;KG zLmFyVHqcFv6)RR4Q`A`&#>`TiHf=hL%*JciuE8RE(Sh2Ljg3{qSuYd~b7>}`=L`{u z*vubrva90o6aCcW8Z~O@UWvJL=K}azuxBJt(l23S$wOR84?+F((@%%+wFvCNnRlC+ z>&asW(0zqdoQR{JWuqP$62U1>NdA?-htaVM2a&Cj)(+!rzjfgu|Jxxh@5 zxqzxSr_H%{{P^)pB}$Z-Zpf`SYl+yfQdlw~nYkaWvd=)>s}V5cAPU?I(2FUiR=C${#cK4dYRU4Y;$lKARtZ)ar+SK0`YkS6hAEYE3OZzW2UNafW4 z(Ljtv(Au?Yfgmr5D`xZb^z4EAh&XRWf)cA4RYV}sv}x0FN@6$mVJc^fJ|$Sh-sB^7 zWFaSowUC0AfCoRUTel8w&j^2i|Ki%4dXF(>x2A|HrETlL%my$xR^jH;pDV(AQ=~|d zgVzi$_jMfPG>c&eS)gM~T!q#IfJB$GPTb_|wPwCv7e;7E4f7znNaxa-`JdfVrAqY` zsSk+venx*QnOMAYlrCLb5B2QOp#$R3LxCi8&teCGJF&HQ3x-C80Jt$B8RhQoK8*(qrZhD z31>JmJz=}i92Yv(^=`y;fKy^@D8hl`y6Iha6>|n~rz2ISD`Fq0-#&c!@FY^hiZXF^ zWRdnk88{&4l`B`4XzHxYBrK84r)#cpve;zF%Od;5yJyUpaTX^6HA5{0yn~46gw2~b zxaE|uB@yGIiIJ|M6Tu#_*_S;F zK}EEfI~4>#d6pWkZ`!nJPZM_*xJG4~#}OQzjJ$myBI!x1*zg!x3$`TzfG({-h8RqV zQBEC2NkR$WMi3XB&((QCjhq~M9Q_8-?twwn*Uu%KH*el<*7-_G`gu8=bd12BLx&DQ z&kJH7|4jZ{Rsue_ltPF|T%+|{?ZmvXccp2p_h6TxcMW9U^oGlqFP}CcdY`fg8%FCj zo$fu#>fI;@o(8={91*WmM4Ybr`1pLPnb)~5MiL!3-d_apuyx>Qb+cHC_-tPYMdhRO z=g-e4f_;eQg9M!}Y15{~xLzVJ0OC9mxS0wWC_; z@@VE&p5Mx#HH4L$1^UR(jbXtkt%8ND3BcL2XRok9;Rbj8bQhZV*YdR|PoBJGOi3hB zYYqW&e-cHrJ3#<64iE}Mu>^YlE(HNt#7K7%M~9Ivy<+j=#oKAIAO`(Oz*52_0H+h4 z3H>ZMIJi`nELn!qLN9P|Zk*9A<0%sWdd?Q+#03pT!(ljfTY(I(EydcKgFk^hIML_0 zp`4dk%ON2lA-_n+TSGMONNN+(KA$vb&>*oy03e#8e%@7DyE7zdl;kxl#>k#jLL#VL z!ALB^Ij0V)^#ZuECQFtqm=kDLaUc;6K%HSB0VHR_gMEhR|9!7sy&w^6XN&YaMQ(|H zR62>w$ZmXrZ-n@AjM1#2PR1V4+ zjsmh!n>e|vt;sVW&5a=@0yusy#D93V6jF+_$Y&N+YDoYT-$yS25J=4&1-%;w7Q|Cr zds9kDY{|wBPbUdLAP(2$!Ot}#0MNg99J=uk8^@J_&M3tA{Ddqk%tCxk&W#g+9)4Up z>$>54AYOCQGZ*sx2-VEfv17-t2yPBSUsWK3u1*kem7!}}60jB{m83a!{R}>uYq;c5 zX-9xPo8|;!3j{5Qa|!ABdRQnS?G(udBjWpmCr+HWhNl+HzWN-5a9_~hHVQAt;AYL5 zt!9_uX7(4O0`b?9!4N=Sg7yYu(vy1z4H}dnFfgz@sRYMN<}Bvz$@Yb^Y@~wSr*ElJ zr8?7kES4CFF8XK9nzb3;gYyk>t|Fg1DEsLlG3LE}`!)=EFG(aH3j^4sNt42P{%tIb zyM1uLG;GI1UcP>G{~PW6dHeVYm8$Yfio*3F0QCOOjNQo2VWC zy97W;04%;%W=@k5$1joCc!wEBV0yM6P`-ZRnX67lU}#QaLynK zObTnV$_SWc!-fqVrSk%@1{e4UY2&r9f{)9SCl3y{JZ>OXFKIuv5^?xMQ`Zgz&`)2r zYSldX%sxc|7UqnQ)!E_U;R|8JGy03A^ZjBn(GTm_ubmZ&4geC2`apNXoYP2Rlu{Q;Cb}7%m*x+Sol^{Wa zUwB<^ab+S9sUG?A<=e-S-C@oAv|VpjC6*BKKV*bms;LjN`QIi0!UmwdIYq}!p%=Zc z5l}bi6e&{V2OR&5Ln9T&6xGCBSfs|$-#F#>hICH=iG}@vIJ98Zanz_$l_X@y$`Z~@;)BE#xBH z9rmGccKznE(ANP2@H7Apm$EB6lSMp@S**Ssc&5rLF}vUFdsVK6vtx)JF95arQZJ_> z0Px!*5)22A5XD==qU5u#UAs0@P~X=CfDd~p4w3r!@#EdZ5!$4)4Uqi4#fh8flzzmB z5%mo2NdPO7muA7gj0i1-Umc4E(XhJq?jf0;EOLVjv|^)BIrcNF&YFwG2vnW99|&Iq zzTQ_sP~F(-UzXjYt@&N~nOK-v?Bnv>zU23`W4BOV6Qbe4*Vp1}JM!lMO?@hD7Dkd5 z{M=HEbf0RG%O?dSks$}2Iu-|Tx;u7CC~V<$-e>&}L|7zzR~NA++Rf!42Izd(DFfhBbHCiGk!SaMb>Kuy+2b%H+#$N zX1BNX*1RlEC3W)Jue7&QBfnQn1avvTz7?+=;lXDH%`n<>5%Ja`;a$O&@Zezm#zZS>a+uNT{PuXm79k^<8F8ujZ z6bJ$I(8{FK|H>!eIMei)eH>gu_sq7qPEQB^^Uptn5X_|LS9sj13^stIckbM2CD{mI zaKfp)zjFXjT27DMqIhRYcXxLfK~ejEh2r;E@HKN_jA(F!)_d^a!6)>$HT7x+(^`Ybz>!afmh3xEpzipx<}0B|LD=9Nep9dm+=0{p;EhSwG(UCfR9zPrm(D1V`TY5Fq&CJt!VZ43 zxL^0zBNfwdI1-?K_!JYwv#7A;zgtYa>dpbL-Zvks`T{gEGdL5CS|uhe(cr8<26P{wWz_if$_jSHnw){+M|$>ClMQr9lqY6nKNhpsE|0k+1>#cBz)@~m>|k&v+;SI ziYa;y&H3V?cKZ)BaF)zrVPVLgyGh)6WV&?eIx&Y)m9KVVDFDC%Up@j4y0&lM9%Z)I zaw14;=^k*dmN@+d$kw4lhg}>G@Vs~L-U|yAD%4MkloMiVVUiS<-MxEv*QHCB&d~Vo zBdY81r@CqA-U+GJqt|jo!J1p0!MTCTSo{ zdY|s`p!FKc=M1*RZ-I;e ztlanP*)x&G2=ybr0b#&_+tKfhv^RcqxEC7~C{UmiJ*$@Z%tuohTU-Mtl@CLGt@>zh zN1M4Zk|tu2-$fxcBw}eGrpdaeWVOiC24B0qFZch1MA*?tSRo`vv=g{~7gQf%DZtM{ zulKlm^=dPuOoE#uX{2Dmf)G1>Rh*f6CE}!dUG_|wGVK%@Rz!S;YVXEa1GrI%2T@;e zJ&r*+GUEQ5w7;XW(rWKU66yqiC6g|SUY9v>Ov4<2?1dSrM1xB+kKsMya{`5$;>pNr zb6LCn&ozj!Ul12QPde@#{$D?JmwG?qe*yQ2i@gs}1 zxwN;dx)??JZ-~guKYskUu2)kJy?OKILK5*Eomhh?#4cB^TtQ`;DHhj>c<;2@+vlf= zo|+L>KDOLTB0#QuohNf#@!8b|8N2;g8jv83kB`sy=g*&CS+Zowd@K<_M1?!72MTZy zckZP?w1b|s1Qy_jGiASan-9&MMHIe7;bnGqw8#FJ{8;{zg6G54;^pY3Kh zyG4We4{;cY4n?%L6CEJJ!(v{Ek=oc`T!Ov~i#C!u^0F@ONCb9g~Z diff --git a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java similarity index 95% rename from spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java rename to spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java index 82b90e38b..52a4d6e99 100644 --- a/spine-libgdx/test/com/esotericsoftware/spine/SkeletonTest.java +++ b/spine-libgdx/test/com/esotericsoftware/spine/SkeletonViewer.java @@ -32,12 +32,17 @@ package com.esotericsoftware.spine; import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*; +import java.awt.FileDialog; +import java.awt.Frame; +import java.io.File; + import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.Preferences; import com.badlogic.gdx.backends.lwjgl.LwjglApplication; +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; @@ -67,11 +72,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.viewport.ScreenViewport; -import java.awt.FileDialog; -import java.awt.Frame; -import java.io.File; - -public class SkeletonTest extends ApplicationAdapter { +public class SkeletonViewer extends ApplicationAdapter { static final float checkModifiedInterval = 0.250f; static final float reloadDelay = 1; @@ -291,6 +292,12 @@ public class SkeletonTest extends ApplicationAdapter { minimizeButton.getColor().a = 0.66f; window.getButtonTable().add(minimizeButton).size(20, 20); + ScrollPane skinScroll = new ScrollPane(skinList, skin); + skinScroll.setFadeScrollBars(false); + + ScrollPane animationScroll = new ScrollPane(animationList, skin); + animationScroll.setFadeScrollBars(false); + // Layout. root.pad(2, 4, 4, 4).defaults().space(6); @@ -320,11 +327,11 @@ public class SkeletonTest extends ApplicationAdapter { root.add("Alpha:"); root.add(premultipliedCheckbox).row(); root.add("Skin:"); - root.add(new ScrollPane(skinList, skin)).expand().fill().minHeight(75).row(); + root.add(skinScroll).expand().fill().minHeight(75).row(); root.add("Setup Pose:"); root.add(table(bonesSetupPoseButton, slotsSetupPoseButton, setupPoseButton)).row(); root.add("Animation:"); - root.add(new ScrollPane(animationList, skin)).expand().fill().minHeight(75).row(); + root.add(animationScroll).expand().fill().minHeight(75).row(); root.add("Mix:"); { Table table = table(); @@ -487,7 +494,13 @@ public class SkeletonTest extends ApplicationAdapter { } } - public static void main (String[] args) throws Exception { - new LwjglApplication(new SkeletonTest(), "SkeletonTest", 800, 600); + static public void main (String[] args) throws Exception { + LwjglApplicationConfiguration.disableAudio = true; + LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); + config.width = 800; + config.height = 600; + config.title = "Skeleton Viewer"; + config.allowSoftwareMode = true; + new LwjglApplication(new SkeletonViewer(), config); } } From ae8637f267569cc4f7319dcee9df14955ea20b59 Mon Sep 17 00:00:00 2001 From: Fenrisul Date: Sat, 27 Sep 2014 15:56:02 -0700 Subject: [PATCH 3/4] [Unity Bugfix] SkeletonAnimationInspector interfering with outside behaviour control of animation. Left TODO for further improvement later --- .../spine-unity/Editor/SkeletonAnimationInspector.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs b/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs index b32b9ba44..1035e8df7 100644 --- a/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/SkeletonAnimationInspector.cs @@ -67,6 +67,7 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { } + //TODO: Refactor this to use GenericMenu and callbacks to avoid interfering with control by other behaviours. // Animation name. { String[] animations = new String[component.skeleton.Data.Animations.Count + 1]; @@ -85,8 +86,10 @@ public class SkeletonAnimationInspector : SkeletonRendererInspector { EditorGUILayout.EndHorizontal(); String selectedAnimationName = animationIndex == 0 ? null : animations[animationIndex]; - component.AnimationName = selectedAnimationName; - animationName.stringValue = selectedAnimationName; + if(component.AnimationName != selectedAnimationName){ + component.AnimationName = selectedAnimationName; + animationName.stringValue = selectedAnimationName; + } } From 8471e6718de8fe922542daf7089280ecc837099c Mon Sep 17 00:00:00 2001 From: NathanSweet Date: Sun, 28 Sep 2014 23:24:09 +0200 Subject: [PATCH 4/4] Getter for skeleton. --- .../3/src/spine/SkeletonRenderer.cpp | 25 ++++++++----------- spine-cocos2dx/3/src/spine/SkeletonRenderer.h | 14 +++++------ 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp b/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp index 370e84b3f..5a062086d 100644 --- a/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp +++ b/spine-cocos2dx/3/src/spine/SkeletonRenderer.cpp @@ -80,7 +80,6 @@ void SkeletonRenderer::initialize () { void SkeletonRenderer::setSkeletonData (spSkeletonData *skeletonData, bool ownsSkeletonData) { _skeleton = spSkeleton_create(skeletonData); - _rootBone = _skeleton->bones[0]; _ownsSkeletonData = ownsSkeletonData; } @@ -346,35 +345,31 @@ bool SkeletonRenderer::setAttachment (const std::string& slotName, const std::st return spSkeleton_setAttachment(_skeleton, slotName.c_str(), attachmentName.c_str()) ? true : false; } -void SkeletonRenderer::setTimeScale(float scale) -{ - _timeScale = scale; +spSkeleton* SkeletonRenderer::getSkeleton () { + return _skeleton; } -float SkeletonRenderer::getTimeScale() const -{ +void SkeletonRenderer::setTimeScale (float scale) { + _timeScale = scale; +} +float SkeletonRenderer::getTimeScale () const { return _timeScale; } -void SkeletonRenderer::setDebugSlotsEnabled(bool enabled) -{ +void SkeletonRenderer::setDebugSlotsEnabled (bool enabled) { _debugSlots = enabled; } -bool SkeletonRenderer::getDebugSlotsEnabled() const -{ +bool SkeletonRenderer::getDebugSlotsEnabled () const { return _debugSlots; } -void SkeletonRenderer::setDebugBonesEnabled(bool enabled) -{ +void SkeletonRenderer::setDebugBonesEnabled (bool enabled) { _debugBones = enabled; } -bool SkeletonRenderer::getDebugBonesEnabled() const -{ +bool SkeletonRenderer::getDebugBonesEnabled () const { return _debugBones; } - // --- CCBlendProtocol const BlendFunc& SkeletonRenderer::getBlendFunc () const { diff --git a/spine-cocos2dx/3/src/spine/SkeletonRenderer.h b/spine-cocos2dx/3/src/spine/SkeletonRenderer.h index b5043ab70..13ea00f87 100644 --- a/spine-cocos2dx/3/src/spine/SkeletonRenderer.h +++ b/spine-cocos2dx/3/src/spine/SkeletonRenderer.h @@ -50,12 +50,7 @@ public: virtual void drawSkeleton (const cocos2d::Mat4& transform, uint32_t transformFlags); virtual cocos2d::Rect getBoundingBox () const override; - // --- Convenience methods for common Skeleton_* functions. - void updateWorldTransform (); - - void setToSetupPose (); - void setBonesToSetupPose (); - void setSlotsToSetupPose (); + spSkeleton* getSkeleton(); void setTimeScale(float scale); float getTimeScale() const; @@ -66,6 +61,12 @@ public: void setDebugBonesEnabled(bool enabled); bool getDebugBonesEnabled() const; + // --- Convenience methods for common Skeleton_* functions. + void updateWorldTransform (); + + void setToSetupPose (); + void setBonesToSetupPose (); + void setSlotsToSetupPose (); /* Returns 0 if the bone was not found. */ spBone* findBone (const std::string& boneName) const; @@ -109,7 +110,6 @@ protected: float* _worldVertices; bool _premultipliedAlpha; spSkeleton* _skeleton; - spBone* _rootBone; float _timeScale; bool _debugSlots; bool _debugBones;