From cc77b7d83d76939b3fae09a03d01e7468118d036 Mon Sep 17 00:00:00 2001 From: Dave Snider Date: Thu, 11 Jun 2026 10:10:56 -0400 Subject: [PATCH 1/5] better spell effects --- .../components/AnnotationsControls.svelte | 3 +- .../(app)/[party]/play/usePlayTools.svelte.ts | 4 +- .../DrawingSliders/DrawingSliders.svelte | 9 +- .../RadialMenu/EffectPreviewScene.svelte | 2 + .../Stage/components/AnnotationLayer/types.ts | 10 +- .../Stage/shaders/AnnotationEffects.frag | 186 ++++++++++++++++-- 6 files changed, 194 insertions(+), 20 deletions(-) diff --git a/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte b/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte index ae8c4576..4e7ef4df 100644 --- a/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte +++ b/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte @@ -26,7 +26,8 @@ { text: 'Ice', value: AnnotationEffect.Ice }, { text: 'Magic', value: AnnotationEffect.Magic }, { text: 'Grease', value: AnnotationEffect.Grease }, - { text: 'Space Tear', value: AnnotationEffect.SpaceTear } + { text: 'Space Tear', value: AnnotationEffect.SpaceTear }, + { text: 'Web', value: AnnotationEffect.Web } ]; function getLayerEffectType(layer: AnnotationLayerData): AnnotationEffect { diff --git a/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts b/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts index 953cb45a..b930ba3d 100644 --- a/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts +++ b/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts @@ -36,7 +36,6 @@ const DRAW_COLORS: Record = { 'draw-green': '#6bcf7f', 'draw-blue': '#2e86ab', 'draw-purple': '#b197fc', - 'draw-pink': '#f06595', 'draw-turquoise': '#20c997' }; @@ -46,7 +45,8 @@ const DRAW_EFFECTS: Record = { 'effect-ice': AnnotationEffect.Ice, 'effect-magic': AnnotationEffect.Magic, 'effect-grease': AnnotationEffect.Grease, - 'effect-spacetear': AnnotationEffect.SpaceTear + 'effect-spacetear': AnnotationEffect.SpaceTear, + 'effect-web': AnnotationEffect.Web }; const PLAYFIELD_FOG_BRUSH_SIZE = 7.0; diff --git a/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte b/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte index 7e33cbfc..c1b534cd 100644 --- a/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte +++ b/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte @@ -16,7 +16,7 @@ import { AnnotationEffect } from '../Stage/components/AnnotationLayer/types'; import EffectPreview from '../RadialMenu/EffectPreview.svelte'; - // Color palette - 10 colors + // Color palette - 9 colors (pink gave up its slot to the web effect) const COLORS = [ '#d73e2e', // red '#ffa500', // orange @@ -24,7 +24,6 @@ '#6bcf7f', // green '#2e86ab', // blue '#b197fc', // purple - '#f06595', // pink '#20c997', // turquoise '#ffffff', // white '#2a2a2a' // dark @@ -37,7 +36,8 @@ AnnotationEffect.Ice, AnnotationEffect.Magic, AnnotationEffect.Grease, - AnnotationEffect.SpaceTear + AnnotationEffect.SpaceTear, + AnnotationEffect.Web ]; // Effect colors for the opacity slider gradient @@ -48,7 +48,8 @@ [AnnotationEffect.Ice]: '#b3d9ff', [AnnotationEffect.Magic]: '#9333ea', [AnnotationEffect.Grease]: '#4d3319', - [AnnotationEffect.SpaceTear]: '#330066' + [AnnotationEffect.SpaceTear]: '#330066', + [AnnotationEffect.Web]: '#e6e8eb' }; interface Props { diff --git a/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte b/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte index b48d539b..ffb39486 100644 --- a/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte +++ b/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte @@ -112,6 +112,8 @@ return new THREE.Vector3(0.3, 0.2, 0.1); case AnnotationEffect.SpaceTear: return new THREE.Vector3(0.2, 0.0, 0.4); + case AnnotationEffect.Web: + return new THREE.Vector3(0.9, 0.91, 0.93); default: return new THREE.Vector3(1.0, 1.0, 1.0); } diff --git a/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts b/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts index c079d450..c46331be 100644 --- a/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts +++ b/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts @@ -10,7 +10,8 @@ export enum AnnotationEffect { Water = 3, Magic = 4, Grease = 5, - Ice = 6 + Ice = 6, + Web = 7 } /** @@ -186,6 +187,13 @@ export const AnnotationEffectDefaults: Record maxRadius) return 0.0; + float a = atan(toCenter.y, toCenter.x); + + // Spokes: thin radial lines at evenly quantized angles + float spokeCount = 8.0 + floor(cellRand * 5.0); + float spokePhase = fract(a / 6.28318 * spokeCount + cellRand * 7.0); + float spokeArc = abs(spokePhase - 0.5) / spokeCount * 6.28318 * d; + float spokes = 1.0 - smoothstep(0.0, 0.018, spokeArc); + + // Rings: concentric threads strung between the spokes + float ringFreq = 7.0 / maxRadius; + float ringPhase = fract(d * ringFreq + cellRand * 3.0); + float ringDist = abs(ringPhase - 0.5) / ringFreq; + float rings = 1.0 - smoothstep(0.0, 0.014, ringDist); + rings *= step(maxRadius * 0.08, d); // No rings on top of the hub + + // Dense hub where the spokes meet + float hub = 1.0 - smoothstep(0.0, maxRadius * 0.05, d); + + // Each web fades toward its outer rim + float falloff = 1.0 - smoothstep(maxRadius * 0.5, maxRadius, d); + return max(max(spokes, rings * 0.85), hub) * falloff; +} + +// Web effect - wispy spider webs, dense in the center thinning to stray strands +vec4 webEffect(vec2 uv, vec2 texSize, float time) { + float mask = getVolumeMask(uv, texSize, time, 1.5, 0.08, 0.3); + if(mask < 0.001) return vec4(0.0); + + vec2 basePos = uv * texSize * 0.004; + + // Gentle sway, like a draft moving through the strands + vec2 sway = vec2( + snoise(basePos * 0.3 + time * 0.05), + snoise(basePos * 0.3 + vec2(40.0, 40.0) + time * 0.04) + ) * 0.05; + vec2 pos = basePos + sway; + + // === DENSITY GRADIENT - thick in the center, wispy at the edges === + float maskHigh = textureLod(uMaskTexture, uv, 0.0).a; + float maskMid = textureLod(uMaskTexture, uv, 3.0).a; + float maskLow = textureLod(uMaskTexture, uv, 5.0).a; + float edgeProximity = 1.0 - min(maskHigh, min(maskMid, maskLow)); + + // Border controls how far the sparse fringe reaches into the center + float fringeSpread = uBorder * 0.8 + 0.2; + float fringe = smoothstep(0.0, fringeSpread, edgeProximity); // 0 center, 1 edge + // Break up the density falloff so the fringe isn't a clean ring + fringe = clamp(fringe + snoise(pos * 1.5 + 60.0) * 0.2, 0.0, 1.0); + + // === STRAND LAYERS - geometric: straight segments, spokes, and rings === + // Tiny wobble so strands aren't laser-straight, while staying geometric. + // Scaled up 1.75x so webs stay small relative to typical drawn shapes (~a few grid squares) + vec2 strandPos = (pos + vec2(snoise(pos * 2.0), snoise(pos * 2.0 + 50.0)) * 0.02) * 1.75; + + // Orb webs scattered across the shape: spokes + concentric rings + float orb = 0.0; + float orbCell = 1.8; + vec2 orbGrid = strandPos / orbCell; + vec2 orbId = floor(orbGrid); + vec2 orbUv = fract(orbGrid); + for(int x = -1; x <= 1; x++) { + for(int y = -1; y <= 1; y++) { + vec2 nb = vec2(float(x), float(y)); + vec2 ctr = nb + hash2(orbId + nb + 7.0) * 0.6 + 0.2; + float rnd = hash(orbId + nb + 13.0); + vec2 toC = (orbUv - ctr) * orbCell; + orb = max(orb, orbWebStrands(toC, rnd, 1.15)); + } + } + + // Connective cobweb mesh: straight strands strung between anchor points + float mesh1 = 1.0 - smoothstep(0.0, 0.035, webMesh(strandPos * 1.2, 0.0)); + float mesh2 = 1.0 - smoothstep(0.0, 0.05, webMesh(strandPos * 2.4, 100.0)); + + // Finer structure dies out toward the edges; orb webs and main strands persist + float web = 0.0; + web = max(web, orb * (1.0 - fringe * 0.5)); + web = max(web, mesh1 * 0.75 * (1.0 - fringe * 0.85)); + web = max(web, mesh2 * 0.5 * (1.0 - smoothstep(0.0, 0.55, fringe))); + web *= clamp(uIntensity, 0.0, 1.5); + + // === HAZE - faint matted sheet between strands, center only === + float haze = fbm3(pos * 1.4 + 200.0) * 0.5 + 0.5; + float hazeAlpha = haze * (1.0 - fringe * 0.9) * 0.3; + + // Subtle shimmer where light catches a strand + float shimmer = pow(snoise(pos * 6.0 + time * 0.08) * 0.5 + 0.5, 4.0) * web * 0.3; + + // === COLORS - white/grey gossamer === + vec3 strandColor = vec3(0.92, 0.93, 0.95); + vec3 hazeColor = vec3(0.78, 0.8, 0.83); + + vec3 color = mix(hazeColor, strandColor, clamp(web * 1.2, 0.0, 1.0)); + color += vec3(1.0) * shimmer; + + // Strands stay readable, haze is faint, gaps show the map through + float strandAlpha = web * (0.5 + (1.0 - fringe) * 0.3); + float bodyAlpha = clamp(hazeAlpha + strandAlpha, 0.0, 0.85); + + float alpha = mask * uOpacity * bodyAlpha; + + return vec4(color, alpha); +} + void main() { // Clipping planes vec4 plane; @@ -1041,6 +1201,8 @@ void main() { result = greaseEffect(vUv, texSize, time); } else if(uEffectType == 6) { result = iceEffect(vUv, texSize, time); + } else if(uEffectType == 7) { + result = webEffect(vUv, texSize, time); } else { // No effect - solid color float mask = texture2D(uMaskTexture, vUv).a; @@ -1048,10 +1210,10 @@ void main() { result = vec4(uBaseColor, mask * uOpacity); } - // Blend outer shadow under the effect (skip for no effect, water, grease, ice - they handle their own depth or don't need it) + // Blend outer shadow under the effect (skip for no effect, water, grease, ice - they paint their own depth inside the mask) // Shadow is dark, high opacity near edge for color burn effect vec3 shadowColor = vec3(0.0, 0.0, 0.0); - float shadowAlpha = (uEffectType == 0 || uEffectType == 3 || uEffectType == 5 || uEffectType == 6) ? 0.0 : shadowIntensity * 0.85; // No shadow for plain color/water/grease/ice + float shadowAlpha = (uEffectType == 0 || uEffectType == 3 || uEffectType == 5 || uEffectType == 6 || uEffectType == 7) ? 0.0 : shadowIntensity * 0.85; // No shadow for plain color/water/grease/ice/web // If we have shadow but no effect, show just the shadow if(result.a < 0.001 && shadowAlpha > 0.001) { From 857385c95a71a1c6a57710475416e648dd513dff Mon Sep 17 00:00:00 2001 From: Dave Snider Date: Thu, 11 Jun 2026 11:31:41 -0400 Subject: [PATCH 2/5] Add more weather effects --- .../components/AnnotationsControls.svelte | 3 +- .../stage/components/WeatherControls.svelte | 21 ++ .../GameSession/WeatherControls.svelte | 42 +++- .../(app)/[party]/play/usePlayTools.svelte.ts | 6 +- packages/stage/CHANGELOG.md | 85 ++++++++ .../DrawingSliders/DrawingSliders.svelte | 9 +- .../RadialMenu/EffectPreviewScene.svelte | 2 + .../Stage/components/AnnotationLayer/types.ts | 10 +- .../particles/atlases/fireflies.png | Bin 0 -> 117447 bytes .../Stage/components/ParticleSystem/types.ts | 10 +- .../WeatherLayer/WeatherLayer.svelte | 23 ++ .../WeatherLayer/presets/BlizzardPreset.ts | 73 +++++++ .../WeatherLayer/presets/DustStormPreset.ts | 129 +++++++++++ .../WeatherLayer/presets/EmbersPreset.ts | 73 +++++++ .../WeatherLayer/presets/FirefliesPreset.ts | 73 +++++++ .../components/WeatherLayer/presets/index.ts | 15 +- .../Stage/components/WeatherLayer/types.ts | 9 + .../stage/src/lib/components/Stage/index.ts | 11 +- .../Stage/shaders/AnnotationEffects.frag | 204 +++++++++++++++++- .../src/lib/components/Select/Select.svelte | 1 + 20 files changed, 782 insertions(+), 17 deletions(-) create mode 100644 packages/stage/CHANGELOG.md create mode 100644 packages/stage/src/lib/components/Stage/components/ParticleSystem/particles/atlases/fireflies.png create mode 100644 packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/BlizzardPreset.ts create mode 100644 packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/DustStormPreset.ts create mode 100644 packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/EmbersPreset.ts create mode 100644 packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/FirefliesPreset.ts diff --git a/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte b/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte index 4e7ef4df..69acfaff 100644 --- a/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte +++ b/apps/docs/src/routes/(components)/stage/components/AnnotationsControls.svelte @@ -27,7 +27,8 @@ { text: 'Magic', value: AnnotationEffect.Magic }, { text: 'Grease', value: AnnotationEffect.Grease }, { text: 'Space Tear', value: AnnotationEffect.SpaceTear }, - { text: 'Web', value: AnnotationEffect.Web } + { text: 'Web', value: AnnotationEffect.Web }, + { text: 'Entangle', value: AnnotationEffect.Entangle } ]; function getLayerEffectType(layer: AnnotationLayerData): AnnotationEffect { diff --git a/apps/docs/src/routes/(components)/stage/components/WeatherControls.svelte b/apps/docs/src/routes/(components)/stage/components/WeatherControls.svelte index dda4fd4f..a593860a 100644 --- a/apps/docs/src/routes/(components)/stage/components/WeatherControls.svelte +++ b/apps/docs/src/routes/(components)/stage/components/WeatherControls.svelte @@ -7,6 +7,10 @@ RainPreset, LeavesPreset, AshPreset, + DustStormPreset, + EmbersPreset, + BlizzardPreset, + FirefliesPreset, type StageProps } from '@tableslayer/stage'; import { KernelSize } from 'postprocessing'; @@ -19,11 +23,16 @@ Snow: WeatherType.Snow, Leaves: WeatherType.Leaves, Ash: WeatherType.Ash, + 'Dust storm': WeatherType.DustStorm, + Embers: WeatherType.Embers, + Blizzard: WeatherType.Blizzard, + Fireflies: WeatherType.Fireflies, Custom: WeatherType.Custom }; const particleTypeOptions: ListOptions = { Ash: ParticleType.Ash, + Fireflies: ParticleType.Fireflies, Leaves: ParticleType.Leaves, Rain: ParticleType.Rain, Snow: ParticleType.Snow @@ -51,6 +60,18 @@ case WeatherType.Ash: preset = { ...AshPreset }; break; + case WeatherType.DustStorm: + preset = { ...DustStormPreset }; + break; + case WeatherType.Embers: + preset = { ...EmbersPreset }; + break; + case WeatherType.Blizzard: + preset = { ...BlizzardPreset }; + break; + case WeatherType.Fireflies: + preset = { ...FirefliesPreset }; + break; default: preset = { ...RainPreset }; } diff --git a/apps/web/src/lib/components/GameSession/WeatherControls.svelte b/apps/web/src/lib/components/GameSession/WeatherControls.svelte index 2a09212f..8871f92b 100644 --- a/apps/web/src/lib/components/GameSession/WeatherControls.svelte +++ b/apps/web/src/lib/components/GameSession/WeatherControls.svelte @@ -11,7 +11,18 @@ RadioButton, Label } from '@tableslayer/ui'; - import { type StageProps } from '@tableslayer/stage'; + import { + WeatherType, + RainPreset, + SnowPreset, + LeavesPreset, + AshPreset, + DustStormPreset, + EmbersPreset, + BlizzardPreset, + FirefliesPreset, + type StageProps + } from '@tableslayer/stage'; import { to8CharHex, queuePropertyUpdate, trackChecklistItem } from '$lib/utils'; import chroma from 'chroma-js'; @@ -27,11 +38,30 @@ const selectedWeather = $state(stageProps.weather.type.toString()); + // Each weather type looks right at its own field of view and intensity + const weatherPresets: Record = { + [WeatherType.Rain]: RainPreset, + [WeatherType.Snow]: SnowPreset, + [WeatherType.Leaves]: LeavesPreset, + [WeatherType.Ash]: AshPreset, + [WeatherType.DustStorm]: DustStormPreset, + [WeatherType.Embers]: EmbersPreset, + [WeatherType.Blizzard]: BlizzardPreset, + [WeatherType.Fireflies]: FirefliesPreset + }; + // Weather toggle const handleWeatherTypeChange = (weatherType: string) => { - queuePropertyUpdate(stageProps, ['weather', 'type'], Number(weatherType), 'control'); + const type = Number(weatherType); + queuePropertyUpdate(stageProps, ['weather', 'type'], type, 'control'); + // Reset to the preset's tuned FOV and intensity; the sliders then adjust per type from there + const preset = weatherPresets[type]; + if (preset) { + queuePropertyUpdate(stageProps, ['weather', 'fov'], preset.fov, 'control'); + queuePropertyUpdate(stageProps, ['weather', 'intensity'], preset.intensity, 'control'); + } // Track checklist completion for changing weather (only if setting to non-none weather) - if (Number(weatherType) > 0) { + if (type > 0) { trackChecklistItem('weather'); } }; @@ -41,7 +71,11 @@ { label: 'Rain', value: '1' }, { label: 'Snow', value: '2' }, { label: 'Leaves', value: '3' }, - { label: 'Embers', value: '4' } + { label: 'Ash', value: '4' }, + { label: 'Dust storm', value: '5' }, + { label: 'Embers', value: '6' }, + { label: 'Blizzard', value: '7' }, + { label: 'Fireflies', value: '8' } ]; const handleFogColorUpdate = (cd: ColorUpdatePayload) => { diff --git a/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts b/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts index b930ba3d..d7a85709 100644 --- a/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts +++ b/apps/web/src/routes/(app)/[party]/play/usePlayTools.svelte.ts @@ -35,8 +35,7 @@ const DRAW_COLORS: Record = { 'draw-yellow': '#ffd93d', 'draw-green': '#6bcf7f', 'draw-blue': '#2e86ab', - 'draw-purple': '#b197fc', - 'draw-turquoise': '#20c997' + 'draw-purple': '#b197fc' }; const DRAW_EFFECTS: Record = { @@ -46,7 +45,8 @@ const DRAW_EFFECTS: Record = { 'effect-magic': AnnotationEffect.Magic, 'effect-grease': AnnotationEffect.Grease, 'effect-spacetear': AnnotationEffect.SpaceTear, - 'effect-web': AnnotationEffect.Web + 'effect-web': AnnotationEffect.Web, + 'effect-entangle': AnnotationEffect.Entangle }; const PLAYFIELD_FOG_BRUSH_SIZE = 7.0; diff --git a/packages/stage/CHANGELOG.md b/packages/stage/CHANGELOG.md new file mode 100644 index 00000000..e6fae29d --- /dev/null +++ b/packages/stage/CHANGELOG.md @@ -0,0 +1,85 @@ +# @tableslayer/stage + +## 0.0.20 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.24 + +## 0.0.19 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.23 + +## 0.0.18 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.22 + +## 0.0.17 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.21 + +## 0.0.16 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.20 + +## 0.0.15 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.19 + +## 0.0.14 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.18 + +## 0.0.13 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.17 + +## 0.0.12 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.16 + +## 0.0.11 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.15 + +## 0.0.10 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.14 + +## 0.0.9 + +### Patch Changes + +- Updated dependencies []: + - @tableslayer/ui@0.1.13 diff --git a/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte b/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte index c1b534cd..2253403d 100644 --- a/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte +++ b/packages/stage/src/lib/components/DrawingSliders/DrawingSliders.svelte @@ -16,7 +16,7 @@ import { AnnotationEffect } from '../Stage/components/AnnotationLayer/types'; import EffectPreview from '../RadialMenu/EffectPreview.svelte'; - // Color palette - 9 colors (pink gave up its slot to the web effect) + // Color palette - 8 colors (pink and turquoise gave up their slots to effects) const COLORS = [ '#d73e2e', // red '#ffa500', // orange @@ -24,7 +24,6 @@ '#6bcf7f', // green '#2e86ab', // blue '#b197fc', // purple - '#20c997', // turquoise '#ffffff', // white '#2a2a2a' // dark ]; @@ -37,7 +36,8 @@ AnnotationEffect.Magic, AnnotationEffect.Grease, AnnotationEffect.SpaceTear, - AnnotationEffect.Web + AnnotationEffect.Web, + AnnotationEffect.Entangle ]; // Effect colors for the opacity slider gradient @@ -49,7 +49,8 @@ [AnnotationEffect.Magic]: '#9333ea', [AnnotationEffect.Grease]: '#4d3319', [AnnotationEffect.SpaceTear]: '#330066', - [AnnotationEffect.Web]: '#e6e8eb' + [AnnotationEffect.Web]: '#e6e8eb', + [AnnotationEffect.Entangle]: '#3a7d2c' }; interface Props { diff --git a/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte b/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte index ffb39486..8fba3f8b 100644 --- a/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte +++ b/packages/stage/src/lib/components/RadialMenu/EffectPreviewScene.svelte @@ -114,6 +114,8 @@ return new THREE.Vector3(0.2, 0.0, 0.4); case AnnotationEffect.Web: return new THREE.Vector3(0.9, 0.91, 0.93); + case AnnotationEffect.Entangle: + return new THREE.Vector3(0.18, 0.42, 0.12); default: return new THREE.Vector3(1.0, 1.0, 1.0); } diff --git a/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts b/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts index c46331be..79aa0e7b 100644 --- a/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts +++ b/packages/stage/src/lib/components/Stage/components/AnnotationLayer/types.ts @@ -11,7 +11,8 @@ export enum AnnotationEffect { Magic = 4, Grease = 5, Ice = 6, - Web = 7 + Web = 7, + Entangle = 8 } /** @@ -194,6 +195,13 @@ export const AnnotationEffectDefaults: RecordP0|a%YZ=qn(5C$f;`Rv+ z^uaQC-k)ZzpHqA}0(sTvbT|Hk0D`txpjqpB{JK)l;rhA!DXh#``%F!1rKYxK$^U(U zqSu(~66Gtj3s+u1<~`a-m>Q?!xY&=e&U)o%cE_jBKn9QAnPYl`D47AZM{n~0=Nt!?0f*|Xh z329@*irVh=zyXdXgPTnfv*|7oqu1PFSN&Xih@U(bAC$Bly-?@$b~<1FvDNu4A9da| zz~Kv98TO@E>GNX%^}gKn&1~Y|kF<1Nj@^;c1*ap$;jJ$9!~>5-_Ar$%zgzn%keF90 z_j^Z|##{z7ZQ+9Ej^bJy zY5(D1oUb~#N|6vOaptB%Fjt|g+pd}+ z`yD{muR_?>#y}VgO*Ia)swo;A2wmD z_?-(WV)m)m;7`@Z4Wq3rV7rX|3RSb)sGMaN5ZD}BmO`}XLD-cd`n$G%=b>%VlD#y_|O;j3hPk|oI&nEE{ zf`)ut&y0$E}mtM`KzNY0c96m%z|J&69? zV*ko|7+UV*8T)Qs8d|XqDA~L!2fCIl>pZHOX1KH&Q^nsQpNP#pU`EAREj<$mGyhA} zc<0TApkUqkbc}BxS^mgII$Zjl^aU1i%x2)F0|GO@DHzE1*-6U8fa2v;R~nMX|&gEK6Y3w3}N89~`HkoEx%>Y({tIh_%(K;+8|9?iVt(F7B~6# z&y(0l%Hh1gz`uQ^hX|EsB2Dzqz?wsn|r-~E0#t-b-X^SnMHye`>h6P5L9pg1t-%@w-oXeAE> z+&8#*aYZ>tlW6{H))f)7ltDpT(Np!xBnK${GB?c9uWeu>`_SirZxf`san2JAYmQ*i ztCnRNdG_d(L67rlaJ5fm{RuWzy}h2*=7CKUXtc|?g4>M8`6r|HxJ7?s?k2LxLTWMr zTYnNZXA>umM;Pj;eUwEphW3+eil1v;TwFMjxpGjW;x8H&rZPi41{fZ^D)&;t#as^m zneWMJ!K%oJl)IeNd_kn11IEPCSqUHQ*2S}({FdZOf1T4MXVXX0Tn*Lp$Hvj@|I&Ur zz5cikY8l~r65*H562hPPEurxZo6qzL$AU+TA4d7;z;i3xLZ-BvM{_5yAa9kAs6 zo!ODG$(Bvo(jp6sSsjm*jmqMK?b@xB2k)g$R61$)5$}X{oG9*-Sv$$MCAIldpwX$M zY1u9_2m9<-e@{Rpi!i(o~DlWiSTAV3UCQA$g z$eauOJPP*ya@xuhwYcj&{*B-CB|vX`D=-GvA6EOp`ww`7Bp`qERYoUf?4oQ3`ejHPQQvvu0Br-%SE+QpQ_Z4-VG^*Hp}Mrb#mwn;v^(# zBCCYk-9gi&1F#+Q+Qw?`{gDv*h>Oye?~24P`E{dZhkTUKq~Xh!X}y!V>22j~no1$< z#n~s_CADi$R_Fn%Hjh&IAM2EUS;@Jv4HM_4Dk# z=ysts*|pf?Kz|3OnmH^8wS=0?*N zUExasH~{U?s_@W7ho||Glmc!%IfSR(dpQ$EM=Ey=(&OhgQ^_zcANUW@{OM)i5 zDOnNgv-s`udfzJlPfXc*^NLbtsFOPrv$;sI_KX0=lw7Jo`SGejP4-(ocNMJO0g8{fuxuk zv#?6Ss#K@m*Rp!EOzKTyz?z7W_=rt$;-8CbC5DGnHk|S)D);e5tG^O858H6|mP6^& zAC3ZM?q8*E(QNRnw13`1`Bkets3jP&AsHVcNOfbA*|W899*G4+cK8t zP6c?CZT^XOL*BpXfOK5P0h>e+b_}w(5-@SkwNw_vq2M3P(Zrq7cE@9HK{wpomSl;f zAqNpAhYFG`x9R(eN#fK5@j*TC38OY=gCt~#q@1DclT$SV3sh(B(L)6q^(w9e-AMXs zoF3C}XGC!39Wq|3aE^svCR^+@l7x4wUF<>35xrF^Uwn$cCpd{;OdfQ-u(PE-wPJsh zJ{Pf8Um2LT*f} zw`_oaxS=<)vBm?gkTlB+vpJ;7o&;UzWpwhsCdy6<0@3WOcQKx z>z~zcSN@IG7Z~ZvLZ8jWPLOl{S(*v&@2YNXLs5HQ@!k8m*?&ieTMc{y^?dBsBSU+= zoqyZWm``x+LSl)-SC?2b)#ef|MI$;cq8_I_Ps&OOyqw3Npj>Gm`LS9yJa$ALb;S-< zwUT+5{zcLfb!QVgm}k~PG9n_rGzUBv#dbRNa$Vd9l>|$EX?${KA){?MXr}mwB9o}k zvtuc6>i$9eAf-2wV&R9$j0c_}-I|V_#W}m&4}8HBTpdK3=1;O@`4uW2X}3M{ zs-LKj_a4v^wJk57`v?5HN~kYcmc_Z`Q+9Nijfho_fBUkV`7NueyY2_IEy-lOkn2#O z)tm)LhZ%A~QOc0d6HES48sOKX7FR!hul=u9Wr8V;R;pWM;ZG}iRj)H3(rDhme8r;d z41A1lk2$nGWErj$0-)5Q7d)u|HZgx5|N7-_OP#kRF4@*14LYkr)1GlNB$#q&etF|# zkH^+|`?dGwt@T+wAZJ8`@UEP7ctI9cWP%di~b_g6mNM-_Ci(vR2>di0ikHGe78ROAX?Umcxg zCTiOnS1A>rIu%Su(njqy9n3YTyi-VQ{;G5@t#y6ACCWuUyOg*a;bfus>b?~`y~T`T=wFlTya726z}&CRJDYK=>qc(kJuS}eRf61QE*XyZ5NER z;$Z0Sanz`g1VvAnF?7yQPtA!60w$m7Kr}YG+TM1wS{Iv6+r0f1S#Fz*1^T1-#|&~- z_0SVq@+|+3%;~T$HwvE_p~Mt_Gv#~aZ;P#&aP0}CX{E8vzhciN@OmW-UUWr*Tciiu z*H4~$i>G4Kni?PZ#C-)*I`l*PpWw-d?Rb@G0^yI|XytGL!B@0165dNNVk&*iD zZ0ZrsY6EI-ra(hL%g_qUb@o9gcc=gf>u0SCei7dvAa^8jbd0e-NZEYEPro92#5xRf zCWR{)Sxwls%kwFWv%3o|a~>ASo>*O(p45#E?cAd4v&vV3)xHw= zF1-GbFCx{Nw!z5TkGBVQ()wHdshk~rvS^O^)BU=l`i|0oHYc#{qE+{Ujb8cHN-(mZ zUspbz-|;a}XS*Tc?Sw@IFV#hn|Bp)r0m|fRC-6?KhlF zGYoZRrWTB6+>^mUe|i8>5C6D)g)|oWsoHR^&LxKY&h0j&<&yi$1HB2aa11`#Ww5yhs=Rv+`9wipce)!{hpCeKa;{deE;+ zafPjVpfMZZCU9}C<^@g0W{sD59J&fl(`}^BnyE_TnAW}!8up^PBaS=VHxDWTF@AeQ zN7Kyg``X`ZeeZv|JY7{NlWZz4b?QO9y?o0%k&Z9TR2GoqQ<&?z5Z~jv60n?; zTxgO0gY>}inEQc7?i-Z-o<5*e>K-sQU*Um-uGbvaknU>7o@958J`T-Pl40UJyvzN0 z$&$+|QB=dTh*gJDRK1@)Cb4%{)%1>zL7r4WZ9HSrZo~Ea&QiIQ^Kgw1XSM^vFXcJVq+z>e z`kF#)e|u&P(OcX5TeD|Pb8~vo!v0`;jadscP;7C%%zncLHIeyU9n_0kN#O<=4zsaBt9dn5`0A~(--4ArczNwc0K>VK6~Z%|}K%UY~#V$iXD{&S}xF);i{s!NYX*638LRAJL(IZCXy9PG&9Q*T!I@`{4 z(QCNJ*G^7+L)uH1H;43&5DzQCT{O6vonGEZ%iSzn@}Vm5re0Rq6NZ5R?I*o4Eg2Ue zx0r`}BF4H%3pw#CSBu9vYcsCmydENs0Ct>8mBT?<%7Zf7RowU+<|I$8XH^ZWoR?Z6 zUd+|Egl*=4O{*t{82GpRSPN_?qd|f1&H|_CRs%oh;Y+SxpP>0=6O`M`)#ER5hh`?IcnOM5WR2@K;p%o#xGCi{^1 zt#l3j^WlBKeJb`_tQ5+r-rudj$$?ZpsXQx|ZGY6+J%T4X>!%s>JQ5nh;kzc)6zid< zb04?^Y+v4lol#!4wm=839>7TNXXBUI^)%P{Hz-hQ``M(nDp?_$=!2dAc}qH-YZX1l?% zh_&SGvJXDGGVo~{u8n<970U>uFi>fCH3)z2A{wr#oDjKT6qA2H{>9ug7ZfE zxzW3D?xaUM&Oy=EAAuA4fcVrsMn1523U2oqTmGEy&(}zscdx?JE_I&Z%-IYEqnkNaW@NCam+X9g~uEC8E zsM&qV1liw5#&rDlx~qWEOq!RB&=?GoypQ!4PkHyN_U`>aJ;FrD*9r6S&3T{H(@&bi z)D>3zqDF71x?VG}WIJEf3qhs_DU)~HA-_sQg?WN*t~_%A{NtpT?okKROYP0Wu}9xE;mpxIuH+2Pk@&a;B0RMbvl@c;M_1qUGnnBraM_A*-|f$Bc5)I zDkg>ca(~{FXl*f~0Xrm6_hGMcS0nZ?L7VW}FS~9%-xG0Z#4G_` zDHQI)nzIf$KDz&K@Fnn1YvT6dYk7b& z_-fPcc(ps>hTLNYQRvCkq2pU$^bBQ2U!!?swzFUnR#S`qiG3@L5Sh;74G;Q&`jWphROp&Dfv}8`!I2=erhQKf z`z|y46~l%EAnlxjlIA46)-LtbFw(HN0D8kmvEvc@FuUb4h1Qa748V!a-aLEf?VWpl zUnL5TsHL9z>tbaIPp8GeJ{)cD4l4@9r`H_3v~=VHD+&4uafJzE2(S1N>oe&MPc%s_ zT6HrQskM1gpta^uMWl1=WtnaW)nK+62X1L8ZV4ZKPGY?$Y8Utj{JnUwKjP7h$<>f= z$zY%zC-FTc1xL87J|}tSP4WT#-z5I*^mM_wlYFzL=UJ=Xbi3)*Z!#z(zw=y z8&5tsJc4-y>2J7&`&>zQD>-T#Rx5J@K0qrXCm=}ra8=`4zQoGTkZI|khmGVU+3Z;A zAesGu7K$yf!jWJ8$7M;5sOhka%9!OKDie>u5@GB5+GxK)#|Inb(Y+=s_e`EnM8}O% zZYXF-@2`FiH!3H%h5&LVtY6#-8u5}NeXg7m2_H#{G~aVcn$C<4@u29r)0+bVzvQli z*Xc!@Wq(%BaxuktXilTC*@x8+23$J2Y74`M48yXWE`m1FbErR0Klw9|FFogaqP=6g zYb!t)4J#O?NcLZX0?#8+3&qUzutkTyTzr{~S8jg83B!f|uZMiPg$kJ6X9;t~zn&%U zpBmR0XI;82s%5gd2D^IpqtJe!7otyH zN5_@q*5!NHawzPZpF_d~varPs752HW^@GkdTx@GMqJ8dCn9LLRE{ zc%%8&8-?}FT$cmiOx|%lYFo0v7Bo4al8JcI`KvC2<|THB*lT~6{AtStPaU9g2THc| zf*g&m&-uidijg717)6z|LtHs%DkTZN$!LYO1S_&giH+pgIhus2za*Wslbo_OIIWaO zgNWqC6rHb44B-gAj;7`IOLb~qx^T*&gQtcAdWbgzEFaUzNqk^>1grVbTTnzCqwhLl zx>f>FI)-pSFGhr( zA7}|I6sf2mh1mM0@>xQo@2pUqaSp|*q{JSG~`<)(- z$E020pGw!F@hWw(jD#5}flD{X3>QFjW*so!g=(N3>{?0Y8FDG6vlWI5EZ7XZC<0JO z5KZ6M*5;0Ah$Rn>f>-?vb2;$4qR+kl6bAoR6?JkaSGaWxG4ZK0yt9|B@f9(Enr2xb z$c2(Y;dK$UB<@}=mHz&&V5Cc783ZC6N^@Ma3^X{~O|(Gr;VNR1VAji*dNt?iMnds! z!>E3?pIeVdzJl+P*K{}!G$k2cq#RAQxcjHh*+jtzeQ;^Y?&F(92c0_b@xzcw+YYC} zZoki=e4wPu`nbbnwEBF}jr1WB->1~m@XMR3gb!dOHwH0z&f``pX#S`PAgV}`=l6~g ziPca`cudmg3c7We+PTItmXY)DbJeXIN+rmN1W!CK&YzE(g7J163#GA-Gwt;+KmJWE z$HW0kRmpUBK3DarHGb~2;)WEW`xP|K!~V|={!h%`B#$lKvAhUj1zaQk{AfRSu8_Jh zAIa!oy*^(;Nj>s)|IMn63L!Io|4n}gGitjjd|-F9*vlAp9AL8%=lQPCY)4!DcR=c9 zoxS8hv1;Ss`$&6Ou`8GAu&67Iv<=D445qG`Q2RWt#dDi<6k%JNSz)!9WNWdD3cH#EQ;u;n)D1tO53P zyx{4I4RZ|#?%KAWO`n1t?h6oUzzOWwkZ04A z!*z^ksziTT{1}rye%R>VADzc1PX(8fQIP6|N1MANXob0IvHI}6*)87jiA<>LKyTfk z{{EKF&vV{cwW9Q|Qto*ryW29*eY^Fti6x`RU&VzYM#xE=<_B>{tu;Bk`4R9PdQ+K8 za7!!bc4kdN@4N~Ckj$=85|BDJ%B?XdV)U6i% zA@c_{`=lO~c#24&7Nmm=5EPp+=W@lmzC8^i0@mJ~z1q_g+skW>iCxDx&&V8+C#ggW zVXgC~vAs`VVckwR)!RUX+`o`yW2HSwVF2t>k^>z>BAa~_wbA!o3@9OAa4d_7&0{}G z7ZkSX2SVI0(r@$+1}IbuvFjBe4Mao+bfr%c_t-z7C`RKYC}U~Kn%QZ8obxX73$lHt zB4eafr!G#Vtc}WORkD%2#U8C9cA#K$MdL7&2oQqg(O+bYyPmEDO5QC}$vYSRmmEB2 zczNN3msBSP%-OXiV!U4apYS3!Pv&Wf0hFsA&!&a?&l{?CYB>n}90W`)r3$dEf-k`* z=yh+{#S3a*LEA@@)_aN3ygaL14=ASnRD2QE>X8NW8XC`NIob2|FRbvx14;D1y6eyU zoU;#}zkOnZ8)&h&eHsysy1FsAp*1zm>$S=25eroT&hEV&yrE_4sO1VFeSBtM2Fd{? zXorX;RKi~~xkui;t)YI+2Ro1&DUSKk4M>a^bVO-0i-D(Zh-Dq}x;u2vWx;3#K-~>Y zq)beLOk7v43Z+avj`*Ul>bF50gl$OgzfkQL1?jJtx(aKRvAjPp z2!Wx4cUfUw7VGho3lih522UT2!#hgk@SxpsGIHqN4G7$rTHOK9_i4 zzCfyk-n=f$-mB6hezi{Br}C|k-0s7Uot@PK)gKUiTW8_@4nZf-t8X&aM~~VL#CNZM z`n~3TW)s9z;&VqvjPYs8Npvwfu`^R3o`!>ge@ZR3cmmbVC{n^BgdRiwp6h&U zyW)pbdRhlCkBUvj4%fJS5$<#pXF1D=va>FSf86H$vT9tTM`XjCQ^XM2RDtV^b{z_o zNHDC}0g;xYNVJvhPiO2lPdQ}yHb!LZuC3a+^*ZP9drMW^Y9}{ayl%@)JcWn=VC3*E zxBrt8WjH)_qPklJ@#tx2ps^JsQd}^O`JdH@?i5+NK-W9Yv&QBKW>!J{S^A}t*f9bhICwtAJbChBC;uw z8fjeEif&oaLXjrvq6?vFdp$Ot{x-MGsCj>EHqon1QSGn3sBY_Rm5YXxbiD)FLP#@% zqY(M26H}Mi=?G}|SqJ_ie7?M>AX#ru)qnseDLRCW%g4-(uN}_+8!4{ZDg5!BcRhw{K)cIp@dp z*QRAvBalzUCYxqhX345@M#>if$aUw|Hx#LkB)e1TakaQDvORARTzfQ3k`|E{k+ zUR;_cQen7Z7Qn)OJ&9C;6vc9c3EWE4F8!@#$AKJDKbMR_NCFcsuqu_-RRHig|2;xm z-|cMZ-H}7BN9jHlNig+Zj6DgepG%~CO)fULImPW^erEXKpei~H5;!DHT%+v#XD>x~ zA`j|46EtRQ!*8}#?M(kB4Uc2g)TJy7dIsHCt0=zJ$x>f6d%%#x)WZzMezy;$;2R-l z+$;|UK74v_F;ow=>phO3gLxx7>&D}inHZT&OxJ>zi}9jK*No-noHxHG9*aS?nLV`D8#WAkcN|@eR`%PJK%YP0Y`Whqh+&#?xJh|Ql zSo*sn(fhB*nY&}GPx{1u6VQ`2{Qlwlt;DFntS*N9sV3<2b7_{wvqgZ11H;Z$M>LcR zmb{^PZ_}_jD|m*Mut(D==e#1&m>iG+{AmGb_Em0#sZ6iyCeQl}Tm}aM7zOltgh)sR zbps6ioKKd)LX^9w-L41bsDu)0aZfMaCX<3BA(C6Q-HAkV%2fw>_9IUFi<`7tl;3M5 z?7ceK-}ac8l**B^C{Tf3Jp`;Dv2@dHjIAjccQn&}Z%V`V+ZoxI(zBJSo;(zb9Lg(t zGCXp`mr1T5=IL>T`1-FXg$VsGQ1`WlfFR6_e=LwgF}=HRi{TtFa^za2zHLA;7vWP! zY#55Epj7@?_Kt$6AT{IuNP_<-O!Xi_qMOV51zz1!6|Tga zfTGXdZIU~9S^c(A?g;bTy+gO@3x>vWVr+5}@S5MZV&e(s(YTD>U~vK+LZ&! zaeA4@oDr8g8fw@4msLs-67K@!d*BCE5QvI}8JJVDZ)j>Nyjo@qYu0e*drKeXZ|!Tr zqUi(WS$q@>AmPdDCvFGgCVa^wORzGM7;8!fr3uFIvdw1HuW_y3wGJH$h-!$bRt3G^ z@|P$&2~Bdrs&B)0ni^^BzRGE3KG4kQx5Im=U4C7#vi>C@fIK}7w^dmJMhP`8b+0}kY`Vi=tb!#e4^kY zeR8NQGVv8eCzWS$d)#7J-6rp1NF=lFeOqfC;5ywK`3XEf4pen=0TdujI%!NG04}-e zHy~flBB(B9=X8)p!N}$yP^(8<3B?~>f{%8a&8*$fZg{^@-)mTnlH^VFNl znyw-$YNTJY`f?;D?LcFAmdp}@jhO@RA zO)F8q3Gjrt@*r*nD;}kL#JYtbzujM{m%t=sM#sY_YF}k!Q^sQE9Bp(S*Fz=gW}JcV z!{2CB(_~}hkcqqIv3LJKgDe0`?3Yp-~ zNcO7`4fs{EoN@(4pG!w>k;Zxr6wB-ZT>GH`s_7>^0H7Ml=5FYZE!$g_3`#h1*dnzq zl11~MkI!sTUn|qn+4$ST;R_o28DJva-*SxX+T$|dslpS1gRg-nss)C^Jn5CMB7-(% zAZ7)C2c11y%jOcnr-peUH6Z@p?Ii4H!paDR01tO$AZV)uQLp?el z?m}UgE+cy^QY)G{#x|VH(%r{G`A~|3QUZ|eKXR~kSNo~h0gO|$J|8J4@-XYEmLL|& zLABH3EWl62<|>}Px2f2D^uY4xf%Fu}P*UO@hD2vOGbh{14g8d+)4);c?Ovrc72K0n z<=7xpeS})WNt-Nv`_nn24muZVw)ZD9(nOE=a=vL{bL6^mpo}xNu6732NTT| znh$Y;H9I3yRe}uTM9$7edJUg`qDr_Lpllb)LA1XdLB)Jtkd!(T;JBD&WE5qMTw8om zh-+7-hP3`2@q=w;=1a$?f3==$XDl6zz7r-{V@|&9JGK4v8|#QPRi3|2$XR+L>2Ifw zTlH)D=v6XjEryf`g}BPy+$AAS}(A;Z@(V4uJ6@B(nxWUWUw}a&&PJ_|CbC)tbkx zDCnHOvY}Tm8j*N>_s$VL=m5*44Sp~=Me4wNCf!I zwsj$)s?r~W<0gOlwh$sYfUf~Xuq&vhCLtS)R1hy7A~{GV%mP-%i0hLM^Q3xL4$amp zUBfx}&)^QZg?CU-XEp0jA#zIX)hF_QQdLHYz=S^$7LrZwzReXL>U| zcEm~^^>IC}$w%aLEg8)}X^31YvLzX&*Hpo6k*=Gf&8(Co5wVP#uG_{bvi%d=nJI_` zI*ADB6@l0c!idRPfV;W7c>0Ybmb&ofyoy&^cURfkoOItuwTHXJ^!jQ1JDQR5)zap| zPtk@?t;UIJg-lwYU&-idvb+FXB}D-_SIWsjz8S{rVZD(PyG40p#OqRF=kVq+LWi=< z%M7Y((VZ9B+)>GNl`HeP`NwJ;fr5W*a);bU<)>l$iduBp3jlq*Q%yiPw`n@w?J%pW znDPyJ)9RMjy!4Xj9V>x+vhIO_fn~Z?r1Xh9Js_R1sn}<-+!U2VSL*@R=CpLIIoH*?Vs28dT!EOx(mzpjw&El?j6_MiG3 zU*LzVthE0w{)kUEE(x#&~KIPH3WsV3{lYC0C(6>^*Y?l!NQ!tuH z9sK6)OCdU+5U(l1c4}U`xSi>0TOy>uh^P-DxtE=|&Vd{}C*twzXQVfVF=rHnsRy>z zmSMCpHao{tp2%+s-`B+EN#@$YK{w+M4V1cCRRO5C9NabI-$*HGV%(dxMqw1?7RZD4 zrN*bXk#&H3T1ef4&D-qbY5XBcCI%EM$JcC;#1#eOqpta>mFUyA$J_9xc*GoTpu5k_ zW25yY*HnEOqWw)VzX7Hq%mPz-IO^hjhBz9t&RnwxVVJd!iA8A34bS%pyt@ zK3zm0|FrVp{fYWe*O|dJQ$)v-i)Cn2)sE;@0%i+Q{Oy2eS$j42w^qZ)-wm%cO}q00 zq)B2L!;Z_z@n}W8^*g2?nWlp1GZp@luF#^FzX3alxYM0!;>CZb>!X@jrvgGOlamo< z$S(xjryDtl#8x_zj~j@4Wo%ZldZ9Ve-LEybKtGG8yT3%b4H4X|8*TS!HjK0~5~>H3 zNV3%g)Cw(!n?N!Q$@TgDgO?F@)w&g=AnkeTzrFoYwYNv#@l4Xjm-a%HR*|hQODQy? zGtLbCT`r0EPgnFR%6BmeNSpxR>_}GVQAek*zApBh3X6eGd(7f&}dx^e5TXRiBA@#%# z!8jD6miVEl*N^N5uNY8g^W6k)q0Bc@aOcX&@&XQf{={L5QZ?Jal zhUoe9&*UWa4yJR73^8CG5b zewPRQUtq@rya@cVC;ri*(f@ru{qGt2AMnmbix`9_PE(S}Xg;p2@(v9J^hsT5^ETzr zlhi5mx)2^7ig1yAv9>QDU$3%nv_IRYt0;Ax*leI>paWOrKPj!lRleQ06@X!gUJcc| z>ohrMpSpCXcq}8IN$KW{h}|YEC|-5Of$wh+kBuQtow5o~ePG=4nzf?laTU!$K}b|M zLy|xSyoiwQ&iI|lqrUU$zBC)Q)HQh~TPK|@dG0?k;7}I+P0G*F3F*KZS5;L2{}jQ-Tc5>k= zIvTlkTE^-9!KXBg-dWWBM(lnE%B0 zz*w;pOTy2pN0;eb+TGS4wZ4mi7HBSE*&zU*U4SdYbVc{u`_Q!ucOC^UjJlY~F5~sa zU?1+LOCjx7*Y?C9bDmsHw`RPup;t~AbygCr(41Hc)p?$CxZ*qXUYMZ*u5jbVCdd2l zz;h@|zoNoL4}F^j?}G)SDYq|lX`ASn#c2!FxZLwry&C-=VdBu8&@m|ayX;GX*NCSb z>+A#^jV z>=q-|Ud4E>;T(?E>c*m$}e}q-1@=YOS0mJ>exev2kyf z4$ZbW+RgCJj;IoD4*!cI=cRaaDcfyz7OPyhPM;3%C(@sE>i^U=`he+SRH+X4ycar^ zoD?I^acNXdpaT*>we>Tj%yF=1#_{(K3-w`3{oVDZH!J5%e`O%35=YdHc)f@n9dJ>q zrzveD{@w-IUJuK@^K{WRCwy^`zh-XCqtVnyvijFq`?n#%V0BHKjrct`STDjC?YB=j z-lOh~B5o9P7iH<();Kmp=KrmWTZ>!kz1WyC(3WC(|OeOO5Zz5zEn+n~Zaqq_s zo4@A0y7-hm=nIK+i*FAZ>Q}}O@3gGtsCLqOjGn=+h6Cx!c@|%YKr3y>8;b5Jy*)ja zMl92rL2Z8#=>{fSZbHwj3$sRO4MVw8eLqu>4A198Oi;9H&P&$)7so%Qrw4p@%KkdO z7<2pXtM3Iz15s)Kp}h;ow6yRiAxbD)#anV+> z`;>npKsCav#i+~5EW3Agi0$D))+$4rZV!=}7P-tEWd2o@xNIV&N+LOo^^aP(S^0A? zq+HqseYI$`VEjA!w?@s5rm?!q7i&|;_4YPxnVgMu@pynCaqUPAAw}1eM;{V9ZEbCd$Je{hh*yNGOCq<|%>HsGv2(c-K|~Z46%ntl zA$HD7=*Th``?hm_M>%+RW_NhwXC8hw53P!1Nr=!Sa4@h6@o?+wJZEOKP_L;n#3kl5Y>GSuiomD#n z7vY+5jM>*EKk`6A{vrdI_GPEmMY;9zAHR6SPTct=ldE3>sSCy%FJ4F&kpIc#uec%!4-fRH@9b|Bs}+pM zDBLr@c`(9sBR=k~bfl~t{`*0=8>ua0?J&@pY3>|qXP7hYT|I0~N9N4+oa63nB6i{L zp2N|sruxf96!&*EfF_VCdQvjNFDF`~UYcu?_hM2<<2IU%lSROpjXeODjNyaI@ooq8pZCJu=Zz&g5pfJeRksEBO-3jrR zMI^$H+Yome`wO5e-0WE<-{AUF13DLR;)Z!E;aL)OWf8JkHY;uJ>4RwZbSp2VT$<=~ zrt;j#&$~%w8?+ie?U0d;i{&d$!l zOnDa^jvoVZqQttb$!qk_+zAmMDp_L`ht?HHmiJwM*~)-|gOCN8xsho^SfkAtYCSjFrW3o4v6;#=@NHFlO?MC51WF|LCIbyv2st~`5re#n_+^KiLA?wBLJ6vJE5WPPB|-2M&%Il2YDoex^uq zJ>#H-Ir1c13VaQu==i(O{_FJ)9L=!bx)4tlZ(O%Vap8D59c*kk`v9;6ZIxR`)?pLk zNf0W1lVBT#jT-5^=l(lZAq)m0wAK^ACK;ZTW&v^8w?El(OB1cd8R#*!V+Aaf1^w{i zV&F~-Rxy8sbEa;Q97=9HkN=8G7&mh!NoRal2i~Bun!M4EM6&0q17`!fZ?VhvSy?hk?cGrzmss*0Ua35z25Rod!b2Gy}N?^rl~z&UTW%0qcyRE!Lsr(g0{R`~-z z3(`nzIItsl?VmYaGf4s5F7}gKz8NfuXoD0;y{uUddx-~BKNMVYl+l^?N0`>&>vUw1 zQocD6mo5P%tqdHZe8rickpa(E-Sg@P?Ek;FGX47Gk?DW^1K&r&}@Hoe_|E zxpqb{yx}WD2%v`7E2SWO7O+9Ih^x|)-3#WPspp2T73M*_$o9{L5ew^`z{B}a8yDzP zN3Ox%m#Qdc%|vf?=;F?fkigjPuYA0e8i1-f#P>-T-6}G%H>Bq_B0!B?k#B2{Vlwx# zL1p+*{YLS3*u5ocHMZ<($fe}_d;C8)L+Trz#viJi$(1vYP8;g*#=NUO46#BRo8MF8 zjghdn7QH3}#W+}!Sqddn-_x{Z6Bx}Pyj>WLsZmz5;z77i{-%MXKI%8bC%YBA%rLSg zD=v%aH|W?r{-|?ZCO>!`WqWNNutfIF=W)s)x{~{mDyl40Xh){6ssH1sojLpg&Xv)2 zUMq=c0q7ILV#k2AjwDd*pIhJ?L0G;D#h~wnaA_BE9xz|{$V5PPa7p2zV5f&4$-&UX<^KKlR$V_|6>~$ zdl!*Tn9{`AksCB`CmaW?`r)qjwqq(opLIty%LjmrOTr3ZP#Is)p4Jy$FCFAIp%KUfl z4~5#mU{R&mJC#nrYP}l^eS{;}g*U3nR6d!Ar)i<~4IotnSdavseVs_7cM_=nrd6A9 ztAi}(=Sxd@VIMORhOMc`k+$OH1UtcU;Y8~VmY_gsY(na_`zoi+_1YMG@2>g|`-fGc z&~6_tKMK{`dG8j0z+onBgcC>&PR{x8`)QBV6d zDqaFUZUR*Sc~=Anq=Ud^?m^(5>Uwl$M_D!M6HM^}^NU)|`Ii?NRTTG|8Qt2LlJT-h zklTRx&CeQO7V(!HfLogQt?(Ix-28kYBl63<+?jE9>t@(xqi4LWfe_t*> z=B)jpoBsuBEl>FJgmAaRsjd?vKjlW`(wZ|Z`ei_D@mGo0lS7}NkH-(g`gZ4oq^_Ch zE-1L8SIKl-zZ68OcuD~_rwWfee*hSy!ajkd|D+cK^Bu$=A6)i3{-}A*uLggtY>KSE z;z^tIp$NW!E=n%<8Ok@6F;_RU+c$rs>AC+r%#3Q&cRHn^3_WHx`g63ivm4p<$3l+p z?!?x^`^znry^RDKWHvJhTUqS)dpdP1R;W?@EPbMW`KocqeR8khYsLA15N*uYSK+9d zda`3h(m}G;{d%ogDuX?M-xstRvxr6MHIFc|f~ArOarBS_f@O;B)`rbeA!c%qUxd7Z zdkn%yfnTf{Cbdc7o^IG-DNvjZyMVv4cm5l>}cbD*yq(2Ci`gYWWHN`%Wze=h)`FQ z&8hOgbQF5%duf(Wx|U7cvDK8NV%wINHzGonXCMAv-jd?mX)<^8Nq#P3^+c!-aty(w zc8DjEKsp9{E|t&|i&vXLj$cp-NR<8i6K3RDrPk!!eQkArJq4cR>c@xp%dWx#idaFq zHd3zQQQba5Hp+>bh&|xL!ssnXs*(a=qX4|aEo6x|&^G7)vuv1`~yr(^=wWMZ=I z)E*LkzN>av8vq=LO-%dNNED?NJZPJY7uARR4tZ9az$7}<3Xjt7en0N!BbFV-c#du{LQW=$<9>S_ie z7hYpmdV%tMs0C(*`z(fDk5?*u@{W$6`|$5PP_Hrwx2qjaypR+e$)jgQI_Gmw?m(84fjo0US}$^2@sGsBTioMCE4pF&>X)WGq?#zHYV=#5

?KIuc(eF#PMs!OJ?F0YCl_CFfp*$fCzBO_-d`kI6vN;1<|scMjM&cN-iX%qpyincKw zulKKCn{01ucTOrpw*} zm?a!Exo>Ccgd!!d<{g2g@)bMgd$iru0NQpK6ITXFHy`I4yV2m((rn_CpWa4L(xN-9 z+Tk*-nlKPtm#5>_vlmJy0S!OnN)Y!-nuT>Nz|aszE+KQBeDKwBFwY~e;4A2KiuLBm zENCX6^L%XqFcT+u6a9))ArB&2`h$$CaS7aUS>eGlwb;y$;vrNf)jw`i*Q)v+!H70t zM*D!tqTJ$ciyhDQh3?W8V4paju+;)uulZQ6VXYq5NtkE9?AspYGJdw7`dsaS3le|* z+hz(}3lhD}&#Zk+Fn`R~BsCU0hT7gb5Vc`W?P0BEKxs z<{v0mUC72=q;sLofC!cX$`#IreK}Kdc=PkXRf=`=JU^J+P;~IslU};>SF!fA4@<0l z4-?LSMP0s|3ubwyuG$jM0iFKfTTMMb+wTV&=kvzB5uHcm^okE9Z#{*}E$r-Uo;!@L zNVJpXfNolebZiyGe@Q7_%oOH00mbK+|M~oAoo3520Pq^TaxVA}Wr^DOeV&gr)NFLCSdA0Fv zj|aT`D)iZlVB$swpVK6^G4+uQhEKQfK>Yreg59?Lf8n^u6KDo3HJ{839nfqbSbpHiVu=)ccg9 zig#lvR79VkWK6}Dved7aE7QV+p}=EIOQkD~oxdx5PA_&ey4=9Vz+BV3w?L z?t|MbozxGEAg{{&;14}q+~bZa`=kc`2JBXb(sa^;3VCC@FK%}-PiYOebq0(LUH5{&IuvW$as<2!u__szAanbkohJpnK-^VL~S3e1&}67#^1jf zjnY!QaFO3nwj<1MQq0z0sdMCye_iFXZXdELMwkN#e{!oTQ~GNo%guL~t+iVrPKA_9 z;a)ax!I8Prx+HyxTo!M1#hy7J|$ z)BYJKT)430YxUf7qCe9@i+Aw}K!!>2-&VUqg&!O0*uIUaPWj2d@k02}uRzCLo+0}E zST`{haYQD;v<~g}8u2ufk-mVXIcP6=N~|x}+9Sj=c)(2{SP$@}8@+#<%_E%~x~9kh z2(%{owe0tg@|=F1nd+*qjG~UC+00e_c24fqo_W8!^tm32!@+#1oS6dc1CXE1o)}NW zEkAAkxW4Lqp?PCq%v zX1iXT&P4XGIvp#n{JI<_M9P&KtU5C_*!k1Uf{Y+CkaaYXSkEieW>o`L-|oXrD~dB) zcJ#D$3;Qy8@6NL|0RM(a6ql~+wOb)U8*aVSR`<<5@SDlrBc-a{DGs9_=TM%DvJYJw z<*Tcw+_?_Crp)hYXF+XSAgGAwxoNcp!-()G%P6XD@5hZ3RIP5u6o{i@wVIZDjiCacXrO~yJ?fH}YPp zX~NlcBZaYuCw=2&NtxaNq&W!@LDX@PFUa8jcS)y5rKJ>PM5L@_n?wxM5x;0ukksqG zpOOgO{Zg*9q-doz=UJD~IWZY2wsu^)u!#=cwrSh18EKz*Oc__?0U=aTLrbt(AD~-Z z3RP^;=6LPX-81&Vw}_K#Q9q7G$?+q#!A}NYrm;*M0~&}l)3ua2TI=3ecY%224Gy>V z{V7(h5LCj)_dTe}+wxsrAZJBAN~>cJS(n*)9{S#t%i|TAC#KNm$Fip7V%BovN5&O>twSHkYhonOpIf;i!3Y(-P6zmjnAsznPTK{x^vWHpjy4vu>edrVrz6 zNO~*O>O~+J6@Z84*s!(@13~1tpxxBSgv$FFv?N8|n=!G-F_yHb^TYv~p2MK$s!?su zrYnJomt;y{3#Eh5ik;vmO-Y<`h-yJEvMhPKTm+-ZahwPkIdsj@4~Z%X{>TCV3pjW%or)4Yo;HYi zG;#j6TPDvqSntB3FnR)lO;g0&^xFRDe~771F}&==thj6~ZqF|IPv$={>zwAH@=>6S zd%bX-vnY&DhA)Dr0hNDOZTZuMkf+q2@Wq%m0QwR47;fTQ$6%#5rb^V$;)RsX#}mq)Hny?L{++x|;*4VE@CCxfNH31I~vn~dAFv7z{DKWiklW@%Ga9=h-bBSj5O zH;%!dHlJ&7lV%+Z1g*Dhe!Z?c=j0OephZY>?O;x-OH&L9PV-j*iNO=KzN`e3qK~9h=3H z&!H4dV^C}y37}v>9MoJ&1v)uz4;iJ|{#abWW|S%LICjFr!*_y37xHN<=}RKCj>>u% zI3@91-d?8pLfcZEZqs@2_4;}uu8CUIv1Lc}2cSP^ zacLgm=<;S_q-U&=3^d3?!2jXBQcDg7HY8hNm#b7lqSBvrCDli&Vik^GXR^DyMB`UR0JyaGncR`+4*t*mp zooD|LW2y{6prrcXnH#gQH7v%Xk}{M&?F+YueweA`CSp?$2wY|W7RtkdZxp}{MsWU) z`V+CW3fUbUNH1MHEnoFK?dnz0l9s@1x9#LgPiQP|>#h2E=5Rg!qB7W`MuR_RM&YN} z#@(^h9ay%_zeY3@fPBD!)nc;t_GT)lYI*U60ctumfs z?I!ysr~4=5f65Hy^DNH#TQ=H4Y@C9R=-Qk+5#f`GUyTx-3>B!nKVwRNl?3N4aR!b& zXX(hOMCxWWiG1Tff_CcedE?up-ib9;U(PGQ7?fUNl@x>xs7zufewl)2Bh%C z?40XVen=PIfj^GyAVB63bLsnfb-AuXis%Fs@|*fY8)5FffkAr4HzIin-pH`We)zi| zSfx)L%2|)(siV{mxVjw$h=|m3Y?F zONr8Qlq2Vs6&$`vCE_Xakk z?gY*<%FV0Xi7A`Cr*Bak(tol355gy>aa(VRu=NQPM*_vxwGaBg7f*r<%r83$vRIbs0JJXgZG%d>eDsD}RB+JxhQW!VSQY09Kjp07O?buTu zEC=p0?Jb9QQy2bWy57N9zBIsXcP=kzO5mxLnMRAPgYdW(5&; zuj%k{X@}?tVYak z6@Bfq?H2_#l8BCrr|=i-uwXsu-a;)NZ> z&5sjoE#TDC6lxK~-O;-x^0I{?o)h#BWR1x1sWr)+Vta(0CLu7T;rrDG?_jukV7jDj z%HYNMqIjjV-T52gr3SC7x^;_Hbfrr6nZRMqLj;M0zoy8tG{eUXr(fbo@)?PckzP`n zWyh9^EYWYRDV14I5|dmZyvg-Mz$zAQRiB(O>WV!L@7cCOZ6GCR$xE<`!uMJ@K$MM{ zZW%nkQumzSxb zzNr>|hkAD~?*(T%+x4!iwv(7;SbHjAuDF|k`%Y_FW25v&lgR1&!#r!xN%bP@OS$oN z{e|yp@(U<@YT~3yrv7iqm2b9Pg@Xy1c|cl)KW-l?4qcMP<8@>#@Tty8^zjV5C-TzV zJiVoMcSfwO2qhBw2Crisdk1}2zaq|*JO zbuU$@hj$A}N&U2n+r5IUrCVFaioM?*9Y$9DTV%cQv-c9e(#J_BqnDEmmA!fyz>22O z7iq=4zG0v5vADA>wX9$emi72?G+y&AXtMf5WVw6fO2)ae4rdNCq}^;rV_ zQFkLB9p(BB=#YtOXR2aPNKNjESq_*cHV?!{fDQ(^487hIkXQt)!bUT5NXK1_-36NB zqw35R@4Og2GQ_5~_SToSZ!_2pYO8hIiGORT!(&A=i&H zDtoth5_z&R1sE3;rZ$*1s99FICw?U4a>9Hkl6To&W%`q@YKv&|7*)x=vs zYJ!G7ko1sML1Zg%&WnP5>K^W+_OJWnrW2mQbg)$>9dGmfH`wE^p<5!;~A)lMR@i>Adodh2O| zsGtNl`#I?u&8WL#{i5QSR}Ed|M%Q&sm{L2#NR!BC=jny970OR?Tihi_B{M9vAtY9A z42jkypKn3U_abD?wj}eqzQP@6y?@abem-Z<**yv`0D(+*dP`fGEw)@qAh9$oSo5j! zRzx=!nV+_K`iUA?NDWlC>h=zKIxFx?$!IqeQt}%IYt7^2b zCm%f*JAIaAW>YE@OTG~i-YuCO_Gy+fVey_5+5Wj1_*`a;PRmx1HVU2Ht?Mdny}RU( zIjZP#7OjH4qzPw4^IDaCCd^H4NKRMmYrJd-662>S5fJY=bv9ZTLmH{tNJ{4s2gm-} zNE+u??z7)B6U_@#v`+VOBcuw)aIBOu;bI&BzWEM_Q%P}~!bWa&N4Ld#i@k$W8^zd= z=(D1xj!>E%R6!_Xoeq_^hPCpo`Df&#>G98m+2hATBgD0ezwi%8B1E{6%WHl)B*&O$ z`dIX!|A&^3q2p43``H;j`>Br}%DvX6tm;l{dE);5`bjo{2dy$yN|~k@t-hBcN;7Zh z?5XH+t-KQcAJP^`j6yra?1>dJWHl2xi z^m=R$cwyfBg5SB6Dp$Phz{Ba9CR%}m)|Bk`y03WGR%p4(JHnAeeyCSk)nc9{%<7P3 zknKXi@&FT>`=X~U3D;=6?ul@{nH4Mxclf+PV}N<Nu_bo)~^zD#u&ErlEEYLuAK0O%^McRA?aM_y-%1Y)QJ8bF?RmpbiaSnGUyvJ z$cmcGchJ3QHJ`ZxkqIA8r17Ogo!CT(1is>yy_S>s&w8cr zy2|gu{?^Ckl8zZ`t&Y<82y?mU%Ct`;oB%LceX{5SqTCLs5-n@d9J@m4Q@M2}ml0P+ zIk&prot;nj-%vBR@)e$ioUlCi2|k?O_byyy@uB}IRZ`EQX0j!;_Qa9je-u_J7|J`e zO`$E%NWwb&ArU*M#lR8fc=ynsjdq-lp?F;5k$nqp8!a!0AYF_`?HuRNwU z{J{6_FgJU&kZpFYhDTt%OAu*ME;aFhmg-cLq~|Xdu{+h z=m24|wv#@Yx|6m`Jx%Up9gBi>`+=FeWg0I;wG$3la8KJONN(dzTa*M%<9LM^0kn@1O?@G`a(f1 zNVUS@=U<_@VLhLis;LNsJYH=uO#2>Hgqkas4Oi5$44>wsDw>qPuc+v&DOUYFS$?0m z?w_dWx>wo_ESH<`Vp$0o$ujWP9Pa7rgL^AK=X~Kh;YBqfC>6?7Ap1e5K0$}BG8g4? zaHpnsWtc!gFIe6#GlJ`IC{nzX;oZlb2x(!4CM+*AcdTRLSy~913$Zib&E>Le_Iuq!5w2gN$}#epLGA)eRIB8F;w6 zaGUhFnc{2gc-o?izJ)uhb{tcWavWX(Ru_po&rgNBoo+WD-{5cb9!AIyur7%$EArkv zXC(vYnv4#V{VvWK(O5$R@}ZzVW#doLFD6otq-V(2o^A;$*ABt1G7$&o^xP;EbD7nP zBkx&&T@1Q)O{9A~Il}vdZH~PEA32{2ZOhu+(HLgy6LbX?0m^sDR@KxF?Uj9Wur7_l zc#4@jQrsT$CUoCayr>8_J~G9CWd~24pR6Lc!%fH18ZLw%H5HeMs~i`U5h}Twb55^X zg~%_Q$aX$zCn`^`a3?7UOZzgtA0hobzu^*|P_|zfps9cy3yQU-_Jk0ocx|Ni47lZk zf#4qt6ypOX?`ccpCx>ryn}Y*&K9MhNn@4@aucxUnJyO7&RTq8JQ#Pvu2u0MfNaZ`r zqMFYu*5QS!!>4kcG~14rdB#6}?}dtW{v($)saw_H&NUmn?wos9cA(09VEjQzugR(8 zwspPUgN26{i_>d;Gb4aIvq7ukuQcw!Qg};@TW$ViQ8KSR?x3qX5^^M8bFJ5Oulh;T zhAm%K*qw{tW9~KyZNF7w5t_Y>0oCDWwe%Jfck$nGj!y@^8ZI`jx8R*HVQ{nj$BkN8 zgFx~??${Uo->Ec!J{LH^@ai5SyTN#UG!An12N<)YGP-Z{Fx=%VW8C#$P(%`*Ua?q` zNuzUP_)eQJZNg+U`-{2`;N zgW|V^*A%u*)25rS|5*5B3P>Waoc$O-kiA=Li9f#4@=CL=L{jb7+)7Cn2r~k`?N8gi2=3-)v}gXgyYvu27G;d&G5tr$1Fxy=9TDCv zeoyJj7)A-Fq{2{-lxD?_*T0@z5_o`G89lyj2+lr@v= z$IPRlsT~^dcqt^U>G(#$i>6Jv8600_BC-{+_SNq9v0>x2|dsO-2GEGo`CZ`x)8 zY1U5D;M&k3uDm9-V(!)6q5Q{-dAu>tbkfm;C57{tC;2mM8IhfQRMz1pVchWAsgylx zk8{hjVx;Wqeaysnlmn`)%Nd~9wABBeMOC6r?kkb2^n5qj1L4>H#0MG9{JD&(UTqY3 zg)`-)j5Jyg%SAFmUlSY@bFKyN1bbX7?aRJHzkTcZqu)lVX2E=2N;09em@TH*;9Z{# zrb$sY@$7A@Q+P3`qTM{t`jVoGUuhP|+^J4b^6DVQpz`>g)hju*+4?gyc873I;8;1DN5r-9O8&l8T6@2Nn|kc0S}N+VpCqAPm8xax4A22VI62fIi= z#_)QRreI62RCMFbGz&}{*a(q5hn=DO6FVP=!@8-FbKedZ%rZgvE-%N~>>r4HpO)es z6)L$MP?m|%V(mNafApS?^x4MiLXR6RJSZo|G?RTFu-j?CMs1;BtlgbEdS{R>7WZWM zmp@&Vz6%Omxm45NBmYNgOWQmBjhK&APe*14egk)ku~iDSQhL4MOH$s_(CsWyyZh(& zUBw>#XrsIg)Mq!LwpXT^ob8mO)c>e5@be51`0Ij)G`m8TwA{^f~o7C1Oq+Vn(ETRe$9p7Sm_ zJN`3F!eA#C`aQ7fpUop@{LSltO*QXSgb4S=TqmaVP48+@Si47KN##>?fyoC!B~`dWAZ zgUv49w7yd!81T1nhZO6#N?5j_@&nTyH4a)SMKG#KZo;FaFiZ~Q0$a*jqI^^AeI8w-4B}o zQcdkR+kJSjR&}^vvpStNWV}q#!~MPydywLDPvU+~gkvAxJLZv?`dpah22;6v&f{a& z376y zPAfA1n@H{@r_ZK^eD`$6tE%BZR6VTDGYr()q-4GTeM-=T-aN2EQQ_GB5*<6$k%<25 zjEFc(Kh!#R9NqBu9oU`Oo=+W-jfE_M-rE_qA>{ZLQqQ|Y!mH+bH^yGn&x00av^!W2 z`fwOnUEFqsR{?LzA^+L2*J}lD_T*PlLCTLO+ng`%<%9?RVW&yroL>%fAi-sbT@63W zIj6afP@~J_W98_z4RxFCq*GH)L`)I#RjimD>QLX5M|rLB0jbwYedoR1z!w@g5y<5k zzYVUzt6hJAp*L2`ct zCsy#>C5YJaV;zQ{qE{UTb?*GW4U?HoML}&gL@oV>mBLwR&N0JoPT0!Vgr?!_*Pkenh|9nllA*czy;xW7r3wRL8_K|O`9y<%?*wLv)!-I;$x*G7@oo8t9I5iFAz z(}C{3IDp-|9+gwwZ-0{&$s45Tc48A2mML`%qa;4jhY=Nazufd1TA^zSAThg zA7UeTy|ZXQ76`yM_ZOHOu&jTuq5P^Xz_)Og3U{?=#KHgHJ0*QIt>y5tow+%(z#d#X zp7Qn|h*wQ{pwcRtTJ91~jYa$)h?i_1l!iyHN-WY8|Ht7?!t5gvY}n+O#&Bl#e?JyZ zP_<9n)P66!7meO>7*aoAA2JlS6TmCM805<(a7ejL4gxqw^5AwX;AEc^?0jw_qim^FJyx z^(~0Y`ND1sx226=qFnu3_&2UVXhF0R;9uR&Q$TFbIeprA6Y)&sf;V2KJ+tf)p31{- zR{!mnx905h;X+siRPw~xyV%}KZsmH8Jz^uQ`#;5zctLyMmx^+df2ssdyn0|I#$HT> zH&%G)>3^o$dS~C^+`wu@Hwu@!+b|b#chxE{v?>GS+) z)pw2i8{o)yEZYaGM9Rm6>;Lw{Xps(tW7o!&&Di(Eo<>V8B0F!xPDzLVXJ;t3#S$vq zgF@WgUKKatRY`7yX#mmu4bbm@V#BO9rDEW#E;!>|RidVnrJ1%#14V+WZKD6P$rS;N zaV(C8^(NV&ajsijbpTINE{K8#r~LOHW4#DhaAbJyvZ6|DSU}qQS>X*naD=H3LEZ(> z_uo%AH8n25`3iCAd)2&&>u$NgKq9iL>&}1wAB-FP;u=@91edxJ0v|e7!`ASjguM%b z2P*6l&VdB~!&2k5fjMl-#4J?j!+&i;x|<*rq>AJrgA&KhyrZZdWu1T31y1CXy{@`i zJs@PcDwOXOn0f=R;ys+y?;KaL{7<2Tq^vj^_j5>LHRM&Ue%H7H!N@vM>n`EO{{*=b zgz4$S?bdI!69go7;cm&!PH6ArRr2Me5%2xKlmDN;K=mw|P~q@&TIVkl0W9rrhC8{D zh!K*|6&4P`e?5&SA}SGQ!G>*=zVvj>G;>@Sc$zDC7CYRTEKiWU|Nn%G!f5v4mSS;5 zW4IKHmjPbql`1CP-p-2|$j*mK!2e;!QSa=(9R@pSt;51+f1X2Zf8ktuaHD1sA+3Pko}uh-c$0-B!t?+cX6BsLG(y9))CP%Fy_=Tj62$HsgU5-612HcY0SbW(O? zVCj5kt^yp9>HDvMk$imyESI&g`^1~)L9^569gRyJN3ES>UeNxxa9M*MoKQWBdiejRAFfjGPMv9e^*$>vlBv|W~TPRJh7m_r3) z(fW&|uZlO7Jhy-`6mK@EPQt7oClKu8xQ z0TW-riN@knc5!^|{L0a6pB5iIUVOf-MdD>3 zXuGZO#+2>mOd3CwN6oLn@L%O>CDt@jY=_1^dv=_EXAqcH(-<5y%L3!DycmKEly=;1 z46K7!-IDZ8D)e5BYb`%-t0kCBXvO1iTgz`PzUs$+Xdgi;ah+V*lgzfXPo^xJ*L4n= zI_yXv>uBV3KAPL5?4Z&N?Jwo@Biff`JEYL>qQaF8s9vgc zU+AfC^B_y(NCJt%8BGrt#}aWYJ@9}!IREvlJx$M-nvKV;?|Hpe|A}V7CE|Ond>={Z zwKJw|`jHySCbzn{+klY!+y@R&B#j$n$+S8{6|&+&s4yzAICdvyr*X@KPyRJE@Rnv%fihqq=P`N)Lnx)c`{Q$}4?Nd6$#&Y#^^Zj+69|d(=!{Fzu#keG#1@h9y z{@g~XR-E3HZ=RcrdVUA@IrTC`f#6`9NI6Yns}$ox0;j2TU_Xdt^QyI&rw$AEypV8S zN}guLYk-_%>>U2M2bawh&xZa=8NfPJINUjb?3{O0hl-E~Gx9BdN*oOAs%5!hv>a2k zzD??LqEm=7TIrxMSEw?1;3bF1w&u2O16u*XoU%6$_nw>tsvzH+^*fs5sfhNtKfg?1*pu*jG z|6fhe00L{1_sYWiE+;l2xnKG3o3l0wpv7}P0CLgC?LOusI>4-sM(M)40s~LD z3yEXKnhx{$9p4;g6o{<+>1PTF(Y`9@6_;f5T76ycP9Cp4Wr1*?k`%T@FRiTsG$vji z(HH{4xm8}cNZznoTTom)LHjC5zvL6g9!PA%>v)Z#=bpzEJOHtLt)=dw?rD>8JG@m3 zG}t3j&aQze%pN^|D z=%c`cljTSnh}>EG3xU zXPW;pH@$@&Cedh&=l!|RP3Ohpuu|%eGjOp{2Ne=uyA^$ppjS#zN0G(%G z!XGRA2$mao@zMR4n{3A`-qknw&EiU&Hg(AWOXshsHRB_sX&2t15Q1=9iZ`nqOFUoM zquwfK`>1}HB@l)Cfh8^>-xJ&t;qD4auCq4Pv(CQ`^L_3o9u3tgjo(RBJ!pJ7199wJ zaFt!O)<-A-MiP~hS*h3B=zdRPlX8Hj-;fq7{d51^uav!x+c_HV!}8zDjdTO0x(${u z9&JQ&KE3p<$H0G;;;5)_dAB}HK)<%97QMA`@OV2nKX$~Mc)s0a+7~4cq#VSf#j4vl5&YQ>*+ggc%*fkwU zUeja+jc)(c4HPP{vx;%uYN!(_40bUa!CQWaHgLdYvWLIw?PTf5Ki0R<{l!oj{(J%` zxn`VxP%ILqz@>{{c0bji=`sQ)#F z|ESYphTUTs;6X3_9x|eTVBS`Kj?>N`!U=E(;7-^f1b<|Sz#Vb)6#ZQue8+p^hn@Il z{J}>5=#rvl{KWG8!$$M3*n-fE_rZsKcsJv}mH(i8qj`JvHq#vpYcQ{8AYZe*XRjl0 z?UJCQoPd^$=s5v*kx7qcOg=1bWcVLCx_7HlfE&ELcc=&aZpzqk9e!y4@@|>|{_cvu za`&)t%YXkezh?Z=j(|G>bGQ*-e$4p4!Ki;T-!<1$@>lVVd`7Y{5Kl%&vzw#qJ7)!& z27SwrzhV}mm0vr5N+)2My}&zSQUC@~h^Pp^o&ap72?{3aIEBe;b?eUYO8OEVK2YHfix@yXpR9`NI9!$bbmKPbzDq9=E!mx1O#)%oBc>Q8~vverWlg z8Q0;o6?ct{83E_NmQUAkdvw{sXn7;`87ZT{E6bcaFa7y3<6p_E<DgAlnOZctjG9x4H+9EbjMY!QOmo{zlzf zdCS24az;3AheKDvWln)-HU9CrX&L{4@)UWMk?$0&j(RI2;>?%CnI``Ru!Im6BkvMm zgx|vG^(W%7Z$!!0>QD8aVPTznRvbefPQ%ga^JgV)rPIRotaF%=M=rP&960JftcW20 zuz(yauam9B(d&3`@P_=5cl*kta*jFt!23H#aT^uX=(R`U%fy31V)9)ekqMcxXT34x zos}_FoX-T*xB+jbIHNq5w>18_OfAny`m4%^_Lyy-G%$N{8ix6_W6ghez5l@Ierq;h zboOATPOZG^`A^wB38S*e9RR}QsQ=~Uijj^j|IuFKwf9yddpAuZ?~#P?B|(lM+}Zdy zueF!og9cQyjiUzswK!rK-~&1WZ|MX);L@KXjepC~o-yX{;wUKB;B=g}m2L*3&Uwr5 zy=vLcgkit8>|Xg?rj=Jce}<(%z61zxkntZl-U_E_F;1tEJZ#x;89<;s*7dpURys9p zs%rWT)V0@EHLVst*vA!odj5TJt?>`fImS;r_Os9YB*#pi8Q0eG@A;W+9pL(G+pW4+ z*Kf4d!d|0Q#T(0;z5O_HAJy{%jsF1QY@p+#%w=$XeC~@l3g@!T^p<|N0BO|aJ`=yi zxE8+*yjbf8v|`n{4n18KE;#ObRrQ6e!M;;pz!7IR*$JR`4>>{z_3u&S`f_*ZVy z&<&q>Fj&x8>004Oq3gLeJYzL%!b7%3BU<$;@G2v7jxiiz{I}wJaR$e&az=TsmN|K? zd%#{tcpc}5N7R0LOTK58H+Nk6vqv}H!uaPrY$(ncl`SV>PaUj0eEmznf!5<7k8t)* z9X;1Z?Ug*%QlFV+K~pmaRvjq4b!{!KIzMyevm0I4jN!E>%-yi>ID20e}2mN zzt*6iOgEC&O5bXymbQf;rQ^voN?`{VD&U9K@D_)Chg^j}GOK;TM zat7`(%70BdXxl?M0k@n5c-xnNXN~_5x_eg#N*@&RR_9x}f#TJ&D4mu*9F5ksl)6>% z)K0S>u&u3r<*+(=U+BH@i+YX=?rr=}^T3cFnheS18l2_)xA;}pY1GSXQ={EhKMKWb z=SRPg=kh~=-oEWGW+E;fMNZ))Bm&@1*?YjY3 zhkOmL1LD9w!LXz5mlj@yQTighaa^5K8CISuT+en4-cpe5G5)o1D@?i3)k6|$VaC_& zK3I@sNRdsT>6MO*<{za{b1*Um6nb=C5Y=Bx1NvgW~N&n$gu#r=fw-%4{!qqI04ls_YJduRQl5q0DU{!wXW z>Q$xXNa?qokF_$?G+OvAW+LBi2H?)df8nvFXoJvM2#_G){Hlkn{q|y}T&<3S?P&Ic z(w9|VbJ)PWD&R8#uYm_P{8nj<+h8C~X)>r|LV_mHhlGd8Wg*a2#F7k^SBXeM&#_ zrC&82mOD@fE$^;&)BUN^DECmiH?#Mdf`sFmgC|NpJ~p#Xh98D^5=uuK|CM5C#A^=~ zU#oi92iou zKpLwqt$JgeC~?~P9;jRx)bpB-*GAvX5&DUd{@F6Dy0p@1X{~q;ug-r$_K4K-=j~+@3yx=03y+tqh|qE4~tJm{;o~h_d>z)yLI6>D;>l zZ#FXb&bX`bALd8>t8~N*_4z06a=a#UEV&>9KTB4q*J#vH%@=BUr?yq=hrxc|b1$o~ ziD%~>F~paGs`KV{T|%*-+_dO0#e}%u9KAhQJ!_Um8C% zJzihRQGR>}V5HtvKeW=&xhQ#N@7FcYhn7~2SB@)C8O@|u#@{aUGhx8cL&2hkYv-+p z0ir5Fr95yLJpIrq*JAYA-&}{*8>Jug{INW(obGJE=x8F3aE`{HV*SKS2lGAAASn+%E&(ziG15RUxVYZ1KW-QK(j`SDdkWNd}8_B;mes5ii_F6W~ z7RTXyeB`b`yJrF3Vg}#`jsHR*qzHrLl}9`hPVv@m03$mBXx@G<)41MnJtzC2>QAH3 zt9wFeTj>h;Ou%#DMT~#ug(Wu%&Jb@ne~YI==STdCGV#)MeJfq7Eo@Zv`m*R(<6czf z%DvU{SYab^1)f;e4C~QmqCS_7F#fH&aXKthOT+Q``8DEEiK)6#fAc81l1|$p z2=fHUtLlB_x{PXOK)&q&?Og=z9e@S$SnUXurrAf@Io&Tyj%x9}=b)R8(jrnhO4N|t z=|ai2Tb{hU18`^KUw!yQf4F+WzzVmv-ckhs<{$Yn@imegb>a4O+o|*kcdypR?gThy zz`Ql%8hM7EH+W_%?o&Bcnot|N1xGYaL0-<^OM4i!Yf!s-b+g)6^v#aE)a6t1yah|P zXxA|D3bH2b;L=F31IHX@#?gJnXNl7UB~2C2&l~fAIiZ}ZOM2*B)5)9{jcv9Gw3l{= zewYu+L&^_3B}(74>;j1QZ;H3t(gIF11q|D+m*N9XU!`l|)D(optqyT3CT?Y?a4kQl z6-b}!LsMv2KkeM{BADPc8+m42BabNy@LW+Omdwx$5)9v)Z?yhep1p`#`Npz>)JIXi zD#oZ;F2!s4vA$IpwUygB1u6&mgiBTur}DF&xCM4X;u7)?uMyc^ zfOw(w)p;u~+8i6FQ(FSZr}}MaFi(+2YEE-np>$QbN*Yb(RB1FEC3jwa2B3ox<=9fl zrr=2blg5AkC2Z%#R9fha1Z?@LkpL*WifhLnVygDDa_Z8|aV|Wr-!~HXzXUjLrN$Z%ywCA8_ys6KL z5ucyo1LE+!8dRfay}6b?*n96=gMgz;fwcj^pp+Sm`iu+$T5T_uLE*90r`xf>xpfaK zc}scKK}JqP*T8?o%yZnr9+@*OOJ33eINJDcgli8(_0VeRv+;!>n4H-eJDk{6Y- zF`oH~FO57^J|oTHzme-1@k8z8FzU;q|Dh}^p2Ms20hwZjjl{hYhT1vOpLLQhpGN9c zJtzD;F(*l14aM#c_B`Hk8j{trH5-;@BW$23AAPSMc>i5M!MpD z8TYyO9OQpU!)T>rS<=eSb?M5@Mb6*}g1q*dT$%dFFT|+|&4P33H0B(t$$4c~ zEQ8~!Jj^Zr9fg5w6r*t5=2jahkJ+!maHx!a#qu~@J7+YXpHRz|p=b652ODPF)8d;Y z+e2vU3^ffs6V>yB&txaArLVhjfsAM+pJh;M`dAwT%=%o&0Jp&DJLPLjhKhPBZ5ti& z=QyEs#l2|VH_YF-r`Gd=V3|`V&?B19b_d<`$|Z-d@vndVE4-WoFe*%`3cvB!y8va%3Ft1!lY+b8cXDFlF{$8J2eXrcB5#`=|R$fpszZEP& z-O1C+gwdK&sXc!o1pPf0e*WnithfSkp$MmP)OhCSwLjqha2+Uaqz^Pj&;2_h6SVuq z;a1)rFwbC?r$MPG2lXc9>B?f|UW^!FJ^fpyG2$_Q701sgUPlS9^1$)ZN+-6?ylN>B zq;38UHZfQ)rzx@k9Gq1*)pFiDubUbQNpS+wS1VUgTsW(OYH(Qv-GDC zW+{Lf;Zvni;x!>srESG2*X3%DwAcI?MT}9x_6EPeoBi7b(g!z!e7_AZ5TB2?3P~z2 zo#T!_Aza?nPnB2RUdK@SfBoxU;gLQN zb_HgQlcwFH@MJWd#W~IBv*Nf6OElu|324$6(bZD{z^0Pd+>krxn z#V$Z2w!!SNNMTDzd6{DOpCV4A+M%bAD^klGO&)N%x^qLdbI%C6@?&SYBJy5KfRGqf zn385h@oMB`@>YUE5gh3_d;bAO;5Tqw*y6P%J!*Ie;WQFv<%cl5c7Qxuy@QO6e4xNB z;*>r%??vO@73XCVTe_DN?(iS{i(= zm`^E6OIMxaGc*y-#|0+>=yi%4c{v! z_bfjn$}=EPhG4wZpyJes>1W+6RJqK~xP1v99iyZF)W7PDP#zQv<_Dz^Dv(Bd7%^Sz zfgKS>+I6)0X>HYjd-X;o9A^R|q>D;iq

bR$2L2sfSRSqVD90tH(HcVDyWKl%LOb z+z)$3{~H`P!wk;nW8yxB@0Ar-r?b);^{vh)luZF;gsVDNc%|{O$>F2Z8ELKhR_z*S zH(#rlw!*#TOow0myqIxTnDUGTBYNoB9^nh>P^pbOO%L<=h#|R4k2lK6buik{ZFi$j z_W4QHVLPb#cijWkCX|JJefGK@9ip1tm%kIrl1+Q@%3698qLjIyyFTAgyeMEC5iaG^fv^=a$= z&D_`7e2&M&Rrd}xCYANm#(zkV3kL#XBz%k0)&y7SMt&n@b?Rc)ox_goTO%z6*Z27# z43+gjGmb?)%13>$fI3r?XPvygYZSaOuF=yq{G3$jlfmnRtnJ07geKpp#6&L=TQ#C_P|}2Wj*no_^r@+^9Q0Pu#B7s8)$_^_2Vw0`b|*62PB_83E* zXT1vR3EM%ziX1G?=^9$Pku>SNN&|JYuBp`-^Yz*$QjdhEv^jjcUgjE(V&Qd=Yak;q z47nVPG&qWuc)aI5p`y+~U%sp5tKy9GyVvGEIHq~27IFZ$>LN=W-!k?fU6Ieyx0;^r z#Z$dU!o?`J+ZT!~v+fgyS2~m8zLkG0*7t`kD045RP5ekEqA$A-O- z%4mi|o6){V=Y_qnl~KtMI5y=B^>-l;cgO{;+^g{t4!{T+dcI)3p0%lnEoD9>C`QBh zdWzsE>e^_RhH82X{`oi=^g#*ZL2 zqcAbLGCFoBWmBOySKyqRz4%IdM$-VMR`)0HPXaV~}D^tVMI{-6l7#m@lu)tuIWLtuCT##I9L2-1La6Da~o7U>5 zs2p2P02=oK$67oduNG;OaA|nzEnVHxVWw_|V|?5LpFkSqohad59o*63*7bsNJ+8Yc6O8^T zh2a3-*&q%V13yJ)?ug+GZ0FjpfCBkh#~0x!3n*>oI;L$H`?={<28S2Ufk-{Tn8HPu z1uSDU6mbX2h264AAUSA#}C4~X)RuVpLA|G zabL?fA}7*0KGP{$4HMDji4xCcu>1&O?8p;>y8eI9E+JZZ3)P`p-&PtpZ}po%8GG&# z!jcsiB~s^WmP5&h1kD4z3owFSUAujn1L}LHmc=sNcm~pO5eMZ2CA?*%S7m7N_>59~ z^$r|!719^G=m6h(d+%4f0R^4!)i0F#JW$@|&Oa#~99QSuFM(`^R)0cR)%TtJ)jh>~ zXq8RRNu>`U@l9lmk@s+!@YFK^J4XN2c;hBjX(?UnLFzut6juoa_*V(ixQ4(v_k-0= z^h_gozUtB+{L$$DD&NE};&=u?q+SxVV|q`Ut}8|quz{2gK%~ zvM8N5JA}T*L*{8=tSIr_{FJ7pq$qe=p``S42EPwmt4XzfagQI=pi7}m2HxKeIQsi;J19~ zcokzw5E=b3#<*_bOSmivN@07QfaY{vIA$r3>B8IkR^uP)jjC zBf8w0h_AvM&!P2<^C>^$mYzmlYPy>1Ri#z(42LQ4TtAitBXUCRE3K0(00&Z=c?pmR zI0WS67e>8Eb_7zKaJa_%mhNwaRUAvQLCYgzE)lA13+T(%M*~^D6t)Ko9m>->)-WrB znivxNkBBRG{wbsag|WhHl5tiLZ2wE+Ty+YJeBJ9)8@c_Z2e29aa2oMn3yU$Xjq{b# zuZ?_ax=Xdhs*CWk(iRRc!YE#h_yRr)a2woU-~XN>)QpKrR*c9APNOJkjBhIShA}XD zt)gy5`?bF2FzY$L451PCq~vTmZ}F4kHO{MXMp;_CmY?gxZNp$yZYYY~Jg<}X75S~@ zjKVkOiy3F6Z}JPu+{G~nRJouWtDGWTS*0JLFU1PTy#K-wG3HKesJ@R~*#r zg+}<0opDf@bka&Ey(np0@`uxK-=fW7*(D<~M$6MnFCs5K0{~o5A9_VtRY@Qn3oj%j z3rZ1%^xMB>>}&hyj-=J%i|e=g08otl!%xEZ@*NIOvj9QL83CLHkWkM8q@_U1macd? zc>53Oe7in#0Nax4IJ6X~fdG9ln8oo!7&ZQf%aI>6{`bZWTt}-r1y7IQCXT1@k(UC~ z1tV};wsNfVn6A-^OVw$gt(k(BXU`7HHQqSJixFSIX914Iok#zxW9B~P zF=YeHz(?duqx_NUnRQnBqzi*PEuN_(XLxMHb@@FQr(LgCXDuAViep8wo9Cml z1#wF`L!4v2h!tmrO>zvwr+L=mgrW;MjitA*4!fp|$#w|DReh!0k0A_je1?mbEx~C= zb$%5#n|`1!O_{`T+!xeWoCd?WyDht9dKREguFIO2odJO7UM0W)F<3}pmV&Ti5S#v0 z8+$+X<9sd@WM)1}3wefqTzk2Am>#nh$0Z20gAq0H} zApO(5%L*BeQ$6^&zOlg^)(cdoUk<>r6uJ`vGTp<}Yj$bi!pF<(jvzY{u2jh`XYcu>kQm1#ppRK_}$SHxjH zKO;<& z1FDR{JWAiS`nwoe#$b#N`k-FC9IDHFIGnkyaynd`0n-Uk^5Jem)knaz^wb}kV_*#~ zrgRbGSO$>1XvqUrrgZXH7`;x$(>VYm%LGsW81X&fR4H$*EJaAFzt9=Q59R*&0gjhY z&jx4?L3cJlYdU$&ncUkSFVVpf{Oky94}Q8vQKBhufnzSCsr0S%bp3+s)-i=? z?d5ZRz9SuL#zK-CXawZ`Awxk%j#K|?0|24^KoB|(g@ZuyBLroD0Mcj*e6L)w@?9mT zeh@R9)6$OS=jWC4YR|8Ay%ED(4O8M|AWfl@wX(H1Bi?cdupU}}wfagk`tvdHlm`d{ z9H+F%^=kJYjoTe3fH|(^Lr$t?Vmk-Iw86m~zR3klr*U_b&qX?|epJ_+3^F{O18@ae zLWtx`r9d&*B7Dx%5h^X?pFif&`xuzzB!r+i0E$qE^gyG*pB;g?E$vCi@@?F&;W8t@ zzcdSw`VJq|HO9DX^(mGGr79x%HDLfZgN*)-fyO z5&ow(sw4lMwsSeyXVbF)nk;*Em_)k7_wu!#O`$Z!vBI?!tc5r0q=e;i_#f(FrqOsh z64wi(ek!nhosP&43@em(L)niQ`&RzKNaAZM{lKscgY+Mb^XwSFU;r)?D&n__jg0uC zg61iIPM>E3QXRuZfFz|{P1kc8>W{thz{=Mx@1C=b<>R}rh=Jqr!Wvvtu4_3C6+cG8 z(zP0CTDE}smHUx2oiJ&IQ%7lBXUrJ?swg1L=I!8yAT0j@0=wpu3^C=UTX$sphH?)hq+^R@{epEe`9g8s`wL8YK;R zG90E{Uu}~iAM&a4UmR=7AJU=m&|Myo`d)JalsZ*%V&k`nm@f=l^1*^8GFk?JS>A|j zxg%OcXz9*dT+d3U9@F!U!CJUL0xPWG5B!Sj(SH?=KO@id(x9DO*ZQkKgX5}GuZ0oU zixmI{r_)Qn)ki_G&K#F`s^mc~w;Tto19wGrUFp~rBC4^T?F>a;R09wLb>e(j*QRUuQDN`4Fr^;Vy~B|RtQ82`1f${Ei2)n;z9FTLMD*i@TVbnL` z3qzmoTTUjr;uZ`G;U=>HF9&>{jrd-^?sKS=rRi!lizr-ZgmL|tSE7|;m23Q0-|=b1 z8FIi{;>$7y8%;Zb)K?&zFt?Mv<@Vcx&tF%TLqnzx0H%JZFu0zL~-J=1W`g9(F z@2#Im?dbCopG6GEKk=BtgO!f!jqOTp;4+jvZ1@X>VP5OKr53KS7clQtc8AgajHht` zuE40^;dH7Y4?i=VLBtSf#9!v6+Wu8S!QT)N_gu_;g-=+)F0YkfQ*9d1O(kcD83L*MuE`z zu#u4Zo5D23TvVOHXTBSf_}`iZ7=f8@M7G=;^a$)S+IyE6j30F*H2z_@sl$mAYTite zi;Z7!N8#nHQ=mETCbz9Pt!!$W$#IL{_#>{b6faWCfQ8OmBmQ|K5D3@a`wNth-w$L* zU!ZPHM?&G^@Jv8}0S6@?#%qB^o*gn_)V5LMUcmv_Eu=sJrt?5?T6!k6YB(@i69g2y z@k8T38~U4(|DhaXnsm(01UmtUmhq2<|2c&4wXW+DWBgjzby=2WNsfSsgk@PI#whEW zm;B>H80ngoAWmT$35sJNctJvn7ioLzdzHB3bucV1TJk~2@E~rB7A`VujI@mZ;@uuR zHvX$}jO&?w6YAZ5k~5!n2g7Op#J6=T4~+$ZjJ9Y~jtsZ2F{ulze=R)3ZrLdl6bu@MdVLLHKn%YR|w&pjQ$Y9dHerb*EJjMX!tM7f=+-)?FcMzjD~+ME1i>P zorD0-0*rd=thj?n^JQSI%tuk&?*hxf=ouaszuB-4lzv1$pdnFk3d&aHKr4*mMn(aL zzbH=WT227Amz{Rr&J&mMq*1?BE}SZy08q;7R;MH+3WI?AnUuO__+KjC9tgm2ZllI+ zmJcIJd;~Y~xi4jsBCKx6V1g7Opx2c&zYKGw}Ji=Pa;XQIQ;ZAxA%4oB;k9DDpgQ z>z!Wo#TkWU{3mV);A%cjoCTSH=a?=w&a1Wm!JY-s40~yXNo{weu-5kiQadY|#bsEL z*TQIvh&+h{a0?g$1%*wOMM@HB#(tsD6ELlOkCGMtL02Iu33Pk(KK)ZV)_@6La3zkt^L{P z7jOpRW#ljbakIc-QfuVGho0E?F3R|AL5fZ@#w|q{=wCgC;tQpUmsNP5xkquL#A(ZX zn#MpV4FW!|(xEXD|}bm{@}D1XMfzNI4V8JlB>2 zRmO%KGz*}}ot$5b)XHtd-yJ1wrbq32i-f9OZhI&Tqvr z&s+b@Mdmy68q!#t*JK8^nfnlp^~%AIrIXLx#`pHnSx@>IIbHm3H$rs`i1#?#-x~R! zodrO7znJW*JdU5>7cA!J@<=Gv8At9v+oJJX%VQ)DKTDhDr z02bvxk+>NBhkrEe(eQ8milsuKoCPQx04bOM_(?%`99(y(36=0#Z3>G^DyleHK7d+%gcB>c#7KM-;Z>ad5S9g5>~@)oW0E z&u}P|ZJ-fBEgh#(ly*8EHTbJR1p&iB%8^4=&JiEjFu++ubOP|Bf$2LTnt_mz4F$sq zNPO3fflKF)jo>vEB(?V^#lgcl27uB-(0S9$b4Vp>e)07z9nSR^k&1@`=Yh_(^i?{n zhs9}y+lilv=X|X3y!lbkR3=@oxNjQABW(pPv_e3>xtuw#^gq7zt2zN&nP}`6BmPug zzAu_A2<=&bY_x;yu=thb4fKfx=BdToSw7!`|M?ov?f{5LAp}~6eJejcWM=tHe7H_X zu+D`>{+YN$=)9CC8S^28kJIV&2N?P3_>a@+gy+A&S-_Wu)5pUK2LP0Le%W_j*U!xX z_*~cZV_nzJ^ZAUzCJQ|TI0A89S2X%haGVVZQJjEOKXwMTJn6wrL9-;+$kijgYch1<6Rr9|#QP zhXJdvg>U7heu!|s#uyj5j4JX7q4ts=8Zfzk8_qz0N1u*29!6+JlF80A|+-Pe3DoE3GC7SZN~3 z3P*sz+ki5m(+`*Z6o&ui4E(V<0L8!N1i&>a2LK5D1*89;=kxh9gz$T-$LV}NXQM&s zuWTeF<3Bk98^O|&pSCcn2qK6d_jHb9d>JiCV+M`J&K3uxQ!8#!L|0XX;q=LNU7 zW0l{)X>C>@4FK+$1>keM-vZZf$r82;hL-_BJC2wsI0O&x09*@2FtlWarL-{~3kh_b z&nb*Y{}Y(txa2&&YGx-19jDG%4jzWGX0EEQ??MQ?#9Dr@)|1*T}dz%6H zeLkOgG=cjr3zAUI0;DOwybFNT>;Fw7C=qBQlck7@dm~bL=NxtugZ{-w<{kwtMc*X% zNI5|_M%ZWwp**q5(drh6LxID$w|&nQUUBkP+rMEV8cJjjZ-oX z=s(2o8O5qklQP{dl?;MZj}?@4t`iso&2NEp6nKE+=BQmqVIP4XQTq3QMMK~X|7&Tg z_zv$>9b#1x((ufjCI{HyXXl{cFI2bb1OTTIn(^QIE>M@}QqKNc4nQ@l7hy-hWc{X2H00UnFN}O>N9$My&QslnY=V}|m;l={)-?`+Ro=@x z002!8bd81d5Nm<~jtjYT$*O|a>1oq@#XkQy`VXW1e{R3OrQ;M1>GDiKXgdIT?SC@< z*LD59EX&9FeEv9}&v|j9H`Oo&hZ0Y&EfI@hqa{wes zVX8n#4|x(Msg24#=TW{U866Le5rcn^Q=mElN|-fhP$_#YAH<7XjD6Mc7v1>R41*6g z3JfDbH4ai$VZ_UF0Fq&VJBQ&H!h?vUj|C=2py*4*P{>~gCxab%&dz}KQs2ldK&p>A ziq{F7iEpN%dfweJC?C&#y7Gq5xY%;wTVYyW4r60qHTbo(z++1WWNu@;!E<)(na|pH zfmEJLy%Z>;!R=y4!1%qKFL8VUj-Qop0HKpz==A_je(JM9qo3nY9^i}pEyKSW98Bei z0!^kEWpS8wJc4fe)aHr$sCZ@vU_?Rp3js1{!b5c7poZgvPH75Zu%*-1^lD%HXaWDG+{HsKs&$ zu<9S~x9vgChCh+KOR@%mufg3F^c$kb%elgok$vF4YWTCF6vcQLFgS|5Xdwta?`$-% z!4Q;z0>v<}z8`{Nh4UbN*)DmOqUW2IKo6vAo3hajHkG-v`i^ z0!8IK--7{XfDHsztQF58KFgq57vEk!{Pb+2!VNXqY_WWd>e)y?S`Xx&Z2xG`TjwfQ z(=jBebQsDU;umr{otuM!OT8_4u|pu9Gv7lfoc(kierVG`VD%lK_`MbQDSodGIEN6H z%^}DJ{pJXWNWt-n->F~G$=}K-_?>io`cLIRwNqTd!;}tWMuf7bmH~-wOLPYoHM#Sk z2qF@n*#Qudrm}5j8%(dJL*Yln4?W0*=*bDtmH<^-fZ_}Q8vh?3AAbW!;BP!5Ksy5^ zg`bd!pGN<`)^+`jqyLbnG7OU8pMJ8f8(fy<6k|LEZ~`{NKRY{{laTw3oq^QHNYIUd ziD=d`Ad`J0^m1F|Ko=SfS%PuIc`Hv=a9po+PVp!|w2{C7azZl_ z5?2eOfDMIE&JN(3;dI?f5t8wbGlu7&d?avl2C{L0hW}!JBrwemrcT0TK|;Ler2@0F z0L7>u#A^osRm*@#<~Vd*B@c*?6{n2rwQK-3_~}vwr<=}zb_})v+5m~)J>$Ri9UyiJ zw3z^Idmgk?`27`Q{0bqQwk^QF(k_5WUvFD~2jn!#QFH`~eu(x`AkD$941J6PK3jSl z^J(V=lAIx^0}KksEqT!s2U@&V-!yAb8ULr#DI5GKG(rgH z@NM+te;WM{8w0|2UhMae_W%@fibvvD!Xe)uRPa!LO}V$arNC@@$Kkk%Uul+J4|uvjB~ISmc!(DBH%hpIxZ*9BaW0SRp>f-~X4d({ z-6G70%VjgK@t8Q?;(EdDrTqR+9^|9VKiJu?I1bKzM8|$J{F4KazXO!=;}XAQypxk} z@*4;H!o|Vf=xr|xO8gJ=4gp@D`BubF$PCOsI_SuGg8cB(@v*|%fW5eTrBmq+yA#a>+h|7SA(H^V`zd&$c zo6s0I$M0o7$sqVZ<6xTwIB#X-r9g3;35ex>z(rqi|7`@ZoPm5pU?dRlO{%wrS5UwX z8$F(@@rLYRgG9@R`8DIBG8!xcVf%GI7zpyB_#hw{1Go%OGY)VTpx`?>0OuIv%3lc& z-^PC)$)t}2ib(O1Kv}*w2oNdXFGxFqEmAH8LM4gEBeMX_C4s3NPDcWU2NzU@4Tefj zmb|UJQS|6gHs##nZ0piNNrMhWxcsRGe?F$Tg0~8ntMbqmkn)>4qsITtw}5yTKpxOT z=YEabQlEI)2K+08@VVvxz45!a2fY2ad~@Uksiqn$J zXfE$TnL*IFd>FqQ*F6jm?EoBzVPk(HZxtRwK*hfWU1X1xf}+~nJ19z>Ne{CC{4T)X zKR!PGksN{3>GVgh%|<_*K0ZGFu@M+Y3vd}gHuO)Y(^vdn_nVdkd{H~jp%iLq2A~+_ z6RAi2Q=cj%NbyrkfGB@!>TfseetK>0i(u417)l5H%m46Px5}%G22}7=mgdCfYoleM z6q70C**gFT{sadfzXS9YW3;{jWNrhV909rTJ8lDh z1;01FpSJ-gTOcaO+Gu&jJta;W$J%*u-$S{IAm3ceQRtNa<9ycS*t<9YDhwl_NW#aM z$5Q;L!IiwM=-KPH9D!mdpzW951Nb}q{;@2}uWS3}bUOW+>Ya>$2rvFE%W__ppE8Yj(mzg6M~!J)e4Feq8L&9Ce#k>tp=5S31(=*(wSJ&Xz^imjf1~@-)JagUR zI4sv=C%@PcaH+oo#2bL*%{;J9@$xlqHvZFQAiqNhAL$!FsqQE+H{>NhzV}37qp@H z@^SM1!)E*g(KVxp`*p;7Z{k+U*fEAXy#Rc8@yhkII$&Lbab6h>Y!DO_^<5w0cQW?>Of~?l z2&g^^8fdv+s!rmE#%(hG{|X^2+qZyn-ymn>_mbYY{nj1)&LjU)8v4w2H2Qfto*EbQ z<$310A|F&>Iz?Vs_Q^wumS=SU7%gMHmDWmcDSW<;b#58|+EhR92*g`=X#(IE2mpK; zc-OL@7EY(rpULpwjQ`JdT|bv)NxzTH_&+Vnl6DI~;~#f9$Ux&Cl(p86h2T$v|5C5> zvpjypE~ml3k!3l42CA&E41kW|!^W?64b5n%1_-2-4=GL^{fA#QK){9qIs-vp3dC!K zlLL@m^#6j<|BrQDKVW$PwnL;G^-ClD_*=I&B^eQA`yiNHJ{rig0I1;cSd`-9zr{FazFE$JU|O+d!?gzYA+lyd zcpNG_p4tKE%ZvT#4aMI~j{*$NQK7b!J--lKeH=_%4wQsJ7~Jh=54ITy98E}Dlkytk zV!N@_PW;EVr$Kz={Sc!x}VTIbbbQ zD2xIbSR>3!1e3wPl$!-;YlZQB0QEzG@%!ap+!>@8{g;b#pMZuzJ`N$Q$q|t9YvE~c z@ia4FeHVmZ7EFDnjqoLTq7D{}$`s|?QDTTZpd0t_cKUi!JK(+iJm55Yt*Q*^bG&#* zE+`KE0=oh#%Yd^30N(@pJ30a*hJOMKJ6PpQ7iIhXpIAZxtr2)J(bE%+Tf z9{^SOjRyay(cf~$_c#Hfgpb5Ojm&sz2jB-`3Kn(*a%7SyG%YAZ0J#{>t(X6j;hlH& zxIr5W(Awc@3qdyiHygkD%IL;SZa;QYGCp#^fMd*#!0<~rGimpvcRW0-5kT$yJFqd@ zNIcKyP!@^@bwn^hzzNvS3wf}VTLx=8hVe*Y@qLi=f^e930Di;L0OWAou)=>f4B};5 zVBQ&wM+wtM0&^cJoGT0iX)AY;F@@Yy+_Q>(+7KZ5@-&9TonaaGIOt~OYn?Y|2YXx& z7pGy0<5C;{6~7hZUwsDQ(sw<-r1;FUwIfQUt zzP~e)zYQWHXJ}WoJ#edE8cPF2blG4!0w8~Q+0S8b>m6CvBjW%ZLF2vv&JGvQ;85=x z)isrRvyopI|H$P=nO%-!Iz``CgMR4T1HX&i08gjW-x~cejIA7$1rd0C-W>a43-D#z z2{3@8AIoq5s51cEAHiDg(l6%?`wee&TK43>E8fWgKpbTxj3|C>lp)6{ z!le)jLV`gqhBm&{e-~^c5|vYu>dOL;3?6J}(N;JY_$`RWks*T!5T_JPQ!Yoq%xr-}AC<^}8+qVdK9r{7;8YR~|}Eak5b5P-3dn4LZJ!G{|IxUtWp=q$;zvhBQ9(2g6|$W8?C zyjlW`#y`C0!!H5zdjN+R{|Vc>g?S)g`QHA!*ajT70RM>J9|o*;E<@*@oB$D$i8uph zSniqkVsl)Lr}D1m@v|8E7T(nX*oD1@hGzVR@1;U19F6B<`2ZQ!Sx^WV1-lzGkLsn~ zB($K8f%-{v0)j!D)+kOPWE<|hD`&?Dx?Hw=0ck&{N-?(cOHM?=dBr$D&a2x5266(H z`eop>QwYxjq$NNV(hNYjd=XUJDJU%qILGgAgQO)xxHT~EaE3qg1A*8-vEB%v;Jc;Z zcPMI>BQ94S06SH1t31%Nn#QbU8i8RoTG#%5Y9I{h@ROtffGQ8vhBW)9G*P zx}G=3K5qfOEX%JLBW?k%aXiZ{9QjXuf=)hiUu^y{-$$1RY56WA2XwxtpRUPk6)88C zIrlUkpBZ-Y0tvM#Z>L?Ty5H zg*(VGbh`1Ko9d%rJttsMwhy+9|E+$@>2&%7UNq!)3V1mYzFdq3jAr;_n>52;Gq$R} z=J?c=hJkko8fD*2?%nFU8jpl)?jh(U^&FG#D4X+f*_9)}4uPRl%@_XReE{6?>(A5a z^ye*~b^OKv4H~2+h$_bgLWk%-FtKSaP2*J2f#4{ z9|3bb3+`?h4H_4kv!NLgm0_@fjRTwsz?Xs95x~*HKfr(=UP2f`IDr#UeQ*eV+Lwm; zS2#361_CKI%P}&m+Br|{8O`5IKb7VUFxm;X?yNnA-l$EbI-HGbvLkCb0orok>U{v> z+pp!u8-dWwL$w7s$)aj$FgQ0^Ou|p-Sd1{!n1`Fz8ZfZ1$4R(0{jJcf2S3~H0F2=- zhHs1!zpj_A8&e#HL%O>e<#^2ms9*7a@47i2ACE9v$=dxuBd}?7;&oBsQ~JWVRTL#| z3#vH-yjj_85hhf!Qi|=p4&rE{Oj1?`rGcu)Py7(XQQSIQP{qfI^Nv{|pCTjCd{0 z9vo4|z6+1*ots?Vif{*D0(;kYDLYKW&Dc-jY)q##Z0M&K?TVM~b~k8OQ!XF=fI6;J z$D*x}S0IgAzSvGf4)5FtcRCy*a#taHt>KBz0fvPD%Y)eX7aB24ig=-2!gyw2Q{=lh z4+!6DlUpN!s^JetfA!8#%Msu{WL?_p(}A={EW)d4ulNYo5gHh$|Z zCu&2ON6ibvKVG)g%U|5X-$8BZV%rOR<)4V@tZ2r60?%M*PJ?yscrP3=vf3--NMYYK zN)??{C`B?LRO2{}wrNfP|CY;^!G{zvPx_-s)9RSiVIUwuige2!= zr8X2!0k%JNp*Es_@h42UQ{cEY_Kq0ux`v_Xs*yr+0#NZ5Kg}7~mJeJl_sJNjmI1KQ zPosm{Qh;h%1YE1Qu1H}ZQB-%D|JvD_SH}IO%;t@}n`5*NJL_sai@7-Xw;Tdo0*L&& z8;INNpx_Kf(MD1Dy7T%?{*ny%X~*Cv%O1izIRHmOU%#>$t(x%)Rz8-YjreQEKkuuZ zw&P0s@P6K?of+E~KtI9h_=0*Ap9Gh0Mx79oS5M*OqU9P8yi>o)424gT~y zpU=P7b^RT0_%6UU+wdEmfUO?sD}Y~VW&-Oj;MibafR&&9BI-kJS&#-c{I&Ggye#e3 zzT+AUk3btn!R&}+rJUJVIC#WRy+#p%LxJ_EZ&eV*-NYbpPr`8v9Q0hZG~cD24o3yW zFtE~@MTnu_V4y6=56+GsjY3Z=dfV|tcohfW8bi(+H7*0}msqv)YFUd&W$5P7e;Dn@ zB|mxT&*lhZ!+$gSv+=(f=>IvN&%Y=7VF>5*`LD09um8YxOecU|5+H$)?IRHjTb#06^G8Y9YaW}a?KVdaJ z30|dN?!~vmpm4#`laU70?zsyf^Lpf$vvN_&@zwo*1G(`koKSI>?W1mhD7PPN!fWvL z@_GFJd^G3d{}^M8Ap|u1V+dh|cy+9>^ zn{!b(0q65M*CoOXMZCNqj7|WyFVA$Oz7Sn#j5uo3aOLm#VW8}YNp_GN8J)S}0S5db z?+}L>49I7`7S@Fg82)7s!nyf2V7<9<;VEX2cGlGzXpCE5pd*c!Vy@s);iO;hhB!E| z$8tb3%q_aN#DF0qZfY~!5Io9ZZFmKbUOY0bUOWUP2X%I|NlOp&*@h<0oyFVZ*l_C?nKox zAR!|`bm0~wOl?xUK%RU8_ePZCly0QSKTbx+!(n8g;nsr@nju|{!~uHp_rwJsC3o4NME0QT+3t|9o0u z@Z#vnfFlipuFL?#tB@5*cHprn%2eQ;npiI(Grb`!7nwZ(eO_L zZeKCRPZ7Df0|3i?t8Ks)*@OJfZB3`d`w{#EUki_%s`T0NF@4r7kKmYsd>+9d^x_+9=(p?sVL_ziX9?LpJ7Kxl*%OPu85sAxj4=s!-QaVZ5- zTvNcLEWN&Q{5T$cbmrP?T!aZdlSxcOm=TMmL)|s}apQm(W7@@Qcb((6pvp@Uqwe_g zJ3*FlV2v0GrOExGaD2Gx2c>Zw1FNs6?!nQv6>%^-_igkQI`LB2npkrg5wpJR-tbzRRPgft7VgbU6=FueA@CZ z=kuBO+C_sPIS!x8vi#b9dAX31rw}OHi@tx6lfmx+q!)sD27rwL-qth=1tG$d5EPDA z?o}3|-1kcQs~LA^(mJk0gX<${63?$nFBciXBd4aJu%*raa*-cdF~)|`zm^{f{9Kmh z*T&J0bzRf)!R2&1{n_js1LXMQPa7f3a$su%&kCTigZ;ub%`Ev^gFmwvH5Obze8b|x zy^-r-@K&qmXx$4+$IDV4%^t`ZM8ta62cLW10(=EtpVxAr?ely-e=f`NdoQ0y0Gp0z zGyeGAUo~?9?Xnzy?h6Du{igFpHUkB9F_f@VUe7VS36w^*D@nPJoD$)x>glzbS5W@L<#t-eJY9ylojsHJ31;q8v@WMp|vDX<$dZTiYxjBxopS+?#nvRR_L?o zr_#(^(@}EP(Dy@m@mwjV;w$9MgMNzmXxR?Mvr5Z=(aGl-Jv=U!?g6hq&*$^+&AI~B2K;gZ%6?nDmkNYAW$NK#qye{@71e?x)TK$nQy8f-X_%K|5W(Q!@ zh;J9t7cS{$@s2=I%4;SvHyr>V{~Et%1CT7q30UIh1juIii{vkQqT!$F!@}b0bUJ-5 z%kn#f@R1w3L~9x(Xti-0 zdBkOif1Mj!1IKb_Fl#oDUmCVvBosQv`=lNx-m8|yLAYhvqwsf*bdWALZ3Wc-TD(=f z)O=Qtp&r$aL$?7i(f^N7?iN(!-L9M0 z^nq~s1k&@Yz;6gEl)f_Rr|k$-yci6qM*o0Vg%C~ThXahz3HVfE{|GZ7``Fu`$4#s$K{y(%CLfMQFQ1FEV zKypCa87#{LHV%;cLQ9;mzb;8~|7wE)0(Hi;0%>ROW9xh-@7rJ}XNn@ETt+kHjPJfE z==D0PTKcQ40!T9itz80z{(BrpZhyq@LAH;L-@n)IjX-#CFMND_{QU?gAjTNe4uEM1 zFmS(^`HzO9A4})nocY81z;#fLNBLEyx8#G8ZtMb2ZZf>Q1Av6IgD!E92n88W*CzoG z={O570YwhK^d10u`e_#6yv2oN@XPm9{nvIJxE)(t)@1xI%aR;`ug&oP#iRc;gMdP( zdSMVo{P^Qz=JFpfL@GfbWb{id1Pa4QAwL`HOlHmKR~>;{5Z6cJo*$NQ*uptXdsj$= zoD0o>p!_LMN}nBpxD5^na8)iNgvGl55W*MC0(>UJUoP(r<$7;2W8GxM*Rm|hS>Shs zVv-B-vgR0_0NfOySR+g`0M&Z|Qoa*V7zUc5z#@TePZg%#;7i;!a>03iEcO`rF)Gf+ z7B;+`mydz}qjjoyEthAjT2cgY=5k;~Cns*7!evLm^9^ym0zy84$nx&x3vypM{*E^g~?_@x`%X1F#I>fq^QFFv98KG=`jdI6S-qaKm-O zErFn=6{!VAM1g^dTk40oa0HSe9={!cGySL0|FEw1cRoNP7NZ5rvV5ZPpI!hK7~O+1 zSm59q-n7=Ra0I{zs9pfX^?)=Jpg956EP&L+#lFOQ(N*@S%+YeN(zoIV4FkvZunc57 zL$p2mqwCa&7wH%nSkLXa>jdNI;N}SA%>saDUm=9k7WSD8g5>b0QUC3_ayp%`ob7hD$Nw@6+Nyd;M|!cyR5{HK|`%>h`p<$M)i zw{q7QzqbM3-tifp4Tv#Dn&C@MK$-=}-vMeY0alm$LEU)PpE-{PJL`Qsww!^YJyuhV zV=aFnhahYg(|K+!HXhyq7y%dxCZRj|o9_Xnuq~a$dPFa3gqPA8NXvlIEI>L>2LD+^ z!utKPPo4=_mPH~t0>GJUxG&3+exJ*-{0bp_!p=YZy#P&M6te)ad@1;I)n^5GE3&*d zc%+d&76?*)%Dm_|HUJcYXQ2QG7%^)Yv``rgo%D{M#W3%c^jh93Op_6umJA4ti&9^c zN2o?e2XV6il zt#2*0E6dtZmQ>H`9(b>}Wi@127~E5@R8KOX(L6B=N->(PL-8nguAFfb<_i zekUL;13GWUe_jr>EQ^2>faUS%{l_)~@PS)@Cc{9P0fmjhD>=Dg!}a$1tj6#N~pDagg$gT$U=bTtFiMX94*Apy?Naw<;Dd1ap7DdAdLO zKL-vB1~lm2a`;_Fv@zsBr|?LV0#(3R`6;i-;VrIuIiJt9YmLUiaba6$(aU{?!+T6R|=F=lK1S&`0>*A>hQLdP%v9h@j9)^@^o&kw@`a zfwRG{#AE(ko|Fbmx}N69v=l#7yKoBB`zxH`a*rL)hZ%$al1ZP@8(EIfx*k45tu)mj z1IPz{cS!wh&u-c{07w4Mvb`g;%>X0=0spannd7I^DXq!>MazFqV$TpJPV+24HU!Z4 z*PH+{4yjmK;V2<1Iw8hyY3FzktD9!JALz;NVjLqC@V)bH3>BmZ~_jkj7H zmZPQPW6c&Q>;d>cN7?{HHsgO?SDw|&m5(vT?LEMAdJl*k{AweRBwv8rUopln;O}pm z>B~CCgSTD;2al7Ckml?i7 zo&bL`uha6Mu@JJnXJ@1*YDwxWQS$ss>b+aIkyDztCgnd1PF}m$Jl)jKp;#@$H)8}YAXTKDgfp= zZVpm?!yuA#53_r}6pj}&0Mh0+I`qXRApF9AYZf3~OW`!@cA<02$nVMkF4H(p=aoay z1Ey=pgDTr#y1U>h9Dojbr2Y>e3)3ZA`)hx%xQ-C%;i1U;jJWg1z>Y#?T*UoL4tfRxZW)|7nT>=lpW;)&jMJ6Lh+tZjPWx@bM(J35}*$Xegkh?hCrtBfPCO|TDY2}Ro*kA@hso9 z8d5K@?QI1bAx%)iM9Ifo*3Jw2K(ifE5XNoCLg_GXI>%>og|yirh_TugFx9b;K~OHf z518KV;ibSQ;CE3c;37Ke{H1T470?WSvo>Z0XoIySH10PF@TW+5phvdUepY^{fmHmJ=j1RO3J{%YgC-VT5;u;pcK;0#e?br5CrI#0Z0b={bdSjpxbHS9b*jN1$lmhHSvc za%V4g@Y70woLNXdL}kfui`((r!Eb%_+gkct>2^96OoxHc|CS6;k5hK2L)D*nJp;Y? zUOgTL@8AH8DsWBle;?S+Kq5P)N8%^RP#OJXgq!tS*HuCY5<-Z}vP3DJfwcY~NBj%p zKa@*msBR2V1fN@3 zpi_R7F@cJ^db!WIPD)!%xfdsOytNFds0SDg#j%v%3*n6dvSF~6?+6ux2r=dlXrXcN zYm*n1@gKJJ|AqsAW#EoLY$W8ZgE34Q9jxSo4DJd>%03#$e6LuZ^ptxUV9S81a(Wn% zHO~y-+^9}gi?Q;yWCiHyCO2a}vX9q9*&(rZ2&}C_N45%2PC&9N&LSe4gD=E&fxM`v zf02WKN)CXO8v_)5kggwVC*T~*C49-yM_y|$02lB6iLvhA()Y@-s`FDE+()4}%&yu4 zDHzJHFvfGQ*maw3TfL7@p03d;fngaWN@c}>KEWl>`uN$e?5W<-qfbUCI4uD8$jHJ320!8%MfZo44wQrS~`e4JV92a$i zU#>L8H%I@qK2`&Dyta0JPK+25K>KbPEC(uQdE<1?IZ5e~k$|&?Y1}{?BtS*9g2BQY z1+am@-wa^`Bl9zakTwf2-xE^WlALwqIxYv~-NK4_ZX4M0#P zs4w_O0Q5mVM~){h<2^yb8*!XZJFd8kVG}&o%CEuEH zB7CgnK50E;B>a*$|cJNFJ_g!%m&u6cr84Y^I_H03G=|GI7v5*}B zxfln6*^q$ZfzYPR_R|rS{7pNOts(48kXa9-~0>B`smJ!5y^xyo+ zg~v^qKz&x`D2NOw)`rHh!;s9hA0z(rXNKS1OLWE`kQn(^0s0x+$pYpEp zdpD05zIX8{9wf~%fHKp_|C0ViWQnCCV2=E2#OLzqKPzJQA)V%MRK$ZH z-n&XTl>Agj|1}|^_6Oe^3%>m4aX>_#brvc)faPd%fHJq<8NyM-)+|6etVZy+BJ&Jh zgdN1_T_F)L4#MR

zBm`R65ryf#=flu{jHER6$eg8+O_fJX+^b;2^aJRtFz&T({5 z%@05AK3nI`apIFjmR6q0YmDe`;c$(ImneNlKPo3T&EP8=_C1F{<9T7k23RE^FcZLS zTg#0>@O{9K7~>kgcl%M71WRcX6#XR^8IyEzwd5E1+j|!<);2)F#qAuI{R$jsZsYxF z#1;LG2P7k`bCwxBH08&oIakSyd&rw8@?;J`XBp6tuxSXcOlm3zZw3oMRPsCbbqJ*`n`y#2>%YZ7QL#vw-#xkUGPLrV^wLwtq zXp)|NFb2*d`MscGlrVl9{vVs{IW5a_4&`P6Jo;bE5a!Bt35g3N$MO$fCvIYY9zer{la1f3jc%Wx?)^P8YcQmHz*WjbY?aC>T+CfOX zZOsC(V~efCYfFH6#D9w0 ztn-aHf%6=%9Bb!QSWjlO@?u{aX%B@WSDJFj!c#c_S3(mS*&twD55z6DBhv(%LVEQ4 zF<*XY1AO5Voq(+zu1DnzY~)Wf03m$uHk1wiP><;05};gfsf~XTFw7&3&c|4d;F|_N zro%XaX+Wu+jTXr(#|Vy#J}Yle*-kBuaqRdxj4Jt&biFh!+0ZMaP#~5w5bIIJmZ8AQ z1JZ8|iZg(9Km!4`4o1UY+azFSm#`!gtapHVqk`6QLF9ZPf28DWB@;?2H%I?9un{n= z#7Vxi&?}>x?%5GzF;d>rz3S*c#v$K;KUj{r3@Da5ns)pj5Yn95MO4aXW^Ro+t{NF%Lz4tdSK z;CeuUBC&C=ELqaBL)2>=0js>Ha{vy08Mum)dKLhCt~K4*dJyna-%F%f0kPNrMcKaI zyHy)s8cs`raAtuGeC5A zKR<#|$6#04hG>Xl4+M;C7LdxoIMt{~VTmh-L4cK&O%A00v|HG^uB*0DK(Qs@*4SdE zFkmAumqK|kY8>=74p7$yZ+)T42q}548T;K)J5;&`&#|0aa{QI#2kXq9L*2?>gmv^e z8spyq_UuE!Tcr#PFO2+j4E*dm2u50q=L;NL&v4xGox)`~a2owjJWuZcj_v}O+FEct z>N9?pk>6SloXXW~0k$!i#})4(jTmW*Hd*JXf0b*fpmbXQ^^Eq|i|>TpL{>bV1JJ>4 zAtM*%pVOp(?HI{h7}1Ha^v_F#@{%CU3E2KcHvPLjEsI;Z{Brg-l0|a0wuz|qFe+XRpS}`N9El0o{9aQqD%L0{a zYO<-N$RmVVqpC$9%Z@6;C4NYrMCGDyh@MU!P0!(#;omH@;gHLP>)NaUo}04(=@__N z82xa44&#*o+S1_sJcr9_0DK29@jY~$`vCQau8GApMAzLG=X+tA!O#3O36J%AA-V}SBi zSuGim4R;xz1<(ct0?7*X-64^@Y%rHaMnbA%;s_cB*#Qv4H~=HT>O16~y8JKJ%70`l zU>-c^83U?Jz&gW#E=zOGL_P6hS1EABm2NU3*Db za{`J{04WXsME>+2;5bz+8U86g)w>wci?;EP?aCaHzA~<615&t>#!9Q5t3rWE4V7i# zrL{#U4Y#}3FBN?G&s|_~dBot~f6#U({?czGO1SLY{)5nS zBD(1kZY6t+XY|lZh^Q~$r=XTYaP=}E3gbTHXI^`+&pelMCZH&v@*v+eXFsHY0dA9& zx}TQ=FL0a(0k`yN=-(<6+imK1g}>D?g!PR75xt-4Wf|p~?&o`8hAA@Tk_b3yl+FED z9JA0Nd7{}O>a_>atXHeNr*r^D(GeP&Vy}`2c>Ho1=_`Z;T?>oXmItvD5MsHEr&zYL zm4!r!F}Lw z<`ks2jEie#0V1STUkFyNm(mxbgd1m4UXfan<1ZTqTNxo4{;}LFKyv`9Hi&fjKVsxp zBZILv9!#U2;SmsuJ9N;#Ttt{jEL#RxiG z%6r5HesRwE={&-9s)0Xr0=DAtok3gyu+V=JU5QTtxSqcp4#!qsr*#01ngvJao`lPf~x_EH{QkZ5iaDU`uQg#&?wXg=URl~nghGxi%a(%V# zN?6e_qs_fODd4034~Y?jW7H^N8K4aoXvPOVtgV-XqahdAK)~}nSRk-ZcrsoDHVdHo zM=m272|}a(9S0yCA_p}E-+TY3w;ZrLGT4$se2n*m`lq^Qc<;3Ez3CkLoB`roQ3l2V zzhW%8X6ieIlUz0$^K8V2&bjsepLVVe2+G9<$j9kgQaS->vlIh?q8R_wH-(W5&7aZp zJ!8Me?;hVxqrZ0!zvA9=8wbKt$KWF}!uwg-aCceqv<|>1P&mlAfshDgISLXB`LoLj zka&3qAjtO=APRv*UO__BFB4xbh6XwTLTzq&|M?gm?x-BM6mM%(zao00oR(5YfyIQ! z>NlMMtq;aH?Kld9?*SkOk6faVxh~hu0wDiKw+vRp;GYc!ZPYLg8VJ>m4Fh%{LV%q? zwr3uXxx7?Ijc*0#qps+?BZrN1RTjXtuTj|CwklkS-zy-@d{nJ&`8ODRm^IE#LtIU4 za8}`43Nq`1+@dt8PuRq3|HA*sjQ&;pp7@D!&W?d515}-_C8K`AaCV?ro>UH&mZnu7iocfsMgFID0B$e~ z&`e9|3Zb*b$#y*C1c-<>D}cs+F&khw0%Dy5`4O6Nb2%xMoh1<12vCIp#dU>BFO06s z^~KYc66bi6*cyEF|6$PNx5Cw+N7?1au~`6h27v1}DIcODFRBs2bd8WQl*T~e2taxs zCBy-SUVpG`m@x|WE(f$^4a$V7uJkLyA$=tWNPbvckH$64NGt850iQ|f>rk}_$fM;S zEz>GTLwKW9QYR$=bV@Nr2Kq;^RqQz^oLl_2w1wl;C3tx|2zPQ+_nTCaa-ja z9xFU-@wgd|KdXF8CcwXNeY9pOY0NO{AJM|;TsywCENI#&HT? z(JqUmm%ytXYsWo++|iAR*c|mZ^wnwm(EfkOdIQEKq6Af1YA3; z83>V&qdi-=6|Z+4%LU|}!qt&wfJHhbPF3U@M-5q0P@ZH=YD*>G@LH5tjWfdbqn2qMSfy4pRc z^rOP1mVQ_HZp8J{X!1jpbVVJx4aRk=d(aBgWDta_{ij`L5SEQ{Q~9w+Sw0*(%Lvja zR~5#`BuoMY<9R_eh!2n6K#MQnqyM+T;C7(MQ#D*Ww>S;uSX|Ng&-^a9&gVNgFG{?+onNDj)(gHv z@6URr{5`)b33J8_yVqd{Q0m$*`W|-<>V6 z%A1ipy)dh-6ka(Aio7ZMlG1QLtM`L%451mOWGMpPVg^7&RIfipiI`LT7@X3@c=4>$ z4NdVPV$TGKNOJ}N;-koAbU*z=n8-yyRsvMogs<9{>VfB?KhRwVKsgo;pCFu2Iat4< zt{Ty({+w6C;R@FAkjR|pFpvRe8cHw7eTYlkM%hvpR?7jDFDWdK25Ry^E{b2dB;211k5_T}2&27%KUOM@Dp8BAZv131>4fFdo)j%+}PJ}AJ3gYbXZobdqyg{Kuq z8+`AD$v}R=Yc;}AmSP;A7KRV^L7h!aI}|r6cYXpLehn2N_DFM2PZPcB0H`09mvygF zE|!ISDvWt89mG}qrGH)$%;glz`m}2pyvDG~PLSFjz`AO-Ko2SxG;YfrS4TMCn;odG z13#?1nr1Mp>JKG+M5fHZvQw@S5+l`l2?t;Rn&9aveoVt@qtv5?(@wy4Y;9+jM(XlD zz~mrA5CWo*KLv{tZnd>~s3F`kx=kTK`7o|0M6hg8%ImgcN1Dgg$S;oB-GBzedoX1J z@tXOMX$0cav0z-hI2mZ*W15z1=*=FoOyJ{GZ`1f!{`Jl(d1uLl9`7}|VHpR#GWeQW zcv0WZvDUU`nksO=Z0gFMM<0MdJ!ZtSkburd(&mtah*vN^4fKV?tagD zrtdv(_c>L2*}OlND1*ra2x_opn;GG-M1rG;iGvh66BMAq=VPTqI-Nwf0mG}lGOjau z(T|plXo-%1Y*~f3aR7ow1QSF{lo&I7QqD{if=SWl2OM?+L>8m|hqz?!f+puBWZ7>r zX8u6{6mg{Ox{q1|x-tMXgWH*2Q?wbZdimMO`!AT@|L|pmG?;(qW@?7FAl(CoHUzhpemy7=2G3 zyU3TfaR35X1chQu6ik|CFDHN*{!GCy3{AZJTplvMb|4Do&-Ebvzyx{KSDI1uzh-oG zOO-1!E-<;7PC%fLas~1z+5ybyF|gMMA~KBslY#MY5l$18yiD`MFyLv%`vNqT^RMy~ zRfVMLZaD!~c+nJM7%)d*sV^7_x{i2l_9OI@4qhVzdW{Kbr6uL-x>kys$q*uIiX?%) zp(IeIo8Pkm{IzS=0%I+}YdQ_R){K$B8HY9{bzN4hGi?5M-~NZX-wP9|R{3(X@&uqr z$?w(V;G73@^4WdSEOy_}yQrr<-bKC*g*kClmVhjXgcbZqnkcF8giweC1GB; z2TR77`CVAxt0G{mMIJ!QkZe8NYJiEDjIvzAy*}}-m&TTl>ZJPtItPX=4hl>r`eGwrTp z`Bf$%SSLYz6|^D$g4ZC=f|QISmal0@lCUbRM{mU$@dZCATFpz8r=`KmIiCHTG|cWO z>PPCU>7soa?zbGKopIpUB4VGnQQc5Dv&?$lmNiooI;422qw`c%K zPdqEbq9g5SF|!r6;8hgwhhgE>C=buHk*|Lh{On}I=yaIm>$#44l|U5#nlt_)bd^wF zFZ`eD1M*|3pIQ~j^(yM1!yA25bOeO=@HfhfB95fPJd1cMPV0Wsjg_aR= z7I-|w;#{7CcY1u&7dRp-KBpIYfBkh&-c(c+U~@v5Yv) zpBQfP-BDqgj|^V0X4Nsy+6hq5r8a+8b^{4VeP69ea2QjS zEKup(act44Vz&b8Pva18w*nv%S_MebaUNi%W3LCz!8xoDFnaa?>5#@qBO=v|f0B7t zPs+W2X-<#zptJsszR`7HiZ1~pSPC>DGa-#)QZFB~Oj5_H4N~@pMKkb%Q2Z-W^YEIy zsyqnqs~}nU5O}Ycy`1AkrDrPvRhwFIB8$w(@lM6j#pAUX zmv1BaV%=GLNYi~W(IoH{^E<%OlPuo4w(>;%YL$z8ro#o&>W9GiJYTyj0{MDHSgzu- zuOC(jG9OPWkF4{TYmsWDPgELrCqMv9@9J>mIg2MNUWRMIa7JsTkA@MxLwXioHJ;E` z`KmTqGz=zPK)!6k+pYlgoChES+`4DsmBPvYL@`x^6~iJlDy*2*o5Qu&uJ5D2BHdh` zIolVg^Ub4a^qKBE3=^QYo>|V*D9VWQ7rwud@YDTh^%d(cps$`4^sPrzU>N_; z#hU)_dA=-pnN^j14Ig8EIL1w-w(>r*HIVTzbNoFNOZ`IRM4&DS%I|6~^nW3X6Fd)y zk36%`Sm=P3Rh>!CA&b`3n{}Lyj%EYd(P!j@Dq|P+M9Dv?}eV{>+x?*3^P3>U2{AeG>PPc@syWZ_f}XcjRBMgjNiSt zgjDGv@5;#c>KC|g^%08~65o1O2pvqvN z<(!jvf$&7~!uZv*{)*R72fOEcbUx{hwX6SDIjlakzB*2&ZT3~8U$s1~o(ueN++ett zA)@lZ;l#$5J6<6lU0&;&X4i=C##=i8BCEFo72)h22Z;K|!J-E$hAkY&!i?}r@k+^z z788elL>MHvR7L;*%7RHm zK~w<{dAJjxqx67U2CPb_2T&pdwHXfa6@x1#_Lli^ZyyQ=t30ostX-@h7=6{BMxR&D z1ZX|F0>k)!N$mN|82`4)auooMd!#|$U_61m#`rJuFbgwyb@K`#krmA74{rxzZ435C zZ@=FkUaI794#zN0?$f*-ysMlE>)0j0=x5TuJVXBc3jR`II@^RdipC4aF;|UOD-5pL z);BbYaUZ?roACA@kwTy9;2`1f6G+vnyym|rx>CHF`kCaCZ9`p1_legw{)>zchQQhc`cScjitLy4s zr`s5=>kokZc)rVSfh~73g9b~O#E?F#asMkSEKzQz67u6)$yu45ve}F zx1`hU)%rUa-gBMO{q?;I??PM-L;htS1zp;#+9^(-7X7O_x(dtJjL)^P&BC++j`y0E ztu%q~P(D!a2+uQF(S#*q0@vXc21ru{Mbdr57NCrvu@^NY6VN7jaHw1=rKPVGLG{yU z#Vd60|5y33?LwHJ1nP$UQnj7*2|fd_Ul~0OA9y`+cacYm5*>Q#hlLV?wXw81(UjI;i@I>P!b@;vChN>hvp zk`BjK7f-6ZieTe9lw~J<7e3Mf5LxF0sAsDOkQoMp0pphetOqpEE`kdg!lDOo3*JY_ z`7r8M#X~#IelYs1+1G^Mn$PtG741jkQCooszgp3iazG^l!Kh%6w|Zy`KGoqWj`1#g zo7bupLQ)3(E=W)PR9MjmteqY$_CG#2h-dPnph*TnBTX>LOCZu;Zkk9u$=Bm8rVl)a z5NS|X<)}y;yIyD-boshz6sP!`e+pWujrPb}02#fm)7Ccv(Y^`xl@}*Mo&$R>daMAg zz%`D6$V3Ah?_F{R%4xxqHC@8zV;umIekVYr>hQ>euLhvh123fx0~zwHl&nZKn0tS2 zzKuF;YL}F7`*+RYAIAUZpqE!8@hZgI{+eGPJkuktp`^U)ejhHmI0dTSuagr2q6T?f9;Rvj|^qB zVQGg&qx&V$H#$70i_jN%VI}+Vc;Z%|N`Rx15E#!SZRQ8$XJ**zY)qcSIN(qEbI{x; zoSYfNMtOAB)sZD`+eyD`dNJsWX9Q8Ef^LijFDw$b;05H8$5Wv+k$B^o*~p@(f2=Y6}46EO^Z@Rtsq9LXsbns7^zhw)UFkK zQ@d)_ialDC)~rp4Ek>=H5qrjtmHg88=l%KozW2X8a$o1(`@Cn}d(XYc=87rGi++hj z`BKl!y(qzv;;@b+&q1>7D0tIw(db&AIp7xzf(r}SwVpeZ)89p^wJ=jSHL0F{ttMd zDPLR@tTAdCxFEO<33|oy@()(xCaAYa{!wW~wx9m!XDNmXgKjSXc`)*;>!+#iuQsl| z6djk!^|+0P#?|;qaHynmf3z$(7*t8g<~k|;LD}rpaW|GvCcP?O{ni&}<_F}X1)q2G zP(*`<+hpz4)#Oi3+WXXX!$9TF}&m= z1saEQqN^KD!<1rOwP)T^MHY^BFgt&!f)?71KL5?!E_3C3=r9`ej_E}S+}OWV@L6*} zxvz+ou3R|g@vobgrAjY_Th9IXUL=ICE-n=aNN@=Qid|lO@cB~5vA@tFDqMuvX`su5 z4^^lt#wA~#Wwy(J*rNuI!6)5*pAn7D$3_PZw<}H@rroR$-j96JfQPNmr49ifqj>KHj;VHC!ZRSE4yOjYZ!zfBV+eQqiBfhO@q|A|>W(U@jdFN|;zS zPSgud=+~rR3J;;89ba*eDjdHL>P9(>H8ji)M zMK}4SFXnCW=CjIB-&la+FkdUj_63i3N5NgYp$eJhwi97iZL_0HY-&!gJkg;0_jsrC z^42gp;+F=hiZ%Ir73)TEQGZmOs6_r!X}*23ATwU^sf5jpg#7A!J?Gnj_i^kTs+-k| z(~Q4jOgz|)9JA?utyh70CwIAQx3V4gHGzHpxzmbW5p{UdN>1rJipjjCj^vBhTfmZM zVZt$$0mAD81$Pp-evE%euX8ysxAZQ< z>RA;N4+j>a0*L{O)TjOo4t`z-_U%DK+(GNUWc?lc{m6 zv2pRE35gG)JQie(HdV2iThX4XMaC;qiJ2GMLu>OIKAkyOu;KR;=oW6jvQ+8Klzo+5 z)ktBPmEyRX$1ML+d(2=;^W4<%nR##K()|=WkxI!{!Ty>lYzbXdB1MtZn8w&!KvJyn zfVKbW$0_?c+sNLanS$F>-iM;a!!%Bt7kb1Mp6v4SE*2q<{QQj;fAxv5*4&u4_YjpS9 z*2{jiyQcRx%>!39T9{p*VaO49s+!nDn}4w9yz3cV7Tiv62lPGa%NqsOjBHD;RD*yk zePcD9&5o)Z3myJvCpn)XDH1F2t?-BKm$#tIb@{qyayVI;Y@C;{Mr>(Ge-=%$GMv~p z_l;q}V-qwbW|Wk2<>$Jyz5jiO%}OeXABGh1q*RN0GH!}A1!tx2KC>L&OE!onF9MAa zBh&pd`+{`YozHrS%eczxQxIjUn$^H^mHQXZG@6j*Zx~sBiGE!>o;GrlyL|8!baYF2 z&5|fiPSY$_R;02~-u4*F+E8+3F|TB?u&tVgB{1Ok;}+h_qgH-BM$VJC8u35Eh?dVX zkH>0a10!IrVF!xe(@N?vLmvo$b5H+zD>~L9TN){}9@u*nM!a}uzewsAeVPIdVM!f7 z%UbRSax@FNdU>H~YO1nu%2zgL`;LqUS(_|WaF7h?!kFy|p0jzpw=?9i!_2TrP?Z53g47xs#cci$o zNy#yrNZA+#sKLjW(SZ@ay-dSp&8`)C&ay~d0>9x?avO&iVE9Z%r;~&!d1YjIznQS- zA>5uN_2?m*gYw|nUq0U_4(D!lGb?GG(Gx_B1<351P2xyf$G_tJ(ZzR3p&mxgr7tMt z-mi<(pk@XX9IZ|(>{$Z4Qu)5L9!UY}Frn->nqsuwWxeH)gVBfzHO1i! zezPX-Ppd8KAA-`%N=@9F*$!wx&GIVXW(1cMw-d)Cv0&DyhV5W8M~(Q!ckWl`)df2T zWBM2?qzjQ}J1jn^*J8LmaYOcENQTE$BZ>}4LI2Ryc8(4lQmz=DP2D@2zZ+FQvaGJ{ zEz4}K_spl-sfJ6?tV~A(n@ELqfQ}duakL(J2Su-S=%^+Ac+^xJCsTgL)vgKCC}^e% zl~Ins!`x%*^rr;oo@(t+ap2wl+A2n)h=4?5*+H?g!)nsIk1!P%*>Sj7gV*__NH{fs zSbJJii!bBB7aQtHk+NFpBXM}3_JYh_QY=0eMYf~PnR{gW^Iq}jB0r}OBkHbPnRB=n zh$5fdpMIAgf#*siQxCit755G6)%HTBUyhpo1T8)j1lG?2&M0>F6D^u=r zC`-@Y&mBocgMo4*7w0-NiZiy&m%pP_kVKaK;5BPU*u)*V|(N#2SW`f=kJkW6rq)pAL(jojrjsmKoTu4QYc>6RT5w zAmY!%(h+B#By25^axVpv@7z4flN95>pifr3>ktn1H-1*%%nppveA}xir)T~yk|2E(&#Ww$jaa8^QPz;Asa7fAg7zZRMlGs4a>-I&w z_YZfBE&bw9`^l`P*;se9D%wg%ErGZ>jVTxH<;tPBanNYL-zG?97}l*N&auKdZcE28 zYdgqlK`uVf=5^BXT;0ypVzI5)g-9oyo0~WeqTDvmJl7;L6zqnY(P_`>0co|1O-&vr znDS(y2q0W*FM??UD+fjQUPYfVyNt*?4{wldV3cikrpCZ_hVuz?mkFN+9SqJE?w=2f zk=;+I82+U1%wjOF>b9Nt^c^`Z#Zm{Lm(hIMcvwAox=Cap*zJ9Sy!$SSZ19|Gld@)6 z;AG=5d_>}@per#vC!*3F@V&v}Y6=>DM5Kop)d`}btK=zF^szSd{sr(1{4~xhW1|kX z^n7^bfniw}crE`T#&zPFc$S`C3a1f4ig^nhVFxfTynIHN#p&Bpe6}<}B%$hT*EUh7 zHSm?v`HbV*W{#&CSIARwe0yJHif2bn%iD&qlU%g;{*UwX@lwHJ$Uy~0*5%wD?oAYX zNP`zp`C6>6(-7|lj49j8alDG5p;)?mus7VUB-#@^)sd7%BppyDSoP}xcvITP+q>e6 z^nilPWLpYsIeT?hNrCuI<;b8)A-Fn(;ogAuZ2rkcU2cz2J(X zi*&Z0y|ab0{i33c6m@4u_g2w`Zgwc72!QbcjNHt1Pi#nuCyFzBRVm1jZc;+{NgEN! ztQw04=sj8GW z0Gt@0Y&yh_C9?)#8mHTJBP+-Uy(@I=yD92Od4G{qy-u$^oEyUA9D$Q`!*vtAC=`$; z!~1kPYOZab+InKUsp2Y1yJxC?)FY(BH_YF<7qvfMFDi1U;K1w8RoC&gCc7%QJcwL+ zlf2k|iHa&C9>Q{G1wUmEzVARbjMubMS4wh>2-K)fLrENZAMVpoZ1HZ8nY&Nb@#*6- z^eJ!66K->afvZCBlWf<_^TRsoGLB`q9h~)lG(Rg@-Jv42{Iu}(| zY4Ffen46m~S-N6U`JUHD6kCG!9UdwdW|3$H%2bx3c!w(6g*ov8>)r*R9vJpBqt4;n zhhDErq0c}=6~kiodg-q}&BDMIoOQFu9JtZr@&yUIf2={EX>Kli>Q3?`-h*uI%6I!x zL}9V$QwV{o*^ie!sX6lpHvgdfDBC^&&m8iKyB-d0lW`hy%2lS@_2QTl+MQ$$RWmV; zP^I;yK>yPVq=W*lA2|_OFo7JN&F$MKH4j~D9ws;RBt{6DTb&h7R(oF z2dTA=ek?dSmfo&3)16_Sr@J;K__4B}(`Q|;W);V?Hsu@-_@t3H3sQ)m+x2~&s(F?) zNbt!AkW0da&exz4x2=x;4Le8;vb+VyYk9RF{*y$KP;#rzJ_PkX5F=@+F~sHl3Me=l zO-i*N$%b4>M;th#qbmQ@Lht|LXg@_d8`DmIHn^jzIZh=Jr3h^cO%PXf4D+oKk1WfN z1315et7hc9(Mp?)-gbw++_{?;LHdtA5uo!X!^{w)p?aX)v1pYkJn$tubp(nRZmQEB z?IsP*3c9~xzV7gt z>v(r7RN3>YLejY2DSPGvHq*|>Ksf8F;@DKB#aoYyKL^22xRM@BOrb=%upDH}D8*~* zmK>H|SM9J}?-c;HxyZc!^R$Trj$Mo(rN8l}5tL=g^^i1?9TqjZag`1KKA?=LPuXu- z!t$FBxWNN%J(G_PM71j z-I*q@#95qsz$I|mMnjPXe~np5*zzuO@cltPQU#-j-Z(uvs|)`^zG-YLorf&lbGW1f ze-seAiMon=_|8YnNf(V5Q8;-JZS_yY_^11B_D*ln$Q%I}1rS{i&Ywue;;#?h>jb6P z)aLQHllk;xI$J){KY~xQ{`5{_zh=1>g7fxMavq6su}f4g0AFz3D>2n@{l~ajR0-~6 zPa4loRKRtSDU*T(18srjjT2TPwz-PFKJir~8LIJZraI}MR3cT{>qy|hp+08)df_91 z(~k{Ibfd{9U>cm(MToW5bod)MTevvsQwe(UC^Ya5I}2fVfNf`!>{Gc9dgwj;nwl;D-dr4R_Bi2ilT0r807Hblk-j64W(a%a2J z{?f87NrUe}#}T4~nq5`eX%=4#C38OWy(19eyq}tGDtPr2zBmwrP%_G%#Imx}wf`$l z076in(Y;FERkm`;*%sghR>aN<#_qzw@^D9R zkFMku=W64o;Z+&OKi&Rs8mGA_lt|bs@3+zGeJ6kW4o5nrY46o?>|cTg6WQ>%4J@2tk;y?u$!Z)5bPdYNA@#0p{U$|Ga5!(9Jk5o ztPm{2sbW>rVG7LT+P%<{LFO>#PKyk9@lN3(LDb%4cuD_r75=FZj5`e^Hx42;5Pa?O zP&oHl{d%UaT=QaE+G*l6+Lt)duZ|6ucy(_`i2&|8_ltj{;Ky)#`t9X*LPB5R_ChoD`XhTKU)95t7v4*b z-J3e&>TWeC)wG|oX3^DsjrDH{Z>Nxw?#CN=P!1Q9QNR+i5r;F}!LWxWf0@_)1#dQ< z|FVeLKSW9DPY!SpI+g4z@lEX?VB~<|WwxwWDB3JmEk$C1rk(o5OWEv}UE1;egU7kU ztaz@2)Ld9S{Yf&x&0sIlyZx^n(u59Ex=y2%zwO)0&vb$^ZNzs&RhK;`)!WO)a=I}4 zLpjTXA3y$&(IV6?=}=N2ar1`wS0fWQz>hb;9|0{WiH}Zbvy~Hy>Hn~OdwV7-ia^Op zaCeg4Gkeqq?6|^n9Q;#gR~UI=pXDk^`wv1I8b5$15P3+cWlnnyGs7s4!DhR2O)M~# z_b%-s+IqJM#_fNY{~z<-^HlkR6VWnv%uwbIDX}c-XuGo*gJUGrv;U6+^iN0#1)#w5 zlY{RgkCyqftH*R5nxSS^C6%-ijJsQYbLDM_0h;oE+JaD!-31`hCv?}8Q%;W1RJW?o zyf!P3Cx5jFlU!;4e^#F`cN#A3UJvR3Btyp(#s2zSb$HZm%Gwf=)tmj zR|L!cV_HJdTVf|HmEL3pYprm0ywb$*Xa^Zif%H2e~5rJ{KTz;9DCy)3Kd63(7F92l!?Qwg%FIzHw zM-mNQeIWKe|6cPS2+Pr@#}6X}{|9{72fz$vwO5jS}hGXIi;Lel`7UyIbv_fXmsjMx3x` z1^@pQ1WhMC&)uM4$N6$z?_b3}Cije#u4?K~$@*Wm@PaFGrahpO#ATk-7PLhb|KxTj z|G%+GnlGVghLSjNB>>;5TUzXhlK1Slq z`CstMP>!^N+;RBY2>f^~Zu4f&O&v~^lNh7j^fku#b{CTWVrhEQd6Q_z>PmGCW2V0d zVY_IV-eB8VqmlV81tR@#9ToBtc|Kp4<8u6PL?C{u&9r?f!My0rNaotT|A*3We7&TI z2262#@r{!Kx0fWA_ry=0y+w>Ggy$ksi3EQ0zmo%yUg#vA?jR&kM751AsUAu1$b~6o z2Mcls|K#}J(We5c57;_iA@Fn&_*a_vf;Qf&dPdISN;v!U3T5oX|IUDJ=YS#+uNAg! z?0dU~?d|WCGR~pXU-=rxoR_OeHurk7Y zq-)ni<3AbUm1*!3I*4Fi{+RbeN?0$cC4!rT_|V>7manB5e*hqK5R(qQN3j%)AOxic z3Kyt;z~me#oDTk|k7Wpq%G;&fX%V*t5R=mP44cW(TgFcPW9TzDJFQl9OB|kw6Q^+% zPmW(e`lMasy4p=02lrPffmX8SZ2F`uFzb!8_pzvdUrcpti)0u`;^aAS;sy9#Qn;4+ zM67R#G)7O$oIqU*rB8!nK|py3m_oU;Ob;CN;(eXYjqI_NvKMD6_nR*b!sxNkG>D7p z03*Opdqgrrg?|4%rd|?p+TQ*XntY$V`3eT875F=jU7RH>QEQgfBLYiC+or$~bUk#D zZfOni`oXpF?WQ_vcO;_u-!1ayygvrBS^Alqa}VEFA~z#=2TE1L4p)_uS5t$h&dT-- z{Sd*^i_$3$$kMm}aD_3TdO1J{VaUt21f@uq!d`l~^mlkx9pG=n1ItF+&}C0}!)u-Q z>>`|9$#`lwB(s9(yOl&RTJK}egLM(Yy)hl=_3lmb#Y{GQ6B|yfo-N$g$CLVo=dr`z z!|F+P=odl4C&5%XxxEQpY-gl7A-ZYIp;O4vH?&@@sC%6XkIbI31bdl!uu0ZJfB_n7R zDsb2+hy(p@gnId2==RGvynY0pZZ@*K#%V6Tl9-mW%gvOrpmBha5@}=Ri!+LRCK_tl@TS{&)>^y`~n9%^KDm}?dy&hYvda6n{DNC!YB1Z$sEmcF-pmUp?0xxM6*Z@=% zoVa;!RX6)3a$$=sYDIn?l`p4XuT^`oi@uX>Js2~8Q=-EfTi<1{t<<~Y&-*aM<-$L{ zR-x45#1V&Ii;@RY<6fgKQo0z(ooRNWq`7da+X{SL1mrTH8yi0SXgo~>{;xEpDL_m( zjMf=vLD#_oF|QD;@|Inq(P?LJzkE+|w`~%$sC}w(O{3U|yf2SA5x^#YLiu5=vcS=hIN%E#pF zjM*MLDZ#9;&i9UH-UNdYa~u%!aW-Dy!z%Iwl`DJ*f%N-Ge;%lih$SYF2I5IHY;&ar z*`8ve)l`&Ncd44o67-F8Slsi4j}1*5Q^~H6%h^Ly%crYj zZ-nZS3jk0kyg?!{M`Bc`$zhZ^CV-Qk-AY&n2cESDAupT>%0ZF0ytVvYXxB?#{YiV9 zVP(N91}$^+2Lh6&T*C5K@&n7Yycg6?`_$I8DW?Rl6w?nhebheg zip^D8ic|IF#M{?j86qxO;DJNYqys$#mKz_5?l;m#1_*+E@2j_pIciw^`LFMJa8K0 z%ziy8&y?8ACV&+FRVneF$XTj?3P1t|-DO{TuMWB$8h6RV}9~>7{j(qi059Xexkum0UUw|%b&LQllZC>k}t3^_bw^u zi}8n_nz9H9%|;$>OexZX{B1eONI{CkXka^T+HDg56y65k2&|K0;4pgxG1vW%apC8( zzRKC;8u>D6pH1;`JeHM=D{_D_J>b)U>Nkw_DUZ!{8gF5Gh~39`C+Z9tF&auQ$HQ;P z=@nXd{MurTP17`9OW1UtR z?^UKuURDexF`d+kzlII_?jDu8V5UqcbRxKiiC)c^(;UI1en^A@Muw zRO;jo8$kMO?%CIkFG-&l*|XdI&4oi9KmT;Gq4_1FVf-HW(6aW~{vYb2+GQ~6RfF_j z`sp>a<3ZF9a`&mYyLwr=LN!^)@4NH>& z*{Lxt8}MiWu$kG`7VC9W>mL_!k4qEfp%o7S5w!&1=Gm5=h}6;%+Xv2Z6~b-fzx-6gK-*8?zyf#$at{ zw||e-l7NQES?`~GZowbsBSW8WEL@HzE7@cbNVxf&%Z;v zr7zl-GM{G1MwD7(qZyqz`W2nXWxH<9%UrV^R+tf|R`xF{3o}FsqF{o0$FjblXqFs( zD5A`2AIh$}~=3#0>lvZ7m`M}>|nvO}!?{PxSJU_d zV9g#O%vi`QGVXHMBtu$>B!`az_VY$*QCKE{Z(s)r-nZrj16R+8X@=C`B7&Q+)D;i|t#QVInn3n0T zL-HY+t&Lr__VcB6%Z3$yl*H9M&|I)#;!A+lFfU|#Ezoif>3A*Zp*qREJ`~ywTdCL{1m3G1lzUw+vtIU$6_tAsWTd5s7ogntK4=%dC z5s5C2F7otfoj89SId`fF;3he(xLNP-uwh&~q)JX=KfMk?t$A`7EG+4^HY&p#P7w$x z6nfB;pas77irHrLy-A{1x#HeQfum#142{8VD!HTnk8w~$E%NI!Q!-x394Q~z@$~?a z!MTt5t~0f~S~}`~3@G|2pjQtvwGLZ^C^(kE6x(FI-$K0_=KF=kPWW5gZnucRf&C(7O*u`_%iMt~t`O?7oGDh# zuK*bnmdH>NCz-$ADDfRF>Yx2`wJ_d^y%_hZJSMc<3iyc z3THSIDZ^u>Ba=Y2f1g55)?t96E#!q3#V7S@Nk;0($U{d}42U~F4 zgTD`rMHML=aHhK+TXZybJe$J_QRyH)kLa*8CFEau`#ScCa&3c z8}b=3^4qx%f>+_*k0XUMdZQ;QKXF1x7U+FjPU|(8qQKwGsMTe^3f)37v3u+Q@o(x%w!YMl9G1 z)?(ZK=9CEm-dw9;L049RQ}I%O8g4WjJnhLT(@9P0 zFK~ISF-Y3((4?D^@G2pHA@0;@cj9`w5po@i{BSe#)Qx1M%3_MKIoo`Olm3f*%3!*X zs29daH^~ue@che4j7%?6>LaI#iZjUCs7TJ~&EB-yYaysJFd;fVJjp6_-IReM;0Ug5 zMsXU~T|{TqTn}v!9bb}=NDx2dGxn@jejfj1!|q%MY**`%CCX{n36&RKLWvQbeiiRi zM4wFOhDLUU(>y9VHk>9qH#{iS8}emlF=qbyfx;r=18MfqTsDJw3snBR7?n#rGz1eYt~nd!(AQ^4b08Ax|@I$M8wYH$z+T6Zq`7cy8?$HyH5uQNF7I3j9lMqlZl zNx-_WC1jkoaoE{~I_%ZLI}f4KY8nptVRG&^l99t^0Xq;UUbE38HW1_I8ymPQ%esH;+_iq3 zSE2Ui_l-!$8(XHtBf*-#8@Z2ZHQ%&|GHlULq+JB;x|tt1+~)%-#*SOOdcyod-qdw+ z`9@rzxb!quWbbGs{Gh_F%#{wEJ-T-glUhGV@%Odd-wmb>xicd+zrTKycZ{G}Edsp$ zd~9ZxerYcxS3=myEvM1E_ChVo&scsWedj&=ajE`saNrxYBQir}VD(!SNHGDgj`WP- zV(_Ln8rdb^N-Sh8ew6E^hgy!VEK~zZa^& z{RYTH*m(H zSQ=~gd6;TZfZ~a%84K5Mk}A!6geN~K2J)2=*?gsx@*8X~Jt}OeHSM}y>SS576`;7J zs$|7Yh))Z8*YHYjY-$sxorOxH86S5Q?Z zarO9;Ze#e+Z5+C8#&X3Q0BMAehb|VOU5)wNG0yD2RIkl(SGvmSK0bd}r^)T>RL=fk0Nh`AVR(d94;DcZ~F9Oku^c5mqVZhM^cF zBn0?<;czk?FiiVP5>tS6_tSHq!a$0tavAZ<%&Q%*#E4oDfq}&S{V~zWZe90e|jOz?3)oCi@n}V*+P=%OUHWcj$^CNHegtcRXq+Y*sexdZzFT(MCTdm7s zSL5xg`eKRCizId$Ma-0ydrDBdo9pGXh|GhrZ&e;^s%(p2C|I&nscrm*CHO2|{Cu08 z9xC3m+|@1r82hkFymz}?9DJb}v=+eR8vy!i+gSf-niya>eM0HF%`vXS@HPzH4ks>V zW)=}2mm0Ay_(k(hTAdy3b2d}$s0K?kyZQ|33;waIT1d+j)zh#VpkcO$A~Uq?4$HT+ zEE7l|MDg-_w}w|Kx@;#1iy8U_oU%oJ3@XYg4zQeh1B)#V(OA6jSP_1@*iS$H-3gAd z$>Bg2Gz!y9alHvXkjC%(){+4`)~ z2`v{NipBP%0)Brxvh+5#n}^a@0{C6JsDh^Q>=i}w$x?%@lBE^gnbu0!KIXl86`mjS zZr!)RMtZ(M7^ZmR&85q3Mm=$DfOfX=s(Ch_a-D^MtA;N#x4*RB3I}Z4?-}|#WEe5} zHa@-7T&gEB|X7B*`Vv$(2}R@s;q-r%XW$+ea$m! z8dIWThDcCmOhA~QEwApo2i3mzYZdI8U&6hwCRQHx5|as0)l`g zY&0x2j97HH(2+qO4~1s3-rFh)L-GWvP~P-|YNiOh8g+PA^)q)ok8sQ7eut!{nDvjb z-|oKcqLF|4Vk1w%yN2TsMILyWZwd@yY50U- zYP<-w@<{pd#L^$sg{hd_5M?mN?hx{$BHhVew*6s4nYhYpB?^rznR9RupZGxFmv+&x zS7$|L$!|y2siJXXsOZ*4Ct%Za!@0hVBMAg;S7z0QkZ6o;BivPvzt-k7@WViwqH8+k z_-!=tW^9c^`O@^e&bLs;;sJ9zNnPc=vnwg{rmVV~UCe%JWB2EuU+nWd>;H(+ETHPC9{>{VMfN3_<`E418Shj<10BIFqJEMd7 z?HlD|GdlZv-0_%h07M^YY=(B5vO5OcIS&8$79B3CFQIcpme=&Q%e7{h#NvFcv}ps- zD={Yje#DZ{Qcw-geHc}dYNq=22SDC|*$i>4PTav=+Nkf?;uMgU^g;;l*_;>AJ+aqX z#`VK0#*~-V(FMI!LCgsMZF#y3*wX53N#4j}6Ph$HFM>}5dFGJIX^6%Ufk0}eFiT$x& zf>nGc*LCxz*@Uh#(mWn6)9sI*(ZVnSPXyFj<FpG|izQAz)t z%D9?iA4?xi!Ptn}#AC;ObJnPqvspi_0L=XLu`*86@8R-K8VP?5`!MPlLC5_IIklep z+hN_DcE&ZgkpW%@kHCSGy{V#H0?OWh?#6`Fuqco5Wgq8CIhA`k2;Ul9xLmxXrA^S{ zIcbS|2|RHK@X^S^Hu1JJ_gX#Eraw!KbdQBS>0yAfw)VWSZ@cbTiK0vJljsty)Q3D* z?~faKlVv2-AV#D#gsbfDY&h*4^!scfn{>-Y6QPdg8vh}M6aMY&_}jd>5ixUomwQF} zCE`O6Rec@4O44U~N+fdlLY*^Ou5u>^gnur`V>cshh0c$5LnK=>Q02*v-m$fmCWXvUf!HiIs?N%8yT^KAPZIbgc#3LNuvj zLS-6MP?^BT@f#vLlTOSmo6am+IqN!5Wg%bQ1q)M&OT~4; zlAB_C)45tY{TJrPNzk8AaR!y2RernScAA*ZE>Ftnmh&B-UvVb_!_o4#9=OK2e)bWW zP6G*y%MsZzYp%70Q(%%S|5IwaV{ALH^ka~_`xSp&qRiuwZtA!OgOIyHnb(hC_O5Zr zH(L;ph>%~a&y}&v9aXVx1-Wd%+Z~JWA7k~WI0L#zWedTQ^Wvsv8XGeC4;P=qH=flb zNQ+%bqoNkC)i?}z)Gh=}i(I``@Ie7%$1PV#+sR&1AyS`ynmR3taojIx&OzH~kD}@$ zpN2hG68DS;7u9fgB0AvJtPkaV)r35D%U{hWyJ4=c=>)RPUmtgSI2+O{M^)DKy(kLa z}k8l>n?SbyhEem}{uT{6qOQ?{(TBk1*L|w zT0Vc?>C}-oKzXady5`W=T5Z;c(-^2Urd#TlyYbrdGbCPyY2>yg`{6;d^;)LryK#Gt zTsI^UQ5Dy7)>7vVv+oiD{&3ihZOa6@5QPk~yN=239Y)MJ>i5)@&JS@j4TDDHi2Odm z&+=$U!jx3J~rE^8w-0SboEzSdV{T= z3F1?)UYsE%m2DIuCF1U5g^LQSz8H~IHb0WZA*WF3PAnxq!owsSr7oU%Y44lATUg3_ z*ylWuUTkN)FeYUt%$R=c|NL38UBB>FiCxC6t`dcv;*C@ptZI*mOiTPYQskDAGf_<^C#)}xyb3z}CC@7Am*`<;ja1~PBx z!|rGGM-#PZ%o1+my>F36Tll5J3V4`KV~QP1vYZm&SgG{4_6StCL4F=E5d6i?z*ZG^#LGL z7geLP*Og9CN9Vn>1R!e}y`aU1xsCN`v}OY9sD+w6@h@6NV5odfG>DhD;-2tZQ$}kg zV#oS}%AUGL*?q8uTLUb8(Ve`#U%k6pT(x^rwQ|qJ?1bVpZA&+{1o@)ikyd5GT7~p5 zwncR5mF%hmdgh@~E_??1$h#^!vcSR=aG0O}(*~zJ?-cAL_4ZuK==}uerK3b-U%vJE zMitfP$)eg{pBS=V3OSe%1IndNjto1MHOy(rZeRH5nM0+Z2Y(ByaqIR|pC@P_h4r0b zVXV70FP>bmT~=eTCEgKcJvW>HqFiTP_J3Jg#yZZv*bGjH)ovikRom~dx7enE@9HXdoDA762jt$s; z775`Q@?H|nd0ujUZn|MLj9b5a0u@eEWj~mVh4qNFr;1TJENrcg5-S{+Esi$d4;_&e zU{}>#A6+ ziH|0t+NuT`H=SZOEQdZ5Fn{;}q%H0o0 zCc{-*jhe#pq%^U&?L=GkWW)m?NhIO?bO*&~)d`=hQB)>*+QX*-<*g{m4G7ER&LvSc z`D$RpLbRSK#FeDZf!KIHD5!n6Z_#h$J6pvID)>wKK|e=Y&reA#aYslRBm1=`=17Zj zM-o?!HU%X7?`abLz~_7j>=z(lp&d`vR9c~Cmr=|)!U7IlYy7pV#xyr@ob=7SAz3@1 zAzWnh7t!y8!MmLbymP6aD}`O@?ti&5^rO__G^L`ILW%l((X9kNx|{91S?jV;aAvAl zF!PI z;`C(L*|9tk3ZO}uHSt9K6T^naiku91-nMF!Bd*#lNhB#0ng=L76mtY3B2~UBu?k z+)irYBwDds2qJYaFRl!4GWx9RMRge8OJ@4bG=7^dBg+r$XIl%ICJ=3meHy-^LY*nO z$ZQ+@2WdyYdT(ArR43@i!`vlyedLgL-Hl=u(*99wt3^`CjC47#En6!4v|}e z_0=Wc0BZIXM26LP85)~?i91*CM>c)4=1b0~yjgNTfOXWDZPV0v-&(lMH1tb8^R;=r zZonLWZtT7vGC8s{SW*NO$~{U}?#~d=5fl4-w_Ev{Wh(PGiFezltSBoEVA`v}FmH;Z zk24=m+nyGjM;7gx+$7=|YnDue#`MUvHOua2(JBq%=oe08hTt`D+`Ln#xjZfrTKp34oL~rWzjK(^oXu%z)Bcb*Yd_e z=ii`j*OKDjpq_@JZEs-@Ym=+3k54j>9Bc7`8Q<9h-E#Kd4kX--%P+A0=38l!*kF_6 zef@&xN4zueLuSv@LT~!Qp;y2`JFj=ypaMX0ijBrFlXu0Z#d#ro>Nnjb^JW2 z5z=OdYkP!!84yO%)HdYpD}9}|8KBu-komFUyY8q^E)qWxpykXQRM@vWDNT3b86`gw zy%=3^BtI&)^5HjF(~D*Qp4%YuwM^-4Q3Xqp?;t=itKfq%I_{~BFT8h7zQ0Uaf9OBGQnJg^Ki@rGE=e*QKM-oT#s7G(wu*fr-nnx5om_kbr z#k>WPoi{w+UL|$>hF!1=oNywkSiiT3`Y_8SBx=H_xhIyMd!*lZdo}oJ3x{n5*?o&# z=T|JZ{X0WVLU?|=`mk5e5PuTQjBn0ok6;TDaR3QbXz3_@3tCdvR(-h&;u+|bhyQ;h zU1eC)|JUB=4(Ucw8fm0M5EN9CWI-*n;$uk;vw^_G zvlIBtrjZ1RsYQ;bSD35Pqq(nLqqZ%AUU+yXa`E^1r@frXZN<=d8jUkuek=G%rBrkm zDHR#!J*!CHpUZ%_8nJ8^kN7pgV71#qC~ScEHv{}@Yw~)qoTesI?eatxck%}V8{|V> zQs`$4Aym%Zo7 z{yLkre6vcmZ=NEkmZ^zAJL@lk<6qTpgd^K{u4H-*t4L?x(6m}=GO2OGd-GDqD~N{&E@_p~FYo);4lPiQSzw>FjDR>3@sXU0%fkngg~ zj&d-O-5Ipi`qL}@2_l{JG&R|;R-(BpxR|=#r3;Ni7u@MX@w866yu43-gm`qxqvZ*h zD*>5LD}>VDTxk{mm=SLRc96@P;cT^PYW}hz;f}VG;WZ(Fmv3tOQ58~`K0NwG%X~mX zV2NyMM4LtjeUuOA0DEXV9FqiRL$AmJjdWiwnY)g_Qckm!-c3AGh{GdOBwz2T!w3cR zN&u3fNd)lE{cXNbd!p@y&5w0Yt2#r`B0#6uG^r$98Ow>A5iOo9NqS*b$y+$r~;1J+QLgB?oGM~^fzdtvW} zG``K}40Mr*=K+kkr}vQz{r@iG>YLDlLH5!(ksnFhLv@t5nez~V7Bc%kI-SRt5$)z) z+~h;i;^(l1qT9$Q=X+`#*V{v5NIq6&p9Y zK1aX~q2*nGX~u@0)f zaM0;~i*R%>)Z$C|$)7~SYsWQcqyudE>&>4^&HT8uz_k4dV=s;>X_xZi3^SV?2b$bL zpZAiV9lh7^L!*a-A3OjvrA#^b(~x%ZpoY03fx1qpR0qGlM}9__gqp7H`{yzlm!5N*tPJ$Ofuc{8rQT zne>d$lt%1FrFB%w`0Y2ur?BR z^D^{vn?S>e88u~>(mG!}a>q9mRIB5cyttVzHi7KqO}RK$!E@@<1cx+~{SnHl^nyqu zrb}%*r9pfsOd8mNUX2JLG+f98z2F#q7U8Hxff~jq+$-@CGA~bRyCCOvV^ajap(D$z z6JrF2-DvXRx()$CME*q;?ypyo2z2)5^qsQ5=f-ZT)6BHzeL6XSA!iG@{glR`sw9VN zazxfm$rfgzxhHlF>a;e-J%=1ykEA$y@jf<`^%2^)j@IX5#+%V!3Rz_f7-o}-H)Bu# zX?fZ*OOlnwkSyfDn2cMQ2bd;IR)9K@ZE?0bTrf$=Vvw8|x z-M`z;O{HGvR^ryGr-~7>kVhOG3Dy?HGXFv;Zk-IywA5`{U;6UqsSfV{VP#?Cc}!8n z14s{eL|XnQlW|BQ_Buma*BGxR8LCjxHF?0V1B+awxMfF1o{Q2j8n>Dxkp@%))aY*0 zU+xn@ChU%)Fr(ci_3mP#2-w;gNC{c0Vz zFxQ7!S@PuT5>Y#{bqS_+w_*5jreP zNc>Fid9NM*Uy`B>)ug7Z8Bj6;Ld!e^Q~Opp-4yT1{CE9IFH^sKz2S%A5zVv|HD42E z^zn`$2QQ}7*Ysj~x+#yK>v#)cTo}_=Jp&(rX^h-dz}v!9Ck-RvZhE48BLEYui?t5zH#hn zZnUnnANyAabEmhx73el7pqUf^#`FVU!b!U6&~;~!SA16BrlrS91CTk5M{wi9<<85x zE1to%9VyUk1HDA~$HIu72hfQA(qY;(m{?^Y)}JNvl7!k275Q*CsMKdr`NwoG))M+^ zx4PMD)T9l4f2W$Jlmd~7Kf8(*nIYEmeqsJsDyV=+C=WhEVmxey(cBYQJ(9YyxD>2T z-D>)f)6=)p40C;Zro%2=jhet2cr7c-Tya$mvV5iCOPJv5YA3Qv_x$9{FAl5n&85@C z^@z~ibih+;zATs3W(h*CVPlYj*U}~X?!^qT$f99{z`d*r>-eQ}z-Fych|NuyhAxHt z9o4Bh*TZZ|$;P>pXd>EY%Oy4{QIcC#&SW{mpVoCfAso=F%6QcGKpu>6vtuPr$}C~n zi&Aso%L|!;l2PUQZh%&qJmuy(mMzuwSDdqu++M)5vV)6TD-G z00LTbb@o&UZohLqRe_ba>B74utU!H_Z`*Osi6)#+e_K3uF@UjmY11G+aI^f@M;Q?i z6n38U2CU5c-h6U3Pk;IdS41l=f*4Gju%rEOgIbY6zbbASg3Ws6wD}g5*HJI z_%zkTOQVLUf|wd>MbQ*8+q;r31_)5u1teCCN&o#KzVVPEggxQc*FX9{Rq`t@jGP2) zyK9Qr+3ifu_}>oeN%U)kmS>)Un9#R&p#2gMf{4~4Z2K4w;Zx>!=}2g^fJ`CBIAz!H zm4V?zfg_0UX(I@>J)SvJx?k!4E|Ox3d-0sCtGbEz->!e?m9GK!q{vd zKu~YN8&q2G58aQkYoH=kd~hzUF)lY)pX8ifezJ7*PeFY73CliTnahptF!4~BS}Cnq zOP>E<$R0=k_TQ_wh>2%roLaHU6C#D8AzH_xK@VNXvJ(fwyIkh^;|6H@hiK(rJ4VvA z3wE!?tM@l-hdEP)xbUkLPVqc?!m+c^R<&HmQ9Bfx>!|nHLMOzyS13DOT<`QDag(ow z1t3lku&`dFVNAwK`7xd=(UDzZQ(-GVDlWpe;hC18d5JY+w5tk>Q|L~07VO1M73T53 zZGanQ;jw^M=Ik$+L5)a$7Rb~m&5oM3t`Rr9Ulvk+j}i#SP#)niQuO?Kz}`Wzf4PQMMFXy?dd-_{Oil4rdT6rX+C$4L6z0 zrKoHK^mH%K82V{U`<})6RbAG&>)j$ms+{9&_Zm72`qJq__!{puSneT+yIV{mac<}< zSJJP@Hh@2Vp$OWs4-=4Gj>1Te>4cyd&u3h2;#zgE6P`GaG4*w#6%*oQaa>7l(rE%X zf11aG*2Ivcl#o||sOOy~&xh>Yg^UcDUyDfKN6`m|N+{qU7J5nOT;x<<%?pII*BeUJ z`ZL*Th1#vY$W4xl{0X~i-7BOpR)ULW`z4`&c{+}VBD>(7QzR?{ZadFPr%;Y_Q{Due z)o?F{KV=^e<^0H9l*6xK%uKUULsb>WOa*Th<0~Hhdgy`(@EC7U_MO5GYnnkeGi$gB zA||jIt+HC|J-WOqv+q1wzKw@EzP5pbbQboW>)YFZX86(q`F=#c4G%PS9Q^PzQ_JiK zlYQH5wO->~g*WAQknirX`{4JFz#MoG;%=q2a*=g~KlF%#f}U%4ThbipkY+ga}xbEUi#mEmxi6-`=3V1o;yXMGMA z7&zcnZ~wZU%yx`NMya~a%;*t8+cM@a6K2LRmpJuhR>bN7OF|oA5Nzbuc;d9qs24AA zDZ76{_$H=`S-pwG=t%FVksCjTh`Vwjm2s(glqNJUbd#)G%@{CCU#L{>G_8(N+F9cOfj}5NTN!IGu{i~vs@(bL zsy4@Y9$Uy--5E%lYQBK4Oah7*gObKsT*nx|5O{(?$-_n=c-LM}lw&?AQI~WjtH`Bk9Je^p`YNMVP^lDu_6{!J zo}%ZSE}=YHm{$CiV`P^9BFP(%xBb9GbBeBvXKnQDQNd=+6}}pYU2k{RS{=WHe5H9U zM@KvIOgM0oR~ zITg{NY>J2~ZsZq-?jJh5(zH*v*8)zutbx4on1xdidd~ajllMpu&P$e1vFZ5sD;_yO z*Y4UH?7-WDbN^|sLQKH|CKYnwQz$6-w1u^WG-FvfPCV)EwfMRO9hgWn!Fd9qA*=5p zO`v7>TRAzAKPSyYT6VvKSdJaAI$~PuYZ3hdZcyZv5Xim7&K5q@B}H~Qcz23?{=Oc! zHh!bj0aLf3bm5PV{j`%9XrnPfuv*Rmx8e z^`$5)Y0m?m3QEg!KiE3^#(L@%P}C#=u0tk^qygh{C5AL&WIoII?nQ?9Q4~zixO?`jl!2{c-&*aU5#Bj@YsXBtE<>Q;xiR}ibrv}P z`a5{6EqX6mR9-e6Vn4qNsWw#Uc{C#$C73yPL$?OhgY^q2T+wriTw-pouC8>wk7R)U zbjoV>mP;{uu*38D()42*Vc` zPdgv9%X`I5eYRQ5+0zwL`$8}`5c;mV-K#O4=T)Y%d3F4P0`q-!!2N^+QkZ`k+50S@ z&cxQsaaC)3WEBUxo_6=QK!Rsn6Jii6BQZkhHK$Nnc?_0d|Gi7RoyDGSJq9k#=NM@U z0QeT17k&{RXy5TmCFKUk6;&n=KIBlhJAd}MPu$O(UhQJ?3W`jqZ^&dk4PKxgN&!+q za>NB#aW;9I#}$TYp7+Jy7w4Imzw?vS@T&v}sUftotrt#X=z1L?L|WmZ4&dyL;gWdO z2-4RneWEoFsM6i_Juaz4{0?+i@1O~o%?dW)JVogQFlI>X9>j_s8^9d-+(~NBKo^Lc zEupaDYO|#GTW^tOz~-?o=-wb=q7I({F8KJ6azz+H#@o00cIOrRv$c|4_Y;?g`x5eo z9TI)wTXq-m?N1LPmB~+qZfQfmrM2KxrFL2*RU@iVNds*#>{|`8M+wMuqlHss=b>bH z35NjMC`g!a;K&55JwsL?vdfZX9MA?6$Gk_(1dM7BO)$y-_Vs#T%Esw*8OvG1Bu$VL zp)3HN{L|mC<6ImkTB7A3gXdxpf=;PVy*}%F@p^dr=&4!>^Op3*#5k@Kt`cZsA(f&h zFi{-iGD0~VW0|2D%tD}~t?S$Vm9Tp|t)p;Lp+#?j&V8v$Im574tHN%7^kH;$o?o(S(amtuj016IJt z2cFILA(uor0+5xzB_<5k^fXyOwFg^^Wa7Um-&~SH2v7874p8px!i4)}inzbWar`)t z7Q;iDRx$ussp4_QG3a0CIN>d{m2!IGlX5*xZM)y=siFrHB(#p#2K*+Ju>l+7x99Om zCx)iZ=@4ObPoQGDaKJT&Mc#PIPr~^;L@mFl;Lnu1hHPB9*yR=2Gd?KhVjN9tt8PWl zWH$?X$6hy_1k(X1Fg*Um-t{L)AV~_nFsfAZV6$VFmi7vKsubmy;xQ^EjZ=|E?r07? zowP3u=vCpf@|hruBHk1%2_s=hYkaFyD3sc<%(SF{7Z1M6$_weg!CW1{y6U;yv9Z>P z32h9~zF>)}fgNznOdKkW3vx$(Fh28av3#Ss2yFh|xU%g?x2}%VU|~c?ugZ&g+afC6 zPmDkvI?BzY_8mo&7XO^^wQ;G-x;m&-ebzI%Y>k+Su8;R5`JIdFE!v?xz*E(bzZ=2H zclnrpM8PrW3a!Iu<<_+1)nZwmddzW=GviQ}@AuJTmHbKmtU?VA!r22`B$RJ6k=Z9+ z>s!mDR;=!Eo~{CduP!@x`11101TMRN`{n&1jw85T+P?noiUM&`9EGz+QK-%kQ@us$ zmTf??c0Q`qeHF|N8QtQC+CLYb6UWHr);t)uM+7)a{`4K7c2sWYkaS+#ypEBVj&%84 zxC8{S%dt+KC*3lA{!LCE=eFTkI=5lo{PIu8Yi=gS(rH>UXz-zA;US>b8hG=`hal{z z0-L5FHRz>UwfV{}uda*&#cj~{qL}|2o-8K4arF5^QeuTl;ZqP%gJI2s$ufllb0q>Z zrx+F-2h#kfL^=d17~@hf6ChaqYS?z@)Ff7VjeaA0)nGB@t6U>thDpxTt3K)z#Nv9)u7xr z7pnR4WtYlSS`<+p*UtbZxlZ8wP={X%b&|v9KlF!Kn+JWlO|*6ay{B!=kz3Gs^u7hh z%@0ss;?UdXwFi(o7|aV(qk&G>xDr)r0TWMxH+!p<(~^ZnS82H@?hIbCPU}Z=z=>w| zb=V(X^50T+GY_tm+6I0=?0^1Uw*Vm!%A=*Z>k zsw>01%Nto`Bq_WBycIqUKgGydZl>CWwz}y=GATx)YHY~NO5f~V1pKQs0+b;#o&mpy zclOHwN~$YGv}dsH5Y{zK>9%-Up!DEh5cVo(lEqT;{8|g-Z{$G(h0GTU9$(hZWM{OddVnG6nkI^MOAF|04D8!H9>?NgD;;c z&MxFX2{aG@{uu2ygRNa=t{q-oYgxFS%y3-1=?W~k)w>|A!O5&cx4QiR30ADHPL-)7 z^^M~8W#&$9*LEy;HRzv_AiR+#*?8<2^Ix3Vx)e<}Nz;#XD+AIA$3XX>p$4aAUH5T9 z@5L}uH^Ip+E-furYwzA`*-1^|COa29*t57`TJ4jw7_u7kQZ zNI`cwJcON|Xg_*k$W%aZCG1=~F|bkN8Km)V2G}VEeZn152{l~&-YbbDkoV$u6cR1qtICd5*IwpwRI)x_Xn9$52N zEmsP8y-M)T796liB|iU0i8>T{s$bVXSmjE_|O2O6GXdHHrp7 zVO`iL1e#gVZ`PWT2!cR_#rGEGC)Q41?%OGOnykhZU#4<@ra6$E!GS_I{|Tt4K#npFpjSPxi`0n($LT%&6J{w}HyG*OnTuu2;B|bX_u#l9y*a z(P_0Gy@zT#EVWAny{Y%~T#|_2R z1NA%J-*4HP?t=JM$Hnh4$p2z>S7#^s{s0EWlpS9zb)qw8;3l6O2-mN#{O|9u?*@8u za)NoM@euZU>{K|ar*w7wiDu917Lugspib*tz<0-cF8L2h=upK7 z*09f2DC#GzvJkGsVWyCPY8YuaXwX^Ja<3G$5r-L{xl9{q0qC~Egv zxR7Jy^u$t6%_A|Zrwp(7{v47CvK1RIdu0YYXXf7)aBor(RS~^Ie$Q1iJucENKJVUr z1$ul+(uy1k?+%aybXW%^_H-~j@)M4CCQ5PdEZlZt@?@Zrc_m3I`aLMD7ym^t`MQ_| zWAzQa7W|rM^g20wa^^0+B8xaqF`6#)MwLjUUbSxVuBn%GYuiv92*w-XbiBTfX`Z4I zL-zovxO7GswvU{$5hQ?dH0BNl1^xerGy492U-H=^4pVnw=v6FDtBc>7g}{ZS+cN}I zje}?kr*-r^@7in_uAT501|U2ZE!t({&psA<7Q)IwDib$d!xJ0#PPWFTv`D(zwN+GrTsl)QArvQkmaILij z{#=o=_L9MjPjD5d97zL>Toy)pjk6RuzGq3Qhf|a!Y55wu!qA;2fAIfUfG zkG1%C=R*sjPT5a283VEC884xYK`$Ss4m-ZRLLd1-Mr2SU{gRU`;RNw7pZ@!w=A=ox z)9TSKtg;JQ4p^*?v`)dX@U3@3IdItUY4jecRvYA0v$(cmu+B3 zYp!}A3QWzpZCppwYj`bIPcsfsLP;(t$ckH&F!gO--d$DY)gi{vjX3odgCl_BZ=q)Z z8%4kQgAI)=ETv(OKmxVKpCd|3*ge#E?5|n6KF@ z@X%R+I~eeaL#=o1tKo`;xcF-neMj4Kk82UIB#Wr~hk3F;bY(dXI*wBkBeMt-JeY?h)hx_2Oms89C6>?{sQ|@O{4rL0~>kDE(OXi z6}0<@e?Q*G4gOJ`HO4za9m((R%IA8-Ytx=yGW};)cMvCvr1G%dQZ&BTg-@&4hXYo>5bU%Z1>($u2jJZfi$7i%+z?ZwO< z!WC+SUsOUG+7bfQ9fzpA)~kI5$j|Gp=?m@YY^;H%xgjI)b3%Igf`wZcYefR4{}kKw z@465yQ5+T4+!?YeifbMB_@>1KX|)|@e%~4O3IEag+o4pu+5wNk!-!CdwHczsVEx7` zAC5eb=;s%kRSTG2>P*euR@3{OVb{jXC5}@h2*qpT!RTAF^y^*&>p?*q_gLUKXbgNl z13k)DO9zL?#B3iaIT=&}7FsfA9f4xL8i8SNOktwKlN}Jj6YI`iNh7KIPiZx`GV=# zf0}cn;q)l1|J`$LlYEt*k?-->%*A5+JJ_(Q;OdClj4$fW1YS1lPk?r<_7Q5oa>~C4 zO4k0O#6~rD`gKZg&YOY@XJriA0{R)&sbB$||9ThLcp|`p#u%y(c-Fe}uNm|@U{-tx z6HXp|p4Ysg*1SEU!^GL7pldG^+53tIe(5X1KdDlfrhG(Z%iPRJ80{h@CNKtFE+~xZ zJ?6q77|+WChr5#`$>e@o{yzYu{Y9;&cm<6VAr5KI9d?G4@qJl{*~)?dPl#yus_TWx>o$GEExXK4Cp^}vq#xtxf*`8zmlYeeUI zL6LbylS1j@j$~KGCykfDNm~y`oJie+I=%b&?_;wgqv>Gdp!KTuYVX(0Y3UV zjTMM^pzm2>5P>U94mKLM$co+Gg@eX!Dj`1Au}}5#igL>L4=04-g$E|UT^LXpQ_Eai zh4ZolCy6a2@ObyXTtZR~uz14&wBWjLmwbQgK7R;U=JwSV(R!fuBaqEHk0CpkE_5&0 zxZ8@!aQq8}_!?ux1g|np&v*E8r5wO&;8WlF$=JvPP9sI~3bm8Gy3H5I@g|IO!>4~i z=WXL!w@H27d}$!+)M;uJ#}|w5`7k`!s&xHpB6 z6@1U|0=7-qRo{Ve&cB_6Hv)5^D=LHLgWFb=R`Xaw&0NUv)Sxq5?cf*p*r(q&Fff4M z7~sHDctaxXfpgxo4*H0G^b0W;cys*;Ej5JopV;g&;|B@nn!DZl4CW{6veLHyw3ewIZO;NUd3yTPr+W?@N7&pHD7QM6OD-;+$nR6~zk>5oe5j2ph4>9W4vC;N6VJP*s<`cVf!0!~XQ zFalfFPymXB6?iY{9>i!01z3WcEPMdyaX4?QRt^v2RdnwqAx;)Zk48Q=!$>}03&I8=53omCSd0(F#Tp8BIcz*^efnlE^a zH<`}_oS6bIIKRyD{AvGPHj*vQ+t{7tC73^UKj)fIm7$4>EKPOW$=Fe^UdnZ05MZuVOqVD;9aMM;0=} zpGD-d+38+zqXr9R?xBq(z8+y{T~C1$$qo1jAboU?MVF9R!sQ4<56_j6JD=ly*Bi~X zj9XP(Y#D3P3gHxio&7Kdl;2_qf|B6b$KiOk#JzFj@r*G3f)2#$g9#r%qs^x$YkJeB zWeaGd>>l5~&+Sa5g1avyfIPDKl_4*weNxhF>CFT#R^RGtS{V&x4X__z+C zMBaFr4|UnTMNM@P2vziqDe)E(SOd(sOJ}bKFgSPUe@iQJyi(4ktC%hH%gKOt_<574J)w7?Nu2h&Y!K%f0V*2Ds z1_7+Vf1)Bmj5mqcpFok=1d_Y^;GreQKmf3mdvMUfs2YA3vL6$W!qnE3TF;2WCXBzyw zy!}%7G+y_wdY&PM=ZZvEwP(|~z#_jP+zivtnVAsQ)l@&%hsEPb~5obF;a zo%68i|DAt_13Tv6?(VJ&Yo4yPwKYtZ3644bT4z@m=HmYTz5sj9*B1Ol*nlksdn%3{ z3&)&^W`0MT%b)m9dc+Ij5XO(RoyXA!Yw>|S=VB(fI~RbiSxQP=%!Ox*ppNqF4Qw(x zcJ3DE-YT>`jTd48P@*yol$4gk&K7Z?MJetkm-FqVy=sTm{Vg*e$()V zuuMK);ge0~cy$TdF(lJ?$g?)rf$;M|&`+4scOd}w-=5rFo1n3&IJkntScQok0vF4o zDP#?)T+Yk`RA?2$MPXD=Bma%C!~=BXPF zryYDhc`7-`T?F$C8ACd6VU(~xuJoTNPOx^tps{5c#u{7qSNW{DHLZ0)Flfww);Y=L zmIGq-T>*g7b?e$pBgH$lv2z7@b)r!5!NP)Bxx+VP)r@(=X*uncBCc z#Z+rHa}sQIYf=SQzWl9tH#4d@!z5Odru)Ft`X#)A9HMXsr98U-56BxHzQq~`HhOYP z&aoywCM?O~n`1(O&i1>(@bRo;M0o(WCN}VK#=1q1e*^U_Q4}}h)~b)8J<+?-gN_c% z=5-MZ;@IGB$)f)L3`(}O&uk2wWSVruAZ9$%VhN&Pj;HaM?}{1S)(n=_{_h&| zj+Z`gH-lukE}A>PaPH3KxZ$tvk9OCMWBGa2l|$Z^-3ti)8#9$%d4>`YL&~f*$cW+X zoe5!R)~4lqhZg~&@uBe3lgp2Yo&UP?GZPtio#h3IpSBZ&-w}*mA&>^|=lJ+mew`Ht zkMM`AQlt)x6Cc_fX+9V()Y{j1<_2u>;FGo*C%WK zPdMc+{pD=WVnNX+q>XjRjNclp?unR8%OGr~y;~q`vYYaD0HoIZkP+BAOYs`LU9GIfWd-U6{%18%AiX}KH5>m;*+FUW7)-@5;gnQ(>ynC@U+0DCj13O)F;M#v~Aum*9VdIDr1!Z?E|evBTn> zpxf7lVh{lDNMhEriVnMGUIX^LAkDiVCD+EQiRsV!xaT&^nReE@0LS5Ja)g;y@L*pe8y_ zz`GUpk5Zncdb!e>l|aXI_QugWuJE-Uer`(WgY@L_;}dF2hbm8;?WYe++rOxKr2E-^ zR`s-Cfp2m=upvQrDEdBx z!P8=y2~*euKKl?yNl-xM66%bd&_dzyvL|fg6G)5~mV|a70_;mq!ak3l3OJUEAYU#1 z4Y)Qj{*I*Y?pDv;lPpZL?Qq@+r0jHJE%ki0me=z}Vs4b(gG{h23o;V$ab`k8vVM9_ zM_CG8r&=q>^mgV&hssMP46=_SQdAV?y6_=&_JH6@GsK$OMgTDE=e{QFcBwk0``(6k zOL6e?mqF(p>^3;!e{7_rQv$&G6ijzZ(sU5m$$74}RqDMrYZ_tQFN+)Ni#xBi2ZaYQ z1NXgK23Uy==Xvbq&@DKa8V@uOX46CM2aAy12&q_A)^;~A?JzP|Us~k-L%i$h?*7mn z@#G`7>GIPTeGNWpllj@@PLMX&byGDqz{edILQ_AD;bn8E!@_R_k57;X1*eMd2GNj} z{?ijQLmvX0RkK?yQ@CeAuq|5hj`IMnX|cB8ysr7{JV*RG4-qhat1{9>Z~Oi?%u8wh z?!N+rTu0fO?#7~j7dPVXC*bMp0VaPReI-hXZ=~7X-iaP>*_2)QZzx*nU#T3YN>Twt zT;H>BO&ZY<5F3-zVJzyVhc%Cu{u7Tg3}h@5y|lL>IlU&ostBAaK#l6k(v* z6`B|~CvOSV(`nx^u_SiCP55mDv$##PIUVYL-8W;h4bhb&AK~|9o~7JB3}xu17644R z(ss{J#o~S&_9mSXz&e432u?;l+aKKY-Ux8T)fCaM@DjE7IasfOU=gw-@aZjS0??5? zkihx%tJH5#Uhw%>4y)-25(_4PbU0R#=hN$?@~K#BTJf#FoOE5%*a;}==JGrA`XSk* z)NoKi%_^3?)nXZ}d-{;_%mk1wM6}mQ_st#eRJJS?a;UA047cI6L9nQc#51xyuZf%# z#=N!(kn2^&`%-h4zi^xh+Y3cO-}NyQs$8=%-^*5s94=g03O^K6Gh|J{CtaJUA37n0 zR4lYSyJ<5G(t>OBpW=qi(Rbnrd@|qwG?JksAz~|eN7+mN<~!V;rDW&_m-+o@$2E&M z)0dal1002kox6b_KdJC!m7QsJrN43t?ip~%(HS8cyL%oFIbpwvIV;~&18CO`7e$d9 zN-qPI%c@FB!DXDqwN|@0y&_$jKWQS5I+!JFvq#q>$_@U-dc+!q+(JZAU?nK7r7`en z#%p`VQn`BfoAJ8v859BaGPj|Iah8ZUIK($+)#49R7Gl^Ybhk% z`DKm)AJ1e7h#w0PmXE+6Wx?nYg>{fvwg>cp#vKs+>xc2bPRX_MwzCQAt+?3EP5m2C zA2>a^^G~;Knf|8PUFGfcxaYdfT(R z-fsJe4V1gWwFHPGmj8ZRM>0|zerhE=BOmssQI@-6ke{$yKa~jwW-V5^Ir_`&Dh1&<1!KTp<~0ZF*guc_0tR{~UW~=0Io8m6 z9dL4pBd260W7{)tHSm>I)^0(wx{l|Y1f@T_z;?;nZw0z=G8;6oJYB7s`gU$##dVD2eIPB> z#1*Z@-S)U{KOXS(nZ?hUrGH|HM%WfHChXeaJY~droBcLahADphd1{7WtCg=uAl~S2 zeX*hnEeFCweRVXHHFPw`VE<1)f~TwZX2S8#zw08!vXV>FKsvZmJzqab(f!kn@@-7W?rX2~7~OH^f^sXxS1 z#~G&&P7$G{HOV3mx}WK_dn)&9u8^u+HlB#wHA62NFc?!s$o$k=#>$V$FZeOz1e3(` z&8hbq{wj;KO9by$N=9EjE?Cb0Z!+iNXT|8#M_>PgIm^% z9QeL^;yE6PS4G#QW1rQE<-7kGPn-h+<&`>#A4LUgz7tC-b!<=WV`!0ZEceFr7VNp9 zgu&-;qA=KCdX#u@mECn+#B+s~^bTe`^zT5Ib>bRyPz!#q3u-!VQ$&^l`k5Yn_nVnr zXoYMPTq%)1BVszU{&N5NB4~m{Ig#*iiryotx0Ws$ikqgsu%} zeu^aPy%d+o1IAdqJY`2zBEQK~+x95$Hwlp0-U_2-y^}b6!>|d6p$$wiS^VKjz{uTjwq|gyaQ*x^u9YNI zv_?A|XD`cAnh6?+)9Ndl`~54f+%Qv9jb8cn^Dr#~1oHBNzF;(?c^6^^90K39T0^@k z3MfP9!IvXG|6`G1yV@LM1m#{iU3WhNDYySC&<8#!pM~lc!!jC&?k8)HUr%s4qIUPx zN0;I%w4ZV19=$q=h;GLp(i?tsKMGBV&i@E7`@R!ko|o@p5_f2H&SkC#M->42W2jbsJ7l(WWUkCF!Y0PXB)OxlDhBM~yJ z*sbN^Sx|B94^W(1aR6iD^@wJ-eEE;8{w%bV_Kf{g8bAMRO_^R_HJ0nS25hLf5)Qrl z;0;)cns{DeE0O)>_tk0NhgG1*nUs7p7lr7}HQ==HYNIRC^6+T5|4K`hZCyT}r{SKb z%>S3r3gsQTbH%Nz+zI(#0|pBWKo72BcY_QxmDcX`KzI|CxTLfEXz&$z62^Lj689+< zQ0$z@-O+5srK<#Ho6zyIOZgJ?9Vu^l9BW;tOV4D4h|3S~zt6p6O;_2X4QCkl*C|Q$ z_`7m=Rk%nsNzft1PoIV3lzyayG*5j?PknFZ+8Fup^N@)(Fcb0&j<=nqB6XqLM7&M% z`cHfE5zb$FoJQSRD%v0IA23~?s_~w8z9UeIv%`iiX3m7#a*5{Dj~gJcLoV#O^1WYi$ji9r%l9t8PsP65247(tXt?WI`PCA8__s7x7&l3mqOIudW&b z8Qvkyo-_;M>{jG%8g(N82x!>aFc^h^1L+OND5RP?>Xd&SYv`B(8iufzkC0dX@uw=lA zuwt<_TC>S*wYhGEINffW5k-ZIAnZLgb@8-xJ5SyX`J#51FMIviw?u@P@kR@wz4)v+ zX(k3v+C0j~P`tks%5$r?PP=tW|KK`&pRnhcCBUM(5mhlJVeAXKuCW zueG89Nz8bUF;BG0*utD4^|ZdW65pJ4-9-J$MyOtdb1=+Cp?|?+e%teKf;U>eHOtR* zxt!^{<`~X+mbBA_1cJ|VX?D+lj2CRzrII=^SmUxkOW+v`Kt5QC7aaCYANm~nv3uqq zpd99(S0+^R#_k*leUW|E>8!zi<<${W^3R3)BJw6gGZ9Sm5U zTyv1Uy<5$hfv1kKH1R<&Donl}cH(@3XJsaQ_zV$5Q%jYb`B3aI zF2L7<%IuYY#W53d+}*kr5N9R}LpJ?|Log@NQmvj#$B?J^qg2uq75KrdYgq0@dislB zoJ0|1@sftsAy!F%VY`D_@7ZqrS-*a0w6IO9UVa52R5b#G^TZv50lsj5E1r+YVU&1N zEpYH%$l>LIq8SD~dtoDRJ6HH@fN_t7i$r3K0R{uUtPvScPQ6q-6wRCoQSPD^RfYwB z7A<60iVjd^N1O0O74NsKib939*dmQQ=rnj#$KR{zy@|k;5baK%1hA=eD-Gcy?6p}+ zxCHr}DD7B?J#RreExq>rE3jRj^R|W2XuTHS1?cfVz3pH{5#I@ea%c;!T^B+B&Zo%d%g!Yx6 z+I{b6L5cLs&^&QmYuzs~+rFGvx1vNf+JKVl26kwYKlZ7-KjQ=Ph$^=|b1@vXfA|m8 z%mBh(v(`~PKU?pYtWBOKI$%Cmzrxh-x|#?Q?tcVEX$LX#_Av2^Vf~sonUNqePPU<1 z*jhL8>OO2lElpzmK?yLaNT|2B_&Z#f1e7+>nUE~uPZcyTrkU$MZ2*1hhekYF_tDKB z`E}0e;@x0Q9r!cSI^eJ%2R@HI7hdGS8tRPgUf^DV#W*-Js{JmBm2#%gN1i8%&BG|nu9F6|U*ysuBfhj3S>*)e_0uoollqT=8-TC#O^b z76tQ!rQ*3?y%!}E;1D7NvTG*+Pj;@O={(Z*2qL*6?uGO`o^!r{bSfraEC^Yj$XJwy zZ!Y66%bhxQ7)Y%~B^8IZI#PT3JYi*5l5!A$C$>SqHACxLx-k+kN zR&($tx*#2hZbPo7pI$k|L*R&Uh#~Wn40^FM;})Y>E-YoF8o2;8{{8&zIQ;;CSxgL4~XQFOdntf%FAmN`QY+i;|8Sy<#|ZS%3ZfT+LYPy$^~k zWJMzG7%`@}7b7co#FvkXAefSUWIW=V#iwoORKG;(uxxK3bieBp5q0USrIIE6Es6r4 z2oOcu4MEs-QPw7KB^h5a`tfL*ESz*d8&I&cyTLJq*RdFYNhKO6uir_{8e#U z*b_d6TTbCQ8T(mR)r1z9K@nlhuOqnq(P^H%Ve|;(5XhW4qy9QiA$86B^B2Be8l$a2 zU?B5hrB&!^<-P$KNjRu325;4Pp3PhhBy%9S#0_DhqjR{_;fz6&a%WqVrq)E2+*5Xo zMbSs~y&2d*6&WeR*mh}+WLv@8LkLMmcwaf@KTB2COMLr>Cln}Ss3AHpCaHaGs#zzS zF(DUr)F#nj^)Xs>%G?qaHBy+Ywr((-_E-OM@E^C0N0V?|>m6b=2g4YF4_64@Mq5y63PrR~})|8NTG6?Vw9){z8~`9X#=Q(lirk9_I$aXu<;$Fx63vi|s9Bv9n1Oc)1~ zn3SEXO<@ihb+rqEe8hnO6I=0Mm6!mcHLgB3&fCE*mHtQMN2Uk{qQFHZ+%M1j7nTmB z&$X{?V>VziCkGd-L}yV{)koq$l%4%=sCgG`^RC5lO@a-Ct z!LDf?)$s;?r(yr{c$x7d9jam1otnv17K9eHT>c9#{gXJ33ouQqvG7u+u~1_InqTu6 zbINjPoU3)VVA6iALKgRn`jFxb#tk_@9$w8~R1ERtJZ!VLwiDSW=wNwaAVME{qu0^@ECc_E5e_~g7_WBNqA3&y!K$^;p<`mNMFu&M!`Q2ndL-N; z9FD49Bc_{p9iKT_C)LQny>Q~Bn*3QEPFVrN109Yi_UJ`f4FABKRr~gjpbCDJ^6Rwe z$?QO8M=@q_v9}EEv$M|)E27&|_5NoA8%sdAJ^B6>uM6(f(%org3r6Dz%BFbi{XaHC z?V@SdDUz|s`p0RhcoQ!YP_D7!Vu5Kr5`;uFedg2Ba|ta2nvPDA_d*xCF^l=wJu6uJ z%SU<>REM9Qnyx)^LTeiy$znORZNYBjdI8(iD^m5iH>q~=fn7AiN6EG4q}z$P*Q`)> z3V5T7A4)#(u0;!h7>T;(igc0UC0b#8unR7dhC_Rohdq$L{;evr*KWTI zI@J}{|03X7JQuDO-+W^MUVMr$wn!+Fwcq*MxXD`zdbId%?y6N zsq8c)1GIBI>P@5nM)PK5jdGQ}FL&CB+T>sbgz9Sf9Cwel#nkk5s~D1UYyA94N=(H6 z!&KjLgV63wLBsjPTvpjH7@JFOf8?UAC8c09L8>mjIK_V7H)0tZ)ha z+EvZR*k{YHwlLi(8z$))wN+!#Q_kX>Wd3mM8EY4ztB(@BvHr@H+x8#2di75o9t(ekKrzyqmt#XW(WIoGxsny<*+-;{RqXL@_ZW}Frk`W2z#qEC&ImS z&`|*S7=1^-N3XuW5@Mg}lwhSBCP#(HL8{GdP8&OLEl4o}mCdAENxS+RwDGk$uTf(E zC-CkYQZD>GX_KyITC5!O@6Ed?73sE^fK|UX5u#*r%=Uq6c-1|rK-gO$O=Cre}$}a~KZkb&O~XlN@Rf(#7)c7btVU!WUYhV|{Q3U8sQWd9w}N zmr#oyz6`vL->qd>SIRrKlN7WitDJpN4tQw$Hk&Ovj_R)-4%2pjw^w`g&%^e%D?zp3 z`joQ!_R9EeyZ2Fi+t70v8|b>BOdy3JwJHewZG_ObWar`F)db-^7X6aOD`hwqs_U2< zrPf893P;jr6ZHn(A~~g22KbX!$PX@n{Ey5DOwNp$FfTC~Gw-ulnw#?+=WDdC3ONAYC3r*&KUR!Y*|6 z7KtbE)0`j1i(Xu>YpkkLlylqRt{th#F#@VIYRfXiDc;4-fm9Fqu<84S#p49~3qI-_ z3!@i?^{wd6hetT}$P0^dy!;7aP<_vuhhTDJW(OA^P5W0u&j0R!ZT{dqK3DG_oIl_{ z2PkCLtze3?h(O;xQT@~HRj&XdmEN<6XC1YAGlL=|C|4enVY>HrMp;tJU*ln}0TgPf z5KKjNc=_AE(j6=bNAL0C&zlw4Uy8OeoRuGqxT(#YRRMv3@95EyCd|1E!J&4%(sYhH zQ%BnvD}kgP3}P(gM2rf}JKhJGoiXPz0Y`d8%a1OTq|MhyTp^e7bK{3UwsK>@(L?Dr zM8*RseXIkgq0u9y6|R0O(xFR52fHi4wO4}O74)31+m_U6hWS?o`$%ua=H{z40}uT< zXikDHMj;i7xi4L1M{p54%kN!m@hrQj|JVb&Ij}>qMU0h!YbNf08sGHOv( z0rg??R9ym^Xg?iJVUIh-UFAcA_IWl+{4=h2&p&n!OKYLgVTCTW1QrgYbi_iMlRtxv z9tjz_Z!-y-^{VF2ctjMg<@j`|@3ikKy29Iy~84?{t-RvbVeL3buZ>ZCe^szkEuN-{MzAdH;i_If7oeQ73m=aYkwJ>7PPB`(|l_j*hP~U>ehkV0Q z1OJpGW3dGD6A~!evJj?DkiSQ4#4`t;q9Xw`h;SKKv1r3^fOCtUsZe(s%kigmox!kbY5CgWW>fkA%475`vyaO017B_vtuoTSSqU)M ze`8Bb%6CmrL@`3BlQcj@BmwtGD@ONI$erFkiO>gTQEk`&P_%tuZ64Bc#71)!d?KRh zTd{sKDSD~deuH*s*{r;*f^fub>UvB@(i?OHyn1-k#(wcRi@L3^_6Sp4Vcbq!Mn@qY zUP1ck*FS>@dBfjm!BVQbb*t}ClkMZXNr(Rd4kTC#wo!4*`(<;OzH`Jv)lZ{2U9bSSZD1o`~412mv7jgv3b@OHZY*X55cAj+;hlrUT%ZS^HlP4D6_HxgVnvuUzqa)&0o=@_ zGWrz%4{;8sH_)rwBM(KbCAUC&zrP}aqGTK0rJ>__y4DuYs+6|axtw!-@=ufqY#GWK znu%6G%05t;IiYbIGp!xL3yt2F${Ivgd<)8dNjyT&vd-~$2iw&jYSdI1I zIpwWp61()&!S*|FM3jc!Qnyd|b`atmqYVUK@hg znyU#kb)s4wb#^%I48}Ql)SM0zADue#P9lSc*vtarIAh%3EZ&57OUJwl0&jaJqdT?j zehsfmd^*(IIVB~udn*Lu7b_~A7yEcl^DtHV0LjH+?J9$$<~GLvMX15`FsI(Lk?q8U z64NFQ*&%%siAlBiq9AQTONu#2sbpSThhP;pJ$n`lvZ++f3UXNKu@jIVIYCl1`n2*` z-cGj?P}`2&*zvLvZubYtU%(&KPR{zxpc`aOPM@iB+rRd3@;zU;&gx&|AA12T2aJc| zh5@I~{Ss??OSA3brw*hLYeHkb z>8jXas+Gj9!ABGJO-!?srCt3v3qyYsuS-w~_UUh%vQcZ9Z!L}1U9n3C5vPMI-Wq4Y zz?w?gw$d+g^G~TTC3^LdjBJB1-tx6?Xw}EIe4N(&_IAVIf&^~Z{-cT;IBYPmXHqEY z!VSNskG6BeDYcVGJJhVhbN;9V<)F$H3GHV@3;z@?m61(HUZy_iU!{wRS-&n^+*GNW zy9s86jS|yZG9~0C*x>&Pke-6ltWxf*M)6a1P^^`#sd7kI(<)1hv;&jX9HGd88lYu@7O6{C{pe|TX;t0%)o*mG8mt-Sv&a&Q5#^@}8-28%9C_7oV~JcGX;3CdEP%#*GJG}Cu4YSH)zXG7d>y|GE^nIgDF z`Qhx4s7`v$c1!)BjEl*wzr=Kw++Sz_7K?N@{kgMiy(JQlR>me7kDCo1H&TcT+6XpY z3rc7fyjKA!{{)WSZoG@-e-N-%58nMql<>=0H!l4)s8dP9?rD1Q3RXW}Qb!dzz{J%I zi)1^)p4?-<;NBV%b~`x8kT64ix{Nc^DH2#b!dyB@UKY2-9r*l82-) zZbRdyzlQ{>EvTWR2NwNC`hn8E^h3NRmfnztF|^I1==bz!tG8|2SbRUi2!kO&k%usCfc% z4NbUqW=?30>yhpC$30Cf0$wB9Vf9devXmW+W)|B1oizmme_G)sUey4wFdjouFFdF2JZ>6k6++rt*?7yUwa+T57|w|_S<95 z*It`)@qJ3>xtW}Vasbs4)D}d%3hni(oRNIwn96$4zJ;d6uKQ;Kuh;qeX*0!Q=2IsF zJ)WpiOew$&t@3Q*kguC)8}`_GrA;9ac^2yb#S49B+FOfJ^^MWdF2(pA`*P4rotDbR zed0rBzQ;}|ui%$h8>j0ppt03c7W2`nl8Eb?X@>!_gQPfuT25rwc9qiIp0v)llPU>m z!U4XPZyzSjaj^5?Rf=8zn;hhp|M@r|D7^6%1Wlj|UD{&%YZej8*eJYf5^MOM-=cH$K=N+B=W9^VAB62C`* zOe%`DSm`B(tPxDmQKLKGbK`NSfx9zF$VX^V_UZ?^G=vuVPNcFag}Aqb2Sz;8msM?= zcG&M7l_?ku&%Zt2m=Kz+{6+o3xb>X5jS08woz=C87U zic@`H&OWorZrLHYKl;^!u310&tQ7rbY{B#<;^qJ^#+BA9ch_b!d4*4L$Dwh5lfOCy z{avL&0>V5W?P^@y>rX$j(_p+45xQ_8k><)-SW5wD4-fHySPz_ zQ4x7abie24gNAgYu_azD#Dc}g-7Pxxu}4mB3Ly@reH-5`R zWK6l0y1dPQ2dofka6#4*aiuy3xFqIv0&n%*s&lIuK3(HQ3Ol&817dAbkZZ_#5t%dA z4{Bvg#7X#{(DObTZ8xMn>fW-*6q#+$VPl2NQ+tb-5T6 zcl}XaL6D*DbrV=1S~0Ii)j5eX;O>Z<9Q3yLTp>43P|~wD(qp8&A)k6jp@l$hos{tM z#PToahTfH}i)a1l@9Q`#0^MB$;Hrtkhw*pUA@|VtDQ!OvZbU(&(~y=7yD@H3x_M~a zG4L9hb?^tG_Vfqx@i}I^eT*>PhXaACmPO*0fV3as8>Vkc!-(XK$k-oh`5m9v(5>}LUg4f=^uNz`@aNdkqVM?4Jb%g% z@z2c)g-3s^bn-l%j&YI7UJD*OJcBifc4*-W3mkcvXd1vWJIL@X!bRj ztdB1F@fjsY4C;0aSV!b)SVz43s`On{T6i7~P!|CjIJ86RfDupv0x8;nK;)D1j+tHf zrDq4ZLLtAho-S$Q$W9l=I*E*@b}n@?i~N^lCx4dL)WOb0r&(ODwOn{P(mJu=Kk@cx z8ylK|LLqJ2)xs=o8zCi1XV`2G8|;f~`M@7Qude4t{UxjX*VI=LRG&_>S5EEOk& zOevFOhZY=wsD49U7sgop=tw=9H_ZUs7X8{k>%A*6-8$4KHg8G;_j{1}p-J(Vb>iKC z7@j)3a1;B$Xa+Z(FIg-r06CO*?`)cHM#qiqu@_I^ZSmY&C*htqX*_2_QW(M{Nla0T zv23Fu?is*gOne4T=_skYERV|g^Kq{_o`TtN>s8Su0IQQtJ0pD?`BlO~GC?(uk&t`5 zBTh)u^G!|rjkwj?@=-{DAS5b+qAmAQ0P6i5sME7vfisT=(C0&d-buFDP=`qM=;7AI zXUg2f?p5znZ}A0HedypcW+>EGF+PONH2@O(W(n6su^@y{9!EzkXYeoI^b=&c`AE3(9S>_6`E(-bwf z(>UKMdP6X-#JYRzOyeAGCFMe%LS$nRg)29pxf5%q1#|T6J5$-1J-Mad)pQGI%=AhS zRbig4))dVU)D*G?6WnYR|Ru5XRQjOr|q`iE@$~jlw z+25guyC_nv-j>@Bo%;;+a0iMGoF9q~8?OoYkokMjL%GEJszDB82{w# z)EetsgfWSb%mVA2d^2L=i)2ZYC~ zNwHbj^CV0c39FqvE(&CWA2vs3?^+5JjX59$Oi~BKeesZ#G06sGpJg#I5_1@!4uHk$wg8 zWVS5TKT4uq(#^67qgkgP2@@|Z)hMUq-id{_LyQ;At>PAhdH}u()<2si^0cH{rhC2#%M69?BWUlrF;mjy|R)1nF z3c4mhCb^Dkj+iL?zOy|;dh_*qX)vmmB>aM0>pDjg>1>hw*3d$Nn|-;$j}`k}bZ&8U zN%^@gLIW|C^FT7QW;@YB0_&$L}&%GJ{Dg^I)wIwt6x7{zJH9nCb?zZld{&i z*IV)5Wq_-8E0$ zO7ey?bj_QXk(1u=Wmphh0yxLcID2rZ*(SF$Ge8)t4P$^be z!$$WNfG1m+-aAjBv&L$^wa8VFe5j?3!yNbrYgX5ZF;Bp2+K~`ZYsGSgy3aUU7*x~7 ze_!!1CSTvXgWLO?l;V}dm9I@^2L!AtsmA}z z+7r`LOE77CZz!t{egkOa2H_TzyJRyo(qcDCT20pmJ2EsvYrZ{l-+W2Li%V}M@{KG% z%9GwUlvv+%{2=j>O#l;dJiSd>)ZH28!0n!hwZ?SBANg}ljVkA)oRWxZ8HItS>3W{& zDuNv<*=;hlP$fRN93M(}@RsVy>QklPwbWa=P~KeS8((bimuC=_(H%LnkfBGGM?aFN zu#Si8>cjV`;yJi1SCUjNtYG#X$dXGe>uk*`bww8p0fM^J0`{JZWUt5^HY*$6p8&-< zX?)B=F8IR>?WZmigpVH)(oEt zByWiPNuQ}Z@6mwZ^!5>9O!=6}U$J6=g??%St8r{5>ML8J-vZ)n{B|1hBQ95606l#5 zqPLIyl8e6fE|ewA0Bb`%)@bzUzl?AAx=;!0wrwOTJvn{j7w>f;=$dZP?Mbsmz|P=C z8Jcfc^6^kF6@5~0YAu7ccNq5q`IT2 zvJU}jdiU}HQvA5U1Nf9{|!C(CZez57jysgbikj7a^sfZ6CyfE@qI7RbI zkRD=ROpwE!46(`@0ft6?dP&67)RDVK zWQZbWVLs@$fw99VvLw9E<3gtQpjTt+TwI$O{^Q_x>b_85AMa#gr|gT09fDMgHVyJ@ zBk5YC{<6u91X_Wx#lauyzPxFVS)m)#%kX9UA@CM{T9|^q}z}4Nd=`s(!JtM?L~kqO`mh`;j379bc(%`-a=h zXF>Vh8N&ilTVFCik4v$`>3zJQ08AH<^}?*O5G^0B$Od zu^Ns>&C|$P{7@63k~|R)C$mvDe0uqmsoDP7GPJW-clVEOC-PWIAjKIRV9q>FG|RqK zAI~&*LM^$p9gsKk`lG4a|C=~%;j+8hn3J}HS0Aq;T8`iVYX(>ef5$B3`Hq!zNPSs1 zqhnoo@P2~DAg-U96`?$h%P^cNW?oBlR7dHLAyKy@%QmIxi6q#_sDlT1*H~8(uc-+k zOOR7t#>^X5rnPS1OKtjCQH&N%VMF42o>Ei{f29 z8o;5}AnH7PqchXz2q#M~=M1D;O$m>Fxm0w&4f6z|JJi{uvTtfqLWAf$s|u(tWSZQ+ zQ%ml^K~tE8Esv~A;A+=_D~vSl;v8!o12^DR)jzpJCD&*qTeB)5MiWpT?Nl zpg;rlFAkB~ON=z#{_^I~<;g>;Vz851X9>pk*vKPQ-R_A|P-~=}$sfN83hbQ3FNB8_ ziY@FtN^4?0pr8A zcBhxk=xq@(=p^kT*layEzMt%QHfMdKcyTaDKgh~+$eos4?()3(Np{Bci@8m`CQM}7 zxq#)x3OW%<(9|*kIsJHj!!Zc^YcZnR46v@!{7@bAZQ2XfnCreBA!DmyoG3P#Smc-v z_Y&Rb#0Ta*;=W995YOwUD_n`YO>ZoY*Iboq&xJiy%^y0PFBW=I_aGu-2pF0xhJ@v)=?N@??^P++_H=Ves!>K|y zzkD`{<@NGJ!4Mch5u)??`&}2 z>REMI5>5@!qM@%u+1q%R;vV}aUjQv+X0$v}HZQHJ61eHmYEZ|#s#T5#X#8-OHem~` zS11vjI&GJ0edi=(?XJYf_p$LET8Ihngjm;kE7$AMEXi5dFjuf@a%~P)GY5IsIG>P+1G*qX%c3#ywS5yLU!c13$$e$3%8Z zW`kV=Qo%gxlhO-=M!lsA#1!k^DbL82r)c2pO6_2Mmm z6!?9;IZ*1`s(8ZndvWr9e9H516m~9b$Ww0Ii2AB!IeUs$to`WKA*c5~lrqag; zs%8KvwM9Cfl_w`M6*p|%;<5BuUDP=iGim1V9a0!7>+NnfYi zF|kF3m?qlZ03INEI69dTnx%AO_^hkWv}L8Hfy1cOF78rj*!juRBbSo?y^-ICgi<7^(%3H$lXEs%)|kG$UFIcaYpXR zdA}_%a>Y{-;3CWZ*WymOLlhvj{SS9C;-?pw+uQ@3U5{>gB zYZ3R>L(iholYQU#gQl_J-TeUOQ6-osV9By^a>>M9_>QbQ~;Yizqi~ z{UReVqQj0PG}_(V=;}TlXSJ?#QGoR5>ZYjL)zR*Gk10NwytXvGt?ZzO1G=>Lf{hEu z`YJESx<;Z)ImS|f$7&rudCW_i)CJ>6FyVJHEmt3nXPH_b)p^b!H#s!M9@w|eE|$=hnmdTI4f9=c zQJi{H2N#}7O>!T&;%SlJ^HhpJa}Ke$VNw^gOx+5<(+%STQ^-}J zMrOnX{;*UQWa?RV62yiD*=J8-m^7~bM$UegvN&aPk#5~wD{`7SZMs}f?n>>%gqd#} z?_?Vz#+i)L@@{AMj9@GAnJBkqcWt6DId>iVg}gYVq@_BXY_AZ=>i=uoEBby$P-KU5 zYlz$T(r0QaIZ`{qb+x4n?+V+}5@b&&kc⁢5}G*nZCAIG|hL}FE3zlBPU*VRP=mM z3u2W2z_`Kza-&F@o-52C^cPaS8u}u%w>=luJaoX#?N@PK!GTduniTpY=vLI^p;x5Y3uD} zx|LhNR6=$88QfR(x^{U&*lS*@!uKB~wH|X_kSpCWkw-qvQewxK`dpW~`}a1ojutre z-NSmADFKP;&WP>Lx9-U8^%bp5C-^a>J%-r7Wiu#E?tfTUwVFP6F}lOaN6RZ0e8mCy z_h~PnXEeSoY?bcpA^f;N{q#8Y4t;a^$Ox^&apmxU!hcN-uSR-N9!cD#>O!ji;5+ic zBf-Wi^vU&+N%?we)=X>dL8IUGwe?EmXT!blv*S^3qDQu;a!*lK;uMOd$YF(mMX`Lc zDgO0gWLyc3@J06L>}KZ;i^_J9`A<~^u=<60B=eSP@G#vwP8!L2aW+7h7e^gf;i+au zod#R0;*WY6o?g@U9hNULYpSj7bnecGA8s8{d%dV)&X;^cr}MZx_qZ<*If2%@ErVo{ z{a4aOaT0xNy?T95pWD1iVF<$dah+b8tm}1FZ;M+V1<=>uY z=DjoA9cQKjBx(pCaEvdAJTd7Y9?Q2ZfOMMR6bdS<`<6qA?T8B)+0tKpyn~cqz}Hi4 z^c;eS-*G2BtVrZ&LI^1wZ{RtjwVX~)XF@&he=eS}etj_ho^UgIN|fc~%PZX(yTKX;ngAl%>Vs%h6aO)ufVmRTh|EM_ z8%uhxz4`DmQVQ=67^{lx5oGtyf7{%YNGt|Ms&WE|%pSyWwC3xqv5Dr!EA}G31=Yrb zp7kGQ?oFS8lu-1@>>ueOltOW6dDxAP3k@MGlk9xKiXPXY-Lf6~Gs0@B!0o&Z2Eqw^ z<5OS6U=xNq7!?tlU35Gp~YP(F!~Z=+B8seYt9xsL$WvC%dC4pJjG{N3uHk0mtBL zjW+mMa5&2wsawfSX6|N=k5A6(NNOVl#t1+9ow&p^^jmoWxt?W2Ra<>o!nyH=HogZH zp66eMq_|_P4w85tzxCm}*oosr<~kUxf{A+S%DDB;2jZ;;cMXwEw zdf&d!KV82ld^r z({Msk+|{d8@2<5$*Oel_>2Gmw_dZ&_pykG?I-w5U(+Ci#2%EO1txZ^kh1AZp@;9tR z`$PA)&xxa;pP0mVE^=Q(I!}EFwYcUnH(m7ljLp&0g9O$F-jbU6ZyXDZVBiVv3{XPe zkt|&LL+sbo(;~42i!T(As=j-;Ab?7&TeOQFTT9=lXGaU#NY@#b@eOf_of~0|^oX7DO>K0JhV| zH4{lwzqXxrT=^`e<^TKvN1}P&=`Vf$+&SjFo|zp?b^GS@@I58FfpmBvnE(x&pupf^ zcQ+N2BXZV(F`<6UtL5YS@b-p_xDflEXdy(OqH6AyX^EwW+Nq?IwFCGur0}pZ-Jfr& zo)G7bPo}$MIWxTcZUWuqGjd9B+mw!Z;qZao_L^2A_np)Hw=;Br{sbjaN^I=`y}#-K zjr@g7ihszl8NrQIWe1&S_Uv;+vMHyf@IX?*FdhgA9%oTV6DyQ2KPNQ&j`q8O;ccYe zzkm>PY5T##%tv`eze)cRAMOpU!mdm?;QxC;o&l7e(9ZqT4Kz(tv8pBf_TRWv-d4)R_O3OkghU1xcXzk|x`r9@a=#Jg}Cp7UL zP|2E4=9xzBr1jmKDD1b~AQ0&Mz;nvR^X{44k>q9K>{j3l7&oUKC_2#1b8&3ZNg{^a zNPK}4th%h2!G#PbLv(kG!)+ypE?9(MZ@rzN+kO`;AxDnFEBJW29aSE;;H81uoCdrI zjF7ihsQ(3<@P*Clo|8KJ=O7>hXw0G(kBqW{27Tog@bo$!_J^z1A zdUR*nMgO!hrYNP-fy8igAAdAMFZ|yY)gF4=*q_?#BzxlXYih2Ft@$e5nP|OqoyidI0J!1de1b8@Nhi`gG z`W8rmu>a3)LmS)J`G+|G9`Z6O(lwGM!T%3kCtW}Q literal 0 HcmV?d00001 diff --git a/packages/stage/src/lib/components/Stage/components/ParticleSystem/types.ts b/packages/stage/src/lib/components/Stage/components/ParticleSystem/types.ts index b652d7b7..18048b2e 100644 --- a/packages/stage/src/lib/components/Stage/components/ParticleSystem/types.ts +++ b/packages/stage/src/lib/components/Stage/components/ParticleSystem/types.ts @@ -1,4 +1,5 @@ import ash from './particles/atlases/ash.png'; +import fireflies from './particles/atlases/fireflies.png'; import leaves from './particles/atlases/leaves.png'; import rain from './particles/atlases/rain.png'; import snow from './particles/atlases/snow.png'; @@ -7,7 +8,8 @@ export enum ParticleType { Snow = 1, Rain = 2, Leaves = 3, - Ash = 4 + Ash = 4, + Fireflies = 5 } export const ParticleData = { @@ -34,6 +36,12 @@ export const ParticleData = { size: 768, columns: 3, rows: 3 + }, + [ParticleType.Fireflies]: { + url: fireflies, + size: 768, + columns: 3, + rows: 3 } } as const; diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte b/packages/stage/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte index 9970feac..df3834e8 100644 --- a/packages/stage/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/WeatherLayer.svelte @@ -11,6 +11,10 @@ import RainPreset from './presets/RainPreset'; import LeavesPreset from './presets/LeavesPreset'; import AshPreset from './presets/AshPreset'; + import DustStormPreset from './presets/DustStormPreset'; + import EmbersPreset from './presets/EmbersPreset'; + import BlizzardPreset from './presets/BlizzardPreset'; + import FirefliesPreset from './presets/FirefliesPreset'; interface Props extends ThrelteProps { props: StageProps; @@ -83,6 +87,18 @@ case WeatherType.Ash: weatherPreset = { ...AshPreset }; break; + case WeatherType.DustStorm: + weatherPreset = { ...DustStormPreset }; + break; + case WeatherType.Embers: + weatherPreset = { ...EmbersPreset }; + break; + case WeatherType.Blizzard: + weatherPreset = { ...BlizzardPreset }; + break; + case WeatherType.Fireflies: + weatherPreset = { ...FirefliesPreset }; + break; default: // Fallback to rain preset weatherPreset = { ...RainPreset }; @@ -134,6 +150,13 @@ + {#if weatherPreset.secondaryParticles} + + {/if} diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/BlizzardPreset.ts b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/BlizzardPreset.ts new file mode 100644 index 00000000..ec771523 --- /dev/null +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/BlizzardPreset.ts @@ -0,0 +1,73 @@ +import { KernelSize } from 'postprocessing'; +import type { WeatherLayerPreset } from '../types'; + +// Driving snow: dense flakes stream diagonally in a narrow depth band +// so their apparent size stays steady as they cross the map +export default { + fov: 70, + intensity: 0.85, + opacity: 0.95, + depthOfField: { + enabled: false, + focus: 0, + focalLength: 0, + bokehScale: 0, + kernelSize: KernelSize.LARGE + }, + particles: { + maxParticleCount: 6000, + opacity: 0.9, + type: 1, + color: '#ffffff', + fadeInTime: 0.5, + fadeOutTime: 0.75, + lifetime: 3.5, + spawnArea: { + minRadius: 0.01, + maxRadius: 0.2 + }, + initialVelocity: { + x: 0.05, + y: 0, + z: 0.11 + }, + force: { + linear: { + x: 0.004, + y: 0.002, + z: -0.022 + }, + exponential: { + x: 0, + y: 0, + z: 0 + }, + sinusoidal: { + amplitude: { + x: 0.008, + y: 0.006, + z: 0 + }, + frequency: { + x: 3, + y: 2.5, + z: 0 + } + } + }, + rotation: { + alignRadially: false, + offset: 0, + velocity: 2, + randomize: true + }, + scale: { + x: 1, + y: 1 + }, + size: { + min: 0.0007, + max: 0.0022 + } + } +} as WeatherLayerPreset; diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/DustStormPreset.ts b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/DustStormPreset.ts new file mode 100644 index 00000000..7ec27567 --- /dev/null +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/DustStormPreset.ts @@ -0,0 +1,129 @@ +import { KernelSize } from 'postprocessing'; +import type { WeatherLayerPreset } from '../types'; + +// Grit streams sideways in a narrow depth band (constant apparent size), +// with a secondary layer of huge faint puffs billowing along behind it +export default { + fov: 80, + intensity: 0.8, + opacity: 0.75, + depthOfField: { + enabled: false, + focus: 0, + focalLength: 0, + bokehScale: 0, + kernelSize: KernelSize.LARGE + }, + particles: { + maxParticleCount: 4500, + opacity: 0.55, + type: 4, + color: '#c2a36b', + fadeInTime: 0.75, + fadeOutTime: 0.75, + lifetime: 3.5, + spawnArea: { + minRadius: 0.01, + maxRadius: 0.25 + }, + initialVelocity: { + x: 0.06, + y: 0, + z: 0.11 + }, + force: { + linear: { + x: 0.004, + y: 0.002, + z: -0.022 + }, + exponential: { + x: 0, + y: 0, + z: 0 + }, + sinusoidal: { + amplitude: { + x: 0.006, + y: 0.008, + z: 0 + }, + frequency: { + x: 2, + y: 1.6, + z: 0 + } + } + }, + rotation: { + alignRadially: false, + offset: 0, + velocity: 2, + randomize: true + }, + scale: { + x: 1, + y: 1 + }, + size: { + min: 0.0008, + max: 0.0022 + } + }, + secondaryParticles: { + maxParticleCount: 250, + opacity: 0.14, + type: 4, + color: '#b89a66', + fadeInTime: 1.5, + fadeOutTime: 1.5, + lifetime: 5, + spawnArea: { + minRadius: 0.05, + maxRadius: 0.3 + }, + initialVelocity: { + x: 0.045, + y: 0, + z: 0.11 + }, + force: { + linear: { + x: 0.003, + y: 0.001, + z: -0.018 + }, + exponential: { + x: 0, + y: 0, + z: 0 + }, + sinusoidal: { + amplitude: { + x: 0.004, + y: 0.004, + z: 0 + }, + frequency: { + x: 0.4, + y: 0.5, + z: 0 + } + } + }, + rotation: { + alignRadially: false, + offset: 0, + velocity: 0.3, + randomize: true + }, + scale: { + x: 1, + y: 1 + }, + size: { + min: 0.015, + max: 0.04 + } + } +} as WeatherLayerPreset; diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/EmbersPreset.ts b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/EmbersPreset.ts new file mode 100644 index 00000000..fd76c98f --- /dev/null +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/EmbersPreset.ts @@ -0,0 +1,73 @@ +import { KernelSize } from 'postprocessing'; +import type { WeatherLayerPreset } from '../types'; + +// Embers rise: particles are thrown deep, then drawn back toward the camera, +// so they grow as they "float up" off the map before winking out +export default { + fov: 25, + intensity: 0.8, + opacity: 0.9, + depthOfField: { + enabled: true, + focus: 0.75, + focalLength: 6.6, + bokehScale: 150.0, + kernelSize: KernelSize.LARGE + }, + particles: { + maxParticleCount: 500, + opacity: 0.85, + type: 4, + color: '#ff7733', + fadeInTime: 3, + fadeOutTime: 1, + lifetime: 6, + spawnArea: { + minRadius: 0.01, + maxRadius: 0.1 + }, + initialVelocity: { + x: 0, + y: 0, + z: 0.3 + }, + force: { + linear: { + x: 0.002, + y: 0.0015, + z: -0.05 + }, + exponential: { + x: 0, + y: 0, + z: 0 + }, + sinusoidal: { + amplitude: { + x: 0.01, + y: 0.009, + z: 0 + }, + frequency: { + x: 0.6, + y: 0.75, + z: 0 + } + } + }, + rotation: { + alignRadially: false, + offset: 0, + velocity: 1, + randomize: true + }, + scale: { + x: 1, + y: 1 + }, + size: { + min: 0.0012, + max: 0.002 + } + } +} as WeatherLayerPreset; diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/FirefliesPreset.ts b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/FirefliesPreset.ts new file mode 100644 index 00000000..bb7dfcd8 --- /dev/null +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/FirefliesPreset.ts @@ -0,0 +1,73 @@ +import { KernelSize } from 'postprocessing'; +import type { WeatherLayerPreset } from '../types'; + +// Fireflies hover in a narrow depth band (no falling), wander sinusoidally, +// and the fade in/out over a short lifetime gives each one a random glow cycle +export default { + fov: 90, + intensity: 0.4, + opacity: 1.0, + depthOfField: { + enabled: true, + focus: 0.7, + focalLength: 5.0, + bokehScale: 60.0, + kernelSize: KernelSize.LARGE + }, + particles: { + maxParticleCount: 180, + opacity: 1.0, + type: 5, + color: '#d9f56a', + fadeInTime: 1.5, + fadeOutTime: 1.5, + lifetime: 4, + spawnArea: { + minRadius: 0.02, + maxRadius: 0.15 + }, + initialVelocity: { + x: 0, + y: 0, + z: 0.12 + }, + force: { + linear: { + x: 0, + y: 0, + z: -0.024 + }, + exponential: { + x: 0, + y: 0, + z: 0 + }, + sinusoidal: { + amplitude: { + x: 0.008, + y: 0.009, + z: 0 + }, + frequency: { + x: 0.7, + y: 0.55, + z: 0 + } + } + }, + rotation: { + alignRadially: false, + offset: 0, + velocity: 0, + randomize: false + }, + scale: { + x: 1, + y: 1 + }, + size: { + min: 0.0015, + max: 0.004 + } + } +} as WeatherLayerPreset; diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/index.ts b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/index.ts index a27d99d4..088f4454 100644 --- a/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/index.ts +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/presets/index.ts @@ -1,6 +1,19 @@ import AshPreset from './AshPreset'; +import BlizzardPreset from './BlizzardPreset'; +import DustStormPreset from './DustStormPreset'; +import EmbersPreset from './EmbersPreset'; +import FirefliesPreset from './FirefliesPreset'; import LeavesPreset from './LeavesPreset'; import RainPreset from './RainPreset'; import SnowPreset from './SnowPreset'; -export { AshPreset, LeavesPreset, RainPreset, SnowPreset }; +export { + AshPreset, + BlizzardPreset, + DustStormPreset, + EmbersPreset, + FirefliesPreset, + LeavesPreset, + RainPreset, + SnowPreset +}; diff --git a/packages/stage/src/lib/components/Stage/components/WeatherLayer/types.ts b/packages/stage/src/lib/components/Stage/components/WeatherLayer/types.ts index c62749cc..f8a003cb 100644 --- a/packages/stage/src/lib/components/Stage/components/WeatherLayer/types.ts +++ b/packages/stage/src/lib/components/Stage/components/WeatherLayer/types.ts @@ -7,6 +7,10 @@ export enum WeatherType { Snow = 2, Leaves = 3, Ash = 4, + DustStorm = 5, + Embers = 6, + Blizzard = 7, + Fireflies = 8, Custom = 99 } @@ -24,6 +28,11 @@ export interface WeatherLayerPreset { opacity: number; depthOfField: DepthOfFieldConfig; particles: ParticleSystemProps; + /** + * Optional second particle system rendered alongside the primary one, + * e.g. a soft fog bank billowing behind dust storm grit + */ + secondaryParticles?: ParticleSystemProps; } export interface WeatherLayerProps { diff --git a/packages/stage/src/lib/components/Stage/index.ts b/packages/stage/src/lib/components/Stage/index.ts index 1fd54bcb..aacc6be5 100644 --- a/packages/stage/src/lib/components/Stage/index.ts +++ b/packages/stage/src/lib/components/Stage/index.ts @@ -38,7 +38,16 @@ export { default as PointerInputManager } from './components/PointerInputManager export { SceneRotation, type PostProcessingProps, type SceneLayerProps } from './components/Scene/types'; export { default as Stage } from './components/Stage/Stage.svelte'; export * from './components/Stage/types'; -export { AshPreset, LeavesPreset, RainPreset, SnowPreset } from './components/WeatherLayer/presets'; +export { + AshPreset, + BlizzardPreset, + DustStormPreset, + EmbersPreset, + FirefliesPreset, + LeavesPreset, + RainPreset, + SnowPreset +} from './components/WeatherLayer/presets'; export { WeatherType, type DepthOfFieldConfig, diff --git a/packages/stage/src/lib/components/Stage/shaders/AnnotationEffects.frag b/packages/stage/src/lib/components/Stage/shaders/AnnotationEffects.frag index f9b1ede9..d5be292d 100644 --- a/packages/stage/src/lib/components/Stage/shaders/AnnotationEffects.frag +++ b/packages/stage/src/lib/components/Stage/shaders/AnnotationEffects.frag @@ -1139,6 +1139,206 @@ vec4 webEffect(vec2 uv, vec2 texSize, float time) { return vec4(color, alpha); } +// One vine segment seen from above: a tapering ribbon between startR and endR from the base. +// centerAngle is the strand's centerline direction at this radius; returns x = body, y = ridge crest +vec2 vineSegment(float r, float phi, float startR, float endR, float centerAngle, float baseWidth, float seed, float grain) { + if(r < startR || r > endR) return vec2(0.0); + + float dPhi = atan(sin(phi - centerAngle), cos(phi - centerAngle)); + float arcDist = abs(dPhi) * r; + + // Segment thins toward its tip + float taper = 1.0 - (r - startR) / (endR - startR); + float width = baseWidth * (0.3 + taper * 0.7); + + // Long, gentle swells so the strand isn't a constant-width tube (kept low-frequency: short wavelengths read as beads) + float along = r - startR; + width *= 0.88 + 0.12 * sin(along * 7.0 + seed * 9.0); + + // Grainy edges instead of a clean gradient rim + arcDist += grain * width * 0.35; + + float body = 1.0 - smoothstep(width * 0.45, width, arcDist); + float ridge = 1.0 - smoothstep(0.0, width * 0.5, arcDist); + // Dappled crest - broken highlights read as leafy texture, not a specular line down a tube + ridge *= 0.55 + 0.45 * sin(along * 31.0 + seed * 12.0 + grain * 4.0); + // Tips sit higher, closer to the light, so they read brighter + ridge *= 0.45 + (1.0 - taper) * 0.55; + return vec2(body, clamp(ridge, 0.0, 1.0)); +} + +// Centerline direction of a vine: a gentle curl plus wandering S-bends so the +// strand changes direction as it reaches out instead of sweeping a circle +float vineAngle(float t, float angle0, float curl, float bendFreq, float bendPhase) { + return angle0 + curl * t + sin(t * bendFreq + bendPhase) * 0.7 + sin(t * bendFreq * 2.3 + bendPhase * 1.7) * 0.3; +} + +// A vine clump: a main stem that forks into wandering branches as it reaches out +vec2 vineClump(vec2 toBase, float rnd, float time, float grain) { + float r = length(toBase); + float len = 0.8 + rnd * 0.4; + if(r > len * 1.1 || r < 0.001) return vec2(0.0); + + float phi = atan(toBase.y, toBase.x); + float rnd2 = fract(rnd * 7.31); + float rnd3 = fract(rnd * 13.7); + + // Gentle base curl - direction comes mostly from the wandering bends + float curl = (0.9 + rnd2 * 1.0) * (rnd > 0.5 ? 1.0 : -1.0); + curl += sin(time * 0.4 + rnd * 6.28) * 0.5; + float bendFreq = 5.0 + rnd3 * 4.0; + float bendPhase = rnd * 6.28; + float angle0 = rnd * 6.28; + + // Lash whips the tip while the base stays anchored + float lash = sin(time * 0.9 + r * 4.0 + rnd3 * 6.28) * 0.45 * (r / len); + + // Each clump grows at its own girth, from wiry up to twice as thick + float girth = 1.0 + fract(rnd * 23.3); + + float stemAngle = vineAngle(r, angle0, curl, bendFreq, bendPhase) + lash; + vec2 acc = vineSegment(r, phi, 0.0, len, stemAngle, 0.085 * girth, rnd, grain); + + // Offshoots: thin side vines that split away on alternating sides and sweep outward + for(int i = 0; i < 3; i++) { + float fi = float(i); + float li = len * (0.18 + fi * 0.22 + fract(rnd * (17.0 + fi * 3.0)) * 0.08); + float ai = vineAngle(li, angle0, curl, bendFreq, bendPhase); + float side = mod(fi + floor(rnd * 4.0), 2.0) < 1.0 ? 1.0 : -1.0; + float offshootAngle = ai + side * (1.6 + fract(rnd * 5.3) * 0.8) * (r - li) + + sin((r - li) * (bendFreq + 4.0) + rnd * 6.28 + fi) * 0.3 + lash * 0.6; + float offshootLen = len * (0.3 + fract(rnd * (7.0 + fi)) * 0.15); + acc = max(acc, vineSegment(r, phi, li, li + offshootLen, offshootAngle, 0.04 * girth, rnd * 3.7 + fi, grain) * 0.92); + } + + // Fork 1: splits a third of the way out, veers away from the stem, then wanders on its own + float f1 = len * (0.28 + rnd3 * 0.12); + float a1 = vineAngle(f1, angle0, curl, bendFreq, bendPhase); + float lash1 = sin(time * 1.1 + r * 5.0 + rnd2 * 6.28) * 0.5 * (r / len); + float branch1 = a1 + (-curl * 1.4 - 0.8 * sign(curl)) * (r - f1) + sin((r - f1) * (bendFreq + 3.0) + rnd2 * 6.28) * 0.6 + lash1; + acc = max(acc, vineSegment(r, phi, f1, len * 1.05, branch1, 0.06 * girth, rnd2, grain) * 0.95); + + // Fork 2: splits further out, finer, whipping back the other way + float f2 = len * (0.5 + rnd2 * 0.12); + float a2 = vineAngle(f2, angle0, curl, bendFreq, bendPhase); + float lash2 = sin(time * 1.3 + r * 6.0 + rnd * 6.28) * 0.55 * (r / len); + float branch2 = a2 + (curl * 1.8 + 0.9 * sign(curl)) * (r - f2) + sin((r - f2) * (bendFreq + 5.0) + rnd3 * 6.28) * 0.5 + lash2; + acc = max(acc, vineSegment(r, phi, f2, len * 1.1, branch2, 0.045 * girth, rnd3, grain) * 0.9); + + return acc; +} + +// Entangle effect - writhing tendrils that grasp across the area +vec4 entangleEffect(vec2 uv, vec2 texSize, float time) { + float mask = getVolumeMask(uv, texSize, time, 2.0, 0.15, 0.8); + if(mask < 0.001) return vec4(0.0); + + vec2 basePos = uv * texSize * 0.004; + + // === DENSITY GRADIENT - tangled center, grasping tips at the edges === + float maskHigh = textureLod(uMaskTexture, uv, 0.0).a; + float maskMid = textureLod(uMaskTexture, uv, 3.0).a; + float maskLow = textureLod(uMaskTexture, uv, 5.0).a; + float edgeProximity = 1.0 - min(maskHigh, min(maskMid, maskLow)); + float fringeSpread = uBorder * 0.8 + 0.2; + float fringe = smoothstep(0.0, fringeSpread, edgeProximity); // 0 center, 1 edge + fringe = clamp(fringe + snoise(basePos * 1.5 + 60.0) * 0.2, 0.0, 1.0); + + // === VINES - forking clumps reaching out from scattered anchored bases === + // Vine size adapts to the drawn area: the mask's coarsest mip is the covered + // fraction of the canvas, so sprawling fields grow proportionally bigger vines. + // Anchored so a ~5x5 grid blob gets the 2.4x scale this was tuned at. + float maxMip = floor(log2(max(texSize.x, texSize.y))); + float coverage = textureLod(uMaskTexture, vec2(0.5, 0.5), maxMip).a; + float vineScale = clamp(0.53 / sqrt(max(coverage, 0.001)), 1.0, 3.0); + vec2 vinePos = basePos * vineScale; + float body = 0.0; + float ridge = 0.0; + float shadow = 0.0; + vec2 shadowOffset = vec2(0.09, 0.11); // Cast shadows fall to one side, selling height + // Fine grain shared by every strand - roughens edges and dapples the crests + float grain = snoise(vinePos * 9.0); + + // Main clumps + float vineCell = 1.35; + vec2 tGrid = vinePos / vineCell; + vec2 tId = floor(tGrid); + vec2 tUv = fract(tGrid); + for(int x = -1; x <= 1; x++) { + for(int y = -1; y <= 1; y++) { + vec2 nb = vec2(float(x), float(y)); + vec2 base = nb + hash2(tId + nb + 9.0) * 0.7 + 0.15; + float rnd = hash(tId + nb + 17.0); + vec2 toBase = (tUv - base) * vineCell; + vec2 arm = vineClump(toBase, rnd, time, grain); + body = max(body, arm.x); + ridge = max(ridge, arm.y); + shadow = max(shadow, vineClump(toBase - shadowOffset, rnd, time, grain).x); + } + } + + // Smaller clumps thicken the tangled center, retreating from the fringe + float smallWeight = 1.0 - fringe; + float vineCell2 = 0.8; + vec2 sGrid = vinePos / vineCell2 + 50.0; + vec2 sId = floor(sGrid); + vec2 sUv = fract(sGrid); + for(int x = -1; x <= 1; x++) { + for(int y = -1; y <= 1; y++) { + vec2 nb = vec2(float(x), float(y)); + vec2 base = nb + hash2(sId + nb + 23.0) * 0.7 + 0.15; + float rnd = hash(sId + nb + 31.0); + vec2 toBase = (sUv - base) * vineCell2; + vec2 arm = vineClump(toBase, rnd, time + 5.0, grain); + body = max(body, arm.x * 0.9 * smallWeight); + ridge = max(ridge, arm.y * 0.8 * smallWeight); + shadow = max(shadow, vineClump(toBase - shadowOffset * 0.6, rnd, time + 5.0, grain).x * smallWeight); + } + } + + // Limbs thin out toward the edges of the area + float reach = 1.0 - fringe * 0.5; + body *= reach * clamp(uIntensity, 0.0, 1.5); + ridge *= reach; + + // === GRASS GROUND COVER - dense turf with fine rustling blade streaks === + vec2 grassPos = basePos * 3.0; + // Lawn tone mottling at two scales + float tone1 = fbm3(grassPos * 0.6 + 200.0) * 0.5 + 0.5; + float tone2 = snoise(grassPos * 2.0 + 80.0) * 0.5 + 0.5; + // Thin bright blade streaks, drifting slowly like a breeze through the turf + float blades1 = pow(1.0 - abs(snoise(grassPos * 9.0 + time * 0.05)), 6.0); + float blades2 = pow(1.0 - abs(snoise(grassPos * 13.0 + 50.0 - time * 0.04)), 6.0); + float blades = max(blades1, blades2 * 0.85); + + // Mostly opaque turf in the center, thinning to nothing at the fringe + float turfAlpha = (0.78 + tone2 * 0.08 + blades * 0.08) * (1.0 - fringe * 0.85); + + // === COLORS - warm olive turf so the cooler, darker vines stand off it === + vec3 grassDark = vec3(0.1, 0.17, 0.04); // Shaded turf + vec3 grassMid = vec3(0.18, 0.28, 0.07); // Lawn body + vec3 grassLight = vec3(0.32, 0.44, 0.12); // Sunlit blades + vec3 shadowGreen = vec3(0.02, 0.05, 0.02); // Cast shadow on the ground + vec3 vineGreen = vec3(0.06, 0.2, 0.08); // Limb flanks - deep cool green + vec3 brightGreen = vec3(0.28, 0.55, 0.22); // Lit crest and tips + + vec3 limbColor = mix(vineGreen, brightGreen, clamp(ridge, 0.0, 1.0)); + vec3 turfColor = mix(grassDark, grassMid, tone1); + turfColor = mix(turfColor, turfColor * 1.25, tone2 * 0.5); + turfColor = mix(turfColor, grassLight, blades * (0.35 + tone2 * 0.35)); + // Vine shadows fall softly across the turf as well as the bare map + vec3 groundColor = mix(turfColor, shadowGreen, clamp(shadow * (1.0 - body) * 2.0, 0.0, 1.0) * 0.5); + vec3 color = mix(groundColor, limbColor, clamp(body * 1.2, 0.0, 1.0)); + + float limbAlpha = body * (0.65 + (1.0 - fringe) * 0.25); + float shadowAlpha = shadow * (1.0 - body) * 0.28 * (1.0 - fringe * 0.6); + float bodyAlpha = clamp(max(limbAlpha, max(shadowAlpha, turfAlpha)), 0.0, 0.92); + + float alpha = mask * uOpacity * bodyAlpha; + + return vec4(color, alpha); +} + void main() { // Clipping planes vec4 plane; @@ -1203,6 +1403,8 @@ void main() { result = iceEffect(vUv, texSize, time); } else if(uEffectType == 7) { result = webEffect(vUv, texSize, time); + } else if(uEffectType == 8) { + result = entangleEffect(vUv, texSize, time); } else { // No effect - solid color float mask = texture2D(uMaskTexture, vUv).a; @@ -1213,7 +1415,7 @@ void main() { // Blend outer shadow under the effect (skip for no effect, water, grease, ice - they paint their own depth inside the mask) // Shadow is dark, high opacity near edge for color burn effect vec3 shadowColor = vec3(0.0, 0.0, 0.0); - float shadowAlpha = (uEffectType == 0 || uEffectType == 3 || uEffectType == 5 || uEffectType == 6 || uEffectType == 7) ? 0.0 : shadowIntensity * 0.85; // No shadow for plain color/water/grease/ice/web + float shadowAlpha = (uEffectType == 0 || uEffectType == 3 || uEffectType == 5 || uEffectType == 6 || uEffectType == 7 || uEffectType == 8) ? 0.0 : shadowIntensity * 0.85; // No shadow for plain color/water/grease/ice/web/entangle // If we have shadow but no effect, show just the shadow if(result.a < 0.001 && shadowAlpha > 0.001) { diff --git a/packages/ui/src/lib/components/Select/Select.svelte b/packages/ui/src/lib/components/Select/Select.svelte index 18ef9517..ed91e6bc 100644 --- a/packages/ui/src/lib/components/Select/Select.svelte +++ b/packages/ui/src/lib/components/Select/Select.svelte @@ -297,6 +297,7 @@ gap: 0.5rem; border: solid 2px transparent; gap: 1rem; + white-space: nowrap; } .select__option:hover, From 3e798fb874eae93b00cb0382262f59d6aababc32 Mon Sep 17 00:00:00 2001 From: Dave Snider Date: Thu, 11 Jun 2026 11:34:33 -0400 Subject: [PATCH 3/5] cl --- packages/stage/CHANGELOG.md | 85 ------------------------------------- 1 file changed, 85 deletions(-) delete mode 100644 packages/stage/CHANGELOG.md diff --git a/packages/stage/CHANGELOG.md b/packages/stage/CHANGELOG.md deleted file mode 100644 index e6fae29d..00000000 --- a/packages/stage/CHANGELOG.md +++ /dev/null @@ -1,85 +0,0 @@ -# @tableslayer/stage - -## 0.0.20 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.24 - -## 0.0.19 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.23 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.22 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.21 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.20 - -## 0.0.15 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.19 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.18 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.17 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.16 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.15 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.14 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies []: - - @tableslayer/ui@0.1.13 From 2163c81a5e324669aa11388b6a126398202aae80 Mon Sep 17 00:00:00 2001 From: Dave Snider Date: Thu, 11 Jun 2026 11:39:46 -0400 Subject: [PATCH 4/5] changeset changes --- .changeset/config.json | 2 +- CLAUDE.md | 7 ++++--- packages/ui/CHANGELOG.md | 6 ++++++ packages/ui/package.json | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index 4785e7fb..25e07d78 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["web", "docs"] + "privatePackages": false } diff --git a/CLAUDE.md b/CLAUDE.md index 276f9edf..972d7792 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -40,12 +40,13 @@ These rules ensure maintainability, safety, and developer velocity. ### 5 - Changesets (Package Publishing) - **CS-1 (MUST)** When modifying files in `packages/ui/`, you MUST create a changeset -- **CS-2** Run `pnpm changeset` and follow the interactive prompts: +- **CS-2 (MUST NOT)** Never create changesets for any other package. `@tableslayer/ui` is the only published package; everything else (`stage`, `web`, `docs`, configs) is private/internal and excluded via `privatePackages: false` in `.changeset/config.json` +- **CS-3** Run `pnpm changeset` and follow the interactive prompts: - Select `@tableslayer/ui` as the changed package - Choose bump type: `patch` (bug fixes), `minor` (new features), `major` (breaking changes) - Write a brief description of the change -- **CS-3** Commit the generated `.changeset/*.md` file with your changes -- **CS-4** The CI will fail if UI files change without a changeset +- **CS-4** Commit the generated `.changeset/*.md` file with your changes +- **CS-5** The CI will fail if UI files change without a version bump (run `pnpm release` before merging) ### 6 - Important File References diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 510e8194..8f6212e9 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,11 @@ # @tableslayer/ui +## 0.1.25 + +### Patch Changes + +- no wrap on select + ## 0.1.24 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 783b50ba..a3c3a9e8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@tableslayer/ui", - "version": "0.1.24", + "version": "0.1.25", "license": "FSL-1.1-ALv2", "repository": { "type": "git", From 8570f90566c0161ed6c88e7f71804257d6f8d4df Mon Sep 17 00:00:00 2001 From: Dave Snider Date: Thu, 11 Jun 2026 11:55:51 -0400 Subject: [PATCH 5/5] fix layer order of effects --- .../components/AnnotationLayer/AnnotationLayer.svelte | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/stage/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte b/packages/stage/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte index f738d308..d0c0151f 100644 --- a/packages/stage/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte +++ b/packages/stage/src/lib/components/Stage/components/AnnotationLayer/AnnotationLayer.svelte @@ -427,8 +427,9 @@ events to be detected outside of the fog of war layer. {#each props.layers as layer, index (layer.id)} @@ -436,7 +437,7 @@ Effect annotations have a different render order to appear below plain color ann name={layer.id} visible={isVisible(layer)} position.z={(props.layers.length - index) * 0.001} - layers={[SceneLayer.Overlay]} + layers={hasEffect(layer) ? [SceneLayer.Main] : [SceneLayer.Overlay]} renderOrder={hasEffect(layer) ? SceneLayerOrder.EffectAnnotation : SceneLayerOrder.Annotation} >