From c308f0d7b0868613ca0fcc528ab95ccce5e95c22 Mon Sep 17 00:00:00 2001 From: Amit Raikwar Date: Fri, 12 Jun 2026 18:29:49 +0530 Subject: [PATCH 1/5] feat(AUD-8): add GlassBox and ElectricBorder shared components - Implement reusable GlassBox component with WebGL/SVG displacement filters and CSS fallback - Implement ElectricBorder component for high-fidelity glowing border effects - Export newly created components from the shared common components bundle - Add robust checks for CSS backdrop-filter and window.matchMedia to prevent JSDOM test errors --- .../ElectricBorder/ElectricBorder.tsx | 456 ++++++++++++++++++ .../src/components/ElectricBorder/index.ts | 1 + .../src/components/GlassBox/GlassBox.tsx | 422 ++++++++++++++++ .../common/src/components/GlassBox/README.md | 301 ++++++++++++ .../common/src/components/GlassBox/index.ts | 1 + shared/common/src/components/index.ts | 2 + 6 files changed, 1183 insertions(+) create mode 100644 shared/common/src/components/ElectricBorder/ElectricBorder.tsx create mode 100644 shared/common/src/components/ElectricBorder/index.ts create mode 100644 shared/common/src/components/GlassBox/GlassBox.tsx create mode 100644 shared/common/src/components/GlassBox/README.md create mode 100644 shared/common/src/components/GlassBox/index.ts diff --git a/shared/common/src/components/ElectricBorder/ElectricBorder.tsx b/shared/common/src/components/ElectricBorder/ElectricBorder.tsx new file mode 100644 index 0000000..066cd8a --- /dev/null +++ b/shared/common/src/components/ElectricBorder/ElectricBorder.tsx @@ -0,0 +1,456 @@ +import React, { + useEffect, + useRef, + useCallback, + CSSProperties, + ReactNode, +} from 'react'; + + + +interface ElectricBorderProps { + children?: ReactNode; + color?: string; + speed?: number; + chaos?: number; + borderRadius?: number; + className?: string; + style?: CSSProperties; +} + +const ElectricBorder: React.FC = ({ + children, + color = '#5227FF', + speed = 1, + chaos = 0.12, + borderRadius = 24, + className, + style, +}) => { + const canvasRef = useRef(null); + const containerRef = useRef(null); + const animationRef = useRef(null); + const timeRef = useRef(0); + const lastFrameTimeRef = useRef(0); + const resolvedColorRef = useRef(color); + + const random = useCallback((x: number): number => { + return (Math.sin(x * 12.9898) * 43758.5453) % 1; + }, []); + + const noise2D = useCallback( + (x: number, y: number): number => { + const i = Math.floor(x); + const j = Math.floor(y); + const fx = x - i; + const fy = y - j; + + const a = random(i + j * 57); + const b = random(i + 1 + j * 57); + const c = random(i + (j + 1) * 57); + const d = random(i + 1 + (j + 1) * 57); + + const ux = fx * fx * (3.0 - 2.0 * fx); + const uy = fy * fy * (3.0 - 2.0 * fy); + + return ( + a * (1 - ux) * (1 - uy) + + b * ux * (1 - uy) + + c * (1 - ux) * uy + + d * ux * uy + ); + }, + [random], + ); + + const octavedNoise = useCallback( + ( + x: number, + octaves: number, + lacunarity: number, + gain: number, + baseAmplitude: number, + baseFrequency: number, + time: number, + seed: number, + baseFlatness: number, + ): number => { + let y = 0; + let amplitude = baseAmplitude; + let frequency = baseFrequency; + + for (let i = 0; i < octaves; i++) { + let octaveAmplitude = amplitude; + if (i === 0) { + octaveAmplitude *= baseFlatness; + } + y += + octaveAmplitude * + noise2D(frequency * x + seed * 100, time * frequency * 0.3); + frequency *= lacunarity; + amplitude *= gain; + } + + return y; + }, + [noise2D], + ); + + const getCornerPoint = useCallback( + ( + centerX: number, + centerY: number, + radius: number, + startAngle: number, + arcLength: number, + progress: number, + ): { x: number; y: number } => { + const angle = startAngle + progress * arcLength; + return { + x: centerX + radius * Math.cos(angle), + y: centerY + radius * Math.sin(angle), + }; + }, + [], + ); + + const getRoundedRectPoint = useCallback( + ( + t: number, + left: number, + top: number, + width: number, + height: number, + radius: number, + ): { x: number; y: number } => { + const straightWidth = width - 2 * radius; + const straightHeight = height - 2 * radius; + const cornerArc = (Math.PI * radius) / 2; + const totalPerimeter = + 2 * straightWidth + 2 * straightHeight + 4 * cornerArc; + const distance = t * totalPerimeter; + + let accumulated = 0; + + if (distance <= accumulated + straightWidth) { + const progress = (distance - accumulated) / straightWidth; + return { x: left + radius + progress * straightWidth, y: top }; + } + accumulated += straightWidth; + + if (distance <= accumulated + cornerArc) { + const progress = (distance - accumulated) / cornerArc; + return getCornerPoint( + left + width - radius, + top + radius, + radius, + -Math.PI / 2, + Math.PI / 2, + progress, + ); + } + accumulated += cornerArc; + + if (distance <= accumulated + straightHeight) { + const progress = (distance - accumulated) / straightHeight; + return { x: left + width, y: top + radius + progress * straightHeight }; + } + accumulated += straightHeight; + + if (distance <= accumulated + cornerArc) { + const progress = (distance - accumulated) / cornerArc; + return getCornerPoint( + left + width - radius, + top + height - radius, + radius, + 0, + Math.PI / 2, + progress, + ); + } + accumulated += cornerArc; + + if (distance <= accumulated + straightWidth) { + const progress = (distance - accumulated) / straightWidth; + return { + x: left + width - radius - progress * straightWidth, + y: top + height, + }; + } + accumulated += straightWidth; + + if (distance <= accumulated + cornerArc) { + const progress = (distance - accumulated) / cornerArc; + return getCornerPoint( + left + radius, + top + height - radius, + radius, + Math.PI / 2, + Math.PI / 2, + progress, + ); + } + accumulated += cornerArc; + + if (distance <= accumulated + straightHeight) { + const progress = (distance - accumulated) / straightHeight; + return { + x: left, + y: top + height - radius - progress * straightHeight, + }; + } + accumulated += straightHeight; + + const progress = (distance - accumulated) / cornerArc; + return getCornerPoint( + left + radius, + top + radius, + radius, + Math.PI, + Math.PI / 2, + progress, + ); + }, + [getCornerPoint], + ); + + useEffect(() => { + const canvas = canvasRef.current; + const container = containerRef.current; + if (!canvas || !container) return; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const octaves = 10; + const lacunarity = 1.6; + const gain = 0.7; + const amplitude = chaos; + const frequency = 10; + const baseFlatness = 0; + const displacement = 60; + const borderOffset = 60; + + const updateSize = () => { + const rect = container.getBoundingClientRect(); + const width = rect.width + borderOffset * 2; + const height = rect.height + borderOffset * 2; + + const dpr = Math.min(window.devicePixelRatio || 1, 2); + canvas.width = width * dpr; + canvas.height = height * dpr; + canvas.style.width = `${width}px`; + canvas.style.height = `${height}px`; + ctx.scale(dpr, dpr); + + return { width, height }; + }; + + let { width, height } = updateSize(); + let lastDpr = Math.min(window.devicePixelRatio || 1, 2); + + const drawElectricBorder = (currentTime: number) => { + if (!canvas || !ctx) return; + + const dpr = Math.min(window.devicePixelRatio || 1, 2); + if (dpr !== lastDpr) { + lastDpr = dpr; + const newSize = updateSize(); + width = newSize.width; + height = newSize.height; + } + + const deltaTime = (currentTime - lastFrameTimeRef.current) / 1000; + timeRef.current += deltaTime * speed; + lastFrameTimeRef.current = currentTime; + + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.scale(dpr, dpr); + + // The Canvas 2D API only accepts literal color values, not CSS custom properties. + // We resolve any var() by reading --electric-border-color from the container's + // computed style — the browser fully resolves the entire var() chain for us. + const resolvedColor = color.trim().startsWith('var(') + ? getComputedStyle(container).getPropertyValue('--electric-border-color').trim() || color + : color; + + ctx.strokeStyle = resolvedColor; + ctx.lineWidth = 1; + ctx.lineCap = 'round'; + ctx.lineJoin = 'round'; + + const scale = displacement; + const left = borderOffset; + const top = borderOffset; + const borderWidth = width - 2 * borderOffset; + const borderHeight = height - 2 * borderOffset; + const maxRadius = Math.min(borderWidth, borderHeight) / 2; + const radius = Math.min(borderRadius, maxRadius); + + const approximatePerimeter = + 2 * (borderWidth + borderHeight) + 2 * Math.PI * radius; + const sampleCount = Math.floor(approximatePerimeter / 2); + + ctx.beginPath(); + + for (let i = 0; i <= sampleCount; i++) { + const progress = i / sampleCount; + + const point = getRoundedRectPoint( + progress, + left, + top, + borderWidth, + borderHeight, + radius, + ); + + const xNoise = octavedNoise( + progress * 8, + octaves, + lacunarity, + gain, + amplitude, + frequency, + timeRef.current, + 0, + baseFlatness, + ); + const yNoise = octavedNoise( + progress * 8, + octaves, + lacunarity, + gain, + amplitude, + frequency, + timeRef.current, + 1, + baseFlatness, + ); + + const displacedX = point.x + xNoise * scale; + const displacedY = point.y + yNoise * scale; + + if (i === 0) { + ctx.moveTo(displacedX, displacedY); + } else { + ctx.lineTo(displacedX, displacedY); + } + } + + ctx.closePath(); + ctx.stroke(); + + animationRef.current = requestAnimationFrame(drawElectricBorder); + }; + + const resizeObserver = new ResizeObserver(() => { + const newSize = updateSize(); + width = newSize.width; + height = newSize.height; + }); + resizeObserver.observe(container); + + animationRef.current = requestAnimationFrame(drawElectricBorder); + + return () => { + if (animationRef.current) { + cancelAnimationFrame(animationRef.current); + } + resizeObserver.disconnect(); + }; + }, [color, speed, chaos, borderRadius, octavedNoise, getRoundedRectPoint]); + + return ( +
+
+ +
+
+ {/* Use var(--electric-border-color) so the browser resolves any + CSS custom property (e.g. var(--chakra-colors-cyan-400)) natively. */} +
+
+
+
+
+ {children} +
+
+ ); +}; + +export default ElectricBorder; diff --git a/shared/common/src/components/ElectricBorder/index.ts b/shared/common/src/components/ElectricBorder/index.ts new file mode 100644 index 0000000..4cbaa42 --- /dev/null +++ b/shared/common/src/components/ElectricBorder/index.ts @@ -0,0 +1 @@ +export { default as ElectricBorder } from './ElectricBorder'; diff --git a/shared/common/src/components/GlassBox/GlassBox.tsx b/shared/common/src/components/GlassBox/GlassBox.tsx new file mode 100644 index 0000000..07a9346 --- /dev/null +++ b/shared/common/src/components/GlassBox/GlassBox.tsx @@ -0,0 +1,422 @@ +import React, { useEffect, useRef, useState, useId } from 'react'; + +export interface GlassSurfaceProps { + children?: React.ReactNode; + width?: number | string; + height?: number | string; + borderRadius?: number; + borderWidth?: number; + brightness?: number; + opacity?: number; + blur?: number; + displace?: number; + backgroundOpacity?: number; + saturation?: number; + distortionScale?: number; + redOffset?: number; + greenOffset?: number; + blueOffset?: number; + xChannel?: 'R' | 'G' | 'B'; + yChannel?: 'R' | 'G' | 'B'; + mixBlendMode?: + | 'normal' + | 'multiply' + | 'screen' + | 'overlay' + | 'darken' + | 'lighten' + | 'color-dodge' + | 'color-burn' + | 'hard-light' + | 'soft-light' + | 'difference' + | 'exclusion' + | 'hue' + | 'saturation' + | 'color' + | 'luminosity' + | 'plus-darker' + | 'plus-lighter'; + className?: string; + style?: React.CSSProperties; +} + +const useDarkMode = () => { + const [isDark, setIsDark] = useState(false); + + useEffect(() => { + if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return; + + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + setIsDark(mediaQuery.matches); + + const handler = (e: MediaQueryListEvent) => setIsDark(e.matches); + mediaQuery.addEventListener('change', handler); + return () => mediaQuery.removeEventListener('change', handler); + }, []); + + return isDark; +}; + +const GlassSurface: React.FC = ({ + children, + width = 200, + height = 80, + borderRadius = 20, + borderWidth = 0.07, + brightness = 100, + opacity = 0, + blur = 10, + displace = 3, + backgroundOpacity = 0.06, + saturation = 2, + distortionScale = 20, + redOffset = 0, + greenOffset = 0, + blueOffset = 0, + xChannel = 'R', + yChannel = 'G', + mixBlendMode = 'screen', + className = '', + style = {}, +}) => { + const uniqueId = useId().replace(/:/g, '-'); + const filterId = `glass-filter-${uniqueId}`; + const redGradId = `red-grad-${uniqueId}`; + const blueGradId = `blue-grad-${uniqueId}`; + + const [svgSupported, setSvgSupported] = useState(false); + + const containerRef = useRef(null); + const feImageRef = useRef(null); + const redChannelRef = useRef(null); + const greenChannelRef = useRef(null); + const blueChannelRef = useRef(null); + const gaussianBlurRef = useRef(null); + + const isDarkMode = useDarkMode(); + + const generateDisplacementMap = () => { + const rect = containerRef.current?.getBoundingClientRect(); + const actualWidth = rect?.width || 400; + const actualHeight = rect?.height || 200; + const edgeSize = Math.min(actualWidth, actualHeight) * (borderWidth * 0.5); + + const svgContent = ` + + + + + + + + + + + + + + + + + `; + + return `data:image/svg+xml,${encodeURIComponent(svgContent)}`; + }; + + const updateDisplacementMap = () => { + feImageRef.current?.setAttribute('href', generateDisplacementMap()); + }; + + useEffect(() => { + updateDisplacementMap(); + [ + { ref: redChannelRef, offset: redOffset }, + { ref: greenChannelRef, offset: greenOffset }, + { ref: blueChannelRef, offset: blueOffset }, + ].forEach(({ ref, offset }) => { + if (ref.current) { + ref.current.setAttribute( + 'scale', + (distortionScale + offset).toString(), + ); + ref.current.setAttribute('xChannelSelector', xChannel); + ref.current.setAttribute('yChannelSelector', yChannel); + } + }); + + gaussianBlurRef.current?.setAttribute('stdDeviation', displace.toString()); + }, [ + width, + height, + borderRadius, + borderWidth, + brightness, + opacity, + blur, + displace, + distortionScale, + redOffset, + greenOffset, + blueOffset, + xChannel, + yChannel, + mixBlendMode, + ]); + + useEffect(() => { + setSvgSupported(supportsSVGFilters()); + }, []); + + useEffect(() => { + if (!containerRef.current) return; + + const resizeObserver = new ResizeObserver(() => { + setTimeout(updateDisplacementMap, 0); + }); + + resizeObserver.observe(containerRef.current); + + return () => { + resizeObserver.disconnect(); + }; + }, []); + + useEffect(() => { + if (!containerRef.current) return; + + const resizeObserver = new ResizeObserver(() => { + setTimeout(updateDisplacementMap, 0); + }); + + resizeObserver.observe(containerRef.current); + + return () => { + resizeObserver.disconnect(); + }; + }, []); + + useEffect(() => { + setTimeout(updateDisplacementMap, 0); + }, [width, height]); + + const supportsSVGFilters = () => { + if (typeof window === 'undefined' || typeof document === 'undefined') { + return false; + } + + const isWebkit = + /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent); + const isFirefox = /Firefox/.test(navigator.userAgent); + + if (isWebkit || isFirefox) { + return false; + } + + const div = document.createElement('div'); + div.style.backdropFilter = `url(#${filterId})`; + + return div.style.backdropFilter !== ''; + }; + + const supportsBackdropFilter = () => { + if ( + typeof window === 'undefined' || + typeof CSS === 'undefined' || + typeof CSS.supports !== 'function' + ) { + return false; + } + return CSS.supports('backdrop-filter', 'blur(10px)'); + }; + + const getContainerStyles = (): React.CSSProperties => { + const baseStyles: React.CSSProperties = { + ...style, + width: typeof width === 'number' ? `${width}px` : width, + height: typeof height === 'number' ? `${height}px` : height, + borderRadius: `${borderRadius}px`, + '--glass-frost': backgroundOpacity, + '--glass-saturation': saturation, + } as React.CSSProperties; + + const backdropFilterSupported = supportsBackdropFilter(); + + if (svgSupported) { + return { + ...baseStyles, + background: isDarkMode + ? `hsl(0 0% 0% / ${backgroundOpacity})` + : `hsl(0 0% 100% / ${backgroundOpacity})`, + backdropFilter: `url(#${filterId}) saturate(${saturation})`, + boxShadow: isDarkMode + ? `0 0 2px 1px color-mix(in oklch, white, transparent 65%) inset, + 0 0 10px 4px color-mix(in oklch, white, transparent 85%) inset, + 0px 4px 16px rgba(17, 17, 26, 0.05), + 0px 8px 24px rgba(17, 17, 26, 0.05), + 0px 16px 56px rgba(17, 17, 26, 0.05), + 0px 4px 16px rgba(17, 17, 26, 0.05) inset, + 0px 8px 24px rgba(17, 17, 26, 0.05) inset, + 0px 16px 56px rgba(17, 17, 26, 0.05) inset` + : `0 0 2px 1px color-mix(in oklch, black, transparent 85%) inset, + 0 0 10px 4px color-mix(in oklch, black, transparent 90%) inset, + 0px 4px 16px rgba(17, 17, 26, 0.05), + 0px 8px 24px rgba(17, 17, 26, 0.05), + 0px 16px 56px rgba(17, 17, 26, 0.05), + 0px 4px 16px rgba(17, 17, 26, 0.05) inset, + 0px 8px 24px rgba(17, 17, 26, 0.05) inset, + 0px 16px 56px rgba(17, 17, 26, 0.05) inset`, + }; + } else { + if (isDarkMode) { + if (!backdropFilterSupported) { + return { + ...baseStyles, + background: 'rgba(0, 0, 0, 0.4)', + border: '1px solid rgba(255, 255, 255, 0.2)', + boxShadow: `inset 0 1px 0 0 rgba(255, 255, 255, 0.2), + inset 0 -1px 0 0 rgba(255, 255, 255, 0.1)`, + }; + } else { + return { + ...baseStyles, + background: 'rgba(255, 255, 255, 0.1)', + backdropFilter: 'blur(12px) saturate(1.8) brightness(1.2)', + WebkitBackdropFilter: 'blur(12px) saturate(1.8) brightness(1.2)', + border: '1px solid rgba(255, 255, 255, 0.2)', + boxShadow: `inset 0 1px 0 0 rgba(255, 255, 255, 0.2), + inset 0 -1px 0 0 rgba(255, 255, 255, 0.1)`, + }; + } + } else { + if (!backdropFilterSupported) { + return { + ...baseStyles, + background: 'rgba(255, 255, 255, 0.4)', + border: '1px solid rgba(255, 255, 255, 0.3)', + boxShadow: `inset 0 1px 0 0 rgba(255, 255, 255, 0.5), + inset 0 -1px 0 0 rgba(255, 255, 255, 0.3)`, + }; + } else { + return { + ...baseStyles, + background: 'rgba(255, 255, 255, 0.25)', + backdropFilter: 'blur(12px) saturate(1.8) brightness(1.1)', + WebkitBackdropFilter: 'blur(12px) saturate(1.8) brightness(1.1)', + border: '1px solid rgba(255, 255, 255, 0.3)', + boxShadow: `0 8px 32px 0 rgba(31, 38, 135, 0.2), + 0 2px 16px 0 rgba(31, 38, 135, 0.1), + inset 0 1px 0 0 rgba(255, 255, 255, 0.4), + inset 0 -1px 0 0 rgba(255, 255, 255, 0.2)`, + }; + } + } + } + }; + + const glassSurfaceClasses = + 'relative overflow-hidden transition-opacity duration-[260ms] ease-out'; + + const focusVisibleClasses = isDarkMode + ? 'focus-visible:outline-2 focus-visible:outline-[#0A84FF] focus-visible:outline-offset-2' + : 'focus-visible:outline-2 focus-visible:outline-[#007AFF] focus-visible:outline-offset-2'; + + return ( +
+ + + + + + + + + + + + + + + + + + + + + +
+ {children} +
+
+ ); +}; + +export default GlassSurface; diff --git a/shared/common/src/components/GlassBox/README.md b/shared/common/src/components/GlassBox/README.md new file mode 100644 index 0000000..0a30f72 --- /dev/null +++ b/shared/common/src/components/GlassBox/README.md @@ -0,0 +1,301 @@ +# GlassBox + +A **physically-inspired glass surface** component for React. It uses an SVG displacement-map filter piped into `backdrop-filter` to refract the content behind it — exactly like a real piece of frosted glass — and gracefully degrades to a `backdrop-filter: blur()` fallback on Safari/Firefox, or a static frosted background where no backdrop support exists. + +--- + +## Table of Contents + +1. [How it works](#how-it-works) +2. [Rendering tiers](#rendering-tiers) +3. [Import](#import) +4. [Props reference](#props-reference) +5. [SVG filter pipeline (deep dive)](#svg-filter-pipeline-deep-dive) +6. [Default values](#default-values) +7. [Recipes](#recipes) +8. [CSS custom properties](#css-custom-properties) +9. [Behaviour notes](#behaviour-notes) +10. [Browser support](#browser-support) + +--- + +## How it works + +GlassBox produces its effect in three layers stacked inside a single `
`: + +``` +┌─────────────────────────────────────────┐ +│ Outer div (backdrop-filter applied) │ ← The "glass pane" +│ │ +│ ┌───────────────────────────────────┐ │ +│ │ Hidden SVG (opacity: 0, z:-10) │ │ ← Defines the SVG filter +│ │ │ │ +│ └───────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────┐ │ +│ │ Content wrapper (z: 10) │ │ ← Your children +│ └───────────────────────────────────┘ │ +└─────────────────────────────────────────┘ +``` + +The SVG filter is referenced by `backdrop-filter: url(#glass-filter-…)`. The browser feeds *whatever is painted behind the element* through the filter before compositing it — producing genuine optical distortion, not just blur. + +--- + +## Rendering tiers + +The component detects capabilities at mount time and picks the best available tier: + +| Tier | Condition | Effect | +|------|-----------|--------| +| **SVG** (full) | Chromium-based browser + `backdrop-filter: url(…)` supported | SVG displacement-map refracts background; full chromatic aberration, inner glow, and inset shadows | +| **CSS fallback** | Safari / Firefox with `backdrop-filter: blur()` | `blur(12px) saturate(1.8) brightness(1.2/1.1)` + semi-transparent background | +| **Static fallback** | No backdrop-filter support at all | Opaque frosted-looking background with inset border highlight | + +The tier is chosen **once** on mount (`useEffect`) and stored in `svgSupported` state. Each tier also adapts its colours to the system **dark/light mode** via the `useDarkMode` hook (listens to `prefers-color-scheme`). + +--- + +## Import + +```tsx +// Preferred — via the shared barrel +import { GlassBox } from '@components'; + +// Direct (for shared package internal use) +import GlassBox from '@common/components/GlassBox/GlassBox'; +``` + +The named export `GlassBox` and the default export `GlassSurface` refer to the same component. The barrel re-exports the default as `GlassBox`. + +--- + +## Props reference + +All props are optional. Omit any you don't need — sensible defaults are applied. + +### Layout & shape + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `width` | `number \| string` | `200` | Width of the glass pane. Pass a number for px, or any CSS string (`"100%"`, `"auto"`, `"50vw"`, …). | +| `height` | `number \| string` | `80` | Height of the glass pane. Same rules as `width`. | +| `borderRadius` | `number` | `20` | Corner radius in **px**. Applied to the outer container, the inner SVG displacement-map rects, and the children wrapper (`rounded-[inherit]`). | + +### Displacement map — form of the glass + +These props control the **SVG displacement-map image** that is baked as a `data:image/svg+xml` URL and fed into ``. Changing them forces the map to regenerate. + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `borderWidth` | `number` | `0.07` | Thickness of the gradient edge band as a **fraction of the shorter dimension** (e.g. `0.07` → 3.5 % of `min(w, h)`). Controls how wide the refractive "rim" of the glass is. Raise it for a thicker, lens-like edge. | +| `brightness` | `number` | `100` | Lightness (HSL %) of the frosted inner rect drawn on the displacement map. `100` = white, `0` = black. Affects how "milky" the centre of the glass looks when `opacity > 0`. | +| `opacity` | `number` | `0` | Alpha of the frosted inner rect (`0`–`1`). `0` = completely transparent centre (pure refraction only); `1` = fully opaque frosted fill. Use small values like `0.05`–`0.15` for a subtle frost. | +| `blur` | `number` | `10` | `blur()` applied to the frosted inner rect **inside the SVG**. Softens the transition between the edge band and the centre. | +| `mixBlendMode` | see below | `'screen'` | Blend mode used when the blue gradient is composited over the red gradient in the displacement map. Controls the colour of the edge refraction. | + +### SVG filter — chromatic aberration & displacement + +These props are applied directly to the `` and `` filter primitives via `ref.current.setAttribute(…)` after mount. + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `distortionScale` | `number` | `20` | Base displacement scale for all three colour channels. Positive = right-down warp, negative = left-up warp. The magnitude is in SVG user-units (roughly pixels). | +| `redOffset` | `number` | `0` | Added to `distortionScale` for the **red** channel only. Use a non-zero value to shift red independently, creating chromatic aberration. | +| `greenOffset` | `number` | `0` | Same for the **green** channel. | +| `blueOffset` | `number` | `0` | Same for the **blue** channel. `blueOffset = 20` with `distortionScale = -180` (old default) created a strong blue-shifted rim. | +| `xChannel` | `'R' \| 'G' \| 'B'` | `'R'` | Which colour channel of the displacement map image drives horizontal displacement. | +| `yChannel` | `'R' \| 'G' \| 'B'` | `'G'` | Which channel drives vertical displacement. | +| `displace` | `number` | `3` | `stdDeviation` of the final `` applied after RGB channel blending. Softens the overall refraction (not the same as CSS `blur`). Higher = smudgier glass. | + +### Visual finish + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `backgroundOpacity` | `number` | `0` | Alpha of the tinted background fill in **SVG mode** (`0`–`1`). In dark mode the fill is `hsl(0 0% 0% / backgroundOpacity)`; in light mode `hsl(0 0% 100% / backgroundOpacity)`. Exposes the `--glass-frost` CSS custom property. | +| `saturation` | `number` | `2` | `saturate(n)` appended to `backdrop-filter` in SVG mode. `1` = natural, `>1` = more vivid colours through the glass. Exposes the `--glass-saturation` CSS custom property. | + +### `mixBlendMode` values + +``` +'normal' | 'multiply' | 'screen' | 'overlay' | 'darken' | 'lighten' | +'color-dodge' | 'color-burn' | 'hard-light' | 'soft-light' | +'difference' | 'exclusion' | 'hue' | 'saturation' | 'color' | +'luminosity' | 'plus-darker' | 'plus-lighter' +``` + +### DOM pass-through + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | `''` | Extra classes added to the outer container (alongside the internal Tailwind utility classes). Use for reveal animations, hover states, etc. | +| `style` | `React.CSSProperties` | `{}` | Inline styles merged **before** the computed glass styles. Useful for `minHeight`, `display`, `position`, etc. Note: glass-specific properties (`background`, `backdropFilter`, `boxShadow`, `borderRadius`, `width`, `height`) will be overwritten by the component. | +| `children` | `React.ReactNode` | — | Rendered inside a full-size `div` with `z-index: 10` and `rounded-[inherit]`. | + +--- + +## SVG filter pipeline (deep dive) + +``` +SourceGraphic + │ + ├──▶ feDisplacementMap (red channel) scale = distortionScale + redOffset + │ └──▶ feColorMatrix → keep R only → "red" + │ + ├──▶ feDisplacementMap (green channel) scale = distortionScale + greenOffset + │ └──▶ feColorMatrix → keep G only → "green" + │ + └──▶ feDisplacementMap (blue channel) scale = distortionScale + blueOffset + └──▶ feColorMatrix → keep B only → "blue" + +red + green ──▶ feBlend (screen) ──▶ "rg" +rg + blue ──▶ feBlend (screen) ──▶ "output" + │ + feGaussianBlur (displace) ──▶ final +``` + +Each colour channel is displaced independently using the same `` displacement map but a potentially different scale (`distortionScale ± offset`). The channels are then isolated with `` and blended back with `screen` blend mode. This is what produces chromatic aberration: the RGB channels land in slightly different positions, just like glass refracting different wavelengths of light by different amounts. + +--- + +## Default values + +```tsx +// Current defaults (as of last update) +borderRadius = 20 +borderWidth = 0.07 +brightness = 100 +opacity = 0 +blur = 10 +displace = 3 +backgroundOpacity = 0 +saturation = 2 +distortionScale = 20 +redOffset = 0 +greenOffset = 0 +blueOffset = 0 +xChannel = 'R' +yChannel = 'G' +mixBlendMode = 'screen' +width = 200 +height = 80 +``` + +--- + +## Recipes + +### Minimal badge / pill + +```tsx + + + Next Gen Audio Mesh Protocol + + +``` + +### Feature card (full-width, auto-height) + +```tsx + + + + Engineered for Synchronization + + + +``` + +### Frosted modal / panel + +```tsx + + + +``` + +### Strong chromatic aberration (decorative) + +```tsx + +``` + +### Subtle dark-mode card + +```tsx + + + +``` + +--- + +## CSS custom properties + +The component exposes two CSS custom properties on the outer element that can be read by child CSS: + +| Property | Value | Description | +|----------|-------|-------------| +| `--glass-frost` | `backgroundOpacity` | The opacity of the tinted fill layer | +| `--glass-saturation` | `saturation` | The saturation multiplier applied via backdrop-filter | + +--- + +## Behaviour notes + +- **ResizeObserver** — the displacement map is regenerated whenever the container changes size, so the edge-band proportions remain correct in fluid / responsive layouts. +- **Width/height changes** — a separate effect watches the `width` and `height` props and regenerates the map with a `setTimeout(0)` to let the browser apply the new dimensions first. +- **`width="auto"` / `height="auto"`** — when passed as strings, the inline style sets `width: auto` / `height: auto`. The ResizeObserver picks up the actual rendered size via `getBoundingClientRect()` and uses that for the SVG map. The fallback dimensions used before mount are 400 × 200. +- **Dark mode** — detected via `window.matchMedia('(prefers-color-scheme: dark)')` with a live `change` listener. Both the background fill colour and the box-shadow change when the system theme switches. +- **SSR safety** — all `window`/`document` access is guarded, so the component renders safely in Node/SSR contexts (SVG features are disabled server-side). +- **Focus visible** — the outer div receives `focus-visible:outline` in Chromium blue (`#0A84FF` dark / `#007AFF` light) via Tailwind's `focus-visible:` variant for keyboard accessibility. +- **Tailwind classes on the outer div** — `relative overflow-hidden transition-opacity duration-[260ms] ease-out`. These cannot be overridden via `className` without a higher-specificity rule. +- **`style` merge order** — your `style` prop is spread first; glass-computed values (`background`, `backdropFilter`, `boxShadow`, `borderRadius`, `width`, `height`) come after and will win. + +--- + +## Browser support + +| Browser | Tier | Notes | +|---------|------|-------| +| Chrome / Edge 76+ | SVG (full) | Full displacement-map + chromatic aberration | +| Chrome / Edge < 76 | Static fallback | No backdrop-filter support | +| Safari 9+ | CSS fallback | `backdrop-filter: blur()` supported but `url(#…)` not | +| Firefox | CSS fallback | Same as Safari | +| Firefox < 70 | Static fallback | No backdrop-filter | +| SSR / Node | Static fallback | All browser APIs disabled | diff --git a/shared/common/src/components/GlassBox/index.ts b/shared/common/src/components/GlassBox/index.ts new file mode 100644 index 0000000..4b4bc1b --- /dev/null +++ b/shared/common/src/components/GlassBox/index.ts @@ -0,0 +1 @@ +export { default as GlassBox } from './GlassBox'; diff --git a/shared/common/src/components/index.ts b/shared/common/src/components/index.ts index 27036c4..d48e6c0 100644 --- a/shared/common/src/components/index.ts +++ b/shared/common/src/components/index.ts @@ -4,3 +4,5 @@ export * from './Loading'; export * from './TitleBox'; export * from './MdPreview'; export * from './LinkButton'; +export * from './ElectricBorder'; +export * from './GlassBox'; From ed14e41b43e2803703b5663356e25fd0b42a3d60 Mon Sep 17 00:00:00 2001 From: Amit Raikwar Date: Fri, 12 Jun 2026 18:29:55 +0530 Subject: [PATCH 2/5] refactor(AUD-8): update theme configs, global variables, and localized translations - Add new blue and purple scales to theme colors - Introduce semantic terminal colors supporting light and dark modes - Update localizations for English, Spanish, Hindi, Japanese, Russian, and Chinese - Synchronize index.html and index.css templates for web, desktop, and mobile - Provide updated favicon asset and update desktop DESIGN.md documentation --- apps/desktop/DESIGN.md | 174 ++++-- apps/desktop/public/index.html | 498 +++++++++++++--- apps/desktop/src/index.css | 2 +- apps/mobile/public/index.html | 340 ++++++++--- apps/mobile/src/index.css | 2 +- apps/web/public/favicon.ico | Bin 122421 -> 113575 bytes apps/web/public/index.html | 530 +++++++++++++++--- apps/web/src/index.css | 10 +- shared/common/src/components/theme/colors.ts | 92 +++ shared/common/src/components/theme/theme.ts | 169 +++++- .../src/localization/locales/en/web.json | 145 ++--- .../src/localization/locales/es/web.json | 129 +++-- .../src/localization/locales/hi/web.json | 45 +- .../src/localization/locales/ja/web.json | 129 +++-- .../src/localization/locales/ru/web.json | 129 +++-- .../src/localization/locales/zh/web.json | 129 +++-- 16 files changed, 1958 insertions(+), 565 deletions(-) diff --git a/apps/desktop/DESIGN.md b/apps/desktop/DESIGN.md index bb0e952..669148a 100644 --- a/apps/desktop/DESIGN.md +++ b/apps/desktop/DESIGN.md @@ -1,66 +1,154 @@ -# Web Design Specification: AudioMesh - -## 1. Executive Summary - -**AudioMesh** is a high-performance, minimalist cloud storage solution designed for digital craftsmen, developers, and tech professionals. The web platform prioritizes speed, security, and utility, giving users calm, effortless control over digital assets through a professional-grade, high-fidelity user interface. - +--- +name: Obsidian Flux +colors: + surface: '#121416' + surface-dim: '#121416' + surface-bright: '#38393c' + surface-container-lowest: '#0c0e10' + surface-container-low: '#1a1c1e' + surface-container: '#1e2022' + surface-container-high: '#282a2c' + surface-container-highest: '#333537' + on-surface: '#e2e2e5' + on-surface-variant: '#c4c7cb' + inverse-surface: '#e2e2e5' + inverse-on-surface: '#2f3133' + outline: '#8e9196' + outline-variant: '#44474b' + surface-tint: '#bac8d7' + primary: '#bac8d7' + on-primary: '#25323d' + primary-container: '#34414d' + on-primary-container: '#9fadbb' + inverse-primary: '#53606d' + secondary: '#c4c7c9' + on-secondary: '#2e3133' + secondary-container: '#46494b' + on-secondary-container: '#b6b9bb' + tertiary: '#c2c7ce' + on-tertiary: '#2c3136' + tertiary-container: '#3b4046' + on-tertiary-container: '#a7acb2' + error: '#ffb4ab' + on-error: '#690005' + error-container: '#93000a' + on-error-container: '#ffdad6' + primary-fixed: '#d6e4f3' + primary-fixed-dim: '#bac8d7' + on-primary-fixed: '#101d28' + on-primary-fixed-variant: '#3b4854' + secondary-fixed: '#e1e3e5' + secondary-fixed-dim: '#c4c7c9' + on-secondary-fixed: '#191c1e' + on-secondary-fixed-variant: '#444749' + tertiary-fixed: '#dee3ea' + tertiary-fixed-dim: '#c2c7ce' + on-tertiary-fixed: '#171c21' + on-tertiary-fixed-variant: '#42474d' + background: '#121416' + on-background: '#e2e2e5' + surface-variant: '#333537' +typography: + display-lg: + fontFamily: Geist + fontSize: 48px + fontWeight: '600' + lineHeight: 56px + letterSpacing: -0.04em + display-lg-mobile: + fontFamily: Geist + fontSize: 32px + fontWeight: '600' + lineHeight: 40px + letterSpacing: -0.03em + headline-md: + fontFamily: Geist + fontSize: 24px + fontWeight: '500' + lineHeight: 32px + letterSpacing: -0.02em + body-lg: + fontFamily: Hanken Grotesk + fontSize: 18px + fontWeight: '400' + lineHeight: 28px + body-md: + fontFamily: Hanken Grotesk + fontSize: 16px + fontWeight: '400' + lineHeight: 24px + label-sm: + fontFamily: JetBrains Mono + fontSize: 12px + fontWeight: '500' + lineHeight: 16px + letterSpacing: 0.05em +rounded: + sm: 0.25rem + DEFAULT: 0.5rem + md: 0.75rem + lg: 1rem + xl: 1.5rem + full: 9999px +spacing: + unit: 4px + gutter: 24px + margin-mobile: 16px + margin-desktop: 64px + stack-sm: 8px + stack-md: 16px + stack-lg: 32px --- -## 2. Product Vision +## Brand & Style -To provide a clean, distraction-free cloud workspace that optimizes flow efficiency through high-speed operations, structured layout organization, and a highly responsive React interface. +The design system is a sophisticated evolution of techno-minimalism, drawing inspiration from the new app icon's interplay of charcoal tones and organic, sweeping curves. It targets a professional, tech-savvy audience that values precision and understated elegance. ---- +The visual language balances the rigidity of a grid-based system with "organic tech" flourishes—specifically, the sharp-to-tapered arcs seen in the brand mark. The mood is deep, cinematic, and high-performance, evoking the feeling of premium hardware or advanced developer tools. It avoids generic tech tropes in favor of a monolithic, sculptural aesthetic characterized by deep matte surfaces and needle-thin accents. -## 3. Design Identity & System Tokens +## Colors -The web application utilizes a custom design system powered by **Chakra UI v3** and **Tailwind CSS**, configured in [theme.ts](file:///Users/mr.robot/z-stash/audiomesh/audiomesh/shared/common/src/components/theme/theme.ts): +The palette is rooted in the "Steel Charcoal" of the icon, utilizing a monochromatic scale that emphasizes texture and depth over hue. -### 3.1 Theme Modes +- **Primary:** A desaturated, deep slate-blue derived directly from the icon’s fill. Used for key interactive states and focal points. +- **Secondary:** A bright, cool off-white for high-contrast typography and critical UI markers. +- **Tertiary:** A mid-tier charcoal for containers and borders that separate content without breaking the dark immersion. +- **Neutral:** A near-black base that serves as the infinite canvas, ensuring the high-contrast elements "pop" with cinematic clarity. -- **Multi-Mode Support:** Robust dark and light mode support with preference detection and seamless theme switching. -- **Light Mode Layout:** Clean neutral background (soft gray `#F8F9FA`) with cards in white (`#FFFFFF`). -- **Dark Mode Layout:** Deep neutral background (charcoal `#151413`) with dark workspace cards. +## Typography -### 3.2 Color System +The typography strategy mirrors the technical but fluid nature of the icon. -- **Primary Accent:** Telegram Blue (`#0088cc` / `primary` token) -- **Secondary Utility:** Cool gray (`#5b5f63`) -- **Success Green:** Success alerts (`#28a745` / `success.400`) -- **Warning Amber:** Warning overlays (`#ffc107` / `warning.400`) -- **Error Red:** System/input errors (`#ba1a1a` / `error.400`) -- **Neutral Palette:** Tiered gray system from `#e3e3e3` (100) down to `#151413` (1000) for structured border/background boundaries. +**Geist** is used for headlines to provide a surgical, geometric precision that feels contemporary and high-tech. **Hanken Grotesk** offers a more approachable and legible experience for long-form body text, maintaining the system's modernist roots. For metadata, code, and system status, **JetBrains Mono** introduces a monospaced "hacker" aesthetic that reinforces the techno-minimalist theme. All type scales favor tight tracking for headlines and generous leading for body text to ensure a premium feel. -### 3.3 Typography +## Layout & Spacing -- **Primary Fonts:** `Inter` (Sans-serif) for primary headings and body elements, ensuring excellent legibility and clear sizing hierarchy. -- **Stylistic Fonts:** `Bungee Shade` imported for specific brand styling components. +This design system employs a **Fixed Grid** philosophy on desktop (12 columns) and a **Fluid Grid** on mobile (4 columns). The layout is built on a 4px baseline grid to ensure mathematical alignment across all components. -### 3.4 Shapes & Shadows +Spacing is used to create "zones of focus." High-density information is housed in structured modules, while significant negative space is placed between high-level sections to mimic the airy, expansive feel of the icon's background. Desktop layouts should maintain generous outer margins (64px) to create a centered, "app-like" experience even on ultrawide monitors. -- **Corner Radius:** Standardized `0.5rem` (8px) for buttons, input forms, and controls; `1rem` (16px) for large display containers and modals. -- **Elevation:** Ambient shadows (`0 4px 12px rgba(0,0,0,0.05)`) are used instead of heavy gradients to convey depth. +## Elevation & Depth ---- +Depth is communicated through **Tonal Layering** and **Subtle Inner Glows**, mimicking the layered construction of the icon. -## 4. Core Feature Requirements +Instead of heavy drop shadows, surfaces are defined by their background color: -### 4.1 File Explorer & Search +1. **Base:** Neutral Black (#0D0F11). +2. **Raised Surfaces:** Tertiary Charcoal (#1A1F24). +3. **Floating Elements:** Primary Slate (#34414D) with a subtle 1px "rim light" border in a lighter shade to define edges against the dark background. -- **Interactive Search:** Central search bar with input focus highlight, clear actions, and rapid query handling. -- **Layout Toggle:** Seamless layout transition between fluid 12-column file cards and organized list tables. -- **Progress Tracking:** 4px linear progress bars for uploads and background synchronizations, dynamically transitioning from Telegram Blue to Success Green upon completion. +Interactive elements use a soft, 10% opacity "Steel" glow rather than a traditional shadow, making them appear as if they are backlit components of a high-end interface. -### 4.2 Workspace Navigation +## Shapes -- **Persistent Sidebar:** Fixed-width 280px sidebar layout for switching between resource categories, personal workspaces, and settings. -- **Spacing Rhythm:** Clean linear 8px padding rhythm ensuring layout consistency and touch target compliance. +The shape language is the core of this system's identity. We utilize **Rounded** (0.5rem) corners for primary containers to match the icon's squircle base. ---- +However, a specific "Flux Stroke" is introduced for iconography and decorative elements: lines should feature one rounded end and one tapered, sharp end, directly referencing the sweeping arc in the app icon. This juxtaposition of "standard" rounded containers and "aggressive" organic strokes creates the unique techno-minimalist tension that defines the product. -## 5. Technical Constraints & Framework Integration +## Components -- **UI Framework:** React (18.3+) + Chakra UI v3 -- **State & Query Routing:** Zustand v5 for application states; React Query for remote API cache management. -- **Responsiveness:** Collapses into a mobile-friendly single-column layout with a top/bottom menu bar below a 600px screen width. -- **Localization Integration:** Dynamic translation keys fetched via `i18next` locales in [locales](file:///Users/mr.robot/z-stash/audiomesh/audiomesh/shared/common/src/localization/locales/). +- **Buttons:** Primary buttons are solid Charcoal (#34414D) with secondary text. The corners are moderately rounded (Level 2). For a "High-Tech" feel, hover states should trigger a 1px secondary-color border that appears to "draw" itself around the perimeter. +- **Inputs:** Ultra-minimalist. Only a bottom border is visible in default states. Upon focus, the border expands into a full-perimeter outline with a subtle inner glow. +- **Cards:** No shadows. Cards are defined by a 1px border in Tertiary (#1A1F24) and a slight change in background tone. +- **Chips/Labels:** These utilize the **JetBrains Mono** font and are strictly rectangular or pill-shaped, providing a sharp contrast to the sweeping curves used in the branding. +- **The "Pulse" Indicator:** A signature component for status—a small, glowing dot that uses a subtle breathing animation, referencing the circular core of the icon. diff --git a/apps/desktop/public/index.html b/apps/desktop/public/index.html index a16d3dd..1318ed0 100644 --- a/apps/desktop/public/index.html +++ b/apps/desktop/public/index.html @@ -4,15 +4,15 @@ - + AudioMesh - + @@ -194,61 +494,123 @@
-
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
- -
+ +
+ + + + + + + + + + + + + +
+
+
+
+
+
+
+ + -
+ +
+
+
AudioMesh
-
CLOUD STORAGE FOR DIGITAL CRAFTSMEN
+
SYNCHRONIZED SPEAKER NETWORK
-
CONNECTING TO GATEWAY
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+
MESH STATUS: SYNCING
+
+ +
INITIALIZING AUDIO SUBSYSTEM...
+
diff --git a/apps/desktop/src/index.css b/apps/desktop/src/index.css index 7f6149f..b54d079 100644 --- a/apps/desktop/src/index.css +++ b/apps/desktop/src/index.css @@ -1,4 +1,4 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700;800&family=Hanken+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@300;400;500;600;700&display=swap'); @tailwind base; @tailwind components; diff --git a/apps/mobile/public/index.html b/apps/mobile/public/index.html index 8c9c3c1..91e346a 100644 --- a/apps/mobile/public/index.html +++ b/apps/mobile/public/index.html @@ -7,15 +7,15 @@ name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" /> - + AudioMesh - + @@ -197,61 +381,87 @@
-
+
- + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+ +
AudioMesh
-
CLOUD STORAGE FOR DIGITAL CRAFTSMEN
+
SYNCHRONIZED SPEAKER NETWORK
-
CONNECTING TO GATEWAY
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+
MESH STATUS: SYNCING
+
+ +
INITIALIZING AUDIO SUBSYSTEM...
diff --git a/apps/mobile/src/index.css b/apps/mobile/src/index.css index 7f6149f..b54d079 100644 --- a/apps/mobile/src/index.css +++ b/apps/mobile/src/index.css @@ -1,4 +1,4 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700;800&family=Hanken+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@300;400;500;600;700&display=swap'); @tailwind base; @tailwind components; diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico index 3a9246aeedfc1915d64f153620f11924f6431af1..45971fb7128ba1164fe8ea095b83e8b0e5b9a9c1 100644 GIT binary patch literal 113575 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

hNVZ zOzM7z*yLdVKA3en{NndSx#qmoPwId42Vr=9@OOC-e!ym(%Clt~)HiLI#hS;xz{ejPe*Wjp*@TXxKsq*-HSYR}h9 zF=i^8D)UIC!N*2bH^eA=u&@U@8vI|Tqwr|=-E1{vKX6Z3}-%Ol2=x{tcPpmqi?{s^x zyC?!{bM6xrB2c2zxyM%UQri=B4Y7NkJg?TjT=XOM(fx_e{U{GZ_xpW>=Q51zu20JE z>CnW4N%h}v4?=8j%BR4h&bzTH1eXB1pTUs4{5fGeuDg62CYAZI@>8~?fJ7~eE7O`} z=lauKL+4)vnXT#240m5FWZ~E5eAT%-2eht`vn2^h(Gz3%$oH`ataSl9n$?#-)X`24 zMZI^85)e|luz)jSO9u$1ajB-90#zA{$Y{)Jeuc1z)(QLvij^dimdlmO)Z|qy3{|2i zE5gH`sZN6f?@b&A_WA5nqw37eFl3s{7N7vKR>tCO(Q$LK=}mHwN{X){lxoG_7r_Jv zICh_=tyQO_rD4Mg!Nq23*#z^Cp*f$4Oz>&ljE0ce!nr)PSU)H?>l1Pv8#Ig!FTdB$ zso5_P$cua~)oOOnkxYI`PDlJ>nY#Wr2euuT+g0{b8`~^TYeOtq=ea_icWd+6KF4VxYmo?Fp3kCU-}mqP#1R9pXnIlGx|b9#!M_X1Ur zHPu*=tDaJA1_Jg*Zc-UJ;svDxKq-MucXhg`O0PVKz7fkMd|;N=U)^YTH%7J z?3|b{N+8)m6DVvyP#W2!hmZ;|1-06S<|A6Y<|yv8Sc%NPl>)UUzZ;IQ0+d8^MBM9i zzoAHfrkM-=BO1rDX+IqQ#eL+Ld$b;EO_0f|Gi58a5;9;z#{7-hVcNT~1mpx1AT8C_ zUpjVl;1zu7vqM4UvM231(wDqAWX!?Wg0CgXxL+B25r}&d{)>>tU-E;tVSmiBAI7U= zDyO79pbWR>Zr(?+@=37+s`xLVXm;9BvhE61%hLvOopvl~u=uh~WH+Nx%jvRVX~dTU=`Eq(VLaZO}PIZpOZNL(157`-I% zt-9}&sY}552CJm**iXbCGPsRghX$oyepNvZYY{_n%f#dLK)RHmkO|~!rnDXdq*leb zH^m;9m2p~NzO_@~yhZcE_-O0kVb`Pz`t+8by3t&gLdM8T^FS5Ai5biI0}$B2V2#MP z%+azJCQS<`aW%kZK$ay-@T3EbS&Q)q7WLlj$bC*H3bzXg z*HWNFBsbI6AbD%7kci?5g#8_lp2WwO^E-P3U~ECLzCxp&93V!DTkuUFY zp~oH>MgWOT^cEa~qZw8&d0L?H{$bJStTn1u$tQEa4n~89iQyf4m_?;w!lITQiHg8B zdjZ-ncqRN{H0dpVs!6f9-$g^S)tcAfz*T4Ge$vh3!9AtqbuZ1+zr(f8>lWM2iFiWy=nR)cx`a0zJZc_8fs1 zftTy9&|H2WOjEddC31g9LHp?a;M<~6A+xi?USqnYb9YhU@t3plS^nAgfvN|50bXe_ z5(ZhC!Qh!VOz5=NjFY$udSL_qWi&by@3q1Umj1AF(+$Q0P1_*J% z4e-26-ZXD+7mXDkv2zv2G!N{JK4eox4q$W&!Gc%|qpyYV70x$}!8JZe((67nC=4 zvJ048R<|c6TBYkg;gm8|%u#5~?ml=w(>{J|_^l$)#{RBRBVNs*VaVjTP4(IJFnb%{ zzeUfXb4$J1rB~q>7%%(#ge{jqJ7gV4uBR0@@ZAgT#(};oKfpC{Oo-I!`)rJ4T?Di) z^&L`%FZvNq0Duh2?m#_;UKVI$V9&`+qb4UGeV;deq)^z9U5I|Jz4bob%(KK+?sRCc=f=zl3wl7U{IvXaFNIy(9@Y>3=8zV{(7M^qL}h z?>M>QvhZ6AOh~K~5H;KTtf2St6;+KJHaOCr^~S73mx8V`KkgqhPc?w=r9v>gxgI+z z`wUO-9_%f8JM{ggh^T+f@I_zN-U`L7=QjUNXK!cb*PC-eY^gR40 zG=@|~8urTif=X>IEJH3 zx0szq6|NPJOvL!iIaB^}*xLJ{l4`*x=)vKXW&gFQ+Zh}9>n@ zMA>5}fi|El`GT!LYKGQ)`xR!h=gcNx0)Gzu?X=0VbKqfZg z8{xU$#IYI!yO~B`g8kk6c^|lHe8AGhTfgza&_Q-RG~dwo3W#m z;;_K|YWN%_k4p*G@_YI>6RW202bWbzlQ$Um!!%G*`wupowC3*thbPP(x@{1*a}Hl( z*DAAJ1;gd${qtT|K*9XPSJ}%^ z*Oc{Vi+rl zINKgmd&hU4-WPK9>_!al?NLD)3C)==nnE4!yNA4#b;U)iGit<_IxS0+Sv>OGgyfM< zW%WOZE)SN|&qG*0koGj}@l*E zC)_nOP(UG0#rYqY#Ln?@%6xJR<}4EF!oePVXtdI(2~3*zEJGfGb$$st*=I^j#iZy zp+Q|2tDLo4UzxJ63JuL^7luXgk{*R!7cg6;^WcnG-Q{u>A9|^%`L^p@eHbp@J(;ip z=NL|4$hi_Q;~mJ%FN`)smV%P)dXNDn5`g`dPer(Bwh6iFpODgmXZx+qo2Pv(qs3G) zXfwou@n$5{?~vWxJIj!yExZfM&wt$;yW@y@-sKzcWqjCRiV);o1?cPF1Km#4~wa-{w?X(zF3zUYv}eNSK+~DBAA0|D7+w(Dka%H z2IxS;g4w?a-$)6y7u|hU&$3i;j5!ZM3D{Zm!|-ln3^CgOC1E=*EN8yWW)pl56pck5 z=h6C}Q|aE}SUH4hV!9^kk(%Azg5qkYpLqIDt}%K)TERUne+Q2Q%(z$AGMHN|d98#?l*IyBiC2sQ8ri4^ z3IB|Esj7fRKZ-k$c7M!e^JCEm?rFZiy^3!k8Mmc=Y3->129D=h2u{(S67DJvzk7>o zruly?0A=Op)>{BFEtf-mpsUdc>%bqHo<0N=1Nxy)QxI|`n-wqypk_@|8BVwRi~%T_ zIhtZMBbZ5e{VxnHKu#B68WS;G7zZI7v&2wN@F2TdRQmCY(WUolsFt~Q_nc^##f^E%r{^C+VfEUW(Y|)bYx4$J7Ye5j+~=cEwi>l&67mZSU>}qjssd; zAz0pINC^?Jd>HjNu2X&+EeHo=3-sgHfH|#t(Ps1hjy&?ZuVLBZjsOV{GTIvDA6=OO zuWI?4>q&!aK!;)CruJF@MmodHk+5MpNwVHA$8*dAdK75TB@)2YsJ=6R>KdTmB15*L zfV;W1)Y8EP7OWiIR+Ca+VwZep7(L}|?jOpZ&cv{rR|gGqhDD52wiuht|AZIh!f8onr+byk972ZW*50fCogE7WNuL z3#gW0^Uw;mwd2iq%7kU1;^&xsc)ITPeW<6Jc}2!mB=ay-Lu2V1d=JfXy!ev-4nYTV zL{H7dSrR5sOLDou0Lzx7__P^Ph>t@A$aFr8P0Sh7LWibyZe!;NH~^T{e;iVrcPQ+{a9Lbcj_KGV^F(Tx=Aj+<{;Bi9==xS-x$JRN24ux zQ;c_T8ACSn$?tr>*8r$fSBe~sGEZRf8oyDzFBv(4@^hW?EH8(@ZnS_MDK8qo{UX_? zH5BIcSyF)wMh=j3VHVLfz5ovCtE`++fK)WrC=F-u*yg-RP1#I*oy+A^uJ<=P2K()$ z3&Qdg8qGU$YJnqYNIhZfviM;MQ(t7t;abzpb;+xCNSW?xDRx>!;rA+$V3CiYtVBS~ zlXY!k*D{`smu7Zheug&+>0yaxy{t_xYq8~LNZTDn>!F1C2< zCLOJ*wSyYVK+Rp*=)Ua0R+nlZj<2h*3T&iQ^jWUv%$h8Cqo#;WJ5*2<)gcFx6#&#c zDE%;<5nu#|9Tb%I^`0hfD& zb8~Zo)ia`=h!KEEO0;B7H#Gmt;!bOK>3TEah>hX?3O?ANTh1tf7^Cy-;@$*2Z`IWL zeMMR13AB@VK#bvdSRPRh>22M13xbmBKKsQin|?O-OB7Rf=)d?@b0nP}och8Ck5-P; z%JMn(+FK1aNk$xGFxo@`8z)RiAy$qV)^@Eq95Ds<^689sQ$Nps&;`BH#q~Ze69C5!I#!5(t&HrdMQP~XU?>R%(G|8HWc;X^k z3lB2@_WqIv9OMfD&j2lU0ZIdsxYCR$iQjJLKq~o;RM`PbtfGTcg31Yvob<24Hv!?O zV<5yWG-mnM=>e$)5}<@mE1=Nu9w%4#0MLV=QdCT6ZrKA}#=qcu7m(cT? zqZ1IJ%s#>SFLvDFVvlQy;ttYR*Y=W98xRC#KwM&?KPuQOIudLLSn=g1zi` z$?-Jk(ynnRaeLGghBxmbMrxKKWT&S48E@@_x}?9guJXc`BnQwSW*404f z_AAXskn!ctqH)QW?@6-@SAw(d4u&}{Rt7r3uIRnhEl@Ec@3PEB{CtC*nEk&T0dubs ziE+b^0OqMzzqc0Ran)YYj$%p2FDmhVX-Y|g{mDcjgQakg=8r~*Z=Bm%1va4CD=2sC3O}vHyl{816vL^67kFMzEGP`&W8c5NPq`E%m9w`-3$X4=_TOL&@q$4`@z&+a()X>P5{J<&taxB*8s=zx_;7$#WE z%UD%#yt}rrPuOh0%%UFy%8Rk&tGZxL)(a)VlPAkJ8I-Ymh+d4P3Ycp^Z@Kft-PxzF zJee&7bEor51n|#lAYMVU6Jk{95mf67=6?&g%zP@%XHM9zgL!yy97PUR@;X$^Jj{R% z!I(iyYV_&ZLpQxfm;+^b`|A>+5}A|Yrq*&J4~&36KD2qJW)Xe>OcsuJZ|Y5v?EQxU zapuT-_GV&uHkN;|*aKM+gF^c~JjSbaZ(AtbUR)=h8@P?bIPDqb)EIc|7q;I!AQ;Xa zkR$@#G3epp1E8l-9#LDb5r2UVC=UxF4v`Qj;TpQ;nS6>yTkr^g4x@y7(xy)NDI#~t zwOYY(&Gy3uJaT1_FuBbsqC<}wEE_8jken!c^8B9e*az?i6^A-KC}U_?c^y~VW9t+w zD4drWzb%aS2H=(7h9)nG74R{gF&LNp;hlL3);nJsWhbPlH+)%*_0h~%t@-8vZ&!HO z6#$xWjmhsW5TNrRXRI-V&^(~~p%xB0C?o;5wg}_XF28cR(*h$_x_+5&le%3z2lKIB zWbwW=u66%?$V4@2(Lp{@)A34*@N*Z7$f2TblrNf7f1Z^i7s^5Zy9g+DQFHYUNR7Zn)ws84-locUU2oisAX7eJg<7+za|Ceg^M)}EV zTiGZcls0;=Ivx9Qd^y}{;7EvMFx7G-!?0lSioNl3W&0Iq38!*RWhdc4X^~dIv;w2r z!+zS=YoqY6WmWAQjlOXO3||tN2md}pyyl&|)He%SRr4pOo|FnFRWju2ZLjv=^~GZ_ z+sMYD#of)Tx#J;tvKad09M>x=2(xAaURuQA?s@P4d4JZ^>)wH!D$@nBty8mCB!k;( zf)2xynB!`sTgQXZgU^OdEg2_O$jdrUddvoTPYLzCN^W%X+8?&izXy2?N=cn~;q=Ps zaY^d`*yc^Nesj})vYI}!{T=4Yi4X1%nTmSR)Mj~aova}H!UK_mpql!dVW*NamvwSv zqHT}Ea4gg1#^zn0R=+kbk52q9WDsZ`Nw@nnoYI%$w72zDtn17{`P#v4qG8#`W^zZvv^M&$$*%$dFJmT!ll3Q(H40Nl{U^&xYA-kOKg;US-fY zf<87&BR+h7cA7Myk@xeBV;2(TmEdSL&i9~O8QJe*eh=s}(E9N7s80!R4%2zCgjiuA zL#~@)<&%F19&#YueTG`;4sZCruAwJ1CrawsA8ZOHMk5a}phwHleAVb=^cmn`+*kai zXE&v32DkQ)p~D%Cy=PQeRKc({Qz}KfnP?JMCTUduW_6Wd4(7clrzr}|Qc?~%Z$GZz z1#jK|nnSG4E$R&i?Z<9aXcDG4iC_m1*8xJWsBF!Loo1>PAx1tlD5E&6G#KcKJHWi@ z+#upG<>T7vl2X-uv>=$3Xdm?01OwWPP#&=!7^-e`jPRk(lJ|< z#^$_fh1LFArio{>Sxb?;9JjCgaWbf>xm1O-aQC<(9a`aF}+vVQFZ z6Y1n(0ZOS{3col zrw8jqlP8}m2SI>y7*J|<;8`KVZ%(8-H#@>N7;JDr$i;UT^ng?O%*D8((Jnz#xG9?% z(B>JS{{RT!ug%>)62l2bAOEp^5Wk5CGO$FUtw%r3)y@8SFzXIQ&W>%p7oM=kkpgxa zCw!}~ySv?rHTff{`_}&CY@`@DO#G5=Z59TnpZh-+Fr=}&n7;aBpCVOku_ciQ2`WM! zSPZ8Y{>mjQ5XkC~#CO3wWmn9w>5YJCrR@P5ugE=WI+U=EzaUT;q&U|uSE?TQZ-2mF zf411VO@p$fJu38((9IW2-jEqA#?&eDkq_~m$rx7YaHmoZb;fEW}NEnEbZQ)9E7Oepwjp1INtHcN@$wUEmSg=Irn zICrGMCPF2`6HQKwU+a-Bmm9YJqWwL_2)~r(jotstQO~6*!^`IxYyceog$l)>JE`(BKacm zt$cgElY`XNAq8@?vfC-{N5lGv&dB7=fph7u-q#@M1t3GKkREPws#~0=3}+SrPBtY_ zPH%6yCwxO$@oM&J!a?6o3L8luWpzW`DEz9sOFxBR{3?{P%c0H*KZOAA+|7q?dr^^~ z^WFH;>}^-_DjG5>aV&rkC!{|jnoUnJQv_Q;Wu5@*H#4nDH7lCDBesf{U`WxVrVDc3 zy}=v6#$$~j8o-!k<#|3ZJ4BAS-xV|Rnj+ShoDEn3>&X;#S_T=jlU{93R@@B$l zLEd~!l;S;B)pEq2pT5qpPthMl@2N!eV*#Rtr|QA7E1hNPM$DItYv)vC{^W3g2kG9BPk)UrqboDruiIy_k1C-E?|E$wnr#6oa;fxxApkG`B?x^-0Y? z?X}E_0Rg98B1m$CulEXh|3!+BEdvpK#%tX8a?RJaG>vA|i9cTtBn%+AURzu{wK_Ef z7K3P02OhqvhYSV&omeWU%z`T;Nwf0@Ad#N`709w}qta9Md|0_vp7MM-yKcI-G(<6r zXBp#J#Rg2ap~kcMph(Au-?}@&{zb?Q76PRQ{Wg{os%F1+8+)u>#7?w6-xEKr6$*~b z`Yu>jSjbt4pETYy4NCZ7?S(jUjSFLi|K|U+L#QZqhor=h0z5_q=p(Y+8bcuOMn@dV z5?Bm{0H!91nu>@Mjl0B~Zv+=nhf0fu$!tz1?GbeRrcOeFmahHbNn!c<4?jmW!xCm8 z%#8F9+53KQTiG7L7X3gRX=a2ouGq(p-ko8m*OmTl@B{C&$|{p8U3}rwz_osIt5ZQ` z?s$E}7Q zveVz|x%XWdCl^$@jq!IDtvN3F&%K1y9;OvqoU_BkE2r|r`{$J|XlUGqFp1|4@?T4o z;jd7o)15b)-ob>?mL#24nqUr+1GV_cR$^EH{jaqiY*hmh3i*?d+*k%XRJZ}BIm!k> zJfi_^-R1?%48QSZvU2=By;FblChQ7DP6P$B6`7twP)l<2Y}0-oZ!czdskOo0OBNi) zLZ{&cb#=n>Sj3d3tE>K8N$i#LB<4~aiL*goi5vjf|B~T{RJWCa4>0>!d>mK3JArwD z&5uw)`cg3*5{BC=#^@4nzy{2>=(JVo{#w0f008%*hxwHzl1X%)n9u^V-T|E?Tww$@ z8zKY3@pfDFDmA&d0RZeVLhQ-5_ezhmtJF~|PgDWwJ_lHn_DV~54!!C$fY;Y6zk(fX zjS5gO>J^OIzRFN^3`|DbuZ5+grv5yCuWVV^c0%oQWGm=#{m0oLBYMRB5(MdEu=GHL zsDZy@ARFZbg>q-@%448Yd5wXO;;LK44uoF=Trrff`Z}~eZM-@@Ff;%ddC$9lqV6iD zYk5Qp5kVn<^M+$BpACG12$A>7uf^oj;b+n1)BMA-c<`-VlT;&}wW~fyez(+g*++++ zgAp8_`j_S1*Q_++ciy;od|d{l^Rya1Q+pwAZCbS~HMRm*rH4~oWnz)Z-q~` zCO>mDL5vE#Qq|(KM7f6PUgIr|#2W=f80W(7NDnvA=%c?~Sz$bl$*h5}tFTD=a0N$4+HdK;h6{l8NPFM8nfl7c zclI-@O|cAZHrTZ)ofEWMtZ{-*Xxc=xjRlyl6x1$d2&=|}6`;3w5PaeFB!|vl>^8b~ zsdMWkVbu4Lh$Z!AI#eCC3b0WtP`PEe;B_rD`o{+}&iWQkU-_g=KAH3(#!RZAHok^s zIErGzy)*pbPv&>Ot!vxC4nuQ%~== zsWu6QF<3Z=Z7ROJVXB-JjgCn((l<W>=5&$i4>2BpRCliWp7(_?8gJ#%9y7nxYI=x2$!(Y zq_eF{XgVzZ55? z+8s5EBypB)a4oIi!U7PfM8aQtgYHD>b#H3#-66{zY#y+u)85-l!el`QyO^*XU&R0j zp)#asD8X*4CSVQKK~mOz(AGUF6RkF#NNw0g9C8MgE08lYLRR|G;9qTgr;MP%6K#g< z6K&q*IKOrS4gcho)%sD%wTbg>r@kYjGj*|$vL|3)@ z>9}?xEJo`2mcl}0iTHHs=zN>{?yq8!hhF0`;ik|5S|*iD?>t}od*OX_s(Q7*eow+q z5q|JN`$0t<)C{*I(7u)Ih%5yJ@wyk}pP`eA3|RkjcWvXa0uW?1KEhbU!a^=^)6s?C}`< za-G9%(Nyty_Qz+a+j~@y&s^?W2#f#eleaBhn1lOl{ZfWFI#*CgeRS!F^og zpPu(Up%djW=IT#cG8U{lx=|?ySt^<4MKU*wIww=Xqx77LZda!zRhmXCu@cZQ)`53F zf4k;=vr;@C*Tz!6*ZhQ?GM**aT|sS}-6aSygH2^8I=UsY1iI@fojX}na&J4d(qu_; zO+h?ae{?yegGP+GH*&&U-X|tYnvk$W5A?b&p>0$Lx(W8d2N&HR8k#CcJr6kk*VKE5 zHMIrn!;vBahoVSPx>BVI3erKOOI7J4D$)r^hXA1nf>I(KDG5@fH|Zrr=^d0NgkD1@ zbO`0!+PuSOC?GPN1c1k6LH_u%Iy60#+-#K-C`Krn56bHQ2M)ZL>*sl z%V;Ctt#{+pYQ+{77BniveY5uO7s>HO5q``(VH$e3XrYH3@$}FNT}l3=zdKj^N&oGJ zV^fg{gXgd}51Lg_p3xO!m@pzf1S>>8z}7hBpDidT>^6({KWUlKw}f<`mn4%~czvGz zI^e%XwqCV{I-#r1j(Qu{>5i}NV*Fs=nBpF^6RbT%E z6|WoHdp2JWKNW=}wJ+34?+()~#=Sm|-JKn2njo+5wW9;4?^0BK(i^p^b0=Yui9z0^ zQMxl@V;3zx74VX3EL1S^uEJD+&Cp+S@$NGV1-FGhr7l#ITgwy?b-4b1+E&q>I z(IX7FUJ%{ZD{XAO+KXYVVp6qpZqx_bri`;)m+;JLY0aQHr*foons#A5_z;W_S2~Z~ z_=@PNcw6sjjS<(2?jr3_+W4n#JDkNNRd7F!Zav-FrhEZ*O6wxExgb_Ov^Y#fA<1y^ zO8mv2yjR)4fpXD_xePm!-*Q0|(%f~+`CFPtYQbx}P!`}bu_CbaN2t)KG||59PgS~9 zP<@D&dB(yTY*cOhZEm0Zr?xFGwF5?WhsG%gc#;%b#-u8w`je6c+?1@i+AnG(Ma|ed z9!j0Hpq(xdUb9dyCSbS_h<-WoG$Cvsllhu-Er zh?!q@kM90hueZ1$T+n#`toop4D#a!nTa@;DO&#IA^)%9H0;@0!+KSh2O?oN?{NFP1t;U)h2d|E^v=r7A^QvMpgoDONjcLa4XF2M4| ztYc-hRehBwdH7LWCX>!Kwr(uKJTc-6y7#sW!tLC6qNr0B@*ZblBHrwU6CUzdsRF=F z{4(P+=Q`)}jt<$=sT181<8=3;TGI5KCugApgm@(W{M|us%4mYn()BIbcHI=$`SzGm z-p%=XuCL>IW0cld5i8k=yW9#IWhk!q%r{#O`;zw`Yc@gN9WalTYiGAD?AaaaI#&uR#=pJiQ8@6&a;Hi*9tMM8g&NY?s1MGjmj5wjyI2;Z8&BYv-({!Y1MzqpOOmL_Sk#Ti*r%`m#R9G?=)cwE z3~6c_F0{f^9Cul=?R9#wyPk2Lu*a^JrzdVb--gM)!df-Sm#-)L4=QF@fL8?Wxp=SU7+Js>^YFY$}`mJ$+>iQ=`@{UTYW zT?;+kC*FJ5{RD`0UHGz)V!I?*VZMkDhr-XZ8XZzXP=7+L1=|Bwl~T!*f8!PZ4|R+C6TbH_pNxE^Y*~#d4y~Rn|3a3{{ z9*QYz0yO1uZQ_Uig3ZZxINntL{E+IW`Sr~6_L>az#eiXBHCzi4Lj#gl`n# zr&a+#AsMZM)+lABy9<5kKiqHcUMs$sKw zc~3<4Y^TQ@lcrl52=oZ4n|wR~KdiXi$y1X(GnZo)?()S2sXHK78T+qNT}v zvR^YNX~#OSp!v))Dvk{q$A9n-?Jx1dcLv@GJO2QXq&Ji8Yc1uppj+$O77Xnv&jpzX zQJ>oXusqtzI5g3S7H1&fNg8!V3+-2lJj_EXI9N+BqQh?ZACrH5prch~K*#15(Uv)U zAk1I-XT7T6x$iVP`{e*aVd3k5-?Af4>^owKrQNLm!}?hwLJo$YQ3(nqm9Mc3aHb_xHa>4lhmykxxhSasyJpeNM*ROdqqE zoP;%C-Muq>RwUSL7d@R?*J^U3Q4w8*;K!Viyqok{DEz_aH?SIo1&vR@0db%_#Z<{| zGaV@@Yz*#AV&Ves=|k(5m4naG59UW5;KPli*O*G~Ct+0aG(@Kz55pCp76CvtsyaCk zNIwmT@Oj7Vzx(W$07J9PH>W5;j9tIl3LD!4Xq+XtI#Izq}Oh~RBPK6jN{8IktCp`#icCqr4;N91L#oH+Fs z_as{B^v(1>r@6wF;ZK6d`bUE`j5sZ3gW$%XP5969eakT@UEj?Z392V1X%ZelM=L7* z2ATOM+=gL~q+yUv7dP|Y$*WxXZ*wlbic>AtO+<)t@xydGL>aSb4^RgD|h6{dOc(a)-`2%dVDh;tA zZvBY{*XZBSZFOWFZEwtLVb!i}K2fqvqsv}&Qq(HplTCGt-tyborv3=Z_BR-S9KyBA zcfWUfNn6$a{7#M_Risk(YFNVFT4P2oDH6;%vR{G|UblwtWp~IgyZduZoYMa(D>q7+ zSu`w2FN(eD9f@%{lJit>Mof7L^z}iHCG{G+p2pN&TWaV|GVG9oMx$5N=Lr0y^08F>FVNgxo9qnKX1_)6;v| zPAEyzL~My0L0R$RqKH-BqT(P}!;}wp!?_MybFx0NR*fMvV0?!JbflJaV=?s)2DN?` z9Q`o42?JdKP0@BNC@I}gSgXyoz?w;^d^vPZWfsNH3kzd5V27!+JkGwBY{Xr6(NqYQ z4weP*A2emR`C#IEtCpS7u# zn_y+Gwn9cRC%}Y!!oZPf;;A9cv0DM3eE6bWVnsc6J5Q{g{dzAybp+i&*CJ@Xprm@- zU~X3tJGQ85ho$Llf=uW>pAbdr?}m(gY^0o^3WodjUAG;(q3EEqnr!t%SM#|S_=fZ?oMIwF% zN(12}_h0x>1)GYX_@0GSudV)f_zE0wB$ww|%3eJ{4it%z8ZsmO_mhD`KF}9j|HX|5 z8i4YDb;WB>yZ9yz>A1LCF3cQKGqqE$_8sfA&PR6zHWzS9;zex6cd=m$OHAtIyCFRl za{OiNZ~q?e_YomtK+UKeyh7`IW-`)#bggqpKMqRj+>RM4VP)1 z1ux)V&x9}wO?!F>>&gU+8Qklykb4j~O$J#{^{k1`h3>&K$|*=>V(9p$fsjz=+E+V%hRO>i<>RC+BJ`3x z#(%GG05&Qf?E?tyypOovHFN)EpxJAZqfhl)gR?8h^DO}yY22^NhYir4G)U>H8}jRW zqW=E=?ujag1e#`%{-_i#uWEhEWChT**L^|!Zk*R$vgO{$120*9KG9?Ez+e7Q)$24(QbAM6}Hk;7Deh3hfRXOH;a}s8gF%abKnmXU)*lHTK z6R6eADn`wm*Hw(Z&*v6t8SC@Dx7qnNBG9`Df5^4RuC;Nqoo%$_YpVfUO{$srREdA{ zBJt3}5$9R>2xl5bQ_Y8%G^jZ)nAWMdQ(VHid`}at$ER+=hz|yTBUBX(7vyMP9(M*j zS%ca%t-DqBJcN-p{#M?|zIpnbkZc*i0|+{}bk8631GndS(lB_oaE--V%(3&g3PeKNqWiL)6#yGFQJ)DQPI2CeXT$XL{8st4#fO0_I4G)j8%$>BG6*{!@|HuYDv*k7ao8Wk! zN~VCzju5WLJzd&6ViEwJuK(>9j0Y2`;G^i8P4pO;J@1vK6`uLl@ngI!T6(2MZNFQN z;k%8vyMxJzQ1m}EOxYiSdeOM=CNeMs9h1X_-jPkLcT%imWWx-6J_VpLU8cuz47v03 z13+skV-4n4f(@RbBgf>h1(!S|3g3SN&c5ytcZ)|iGiyKfw)0C9*_pCU`V?Jx@5_g@ z-F}~J70!Q8zlM+UEYbVaHD-kMrexmBIoS+2A%wB|0iso>**%0$DC|FmL4Hcx72q(I zAD7iejc3VYlMVw7KuxGgp3XO6CG@>QL;7sP!tm`eD|^ion8jTfDaPKq%3$gtNxd(w zc}Dib(!;bJBJxYq*brXgrrO)~v}$G|^K5*bbYdHnDXC9~e#>%)u#-G}&ysz8tlhiD zZ0n~}s%)Sr1fWxOC=wneQ}IL9$!m0C^|Xu<-}Nw&Sk`Csl6rvDpC(h+leNvQia%AZ zjq&ikyIBTpTc5me>R%)#sFoR2Q~ma)Fr9G^w++??K^v-NS#-QPY98tnDS~cntJb+1 zkp=cK^hQ^5zvP*|J^=?c!vn($PK;+j1`7{GQaer_P~Mtg>gf8l)w*$C4!1ch+ueq9oRzb=6mR9BL_KP#aBeZmR;rb6s}kF9l3 zHsq65go^Hpj`FdyeSO|Q=lVQ7CFe6pV_coJwW*(+A;b9^>*fAVSi1Lb752vCofaDB zJm~;L9np01g3$VVgzx0Snlo%+eHwmAm{}=~(zMdL*3=6{ji~r1$mf_a9HQ38V(Qdp`sKSCj}|DvP*zN*+cd z#5xF=FufO*UEcnJn0Ayy7*TUafKuZyU93MyN28Gxh}EzglJDBje${@g9Q?i=)^0h- zD{LvFtus|yp6nkb;Kkv?*1F*4_{^NmS&~N0#YHXElEBSKvxEy#xod)K}9nXGPQGj=~ZBKil(7LIq zQ*eTNd7cd_2>eKCv>1EgO=9>j7Vv7okT|`uY9|-U`YqL$X28i`?k2}@ehXLruXKJ5 zryu$U3^q&@`(A-}cn-Pzj0N8Q{hM`M?;m~3<~Br9ZRL|J)pfbd@krL%_KC@a){yH}^zmu(B z7{(|WBp+@5SdM#rw8#)s-|LKJIX;*uWjidx_^-CHqxZE=66&7sFKItI6{7|uuu*59 z!dUkQR}y=cn1f;W^NiLEN=MzJMw#EhdeUoZ?@~1s-hL!7CvXrN0n3Px&ZmGi`EF*T z_f1$qv>Zg6!5lYqHJRcv9BDyJt$tzSu8uCoVkMIacND1C4rAKPAd1`drYw7R5=~hQ zBvpaz>h&cd2L3k}Kxg>$Zvz=D**PD64zc#rA^F~iiMMXnxwTo@ZPr2?wG|Y}RIEXu8(xRk%z3Q4AKo0j z2Jq1g7@LscHvx=#qSPJ4WJVr{ZzZDbf6VdqP?O1i_Gv0BZ{_60x93r{+p!S)GL{9O zYboyLe}5mg4He>_lVnm>+}OV(%T9l{sITdox`lJO?;O3q@@NtA7TVe5pfHC<0q}c$ z#!psImt<)!A4N_a=IICN-_H9Bu2WB+j!K@LW*>Ak+V&OX(>RScx;Q0yIJobwXCqCx z&pdhE!}NnfXph?d(3J?LuS6@?G608I%y&djUm_*b8z`ulINP5L6#mXB67CI}vVKS& zXcz#{(8by7yYM#|etH{xD2(WNF6l(!j<{pn6MJgu_n;ER)F&8i)AcnueZlg@WAcK(>A3!b|rkPrGU`@wL;pqN~8qj41=lg}R#@s#1!~ z;@w_NR)COd95Ii{+=(s0N#p~V~xv?Q_ZNQ#PJmSn9S$03F$S&{=$`;{@cD| zs|cU{`w)*Y)&MYHlC{+vr-qH{9%Ut$2BkFIe(Y0r0z1q(zx#MPQ z-E{6bZ71uigz(BM2UXqqN6GlLZfR>hjRAU(71fsUn2doJ0xBk@wB2ioWU(a>-*k2X zF)<&G+4B)|#9teKsZD^iJx|;qba&(FVJy0n}#)y-QhCzT@zGf)aE~`}9E9-7_T8@_p+k z!N4*d(5-_HH-fg96l)y6B->T9KvJA&r3U+H6pbU4&Um3Ry-%`+R&h^SBO*PcV~VDt zYy0K>0JwTy(*B44`mzuD0cIBPuV8B!^d{73mr*H3?V>K3UVYj=;_EN5HA=-Y_<7Ie zQ8pdqe5H(_Mfc&x#Uh%Gyjw23$^j=Y%C zZX!i6a?VfGhB4ZnFL7aYNgbdFNeCr9A_xXZCgNQP`q;#z-y7aYwigtzj$d*0B^w@c zhmW3#D9vgpOFC3de*xrM!1@Ryu+m?ra3`to;WJaWhozlo8`TO5r}_x*DSb6opS6b_ zEN%{-s5;MB`W>D-emU*%-8hurSO9!JuGHty4S5m%)7cztZCx+j0Bv~LZ8h#cHkECd zul{@QohIYq({CJ2C6ghWiyjv)DXPlew>a)M*1kZ@%2x_>%t?1(OG+TfhvD!|yRm^| zyExKzyEkOwEDASuTN3L0CY{tOzak>Mi@l!dIH7twpdxDW4v`};A=!)D-@mtDa(^jM zv~-Zm9_~mkkz9%w802#S6`wnq&q~cm>W_^aD6u*Em&aNN`T1F(chUAebQ{|Lx2& z`peN``khvktD|-ZR<@rePQ-E$vB29&Cp;jbgcTgLt_$)I<%;SnCfkg4Z0D~46y_>s zjLj?SlEulUh0Gs|3ptDxF(bnL!`Q9(3NP4!|YJ zUycu;H>^ZbH)~2Kop$Lv8TY%!o@~qkqOT1Ly+9L)5gOml4@k!0?wNdHN3*|;_~<~J zpDNCphT47M5Sr{pJqlEvTg*y7gY>!@$6&4zMR?5o&%dC8S= z(bE2tw9hq@CuapS`=Cl{9O%@8c|4jdROtighTCQb0{`ie*;;rlo1%GTCN@Yu#e{+s z5QPGYGUEEl71bCu+;UntvL1eRR{g7Dk@zS(tWeai2bO<3%zaw8!K0uVbLljItgwft_EN^UHGo05oSM|k==i1 zhIPO4Ra?HZQ@ulrMM7vSjiR?zlW1;D9iWT2;U_15Cy#`djiajp6uVT?SL-eFBvJru z$a1*UT$M8k1=xf#LNx9OVq9VyneBn-+FH=`MI{++zX%YF@KA1GRT4Mft|uEc>H>Vz z%<7>2i?3O~Ze1Ik;Nf9T+@-K^rlQz4k!e&sQ`OdVtBA7qnWNS{8<1Tc?2zAV6M@eO z04;KkF5mu@cg3_70%58MxVQl(J-@2vc(UWOV(zgdi8+o35?Eg^-D{>skquTu>5_^A z(PJgZSkvN68Pk1IM)Y{eMUeMgf+68MyVR=?XAU1VN#>;Mw^aUNRXYv;uJ>~V^d>D& zDE4{KQ`?bI$y7P@vkdEH9^S{}9Pw}yCazJ@Y7_q#W6sY(L>WDPUzjZV&nXRrDo)8V z{XTrJ`EBi%*}6MlsZAtP<7aLUAJ(N%e3^7H@1~%o>=nWnpzsnGEEM{aaT-jsZ~Vd{ znGRibft5Qn_By1a@!wE5n++Rl#BEdzT+HD+*fF%yi|krWL}}z&@?8mEW><4jrwuQ_ z9?k2JqctP8!wj;s5v_uRy2AB@I?T%+w(ylrnBN4Z|8@W^E?3!UynxWPcP zN@281pA5gNuN~9G zbFYay)HT=@0Q#nXRx3?4OEMO4?W|;!$UYjS0o|o$#fs3{Qsr>(ji|aik<2m4a&q&n zG%4TUFqvf{e$)FXV+6u+(|PZ6dP?Sk--HrvLEd-${$n?feFjv1G0P8T@V=y z(*4f*p`}Jgx@CybA1q$d!h4Psb-EJZx4(e!zHp<#t|O10SX$S=pE}zZJq57CY_LFA z{Pf)+UrRt{NPe)*!aau18~I*sWJ;=t2BV}PC&&Hbg$e+A-V#15xbj;FO(F86ayQ=J zw0)XVnoa!r1vluau}rq?TfP=jvHg)9lVN9)H`LjRw`tVBze%%(3ztrj1Nop@*9=xk zCo&G=^mCr9&vzv%5sDhu}t+8PaWE<@I^bD2tyA0U}&CpOkcAfa1 zJ9(Ow-c`ZpVRB=^?sZnA)^tX}4xnZj(nz?*5l_7OXy;zKKKtek(9?jp_ha`Vv^O~W z7~@@8fEo=A*T=7%;Sbz%$!}*CR_agveG3gqMH>BXI)(%O3C7EkP?38xq8>+=S#Ce_ zIi7JjR3S`g?RahENBpwQD+z%S0}TZ0-eWnqxfjZJhA@M?ObhVeeKqEH*~Msa_WM$H zt2WMQ-bG!!XGZ1?X=A$R3VqBjAlNro3c*~gpa{JIO?$&}IHL_UftDUTgyMp9aa4{4`O^j%6WLYE`UclPq zi@oNpKYw{FUij|2aeQ!hV@Aoku?4DSOy$Uxe2sn%&Ju=GdTSouv1Pv=L~&=3IX$I9 zI6Rul>RAw(j9h2k!?3PwwPrg=@r3xm=%$m>lMd@Q3S7B##{2+rb_R+=uOl7 zr6GbGg)K|`mKI}g*UF640N7e@bV#hSS(Nn|_aE7Nvc_A+)Q4Ew{|S}{FGTIAO))C|o<3$X&6nfmC_yEu(-2&-l^t;#BJz z=kdSEQ`IKUb;)$UaH?S90pl^45bg8Ev;G$~K!vV!S*S`Q3i!y{f#_ zr(JR?*RU{#0E!9N)6ZXQ7>zPq);g^BVP80dlby%Db9FJI+3e)z!fDF#vA&ARM(pz zJ1FB~&pg~i3Da+aI@me&XuDx0&TC~c2L-QG%&RZY58)%0?0b1(=j#=yy371r0D4uE zosY4BAGaj=ZD|92#?nuSgnLdCL~t_r<)wa~#W+OTRfht}G_UD#O#Qr866)x@u*tvm z1?u=%8PJ7XkvsT=@a>%=lfwmOZDVH8x__p^*O7KrjwlY*rY1;Za&|%}9hHA0&721w~ zSZ$_hN@}5CZ(kDqh?8JmB;TuL8|CZIG06V%^M2aPQIm@6@)ZH;Y)QdsVUgalqq zO&L9bfh77IO`oRWZ2BB4Xq;hpPTl8r0Rf>n!+V6!e{N9jC9F03)zym{x$2FU=lhkI z3-k$Sa_4-G-JQ_2n|2(h{w7rbUh2(yG|7j;PUgiie$sLFIzX28jbS>`Z`< z20vCcACh5C5O4@c)U5-X=9Lv6^3XWsduH$FvY(sbhvhdQ3;ObqvCPMnIC6LJ5~rVs z7gN?z=IHZ74UxkWi^_T>8SuFF>ET7m2iy|F-IUDn7%dkY zw0V6N7 zH+DtRy!xe9&LSym!J*Cz3k~VVqDi^(iln=w{()~d1;0-Q)peqLmcNeqUg;LFI#|7Wvmj{r`3zK8*al9NX+(cwZ_-%ZRk{6yc#P$7>$7ADYrc0 z=eei;YFV|)A^f^1m03I%BewGYYGFBFvY*NTEs5jw{-GVN_Z?9uL}Urf2KI{Ct<`B<(>TW>V@@RxVU@?NG~RXddBAk(+3 zSR#>^a9>w*BL^1TbiMixqBd#mNavad=c5bsKO$1Qp}vwX+xHQ$m$aMGDn4P_%+7ZEPgb=2{InXoM=Ltjojr$O3;bvtFodFjB|M=Ba=Ggd+>?fJm@)9;C(U1&6r@ccXn8SEH_F>1UmmDB_@cl2Att3TVsGmyWn+Cmec-SzW4{>esJ%Y!f$S3m8e@#{xR%hz~#eMqIRAY|61 zPG%p{U5Z8ePJu5*uUCqI=x93)D>NWost68hB#J9mWb@CxikY_EQw4RO{O{=174BE0 zg$9RMt^fbxAM~ABx*0%pC?Ax$%(?e}b8?jae0%j(#)f&HfPYPij#Cs3;($2vsidF$ zMkCSxjvIroBKxH(xxL^2yB^@$cLHVavQ{WhW2YYZy#4p`FGd-cSLyZ3s&1kG$Id$e z(Wm=m05Y|9`VSxSBQR2luY*ze@$?y+Mz&RAT3ZZKW7-{C87=npb~P{q8ic z*#Cxk%z{{(GITw?efIyIvs0i<>}vZ2EM-=*dV!t$pE<0+K~_L;xmTP-Bl6#zK&h$- zuJ7q0*MCDBy;n=RSq=VwttbAE?R>{ivWWl8h(5hqP{_RY=wk%(za^cP0#D=!QaCC0 z-=u=$SNR-ZpW?Iy|NCxF;Z?ZaSZyPp^6#w1->$6F*U$0FY{fA7oH4?*rQvoTcbz9fMM)YN0UrSj3=COTMnV+~4E+7`eF6vbnS(--QU(Tw1|};Zs^$rP)(-1$ zrk*7HvHoh%UV3uEDa4107bD3SILkHDsmsE)y9N| z5(Sd-p|W-%aVTVEO{m}RfCQRO?&px!)jwae#s=fBCkL*RLYEz{>sPH(6wj2{GK@ei z(i(tCKpzBbF!Yxh5mE=&nV~+22mac#fbR-WC68uoDn&dUZPKdGXK+g1oT7DXZM?^ zQc9)&lbz5Fu`BtKkZT`-^4|tN6z` z&&YCf^8YPrY925Qcrl$%mQea%X;u0m;Ey%gl;ZzKuc8EKYL;VV8U`AB+5a|>(DhkT zIWPlQ^8c;(sX!QX5&rQdY6hkI|Jc>q`X6iU+biNH{nuJq_5sJDFOv?MUlRVC`33RJ z^t0?Eo6Hx5|8_My4>6l|S9~fYzw$o~oYVruUfk1|=>AvKENB$Lnd~2rw9~x*9?^eH z_UrRwh9nMe)5v)E*3xL%HF-O{Qy}mC4z*I-c>?q}z(w-5ouc{s_MD_r@bL|#d)E_fK2jSMY|k$B^~Tg6vQGxVeC-zsJ3jQjrD337f2`ej z%mO7~nU{NCE`BJ#?I36^g8H?5CZ0vGJDUUZ@eI5!phY%dL8DGs-tW?dckyj6Ylt6B z!Brru`<5i2CwvqG8fZhy>w<@tVW4UB<7I8e2TgnPW4hF}<3k*NuyXDjUd(QBP}|O$ zc7}=P71Xl8`(IKPLSC93mw}h4QLY^iKEkLXB?NPR zEX#*kAR*z)-mO58<9N6`Hi-B-ulp>Q)dug~P2*mR zt{u&9L?mzhC$1m6Mf;ARC7;_Y(8|xe5NZ9Rap5zHi@g2IE9^?IvQDFWU8sv5E=O$7 zC=Jl83XoHj?s9|&_O@`Xv*UQ8{Z^0!|?A5({sNq3|sY6YLlFn zo+#+EZuE4M)%a>3OJz>iRaeiv&xhX5Qa&Mck;_KgXF@s*7YpOvW@9Fs|LEwc2DH@vJLdMFPpu0yn?^iHY6D~m)kwL zR{8nwn04;|Z)n=1V!fo*tFxwu%4r-Yd*(rcjMyZ%lkM^gf9o7nK<#EMI=7Ws#x*bN zLQzojH)=%{o;ca!K_4Myr=Q|fun*1MaD!|?gyHOBiA z2h@0SZrF0iXX$hNhUfTpH^^_`H8D(Bf)%HStVK%pZi#o<|M2$h<9Nw*^IpVI>pGHW z!)4D^>Gk_dHHL6)q4_Yw#W(vXVkz!+jV6<*i5c|)-@U}5JuuO z9Jh*8yH&wPbNO8RhKiE*Ivs*(XDRX3Iy1D#E~zjOj*~E*nYR7 z0v@KBGG!+;y1~??Tbk&L>MDDVyS`cwx&QFpzD^Ldho35ml+^bn{ltUAPeHrlwXA&>ao(+iNW#KHMBopzFD)raI( z2q(;w7zJLR5h?13^dQ85s4~p!Y?nx)-2wL0o%{r?rDQOKJ`Y{ycVJBG$>Y>j@pO`0 zJ_4tXAH}|TUapn6E9$Z)O`m-^=Mj=RIVf5#s6)0omk%X9?@RdCPIsk({CYKb# zO#%WHF`bb2doU|57$d6aRIGPu*y%&55*F8`!ld`~HjDQ>i_+WUtOx@020qtefJ&C# zcT!H*aBkwana2E&`&SUV-?*z^H3iS>p1o2=NMp+q4D2d`Flq91rr?X7EcPuR%Sk_2 zZ{OBj)OHon13}UuOYoZ@m0h(%IPt^|;aTO1?9U+dC>O+^Z)mC$N9$nN=MhjPn=ohD z1HKr?a_jfx^iBFBQ6PZJZlhe=DcE49&^vW97kcF!-w!Qge+92KV2!wuD`OoWI&E|q z0`#WzLhaQ0dNf`#GD8xC7|9U-5kxijh>`f*g29>A%d)!V-~A>;!^i7hyo&HW`~ip` zsZZ8KLa+Uf8BH%-RUo-m(+SWOt+fL;)}M6;@V3{VXcA{E*aFGQvrxf#hJ0YM#Ai-I zeHx?PyObY;x#MYSDN4pPxAVIWmRR}{`poV}>@vCXCsmLdW(l6B((U&H`(3ET8t$Fw zM%QaqY&ij~g?3#x7*IFCScRS->M!??M5A}@5pzCY=GJ9Ehs<&2ta0ZhppT$kOBRo^ z)&^M7DhM;ewMs6z-SiM8;)?I6%~lTf(y=(Cv@fY~BVg-#&#q;gw&_vGrO>B=<-3Om zM4bm-EG?eTBEAQhl-b5ifL1(idmU=VAH9Pp`tB=unxzX~j*n-V=7lpy7nfm$m@7KE zMivv`mKBs9L-IdsXAaL2Mt}HwbupFrbEwg#Gw-v;Fh9ky5@CqYr=(#?JAU{4wUSiJ zRuUG+hL9o|FhIK)uJV@r5W8SrvuD!>;c_Xr@80*SbZMnGyb7m9#4??Wt^&m}9fX3y zsktJEol4tg%s7A=42KC9(`JJ7($BV4DzcgwH0q2~UZyYL)Pm8LQYoR?!5!^{Yv<7z9lW(9VuXWLVM54U69 zL0!4vVC)J-=p#Y;@4K=-(s!|jW>)$#j^BcmKIvvCxOtTT5kWyAuVmF-e ztUY{Et=tgyS;xNugt=Wjxo(G47_LbswLl?U&#vf5iQF-_ZmFjDHd`3PLn$BY^~lfA5TEKRt&CJQ^@z+#m((?cj@v-a`B$R&rjt-82y{$(zD-Bfe|kD;KX;c(3NAkhmP6R}qISS^su#P3Yj?%f91lD?fu501jw8 z-%_t`BS*7V{ecJa+~K89MI8pZG;%TGt5=FXALQo!+Fp~ICs1-A+$?!Z-(PMtwik)7 zPsjS@8X9+`#iX2nqMpEH9X(R@RrrGDzLo3JC+L2WR`@u){STRvd<$w;=wNfoLtYG;#>GG&lLfj=VJIjy(P^BL`>c33cmYX{W}I z=nc(T--f+Kxhj(ko9_e)WmKI~KbT$@OX-Zge>3FkfpjKFs3dbN-+JBK*P6bN!TH@Rn}C;IU^>oaB>G*PVw*lMyg_ z{{EdN`piu0Sox3uSkLrtXV|q0FsQma5Z06eVs*lXRzTt5{ebqZ|gZ5P9s9tr*cHKGl0|^fhPo-p4 zR){R{orTcq&HRT8FoiZJS;NsjLyd$RxysG=Z!=>n+e9LrX)GTW51_=i08&I`9t-L0wN-LLg(Hbb65@ergp|mROpAAZAQU-Je?Q5 zDAThnKTX+L_3S)K!{^S`@zJx%@$Y_Y(>uXjXIPmxUhk@S3L@{t?kK|M8)XCI9l5Xo zGhr07SI)P>xXE$78mE5vo9vspQm>UFW#yU4F~NGoKZlPYD5SctYa_7mB$VD~w{hp9 zwBLc-)yf~1&|wTb>O0xhz4W`*=`6vtV*#-GFpv;p8(P-rvVYPNp$#vS&5Mn@kTQsq;jT^mID8-(q4p0e)JmeescEXi}#FJ2=SAtGJhsci-e ztn#tU=$i-XNe|w2Q;v4_=3P^2h^+_TzldE0$3Ll<{!JQman}3)+7vU!CjTPLbGL=s$+L;Hl*j9DhG6eD56i>{8rh&WF(jogBD3ZzL>iRL8hBVi_rH0P z)DvvhOv603sKMsi+7z6Zt|Y%d)(GjkAADGO^NjZpS~{ytE!vaa;4gIAw)|Wl{n>Tu zu4NayW~c{+C>Qs^=_DUPBuInT5%NE&9so0_@xH*j0Jg0bhOPQ&OGg*KB(#hYKl;WC; z7uh(TcO#J1VS1M$&)3P)xgk)j(s$O@Bj^0d?$=)@&dav0Shf(HUoXRE6mAZ}LmjeRiTm&$VPvK?x8#*o4B*Lf zIG)hpPP#4}ItJ<6&KrzEL?@FtK1ZKumU&lv_CRoXr}Hu|S5;_OanmqkJM75WuJImS zv^Z0h{HC){^Ycf=!@L~H*Rmp`qS*8f0GbI!)z<+GB#z0W2j==__& zWBtQK%5v#^hy!HuwK>tkwo_dBwj#zRj!J=AZTrH-AE_phO5o$aK3353AGWP}5Q2`( z6aL1I#2D<;!_c8OS_(`5H-Obl6QAJQc+vx#e2>L)o3 z?nM#SZa=eJX1o-*A8cbzRgqZ{%Hdr*R1&%^pR8J%lvJ-;x!p;nOo3}~^C4?3;X$V> zFF!mBXY?Xl8+@HwlE@$YO=0C3Z$6_#`jzqj0M9glmVQ`Wg=#Y3QRrR9Z}TTDPa3Yxsinj% zWHQkjJ^o0iqt9z-82vZACdUt--XyQV-p`zTWS-J*6)!f!B$qe;z|4F+SmwEN<10sQtJ1g)@;dEc&1qBOhL5bdnQR{fyRq_DfdZivzXH z8Sy@2U>K^@#Hjj_8p4Oxblp+BllrS7+%%>3)_Y|i`ENJ(Dg=+75VYdYx8#m!dy1V} zzDFB;(+5edicIepx4sk1cLv;0wqin@i84k#a#A}uBc~3$l>{Fw6$=5-2E~UAtV98R zgjK1UUi+COmgf_ z*)M5dEW0VJ(@SLUxg^?P++h*q@TEcu;oVT~LL9ncf?@$CwdaYk zfoWgi2FJ%5w_?i*iu)&o=%wyl_y-Y2h=`j^vI_OvJBiBUCXMR)pW*iz@uh+`g0Caz z6$9k$jOG&IQH3a8%9su^DmDM`C=@SPXU!umXIVOer*Y(v-6|Ezw1h++ECoNR)CCXMq}|XfT(J?09~1d|iO$h@N>5jt`c| z4srO@Y|XR*8i1i6uk224LTuSN%+~Uq;qQwkO_DoGu_hr&b-o69jPjau1AyE+QY+_1 z`-@-9;oQ!N|71If6OOH2*0(r5Onk0c6?SQ292bENNkq*Jd%Mb0X*dYv6y000L6OO# z?=h%L?fwlIR@)=K)(Bb~5anlJF=>dWPc2;f5az%TYF}anFEE3h z?4X~(Att4xW>WiKR>aqDk3BIkRln!$Udm0nYfU^@PsT%P<`urz+U}Dox@; z$4yjeW>fOHps)qXNVCA2jp0NImGn?NUlo8~G8FtWhB(l~FPa3~ZZd~B5^5OXm2`m} z(>B(@2I$~T^{bhT5atO5%Vu~mQF`M)1;B28tVSR@pZy8js{e-CZ)@O!`*8sswq2iq zIuKE2u|3bi2T}EN+}X2RJ~p($g1cG;l8Mr9d{`{qv@mAs5<1gJD>Zw93>i^$TAEo^ zP_--AFH74Tj)$T4x7@lR0Cl)~3b-O^Pa7~ zgu#2bRtNegftbH9o%;%Gbg2J;Z1*;On2cZA=R=brNw$;(^EFA?u>Sd68Fk=>-%&NK zt>%=8T{*O@R|Ups-Md{(7>(1ury>aI(>~%==srK{#Z&Yawv)A& zVr@e$&g3O1&iYPyKqx?xS^+k$?so){jBEufL~I0$?V_=AR#aOg>x#^kh01ji)ss0G z?g|i7?$m&_Qo5HgdU`t z`yC4`+#`8x?mpF2IvRRKKV%DLgU20TH#00~XJLuHt%dvX2Sz#Uv1{A0U{9So#fg)L ztsoPwgyOiqcKFERUm&3hcq(=BB@HUUrW!lj5~FiF&n=DA7|T{7)0rDXMtZ7XRm(n_ zru>$64vkuaAYk#l$n7#F^6#ziMN>q`#mZS_O5RLM*BV7>Xss%Y>qnyR0hfKU<3}N# zNjZ=LR`^~g@ynBL$fDx?g{lpq8@lPn+T&eSx*qGq-_xtZmoVUx5t>)2aF8w2Xev-o zXcw802$QN7aU-1MFJ1pBOEB3g*?1RcQ{wI@5em48=z#FjfJ*r2CWeF#c|v55gk1}5 zg8%Yl60-R=&la@J1-?8e#+*0~`D0%cbS(rrPz3rs7)-b>g( z13~Qj+>C^fF~Y5uL8d?jO0)|oHIW})6P;1IA7q2X3h}7w_;J)NCFHue#K1n5^}-&6 z2oFD9fG<`xww`cx(vWK?vA72BJZT%ax~TTNM*Vwkm`%w)DpX{Y)!WoQN`Ib7Yzk4! zOp)6ZlU?R7+6$tavSy?|*^&3%LqJyS$e~ORadyT?^Yzu`<#k@I@N+_|?=u5*MsM>3 zq${Te2?s_?2yqrX&la7-vE!^>T(5Br5}Fx0)Y@6{=C0E7;qc}M%eX{!S=5#7q?A0?g1gDnqx57wT%4W`u-C-w1I8m^b!=`%|lFoBw@QYNJ`25 zS!pSYDJ>ryJnx>fGM-e52>Xwvs%KL;31zSo16JP6yID$P3;R^5qX zY={aFf%%d1$~UUK)`tSCCbH!^wQ8RQ=|%mw2TZjiO7AFNJqu4*B8d`BM7L&iFSJU_ zSI9xH$bd@WnR9X>svS_*lSgrA%sqJ{(6Zx4xIW~JN)RA@%|2EP{u`nkbHxqcKDUP- zPkHQ5v7KiS2@E-Zjza%mgsF0~_9h~GSH>}&8vlD%p`$PtJGUF}?A%c1NXL@5A;iJ9 z)*6AE_*tgnEC*yUT*(`r7hze|l>ySda+WDYN5Oi*~0TxS8vg zBgs%yvw-bDlALj+-gs?q+?=Jw=nbNbZTp}2tV>{a#eRcQfNEC?kBuYcwPA-a36Y1d zXk^pX3_hK%h}EtH)jk;2_tr>u%fVuYD0_dw#~L`xX$ieM5Gd;d8&&+p$c+5^4mshX zCVe9(?Sv{5t)Xf&z_S^=S0PuvY56XZpD8^rSxX+(*$a+0HfiIb1f`SaGBo0WpAAV8 z*jM+}vVDX0_t&rvic0$>y$6OaD^gpNB%q2;aiTPutK_IfpUM;#vn``D# z*+qkx-Jv!F-Gj_5kNkuIIi=1&@NZ5p`1s}WI9B`HxIH*rq#C3DPGfo@MF9n>wGz@7 zo|@i(1ys@?0nPg@Dc9jk(PwC3a-XB)b4g7P95bJh`B#=fDz3x}k|M@x)%2R%bV$izK8WCpFobobwg}|HM0iuWetLK_3_yk z@NvMs(>s#ZHauDt{%j7T8!Q$`=Mc0j@nr=6UwtPY9j#L&E>Rn z=-k&!iIU}T$nA;nS~o)$AT!gG2#qrmnlf#+n<|b?F((WYyri(o$@nokMcvU?GhR5_ z!wjv2EVE;CiN$hE=reZ8A2 zwvG@M+>j=Y{lk#Ek^^&)O&Y~nGp2dY-o=9wO9g0oOBth)i8A$ssRc@19W+D0Dan4! zPIA2Z;5%~$5yqPq_w6h281PScNJr)IfB}NdPQl1#*xcJD3g2Kb&?yDBJOy{z2@$YI z`uBh#bQq4nk#Xh;N+^U}=axTB#ngWV%IEW(9b$Wj>lfKm+9!#{amNMLt~heor=W#- z6FUz@5(hbNvH4r%kp@=Xo2l7rk)EuMOi-9e zemUA(f-6_~881}{JrlYwYe-4O@XM(2=GYP`TCDa^L!^11#aJ9Hp4zB%Sl+|NkkZrP z5~pPZ)w2kduN+QDOC?o#CxuON#UQZ1Xh6IJ$Un*sGlrN9Cc-?J<^Yj%ZuZ7z&3yw0 z)MQ?xjZItA_E+Fe^*b@pvscvLCzuhu07r&TQw!;(-Qg;U7d-kBqdx?xEaPdH)2yf^ z(#64X(i9@@}btxd6Jag$UQr)O5Fn`eZQZ-o zzB4gK`|biVQ@{*2L>uMw1*?&FbeV=oPc=vp9RBu4G7=S2;K#ADG6Yg7$+HZbEHwBe zr8wj>dP1``I*H9yKu}uJU`<4Z)>c=&|4wp4{hFZ2je@$Et(JGP3Hz0dLA++T;Tj$C zc&PKQ>iPlfs-Yq$nMJ|fu#h|wv5gVSy$zfwnc%j`C1V1DP=!cQlVZXl2@LLCYv~1y zbRub4)49a<=GOGuR-Pi>pE9Np)cV$0(bAM(3+Fba&D+-F7Do{~6TjfF!WfBsme+t;OOu2|mX8tSDD(}X*Lt#0|- z|Fl}BwW)NGRj5pZf=oWB9yo;d{tlG8M&B<;^L=h}*=F^!*i(MqbL{P(L~=Xv{7&HW zK)|fr;1ka>ypF=PGDe@}TrVjS(Gsx>EzVVGmFiX#MyU;UsuhlTP=aJ9H43D1E+qLd zmJmM&@=JklNUNC?NRFBpU6mUC_I){)j}^FRZj9shYWDW#50&R<-6_QA!!7Mk4+_g+ zSA^r2GWQnp^@7)^c3iF(tR}3sqk*)_pm9gYA|abRmmQ)f`RhKXNDP*iNEtpx$?^#a zreWmIBMGL}q+&Tto;u*(+z@;ZUzj08Vjzd=B&q}tZ~jgp%69|azG2t0r;tn^KdPKD z8OfHyF9UL;_x{Rnm>c!puq#aw{l%n#uU|D<@-#7x+e#C$-Pwz}_7$-xbUC8BZaSjI zg!T8%9+WsJ96z=`!nZjqqgNUDE2lOtDD*}4?)Ed7apTq(^t$QyT9A)la61t%_23kiH#4`J=~FM-+xd09q>; z$qC)nwQ$!K5&jE-U>T~yt#2-87)v9%Hw@`y$P8_KG4Ctn6H@p0sYH7*43CMfSOvJ_ zGxuw{-PhSq>3pd$QzGW z=$9AXg`^!ygDx5Q{E%IJ={-{Q`e{tFn(bqv_%7slG_e)cZ$dd}i7{Go{9j4)ZC<(V ze|1CL8;(Stun2xo89t9_5_=yPreyy-t!Uc(F~(K~YA-JKm`G+)7Fo6$-xpXdN&Ta1 zU;zr;)*-bH;BD$Sr5&SB=xfq`VI|65XA~D6;?ed8&#Ne zZRXdL3XKXOBnF|?JDAvoH%!;OaPtUsHuUY7nM<`R(~vewV&k|V*nX^rx9`ZuOb{n- zs%qA+`c+e11oT#ZM46w~_0Zhp4v$Tr0LbwZIh9RZ??*SAxItHblUt}VYBu3B_R?1b zqPS>oc(mKZXyU4H?t$VS&L3?)Mn6Ti82oh)VunmRelQnji7`?nG~psG{FJ=MCcJbR zP3dfYe%%CZFXQODT~`@Awl4a9qiaYkT8I_tsC=v)WnP`PdUsZ~QkzI*VcBEA^${1t z{zHOS`}Zx);8?N)PEuGt9o2P1i9*hj)%JjJPlq3@I07{ddg!4;VF`=Fg(|2!!oP?Z zo|U(Ysu6bpd$u?m2qZmRg2=KKzkS|vPW^2=xOQOShGxgO*OF}5CQ$<1L0H_LNIRfK z;DZ4om4Kf6gOi~(H}@(7dp3!e{12+(MbT3a&8Bg@u9l@z&Ka)Kj*4_=xOx-@EUh>K zSXSSuk*o1EPdKnmIU__Qh@m;@LK(*kbA`Qk;DAW~84tB{O3m z1;P@a?bR^&iVA*9#A+n{+~<@@5VBPEjc&!ELS$9I9zFWVG#ij28Da2W<;osVJp&w} zFvIiY$bMUk*)mJ-9Imy645729I%5SDS>*hI1~x-Q5TVoy8@&i;2M|uLK@_(T*)yG6 z9p1*v6&t%Yj7qW~csC06%5QH$b(xE`PoA666+;3HD#dyJ_`H9&TdPH6q7R~u|ND!I zDjo+SWtt&$P?8^!T{&Wl%AjWl0vm@gnaq#0mzL*>HAR|+k0Hpt9P+efim@owLbOd% z1D%r-W}&vQUL2qv`qzvwcF=VgCv3Ml7eSVo3NKVH)4zGr=fX8?(|ys$@M9*WiI$d3VZ z%dtAZ{XI=qfkgzeR|RTFd0VKPnKB$e7SmM=JL&b{WJ+I{_d^eV_WH2O!~>)mM0{&m z^G&1E;d-pm?S;c#U3;=dby8sFY%iMkz6=q$vr!=m z9U^j28%Si#j(8Yz2($GcgA--v-U{k#>rP`55Q0VI_`0_scnP=bIYH%olh2>;G)w3t znCuK6F6>g*&%(~z%Y9$7A-pha3wFmU2<8B(a@;j@)m)g?C3ofocz}eC4aTM)eOulD z^s#2g5@%g{+$^6IZX&%CL!}kT7t0h@h7^@V;)%dNO?B$nfb*-s!bXE8W zHbN>3|3yZO;u{;*O&za$)}}nPh#|5+zzuxq4zs)Wh`SW>_l>bsIJNM$E)xkxI~kkm zAr}df1gDvU#9Mov!Zzx4@Rx?4qQi_7=A^;OvgR?LI}Rm$EEOFXG}+1>`pE;pOx?`y zfFJ{5t^#+QaA|#~Mdqk{0P?kWkjY7cWLi0-eju{k_ozeR#}*<~!K*18mgcQ8oblA@ zn@ZB~^d+o@g}-!al8v{=Kppa@wYZ(g?8--4&G*Vao=9uu7YpdgiR0?RditDWV=bf< zF@FnavvACaxt(5gr)oH#?{u*bSggdo5Z(Z>r85~9W+-mnwf}GdB04-OWKbP@;V4rI{&BdQQ_|DmjLbm@vGr@P5$<^N8p56I! zQbwXzWAZ#$G9jwk3FLoAli>~RTWy4)fu2V7d+P11&~2*3E#}%ekwQ=|tYu$y9kb(v zcm;P`?x`K8Sv`YDIj-He)VQ8$b|JoA2t*Q$x2&%O#wLpI_x7T6Xf`Kydk;SMW2Fx5 z{d08>Zu)sKzDwsfd`pX#7frT}yKm<%KrW4-{EL8$sxujqS;dTXiV08yf8mpHowB-M zY*ZGT>|w)P|jY?tkUHM#?y-5vB? z&O@=gOAxzUZOsEbABKi+J2;jGzR&w40+)Ypne7}LKHTKxN8e~8F~8Q`gtzJ@pPZbX zt*CL_!f{+F#jqZ#O-POQ{}xL}$LM&XaM&DeNqq2zvva6fU4w~ds-&i^-1~|}-W$nz zBAISZAlm*J1Kc9zmQoviLdK3S`sq`6Zy1PqCug7{53ukPUYs>B6Y9i@SZ9-9(Y;7dg*>6aP z)ibu;xeg52VRfv%83Fgo_gnF{mjlVK!(6(s&8{QG@VvvX(C!m0OJU+uPYsrc0K&FZtcxs3_xA=uupRMp`*5hZ{Re4 z1++v~*|6ScLZw)p?Umxr4tVji1pGB()U8KDnM7n$H34%2*S{>^o;9{M?3?%FSDlvo zo3>(kghOF3HzO4@(FC1A+~w`A3=8Y45w@T=Ugo#sY^QPMN@xckh@-vKV=nMDEWqAW zLo)_`4=TCVNZ=a@sn|o|hp_KM0w_v?G^#eYODcVIf4cnqXHMW8*WMkJ(-KqyuAd~j zgyl06Cd*!K2k|P-vjOO3k!646qt|2IeNjk0h4~$B_`^!W9^*i+P;~&gdFHW29Q`W^ z#@F4lI#(P=xoCxanT7lzfx_D4F>`bBn4lySNkqg2ZYx$Okk7Up8jT+g1 z-LdsSBn(2ZOATkE+g?C=0Po0H?nCITenameb)+8fiM+qN@wiHFWm#6AuE17bl(t>- zuHP?K^(WhsKsfxwUmEL=-Gq<`9(?P74(8^JFn9$IcC-KTXHMO}KznV6#1J8_6{=S! z^L!!mEwS-l{6rq8CaIamSi)Wt`CG+cKjp1gj?g|(cqg1fr?Pn`((hp8BSmi+#53&k z2d&Lq8%>k+lDIFBYJ(ZX=|;$tDSw}TTGe?Rx;=9mL9!{J5i4b?Lmg~)inv|J)3s*z z9S$lJ-Nk~@**Pq}UhdZ){D|s4h+ZB4Ahmt@%=`yb2G3ylT|E$7Lu#|#x0ZK&FC3X; zYAf^nqcC98yntOaHL&YeFe)Vi%&vUCvTj-DDdRD3e2m`P9{%x7$#o)2j_X5@&dj-|g!I4*F$!tN30ub@sH zrNi>XYan5lEP!9UhlDil5z4AIeR^gNg~$nP49ClW1fVh1p+L%O zkc_Pi$TBUYnd`RyfIr3{>@?rE1L(V9lB!{u3h#Ca-k5Ofnp9#^>Kg?XR(-^Cj5xkB zd>$FeJl32C7biclz>t%R>-Xpl)3F=Aiv3 zjV%z#6r*+cDnf8st&9C$n`dG64oWx527~@)R=c z$rv#)YXjo1;Br6i4MF!3l{1~nkGZ?CA|LOJP5!ul&D=>~gSYxcGRx+&O3h73y`b0V z0OrkFZdJNX4(t8}(O7+grc}17BXKkx;aswbrd z*)gu(0g}$2hz^SzV+=8ecj=+&>|Bu`a`r2{!6f0{_%Q9*ew|N&AS?9kVBiP#LFOO2;f2)Y*Mvj%o z%3ZS0)oBZGrSnYI4JVGA z`i%?!Y$FzH^_kZ3D>|odJ_Ew$JN_7e3|?-vmo~R`9xB}Z26PR*Ld&}Md9izoH>D*I zVw)Suvg7iZ_^m}S?@zL;c-D9&|n#g_bXETCGc(CKd$uUXgQpqlbk}8y{3Y?)He6i}Eb;FMv zoNVBgR-R4%U~S$zwS34;+qZINP9ic+mW!Hv=`%RCRC(YG@&(5L%~FbyhYq99FSRHZyU~y=uBgz&E7`6-dArPdg*MV3lhU$})6>sADT|i| z2wm>?q`i-;l(GoFpairhJs^p00DXsJjsu|M*VXs7%0u!-up-O7bllN zdf&X$s`;3R1;@|SJew8a=@$$}XhfrO#f$uL92tiqJ2M$^e8`>ouhk&mFB&3)-Jdb3 zGB0MVxU4awly@^&cWj2JgMT^AU*LYdla*P9;?X8;{{pzGf*lZ`?E3o2i~F>6t65YH zD~CHc?CZvd8D<^kWt(M_otiVPN)8;@<>)0&lo{NYQu)2iW_R4NfNoe~e}7-G&bG3* z7fRe?E=1lQjruVLGY}vEwnOx7$e|t(JQC@5zS5wq=Qb@V7zIqNfy@y3-b0;0nWm3z zmNXe-&Cm53G+lKj*P1h@tvCWSj4wta z_x((nUKQM4Bvy+p-q|}s2>WGbe%>I+O79)q81WRKn;%vAFOzV+S-413PRe{oYla1K z8ByseT1uMrd6PAPjxYYyscm)`Q`iZ1KG^UinWi#$E@;(?_Ei^c93%!EKHqef6@5bq zocav&uluSZpUjx%ylUU%bI^mx@^(H;@u--)9AMphzsR+y z9MujoIL8#IAyo9d+V(kX4gR2Rp2uO>8%@19LkU;r1fOkZ+XKJL!xV3;^;Y*qqEBSZ zp4@jSt6MJbM@>{k+euOv8X?gR87%X;W+)t?i{=x%>Cq;ar0dUzZE@^^L=|+3>Wk*u zX%k#m3j1`Ewaq)c-}DhR(U-NbpB@gj)x+lss7S zT3w%uu2Av;9?=378_c}txI)rosnX>C9i9}CRC;0`ewfC1$c$8q&tQf(*u{H})&(aQ z>e^P-LIMiPmXqaHlJF91>}ll3*H8rnxhvzaz;FkurOQ7gds<|~8PW1yUktJL{LOj6 zr`KAT$Rr|18iMi9tGA!fSKJXC(30KI@RFff{gkXFC}+~v&h^#Kx<|1aw`Uza;X6Rv z99JE)nvI#&_4Xk!ZeUle;-b2YgGrxHZAAW1fgMN6$r$GSWlnT=`Fr39hMCMK%`O~{ z43zp5MEcikG?{7ri^u}2BED@d1|18Ajl9N-9Dl7F?nVJ737o{t94^BDW9+QL+U&Zm zO>lR2cXx_wkpeC5E~U6T!QI^{#oFRfTmr@2-Q6v?g`ao7-?y*-a3AL+dDfG;)*55p zW7@3G{5dkf`DL%>`ELj8ag&66D|W0*@YtthZ37>LEXu#g@^*B%FwenX+GXMcjZ*uy zu52EOxpteNwnx#U*7kMmbGU?qUyvG#TS&|N8F4FcSw|$Z9l}k|e4VagzHSeFLX_nfKpCkB4u!}L+{31B*=Fnk zd#~hKV8ucMG;2T@6=PID>i0wB!^`PN3u>$$+OL_=*bJtCe#p%1?4RqYj|I&I$pc}v zi^$RWa@v?-%LnuEN`w4~cHVGxKdJ*mab&F2QWvRerKb^+#XdVyNc1)99aYn*_FDqv zZ}=1NXn}+FUQs9tci39gE7wpF3UJ}Y zy7~&6I)P~(MgV)0ULAPeY4YV9iqkZkoc-iNncOmV(5gg3b zNlHRi)PF7^(a9D9YdOo=lzQ^k5q^j#00u{vDkR>76l2i(o4EN)Xzd0kEh~fj30bAL z_i9GD5JR~sS#k*O^jh2KDN|#|G6a{Pd!UtXs#i$q9?nVMQ|^^ z0)^n_b08`ilAH*6seCGQM1souio+5deN2(U6IeZx2Y45%CMHAidN`v1DR*UP_r8zK ze?__0!M%A$R0+!1>u58S;*l+e2iS9?^QZSt*jKiV)ZfmCfgY^Z!ypmfj% zR|7B$2N~%AsBflPDKs8<^}{a!yKBlt2RQ*ZIFaadq{L59hjI%>zGoc7*g8d=Y-%(E zxSvY5V&@e{M&mlVLX)fimqTPhK^)3}Ab&%pB?hN*NGjxiWRTr{-zL*XTD{$1{RK@O zc*X;k6dtPYK}e4NOW#O8NM9pT!m8d+eUigTPOo?Ak|X?<=?PHd_YGzWx~%`3}>6Fq4}ZKRK54md*!xiKT?HU3T?trT}tt^aX`j7GQJ5Sf>i9 zV6x;3%dci7{?eEfKCSb?mXre`_xVYGHd0?fx+wkhAHred>yy{X!q1l|_KlzZ@1#Td z`yt47&iH?Dn|~M|O<>WHfj5QUu_<2Mgs}Vy zE3pl+1Pj|-wzyu2m3OhHKjrv-c70I4gB(ddp+nY;IbiyuD;+ zY@)n@@!R)ii<~%h#ZWS4#R6mZq`wd>37T**&Y#TSd`lK}eSo!#5W))v$p9VpL^sdQR9Ts4i@Z09 zc$R9<@^~aW^Z2u^y+MJY<-c({Cb_JXv~AU2jnijL5xI%={)8DYhc%|g@e(x*y80ky zxlF98tQ7A-iD_T+*u}{z6T5a8k$!6twDDjW57Q8qJ%Gd30&Ak=7R%$?D=^K|oYi`(P}+knu_=GuN<+kqnc%2^m)E^G zsv_;)*ZU$JJ07)oJM_L%uq;1=OWb#z;F(xn39YR9>#3YAxiKe9`Zf^1@zwp`*G=hxGCpWe|2{S>LOSrq5&Di7K9Ol}G{b}OX8aCMK= zxZodUKksK6S-yg3=SEKCy?*oCZ1`w?3!TaKg74z+VI{QPu{**W1Ug-I3wuz)%(l`} zq387Cul^aoJ#5IufZFv6FN(-ni5*1IeHkG0d$*XbZhBLWTk7#OP$PVraN@$JI`b4} zxvadr{4H6DeMv$Wi_1aVoH!vz?-oVtmy<1~i)tkGZo7g5O2-hNG8?Aqaky)lP5r%o zeR#bsDQE*%fjJu+|1wOIh3{4*Fr|oBdpJHmac}a}2W~e8=8)rt1_f?`?RyBU2nS(T z`*)IRLw8Iu|GSNy>w|W5NAWZHid=1K-}8MM*`>O{JNf>`%2BP3iY7R^Qd~uxz+`DD zgW#xW$~JReiWnRmOB=6>@AC4`2Jh`9%oalI)E{XaH`?`V5w~Ji=I0wt-|rm)=Q-9D zJsSQMvMLoKBw1s-e#WjN#V+`09_`pt9vl?TdLmwQ4xzuk!puH=>f=|Y&$G?+RJ_Y_ zZoB|kruYv`O%p0H#}4S@K__9ncY7w;lLqjWsb_8#bMl;ZQHM-4u(HM)w0kX)`t93S zcU!Lqe1JIgv64!qJDT}q=S}{QumAGio2ZaY_dQ`P&fejqeS9(ig~Gbkguz~ihNAGx<7X*7;}8yCLt+kL-< ztm>5g#3Cqqq8S&a<8GDw6GFy?Ii2D9Dp|5a&P|x)RT=`fOPBdA6Wu;{kYA&|vRJv; zL18Ur16p?==mmifCLn3`f_hh|Q-8Eb{-IB7^y1JuCE#J4evp*@=9fBX5( zH)#xvwkDp$mGrX&Sb0O-s{Q^uH5>9~4W$Fdp4H3SXSwpf{(&^VXt>)h^3(Th=}=Cb zy~=By7>s>@l~0jcKN}Mw74@VSyWZE{29EpVtot1o>db#)vM@D@^wOeOvT2n%2*mtw zlw?6MO#%G{anHBrs1(r|E;}r?E-r0lZ(hBIKQO_bmrC z#wWYg{lqnLnIl;PQ9i(u|I#5`QLGK6-!;okO>R2(()g^G^GuivRU^nzWCTT+fzE*0 z3HXFYjMeftLN5Q%GTgz;kl=F0c7B^h{F%+c%K~Tqf_*!(=UtCjGSTI|`J$+2Dq= zkN~S7F8|aOa0-Ja>T03uf*0YW8=XGnop27YM37H`)odQXds~mZXtD}0OlA=OsviCc zpPN=HVyEU(5hD#XFGxAbSLqg{!S9yYjEYoVC5oU;0L%Jw zcFNV9t8oG_;L4123HeWrBKn9yw>f62N#o^AI@PpEOUtvwha}s7mhAv*R;j`AMTT6|hm+32>{`V{tn*&#u%KAOT-!LjB ziH-_o7t{c!J-j<5IMhta{$&&MIJ_h^c28oxH{-s<LZ`O`Il0x?drwS?K#P z#u+T!=#5V;D{)u$^Qn|E*U{#oHj>WqymDusPe}N; zM&3Nhs+wO-S7&gx#CXl6Jt7 zP1jYp6zi6K?lhe6QnxYuuNGi8cyw8%Yj6Z}O0Ag9WC+v#D7GsC8jRQ4Jv$dT5U0X9 zhKtc^u^6!x`BL&NMWftd5`7NSdEWqSZaAK{GCd%!l!Qj(@%MaVQt{k3b2g&5bjMY( zxo3a2SKE?>Z^rKoG?+v+0o57JdVtw*fR@h)*!6TT*~gzz)?WKgJ2>{GqqLLPc;03|ROm-ZU@mQ2Fr)^#e>? zUR6Y1m`Kwa0w>R5j~Y-QUQ1Lb&HbuVTa2RM!}G1ziBdwB+WD3`u?th2+Xu9S7|z7# z`|w|B#w7v21jYJlT7najer!OotA&~&{f0}Bxj4dIiaK3b#H#y9Q9Wt0=^!2$8M_A#MW;GnEz3?myKEc+fV)n|7Cj}5cdCZTdpPU#fp^d zOt<~Q-H9Y;M$tsA-p@(GfW@7Kxs;DUvq7yn2phP=Z~$*07{Ta--DN4}LVKBo&e?PE z(bic&YkX+iu-XS}{H^!d>5fIqY|f8FxwsznBx#PzZ{fw>XIRB`N%krhc-Qx|El&i3 z3uzJJk|d&aBFvNiY>T55N0n$3((4WI=cd_&r9o!OzzK=`2p=%~*J1u@&|{MU=m-Dy zT14W!)Fn#o$FyfAF9sUm*)suZJa2YP(xk;qc|46j?AwA;KtNO3H z5xo9i)TbGq$x2rp3cbM`0tD$moLJpeHXZjvGu|?#TgG9V-Q<;;_xox7yV)9G@RpLN zNak*7^5L=RZSSxC8Ki1sbQZ9WO*upYmhB}nebhoaikTb0*|DG1YhCya{J%W4hGPcj zY-jsszlKvB9A-mZGHt62W8O3QrLTLLS?C6gAjC6g43Q1AU0=@n#ke9KF{1_-BC+Ru zo~yHo4w4JMH6)!bGWQ6jQ+|ffcWuMDyCjSkDZcXyp_*kMFUp)47S8)woH}$9Zv;{P zW`8x`L4)3}loNI-_8?t6)_C{;24$8Q9K6mx-0n(q`N~56H)8xvG{A3+&8uRi=ll}_ zfAXm>&)K0ulZoi<22+@&X9z!(_G2ZZ8P&>7`woU=xC^z4)giANliE}`8p(P4NmW~W zIBeXH8gkk7U+H|yklEz|!La;u`YP~ViRd62>_I@GnE<+p^9WuyG3;I?w%WkZ=A? zsrZ)=jD)LmaXPZ_CR4uWOhDESfnYq^58Rf69P8&r6bo*#8A4Yhy_v}gpp>Lb1#V;I19uH_g@j8 zW0f-yasPgn?z29Pg|oZ}isCfhHK=+QNuv4m@5GSS196}V%v-e4S%$wDM6sNImXHvi z`xrEBpv6}HoTG5J(dk0g`I2+uJmf!NLbF^uV$)p&hmoU(zIx|j7b|7Qh7ZU=lgH^) z5)X6>q}S{nO^wMCDZ;$A$r`LND&=>P1wyWG#lOjPeH}TT!p~HEYRKpibxgABZ1O^NWf2#DFAkB3JUJF@xrnX4KzIs>b&^j>M zpwr*f@S4M|zX%3HdQz>aG}iMq3QtmAiJwNLVagP|l$~nLrtDs>-+YBSAG({i$2i1N z2TCQ?Dk@N}8+ zI|yca^?5N-V}g`B>?1Asb(bz9#Z+|o!@4>wUN~N#9Q<}Xo3@)U9J_n^a2t>5?bK{e zt;C{#jN_^heO^^cjE2qKrDTM%OIYIjUM196K3AJ$?mOm)A|XaorkVvibaA4@bQPnI zzJU`?Wle%z59D;IyiX7_H&TK?NcbPugxAYZIz;#3vkUy94{yJ0Hi~=k475+nnEb1U z(+9y(Fa5^HrnySq`iZraXxayti0S65j+07L?%1EQx_9R01rsP97|)rYy9M?By$LSF zuNxk!6LRB#UPs?XZK2(!r030uWKx+3n6g=XuKFU?w=dVLQY}%Dh~M8CgJk^VUFqg9 zz}NS7wpI&jO8JxqwNUDJ>F{Sz+`2?j4)ox4vn|PGNcqB+IM5l!VRfKlKJRXrOvC`*NCsOEDzm8q`D7384%t2ny;lh? ztBRk<1dIYXILS#>^@1ir?1>SLo$DFF=S_pBwn4;erxGajHm)T6L&SFq%JUwEx3TdCT z7ufW~)1eMp6Ur2oZg+nfW?2hFXL}ji?!cao#2?C@#*F=E9h2C|*qN|_K4~{)se`h5 zg!$~S;3Dw=fT9s|@p-iJjgB!#48G3R&dtl=g#P6Q!7CoY^(bWC0p-3GzcF)TV*zpT zF3?h6nxK+(RmwhxDMWTF6c>A%AZ>H<%*24bW=d{(0*mRr3*~xD*rdPIG;Ez!Y_=pd z7!y=++^3x68hRR&8=Lgjf^tju%T0U6vO{#}5Ldx6j|7 zJ&XFBKlAFpKC34cze8I86sJ>hlwE}zKvVIM_SZ(<jG* zQ&uf+=iX%Ol>U0rMev@&DAb%lfNG?Izk9|(hE!m$Si%+6eF-@GeCnjpjP9(dNRX-WFOw%-~~8`Mzr9j z>@5JpM6Ud{XSK8K3D)H-o)A)FdPD3CJ59s3g`)LQr_NK6W@>bC0_&`FNX^?#(;oZ&JU+8j@`mW?%3#5){RLO zd#hq(-cHS9D*0h`d92>bRg>dPKm@@@j)6@!7_Jm;N2ttvvcwB3}QFA0cFi zt1EWz+;xV+*)CL_LFSt}8;o9_aeh2ODjcOwmVJ8q1RRWfC)y6mZtr*`H4+^vnMu^>BZ_ne}=>(KP^aCSvcnMiSZL+ag*EZ)=NL zl(Wyy$p+*XgnT4Hlx{|5)XB#DkudpgqDXSkCXBFQDiC-&VgKmDNGRB?CUXl7Hr}mr z0>luES~+y3y9NKqs(zwl@m2my0KRWIp=R-8qS{q`$qKMx&3pAcdexpQ{>ilLaxI%- zzka#+v7OSZba08Y7)Awo4x8>j5mI_6soFEoxHx|^7;{2*5~1L@0hfkLd#r!A=kHL@ zcH$=VgH+r1G#@T=@*~VMEJnXF!lHABOe9hyExY5_sBOMT%1|rKkCaeP+eYFt!0<1r zem~4c4dIoeN(E5)23^4H>d?W3W>sm8(lA>98q5EMS z6Sj%=RaND~lc1>!(K^|bkq6Ys9hWcpo_d1(I>%=*sXZ=@SM0hBQbne5amE}#vgocI zsI2UO1NHnqW`Fg>}ne%Cmq>u|F zJx;j{N{q71lu8Sr*EC?&Oz+#?^U7aXZu_qmAgfJ8#AzdSBb(guf~GGp(})E$((VEp zyI_bx^2E0XfUS7(p5*bjXYzt1Ka1A z92=NR7HRwjQL%E#g7Yw4+AQ&jWuPdiA4fpE!ZN=kv&T6Tb@ycc9*V^}%(l9rWps*f zD-qAWvW+CjeI_p&ZB|bJQeRa5%6Y9#y346U#?+O*#fvJKCzO7kGcQ}*e@>6vv22f; z*`?#hCTWM72|)c zGkP%EgYBXvOd%3M@3eTY4t<5fI9$p?10@S}!%_*DN16({4Jo&Rp_-9|GSMCU_=R$- z1uhT=E-Ia1bNB72u$gU|Br2x~=FPRw{NcRdydN*Yu3Hq2MEK0g z?m(wK56l{ahPk&WmRJMBzV7q$5Xv3LP03O%sg(0qEGXaBVGGtGx9k!-uUuGJT*I?yMvj~@sntXr%q&>MtNPLOJYi4# zqw{;E(b^4`JYGDp>n6h!_LuEPLlScDDb`&Mo7-nFH%UI#yQC(nVM4GQ7d-lHi79Tq zv?y@GFz|<))wRd3fe3p-r(nvIP^1ty@KLPXne90X#huTZ+)2S9n443Pfz66n zAceIm4Dr~(@^(iNphF|{D6MhB^J}J(lp!Ao&(Zg6N#9qt-|5vigI* z$XN#k07obTr#md4G_=hP8;4wV*;&-@iBw z1MHnb?rs5{u17r&VAZN_wiA!d^>a*B-O9s1`ZdxeQ`Mw_DY2BWimlNfp`4Jp5KGh9 zzf@qCEOvD2XRq;l_xv?5R@^Op#N8IXj)~DGcFR`$kx`D!)@cl>X<~h5DGhFwR z6Mi$!JeS@40n?@?6t=>cFlBTrOS{n>{2f*^_>ochvd9?$%rqCOJsd6 zR)?W5S)+VRTZJ~6Kct(E%Ou7$fX-T6mym2+lg+=_1Bf}MgPVWf38jXQnip==Q39>s zCbc#{5^Tg!7`pMD``p-^Zks}QI@p`G)N5GBHK-AS9KZMwrw>DeI|0(>?zg{0lSvy@ zpwms6UEv*5mOff0-^8h5P-Gs>a$cHHzbSwc&R?c3<%h1Z8}AeobC!eg6lf z;)y*itSc|P-ROHlF4Ym*^z#L6<#?TxT0K8H*Rq=h;hCWeb%v}6ul@|O!-C_+IiQtr zcHeb{<0ai){Yf0oA~5~%t&XlToist;yaD`a-!0*;I$W<+U$1BSw&*`gAycBX@hi;i zP?GYjVj-}YKe!NY{Ctf*ue81UD$8%Nd34sZC*`VkXHg;#7XSLbpg4%T2RCazA zfBzU*bY47D%u9%z@XNq}%HA0cYX}3L)y|-Qn6@jG6^qD3VcQ7P3`;PbyJV4e@fYv) zS8#xQQflt>Vqd0k0iYAuSM*R&00A^rtc9v@#O41)l5Bbw9Ll6V z^#|%O5!Y?qU`@s9h^aWKY={gK7p#=1Ga&jttx5Ldq~3;X$;oMLhU6B44!4eks4t!!EbSMC?tugqk6XmZ60n~ z9Q$mIn@JHGpq3bEMT!;98oQ7;i|qpMN6T`5idaRsnadl*23j2AU|rW?x*}O(GXF5f zA_``q-v3g3k9(5XI(?~YEe};}`!$|NZ0JMvJ1i`{Y+rVXcn<~!ywdv}M6X;vBjo>; zTj+)t4;c#z>C|A!M^;;eixX4HW+YA|xcsWB6&Z-a=1dZyiQmnC#^Y^MdbaOmCfr09 zB3nPQ)Ejl8h5ZvPS%mctM`!_~S$^vq(ACrPKCVG2UKQQu=s`YzTMfn5Q3v$cT3{To zkN|R8hY^1~H6^*|uu*UxQKwMCuoDNZoj??Po$ve39?wVi;a@X2kl^8K1qqvfV8;+v zg@+kk;KhBWb7?5@WlqBVkwfg6@FFNNKm z-nx9F_iY^do42S@vPKho4KB>l^41vH=%qG=P=MHsS}-nUBF8yQ6o$ zRTbe`M)zs(4ht7nVkm1M>*Wh;{I;rNMz>eVNu$G;p4h+V;*AHM#xwjiC*kpb&vTB} zbI(>F8Q!KFajq}x;`N=j3ByO?Wa&tdKfjq;j~0pUs_r}QO11>V?gQGNFA8F4_JuMf zjZ~AED!VmXCa{EP0~0N*L|(Ahu@P^Ph!6=yy<}+(6Dwe_&1AG+e9bv+mvE+U0q2y| z$cN#VtB5eM=jOvItqJ!q1RI@j1+PM{ADNI4{k%vHAK8_)Nrh+u9l5wozab;*EKixybJXbresM%o z%G#LioEsi5Q3;JCn1{W1o-SV9cpv25Hwiib+kAl9f|@5MZ3h^_{I6SY&%-Gh2A5j{ z0gom16al-x>+_q>?syh9E(dr7R-NXuNFZ)Yy1`{{ZcABdi-S&lcCC;mYxHeZf`SH{ z)WwIc>Iq`(Js%eLtlt5(Cr*oAYkSt3J@vyw9lyJtPO3k+YBcZH)z53c?;e^n!}n!+ z8-!n$Kc9iFFsvO&@gQFF{Ui}x#*QMcGi<;m5@5?yg)-iv-%f)yT7XRXzD1`>8vXIu5Y&ACgvx*=Q0 zzr7I!iPh7ezszK*Uc{_ao8}-yW7hxN zHj1~~j2LEsoKMEI+nt{)2|An)Hmba5!gGN4rMJLVuyPnewNU*t8b){cJus*!P|C)R0v+p6Bpe%olj;W7=n@9Xp?Mp~$| zthC;O*gkQoiTFuV{N9=Z-TlB1X92#w&KALkGm|Vdo!^lo=C_xV1mE6!Y#kwZ?EG43 z+M4p^H>atEY*oHuY}DYXuGaZ$M$~~W3-3Y4>m(c?@T+wvSUf?0dTNSPiqBaijUYy$ zZBj4XBS<-)xh0$BFtV8K0!C+aWXB^Qf^(Fu+-5qFxu?_?%=xiogz`FP#7l`+j)=aO zBg$kgsd3BMg{$j{`~>wX=7gfV40P@La(JxYJ#T97LyrU^6Rza#q7md2=eCn{WeIyg zj9x{TXX-lmEk^r;dQ>TlsgX_@IXw;N3}t?2s`N;xSN`IOY=Far zQk~sWj4-ymQOwG7@`AhJ&F!rr6C^6wWc-3EDhd9{%&Juu- z5aZ7CIgV!sTYC5Q@B%dv&r%d8_i8-Lq#AF@u3IiCd$ktsG?}g~Z=a!o_GcrtpQH>g zWrGLFP1tfZyEsl*@rk^DQOT1SJg`WZc9_yT9`YUh-i{HRwu}q@`saxhd0Ls9Gmr4` z;@C@t>M}{tlaUXJQZlMM5P*ODV5IVfP5yYd2*WghJS?MV{7T>{-0P5d568IiBW>A& zzt=nzSNl0eINNzrWC?~z+f?fWdAW{rTGa*`9v2zzQbhdW%n|s!D?bwdQH<-tYf#yO z{(n-NDQmk3bv8RLfN!plmxG*6mma(f@!RzJb+08ZmW+bo1_wE&dsASs!EB)?D8={!DFenFV@zCsk9`&65)q=rz9p z79$qiQZG$!TNuDZalOQ!NI^QzQp_sM|2ryfi_NK@2-tM0x?phqSRHT#V)wg>$$u;S zG<@!aA`4d~0W(2>u!;Y{!uS2mvDKv_^ zm*W{G6kM1KrT8q-d+pZDy6tLeATy{CsCvhUxkmeu>ean1D8^wqtom)g`k`+uVJCl` zmprP@YuKj0)Qxze#;+iwjCEdBVP9U%!Zc`XT^LzWfXuAaRbro0m{9 zwTE+$*DY!c*Bx_Op!^!qBKKQjOtI*(%hO*FT1w3wjh4D z$PUPw`mYvX4lW9DUJda4^%_vk^NaIeiR*oAUu~B#V=Me*Jz&Wa1lp112-vdD z&UR5U6sY!_kRGmW=G0t`oBy01?o?6@6_nT*3THyPOOs@fXU@Ud-3x;?w9Y_Fm}*!G zEd^o4!Ho&Tq*lPBUki5>V!T8RfC{WxAkz=Lcsb|tJNMPzvR+sZA3$J*wMVI4vXL&E zL0+J?&n9^0HDMa9Q6E$b*u+cP8vf8Ttn``I`+M2|Ty`ji&Lr&vHt%aTA2ZBIag6ac zq2@%NPsMX0#9dEHRf<$p@D0fXWguY=!_@iI`X+RHx*Vk8= zcZzLczE(#5(_#rj#eVVje|u#k*}fY;O=mP3-nNymzrDV_UX^h8Y%y&hwL7KTmnp~- z$ESon;A!7{hXA{apG3DUp0vghbtfTNY|;U&p* zi?xfk#Eqee(!j*sjZb&6LD3UXC&xvo0G+a~XkNw8gxbeJVOTSi`JF-J0{MD&Jg2^k zVoqQw+Ha)FucrIIDpJ2`!r`A#d8sLXosIWE=VE zXY6+g?LVxHOr(;lfhnPc$?&1nzXK-oq0-FAxUsIJF{lz$Uj_$)Tk5B}trk-qNTjFD z*_RWlSf7qGI^@B*6-$`Y7pJGE>wj!!iZoG9BYKnXo(q2zNB?)l7tMn*I!-N7syd&R z?~R|{?VmJ1=_ozEROo*~ zU*`Tj7(rZs%kVY-z`3lydpu9rm%a6nn*Y08p|i^V8rcCc_SL_3tvoB|*B}AVqo`|D z+j(n~vFjM0XRgPx5-4TFGU2*C@Wn(@P+sfuFH1IyZ6%Po!4r$$o~wkWlgbgfT@Sh(81?)cB2#2+LQ?)9sf3*f?!|xaV4?2g^7YCy|~xb zuG)*HS0+T02QzvNo+kWm5H?6)p4MTl^){xTr`x!_0jEMz&HrDk5giJJ)aS6U@*UUA zc)J3=-RFROw@{29?D@R`-7N2JSY44S`-mE*3T~pl36Jt&{J@q~7&%w@L~OA9Qeb*R zt3=W>(oo-=c(Zclp?1)~+&4r8Q!Z(sbAijb#nnB~}S3Y9gayiMJd_b~tAmV{5Kgvz&)~G6tf{$@i+8 zkqUS)RtJkD9HulcF0h0Jq8J%#`h~B%aF{GNly$QhjyomUK1~BZ{bDQ8iXdj1GkY*p zhE>Lu&|5Jb@+Sj-?$f6R4m<{*_d3`#KM)k<_ObX*hB7PEK}!6iW(72Q7H6*o|Tt6a)-7PRt1W(wk{YS6wJXf zrHe0^5Xc5rn3t+mTTi93fgzgi?1!RxCS-csItdeS=wSf)(*(F*zdoFll2?30Upcc9 z!7IJ|^nG$fvo$TkG@paknRXE1veM8$tf*RV|Brp?F$Ij{Sg&aEwS9`gf8;UJq{zo_T|Nx<1+Jq(J^a z$+d=3E;+^vZbuRzNG1{y5)%Fi z>fyQQ?n=y$E)=4d&7zihPrEZO2*n6VG_4be3fov6jmQmE8kdYtb+wciqGHbZWL1Xs zl|+o-$dJ{4g{P~jS|>&oc;NZ4b@3Ma(G#6gHThzjKY(i?eq2NS2-L(@XCwr}32W1% zLCwunv_4YUNS1^U1cQNHCDY;ZQENPS1nCP$6h$`tE?wL=RawE~#E`@-w#_g?dT)zh z1Xta3DKX>Nf5IrN=PUKKNk3&uB>b_4E?51n^6x~HKQ)0LUTo#3nqzx}@i zpocz+&x&Iy>3A`+PH73HrSvY2p@OV7&r*z{@Mf)Cz0A@L%$C)wD%z`piFh4DDA!|z z*YiS0c_&~@z41jpq;c&-BwimzOCD>)`%|dS$LHIJ^9xA$hUf$D{Il}mnA>L3kGSV& z7`J7iQ)cd>k97zqO+reTE~)iCOV~|>r4>FL5uqESNO5CFQQxDgLgBt|NYn;M_Ugg9 z^&h)1{meN-#$CaZsTdz16_)W`{+ryl)Df?Sd#%^IPGDc>*;_Bgy|4}IIB>qUCLqe< z98CSqR#Y;YZtmZ6xe2q*rs0Lp0@Z52_`yBs?X}^b+!oM*ON-^KzKsLH2(xgW3Xe{! zAeIDadJ`z@6Ku(B2PkYuag)BVIbhgN2KMDSnE&o7WnC9SmxLp%g zU$Q?fY6?BKD?r$9M3MFN43A4jqV|$!Ld5kTP1|TFhg&8bDN<1$2pyZRk@a4dyJj1p zwC}E~L69d^qkl4J^8LU=#^YA?ACnI)gV0v?k8_l9qzFKmpq^{rl2j_+k-BE5M#`gf zSveCUCrt;^R_EAImRD^2Sv3 z&(qcNqV(#M2R}cojh!5E{tT=Rx`!{7M+=~CS*l(-aZ$hdDQ|$DZ8O~yVP&$n@)dQ8 zwpYo&1)~f3q+Nbr>O5~1>!`Sj9fQt5x@nrad(vf3hq8ZCNDga+zm^DUEjC{87g1N; z(phdaRC^iY5?|;K$IES*Zl2=c{{#ARGL~6V_HkiW(X2 zW{U5MbLtEczRTbdH+1c1{-#SZJZFN9ovJYX0C5SbUC9R3Fk0hZCNLXy{-)M|v3Z$P znh&zbm(mh1(YSOb$p+{RX*_R)*y#_gUv2_fPY!7NS#Gv4u_3`rt5@G8gaQhAW*f8( zEXA@$HR<)zqXWPx1*_Ub0#gBcZa*~TkN-3NX}6(Ec>O9qzP!5g$v?x;W2u25&utp$ zy4M-Kyqqrk<3|~Ug*?DqAYJC~4p<#4o0io<&s8{27>2)IhxQ}95)KqLUo$&fa`JQL zysXG*weiMO)Z5GBT=V67H|j#%+9L7Zq^*Fd{`ck`iAOaR54unjU3g0~_c0A=YQ{7c zJr%S~^#IhRfP`*RCnepJHx<{A;?EY|aF<^JxxIlbz#UJ~er*H10VMFYv8>|jx(4#4 z4iMMG<3m^e-m6awN-T8W5O zg#uGplq{HV0_AYGgY$CcI2U6c;wA%SDAFm*Kjs5nkA`sL0#_cehP(r*z#`eIO^U5tPqTr{{Rbsc|GCUrZ-*a=o;6DRYEJ#;^Eo~*}0r+d}e?C{p9H}KN2Cj?! z-U>Oo5pWxlk?vZWAuTa^gkv?F1gJ=MF@H~mi$rKgvoy){NmCpB(i(c1#=W)up1T*) zwwM4eNgcWpg-_2RMN{}A|Lfe&F_ z(a2XES?{lxJCqV6Ll8{izoh3TqnhmTc0)h1oCy!R+Z(m!F|qez+(+0$+g}JMxa6C2 z^)k$pZuWqX6i)(DJhQ7)tIMwLL2O$}ho-1s56Lo8h(=~=Z5sBj3a48mIE^X>%vUmiFB$Od{IbJM=Uk5m&A-& zM^q!7Y$id(l-L3;pP8_cRfkU~F%}4DvhI-C) z!1PzDsDL#}Yz!&lq$P8O3q~VoT1n0O60<3JCPi(vbHjNf(ojKLF)9QCfjFFFi++Vp zIgHWz|DVE}jzq^@L$x8~9YOVbez~4_Tlx5&Nq503AV4vZ)*jt-#)jSb^DkbGpb7DN zn`Tf&`xRS0mkcaX{CmW(We&wG5hW0J&|V6-AeueU^ma)rb{j%+2^0{Gjd-f_Qf%58 z>gsk-L5CKGK~M{98*&k2=lB(dEctWl0HE*Rx=P(7hy-Q%fmZnOaV4J9q6JEY77>tz zi1=9ufJjKenP5GMg&(&fe{G-Kg6E|(&UVXV41vyVKW4P^wSsAM+z6&)%Wd9$)CtZMeYDic5Pu;V)}idL^i@>`W* zn@6tax_29M^1TERv#>MOjD9BvdFigZ z;KC(=x5@t$lOn4RaDRYdF7bg3NmM2QlxtS{bOF&%C_tlGlrnLFnE)8C5WmC=OvK(_ zvQl@-Yhb4`Nl|8uI9|f^OaA#$0Y`>CSQz%W&CBi#y{FGPJr@KUPqWmwm}Fdd--c#bLido z-u>wdzW&uepLW`*|5YsX9VUO4rDYV1SRbKeB&RE@e5KUjS{L*~TZZB^3DsxzK*5BW zeNR5d!;oo6AK`O}T@Fh=moo*4ahd8#1Sb+)Qj%ywBcqS;y##q4f7=Os?!t%gKbPHs zi|*Qhr@}UDLNoGCEBZMxP$WlLsX}B(9n?$e?v_766KOW7iiC!cHTp#+1pvv@kbbD) zA_bW&#DJkSmNBjvMWA5Xt{6|q8~Xw&Bj@Ttq+xNpzbW(~Tjj89h@BuZLN-vs;ws9b zo{N~gR1M&yRu`Z8`xoKtS1m>>57B@A%j>Xy%T@%bGB+2@5FwoC#fW{Kw^Q!0uy3^x4-@Uv%mAbpPcurUtIXRHLH*L z568(Zv(4H^GljKo}J&E**CW@{AoCMHYz8oR9vVU)=Ii$P0M# zlf9OdPtihbyV+^rq+_1;(OTGv=N&c|AA9R*IOz!1!r9ZGu74WceFYR~#oe?+!D>QY zCJGLh-<&KsG^*?>2xO$*2gkIPqvtp)|!Hfm@cMHWhMt?;v%GEz8kt zEiB72At8Suds*q*wvE2NzNfcs>+Uv*lk7|G`Xp0n5~_35DN9o?e8(}*|JV;+{DS|u z_rzkFTHQoCoj9dgi9Y>`ElYCmp(M;ia$nWTFL*w%1>PS zY<&FE`&s_k_{636F@Fi4y!2k<7q^U6pSbj%eR0gEuDIvePhWAjAoj?e-}Nkf z`nPu;Bly%6cNtgw#EQ@S_RdC7DXSs>XRf&87y)(K%N;JRGQQFum)|!|;`asfjK1wx z+*K-5ax3jD_o5WO?5;JRy8P~8a1Y}LvEt(w-%}lz+`HoA&%%A>IC0Ck`2H0i7hLkd zijQCNz{-zb!oFO>ijQCVkijP|d3eyJ|L9L#{P2oT{OaLVAN%=`SpBhIJhJK&KYLhk z?8kok$gv+Q`B#4YXAeo4-^hy`9ysRH7d?2=Cx7wKaUc8XL(4z%tA`K%=r12y`N@m! zKkl=?zURbG{`lULKm3igXMExt>(BYp_nx}?jtAGC_suWg@!aPf|1a&$*&|#xG^=wr za!?3u4&wrjIcgt}Xqd=Il8Ra3xm@Xagl}MT+gwR}R3H}+Bsn1gmn9@5C_=+0ESqQT zBt^wM2wm7bOHWBzu6*Tp@wuSK0J-C_UBEB?_$0pde>dO{H{XlLwsm7?-oq{uPOtLN zqg>?WckoHHP^3SC)s5LDTlCGWD~1D)vI8PEhPV>;N-J-sz_PKc=wlNhzXNc1*1_Sn zk41hDI*L8Wa<{=@n-8Y$$9JUgzE`{u?|c19EGYi~&NVk~#C3N(fI=#ZUQT8@33)r; zOcW{zR;nt2_d|&erBLY}mHnf2q&aM3hHYLjXEt(~k^uAThV+_bx{&*3Tz+v9!tcS0 z-N5)$JUS7wcU|cLAnEts?z%m4YfXAXUt?T2A^qVD`i3`Hv;Y3zPe10P|NHrq-~6FV zkNUee{bg6%q1Qg5JHEN2{gAh~a}ImyeOAYDkGC#f^?2*jm780Zu6(?8+0k3tmL0vW zZP{{hA8lQ_d`s)HzG5@M9Ez4F9 zx~j;G6fqcry;j#@$qYOi;p*QDqV>eeJfo_-#0Av zOML8Brb~H=-`8dS(YJl^v86I4S8Oa0yUKkK_o3z`$IAV9xOwq0o0^v#^JvSGN_P#z zYZ!0bt!)Rdd7}N`HN(3Ht$w2Ypw(O3_HtL1!>ia|Rz1dkwYl}6m5;R@v~qLnvK5cD zEnD$S>$0OCZCiG7 z%qQ5=cF>Vq+Lj$v@-JI1`6=tDCt43WY9q0(RpcCel;qjccF<9q+74d6scqTv$7dY0 z{7JeS+m;@^zGd;z4`=7C*pQib^p2*5%XhadS?4FakVUs8zt5K7Oj7?X*MPv*{nJXkS1@eP4Qh|_$Voth&w$RNS>$$|g=D|LE^HL7$q!n3%#w6ujllH1@7JjxV{?&Uhrd91qFrK7RQ#olc{_zdySA>TA|L{P4qlCgUXgYNW?Z zvZjoQItr`bu<)?=e)Byio$#Iqv&X&iSNFFc^~qcGykqazGn*f=X4pG3v#@2r#||$- zma{uKAIrl>53#T7vQrHezi+pXhR9(RPth*$$U0 z!A?Tl-E{NBc)5M-qtZ|7aXUGBbSWF#bqc#wY8W@ow7s!YNjQZ8Zh<>|Y=uNz4*c60 zzeP1c&?Ubi&-7N`N4uLR`q9cQVkm_^D~;``X6$lW_$>A#?G7-l4@b3Xob|#r`1IRf zi8np(5G>`E?F=142L%L#5S1dCf#jt~C^lDRCQKbFuZRHwgwVi73KU~V)PM~2gkmPm zFX|bw?O+~}B`bLO6R;9|famLqf+E|2OFIoHo9))1HZek3;+4!Yw^u1{*3!} z6|ptUVpHhwOgoG1frZU}Sla5Ax-IHL!Vhc<7VW@BQHim=Y>KmKqZDl<{z2kryj*gx z#4RC2#_LB`-WzbT0Po*3x&<5UR`kO{Fwl+FnF2oWlI8gH>yO5);IKkb^k6D%YX3Ha=y( z<1YybN@;_!ybrRqZ}GlJoJ;_6xt!bC*||-^_j%5dPunwE12kK3+Sps!V_kMKkKj37n`4*Gu)rja2Vf_6CZU_P95ibS!@13N z8qM6I8_tz-*>d?IUG2ccH|kPPBWJ3)HQL=wf-?54N;^0l__7@EhjT5Gh{Hj$ zUKb7ZTZ`ww79d-);3|y}@`kvo9HuKTegdW`kN^M>07*naR8=BQFXct~qv=u>^%0$1 zx{}^c`*xY<3TWaadqK*9ylLL&d9Vt7SQhnT)vOfGe93Y6(3?-e8((k`7B>NDaz+zE zYC@1KZCR;{9J5;HGb}{K!5++miVuq+hR^s2n(K7i0GxzCR-k+yjLWcyWVX^p5&i5|a%@A~LISpY7*`x$)oH`n9azq=Wa3^?e^&cQCL4c(bmc-aWGn>cLhVBByX+qR*#w4HY0 zM3Th6dF$5A7Y~+c2nyTPSBW~42WeG%S3A6gX9&Jm(L&~z2?Y`2xqLaVRPI*i*M3|(%l;xnA6WZVdu zI^7(1G;$u0xDjnIdOOr(_tDt9Bh=^!EuucRv3?ezoui}0?QV-JCXk3?SNtWAL72yE zg&UU-4D*?^D1sYl1F|Z>@F0X?NVtLB1lT!r(d~qTfnpI3SN5yPOfQ_B!MUfdz`wuY zWW42hbFi$HBG^~c98WS9zgSgN;DbjSp}Z0c4Pk52u|mWN6LYa9pC}QGgayk04KB+emJIe5io``pw-q?}o>4twK@i+b%_-eWri zJ`?0EeVMRM>FmDcD-en+`(uawF7^((m2pB^5mIb}#lc;+TE#B_ z2YgdRR_4A3i$piy>&4QrAJ3VgapsAK;zO@L5&!SxMOZmYqnVkx7l$_CBZ`%Ig<_vq z@&>pJ=>an^URxG?dOh%d(*+n=cKH|&(FT)fz9gqWM9JVUt|=eu3e7vA;d3(Klc+sn zfRl_})Z_Mb{rK+1ci_8MT#xHF_2Ef-CU&6}-BA<3?QKv;m%BmWE+ULPYT1+lXdB4k zy+Cm$!(#%l4FGGG$$`iETJ_ zVH4hS>Tx_~nT?}o09#{1=lrNx$?Y)oYy9dV{t2&0ju##Xo)ERyA|c7mIdN%kIcVk+bxGw=+Yl zbdad!H=sNCV0Ew)I#$SaMu0HoaAjg4&j-6ZmBw}(=we!@9ZiV4Q|i_M>UC@CP5E7v z-zhF(^2cFuN7`kEMkuGF^6f(qCTwjcjHv<+kf_r zr{HVvc>&)2qS-icHo${7q$o=uwb2Xm7JRDUDGuUHMCP8-gZBiS9dtH)U z(j}+(W%pac0!1PcSLzY2lY&0a+`;zC3X$~3765%rkk_{VwmHH#{_rS1{(pbPr+;%J zu3F!Nr|k}Gw@Bu)i>Ntu5R#F?Hf!W6A5x)!goMCl14w$T(4q}3AtA}jVo;(TD{AB3`>Zg@ajK z?hPFT+;&+{JHAw!I$ z-xYdR;%8Y9#?OS|F6!%O<`?<2wfF@V?Psy>Hky6OtXAnV28wlwD7mkeMfnmKghnvv z7mpYPu*DV1y>!ugg$|Iw(eF6!^w}#;`c-Fc&XK!xI@P06D01i! zBKLXg1tn7qZJyGDVetW%E=@?^kOy_TyO7a_9eujDGie`6HhfYB`?ASNg^Vj< zFrHvnx0%o3D%J{J=%5JkOPu01g646C)MatN_W*SJ8Uu8Dh)26*MY{#(Uw$L5xPK%5 z!hQXPPtyyesr@Um6ySj?ui zvOPB2rbx7XKFlQO^4oUd_xG>I4!eb6X5yIZ`b9|F9B#1>g6-^JSkCdKSvF@ym)QsPvaE&D6?9p zlR$`mlqYery|0uS_~kEu*)8G8iV<3FvZ_B?ycNZK{M{D0S}u} zE!bw|u$#|fI+a2yEMR8XgA?a9;hdKrhktp^YMl9;891U1-0lTZ9Bi#LnV*vd2=NJ7 zvQ8BhU=ykGL_i2bMhHnJ_mEB`M96bXy}*?oL!c&fG$B_A@Yx0@1)xj>10(|vn!8ho zNPr}JTSahe1>XxK7xFAtaDWH8feZey9{>7-Yw*Kc9>a~zfDqS!k2oV?KGNCcNi=s_I;e>?UjaLybOPyy zC4`Itv7cQI78X0QHJr;%JCXW1QoraYE-h!pF7FatUh zORyn2o1*aqLb8f{rl8yg3Iddch}#80s1PyUOIhdw@U#b9cKc3z^EbEP>Ic_jQ`C&d ztY&mtE$DJuuwAFIIZ)_xeQs;}$SQ@bwg9bInuSUH4(rNLiDt?dw37Uph){|COhAOv zN?*cEVLk}J_AoeR7u&T*7V8xi2fDG;4l%RXgSmbemSO;h=OX;;|9d%J_nbp@Rm>9hdygZ8MRVcM~EX1?~jQWS-_o3YB0ZgrF1x?_jBI zvch*^0jd;+`B1oVNAMLzu(XDyR4KFc8~SDPHoKz*EgXn!rpWEEm=>a>6pJvn`el*u zDchMbdwyP$;m~)yqv}YNZt?QjhVk`;gNXw;sCYdyn@8OLoen^DJ;U;a~~@WPl~;4@ge(v#LGJ>v83% ztrRjGEVG2$*Nb_4^yY`%Sk>a=Utf75&O7@B_=n?KaYPPi_Q7p@kPHBATYx3cr~=9Z zbIFYW)&uhlXW%OW83eHSFJxJtPkcy!DYvgR0&T++pxVbmB!8j{hqX1qqs#%8$#d-B zq8<-(J@<2NTYvh;x8aA^+=eH*J#2L&Z0yeivf^d?5QKo|gUSF_8jeMJCkbW!0$NFY z4ksvFKo2TWIywYOu7!aLQV*a8^NqPjL<=efQ?~_d^}JLBXP^@c)BqOh0#09bFh2FR zm*Tlg6k08|kGmljcX7b}0J#rrXOUy+79aSw$R{e2_r$YTNI+9|iaS(Fsp#Q{AKtlc-MXU0PgdyaicOQ$MbFJ1dioh3-I1Dc zjNdi~o86F|l>-PnG@nR-t1W;%lrvBU02QExH(EL+%AZh$jFUiMvY4|@c3O!^FuVmq z4sgSzc9kER;nJsje2WN{YK%Ky6 zqQD(S@w?Q-Wt#%Z5&&^tCNR&qjX}IuAQCiyg>qsw}w91W@VyQJJ|D!ec z(04qgvU;P=KstfnzZ-{HE|&V;m>2BEte_XO!U4$Y-eQO9<-@j9+lbMlY;>826p&TF z__Q zttdjC2a9L9me5_q;kt~h^3e_tbCicBu5N>T7wlp$mSk<5G`|fWc>W>yGPm*HdU87! z0!aHnRsoi!02zF_GvIO6?DGgfTNbR81Nqy2k9B)oHJjBspG#i>GAP@WVbdc}e2x)m zCJ@ZeBrqFN^sq-mAo(qZCEg^`56Np}YV=W7KjV5?NVf4WxvLwW`0myC>Tmyodv}NE zPq%P;KY;5rA%ZKGJXiQ;OP{ik%>v3oU!c&HX=M!W zfMOfVa7n+FfW(`d!aQOh?D;sRbg(C)hR+Z^S=`bZ@)95DE}An3tu|OI!M+8h_L8DZ zkJ>BB1S0cY`bs$td>&OvsJFLw+d~gMbeZ@kGsK#s)^AD`c>a55EI;Nsp9)jW8IRk3 zLGJ*dEi7tl!9ZaE8LsY|I6yVQ=Ug-(Leo6Cr=>l)5K>z~Qo2m11Ql zEXQXeP(B2*Qm zG|3tNg2x9ebT!Y%IyZ%0u4186=;j&xZUS~1 z5CvsNLWsoHum~W4dHI)Vmc+9$eT8Ca(Exr}55FP1jHvvGLMBY(7`Nh!q-*jI?zTvt z5;A-)W5DzU#w!8KOMWx42mpzLg;E|sR`>Ix0uB!ISR8a=RlCMpPk$cXeEM=6J`>0? zXNzQK9`K&Z{SmwQjFfvz)*lx&g4FoL32?L-o z_>nvkG@!173A_R9TZ6$$PeopbHWvNGHSH34T9gIt?8DL#WSbux^Ossa7I!qkp{&65 zq1f-}MZg^xIhz+Xl~RnN9wLXnatPwW#3{&s&Le$O%5B}c_3oej>}N7ZWbVm(u|<$lR_#Rs;B4{n!Ap}<+RUw%L=_DQf4 zRiYFJ^zw#FK5-@8Vm^zVa$3547%UDh&uU*eUIu%yLA~y?KRn`cmHAt^&Dp}OT|th7E$$57Z~41=lb`8k#^t>qUD3b zReBf8b8QNn18i&PV~%oh+?-at`(-EK3vYWd-u?U;Sk2|4d6A1n%(Kq1-O>uYU=~@7 z*L>FY_yOC}h(Bq1Qw#`fx@It@Yc8=#4C)(E2NTb)kjnd<-bbJSqjShuz-N6z^fGF9 zF=l-cxcF~7aKW$cz%TxMC+^)bfG(#E-CW&oa0B#nr(p-lHRL!VD^zg18u2}lMo68U zq{u2WP+T_?F6BxXv?n+g1u9?+D>izF*8=24Lq@^K5|3c0e9X_ui^*piFJBf3&O&pf z44OC*X^m(don~grR+L5Zv$&E+zy`_>Mt%JajaX+#@(Sbx9?{#O6)y{dFFe& zuwqskY!=dv4M<-gEOLWV3Ud2kKAPWJq_LNSy#~ewG{C;8w3KB?TbwZ9CQN}3H6JT2 zC!d^|&ws_LRL6ohAveRawB`+Chc}%m!cN|_F5a}=%7&nysl5yfQ2q$XSE3wkoXUJA zg2bP=VgY%|5*PcSKX8~4L+=d^ex-=`KFATRmu=(6b zU*E}?q8Dk5lZ$1k1mis|!LQ&7__fbH3jcW8 z3LM@6w1j};6U@!huq^XUS*%}H#_S_BA$A79g;(8%jlC|m6?{bLT*)@Z_$(~y3B*9` zXW|Tk$wOWy9~Fq*y)v=>!M0061dH~vjL>qLvZ!YStrQ~mNte4T4ty-k**JJk8}m!K zDv+j@lf@gO6s1upxG?h^j`M zxgYlwvv|U4!$- zdpIjb;q}=36p-pS!;YJ^PFA|Ub{IP?dM8G9&mGqsFVzH0(z4x zvA_Xr0S=5ph#VAql!iwrlD)V+ii4tzXu{AkQjjR&dFXNT=;3y${AI?W?d^bHz}%>a znQL1e{;@x%dNWVl5OD%7_jNpU`ilB2w_Ph2`QwKvf1n=yPr+l z1V~8FCfVJTKP8nU^w68J!GMhoZrFf(ldHO}ZhPA)|L?@XV0 z=9!u2nerArbwy1-_Tp#i7yi>Tbp9G?eO($=j=-NoMfKQQyH3O~WfpMW$gwM6w`1+@ zhuLQk8R>NB0wlx*$L+yFZ-uBYfT&eaP$02f()O~hnRG}GmVrXNAR%%eQ&&k(P&oEJQ4iBg8Ey~V z;*66aQvnBZ#*Ws^~GUCp`U`&-&S3+8E2ZQ|ftj&Qf*QD|7~`M{?7n`7tJHsk$W&Jn|eUC=yuk z8Tk4p#X1y7!Vb|#-ncL|?FbERPKL0Nh=imZiKoS!#`8IipxBiZ>SZ;})<(gQ?wj1I zCk{zZXtwm6b%}oS4HxLI{_}J7BNr^wx#Q9*NEnXgq^R9tglvtIW<)buqY+A_LU0qm z&^W|!SV4{o*sW+=WEn!NC#piC++NBGl+^%3mE=0Da&qrF$=9LwmcdCytCneNDSeys z=>PkvTlHrjxLp5y={NL^?S*#MS88h**1ayYPAMIfXBYkk8iLZ4Z8i}qg9IN$*?roM z!JBqUxl$Bbt*oi6*m=XzHholtjuhI6x?D<|YO`?J5;C<|1Sl;u)@f_)&dqva+Scoz zai)I#$6l-#JwaMlNG#)2D=Hk4biO>M^P4F|FjB3s;S; z-|+ZWSqpO^NOX9c$r@LCp0KPA>nvYuS&%<9tfgm(11Bj5#u37XWWi|+7||CE&7xF| ztFZ*-KgNb~9lCD};h%J7wY)Q2_edqbZT1F8=-0L?eTdg)n z=~6)W+iTRani4cgx6>h1sNz1DsY=K@08Wg38TS5w!Y9Ti%73>Z3j3VqltO1|q#nd{ z*GwVJl5iKeqb+^(s{1&?|B60x-CeqF3gtDlO53tgZ7DOgYC}rXy431O>)B~0HA ziUqQ05vPc;0hDnh7;2qrRMefCL+Swm^yEFR^Xt6kA6DUu%d3L@Xkt>QZ-?&Z-kuXUvKdj**1X zfxPb``+L2%hB+Ntzp_TEnCqxsIpdrHW;WIcYybcd07*naRNL*j8?hIKNfrf_50l8D z)f>)iSM}#la@ROjFi;u9$SzqX#0kp)NaA3Am<2B-U*f=V#sM!{7eY~#A-U)2OgR2E z=Di27O07UZ_R*0)!QG!MC`#_}+h8th$jA9fdrr%{(|Y=FkpD*YcYokQ{pBydTtD=j zRXQ!Bcoqb8CR*mRVYF_>ohPAUL#j{+HKO=%gP?kYBLXYwvOqzX;`&)G!U`gg%Gli! z+M#(=D6bq8pa!z}w8AYG6Md9~<|wOlYu;Z~xzY*1uDLmNQI0Ez>l%t5Se%pE(<}n8SpY?SXk{vtiRss|d;HVA#%$74 zJL$>_uc(?TDo!bAS3HgAL3g(!vu7P_IV`ZtW?pXux5t_P+xPYj;4_v1x*EaOKt_i|dKyVvnFUL_&lb!#WYgcO3nBrIq zgdL5^vP9i(F}Y*Mj^q08bQiWUS?D=Y+#4SM zqtDf=pR!D+uzhEy$yk}8(q2nR}1drw)HA02@E=HpYaVUM}XNm#6-8fgvW>j z?gQg7s_x{drbKBYfgjRXPi+>rXw=f07rv+Lf+i5?&7!A~GS>u(IUyXKrV@LObV*v% zE(ES|Td);bj2`KyNYGp~HEe)p$eqBp)^xz4Of!{n)_m1?EpP93NGluDxl zj*>RyQi6z&$eEIkb*lZK+9!;1X@caVV$(!)02bI-{X1(rfTIg+)Q`4P&P{C2|K;*~ z^}qh*bNcg7U#G9`OtdLkrfp$JvZ5?HTA^HPLQl(3=Dz=x5)~-77Pi>ADs5_}s%aBP z`93=LzXjIdiPNt~(f04Cb!?ts<^Xo%;##5}8ba+N?+6Q!WQHUSt(k4<+}3uz;VEnN zJ8!x`-~ap-TFHfWjU<^rn$MV!2*}v}hExm-`N0+0By0K5Bq))8fM-V~ed6-_b@BE0 zYSyO;9xt2(i7^!W$#z2WeT~T}RAwfbK|{+*6($G11a%i32Ad2huE4l&uKIg2k?td)>;MruI<$JtDiD zwI?WhySK5sZL*VHmlayq*`;%f8C|fdrZ>IhsrsKk{Cxeu3s&n?Gz-_k@(1yR(x<4t zVV)sd<&*t^^0yMssiQ)Z_?Q^&P1+n^9&H>_2oh-&=9Lw`zQGU8@}hxe2qh~NR5@R# zwurdGNwBTRqVrh2+>T)sHhk!IIo{`FLR?MwHxy2#GoF-B z>HMUlpS<8a{rqds)8j{_tf(|h)8<<%(KbTWM}jR{TmlJp(`BWcrbnY;t**YKt4~~W zyJi}zG!?vb7?ec1m;sy9pEx$mYxN)VuiJMj79R8nJoANA3yVtVSM{GHH-^u)3acl_vxi6&>A@;Dy zeCb=Wba*7)hC-JGUK|XJ)-VqjLVsD=8}=^YG2j47XLl_N-Ma&q97oClMB09`B6tzN zMUI#?zY$*J3Ti6Ra2hlMYJ|-ubxpDx+`%F_Yt(i6=#ZLoyR^EsMX!9^h<@$W&(d#x z-}CiTFIuIiE|ZoqpOzstYThB{rSc?`fB)Xojp7v{MJtn{U=?-ds;OWfS`EZ;1=U6% z5p>9~JCsr&Zh%@3#e=Hp%}NPw!Yg6ZHrF{vsl>|4{!TRi`>&nTAAR7Pde@h4)7N&? zbyH_l-R3HdH^x;%P>(02hFH*~6}hU8`~zK+AyfP}H|SKPT>WRa!lJ=3yrvx-|33&G zfM?rLc-{FH_A?xVxA``;Q|fW7fi_#-$aHpNSkG>x+R)yvm#hl<%^$o#KlvS}>XcOC z@LfaneUBY*7jiqaxd(EZXnw|K+Tpgle?)&|iCXPK9Xj-?jg|iHLl^7Tc0=FPu*^5n z2m7K<*g`};RS-a33a%_r`_UUOB=(d7t$RF5yqKkL-KJ4aYDPn;HKR4H9+gZ?uPrvJBbgEzO~C|R^+vzR0t#aeu{xR5|6(M z(R+QA2{xU^px7N|!MFtYf>eJb`EaQ2dnD^R3Cr?tO$;!_PG*1OIZZ10Sij58ekyOP z(`l>9d+HzI)8E|Xj-XKef9b>1_v_`Sjp>(O^?begmCw-+Ja>hjwiabCDSnclBXNnm z-pOSMM8Z+g?6xKUxQ+#^P^@v+t}=QpU^CLC2>c+sfCWFO2+JeLj}0}Xv?+NRSZN~F zG8_pl%v7*YX_FQ;r#Zy;#;)}F8>jXEee^p0!$p_r(v91-Q6qYwxlFC0F>R&J`&w@RHJ zG)w-&=D;ihZoi39_zo}OcN&74X;7na=qlqzfaI-PCkc_CcFTbk)7N{^+AO>VLlDGX3!fzM#wR*rHZ8qEN4C zuAEc1n$t{gMs2Pu+DXt9Cx0_2>sb_5(n+);3{y7kv8)jCAPR(%u%7Ci0vIdG4(=Xd zR*O`s1UD@XFfCx?J66UD_LQ=xbzlQZd}V7+tBYOw(HA{gZ~fU<>gT@uEInzB6y`co zx2Kf$CoI&&Q*&G0B;5Nqv=e1oG@IHLq&w!Mx4rWcU3JftHit23WK?R@9+K7f>%)V- zAH?pp!za*ej4-e9AED{eXEV?kvk%I%9qUgRUx^CGd(0L&*BULId*%jCyBKfY2*!+u z_X+_fkkohi3zhyizVVG)zxmC}CW%@!hMrwCv>q0rQ{8e|r}WJ1cT$Z3kb(YpS`;=2AS&3adoOpJ9EiL_?E8MZ3#}s)SIe9qmo2wHl(4Zlw|5sc0stY)u$cMtlc1^3Y2^)D=wpCwbI|Qn&MLZ zEh09HnSMSUv&Ray=ybI+MEt)D+>(4Cr$1kA-qtky>|12 z+E^iXiL;wdjaL8VJVxJlbniap^+>l{N4Z%3tcB}Wppndh6% z`{5cZ`~-eGAM>Ge`Q=}|3pX|LUL*#NED}l&lg!4@aIIH`;2nlo**aU3E-~!h4G)Ih zo+Zbl#sMbW0n0vE+yOH!MJ(jNEV9d37`B(2sUU+u|2WAEN+7Rttr{QKb5C2X-+s-r z^+!MST>a3~#&tT5s1^%ihovz>b;TP-2 zUbtH4&~3vIR8y{uD~w*Ka3!kJR95yq_>sy?6$&tq$Vkx-f#Lq#1Rh$cZItujuWr&; z?w!?bwF%vy)>LqEa!S?J8h@>i{v!$eNKyQW%q#P4hJKIXel2t}UK~{CRrkUH`)Eve zLFTCVAJQKQv`HbUw0_MBt!FixN=o;liGU+8Gcz+=F1_@U_Z>mjW10ny9Mk$A@yZ+Z zTIg`xC5|H%JR&RkyR2do_c34PLk7ou_>#56fya~sQ3O%rz{WXmd?nRKslKgfJKBER z5h1=cFUJ+1VAWc151(sA+0`nJtJibn{e-lw7oIY%pML2x^qX&bre1UYN}b7ycpPE8 z3?(>*2CgF@g}-7^R#pANL+INs+q0^~QN$pN5EQEwwF4t~d43s`LsFqiuh z#VlRuj*ckzql>2HI11Id(?1=hAMlw0hA@}E!{)JVaFn|O zWwtVOwN4$a*R)=A>X?4}`(CO)`iW=jN1vYQT=d}>@+^=}Ch_VE3`M8%CTcb1yh7Lh47k;+RZz>$M{r z(@dF2-b`gdV!_d_H8jPMc`T5{1*Jw4`J|LlltzDiIevf`&|eTZ?Y#GhEc0gqTD%Bz z-zZS0c};1)`tY^PP?l(z{;GLK0W7poQFK?RFEoEKz zW#hUp)U`#KW>HK9M-5Tf({8fTe%>y0AzV>}B%*g4+7jL5?Lwy^+z~NiKd=~);&sJtIm5I+=xMl(8wpczgfd=)cRYsOy$?83tarxX6V;VCs~L#?ZqK5+o4 zKvut<{`(uBrSngb);A&dy$W(2U1vqS?45BI0kk)y*0HL5Z&}J30+4XZKP=5%dtOJ9^R%l%hCZRXU`0 zZAhWs)CdYZ9ut(m&={WY(Zyub^NIke(^npMA2@HL!YCa9A#qP1d zzpLHW4o+x>hMKXTx3}7~F=*M)kS5?yHM>)1j7z`t`j_j!y!H&8IV4Tc{FE{Z?)AL` z#VG}uyRxFHB+3wdIS=9#5=BTF8lnLD(YyC_s4jX){tD!~KK3Quv9qO4kMWduG)_O0 z9OLv23Zqu9DqI1f$HpYIEkHf(aSP2?pJFT|hW3utQmtP(q0>)Elu1s>+cv}#A3X=Fl#B?k&5Psu%f zPs0eT2I2@&3PB5|Wk4z!aV#UGs^F_@O>&pLrPon{(iEa^dD+tA@+qB}bo7FCBl?M# zK3i}3=~w8rFE~wSqbNoxwa$XVNKr&0Pnx8>?Gl1h)Gm}oAJi1%Vjy{=?ZCZYPfvn& zA#7<)EQgR-Lry*p6k^tpAa1j|WF**0qB)x8}G|zXI{*s4hQ`ifKmK=AjRbuWBQ~&w?!f^{Z996T2Mj)P5mo)kr$u#h_Il+{`Vv&^B?48RdW zwkP2MTvqUo^3L9N2tgqP?bxy7;tzb_19v-Yu>o!^Hj)pI-X(>9czjw)^(b>7P<{kc z&B7_V3B&k$X@VWpFn76lH4{>83k~f=sm%=pQd%fQ?MZEQR~q6(KnQUkKl_hxS{!>*%<*BYJXOpq^d5FkR`kR3Jjt;A^*>?v z(NF7BoqAHlHndQ%UB-aw=4qv@y-Sa)X7$w3u72Xe^YqKFKUYs*BaM_&lM@}688|%% zD16pXltBdV5Q1PWt^=EXy!)^uZKaM9d6)m?n|k{9%WhC-V!duFGPROSX_6?ROrJ)` zik_<#dWSwv4_v`x5yL5q`PF5_)#1IO;@`XCAsSk8HS+lNtHg{^3X2lPpPRuH*gNrl zdOSU3Z;_@qTh0-$Cy68day!(8f+nMGXa*f%=ft00>_dJr(do35}%ON5wqM zLhJC+pkrcAD|;*X1YYNG)UbPIH}7IHUZsZFi3;T{+uT8`J*`t&=$+51@KsMfMgQgd zU#cH`!CI|_<^F(LlW~x;7?kuy!#jmt&PNfxng6fPh5F} zZs;Vsr&UNSEWML1P^vj?ARy*V$x^3+G=%6sX0KR1t&2P@S!flzNim<4%~JdnbJgg$h(#ZR7jG_i-9?n5=XsjIO=^$ zn9?hkReJpyLwfrUy-@%A=e|Qf^Rlz_q-Bab8C0>X8}nYTPgWPZ+mW(FSq5Fm#)^7E zA|A@+q#@9bjIbIZ&To(s-vSeG8(3Zp7&&wq1oaJN#07>Um1v4Z2DkW{BKC^=r9c1V z&H7*e_yxV=3peSqd%C(WTdiBv)SXFPlOrRVY*gC9-T&5tgMUluZd>w>-f(+-6fN3P z2Tf=Xw2iWl7h|PtSiu`sK8Amz-iSNXkSf|rHA^Q<(myHv{lt;FHl#hB(VNuEP8rcJ ze%JH$U%&UsdipwP84Vl_xf1oHGRNo61MW!rz{<(jngjNeK=Zmv?y`O1_=?iXD$^YH zx3@}v^N}y;>km$=KE6V-f@5*jWzn*glcy<`bY7sYpf3NMt^dwf!HkD!aa6UlWjNG~tCQ5pG$nfeXRx?`79&5|Y2*P8?k$%SuiwC6tZ4W87_*PDc0w z6L2qp^?5;%As2)@8We<34i>K!ilRkatCs5O`%C?Q7u~A=_mNBW$s6v`ZLPW&)SJOwD0eW<_swVRjc@ z2t^-(U+|?5$ujDckzx4*ob9c5>j~M6e)57R>E~YgbiMM4buFjH36Qyuyl}%Ed4XMU zGT_5`oCGCGv&>Gp?~Ne$Wl5M92?N+q5XK?xB-1_9(tAF8jqYft+L8>3HHZ`vNM!6t zDsXp`RB+zD2>-&P7-M*jt${WL$t}-l??PhgjF;t%qf?fTYI!Cx1C+osr(s&DBwxRU z4%t5jAKr7U|HZJzJYpfxotvB6;;_YtWHAzbP@3~XAp{j1%RC~-Pn1Q0Iv{kCKTG`C zdjKFvWDG*hAB2yL7*;5L-`OG*L8LTQ{2?hzA-kO>5D_8OQ06Pkw$5l2dhwZS^t0b} zfqvshU#d4eYmH8)o(8-0gt6Y>M8P}t2+BwhhEbq}RKgwg3_Hctk}n|mL7E}<1N4X| zkec#vMPp|lq?JM1Xj{!xC>Hs%d-K8;da0lcL0v-TsBg2R8z$L3e(DbW$@{;o_g-G^$~e7CEN@mrAbh~pA%I|7*U4gur!FL1k?$&IxqkL5CBO;K~%>Px6>QFZdV1o zEQslX2RSf#=SQ#6bsKkTM#ECl0Es5JKAC{NI<(1S*Ff>_NTeD1qwpdGH$@yA!<=p%^)=qyyCvTZt3iuEQ(tNVwijE zCIWW_clKwgttTZNea{n4)h~R{%k*=vdyc;2sVn90We*{A1L>mVLg7n$rn2RlVTvnW zee@NBtWcd-)P+s76ctxLzM>qb@24vjZ3L&RI9wn31KJpUBX8`jznp%yOtcF{Hyxx~ zTGGE?cEA4cU%sd>+`e5mPG{PdE!T85rYV$4fe0>rTo6c14Y3Zl!3Ekb;TcFtQ?Jzj zB|KD`1`8Bu6m|6x3plo~;ObMqBCPNg+#f`EK{Jf%woEb)M}|<=^#9y0oy9;ngR6>V zo$Y$@6HnF8zy1Qf@)>L8-F>4wtE_6H!}3_B--8~jV*6dbqxv=@%bt0Z*z@o>OGyJS z1wz_T32iN+eNOVBFWskaY-(w;Y7)+(1bS08P86VF#-=}vDD~`>XimRfl;_33AY8}r zar+n}UT{V#Jde!l5af;DDZ`mg8LP$7BGG8a+a|G_gLP12h2Lnf5F(Y`Smn((-~89u zi`LM4i>LOp;Eh9fHU1j=+U-Z<_AYU;t8f5vIe;yoB`K=}FZsRM5ejICO;M- za9+D%KQYnJGxROYk3P*Sw|URNiW!3PBB)^O(M{@*|dT&%&8V)zYM9+^b+$-&{&7QwL^(c zF<-^wa04gJD}fuUY|5z~lpMGz`QMe5KxdwmOcVG9u%V;8)V zzB?}!KMRo5Re))ZtLLbqOA*^iaWk)f{lY!^lYhQUpS<=?-8x&>?cIj%7Hu0I*JzWS zuB3#MjfqexOA_TsUC!iW!7LU5{s7}hnP|MsKux14_axFu#)p_d2$kLzU;P@0;H z1J9vt@9sxNM#MdSOk7pfjoj;Ri=IXLdUzaI42?|7uo%c(qVYuIfTxnNPrDMNEI~~a zz7^a!LT4pA-<9kDSAdW*{2kf zqBv3nw-O6`>O$Zl=60*ToO*glyqu5+T- zWldG-s9NM}6I-wg-AOsO?2_Jp#ZLXn2d~h-T=q@fJXPq9UZpz`#^q2$L$yQ+rxL@2 zHMo9^y5*>`+ml(t98q79Rp zHKi=_#@f5IA?fJ!tSkRA;;YX)L%;O;^YxUK(i$>M&(=dvo<;iVw`7qLzeM&D2abCVRFx8T^(niN zA&wx&fRB3H+})RRQ+n2Lp{I>k@dJ8q`Gr^LyDvCHqcmzrrLx|fYH6u7Aa>_vRar^~ zNsw1pxqy2-VVu8`4^qEqc1n7DB82@A3 z+5i5#Kc{zJa;!{V4Q$hQ^tIrY0-H>Ps5?To40-EZz zpl*PGXe!OJ_$g@XY?9+H<*$XYWFbuw5tGFih0tb2#DHV|GMxh=toZ9FqNtGCGaBp7 zYOT6j)|=52R}Sf?zvmVD@$WoKYZHk>9MyVl1@8OJ`(`tXt?HCgNJyam6BrMDNV{1k z;Vyw~EqI*IAc#d%k7NBDX92dgrT2XD8r?qG){b;cJLwCLM}HQ>3NEA0t_K)>1p(R- z>YzbRalJwb{xF>5QJ`J1IKhsQ$KYiio7Y2TNC^QT4S3upFw&^$$!9;#RLa3se0l7U zcHWSB-nD;=oxPgP<{+~8{O3Qv^MfD!AdDCUEk1jGWGp_y4@hxksd~WJrHCaCJhmJ_ zi2ArRLE!i}d#>A64}r99Y(!5#ZMlBorRVGSf9yN-BhOo-)kvU>T`?9kGBq=HVe`UQ zD&_E$V1opTTDwA3up18u;*8zp0D<%|4GOzLa97-MRw#g+Lh=|_5|e{&M5yxk8GukK z+VX>ZY$M)!xGU8P+^p7- z$Gg`CrvfvzRFfQAPr{3tyim7-2;3y04JqnSYWtJ?p@-d;l6l}4iv#Umnxu+;cFaoV z6w^74j;|+!zg9-R3qOtauc3=Jj5YOL7d%rx_5By>x#!e1oQum3=(ZAN7jAZRSqKJ# zG8Rf=(PTH?d6QrR`oR6}xIjGwV(2v7_B)(_dE@j!Axkt%l4(LO`qDkR>h}AzB^lR7 z)d(Sig_a;-wpP;=g-4~2pCTp3j)K#r@@Fy5C_D1s`pSJ0!>L2Z@F{aG_pyEm5D}Ex zE*Y`Vzhc=kopow6w$j0@eI(|9SIxo6b?7IAe!`rSkWQyFwR7jrPaith@txur_t>Mx z9D2&LWAE~t4vIoVif*C@HqPVFFd-vVZ=aUJ`)oKQALf(o$MUD_ z7h(@j`-$5jk?pZc<@N z>L?Wm5wr=xDJvRc2$UBF9qOI|vk-GD+TuUH_JIEAAHJY}{`8l1y|s*Eh7O z@0fpA*iMIaG$v3k?L4d^EISq=W-<+w5#6a~TpsQQTwhUjw5mI)XRjO9&%Wk`debXT z)f3s;j}t$X^76Meu%w`nWSo*TBu<0^$1DwYsXY{bjNaeN&EFk9sNVsm$G{CORTAQ& zsv^lHU)!lmuD@BG#tPk05YS}Q#kTi2kzujMkn3^{MNWx)(Vl;G=WPg7ZDHMEcf>Jq z__HNR$fN)vm=R8kOk+JQwQg)kV?>#!$$)0kh_UMA;u!?v+^_LY-|#8O4q08^JG2V?+IMfdH=2 ze*YSpZ53!b*OAsqOgc+bTv6zBdzwI4uBl~Gr>*e-=Me1cvPu)hw9a3i>L)IIvi|(1 zFVLHxJEEteF}76$DAt!CU=)XIw``B*OdgR@xB+by*;| z%uJ;+`poWBiHb51OC3ce#rY7t0g@HHkMJKP_S-G#z1Pg?uReZ*{`T|N>BT&sTVPRSwh=L(rD1R3b;bUU+(kB>(G)iZ|jVU zH1d}~6i?SsCjaT-a(2(_vs~Zz^t1GK}iihk=OQlUPbQnVw#5Gp12n;R1*P)d# zZ3PS1<+S@OH2lc)Ha%&>YQY_Oj3&s&j5zs$$FwZAz}|x)guw7F;a8zntM%neFTIq? z4wmEikBdAx{>gk86jt6EY46o2+50>CLeXXbATr{y4^hXZDWK7WS=mRL8L<1>j@Nv; zV`UHMJXW?W@hWEgf$T%@XFzx4<-%7GJ9uf9W4#^<%6FaP2;ng+0m9TnBck|Z#T6AO z!W&^Y+ik1lj&@yAYJD-Q^Rl*{v$~<5eEIYB+dutsz40YyYF#2VTXSl1G;KjdRft^e zh91r{$V{0opg;Qe6p)~l0%J#p6*Fydmdx$2axH68GO7}V)ustkWWD-+>D`~XTYvaZ zSL&a>c%3fYxJ$QbT$^gkb$?OQ)*{FXE^RbPjjWu zi+$7Bzc7vcM+_@06E!FR1`M3hE>%Z0q$oRk3l>N-D9SEb3iwy2zYE5I=Vc9hqG)Sf zIj6I0gy7jk>Msf<_v;Q6rfuzxKS&Xeb`<^6%`1ro_^4UN!qV4giE=%znQFt@iN4a0 zbeNBZ=+Qo6@F89mvL#JZ8FO=UUpYkbMG>7W3Mx-RB2!lJMvq~8AUIy6JC-mF#}dqV zMu&y<0dNTZn74w*6w)_?-Cp!1$`FnP3ULd9(!#PGq#AdmV%t}5WKye5KwU!c))Hw| zqpq>;tk!Er7o0Y#pS$pU{m&nGf!_3@H9BWlYOqg09?9i;Go^)f>)}3B7*ffYFDD=a zIap98MbzxDvd52%l%X6!PUYx-wK$5O4AOS+t?km^fBZ)M<-dJW7hU}=-9FXT-CXKF zm^PI+$2D0S){dm1sccA-gzcm)6uXEGd{77a0en*&EA*wm`_F<*p`&gwt0Jnqy3)WR zCmE6aSqn}yW>T0tGy+d6l>MwWbhhcj(XM{sMUU4nyy`4HcfGWZBrL1cqpE^Fsu)X^ zQk5vGkPsQD-oUc4a}N>)^6c?z&trP+!>&S5NNcF!K*@&GM&Va!kUy#ak;}iStM7b3 zyI24w+{uqK9*S;Ps?pXsAhdWNl(LdUP1@!Y-Zpl^d{{YL*QqN4+|&G%U>jJNFb}N5 zGG$p-ANj~f?m4W)$9bYXTsY1NT_SIZ1CIs=yi4;De*{{v3F6KMVT#06D-Y^%q**3S zwG(zy2%(PaDX|SSH)zHt^AR_N~05EJ@U?{M5^9hX z*MUt4f%#LY*XwP%=%R~u9ysOVi8;KHwRqa|5K7}jML5|WfY~Om3XO+k*e76+=Ro#8 z$se}2$EY*BgIoxQ8SRkhV2}mV(Vz;_!ElJO3-TTeIz;}Xj;H=3rN4>X^QWv=u=80_ z^|S|tya*8SoPkR0>Qrw^0ZGo0c$+qjC8vV_&*;iMpd9H*wezZtEXYLHBlKIjk4=+mS~NNelJiD+~Lc+{}f)}t*4n*BtfTkcIt_> zw*J%eo~)mK-E;JUGiq8Hqy}Y$?zHM@u54b(RB$Q>C7=`zT&g(498S=FOd>%?A4JE5 z&JBV=7)e}ao|kHJ-BMB8OiyAtq7Pkst3Gx8UAn)%TpRO-rb9y^tE(>w zxJ2I)2M)%8S`>r_OL2H{DMDZXEBqS%n6uW90@4Ga%93AVCpf`<>{xqNW1T6T%bops z%TvAiRWHyV{pau24?K6BPR*n-WO9=`#zs=I+c1REFUgG!&749;ffOk55jB)eh3W&k z(}wag)fC$wi+E1(b?t-FyDz$3fAVja>OEihnr@j5+FYB^t(~ChbV$kYxC$%8qLeuP z7k9-<5fwG4O@S8_++ouo$;w}g^a->HC83CZ8~S6wOte2pC27nHFM3e)D%)z(@27Mp zbvCN?m1iv1FTVCdz2RkN2&cTjQ`MII7r-fHR6VKJRuLCUihZ6CY!g`c*?#z-U*h=e zkEdQjcK+%q)oZBS*d!Q^h{gfNBUeA85gTT z*(+2UfvHIdDj2i=Wx;b#TdRqt;xy3wWB&A=B=)#9A|Lyq`+KA8m8NNR7tbY^T(Y#& z-yf5Xd6;|tm=p1E2w(s*QFQ=V0X>?iG4Kxu`_eGTQ)ki~3^n2(Er_yHCVZ21`~gAx z_N9H`cQ4I^O#X0Ep$xD4LWspuHOh4P5h!n2U8kkaN(!A?v~+sCr>88>^ph`ny8hRX zy+l9w{B=65CXFJ5MnX?XXe;;_mAnAIB-aH6w}G|< zS^%cILG2_}Ckwi5TKeEux9HFQ<16~duidHZ=9+3RJ4M@3Y&%HnqtPwBTr(WuFKg5z zA5zok4=uK5r1rGZqOBo#FvMaeExWF9al`xqT{V=j<4;iV3H>Gb+774*uPWi47$<2_ zX)(rDySch%JZMJ}|8G zi7meV^{?NL?T*4)+$LGv5Uhs7N&M&-5uYd95wSkk;A>>DYw^2$yRwt_kkPt>v8A~2Q$fkssoD>L! ziL9~@Jc1@j)>&-YHA}JWMk?RgzxxY!={Mi?S^fPb*Xs7UnjRQhrCak%8}mf5?I`*# zR1P(UH55wi@~`Qk;K!hKG^@0(o@fOGkFkgvnTJ#|W~gLQ8~RHYgF$nup%fZwp&Vxd zVNoF#G&5(h)6wbd^3SQ4df|rUdIO8S|M7-r$=|#8kMA@qiFJ?yyX?Hyq#Q%usyQyxn0DG;XW5&ZKrc`kt1CupI(v=8MxW3F@zj}# zK7>h_zj>Zd-h1!8?>j`&MH8JY8cGkB(1cMipVpJX5J9#Fu;0my`J@N526+x-A28$L zMlh&iQg(J_7l<6@4Ufk@w(bbnO9_4+=lik?@DQ=Hdi^D*y;Nl z3SHddNPY-@YzQqqp|?|~6gzd{IcxQE-~D{O`ut_gQ>mez#Mnqs=AOz0+@Lgd;9W-v zV*oy53zq_sq!V-5uKj{ObJB%zJ#XRX15iNoE~(S&igl#gEKL2egUwX_-p_xN9sZE! z(qU~YYl@2t7MNo3C;w6%@vSzaJxB0;;$Ta*sko!_~8-|)riKL9rtYjYk-w+DoksqF#mx6m>MVF$7wTH@Xz z2g-N2;j*%Kkx_t_@&{7lub2^DM>veJbMSAr*N_ASg13Qy8ZL6BOyD|`o%OoB^EwuG zlZ8i}Np>vlqiJ_73gBGw&KyPOc9baS6uuj7+cMnCP|hj5&u1sqn%b_Md(xCXzJ;7Q)Jn)G(W*~%cTG8t0rk_Q&g}!NVaUF`?Nfr0ZNT0ZByMF!u zT&#cj@(sFVs?sKnOJPVFUM_VD?VQ@B4a=4hHcx{K5K%4^+a`$%3aM`=(e@5_0AgeX z=d_Cw?iZAXvXli7%DW2((}0^E>~yrYo@#k(QtLW9^qh4~z4^Odpf|t%Je|8nC{0-D zM*GfQFdcUR>{aY-X_`GyTDf#m1^}YhE&LaEUPQ$RHnl=H}+qZnyo@yKrs)X%<`Pfk)e7YssTT@1d0U zQCG{ZT}-|a24GV`KBlfCM26UbGzjxRE;?;Z&P;21YEqkb?bPPU9on*MJN7o+yM6O9 z!voZPtZ_8$pWe1f+R6fc>z&ve)!ufmc5b_0_icYr4-)6L-M9IE-M@3YcFfM|j{6?a zhdz6W{@*{mUmyF@UD|}kYe{N@0`w3Imd_S2y-rI73pAlPB@1m3>Jq5fY3D+C6J8;F zb;M7uP|bk0<~o(`o0cxRVWBj_z z81^exso4Ma&m*`@Kn|NE4YuU&sdyERN>W+j=Vc-#saUG$bKjWKH4o0{{&HBmvW6yE zv~1;y#-}q9nL;J8u$31nwxM#4bBgXf60+3wPnkeiw~A&vBkONi;d3+qP-v0 zt#^I$i`p7Sb$69%o5xv}YI!45mw0!RG@meiwQSVLOSWMQL?85sjy%EKWzW zM5j*->B(md_gh8Z>~3GB$OiX|;^RI5aZw%v_WSDfdgZ&`^{)H&8@WgWY4swd{19Xh zj_wbU?3hQ_n7*~LLP(d~rB+H2s0j$%*UhxqnW2RINn3SsbH6C{q>wX!5#j=@ZrSP) z=286^1KM@0aTM(zf|qN{w$>x$*K*%J5xN?Kw?h_?F4t}Ir`8krngq4FU2Q3)9gR`l zR5Wz$rWyV9`#zz6`RJ9pd%J|Jbq+N+R?XWe5=2i0=&>lEEr9LLN%}~biVE{&M7?BK z3?Z#h!Eo9VMW+BchFw z`h}Dwc*5SWkTeKA5lmU-THdT_1-t!Im~YQaOP!a^=|vlw`n4Z?zFzb65j~EZ5m>7X z7LiN}snVJ_X79;;X^6)PCBx1bKSsbd_XvuH?2*H^9lj7T!M-mPf6kmw(^RFE8}aBi z#-Y?In0bkG4`Shxo9@?4ZMmj6JxWt3McEZfw6l{-xTAbfp%iK}Xi|i0H^o}iPn~vo z{B~()%HsE&)uZu)wQf{Niz_=KO5O&RjhhdT5Ty1U5VczE+c(^B!=?i!ScDPDBBc3{ zBwOJhGSP98z)Iev^bkHN!Z=~zX53B9a6CN2j$XcVWTh{Q3wCBHgLQ;~-els|Sg|*_ z+xPD6n8J#~bUfC!>pTi1@I08`$bx|4^SJSye9MvozlDkXt9dAVAuuf?Io0mfI{wW6HwKh|vdo9p`a% z_lLpks`8%BIc1et+R{Q=9fYJDGytBuPw*C?0%Y;~V5si6EiPGX z1fOX17EDC9$zKPyZN<}L(stNYD()5u4UAszJQ=iEnXBT+*$8=m_%;y8#}b;a|FO1@ zw#_-Lola71NgLV(rjj9b*a<5^U~(KEg@W(pyR#gwbTotr8Dr-q{1zuGmMv3{9rPr- z?Q8Cz)UW;dJM{K!`QUFIh|`F8x)TcWmP#pnI!JTM zER4CS22E7$*58M70VfG(u_#fO%L&_vg8N5w|Mk>Y_yLhp3?GMkA z!CI+d+Cf6P5mx@g%}j3Ju||!vWz+Cj+phEI5HyQ8>_h>`REYQE44i0Jg1Hilt!4Fw z#=XNwpq4Di8VP9#_lNr?NxNA!P1nbDZ#(EKH{Yk9`HjEO|M}N1X-6q_Bor&JSch#y z5lUYM>O<~pf~k$3)ou_pZzv?D8QAl|1B-DIK+QWl#)Y8Kzy3B1i4&xG>AA!D^&j~T z{n&+1)B0k&*0i_j6l*G!m>5+ePnWT$`N!Yet|Job`1eL3hx==ch9XTQvWd#gj>Ct` z>O+**v1je4VpW8YAtHe{R=b)8N#tUau=LX)Xt*(~$xcUOG&UXK zD#sg!`6~gJ*hf%*r*B^=%No0m0LM+188$$oUj^?+Lr?2g4#{)WtW0-P3Fnxvf;W}= zkK>%C?>pdoF3viA(|L!~^Lc(d>*z$`8~x2q+I+64*$QYwVF zW;l}d&v$X}>_P2SY{^1}XjP2ZE>fo5EtDW!dP~re@<4Lm!B7N(;AtQ32gE}F9E0x4 z3$@uvm7$KBPEq8f41Us+eVI3u2A4&5h#y`Xp8ZD?)O`PCM!DLC?%^Vd-ZfVPfO=nC4^M4{1ab(Jb1T-c7A z36jypj*A7?8Oul%>(~6_@O?2KRj0LHI84x{6)2_^G|Oc-V?7k?@*)yB%&3#skfDsgs+C=hmpx5z%5qvUqn|uySikeCbM^gC z%Cv#JBf!Q#=c)|uv9lLE&p-_jA}{*V;8c_uX&%tDKilaR!1;{W28Z`3zNHdgzhuY;z9f1rN=altw8XL zH0A|f4pmu6;V2nLmbExFJw4swKL1X;Pb4HKQezI)7UcG!l05eDOh~bFOl{BC9s*Lq zJyUsP_5(v8tnWlXR0^c8qCj$>6E8tJQXas=Y5;@;g0rt|35zB{(eJ^YdWb|w6adML zAg!rLYMM!h^uS!D>+X6`zw>ARSAX{RpV#$wan^*^YLTU?4Wq}YFjx=;RVq-aQbvDT z__I|}%9sdABA45L;TEWXME?Wrc`D*^yhed-gUZto4we~OiRb0#FW3M0iI?byx$8fD zsH+W{)@dm@@(xW3TE>oc2lv98I$iaWO2HS$P}l$3m(*AGiMqiwplqm9eF7C9^DR1f zEp+3JCgzJSWl`Cbea|7@gZiDU9`o7N#}G=aM6u=cL6=2yYrbBeo{2@2QW`#Eu1lk| zZw<%ro_0zW+IT&Z!NtE>hMlp-cTI&NsKS?^UdKKlFzA_-K~!oPk+K0YC4QyvA9!oyPXd3Vk&aR9^h~o zipxsA*=))RKZKwVf_lB4I-SlPAN=44=?xN{Kn9kbK&?3@P4VD4Qb4e0H-jvhhmHA5L0y#+RqW^kyRwXs1O=Q~;gYV0(#l0> zFi2+sABc$kUW$x(4s4v1)rG_nD9a0_WLd$m`o5Q)uAlqf@6tJ=sUElM9zDC5(rN8o z+BG*Vv0K#8kXl7s1h~bhNBI6IoOGLL zTQ^kNffVwBqTMH$*N~g%;>DFr8hqRbp7IYouy@7yHFY|QjHyRz-?g78yB(=^TA$x z8S~yFvl11h%XaUS9tleDdaZ>x@X(?SLET;1*Mk+mJByDv5CI^T6H(Auy0}76LY*1&hWILR9!E>YBfeHLEOz(DhFrQ^~Rlep(G=$X$BMjplBpccCmfC_Lh6}mOuHw`jfx=uk~E_77f)78dH2Uff(G!AEePoW^cKqk9ML$9V@mSIfcSFy=!h@Ua82N$RKq{S zZ1>I|`KYI!A^piOzg$1{%IE0(iAtwcQ+jff+}v}kGpBg89Rg}Li6A>B0XB(75Vm$% zG5h+dPAZ|KebhdH!we*_BAg+(%_;3hIWw01XGd|%D#YGLrnTrtz9}lD|BwX&=0@xsrtkJ`rUfnv(|Z^tTLy~ zl*L9`G?#UDAuq5~$|LwuHLkf#S!%2b{ z4}ExvW0bP;Ux_q?o5CBO;K~xF{dYL<;X+x*6 zyf~XSotNy?&tLci{p5>J)#(sPtGMNsY8h>nA_>lKg&#scte_9I`$=#u1l~u$gnrFb z9hu7ky%90;C8i<9j2MSZRVB<>D|?beH^=(!k6Rm!#%70|Xh=@9 z1}Oy3mA#uqh&M3~OmN$-`*j?^N`vJk3zR}dnkWrHJ(T&f;Sp&Rv5Z?{xFQ5dgfx)k zbxnaqc!$B=A!za1L7mu+Beg|-BRN9*Nb99f;Cr1Np}&DK#~ol!ALR%TA#^%Q)dsEl zkZzx8tJR#)b~QDfj_K>S->+Z&!@tr`|HeD@;V*ofaH*)*RAhDK1?2{&CFT0q9Q}k6 z6(xzDrow@V!#s_?5a0dRLU#;dJjI>3@O)O4h#{Q_QY|#^t>l7*Khswcj#At z=+%10%DUEfCgr~gR^rm2rGg5NIhCX@q(DaR#DSHPczir>RtlfbjS>(P6s6kU3e7gANU)o!m{ z(lpRE$zQYk>-S!+&s~3~wx!E-`&=QhAR8JT)7Dmt+>6vaf@C+UTxYFWCjU5@D&wlo^_wG(`0y*}y`UGl}g_@5rZ4Z?F zqt(1RL+ePfn*_1}cq{gu1PpKv;S?DqZpFC<*EhDz=+EE# zDgFCJH|d5=mF6V%Q2dq1gIkQPfIzEZJA{(s0-%aPiZj zYin(5TCZppdi80;`nA_RPv8H76p4AhA#mmwA`UTfqOx}`0B<+hG4yL+b|2xGdnmrAB- zs2NW-{O@`?nICr0$`r;SA z2>1J4g8zgvu~A5KKPY8bsw9zSw>l#c%kTA zlu+0KWFRnB43c0HU{jK;^m1c20Ny|$zZ@#)6GBb?fgwSgcQd97L7AjMLfJ5qh$$3U zu-JXxdg;yo>0JHt>o3%+&t9g-mD_bjwM(a#a~$FK6d&)h2XGx$MDvJB8oIksG7}OR zF%Pf0WvF+xxc4#@w9E%s;rE@1T$ZAOPYGhIQ>G#Uegi9hO1q~ac(bl->B;4^F5tA{ zhc9@Fe&ffVqvvc$wTxsn>P|q0l271CSx8v&5x$S~2SVR*S(cGQ@dI7a@u_ac&9P5nZ)=M}nSayBv^Gwm@`4v+I4J+tE(ynn5}> z8%>RmPiSajxmHZ9(D?G@8p9r%n83XntXjhIW59zIYc#(4G>tFAUba%n%C*wUHPVXJ z(#loRij@+JHmzBw3_GLGCRVT4ICrrt*Pf#B3DPfLug3Z_H8ZwO@BHW&^|$Z)qHdd# zTB$UPLd}(_uO~}}Z>h554M?dtz8NzF?lxiGRro_}AbPzJ;))^e5CbW!>5{A;g*#A3 zhRR9OgoT4t6C{HdKcS}o`9sgr8=kdR=MPP3w6$47Ay?}1ydXuf%eElY3ZHUhc#-2U z++8av%Ch435kJm7#uC@q6M_J@C*g&{k7Ynj%2LGj#D#7Hg$EzJNJyxcdFXi~81%Su zMyGeS=(%G({p1TCukU}}a=~4eREljXD6a!Ad(h=-X*%^tX&Mwl6$O4W2qY$iAb+3> z=c8*-REcR|F_)-P%0jLkF=6Aux>kb1F?!O-)U;KK$Vie{FYy6U>pE zVC|t_V-N4QSyrZoP^?}I_!s0--1{aTq+uk8v%Wr;Mr$b_w9>))YEs#D%i5M{$zfg1vO!cTZ zP#(d7_^nLs1P&s^DWd>g9!i~3EA{iQK2JaKif8DBXRXi%&1!8iD{@mJ=T24***5bR0;zy&MZ+3ocl8^r={;aKFeOIZS2gaIqttJozRsJ zPV0S_eM|rM1DENFJKLJ3fDV10C#W%ld>IR*s5d>nt^IAI7%jN=t(MUgliF5{G@TTR zn=CjKg9)YNzPo`!T$YwvJ5TPia-v))3sTCzR^z1Fy9k z&{sqJdQt2WQ{1tgI`BjGLF6cIW8jymaXSYAD7!kx`Hxdat3o^ek;7F%4>>j{=kFhu*2Z0aQE)P3{cl(A&4uqG~8`7?D)mdyGR%)Q%LDV&#%}xjZnG1`Uz;+?CQVea}<%t8aLvUi|n~ zS|4_4ZEvT}uJ^R6n3Gylir*5**?qcVW1p>-zj{Ye`H&JODC=+#eHumAprm*~~cSSj?q>L~My#Yn3?t6&-^#x)oLcMAH3vSsvr z$KqX4X-Q9cVeb<=-{W6)Yg-?>>^e;it=0B|w#$^4l22DusY{+bhT%B5jq1vE>PTHr zICWK=ZgjYO>Q!<2WUiTeRpga@W>x|RVWpjBKJX&haFD?Qp!(nkKX{GZCn^TqI8ocT z|8|9-6o@A-1h_Ys!C;YLH><@sJS-`84;4nq!0q_TehN7X)1aJ%P!vQZCAw?&z{=f_ zl?rH~=qyuXJKUBfNXG>aJSIG7f--i$1IRmKP(ouLDP0-Vz+anJPGTV^cGf%Fg=W%W zwTD;g*6C9J^x4bxcOUwqzIJ!1X`x>!-p9ZN`HC`8o|gzc0*UhpfbXam3bK^&{hJb& znckiP>LegU6O?9PY?Ul1O3IGN#c{GUP9e|PApPQNpQ<;#E;voD}OW8KkvnYw%KW=BTcPh!+T0Gtu>*g)#WZdWo1)8 z&F=nJzUL`=#%jqQY$Jo_5b}8#Raj6!!Z*zlTto1>Q0Hcuf|%2I-w$ui=Fz$&xyw zAx)HrO!s#y-5Z829X>l6 z#!bLyV9AQ#usepCY;dhS#7%Rl;^y6|Z$v<7+I;6x>@Bn$e4?46R9;7?N%kB2a-h&2#`&&DYY zyN?9@a*rhEAWwnA6tuAY&w20o=ofT%x2}83hBQ1bC4rbqR`x4U`2I`;0nzx6c8tCG z7Nbs@SHj}*^i>lYflcOR?v{J7G8h8~&)sFJyCS07HY#r66C01yC4L_t(5D}3Su zgFp8i?Db^(h8u49(CxS1epNr^iTU1}8z)#B2dn>u%^EBM+H8}J8at~7yZa2Gn=uGH zP;5syYylF|CHNO2L*N`KOiO`q9H7S_c9_c(;e8;zqCj5Qial;GTq0ejZPB4r;tzkZ z@X`_D=-PgC^_%vE^$*&R(hr6hE4B?^#~2;P*lsX(*rcnh)ivz9>t0()XHHq(k^dk^ z70N3c(gR6DThlS!Je}*a*W99aeduC+`pQk3L)cBXWi^ZX3{hweMn*uH?{SOxJy47* zC1?>ldilq9qRK>rA|R=DUO|#ZVqsCLM_m@G1p>0s&9#B>mz~+<9{ojn$r4au_l#54#1HZH=$w3a6X+l0X9}OJ;0-Yz98EG$EA?Lv>4P1qC(xD(*bYjG+qYdJY&Sgn zqO$L4X9qb$+{#+YX+go5v;G)B6QGOwn4E3MN3ow*RAa6+-35vyeOQMHr znHn|n6)g=hkIq{y{oJe1&~N|L%k_gVc$&@`F14YU(PBt02L}4la68;a#)AeRjB_9P)WaBN zH-GkN%c9b6kk)HfiXNfh$%J4_qCm4~E0~gna{RflfmhY#z-Ffq{rj_>=3v-go&{l@ zAT7k89zoH*a9oGH3o)SgfVSIoFhKhO^E&Qec^&68M}d;bc~GDj`U{>)`?Ezq9t^2h z{0G57>pm21#J6aBAC+2&^p*m49~~t7z(1f}&|(Zui&S*u*o?=G9P4jK;CC3eQ&wd3 zb&^mBe0F+|lbNKU%_#qS*!f?4&$NE~y+E&UEY%2C8t?k zbP*#zo(kZkP81dnpR(tSL24lkMqV4#BdthttXAm4nJAmdN$brvz%=e1^bRW;p-@@N)n0K>wlh-8fhgtZx85X?f zvQ7HZj#M|7L+Uj~lv*~ylOb1_B?6$j zM81(!V z5*=XW&~Bp{xEc^bElE?=ndw3OXV8U#MTQj+Dfmn zi{_?D(bK8t7k1yV=Pv3C2u4$zT zqbntj>kICd1y7>fas~>t;vYbqnh-=)ls_-SqW=VV?WOF48x&s>3q{YLl*L_>6OfGS zqY3!@Um-9B$ZsJYpej3*CpJ)oBlgM=HPT7?icp zJqTN}A2tX4xs$oMDXkx>YxAx-{qx5z)<1vtI&DO3wT6c@hlXjDi7KRA#csdqwplKe z2*;AT3Lj_U7k=$|$RqE7j2K!HU&eG6tPYChIevFq#WW3$(>a{hS=9I1r>@k0e(ei& zPO~k4;(j#giW_=uo}1Gy6kx%kWoHNRlMQQgtE1NRPImICo>5KfDakJVXHE=$;dM{f zhK4jO#f3$1eYLtwUr%Dchwj5ZK1?}JhPecSX)EEq)l#ZjMng!^1-&3$aeJ=Izx{yj zo0=nGMW{4og>M&&G+R+tMaRkXO4N<2oUtME1+WNG;PednJ%`;zehjh5I`_$477E9iv<=JuDPOsc{6UW_Sj{(DyP6LJSoxd^gN1MSE^XzNK z!1ZrHKjZ6(aWE(M!)sruhDlsZA@oyoZn#6oUxdwTnj{&IGE1DNqvg8 zj*Ex(L}ispEQlb}XL3=j_()$o9oo{uzIj`vfBf_pb@yD*@aQt7S*8}sr+^prdR=J< zn(+bvo8%{fDKyySM}-gn28~V`b3OzTsMR#W@zU~9;nPt)=C^ePXustx zZ@Em;QI)qCGJB*h209-WjdWm4kK9qh(Wor2ik`&rV01f-l_CK#U7VSH*PgePl6|%Z zu>av=koVED7t%ARV`13Qx?Sd=47-hm{(<{&Z09u&C+#4O(;p0jbO*4#usawIknQk; z4@TSJ#2u=pgOuTRjSsP-XJ>d%k?H2VrrXkGx_&0;qu1Q7Kl|4&>#KLPv=a@~p&spGeNniAT-`Vvn*ha1k#|FqC(GcR~D%b#4RreykI~GNALX0N?4vt2K5L<#ri@G z(hZl=d2IdP{OYsyrk9?tr!UL3s=Gs{b9^ro105s&BcIkTo!%_3bQJWCLJ-uFU+ff&^2nsNV7Xg_Mk3=`BMivXjId&alg{a-a zlZb`J;r1`I7rGrcfWrsaU)UgSp*=|VXxfAN26Zg-58Ov;yUYXSJy_fz&%!iz8~ckJ zgzalP{XyV9J{S&?wI8)_eGk{)FXhPJhpO)&B`2J--!(m>UZ^V_8j-Rgl_~e+Ra4)b zlPIlKEx8A=LqX{Ca)ml1_(zp@gmn1_@|Q4ou#FQEgj z0V?iSg@Tvw`Msb(iS@U*r5d3SRB4p(*FSfi{@@p1rXPIHIXb7-(z(fu&T4PhImxVE zaLSl|%duzDyp<_(+YNsV#KAn3GP@}KOW_XjCs@*{ouh<|!|`uh9t zzklNa%Q%4|n9(OtYj!uq)2vjDfs%N@#2tP~ETf3G2#>&>5M&73TM4@daM-~85SwjB z0-Wbyct}3#c|^mY;eh24cQD!!bUKZ(Z#st=`-VTn4-F3qn=kv3;NQU%zT@cP zgB$2`JB}0wY}=rXhp-P-@4?D11JieSxu&X`@)kQHx71-)94PmhP}9a%qQC#tSMpbI#<1L` zyBlfHlg`>8FAhnyJKK>u8jVKv^{;<@#|<~!;DeYWEoRZ=dn9;vd^I*$ic3EJGhzNN zz8EYXGe#7$L|B+&MRPFaaIm8E3>L0P_ecSMe6?}+-_N{kc{~@x|-PJ*H zsQibD-pz8YTA^J=u3BQ)?dBvllr^= zxLUVzh?%34J1A8JF2NG=$K8LT6oQNd+rXkUzwucZ8z?gwQ58!S3xX;^!IKPK2ETF4 zo0J`EpoC`VigO4x(2N(JUDNOU)P?%ppM0Hu^5tjgjE3a9d(=DilYse(MwgO|vc-O1 zswgi6iDpR%efh&({#v6-Vvez?LZoj%MX2Oz`}vM z!HQ!dL)gM!f(963@{KS-2e5yD{e=zU2KFG$v9b@PWDdovK|2m)AF5r4s{c^&hbsS2 z@rP>PqaA-J`X0^r*tU==>OIe7#{9~nrS&M-synA4?#!pFR1bz>ZK_S^mYGB!xZ<1o zv-f;lAGz{AZDm_J6EgKs{5_O@g#^VYMYz@|+zaQFx#0z}mAT|fq{<4v?2#f-57FBt zFGWQi)$0He0c&BOf?F>fagBiw=Mh%!7(R3LZWWJXZPFIj75-7JW>xpPCk}r(wgC#e6(-w zMPBbW=ivorEJ~-Qrlz-S+4A1Q%dz-VC5yia`?R2{fS0S}f>;t71w;_bp zfhX9Zl+y7Yj|A4y;Aq=-G<7@gv98}V91V_^{-epihi(p#S-_5PES_N}EOevIB0vdZ z5e4Zh0RN8v#%`vsZ``VX`OM{d%in%N7ky)^{EL1w=$Kii3Wo9I@=DgnU35>WgoUz| zdBs$#lqkdMs(~68m*<(%h@mU{z8VM`oJHFt}OgC3nZ>nJ2q*zIwf$I-SlfZ++`q>6jxdWZ!JZxqrav~b~ zW(c9EszmqqkA3~!;l&IK_oKnlw*6@8cHU!MziBuc94-AvlfOTfbA~vA5k*q6kgXzu zDz@$RN3G;z{|Zf%)-_ol(>=+suHMLh7lF|b zTlGupr%}w~6zrvAIguu(4Wwh?AuD~C<*;Lfg!=~5o3U%ppk<^H)GeiME$E(>^zWD4 zpeyf~($*r?G<;O(NHwYOwM^;O9V5bz+iDr7<`Xj8Bz7~#8GIEBq>;R%v3yQvu3M=l zkx9I-#c>qI-_hT-YuD$FqKHM8HCc2NAClmN)5%JKL6RWoSRBUtedgIAb1o%V;=p3! zfR&-xEk|&)Y}z{r$XS$P2bGzyQ*xN1a6}Vvf9z!4Y)Dg$aqVE|`Hks9AG`V{z3s2x zug_e)MFkV38-k)jEwB-~Xj~;I*(}ZMbP@6{Ts#>dOAN=k$B?z}pIy+H}-l9)f2 z#JWUsUC@dHlW5@+$QRod7wXg)l>zxk!3^xsIE}$#Fx;BSlD6ChTxRVSy3h z0c6Mv?6~XbS5>LOqM+|ydM|NcadKb;g*Y-lj(dp0S?D8vcqKf>U`e ze-N&PyzCB7=s`7f(~ge*;yoYIU%mHo-OjFmJMy%XHPmA_T~?VlT5?h5l697m;t4J{ z0uRPAJOcM_GYFtehj}&{U3(~Bfs$;qD40)z5{0-pe;wk~1{tW>u0bpz$JA7+RAaYq zBHRpr(a>Mb``p(z>*H76qMgmPx-S_;ag|EBKdzTStxm2Xt^{^7)R|9a(5KzFFqKv? zp5^fbU(J%4GLab5!|-l(T50uYU27&X4aTC5@@Y1k-Mj9(iwSX*1udfNaC8w-dpM+) zWs>Bmd`86(qQkoo!`}s6n7vUg^ewrUII#FQu)i^!Gv@n9;xT+>O~hOX9MAh(aPscb zNRYG^tSF%AUeMO0p_#^nK6KeP^uPYkd-UlmH|icV7$?*$9;5p-+AN+q%C~(*yMp?etcIQCkKh(LzA6r{OTbgC#^994KE7gs1TegQT#r` zneXe81l;K>@3Ky9Yb>j@W|{Oz4TWyEdsCy)xL3#OIR^D6$Dqzfx5`kZT?R;s;&(;9 z$2Uq=kpAGF;bo$2BP%N{X1EPUgQIQx(bVm{$GU#ga5Okt`i~}mpKb}=EdRz!ZVhSy zx)A<4AIGE>3OncCzsV8*Sl-f#-keqxZH%ryt6h(16clr+=eMyU_1USBUh&?PydwJ#G*`Gm~w~#O;lE&z}3snp% zA*>KtVmhj1KrLoe(0?>I+O{7}-OhWg>o*NYgQKPYX!Cm<59nubODN^twr}38Tzs6* zXXNv4to<670lcU%gqw5$rI5~J zcael2i7{>ce5PlBeu$`J4BnOx1;b#RF8i4Lb1;i!rkTVmPV4A#+nU1^_<6P zn8>&mB(3Jh1VKk)s+(`VdFrBzF7mqhNb)~gc^=hr&C*A;g2%e>(X7^E^HSwmO>K_R za%BvrRNbHmf30c6ir=e9224M^B5rYFZ&Ab~iIU~;?Jjp|M}x&)|FNe3Xn60u`=`HT z+JQLE84HYkr^`|99TvfJX{Mc=0Bq;zw9B!x*m;ULr^%Q+JrvYT$h1Wb-QLOcj~8F9 z-+kxD^|c42O>FX~DSeK6elfSi?2-tKi;Y6AvZ~mMF}G6Ex#|Jzr+QVC9e)%^{p0RI z{6d?o^CrQ5C<5ghI*JF*cv&RdeZmV^0N)lW`}uYiMK7l9QeWH2u$`}$1?|FZo_y)L z`*qdbn>87lns(c)l>A#EP3W(@ENH1-OO+I*x@D$TVU8p^S)V$5UQu;c3?5hcw9-b8 zgzSmHbE2C=b8V4vfE`S)rc&Nn$dfM8A4dqTN(F-pN8b#B`@W_35(iEY4p@fmi+JX-w=ZcEny<&)>5$n9 zyhLr5UNnT1DVHIyi7X`RORiw4Nf9Kc1_UmSN(s3#T*uA?s!oAzEOAyZK^Lz*#_htF zrYZD7J8Z>C2yWiqBEk-R`pO4%(bYGqGqg-IwWhYRu!0e!z>r7E;ek&!3Ie1i8<2Q&+Cg2+{R8iioQEIS%#?K{6QLN;%nT zx4Y_edePnMvCUOygkB z9O=6nY{M5GIOnLTSziq#4Q-t5Xg1V!**Cte-}?P`>+&17YkMwjC+i&Hy|kf%-D}SA zwYc*SNv>pmfsNcHl~nLf=MfO{2Hs<8`ZSah3!IAGc@;Mb^D@IqC4u5#g`ddnsPjrB z`A>kl*qm|b25y8ezUq42J2|5ceDE(F76}O{R&r{}h_>XPnl0f=5pva72vEdHYr2fD z9KIOlP@fScmVrf_`R6OJ1}7zFpRx*`Ng>c{B*D_59xHpV+feW^X|q{Zqfv|QnVFfJ zKl7Q-OhwO0^zw*2p_-c&MYF8@Jr733ep;5s6*dup8C^LIHr^$(#DSBI176_t+gz#S zSikS?zY`z(D=29WYu9W`!^6w8wOgvqUG=Tor}by={5So>N3PJOw&de&A6|EnCTWdj z14Wl`9!vrLDa}?GzPOQcwy*qGrNIfemEOC`TZDe!C_oB<)FRb}&|atZ&}b z2lCjmdBBgfslau}xVk!X&GOh26^qk&vNT9@5Zmmht5mONs$h4{6@l$p#xzI#mmDPP zVu^a#bb2&C>`cddhEz->_w2y7+XD*QpLm}0L0!oR!0(YzVlM%~zr+WfY~w%+=0#EE zvHhMS=7T&QI1ZH+KjL<#Ii}m^db&5SX;Q=bz!$I7ue{}*`umSwtDCk;Gm@{+{CZ!|EXu!yDE`_l_v-EMexKg@&Wm*E?JaFbaLg%C zd>t3Y^O3uLdDoAZY_b}4^>~kwNhB0?r6j6jD-Y%9bQT%qF+<-SI<$9IM z-_cj(Nx6q5?B7O`QfIH5&|27=I)*_L0x!D{0kYF~Qmqzq%H!JZJkPJ6n%Z&4A+n#4 z(aDL{s-S#xBjm+03oHv5gPu}>s0sdKdkocf zANulLdVtgGSy6l-PvEXULEIqV2|6we(f|pdxcCTA6s&NN6T-INYQi?+Ljl@bDDGXP zyXLN0eIA8BQ(vyFWnDX2IK)C)Es5h})ydhRT9H^FsR|#otH8{0ORYwzbR~nU_Y6CQlQ>a|ydl>graRX3Cl#Od7hU zs_Tjecj_NM^CkVppZ%Mzy}u*Q3DgTUmBfkpXQAC!gi_G4e+q8~Q1n7Uiv^Et;}0N1 zj-(LGd530F=}WifddFw4(57-!+pC7AQxv;@3NfK2wM6Q|FMohBBXI$*RB7-v;WkOS zB8`ZPw%y0R{l^al<_EF}zAN%aS_i9=_OzaI=Be?A4H=%YBKP7v90uWZ-R@K&^mBAN zz2cTzZn}*KmSen6GGi{ESWUk1gWa^~&ZT8fDiBOe;EMHp$&SCygszx`Hr~zHpL)U* zt|hSkWe)7iheM5yebYbI{^Om#$C@8UTpx^#yZxZS+^92WMwvgU3L=?H%p*nEZ-|&w z+tRwGlay(dkuK95$Kbcl=G=SF=}+GIUVZ%Pd*bi-&mpbbr4$h47QbbVN5}Y~8MR<) z=INjv3W!C^1r)w$Rm$#=J-lw-BE9=FU)2L)x$du;dcc?aR!(8Q9VO+!FBvE<^RLO2 zG6sr2u5!GHa=!U0mn_MrA3fNo$QSqzQ|jrCnNm19~y98?bk8d#ObIq^6TY8Z0y zKHtheO+$1y8nvP<^KTzC;|Uy@?Ax{z!C!P|Zy#bJhKv!y?!0;P=)S`dqF2QHy4a_qa&`tSL|O}e4e&^KE_vqR%jnyLtn%~e;?M@2B{ zQ+Oue@8l~A9Rdf2`)i3hB3J8?Z{t5#y>1B!U(qGDI8tQAp@~wW0u)e7wC7 z4HnKuPzIj2Xc{27}`DNf_{;zYy|*X-!=^_l$M^ zn51$}h6<8cfhY4DIz`z|-~miQzdFj*pzQ6`?CjhX($r-1oP@9B@Y=k%Qf;~K?r#n! zy3YcrqPH8syO6A8hFM4f3#|d1W(f#A__V}_lZOwA^C1@(^nFCX=SZIibBqW7p^q_` zD`lKJ0a=ZNM!6{}G?W?(h@|MK)@!TIy?@3IStZB)jWMky{kGv$D1E(DSTHSC6p)$$TN>WYH%*$`yt}owkr{?OTLSslQYDD^igjVQA zzZuSLk-8AXz#B#71fK?WRQOIu{7G!;QSrli^W1Z&w zB(u`rUqii`++X-o*b)a$1`ad_Lf3XwPPE#B7a=T!ZyOMTK(@9w12Su{Udu%D>}3gP6VXj=QvNs#GUP{eQncwj!uRom5H`LQt@*D06xD z-wUFh(&ZZ~ef+AMG?R_0UD9HIGQVgm^Ih2Ig9l zN^`RsM)^-Po4Rx3y}IJ+>(rr&lAYJWDhYZ_jq9$U4>e3vN)&N{Zf+}M$8Y+szE}Fk z&wX9jZ0%}WS6p@Ubb4<_rzKq#?K#OxhXs#VO zM8?PeR(!;sq^3{?Km1vdJ_8sleP%|l<@FhBR%n6)76+J>aM8{_s=jrwcaL#Lw}?Zl z_#wVlt8>jo7hQDy!SbBwamk6=!1A8k-&^m@-5*zy7EClWPQv)<<5GhizE2v7>YF%u z?eySV0EavHWQ1qS!Emg3axmH)cdY4KRP|e=7DDrB_hTM%q#vcG-QI@THoWCRK}scA zN)_zxJ25+`sdb01wQx%F z3z56FNuU18)w+Jmv~~=w(0xf$lW9YFny4spt!!p;+uZh;Z~j$;zN0;FM;+D=l36!! z`h#mmcMx!r+BGvjwjFsJc~)@(LLlR42%NKSr6!1S5|5GuM-q6kTwvJ2Q-|2UfB1uY zjwy;#c4KeucDp+qcCzB&96KVe94DE+`Kg`Bj(h&7(Q6e$jFO!QqL;veK-s z7CYi^-FBB|dSXW`#m#Sy$8<`bi4nQ~-4Fl3P;?Bp-47d#$G-1K-|2jTA<1Yy+9Wi! zdAg@7uDf2>-FhpFl%}@(>jsTw>Xt*gziOykA6Bh1t5ZWy^%6QtWQPf0VI%le`0K(B zHxFFCx2TpMa=Jv_kb*>Qd!6s31=>8RspB!kxDY2q;!*|a%sEM=p}ec_eC`=)!b`J? z(FUgqW$+k>6j*rCWje&;&uxTI(Z5ykiBEj=#!D}~G(SX^6FS$_vX(rbwWi;x37 zXg09+F^3x4#Cr}{p+&))s1uS{hVSd613@bbXcpKaZIvc!bqnp7n$wk6ZFG#HF62r; zAr>OmAu(&}u;|+J>I?ln{zt-vIFM`hB4e=IZ#HY17-?$l_^^hHIVHucRCT2>{|;=8 zMLMn7L{~w z_|&(y-+k*_*4L}{_Fa=w2&(*3q6i)(4OQ)~QWgOI^*%%FM&yZVc%VfvalPw_C{!}h zjTZY3+rqyDX66zfPz)z8A3PU~g85`S&Iup?TbL(EX9Vw5UZ@umW$cu{^0lk9qYcZ% zLzw0jVZ|H_4)R>}n8H0UDGtYBJtD?smE8Hd+zdr+GNn?ZHR;tCJW+4?h1csxFL;Vx zxvbC=iXGDQ{gQv7aCl5x%DT3MA?-wwr^trFGQ%ep9R2%8WUTw8pt=N#2%MM%xaL%% zjhb(_PSU5vVz8btZ`^)s@sKKkF9|2IXRKc(w)LF1y=tn<_A~T&O?9p#>S(4_oB)oa`0MQWy=ic~*u7G)G-v_sTT!;P zqUx)6wo`-qS=G9~%?t#=q01>RZ z2c{iMIDR<5qC*G6@k8l}Ny$9#E9?qoR>!U*v`gGp{Be;j7TE~hiXDBI``c-R`&1ru z@mH=8>XX?f1r)73&&VqulZ%=8s7oibI&<1}CuxmEe4;L<607L|01yC4L_t)GlXj=4 z!i#{URIS(1GH7|ia_Q$^cbF^fYk#_-o>$Kv8+$r~d9wI$JmX!|BkD&xRo`~dvt z60ILo^dv8?E!+|6{^WXNctpF{Azymk4Z44G(Ldr(sDgOjf}<(EHAPY#oMcD<)H zNR8zz4*Yqb5{17d)HE6DQp(1HG89qLv`Pbo?`y>2*ha#25UK%~U&i7;x8(U;oQfv+k!K z-%QH1%N`?T!g&B8fMmqMmBbGl_3#^-4?B6dwA9ii4m=zVpb6)-@1E~m_w)ONEVXpD z;%DcqG*w$c+qtv#Zof*Ky8FScgvqJ;nfy*OzlAQ|J3NN^#gV+NM*?ZW)KA!RE2@;7 zGJCYA3uu`jmk8uU{PCeuZ1VLubomdxaD#s3`@Ta@n@G6tFSI`CXq+9qHwXPp0V`4e zDJ2wqof`TrlX}Xib8rgKPj&LW-F_HtCWlHR*b^{e826gtOoN4E?Cp|t7#-PDU48Y{ z_mpM1`N*=LSh)tHauKxZ5g_rVuRM6oyMOz8t8E+q{;Zn1LwQH?VCpfwnV0cHeh4JB znfeJU^}wLaYVrI076d&8WpJ36nymb52r+R?x2S<2f(bC!4A>72(Y_kO>|jXCLI=a5 z=G`H9bKMfA%~qy$y%xlS7b^$!tY<^Q6yhxJE4 z`$GNZ557dNe)4JT_~(>$W@BEZHKtX723qDk>`Eu_nm=Q{;+EaSglh4+mPlAFJfR5}5Ar!aWcH8?dJ;}eHKj0oCdf+^1?CSP!edRZ{ zZoKhtA2*!##I27BDwA{nZceM2%B7XuM2g9Q0AMHEpHXP4o9JGH?Xza=aYN+1?1-7TJ6ZPGd zYFaoyQi*g5L2c&Kx9`}fn>WtLJ8Oq&!Q=V1z>Aamc-s_y9W|2OB|xDJsEdl4+iv{5k=Cx;hg&h?d{W8)zFjdO4Qv|}&^=Bl7M^2|lM|2deFG(PQN^{hQ$(M+1Vw@>Pt8}CrbblR=R ztprfP6vGiXx-(W(k~cbbzZ}2YbJUI!W#30lB@2}jzo0_#sg$S+Swvg_$v`&00L&}v zk($)#mO6`l!q2?&bp6-Yy+E%#ZCFn(cj#%!tWGIgQlN45VRdU`5=vh^(WoG?k-&9w z8^%E74?GVj{PCpF6HZ&B6{DgL1lQ-;6R-`eXsqyKA0*LxpqKwy50sOWlUomz=41;$ zILA(KZp?i4n}7V^jaUERsm07q%gdQwx#K~tDLYz?2F|)IS+R5FC$B(NmJ-KLgI&Ib zTnIt7moO0SOZLe$76J>70T#Bq&|qHJHu~eDpSDn6@jEQ2n>BRZjkhB536>uuJM+pe z*4f%iv3vgQ9pYq<47}5f7|_RjuX4)9=50evT!c8(=+joJf#M&=GeM#ko!QWvU;8}0 z;RR37X<g(M$ljLN$!dDL)SlMbF_gdDLZVJqQ>BuTl$@A$HC_ukZS_R| zKEKjlr!9RJ!LNXeI0hMxgBwm~t1GU!;zI{db#lcfCs%V1(Av8%ZQuQ=zx(IguDR^{ zn%(I?T#=TWv)){}j&1((My6WE!0fUJXm^ysv9!hkAc7~i@H#+|izWC_N_DZcV~NgV z!vWvB8vC!E$zlP$Phu0ACa_A_eyM(Nv6 z2iS-6pa%K2?GvB)#L}ns7jP+A;6CAppwMRqy$u-}&Y>SH7^`oBQLe>U_C9 zy=!V2=S($@pVaHbuaS(Wsr>aM?^Hqv3gO6cD4Iez^0GrXbl#(_|4{i8XgC-`I5dqR z95~IP>JQ<-c|%x=3*q2AI23;eeH%g$6QPd;F>TC;g%IR)s74ueG^lNd%~|j_hIRe7 zzTIC2Ft_BZG#&i0!0(IygQq+E*o2dYK6>igl@|fH(KZy5vm?z>LZvbm{22tGu86JF zVey}rsjARaRU20s>KtTLQC6G^D}Lt1r|RuLaiM|HKd+nEz^`PUgpQ zmHti{6A4&5F`^aYf`5B6rNCTU?Vd_yr; ztSje=^+jvH_J;ZJ1KFpP?P7h^Dh9UQ3*oYlXRL;F zKPTN0VM9Kb9}SMQ-iMhlj!p7BY#S z`83>Z7c0t{VkLgtt8uUDO%?0wRetNYZ)mq#T%re5sTT}PPnHoVRmryEV;5Q!Wo*|Y zC%m{%j^*#sA=V{P$+#k8K3+oMEI?5dN=+~56lJ{g4^W&yTt+&74XxR$boQw9o~5AIOgB2l=p__93ABbT_X3 z{d6O^=bGP3BdGtLy^-DXjkg^xYWH6Mwu9kN+;R`x|dth;Yw!zqc3ey7u?O z0g&Hw?b{g}~VuloJ!u4{f@8?XMoeB(90S8TlY zZC&i{-PiwqmpRd8eiV0K_lNb3*ZyI0|BY|`_Se4ji?`i&>*YDqv0&GXr3B4e!@)8@ z@`*sOxN=Am#XoW%RY8KIGA>iGoK%W;$ga<@pCC*kx$cEP2?^BLtvjvJg?7=t?5nEmRxm|zJI=09Cg=OKq%uRpi{^n z0a(NJ;;F16Ru(;tmxV?vmLsIwFHNp@FU->}Q#J3lGlFuU@tB&TE!7h>d(u#^tJl8h z{CFBvOQ8xHdmy*7l0pgnRmSE%0q|D+#|tmRK7U1T;KpBFeDTG1Uvtehl#Xx7L=M2k zXfM4Eg99EsH-7q`Hr;Z`dq2DJ%OC!myTAC}Kf33VfBU`rzVNSayYCDC^0xaf{@1r+ zzxBRL-t(6GzWC2?v3<`M{^hL>Kad^M5AxaGA7c5g!}#~N-S-7>$$NkAz6k0!4GZx9 zv-ckWl3n$gDE^%rs;aBQ^aPDYC?JFoNCF|E5F#0~i*djt`DWykPUz@9o-tPV05T1i=Cp859sm2vCkA&1iBC9V_4TzVFp{C zzTZ7L{q8yE`<-)cRUf?l?|)~*;A?;Py9ZYh`|tR>-`z{>zw09(I9D9J<0Bt9Yn;zE zcJ+_LcmDnFbmPeFANlP$xa%K&>&Rlb;~(CC~4vFcA$zEW?jp-skr%=%~exn7ZhGA5769c+--LEgvJ zTY&F-&5QB#Kk^p5_TnP0O(t+H?7F!2af=WurI&U8t!e;6^1MCDw z+7A6vD^u1?ZJ5_A`Xc2~i%*#da&tQ$9eWf-$)Q7sJ}Q5QSqZS`%sQOSNx(_KNno`k z@UP$d;~yc9W%?FZu^7UVpDM%2U&e(EO{K!zT4p3L`Ea2Q3p#w_^6kTT!;P2X*M9oV z_{HzN5ijTV|MN+LmlYTq7;GLa;Bl}$v zKakQQ!>}C!qs&~Ai5!x-;CbG`fA{bH-GlOTn3cdBna+AU+xnA$Ymt+{1uucDS&u%! zg&Ug9CJKcDxTlM?{1N$xqyjd=r-c`75O>)Z{q#HjKk%9z_>b@VUcCLf=i%~r4A-Fo zzc$VlYl-}xCjlpc)sw(){N``|oyYmQ5QMA*35@p(`Rd1=?S<@26GTg$cNNq^pH19M z&zEz{|3AL-#rX9fe?4A3*u)F{2$xG!C^41}xETjrtwV(G6`?Kc3YCEhcL&fW`~oY} zf!`*1&=mO#op^a=M6W{bTD3ddG#V$|u}E<7*3HP9$%e2(#u&QiQIuf-+tgk2&I+F^ zdx|K7OvSqY{`>Ef=`dFU^CUVq(7D#X1Y8T91TG{A96qpTFIR5+4QKT@isn|$PWW@Z z)`W|zShA5_#fry$wnGyyo5<~ZwxE$HbAR=Yh!Y2uJWxw#U&t# zZz>sFJQ~=|2V>N(yke4(U|qA`)+v8^Ndb}v`;839O?&$J&wt*1Ki^7Z?oB;pu8(s$ z2{;Kj39OO?9((MuXAd3N|E!AF^4N~f);_vFlntmL2!^Jdiq~1$ z%WjN(86!=P?c2AH8dG-$&Mpb8?o(F{94Ip&qfkKQ9Peym1LxAU>ogP_5b2~-iRN${!-jf zsNluX1a|mM3~fo;xCExOCCnc zu&n?;B5)ek%__rMu=q!^FviBTFMt|jb_YSQckvV(H-x=z<2K&4+)2Pm;KGx@M?U)T z|LXbvw6?@87O7(U{jEhpSIb*ds?aXqa=&V3w&U|5fSm<}`Qx6dF`ypC1$BYM& zzrcXm>jKcAhK)ffY2k|PBjBb6f_CjXq`&yKj@k%zj|?Jw-)H-ow$W(V7eJqR=9we6 z-g>Ls-lt6FU%BMw`#QIizycC*UQPnfg#f;!RrZAG$fTYfIe{T6}*MLd` zSr5=}+D8dM!q+Ofg$wU9B&COS9%7we`I4)sp1_iR=ezeaHI{N>=;DsR{BLu3o`(+M zGX_ef5=i_RcZ??JR!SP~>Xv}l?QnJ{0Ve?`feSza*&5~6sU8NHFld@q<0dbU}z$1Vwhkze_%~t%&x4i=IyzX+m z#58ePR>!qLf~$+bHm>W@ssjxv0!$q!N9M1KWwlJA7#8xn5Kv4Lj1ClV?Ue;|p0?h9 z0MG1g{U{e}^44XgOP2>7m(*%CYkE`wGeC7}LwrmypH5;$uKxQI>y z=U)PU{KtR1t6tZu>#$q6X?vg7Apbl6C9YzQX0~iuH7N)55@pLB1|fWpzDbNS{a<%g z3IF2l*W+j2`YLY!d$>5OqF6bOP0cA>;U~DL7yzLMii(i>0DcnU!n#;XcwFsYx_J~s zY^YD7PpJfWs<^gu64qTzPw>KQ3p_SN07UfVa@m^N3DOTb(LC`7fA9y7Gm^U&kU%cE z1p=IxlYo3s{)(SS5>LxdM$vE={ou zp&eactz)zFE?$S!M27k=p89WoT;_w#M{G!met<>{lmNVB82D#5ZN=~W-1p#}uYM6; zR7!D~sbdEk7^t2GDyLD%B56zjSNPD!kVM<|63Z0iy?RJ7U<{sr$u_&SKgjyAm3ejO z4u>#nu|RPB`_l&mk{v_jC&znBO`;j;xZqBtrQg!+crs%9(rq&M(0u}C=a<6Lr9Xm zcWA{gf8Y1BKl-CTnv&gNVF{>LEga%}odnLi1YCwr0%tFQKmYSTuT;h-Z% zufos1?Ui^z(88tME7>gN!B9gm%md1h$^*CgElKMwe~()U_NRTB0aYyhqn?p8!9{6| zQ8KYo!IrJGLS8mZZr5-7mwB8Z)8@%K0tUYE;b)mOL3anrZ;;#huf1{;2JEv0A8Q#I z>zDG_Bh&8<=xc`_pk%BacLO|G(d)Bo*RF%N-g@idUU4>hn77dd;M%|X5^yze5?D+E zm3rmzIBq_ZMNJ^^W}}g7V!hox>$CQ4Y?EcRj;R)P>@qEpN(KUKRM5{8Ig*&ct^6Qr zptI_K(@VGDm;c4v@%HO4$BPOrydbS(YgW$_>c?zS1AuhejDQy9>oea{5e0_nhkQ~J zcHIP|a{4o-U50}UZ6ObVVI=-CcOME_#-~!6)@(Na~Q45 zfh{~H*iOY^OWFkVf*?fj1j(Kr_VTz&hgRvV11u7V@Ds%m6pNJ`rIIpOEMmvS7jXp- zq>Rf;p)=@pd?SjtAlY}~=?(rkj=wUKfwL?q0g8V?f9L5Wu*wo}#XAWA`s&qZKmYlE z%t#BhMjc@gl4=YZ%?5mKNzW&W4JR`SK;%d2MNCWP^TsRYwtPTh)e8I)&hkHW!xsG8 zcfJX4zmBW^VuY)+8cNM+KwlTAO<{a`jG{}ixme}x_LGS6%))l&&npkH^x9K{xA&F&wcK5Pn=c4 z4IIhaz-@O;cM@RbhgdM*&>j7qS*~#vgNQzRq*~3BvwYKe`#qULIHYEn`sOgUa{eRf`M- zj})U7zTU*A0ss8>6U;1lT)>VljEE-(qW>TEm-?B2aQo|>xMCJG4sf+e(+3>S)^Hl8@Ot zyCIfu#iJpGWk4I{g#={M7y~peqSxDBz6t-!58s4$-f%f?7>w~Ezk%VXhDxJ?ioPQs zGXe7xA#Wk+kJ?pzN<#NAMv`qADh0}$`PnUenwIQoqDv8wvqiG^sgQvCGZ5)BL4iu! zu%F=t+}dX`^ntB6+MjbFeQxK&W1R|xLbh+;zQ1l~;fx*|h2a)@iG;50cP|AD0sG;~-7f+rK&uto z-TV;%uh;_o?Au?0pMJx&c-_S%T#{DsLNCGA66H#wMiikG(k`-Qd|fT0yZl5Og7uK6 z#WbCH9P6|SM1u>mwS_!VN)T)C9Fdy7gilc-!Nb*Mc3+`*1nf9ER?aD&F1v4 z{_3wjM60{{NI)|06U7BP30&wBaP?d768P_b`_V5|YU#sdH&~wIVsyQ?`E1%}ObMw~ zelmb7a)X#_ZLa>?tgoO(0{Q}eAwXcb<({^<>Th5hx9xxEwa>@Df8Q2ro_1ey_7*a*%vq~wU%jnid?&qs88;5b*Au{Y1KP~k*MmcU` zlb>O8(O?_3kAVK2oKh(pbn7}>()WEIBz*8Zf8W5sz#gS_=q-V{Pp5ZW7wRP7B;X{l zDiZk2XFj&?+Ydf=uU=Nu*Sb2p%jhu1s?=(A3(ZLHF_D@AE20%Ri61S%G>Hb$vicDh z`PNJTip#+0D}JdDFEh}0U-39L5> zxc00s2^=4vxPyzq%p*4>F(>`?)x0IOMtm#eiOH6-82ON#?fO2J&kW=XXxgU`#oAE| zev*Rpj%!AN_uPC5{?{LRJ%0N7%W+xrG{dSuk@1rlwt(9WM&-b8mPNe)-MU<9mu# zTva)S(WHipHw~l8bN-Xn8j_@mErSF0XL^;V(6Z&u5@ zzWwdy@u~VFkzV-Ha$j`Np7hsho0eN|P2hs^5kW#UnvuvY$l&&zoxTk0kUp*8A;1h0 zC6*kyY!10{=TSReeF^a1TQ0&c{NT-a$JJYLMK+1BHi3~evgiHOwlFq5rIc+bcdu>F zjRFfwnP<%H8Sr@xQDI2a1Y3v8*ggp8CjyL(Dz(L0mUL^i;`)a_{9*T>_0Cdy-dV$<*LF@{lQDa_kHl?gYW(Q8^ibg{wu@x{^wVPKlPzkhd=qB zUlYFfL$9^?sXw?WTnL?Tne)O&e)2=FI|D!QdpC{r!h3)BwPlt&gP-`_SC{95^(%Md zeIIybxgUPwKfj`Uju?FJ2W~toNOp_iZ1d<9Z?U{P{{Q>~Hw>;6e)6|pX7iT02=J31 zd>L5&98-SXQ25z`?Ls#w8+5>Dh;Hz?qXYH{bc6jScmMXQVC`Mzd)s#T|HS)WjSl|V zZ@&ibe*bIn6Tf{E{@MFqNB`I3J->Ym-u;_zpx+xU-t+!9S@S1;`;FHBUH``|1Mm8k zTS`CrOK&K>>zCd%^drCgmeP;@;#-3s`S;%o;m7~uTk!5*zIpSH{qha3dh1W$_~dw6 znFt6rO;g`Pd8(Xh?-PgCi^p?A}UVHPMo3DHQ9h4xyXEV>u;tp(45W zUga#Bce~uJFT3R)VMTELo9?yw%Dnzf_iUXtWw+RV-A(swf9dP*p?PoHyoYw--WgNj zees5SZ2D_&{^oYJZF}3?@zOVbW5-KxA!zbh?YQBVyLWUeR;=gzyHfGcG`kur(d|_wQu|U^I!b~w_Wzy zANa>Bh)Zw$-p}9g+8_Gr3tsW&doFs>jbD58*^{pu&wv_$I_H1V32htoO3AZv8?uu_ zO^!Jdp&zv)dMQq-y?`0gEz-BZa47`hX6WsEeYc;vBCey17#CA__{q0ij{opeZ^N5k zuocfsD!7!(^t3j`yiyWBGg;so;&Uo7pGar^nSmcC81Mr;|9O|f#9&Cu8-b;N;y6VR z_+MiVERA<}^_74l{RKtzesA=BzxU49edyo(*>&&xPag|zdgm9P8GhmKe>>iE!)~+b zimBr0MR7PVn)!v11cl+$6ov$N#i0&7zceJ!J=hDeR~+m{CvMX(4lab0@!^*SWj6hg zal*kW@~B(U2q(40MCp*bv2bNLdDqlX0IL6k|5nOr22*N-nD@J zTMni}J{B_IRwe4#nl-S6fKoCqaGSqEt>FyT-A-c2ui+k5`DeD!N@9WQRX zWjY%uCMX(dy6_D9a!h1^=OOX}#5|vxPJkK@trAX7HTtzUfme)=j#=lR>~?qjyG_{_ z!b0ifC#b9rY+B>lGWC1d^WCaj(yrq|=KT2c-OEisKfn3z)y}_P`Oj6jo~NGAIhpN# zr#jkn3%J!^B=f~gn~wcssiw`B{cka|SH3=pXgiuDi#kUk$5!W6Y!Xr-qkme5pSA3m zJBR{~m;p=_NAbwBhq>tt*k5;L%9NCuq~JXVy>bh)1oN^1^pvv$I(ab>@2hvIeAPY` zRa&Tiw!R|HloL$SVD)0eB+Vup$yo?ZdTU#o0YGNJK!DEx3sQTsAIGd^Ks zO?vWT@ocLs?fTFv$?R!lwcT~EN~gQdQUZL8XBl&SM)RKk3xD~FpISh2iSh^djl%j&nBiRA=5>ZLe-q_W7{U zGL9lyoGB@Aa#&e;UC=EQ@>CWXGARe}=-mYp zGdPFkU=XA8LIDzUsob^(O_%~5}TUq{lZrP6i^IyImKlhHCaW&5XE^dwEYA?co z>d!J;+%`DHT~TEc@HpV=OSeM`h2A5`^JhjG)B`LOZ^pk!g(xs_bUl%Iv_A>{zGAL$$#1JYF{uwp@IwTKK># zZh6Pw;7$MPavR6p7L@=W+oECXH{iw}8NL2zKJ>v&&%fp`rXusgv1Vi@qXczo(i z-*GaOsupH2>(6>nDNuM0$t^`lIeM)chGJamJ3O7(3A>g z1VIt-LQET=g$yw4QnpjFqp`!eIp8Dg_~9v3b*Eb#38);r=7|^gT~vcd`k0 zjeGc$&)$U(e&jp2|Je$vOj>UOrl`|*%8?gSLm!F{oa#Waqb(40K8hoB+#S=-fKs~X zktuP;45eftL!`4ApG?lVGHq2*j9M54aN|Y5zxpRv;op4!P59myY{C^`9aoNqC?GF7 zRX(afJ70Rs#b+;@WFV8e0gIYh>iY&@e0i~Xc=Fjg_VTEw?ggl@Pwb~gbBqhP-C614 z#>kEj`9J*2KLYnTLjtqXJtJuSdA#CBe(oK^SH9$@54L1>~PiIvdNa?5N2y0H$3ImQ%LUE~jjzRUWGe)nPeU&AO}X z<RBzIWZaP03xS^&H(ZM! zdCk>$;i!iaQyPKuYzEopJ_q?Q7|f7{!ZJ!DqdTRWU z?S$yrh9T;MTeiIPHE;ek{L`NrWI}g!NkCHVa;{(NH9z;CUt_ji@#o`asJxGRiifD7 z`XzQj6Cg{CJT5;zM9xF{V7Xyu6+>f?aQ zIGc9@XkPI5(8L4Zeg?Z*_Cd=0WdMrvSm*zfV#Rj75%yQSb@pXaxl z&XlwlTR`3e&w6r@WcOe z=!PHNzChL+){D~I0BwKO4_>kPvTHv)5snV-Hv>Rn0KPZd^wcwe=>qtXhHW7`!H%SR z2Ri!~I_{;KdV{$amYT0i=OnNuB*0ZWFgq4i=V4CnITaejdU=hjR!inm!do#Ct}yFC z36tE2dvq6R%?CvM;PyW>X4_+%6kv&oyac0+&%oSr&j@}_JV;h7M{lUBo~nLcY5K>c zHdZ`hLlTng-f7@(zx)s$pUiN)IErII8Jj&|N7BGH=27LU{;_NTN6MFCZ(#>M{JC%A z&+a&YW6WcM;U}pW#0a>1kRV8F2+;s|9uLafBBnqEy&FNo&e9l~8kuy#i`k;gTgXsW z1BGG{;In}#0Rb1-R5bJ`_;~EL{vhKPIgb`a&Qv_8(ExPwW-rCd+fJvRC5@R&iX1b` z7@?U0W8A7ZI#oleuXCnshjw98%F83T@>e}3ys|ll(KlW6y6^qvnS7iD-Ug6?dDHj( z`2R6g7=F{9rZET#K%s=B(ZD8l>d=m|vy}pS8xk8imF8(}x!YQoaPwKEURXkwF3B2| zz(%V!7h`jqO!CQBpmV)*7snpMb2~6jLYel8*m>XtD)c1ZA=7lG@7mIxh$LvvxorBZ z?R9}necZJG>m5b;Dw)#(7u&LPULnb)tpuqbK>u&xlV9J7Z|*vZ`rt)4l@<_D2}(SJ zqKV;=^r{}4W`Glv&0`qAo^%NR{hLqVKmPf>`1p5DVuImSMrouWJjxEt8$K!9FhI%` zk4~UfdKw{Z)}gvE`kYmGLXTX6OhdvB+wkeHu$ZQ5FH=xlLqEfKMnq4OPN3axK>1i7 znB3^Pd*G%3U{cJy>CZ}~OmgHDP>p?5>1JjC^BrXVSEMm^Fp=srVT#xvZY>R5aosOo z`mSGl9V5Am5}^2aU&q(w@A{=T4qSZY`wqncP#gjhcEcpXpr5iIwJ^xe!sD_tC7@18 z_!+1f&mxbg?%hG|v-Eo>pQV~hFF8-S)N(uN@?2K$-l@k@&DE=UUh-1w-AR|{vh;f= zpQV~hFL^d)3Rps(^;y`)cpR?^OGrgc;_*F)u=_aBAsV!)L*M`B&~3-Yf**x181P(q za(;m{A096TB3zcMl`I0*%+AaPX|aT3b>OzUkKxWo4&dol3HuTfHT@;C6Wo8_Pc*y; zn^40RqLh)^(-w{-K8_CVz#U`2AAb2^{Kc0KVm}wcO&(pw2^T-%Flv!Us$^k)0a+9S z`dS>74X?;D>@!K*5@qEUx-#w#5Qe$<49|#^P;ZjGW73Nk%YhIeGXw-c@eD)fT#^kv z#OZpLv;rn$DS+~PY|l}gW?QOYJG5Iw3{x8@vCd^;t17|%(V#XsQQRDiUVYtf;8kzG z1ny&>z`7N~z-xZ^@@roH`VT&KbZThY=hl;&tCf8clk^RIyBeS-O-<5oPY)t_@FP>8 zbw#gUTl)%I(ZXHkYd`|)w~904OS3+k>2o?C=7dcvCwI?6->8v0rv^n7a-SNBWAAtc zkM22UNxw$Uf+&jQV0@7ax;~Z#+HTJhjmTp*w|3BTZFrU zV*KOXyYSh&AH)d~^~k1+0iB&IzP9E$Z|TLn37T~;MaorwNpqa!NG8=U`Ax+Ij0MBE z?fzZ(l@I+R{`O0|agRN*}KL_iXSGN*@D|H_BfwhwJxS33-lY*R{J z$iwGLADVlK%mRG2ITE__^h~FRVe`yW%c*CS>S-B;XSSpUt&ifx50MJ!?{Ttc zuJeW$eR#=JWYV_ExjGP$37nJCIDyX4Rgs89IGGi3nvO3#IF2toxD!XYonP_GI2pA7 zZNb;40B-5$)CsWRsIuJ?JX4>b!sB}$sXGPt=`q4H^Z}BoR~p2Lw21$4*F*Tgt&ifK zBft>~K|k!n%>)Rom=)sO2c`yh1eo)j%kOqk#;go|3WP_1Yj_y(oW>8Hnt-fTxs8M!8L#1Ub%~NI> zyrHe8c+nLTYSBZ}AHbfI6FAufG?`^EHc_TY-`XzhoBf_UtEgZ9^f(_in+aP97*199 z?QY@LZ#;`@YPs52gxE*6uovJKOw~^C%Pdj3FC2uebpLj>Y}iXZV_i0W+w(7ecRk$v!V?@lEk1DQ z#l1p^kmT>hG5jz<%Rc%HB7Onw4w?%@1Ig!Plq2_ZcP9ZSf%7YYWG1_S<1ZhFZ7+>a zfles}gA7+3+3AHThE+*WC#y|7^5nQBOD_75S;9e^DmtbJXtpeIjC`=lpFsb4hV2Lo z0klJbEVSy%2`*{xcyJdUn~X4B+Ju87Z3HPs{1~Hg3s;fMFOM^b^uTTHx$wCAC>Ttz zp+~rjU`hk14V1Bq=k~jekHe)h_Hax5-Y1{MpMK}|U2WjErcf4-fe8}^zj z;q@YhSG_8{>SeF^-lQ-v0G^K_U{@n1D-{fI%j%+13Hmpc6%Gcl+hG+y+P>_CRjisT zdd*2-ZCAKy0G~vn3H#XZB(uf+ZNkSuN$bPMHa%=4bXRJ$|(TH_>`5E|noug#cEL`c`XQ?9NF7*BkkzXfI}e}%^klbv4n@=XB^6tVkM z6=O|U(gzZ>7@82eNc9X5*~umV20(73WjR;7exi1jDbsq9jF8bs(ENiG5d*m36wTXu z+B5u=2h^s?`Wm!~9!|0@UwC8;w{rzP9h5PaFcHalgo%Z1g&|D0GSqmiQ9%Haytc35 zF&^8UWHAKEKu9##iRjhh83tt`tbz1^LtYtAhnw+aGJ-GdJdVHk{CDxCM;kaw;Z+z- zB&#+>Xfj1aAGs(_&VMSA9`r}MO`IE5j$KSK0|hd~uNWkV-zvvmC#7^?3vocs30AB*-baT%f{cJH*Y<*yY#|qu895ObuD%h+dg$FYng3s zK5@w14IAk!Zc9mX7TLNeP68_+fwhyR##OJ{dYGBuZ8RVC6lhR+KT(PB=ePIu=34#ya0aY=n{sFFQ5$LuCzM#3HV$G(e_ncl#5k*0Im94Y3kME z?4Nff+i=$WiLA3`Uvu>}Z;N0GwXEHJI5_yo*~%21mp{#z*?68SCu6m-HkPx zc;Km>T>AkLCwfh6KHFvp?Pk;9#rc3MRJ4hR9_Q`iT9Ty#GL3Sza}HfxX(AW^cc_L`YSlJ2 z5yP`v`ww8HjY`O~NdXUyweWv^?DP1m&pv{Oj{>SEtBF)^>TAm)jzO&j zYPaCAj$D8vP1$y~&3N)zvOYz#)w!ti{EjLrz31v(@|0N`!6WI%d_qZ32!}4(cFO{ZHiXxiQeXScHgRT#y|94D=YYx9 zV-wf@Lvk%}5;z|c7~$|9BVo0|GEVZq{HX(Dc5~O~WN)~VJLJWl^u z{>PA9gp4N3gEe94CT8who!atPZYl6tCgbVFvdo}Ka%?cpQ)9s2e)b_8n21pI2T|d9 z{gEb98?CB6#%NzEM_}9RIljD^uZ*Q)8>>^|3LmT)e3q4XI7K<0;%dJ(vI7VF&G^dB zWB8L#+>Tqnc?73etqRMmq$Ko03DCC+q6pAd1{-RW1;gdU%!i5WQ=!Q?;GCRM{+S}v zgh0PebR&z6mm-&EMtOSN!2urKxeL`eLxb^KR8jyRu=!w-Plke(888WhDV`BfVelst z^YTR!tb1=hqV?6rZSVZmp?Z?~smIQcngtuD?H{W#FBs}Podhph+gV4P%niX4i7gsOyRRG$rH9@e`}X4bxhn|3>!R4&TgDjyYbay1N(`45(X zpn#LpO&sHjzY>n(K(m04e)ZeYTfA6HS09S zv;ItO5P10H^A}v&T+wC!~Nn>pNu>JI{~7U6;yY3GL^?b9@`7 zZ%L&=fW+tFN@?(U)^h{i7LwSS7DG8`U6ci(Uy0dy)uX6ULmkc{hLsUg!p`nwV&@S(;XDOTn!p- zHel}vf)bc&$$`ykQPO|sX1aDvmqFiPTv>=&B<>!62^Bd#Aw{o+4|{f}V}d8gU8x{= z)6B4kv+W0E+t)+IQG|7YU0|9;tDOg?-b1FD}sFoC>R3axd%AfQiDxE#|7kp26=p(v4YZL z?QTf@?A=f8!~L1~-V(f3B#GPd0_$B(OM`2c8#`%rSOmRWr7M~b*S?Q1LSIh~#&kG< zbD=%x2sv<>W^~}Fh?v&?l3Cbik*!(M1Xt3@p$=PVQ3(A7h-B>w`*phK_a2(;h0t6H z@criqD)hWd{7=&|*$s|pp#@Ner# zXY9La3G?Jxw=iP!vR6K+HIJCN6n=`DjF@5^SJj2-=KGsj(g7MsilfmNEt5eOI>@o2 zRRsI3pTllSK$7}Bq2%FrYnT1-;HUI(^Jhvl&iJ|ITVwboD8WoHO9PZs>c2-TE*)>o z+00LV1Fs4Ge)LI-x94@H|}; z-$m$84VRFcEF7RGm*C@=Jt*M~Tf;?*1GHutWP6=PS(1Y$cK2r%_YUy*5v{{-K5tR8 z5+$>aEI(t=bI))^Gu7JjeHNy5?SH2}ui_Y} z2VNb;i9`g3RSx3dU)--4y7&o)Spb@BGx@}sAJLWTnk~><*WX^~16qbYCgyRbiCvW{vSgI2JkZzezVycc!hKhYm)UZTXpk|i3+dMB zw4C&{Y1@46wD8Rr!~j?_=8Rz4sYSUy!=8-RG}Y-?Uk+{Cq$-Q+-K6AL$YK%NE8Mpx zy@rlEmXVtKtzQrU4>e`CdrH2Tc>%i+NYo_6T zs_NTkfd0Do*t^gL`+8T*TjA!JND^$f#?Z%6_bT?-edIujy|c`m1o&P}X1oF8F|t}8 zJZS&fmm?g_W`sj&7F!d;@;%9+R3vuYX7~_~k(X7j8sZE?bU?Eck2r{*Tugh`BSu)B zfGBH)k7IFK+#77NDPWbWl3FRdt8s)vO<4omAH0%XN>!#HYS*qlU>Rl7$1-uB5wH6_ zDg;0OF#F;6{fmTl9P5QJg(^=<&SKyy7Lrk*cED?357!=+J7Wm78537+#3R3%s;#xhz$P)#*5w|0>}x9Tu7p4x!r z1~y#d<&=!FukFud{_9J%7&i=dA$`0+fG^?2?)#s^ql$1_DfR2TZQ<>#F&A{Xgrw8nXFWZPnEa6cY>R@b%>EnbcV z7MJC1v<%M?VD;D3v9G_uXoUqG2Qro+ zPif#yQWsv#zhdC2XUAPY+LaK~fC&)Q3*QdC1K{~+g%VTxMaE}}ADAZar&Evv%FD&- ze+ymI{mxAj)^L+4_>zEbYPQR=C?|g&>^`;N@hK6^s%K}*K5^pmdW>Rc?&3VT{O^mi z0q#EzIxoIVessWGX#V@JwzY3Q(&q}7u_TE)SR$7(VhA8}+Vcl^ynx1dgmudVUY+t- z9gVmi3hJc#QR?$L9%O_p&`yvmSXbev-u8XwsJ)Ke2!s{MMnr6!$Rw){pPK@!76`)J z19@>tLF7dS+3kvNWe17&ezcxGsANkHczf$fvoqJP@QQ&1LE{8EUDD-6B}L*UI)3FD zM?9PY8Utlor~r5YXh98dzYny^dlTuS zSkY@r3$1iEQXw_q06}TRLb;;}YE5!QmVUmpL@M(X?S7oY{OR@xXmhB{cWd`4cACa` z5jZ3TyO%5uQ!v}{__ptZVhPn0mVdtYs+Z5QEvZM%xuEIGb?DL0TFve6vfsD=DAxD* zHRy9xQ}2J4hF{C(ZQSuz=lX8oCY)8DQftWn50jO{&gN)*I-K`UTDwk-GbT@}r>E^d z*h^lxuE92XjZs-x{p=TW27H1JmwO{jBMAnv)J87A&x+09{+=!q-^c3@Cknd4y`EcRC);>|RWDKg>>%er~L)zx3<2WIz z4mgKIK--(TobOLMbCX0?F**eBEXRDz-M`{Vue*j{kln zrRvz3j?MD2$DUpKez3b8oyJV3I7P~FyY;Iu=uy=J#CS)pW` zWe}6?zf69TU6jPG`3@@OYY27iXE3TS#pqXI&&qTDDbrkUg3Zd>$f#|aDALSkchS=o z>RERe8hn>M@J((=^m?oc=(|m+-dH>A*?bRF!-+I>$U&|YShsoPUzfSvRfB%mhvj`-1jv>CHwT=A{s3I=@?T@7Se_8+;S#rCZ zft=2?h8*Z(V|Ii_l+56w0qCOMvQieBqQ)B3ii6LoDUTJ2t-L8u?U03rl8dydhYd=A z&rZ{8pYR7u@4G8h&mxMNlF=wo5!9SkGI)YCU z3H%zY{$M=MNcwui+pXB(G;08os6cZAW2Nprs)^unYA3YL6t>>#>m8}+vAaDK9xc`1 zt!8ARTY`$#iEh>_O2!(P0Lk4~RS0g9qyk|SQw=K=)(d(Gv)*|nduGhsAAxUSi$-r_1=LvDweEft~syQt_tRWQ_-97Hy*89Y` z(znbR+V{Af57Xs?e2^6FzuLGauzx$R>-X z*wBNr08!d;Uk5=+zzxn5!PeV(!6Wn;$-LX=|Hfn?#(0AXT@3?>^6fDPKc&9{kpK?q(%&&;zkMTVxUsEM`Oo-1PsJ|3+*JM19 zUP7wYV~#h^@*Y4t^F>6h82F4E+*&*}{inn5K)%wAM;Dq4{d@^t9rFHCxpT_#$lZSz z|DP_%6aI8jBu5e_4`lzs(#XOKCN?j-hhJBwwctcUp_FlC(;f&QCeq#pj%{!V7$QVh zDuUUr%#YQ6y(eC3g9@EU$9qZUib5kYi93HvekWDZLdIh+n<)u%>3o!guPcG8XKhji~*#^3?Bcf;J| zU&0{?;EvJx#yZU~={eb@I6tKovgqgrmLi)P(tBF(Z_JF2I&vaQjOE%pKw;8&qvDkp z?{Gy7B_9*RaUG*R9B$NO6z}!W!+jrF*q!)#o6t091~_fax+@z-M2nk04S<{CQ;D80 z_HA=45gyg(^;0Bs3>!!t8}B~OU2FQPE{gksGi)*S4!o?%;XbG8c9@RdH?Tl_5m?+J zv%7L_^)z!Q2`D%)U~TGRgJ0{|YBn+N>gHYLW#{3o&L+S*U)=JiXY@%7Box*+M*;?B zW<#D+gjhTih%lNzbijq)oq+>0EfQJqOg$)b8@#{opPmia+O-qk?UVX5`KnN|A@bTy zb~-}L^|1)%O&^SSBA&R#Scpn88Q1^w5UlC~xJHt_f?%v@ z3^H}u1wwh?s|(Qe+Y>)4BEduxD?+tm59gsUS6()Gu69Ear_D5PCSX^E97-BBLPnK| zDDd5*{(H#ou|FsLfq}FFlJlhb*yNYoU|nayE(DoPP{$SzW(_IFNA9&jod8DR#$qVy z(m}%C`MLHAS;zF(ki}Qfr}CwC<9SW7-d^_v@0g-KfnvU>=8)g=>=%M-c3C>!2kKXx zhAvOPi`(z?eH^s(@nI@b2b$VYf$C6h$^3*SzI>7dAjwTkF$I7hE|i5*mlFjG-d#iP zda&$fJAQ8K0fnlGEz=)#m+lW*FD1>W=HJ}1>YpIfJI8ct^+?<52Keec{apQ-6e^}T z+n_bi=fx?s<7#N9BK8I7R3BjVUOvx)m9W>X@*}hY2Wk|XH#j(>>?s(AUM9@`|LS_9 z>V#Rtnh!C8^36!6+i zbnsgmFd_xesgLCL%BxX%d+T5jE;jhHnO1T7BeV;KWGi=2@ECGs*@keeC?)0=!~7s{ zlh$gA0IxWe%MzX-H`lGDpM3b6kg!$`x4b#_BRpF%juDMKdh0P?+f)MVm@Aco4MWFhD0?T}g$8Q!j{RXwus>-knZW+o5NwAx3SC18iDns zc{CvPu$@Mbo6an|S3v;hWsB2;72D;-yxbQi{h_q}v43LS?z$8pN%@gV;$bP%B*V~Q z30%u`cq{49#;IWQ;bOCL)+6Tm?BagT8v278`jHLhV%@$bu*!dY<5RY%zge&)j3Mfq zgRN*_{$hnUl8{zhNTCVClXfdM!K?3&>6|p7F~}~6KQ}bi{=*~jqRF&}RzEy2m9h~j zhEiVQ*6r?AlpYa92*@jHO=RzLV4}g#1G+m&NO-Mz+UVN?AWG>NuOn%E|iLMv<1oQRh{p`y#74qj7S}Bh76VWstPE6KnaX_bO+v~=WD+1?l6%lDX_{_^# z_;-G#{};36qy}|{0Qt$kczHv9MCTL}edjk;rd-A?BeWZprTI4~=V_`;wB)qkdnyp) znFm1sLn~3<*p>ukKzxf{d+^_apY(0cR``|DWvM7`C|lcXMxF0+TXE~V&9>$sBZXC!1B9vvBz*7unjumDA z4?})o-sh9LP!WS`!(?L3KD@Vkj-~g`4@vh;{F!1iZk;53pZ{f4gCRI7HryS9kQsRc zUCkqEtzsoM?!^cMSYw0BR1bGxrX~h&qNKbVwP&_vUQe0!=tezYg-fkPJx|q!ooZi_^V9aY*fxW7>j>3n zEfZ_~NzUjNmMv(2V;I@{L=)I7IM7JpA&Dm0dvzNCo8~?ovTW}Xs4m})ZrG!Mwm$>0g)gG`i(Kn$_+kaE+4Vl;IY)htuvp)GD;LK7nBp|%_SR+6P zGOTy+1f_o;#{8M|tqlz1nmJU#?o2u@NY~?}Z>7a3Xgb9@Sc&8(=8ui{eIpX^?hHjY zzzu(N=S@KX9wt!?vXm8qT~K($g;c=&lnsgJ$}pKAMiqK6tui)qXSX44Lo}*BGp)p&H;_6-B%hgd{qQ2n__;&M{sLpr%8)wa zetcE9GoA8L<;SaD$5emylY*-^K8)6AkUn3OEX{;tnml5!Ic~2xjHM{Kh212DIgb`Y zSYilOAdhev80VUPuVU@)O1-AAD#6(A&$4W=VsB$=);0L2*SoZuh!{X@`XzSq~#j&p%Y z=}2KLEZwlXiXdsrAQM8yVF{p-kw^7Nq_EEE5I;?FAVgA7uxKBudsJ2D;NG{2Ni|_!X@D3z;!Xjx*2!l84SO8WBrhKFY&Kg%PCBy?|a(hYN zgWk&-j+RZdZIN}M&KXZ%CME(57?x9tx)kM& z|2P4MoeNGqZn`Y|RU(WYj57tWOkage5{*MYGv_Ay_%$aOJyqcP zM99cwY4s=V9$|C&m6CMHyd$Q?=%~aIEErZun?WWr27Yvk>5j!%p_5V4M#q?!C26LZ zUs%|b92OUV`i40{BB~FJ_rvJwn&9ynjqtajP9Q8iK4wo{HRR`f!HM|B8>!~p?ppge z?QdT1hKPtNwXTo;P6X!?!($cEgyJKYau_b=|I-4NH+Sj0TeC~n#9Hai{0D83U@M8} z&szZbuoyC@kZ67^q8~iNe~z8w2Oc$U%R5Y+h zkk(4Z4Lu{cZ>8=dOh=+Xg0Kpp{_MlY4^Q_xJKxie3^X!!GuA6al0w7r6Q0R-?1aZQ z;AdM2>OHXuU(;$6rJE3%P<QiW@BquP3$ssS-ZrivyP&e?)2`d%dZXVPLpqz{dZ6|w?PHRq{=QX}c=t9C*=GXY8shASa@!3d_dVft z-)mqGZ4e!(JHj1|zz%1Tt4q$0IcRjzasRCq=B#U^0*&)OsuH zVEFT=HHfrwYdS-IFu$u>u^{v;x2br-z6P;~^tx|`-WK8; z>=ZM%sgIAym4U3*+Y?Pd$G76V&HS(T41KZ=`dF~-+G16CyVdu(OEE9YK{ec-Au8GY zhdaI2-_Li~4)j(9-E*=6xJU=FK7cej*nxthKk-QvKOMw;Ix#iwO@&1J%^A6#C|Kmr z%9yg(_b-AUlLTQpf7ZQ%jR`UdK>N3p{@e-oe%rBZQyS=TBw|770_Y-D_S~CiudAj* zHs@kEVL7!+ry-0@SVo!xS!>kgv8y;Vb)&3rqS>^nOxRoLd%TLiu9ZS`7Yt zwHFQmY! z5H|~A@H}eO+269@EAm;>?4s=82VPj};v{df&x!iMO43J1J3SVJYg7Pdhd<=zf_`~o zCIU~Oj=ixJ49Z>wW!3=17wv%JIcdw)KwmAal4xw|K(H;}d6>1pQ}AaOJbkBAozwd@ zS#RS4j+660IemQQ9`9h9$U@YN!iT#Dibj$88cuTgp>Fua1B5IHs-jw`N$7ZB!2=`H zDRgZ~Hzr59%>NX5>CK<3Ec%=^*?Q(qD(`z@zQVyxN!8dPKDKs)O6OcJYv446;4^y8 z1GtW|B+n)PfnBI`zMEa!XTYJSxDpgNwR z099bbNli;o27dL1C(bou)oA|%$$M~4N%{$&8%xkgNZNL5kuW8-=TdMAhYm7xaX*pp zarFF2bOhDk8}v-AP##(0&Sm#uOF*9XJZg2r+orB##+>aE_JFojvb8YxM?zA~LPJ$v zp!Qar%w9DuHdCe$DnGBeICVxFE+1EQDD{kz;L??Uabhp~9sC2Kz41PxB#Sk5^Cnfh zcU^}>rC8#Z$9?rC&-ui0!SAM zL4N%FE)u91a`-q7ao2&BfcGuWqrE|i0cbhI!zcszplQ@{N3lTi5Aa*9xw~W9S>(-9 z;>g=lk8UjHZeRFsh3Fx(A`Y~M%}QB2kWz$Bef*1jfftxR_;61ggNB- zyDAr1pbny0(R45xRb|i0c{XFVO+2|^2rp5j47<93?xn(dG+~Q+vIF9U%r`XWhXMSE zLJQ)^6;&fovSDT4A#$N1@XF6x5FrJG;e1Pz8 z-;ers?M5KZ%o4w}nQ_b7M7kf$q?Se@kTsq8#=>AOcCMm4R9#Lcfv(>Xp4saS$+piH z(Rm4;O+}U$5)<8AzNO@)`4*GFGX#y2})i2 zo~n@=lqaJ)Eq%%NNcZE$Urf*8oN9kCt546LS23;92}h58&Gl~uzMFefzyCz~CVGy? z_*$>BOUzNT0}zG?=GOGB)RWgPtSbt{pYnfY*unctj6!OJJ5^33Q zd8cmG*;}CYZoWVL*lGJKXl8M=UWPbD9}qNWp9t)Lp*u*|!Z`OC-2bZc_(=JQWARVW zquf9vHvG(qfc!j}GLzFb${J^dixo2nZA^K9n?S$2oiBE`Cg>Dr=JKAOGi1YrY!$N#|Dt4v`n_xTun}TeI zI9ld7Go!gj`NwYP?=h%)5MOs9vY$T7cylKA>STozddjPUdISsju_*3HwvSGBxXDD6 z3sQSw{1;VsejxarvB1Ac(alF4`zLHP3H2DfD9!oml1CdD!f$#qNi5|6r~2E2nuhAs z+r;VM#E4mSw20}O=AhyN{1oGW#SS{(n+z;X6FpW(CsO;9VT~p$r(ozrBrJy#p|l(z zVoZ^Y@FbN;p_)Qnin-csZL&*q?Sx$3yqe;DxxsLaKGPqe^(H1Sf1Y~{4E7xSMtYG z55=28CC7rY!MhH0=_7|DTWv>1DjM0X5WTZom1W!l;^@(POy z095@8VofhLaZIFB)hjpdR39l}-bBzF^cw?RfJ&iv45!%FTh{1@v{+WGbR5vI#iSoD zYl|wW3oP_O?H!zzMo<36=0sgaPcNPPG#zgGJgbl$)>|tQf}D?SpAem$;jA?yaWn^m z=D|G`_|O}0yKelLb-ve9T(4~{B|yi6_vS88foy+wP|=R#H4s2+>Q#iUV_$xw7)2XR z1W~#a41*fO6JxsQh;opmt<=L5_N)(z-|`a9t-yN)FDn0&5iqVI+bFyiv-hEnBG8z# zP25lCuLb!r%CCDDrEA~M^RKiA?zx1MNWZu|XhSbq4u(#ZKA`=t3A-?lTy3d(7cbBPOf+vPGQ6Ne(IVN0< zGcmvm27LzW(Ug^RgRs&Uvz~#0(+O@^J-aoQgx+EtO0^g=_+T?rc+}1pCxGgJ9ah)~ z$DGPMGO8bo$Sav94b7LrpnnUAj;ncy*$5ji{n@nm2t!kk52AS#fSP&bAjnb#|F2PQ z+LrT7y)5r(RfJ3E>1k~}M(N47*)|o(&R}L}k4vkGK=z78&9s9H)lVn4+>*RrYjd6a6ixZ%)n`!@B+ zo0fC|cAc!CL7!f|Y!nlp>OL;BiC4EM&>TO=hNQ6Mm|O;3tRMkN>{Hoqxc!W{>0=4z zBbeAl%K8pESRMzIh8&vaKU5Ksfg~qe!{UHS*|Q!jnpAye5g;IgWfMqP*1}h~fXv@A z&}yNQihLqW%nb#pzXgeck5Jy*To3`QVgSvFG@u|^h^{a(l##)*B@hQ#05(kEI+!Gn zr&>Om)*SA6(g8`^hR#zO*3CFkxJUdzrcHwY(a z&m;7a@no_H09?JWG^2L}wwwpA5hiuU3+}qO-e;^WpFZt*%uvpV@Ch zO08=$hkJNlTeCmNHxd-oc@Ssju+1jOR#FrlksL#&bChCZ~}cas7Lcl2iT=g^W&Zaj^>I)YT1U zIJ3XC9p`JS@mXlo<@H_Fk(^>ew`;qsLR^L#e*v0buON77)7Pj1oqD06O)OB6Am$c&xft+KV&*RN%gp(!L zCJnh!WRl;Ip~Cy;lXQf13hg!oD{uW14@3*TFtfO`MOwyZ#3MkxW`||OeGx`bk_N+2 zB|>CDjz41C4eFKn9E8-LIB9o2r<`+2px4W8Aa@Ie=M`RaxdY4sq7W{n2|4DA(H)Jn z^C0b)R*j+Ci1O-12u_YD>SrnEvloS8!I5+90>0-pKt<})3)|gYXnw#EwRIwjdr1*G zUA&9v4Q}Jn&Yh&XDTjQ?F$52ppgvKM{w~3K+>crtqIk%n$`@E4uBg`ljl>=$iDrkO zRX*-+s8B;q;M9Dx)!vZCyiQe;{|6xi+b0n!Vzwg|vnoO3#3?Kj@yg7JdoUsa??wj! z>Vf(g3e~SnJGlNA$1qlR!%j==ic>WeI8DjxfHn_dB1?dBXJgZc0zu=r01Evm&x_Xt zKOi-4>e^2rIX+R;Ct!O5n&$8WoG-6rvNOkExKX{isXpv?ZRlvio>rlFE@fiJO;RPB z7MUq8WY1CES+41g1WU;K=>tniK=4K-SP6=Z$*E1}Iw?$oXkSi2wd$yYr({2dk+7a& zah1X+EX#Jxyfra&tLG!gaJ7My1Q4wsuPuc%&!6bg@c5pG_Dh^BKR~XeRFbnGGX4vSD8DWfNJnm@+7n4wxqNE$ae1n68T9KPy3qLzS;(5NlLKFC+ z>B;kI!NYMS{Yk4vZ}jRisd*!v&KbV-rFbtD7NS(kkVOP&c>;M6?Avdf(d4ZG*#Gi;rcrY4fLnqcmp8jtT2IJ-sb%ZE8@CsUy-DEV$eCgQ^Ml^|}XZ#e6n^39MRD z(ycFXQ6Th3j|ZAXii8fGHNxznud$BFteab++oCuygl2=$|6LShl?|;8S^4U&nH_*Z z$;xH&KJpk_%_afu!6BgD@$nl>0h~iVOw9_sccuz(LMa4x9c2_VsggWUhF0ua72B;J z{U^wJb3YKDWmq@BP7$aonZ`9nNXNx|^Vxj+Jz|y)G#jE{k*OTrL)@QssEf3(!>Cn| zY1x$Zy9v`?dCNl@+MH&Dl6ZTe5)_m4dnK9~bP%+^ek1CZmt@b0>>lA>32uBFK8)3; zKvO65Nv?`zL>nntn)z|6>-(9JyXXEi)c@_)EB78gTzANLP4-3ETPUM8>1P`v~ zTlvk|wlswE+~rPve|Z!frZ|r^c3EZUADy)Pa4GV8iLu%+YO88qxE28=+p~X- z5svrYA%qsh>P1}&q*dkGK)KuC z^qaZYvp^^BlnQ?I8~*G5KL+2FLY;tjf#Ki(=NvpL)gYgxOGVMCImJ_qI64zrIbz387DrU3h$?fpPsokWU_cOzl zDro!gs=thDCwAl$lltGglAJjid7@;(Sad^shFIVDA34+J1&s4<_LL&?k6jX|2qQ}r z92^iif@yH`%*H%Oj5cgJzx)3d^FR0a_kz{0pZP2+7=JtPnf1PLhW|NNb&acX0{ZTK zLa}+NpkzhBIiTD3k6v*I@CIqdrj#2Z=3fdt%t9hef6U{c3(&!V@m#Oa*?#d#=Z^$` zmAw?P84S@(@Wh-y*7PG=i3nGyNt%$!_*@Y^JrfB?CrIGS=~UP z!=fq}L9;>VnPDuTDdyD{xC5#_DFXjykx~n0E3H`>=p#TDr^heN9#qtvOvk!-{(V?v z7n)^L0=ob{p0p^>%C`}y-mb;31v4^7(Ps(o)mh&OTdgwXAX!Y%MgzTUt6 z#Sm4Xg7N?Fk3ML9vQzg-w0HiY+g_N~5qt1G%SHT%ZK5`UZp^o2Eo2m!&q`^TT|+!P zpY>u1e63`?_PoWVz}%IjaFJltD~d$g?35-%Y-W+%--Hidq}qKvMkhVj8z2sg_nr)e z9onOO`~%k)svvX9(Y~}3Q*G_|K|Tkf5q3t5(t-!`TcVN|=(79uPfN@v`tr08rQ|DBtKd4dcp9f z*ECe3Z5o1chR>Z{gS}c?ekcSSN@k?<>t%Wp2Sdyk-R+p84>h#BLYWATkM%_!7lct;^( zS)&b1oo7NyZVPdCy#!gn1e|c?t(laf}hxst_!&CPEqrv%tenviO9ZuwjLPiXNtDGCK+8n zeqTE&W|KOC2=Q)m8`&T(NrYnew`#Klb^W5)ompL}puE9ZB3PS%w}Q&~ck0u1pC))K zP)vYgE%fIKD7CgrGJj68K$j~mOuOWT5lppZIW{-bn)itvl=uX}Ps?vRM^jPIn`<2P z$iFMQ8F+O1|{u~Um7P{86pMV;MWP z!^v%jEYL3qw{x8O=zkUFf2G^F<>5xtf6g(E zqzpl|?><&Bols548 zQ3LYt?Zz+SFuFfe&6O@C;B%Caz9TFmy8?1#&ak*2=1VrC&*Lx41zVI??5Om*(A2^D zWfg=WGe2IuLPkM)077{NR+uZ)UOPtr?RISc73}{XyIuW%IiWrao(~~vU&P-$Qy*S< zueYDsF^{$KbB8tpEM`OKCNNOs>i+Xa!BHEGcfu|w?4IX)YB-tOF$yiHXaTsox{`Vm z`hoOGAmGn7c0#QSf6=bNHh~yUfECW}ZW1 zzD%(2Hl}dL4x87I z>TTf-)9aFZqQm|T8zrf&PH}W=#?&egQc)c8$Or)`IVfFIcf|kY$eBe%07IzDVf&AWUwwttDAEESRFqE zz|9#A`M+ZPG2CEJB4NL*w#|&#STxG-Nd`Tq37WkoS3r0)?9z+^*y(gVd2o85X>~$i z-F&>Q-sC;3jb7v}o)62Y90_RNp(VGAzyLuqk=ya0+a6F6!KBgU1-vnK+P_qM&#RF4 zx^}jM8*&cHg*QapJm6!&X_16jBfGA*LzR608vB0zhzCV>;{PWBAwim-_Dn%#pW*V{ zym9HJJCaEx@IfEYG3Vl^wDt^mx`)Y=*eL{CI?N_gfd%S6-FYRMkO7=HUKZiiu_$P5 zwk+G8q~B>Z1cX!t$3uR8j54K75MAZtI^ol#{G7J)MeXAgpB`vb4^gK{1?rKR17#?QPss|B^TgqJt1Ob0I>1%H&E28kHUgx?h%@e-697NnnG9I|jp zYx!*pOnj%cjN~uIm96D9S)&d#<(-%I$*dV_J6*NxnRbI24ePGLDXzyvlO&gPEFQ54 z98zr7#2KT>%L`N>R^T8O$ts)~N0vH7W|4@TM<}~#EI-)hvvhQ+J9P7peA6JE#oEiK zLIZ1)Ne*aqFn83@rq^mcj2?7KG)-OT{Lw~+nHvf}zo(9I-drJNLmDR=L-%X_agtRK zhr1p!DXq4&w!b>5c`N1Y<#q-i#$%TVI%~QLK=)9{&V<(n1P=D#Basb-ty`@$0$9#x z2wLd+dF=+*tos|qi%Z;W1g=zsOP-TTB&?;Nmcb*O$uZYKOb4X+Dt}}Df0k_5&Z9Th zWiuNYqRuE1^O7GLomiSjj2OO(&Q4HEkh7kQiN2~(`(R%J7(K=a1u>wVJ*k0_Y#4i{ z6b#12T4qEQq0&c_*F?&3v?ml3x>c4b9hq$N?B?)ZQVuKm zr}BpWflsUHZEiB}k$#B_VCKKYTM3(LzC=TIu3_NR2%!J-xww&l)_RhzmNskpuk>y^ z5Mjdz8LuPG~{0sjsdD zm?D`&BP&ATD?x$s5b=?C9hrvu+xZAZt=tIiZc-v7EQL3MMOj4vyW(~3N~uKk`-YTM z5k3J`?evMJyI z(&7mWC%kW<516B!GumoBn#^3~5#I^sEZsd`6o%9B51y`yNzCX^gjrm~tkhx`fv~gbYlO4G#IGHcVt;yD;Irz7ed53&9?R+g`jM@DUC}#?OfrPl; z=jY`i2A?>^84HFdVpWhSdE`xUQRmzEVRwAv`EALXRoAtf5Q>$|q-E5ZDr%!{Pot z^+}`P{{*bTWjcIPQCNSInNej2unhtRw65N$srI6Km#E-{bbA~?u0w+CmhZwepvo@+ zRepKh`L8ts%BqPj;>LuDy~u*T3Q%E$>*T=uHJuq|P|M1q1+g0hNq4jnw|NnF$FKgU zz?L;=iBYkWH@D>6I9+4Hai!ubCnWXm&74FL3sT{Nq|%M#zIj>tkI8~R5A(i4!g~H# zv?qQG9mk$kFu=zvF5$1sqwVcB6Ri*KJcV%}rFZ|*wQDW-x*fHV@`-AIOgYHmb#fSZ zaVLL!@9sO`0{k1Eddte_?xZRHpdIMaopUk)Nz!~icS`LBxfo4p@J+()w8`De6~s4h zAFO-OJ4YCtOA#Ig(R^Du^)rQTfEzOTb+dGu@zd-1M?gV%6=F~Q=KFu=yRUoA|8ltg z9eX{KKUYI@|2bc@tt?*PK8f``e@iCyDT@C~e{16V7*8D0lVV$^ZkpeKFN=UetU z|I57YQ0w{SW4}Mg8`x=T<=y*y`#$m)1em5@o#-{Kv?cr-2pmaiiurER>NGFNpuKDn zs)ZNg*@rZGe{1rC(n#-DBz`ny`-X$7ZbHfPg*#^pj-xtXB z6S5eEQ!mCgBtdoyqi-H=$;mSFm-CPh)@=WG2v>7Qb@hKs^nm)*{oYb%VFFd_`u?Ac zq)GfOC;fj-U3oZ^-5Vxl-=ge{zU-1@iHsRhAzMOrL!qQBm9ZO=B-yvDqY$!2vVF`{ zmaJpnHDlkhGt7*c`Mv74N!|!R@$K-K~IvAm!GY`-!id4sDv2UBzvgYV z$PevLfQ|Gp?;lI>w8jVbu-lh|u!nVTR-5~%^qg@naX>+x1q?fEy!8xD%4mL(#9N^G z4yjOSIO=)nhC^2M7@tQ9&Qzb`Ah|i76(+)YvHrC2!sA|JfAY4yJ2ANj@yk2x;6aT? z-JZ?r-o^+8C@20^oK2AxZt4fHQ6EIeTQteqQP=Bicl=&A_iS98zfIN-_#}%s17l6# zX6d z-+N>}7-KBFynhlaz+`lC3k+x)dBa3URzQ!@*;{#xBf8wS%10;Aj~Y=gggX!=r2?MM z;^bJ$I$vLS{6Ok7&*<`P9I=(?rer=47>+E*lQbaG^z0#tp^2fZbY&bR`H)@@cVojl zh=j(S08-Y$84HS43hQ6(H-u5qPG!*kOD>|_7ZaTcV}@D-oh`#8wx8DTH(mKiB!wl}zxxLB2dkkh&|kI6YUDg8Z>EGPQ>sLeQ^P z(_c#nym3M^sOz&rZbUVWgmy^t&PQ4(@Lv|+V%^&I(quuUM?#AOw25;jUcX04qJxJd zyjw8xIg+pYbv#>}s{-}q-4p*|H3g>Q-8*W)hR>o=2vUM^H(6t@IM9FRqQWW7iT?8H zw8!N5Cf?VCP~_(X#v<1{qK_Q)6LOLSK3xQAg^g&Es_5wlUcS7dr|%&bYr`+Oo3{!(HJFKSEV^9|qBGP%=z%Wdd;5R+?GQerr6Z(rK- ztg~}kOaD>DNL23kQ-MlgI^|yNj*SDy&8P7llA9VF zI2o9{6i?9k1HJ(}4qr3u}dIXUV zBEpl$v|0}t$s(o$z3b=y1+6SY+q1gk)odq>a{^A}p`5qP(nuP?nVV0c*Anw!SI`mNi=A?!mUA9mDuuLSKaWoeKBLoll^DLt zP{vUUsc<0z4>UL=wTKY))MeG^Qe-2#LRGOaj*iP%enqgERh}rJyhj{;(z(NH>#}{| z>UAll`BY>u0N#fOiA+7vN3{}y$7N}P8ShsXT)eqk)$C!Y@%h7PSj*Rm1nU-o63sp@ z=flh51>5eRtzkvS$D>e!B)+0)?uaobq>E}M9Wc>xI z7XcTNoh24#YwSWQT?QtEzc_`2{r=4XH--~w4x~NBjqmn2$2mwvncy-(0WTb%&%|>C z%3ra~Dird=eHNfonY*@NgILQ3*HhbX^%HNaxmJ3u@oMNESZ{Dxuf_hTuWj)dZ%%4%)*CWn$U)Kloh0?6!9O>NkVyNeyLVnp0-&Doy*m1eBeN_bRq=~%s3 z5I6|)vE(AfQ`+50_bj?IhapBvOWggAX!P4hB4_SOdVQB-W*FhH1$hQJtnJb^Mq+6t zFZ3+`MdhQ7g{xEI8IevLNV8Ox=}X1j0dUB+-$NXS_{Z}$$ZSachOCX@t*M!KoQ-$R z&{bCln)zOxtXCmS%ppw!HRm%>p#s_(Lv8$)P6#imI<#Xxr#?Kr;MDMR z?DCkLKAc$Zoz5?IRcDJs+VsrA-y)$bvJ0QCeI2KEAW!bU!mCf$rB!24I-#9Ow4jKMdJ z9@L1JJ{bO>Ok0L0qqPzq-}V!-$F+H0 zE5hRr!A%7k8rB%St5?iU-s>(2%0~W`f9z&1j4>>vts#8DX|*|2l3EM%`N25-!{2>w zFcB*du=&LUv3boVqBZ(9v76Dc=%tkV$1%v@87(;b<;m*X;^@#RQ(CKHfE#^fZ7$#~ zn8_mcgt#d4PLZY5g)5OdM*eP4mB)&&bsB7LIPwfiq5^#v&%%;7u4|U7+>&X0HWF;P zn`Jx&4f3B!yaqKmDc&msW7eE}bpdx`kWrD(=pnnC8T-$70@$dp8WZz-9+KGkcFZ2? zbRt%(BY3ft>|T}ho||D`W2bYJiZ+2SvLS%u3?tl-&FFIS!scMRd~8bCxni>moX2%* zw~;d{h&zE!n?%jJr*T?P#y;9YtA(4s9|S*|7^n>WqLeZ^rk|tiI{}YxRHaR$4bQ zonoLt(Zub_alx}$HA5-(jD?`~=Nx>}CvcM0&&%cVxXv<$pWA=(J~8a*QCkb~#0Q0N z%gA?^Uvcm0s-F7P?C0m=nEcr51wT5Eu`#ItuQ0%!9qY1i_hS16TV@45V~HO{b|B~> zpvHTAUGZ$F`*M$OnNH_&1C(O6h8x)6*If-bFCyhqXjqxXlml9c6wr*n3c4v|dRNoH zCyhDuP;XuIqhe*FwHXcHEBc0X2aPqkY9E){&@Q8l2}Agc-;Wn7{g9oAX(3jw&j#FI zdaCgwru^3{Ir7aB)bHS76ZR~qC+SLL$*RYnm8pSwmc z%zxQb+iT5H8Z()nCM+x1fDL1j$?3{6i}#P*Dd}RryiW$J>_zm@ol;&R$60>$vfupt3I{*JDm6(dH;+=X{yox4R`E7uzLpDqHLTJ;_qnWrF-o(<+zWD@z*R%+XP{QU)fN!Uel*K zvR%9tEjrD?qoAx7DSQHCV<60*Cr1hB8yc9EsxrP zCTgfn>cLHBf~4fqP__P&k$#1;gT3K4C3T0Y3*U_jVkDpI>Qbx;9C^|;dDgvFRNek( z*TyH`9D%#Q;QQi|7C|jB$dwJ)f!Ys%6zmL9*d{irBxEwp3k;vRK4>_}YnS618D1R7 zC>9hCz3K20BYH+N?u3-2rgg^4OSyPmFnp6?AL6?~;{Re7Bv$cO58L6gZx>+%kjhXi zcPQ$?PaBG;d&=4^v*FJL55*8-Kh0GV+)pLDW?Xz3V*TDj*$9nXPT*e?Y|pA})Mse9 z59_6!FW~jgOe^L0TN-;b8H@;SCHOCG&@O6L&)OR1hxVtRs?a12cn!=Q(^voSLgxb= z*j_m1E^8|jeWDb63)kfb2O-Mksd%h+^MqVS;`XXcH$H@ zZ39fMo(P^UYCsWmKW*<#ull&-ew1VU?71 z_RJo;MP{bP%tDQqGe8rTBjpa?#8A7 zF6>!+@XQ8JO!;)?qu}`*v^g}#@Amy;R&-(abA(1dW~s~ainFn{0flUz;9{4(He<6X z3&POA?PA1Xfa>F#iJrDGgwV22=Z*B4S?a-36^NWwlO0G@rz)w|llIFEBtZ2_MT6(x zAFDWRXzO(6;UfR7G~rLpF)LNy@XshkvC}bE7#>4Ymy#OHp454-B{fV2+7kJU=vQI% zSzCXZVr*RG0fO;U!?J4x=CB_gGdB(=yBRaAy&uL1jNZ6|Jy~6Gc0nj(@C$(_^}V<4 zDGR*=(^~NT!5YVvox}*_;lAPPn;NL8LS`M$mhFc&jN7VytXyfV zfdn41Aa++9*8g79k&T@sw9dq5VQWesFQH_aJm04r=m}1iP#8z5&Md5Rj z-P*#vL6&g=O8V^HcUk(iGfrZ1)E~wOZ++?W4l%TPTERQ4Ef`P@aPXWSmMvwm0o}#f zX6F*GGGs~;duZvrW*y`+^~V+kd=ewsnR9h5F;CiBG6g?p9N_Yme8jrxCT5E0Y^)PW zHN$OiHVb2jimjUezUSIfxrGmOcR{CVEA0~GV959|irXi6&UmxSuHd}T2g?9uuRJU% zO?)(9gVN3b*~f*-Q(H!|DF+b<_(&UKqniY!gj%cVx&x>7nO<1g^!i@acg3=f>?-SL>nh5&eggF-0mq6Y~%YDKhiy(ku+2Cog0*y^X9o zL^f@-=sY(HaPs-?+;7ZocTt_#RRf!3lN}IQHeRQ!M`6%_98~09Zr$7>g6Hn?5}nWl z%d`oeKp1U@cYkXtK#^u7kxkT=*#=Oc*L<&{ynANTe!3*}Oyh&aHpG7V6!HMarVibj zz68ZbLJy}B_bHf$+$?M`O@vSOx`tgtZ&f^cC4n+FxTzJhgGTDqu9gcPbYRWBFfc>o z$-NQoMC@V2mV1bMYucMHbTvlr!aNX8%*O^~$U>9eZYS=A=~&^fqv>jfa^UbT0=y1$ zx})>$i=8uJ9#hs4z3uw&2wMsAoM)5s`$Mz$UHLP%ZMS?5!#m7^c)pw=Zp?z~Nl~!5 zD-_ZIi(dzf!~01dN+kQ8+rLW+fZxJO7pEmgt}6T-^?Tig`?dP=EaURbLzHnn+4?sD z0f;ph9v^03E;pfVc%Tjt=lpKAQb!$+UKlz4S$P6G38z!g){^AYJh7cW078l1&4H|o zj;9d)Qp&`SNI!o!4e<(y9_n7AUCuvi8~{*j5};2SO_;PR{@1li&T$p4We;@QYWmM# z=#DU6kfqfjR#kec{Bi3o2bflgTlK9+#6G`U*A2jH$+^t#KS1pC0n^vm5yIvF_bLGf z)DQEC9aR4Qr=R1I&GI}8=`!q(59M=!54VHqx(|P1kQoICO(LT{@x-hK{)-t1*K@#H z9@#c0v;2S16@f?hY+~i@`SKs{whl)z4AtPY5dPyRIROYma>CEAg#WrXPXw&y+yKqW z|8e5#js#s7Z~tIPUHFgtY&yUdg8li=SHE*4N8h!aVmMu@mM=5Q$bbE3S^!<406;_6XB7BqQAIzjps5dr!w_{Bi8@4iea%$DlH8SmD)Y@`8y2_4gJx|gpP*# XjnTkB - + AudioMesh - + @@ -194,61 +489,148 @@

-
-
- -
+ + + + + + + + + + + + + + + + + + + + +
-
AudioMesh
-
CLOUD STORAGE FOR DIGITAL CRAFTSMEN
-
-
+ + +
+ + +
+
+
+ + +
+ +
+ + + + + + + + + + + + +
+
+
+
+
+
+
+ + + +
+
+
+
AudioMesh
+
SYNCHRONIZED SPEAKER NETWORK
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+
MESH STATUS: SYNCING
+
+ +
INITIALIZING AUDIO SUBSYSTEM...
-
CONNECTING TO GATEWAY
+ + + + diff --git a/apps/web/src/index.css b/apps/web/src/index.css index 7f6149f..1b41761 100644 --- a/apps/web/src/index.css +++ b/apps/web/src/index.css @@ -1,5 +1,13 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700;800&family=Hanken+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@300;400;500;600;700&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; + +/* Prevent horizontal scroll caused by overflowing decorative elements + (canvas borders, radial glows, absolute-positioned SVGs) on small screens */ +html, +body { + overflow-x: hidden; + max-width: 100vw; +} diff --git a/shared/common/src/components/theme/colors.ts b/shared/common/src/components/theme/colors.ts index 4af33d1..45fe74f 100644 --- a/shared/common/src/components/theme/colors.ts +++ b/shared/common/src/components/theme/colors.ts @@ -103,6 +103,98 @@ const colors = { 400: '#ba1a1a', 500: '#93000a', }, + yellow: { + 100: '#fff9db', + 400: '#facc15', + 500: '#eab308', + }, + orange: { + 100: '#fff7ed', + 400: '#fb923c', + 500: '#f97316', + }, + blue: { + 100: '#dbeafe', + 200: '#bfdbfe', + 300: '#93c5fd', + 400: '#60a5fa', + 500: '#3b82f6', + 600: '#1d4ed8', + 700: '#1e40af', + }, + purple: { + 100: '#ede9fe', + 200: '#ddd6fe', + 300: '#c084fc', + 400: '#a855f7', + 500: '#7c3aed', + 600: '#6d28d9', + }, + cyan: { + 100: '#e0f5ff', + 200: '#b3e5fc', + 300: '#4fc3f7', + 400: '#0088cc', + 500: '#0077b3', + 600: '#006699', + }, + teal: { + 100: '#e0faf7', + 200: '#a7f0e8', + 300: '#4dd9cc', + 400: '#00c0aa', + 500: '#00a890', + 600: '#008f78', + }, + obsidianFlux: { + surface: '#121416', + surfaceDim: '#121416', + surfaceBright: '#38393c', + surfaceContainerLowest: '#0c0e10', + surfaceContainerLow: '#1a1c1e', + surfaceContainer: '#1e2022', + surfaceContainerHigh: '#282a2c', + surfaceContainerHighest: '#333537', + onSurface: '#e2e2e5', + onSurfaceVariant: '#c4c7cb', + inverseSurface: '#e2e2e5', + inverseOnSurface: '#2f3133', + outline: '#8e9196', + outlineVariant: '#44474b', + surfaceTint: '#bac8d7', + primary: '#bac8d7', + onPrimary: '#25323d', + primaryContainer: '#34414d', + onPrimaryContainer: '#9fadbb', + inversePrimary: '#53606d', + secondary: '#c4c7c9', + onSecondary: '#2e3133', + secondaryContainer: '#46494b', + onSecondaryContainer: '#b6b9bb', + tertiary: '#c2c7ce', + onTertiary: '#2c3136', + tertiaryContainer: '#3b4046', + onTertiaryContainer: '#a7acb2', + error: '#ffb4ab', + onError: '#690005', + errorContainer: '#93000a', + onErrorContainer: '#ffdad6', + primaryFixed: '#d6e4f3', + primaryFixedDim: '#bac8d7', + onPrimaryFixed: '#101d28', + onPrimaryFixedVariant: '#3b4854', + secondaryFixed: '#e1e3e5', + secondaryFixedDim: '#c4c7c9', + onSecondaryFixed: '#191c1e', + onSecondaryFixedVariant: '#444749', + tertiaryFixed: '#dee3ea', + tertiaryFixedDim: '#c2c7ce', + onTertiaryFixed: '#171c21', + onTertiaryFixedVariant: '#42474d', + background: '#121416', + onBackground: '#e2e2e5', + surfaceVariant: '#333537', + }, }; export default colors; diff --git a/shared/common/src/components/theme/theme.ts b/shared/common/src/components/theme/theme.ts index 9b13523..4d690b9 100644 --- a/shared/common/src/components/theme/theme.ts +++ b/shared/common/src/components/theme/theme.ts @@ -73,10 +73,48 @@ const customConfig = defineConfig({ 'warning.400': { value: colors.warning[400] }, 'error.100': { value: colors.error[100] }, 'error.400': { value: colors.error[400] }, + // Yellow scale + 'yellow.100': { value: colors.yellow[100] }, + 'yellow.400': { value: colors.yellow[400] }, + 'yellow.500': { value: colors.yellow[500] }, + // Orange scale + 'orange.100': { value: colors.orange[100] }, + 'orange.400': { value: colors.orange[400] }, + 'orange.500': { value: colors.orange[500] }, + // Blue scale + 'blue.100': { value: colors.blue[100] }, + 'blue.200': { value: colors.blue[200] }, + 'blue.300': { value: colors.blue[300] }, + 'blue.400': { value: colors.blue[400] }, + 'blue.500': { value: colors.blue[500] }, + 'blue.600': { value: colors.blue[600] }, + 'blue.700': { value: colors.blue[700] }, + // Purple scale + 'purple.100': { value: colors.purple[100] }, + 'purple.200': { value: colors.purple[200] }, + 'purple.300': { value: colors.purple[300] }, + 'purple.400': { value: colors.purple[400] }, + 'purple.500': { value: colors.purple[500] }, + 'purple.600': { value: colors.purple[600] }, + // Cyan scale + 'cyan.100': { value: colors.cyan[100] }, + 'cyan.200': { value: colors.cyan[200] }, + 'cyan.300': { value: colors.cyan[300] }, + 'cyan.400': { value: colors.cyan[400] }, + 'cyan.500': { value: colors.cyan[500] }, + 'cyan.600': { value: colors.cyan[600] }, + // Teal scale + 'teal.100': { value: colors.teal[100] }, + 'teal.200': { value: colors.teal[200] }, + 'teal.300': { value: colors.teal[300] }, + 'teal.400': { value: colors.teal[400] }, + 'teal.500': { value: colors.teal[500] }, + 'teal.600': { value: colors.teal[600] }, }, fonts: { - heading: { value: `'Inter', sans-serif` }, - body: { value: `'Inter', sans-serif` }, + heading: { value: `'Geist', sans-serif` }, + body: { value: `'Hanken Grotesk', sans-serif` }, + mono: { value: `'JetBrains Mono', monospace` }, }, fontSizes: { xs: { value: fontSize.xs }, @@ -125,20 +163,37 @@ const customConfig = defineConfig({ toast: { value: zIndices.toast }, tooltip: { value: zIndices.tooltip }, }, + radii: { + sm: { value: '0.25rem' }, + DEFAULT: { value: '0.5rem' }, + md: { value: '0.75rem' }, + lg: { value: '1rem' }, + xl: { value: '1.5rem' }, + full: { value: '9999px' }, + }, + spacing: { + unit: { value: '4px' }, + gutter: { value: '24px' }, + 'margin-mobile': { value: '16px' }, + 'margin-desktop': { value: '64px' }, + 'stack-sm': { value: '8px' }, + 'stack-md': { value: '16px' }, + 'stack-lg': { value: '32px' }, + }, }, semanticTokens: { colors: { primary: { - value: { _light: colors.primary, _dark: colors.primary }, + value: { _light: '#53606d', _dark: '#bac8d7' }, }, 'green.700': { - value: { _light: '#0088cc', _dark: '#0088cc' }, + value: { _light: '#0088cc', _dark: '#bac8d7' }, }, 'green.800': { - value: { _light: '#007bb9', _dark: '#007bb9' }, + value: { _light: '#007bb9', _dark: '#9fadbb' }, }, 'green.900': { - value: { _light: '#006193', _dark: '#006193' }, + value: { _light: '#006193', _dark: '#34414d' }, }, 'neutral.200': { value: { _light: colors.neutral[200], _dark: colors.neutral[800] }, @@ -146,6 +201,108 @@ const customConfig = defineConfig({ 'neutral.800': { value: { _light: colors.neutral[800], _dark: colors.neutral[200] }, }, + fg: { + value: { _light: '#212529', _dark: '#e2e2e5' }, + }, + 'fg.muted': { + value: { _light: '#5b5f63', _dark: '#c4c7cb' }, + }, + 'fg.subtle': { + value: { _light: '#8e9196', _dark: '#8e9196' }, + }, + 'bg.default': { + value: { _light: '#f8f9fa', _dark: '#121416' }, + }, + 'bg.panel': { + value: { _light: '#ffffff', _dark: '#1e2022' }, + }, + 'bg.subtle': { + value: { _light: '#e3e3e3', _dark: '#1a1c1e' }, + }, + 'bg.muted': { + value: { _light: '#cccbcb', _dark: '#282a2c' }, + }, + border: { + value: { _light: '#cccbcb', _dark: '#44474b' }, + }, + 'border.muted': { + value: { _light: '#e3e3e3', _dark: '#282a2c' }, + }, + // Terminal log line colors — adapt to light/dark mode + // Dark: bright neon for readability on dark bg + // Light: deeper saturated shades for readability on white bg + 'terminal.sys': { + value: { _light: '#16a34a', _dark: '#4ade80' }, + }, + 'terminal.net': { + value: { _light: '#1d4ed8', _dark: '#60a5fa' }, + }, + 'terminal.sync': { + value: { _light: '#7c3aed', _dark: '#c084fc' }, + }, + 'terminal.wave': { + value: { _light: '#a16207', _dark: '#facc15' }, + }, + 'terminal.audio': { + value: { _light: '#0e7490', _dark: '#22d3ee' }, + }, + 'terminal.default': { + value: { _light: '#374151', _dark: '#d1d5db' }, + }, + }, + }, + textStyles: { + 'display-lg': { + value: { + fontFamily: 'heading', + fontSize: '48px', + fontWeight: '600', + lineHeight: '56px', + letterSpacing: '-0.04em', + }, + }, + 'display-lg-mobile': { + value: { + fontFamily: 'heading', + fontSize: '32px', + fontWeight: '600', + lineHeight: '40px', + letterSpacing: '-0.03em', + }, + }, + 'headline-md': { + value: { + fontFamily: 'heading', + fontSize: '24px', + fontWeight: '500', + lineHeight: '32px', + letterSpacing: '-0.02em', + }, + }, + 'body-lg': { + value: { + fontFamily: 'body', + fontSize: '18px', + fontWeight: '400', + lineHeight: '28px', + }, + }, + 'body-md': { + value: { + fontFamily: 'body', + fontSize: '16px', + fontWeight: '400', + lineHeight: '24px', + }, + }, + 'label-sm': { + value: { + fontFamily: 'mono', + fontSize: '12px', + fontWeight: '500', + lineHeight: '16px', + letterSpacing: '0.05em', + }, }, }, }, diff --git a/shared/common/src/localization/locales/en/web.json b/shared/common/src/localization/locales/en/web.json index 11fbfdb..29a044c 100644 --- a/shared/common/src/localization/locales/en/web.json +++ b/shared/common/src/localization/locales/en/web.json @@ -1,69 +1,88 @@ { "LandingPage": { - "heroBadge": "Secure & Limitless Cloud Storage", - "heroText": "Vast Cloud Storage", - "poweredBy": "Powered by Telegram", - "subHeroText": "Access limitless cloud storage directly through Telegram's MTProto API. Upload, manage, and share your files instantly with zero middleman databases, no file sizes caps, and complete ownership of your data.", - "getStarted": "Get Started", - "exploreFeatures": "Explore Features", - "tags": { - "encrypted": "MTProto Encrypted", - "fileSize": "Up to 4GB/File", - "direct": "Direct-to-API" - }, - "driveWidget": { - "title": "My AudioMesh Drive", - "uploading": "Uploading…", - "hoursAgo": "2 hours ago", - "yesterday": "Yesterday", - "dropzoneTitle": "Drag and drop files to upload", - "dropzoneSubtitle": "Syncs immediately directly with Telegram API" - }, - "features": { - "title": "Engineered for Performance", - "subtitle": "Everything you need to manage your digital life with minimal friction.", - "infinite": { - "title": "Infinite Storage", - "description": "Break free from restrictive quotas. Leverage Telegram's limitless infrastructure to store documents, media, and archives without ever worrying about running out of space.", - "stat": "Unlimited", - "statLabel": "Storage cap" - }, - "security": { - "title": "Bank-Grade Security", - "description": "Your files are protected by MTProto 2.0 encryption — the same protocol securing 900M+ Telegram users. Only you hold the decryption keys.", - "stat": "256-bit", - "statLabel": "AES encryption" - }, - "transfers": { - "title": "Turbocharged Transfers", - "description": "Experience unmatched upload and download speeds optimized across global distributed servers.", - "stat": "Up to 4 GB", - "statLabel": "Per file" - }, - "sync": { - "title": "Seamless Sync across Devices", - "description": "Access your files instantly from your desktop, tablet, or phone. Changes sync in real-time across the ecosystem.", - "stat": "Real-time", - "statLabel": "Cross-device sync" - }, - "search": { - "title": "Instant Smart Search", - "description": "Find any file in milliseconds with full-text search across filenames, types, and metadata. No more endless scrolling.", - "stat": "<50 ms", - "statLabel": "Average search time" - }, - "share": { - "title": "One-Click Sharing", - "description": "Generate secure shareable links instantly. Set expiry times, password-protect links, and revoke access at any time.", - "stat": "Zero", - "statLabel": "Third-party servers" - } - } + "heroBadge": "📶 Next-Gen Audio Mesh Protocol", + "heroTitlePrefix": "Harmonize Your Devices,", + "heroTitleSpan": "Amplify Your Sound.", + "heroDescription": "AudioMesh seamlessly bridges nearby smartphones, tablets, and computers over Wi-Fi and Bluetooth networks, transforming them into a unified, perfectly synchronized speaker array. Enjoy immersive sound without expensive hardware.", + "downloadApp": "Download App", + "readDocs": "Read Documentation", + "scrollExplore": "Scroll to explore", + "featuresTitle": "Engineered for Synchronization", + "featuresSubtitle": "Everything you need to turn any collection of devices into an active audio node.", + "feature1Title": "Dual-Protocol Sync", + "feature1Desc": "Utilizes both local Wi-Fi networks and Bluetooth multi-point connections to ensure maximum range, stability, and synchronization.", + "feature2Title": "Seamless Fallback", + "feature2Desc": "If the Wi-Fi connection drops or weakens, the system automatically routes the audio stream through the Bluetooth mesh to prevent playback drops.", + "feature3Title": "Dynamic Node Management", + "feature3Desc": "Devices can join or leave the AudioMesh session dynamically on the fly without interrupting the host's audio stream.", + "feature4Title": "Universal Compatibility", + "feature4Desc": "Completely hardware-agnostic. Runs seamlessly across iOS, Android, macOS, Windows, and Linux operating systems.", + "howItWorksTitle": "How It Works", + "howItWorksSubtitle": "Setting up your synchronized speaker network in seconds.", + "step1Title": "1. Initialize Host", + "step1Desc": "Designate any device as the primary transmitter. Load your audio stream and start the session.", + "step2Title": "2. Broadcast Signal", + "step2Desc": "The host broadcasts timing packets over local Wi-Fi and Bluetooth protocols.", + "step3Title": "3. Link Nodes", + "step3Desc": "Nearby client devices discover the host and join the audio mesh network instantly.", + "step4Title": "4. Auto-Sync Latency", + "step4Desc": "AudioMesh automatically measures and adjusts sub-millisecond audio delays for perfect phase alignment.", + "interactiveTitle": "Interactive Audio Mesh Console", + "interactiveSubtitle": "Interact with the nodes below to adjust latency offsets, adjust volume levels, and trigger wave sync propagation.", + "nodeTitle": "Node Configurator", + "nodeVolume": "Node Volume", + "nodeLatency": "Latency Offset", + "nodeStatus": "Connection Status", + "active": "Active", + "syncing": "Syncing", + "muted": "Muted", + "wavePropagate": "Trigger Wave Propagation", + "playTestTone": "Play Test Tone", + "statsActiveNodes": "Active Nodes", + "statsSyncRate": "Sync Accuracy", + "statsLatency": "Avg Latency", + "consoleHeader": "Mesh Routing Console", + "logSyncWiFi": "[SYS] Syncing node {{name}} via Wi-Fi (RTT {{rtt}}ms)", + "logFallbackBT": "[NET] Falling back to Bluetooth for {{name}}", + "logLatencyCorrect": "[SYNC] Latency drift corrected ({{offset}}ms)", + "logStatusChange": "[NODE] Node {{name}} state set to {{status}}", + "logWaveTrigger": "[WAVE] Emitting timing pulses across all nodes...", + "optSyncButton": "Optimize Sync", + "logCalibrateStart": "[SYS] Starting auto-calibration sequence...", + "logCalibratePing": "[SYNC] Pinged {{name}} (RTT {{rtt}}ms) -> calibrating...", + "logCalibrateSuccess": "[SYS] Optimization complete: 5/5 nodes fully aligned (0ms drift).", + "step1": "STEP 01", + "step2": "STEP 02", + "step3": "STEP 03", + "step4": "STEP 04", + "nodeNameMacbook": "MacBook Pro", + "nodeNameIpad": "iPad Pro", + "nodeNameIphone": "iPhone 15", + "nodeNameAndroid": "Galaxy S24", + "nodeNameSpeaker": "Mesh Speaker", + "logDaemonInit": "[SYS] AudioMesh Routing Daemon initialised on 127.0.0.1:3000", + "logDualSync": "[NET] Dual-protocol synchronization running: Wi-Fi + Bluetooth", + "logReady": "[SYS] Ready for connection discovery...", + "logVolumeUpdate": "[NODE] {{name}} volume updated to {{volume}}%", + "logLatencyCalibrate": "[SYNC] Calibrated latency offset for {{name}}: {{sign}}{{latency}}ms", + "logStatusSet": "[SYS] Node {{name}} state set to {{status}}", + "logAudioInject": "[AUDIO] Injecting Beethoven \"Für Elise\" melody for phase checks", + "logAudioDisable": "[AUDIO] Test tone disabled" }, "Footer": { - "copyrightText": "© {{year}} audiomesh.com | All rights reserved", - "tagline": "Unlimited cloud storage, secure, fast, and completely powered by Telegram.", - "madeWith": "Made with ❤️ for the cloud." + "copyrightText": "© {{year}} AudioMesh | All rights reserved", + "tagline": "Turn any device into a synchronized speaker node over Wi-Fi and Bluetooth.", + "madeWith": "Made with ❤️ for audio.", + "legalHeading": "Legal", + "teamHeading": "Company", + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "disclaimer": "Disclaimer", + "contactUs": "Contact Us", + "aboutUs": "About Us", + "faqs": "FAQs", + "themeLight": "Light", + "themeDark": "Dark" }, "NavigationBar": { "Home": "Home", @@ -153,4 +172,4 @@ "buttonPlayStore": "Get it on Google Play" } } -} +} \ No newline at end of file diff --git a/shared/common/src/localization/locales/es/web.json b/shared/common/src/localization/locales/es/web.json index 61c0be8..412f78c 100644 --- a/shared/common/src/localization/locales/es/web.json +++ b/shared/common/src/localization/locales/es/web.json @@ -1,64 +1,73 @@ { "LandingPage": { - "heroBadge": "Almacenamiento seguro e ilimitado en la nube", - "heroText": "Vasto almacenamiento en la nube", - "poweredBy": "Desarrollado por Telegram", - "subHeroText": "Acceda a almacenamiento ilimitado en la nube directamente a través de la API MTProto de Telegram. Suba, administre y comparta sus archivos instantáneamente sin bases de datos intermediarias, sin límites de tamaño de archivo y con la propiedad completa de sus datos.", - "getStarted": "Comenzar", - "exploreFeatures": "Explorar funciones", - "tags": { - "encrypted": "Cifrado MTProto", - "fileSize": "Hasta 4 GB por archivo", - "direct": "Directo a la API" - }, - "driveWidget": { - "title": "Mi unidad AudioMesh", - "uploading": "Subiendo...", - "hoursAgo": "Hace 2 horas", - "yesterday": "Ayer", - "dropzoneTitle": "Arrastre y suelte archivos aquí para subirlos", - "dropzoneSubtitle": "Se sincroniza de forma inmediata directamente con la API de Telegram" - }, - "features": { - "title": "Diseñado para el rendimiento", - "subtitle": "Todo lo que necesita para administrar su vida digital con la menor fricción.", - "infinite": { - "title": "Almacenamiento infinito", - "description": "Libérese de las cuotas restrictivas. Aproveche la infraestructura ilimitada de Telegram para almacenar documentos, archivos multimedia e históricos sin preocuparse por quedarse sin espacio.", - "stat": "Ilimitado", - "statLabel": "Límite de espacio" - }, - "security": { - "title": "Seguridad de nivel bancario", - "description": "Sus archivos están protegidos por el cifrado MTProto 2.0, el mismo protocolo que protege a más de 900 millones de usuarios de Telegram. Solo usted posee las claves de descifrado.", - "stat": "256 bits", - "statLabel": "Cifrado AES" - }, - "transfers": { - "title": "Transferencias aceleradas", - "description": "Experimente velocidades de subida y bajada inigualables y optimizadas en servidores globales distribuidos.", - "stat": "Hasta 4 GB", - "statLabel": "Por archivo" - }, - "sync": { - "title": "Sincronización sin fisuras en todos los dispositivos", - "description": "Acceda a sus archivos instantáneamente desde su computadora, tableta o teléfono. Los cambios se sincronizan en tiempo real en todo el ecosistema.", - "stat": "Tiempo real", - "statLabel": "Sincronización entre dispositivos" - }, - "search": { - "title": "Búsqueda inteligente instantánea", - "description": "Encuentre cualquier archivo en milisegundos con la búsqueda de texto completo en nombres de archivo, tipos y metadatos. Se acabó el desplazamiento interminable.", - "stat": "<50 ms", - "statLabel": "Tiempo medio de búsqueda" - }, - "share": { - "title": "Compartir con un solo clic", - "description": "Genere enlaces compartibles seguros al instante. Establezca tiempos de expiración, proteja enlaces con contraseña y revoque el acceso en cualquier momento.", - "stat": "Cero", - "statLabel": "Servidores de terceros" - } - } + "heroBadge": "📶 Protocolo de audio mesh de próxima generación", + "heroTitlePrefix": "Harmonice sus dispositivos,", + "heroTitleSpan": "amplifique su sonido.", + "heroDescription": "AudioMesh conecta de manera fluida teléfonos inteligentes, tabletas y computadoras cercanas a través de redes Wi-Fi y Bluetooth, transformándolos en un sistema de altavoces unificado y perfectamente sincronizado. Disfrute de un sonido envolvente sin hardware costoso.", + "downloadApp": "Descargar aplicación", + "readDocs": "Leer documentación", + "scrollExplore": "Desplácese para explorar", + "featuresTitle": "Diseñado para la sincronización", + "featuresSubtitle": "Todo lo que necesita para convertir cualquier colección de dispositivos en un nodo de audio activo.", + "feature1Title": "Sincronización de doble protocolo", + "feature1Desc": "Utiliza tanto redes Wi-Fi locales como conexiones multipunto de Bluetooth para garantizar el máximo alcance, estabilidad y sincronización.", + "feature2Title": "Alternativa sin interrupciones", + "feature2Desc": "Si la conexión Wi-Fi se cae o se debilita, el sistema redirige automáticamente el flujo de audio a través de la red mesh de Bluetooth para evitar cortes en la reproducción.", + "feature3Title": "Gestión dinámica de nodos", + "feature3Desc": "Los dispositivos pueden unirse o salir de la sesión de AudioMesh dinámicamente sobre la marcha sin interrumpir el flujo de audio del host.", + "feature4Title": "Compatibilidad universal", + "feature4Desc": "Completamente agnóstico del hardware. Funciona sin problemas en sistemas operativos iOS, Android, macOS, Windows y Linux.", + "howItWorksTitle": "Cómo funciona", + "howItWorksSubtitle": "Configure su red de altavoces sincronizados en cuestión de segundos.", + "step1Title": "1. Inicializar Host", + "step1Desc": "Designe cualquier dispositivo como el transmisor principal. Cargue su flujo de audio e inicie la sesión.", + "step2Title": "2. Transmitir señal", + "step2Desc": "El host transmite paquetes de sincronización de tiempo a través de protocolos Wi-Fi y Bluetooth locales.", + "step3Title": "3. Vincular nodos", + "step3Desc": "Los dispositivos cliente cercanos descubren el host y se unen a la red mesh de audio al instante.", + "step4Title": "4. Sincronización automática de latencia", + "step4Desc": "AudioMesh mide y ajusta automáticamente los retrasos de audio de sub-milisegundos para una perfecta alineación de fase.", + "interactiveTitle": "Consola interactiva de AudioMesh", + "interactiveSubtitle": "Interactúe con los nodos para ajustar la latencia, el volumen y activar la propagación de ondas de sincronización.", + "nodeTitle": "Configurador de nodo", + "nodeVolume": "Volumen del nodo", + "nodeLatency": "Compensación de latencia", + "nodeStatus": "Estado de conexión", + "active": "Activo", + "syncing": "Sincronizando", + "muted": "Silenciado", + "wavePropagate": "Propagar onda de sincronización", + "playTestTone": "Reproducir tono de prueba", + "statsActiveNodes": "Nodos activos", + "statsSyncRate": "Precisión de sincronización", + "statsLatency": "Latencia media", + "consoleHeader": "Consola de enrutamiento mesh", + "logSyncWiFi": "[SYS] Sincronizando nodo {{name}} por Wi-Fi (RTT {{rtt}}ms)", + "logFallbackBT": "[NET] Cambiando a Bluetooth para {{name}}", + "logLatencyCorrect": "[SYNC] Corrección de desviación de latencia ({{offset}}ms)", + "logStatusChange": "[NODE] Estado del nodo {{name}} establecido en {{status}}", + "logWaveTrigger": "[WAVE] Emitiendo pulsos de sincronización a todos los nodos...", + "optSyncButton": "Optimizar Sincronización", + "logCalibrateStart": "[SYS] Iniciando secuencia de autocalibración...", + "logCalibratePing": "[SYNC] Ping a {{name}} (RTT {{rtt}}ms) -> calibrando...", + "logCalibrateSuccess": "[SYS] Optimización completa: 5/5 nodos alineados (desviación de 0ms).", + "step1": "PASO 01", + "step2": "PASO 02", + "step3": "PASO 03", + "step4": "PASO 04", + "nodeNameMacbook": "MacBook Pro", + "nodeNameIpad": "iPad Pro", + "nodeNameIphone": "iPhone 15", + "nodeNameAndroid": "Galaxy S24", + "nodeNameSpeaker": "Altavoz Mesh", + "logDaemonInit": "[SYS] Demonio de enrutamiento AudioMesh inicializado en 127.0.0.1:3000", + "logDualSync": "[NET] Sincronización de doble protocolo activa: Wi-Fi + Bluetooth", + "logReady": "[SYS] Listo para el descubrimiento de conexiones...", + "logVolumeUpdate": "[NODE] Volumen de {{name}} actualizado al {{volume}}%", + "logLatencyCalibrate": "[SYNC] Latencia compensada calibrada para {{name}}: {{sign}}{{latency}}ms", + "logStatusSet": "[SYS] Estado del nodo {{name}} establecido en {{status}}", + "logAudioInject": "[AUDIO] Inyectando melodía \"Para Elisa\" de Beethoven para comprobación de fase", + "logAudioDisable": "[AUDIO] Tono de prueba desactivado" }, "Footer": { "copyrightText": "© {{year}} audiomesh.com | Todos los derechos reservados", @@ -153,4 +162,4 @@ "buttonPlayStore": "Consíguelo en Google Play" } } -} +} \ No newline at end of file diff --git a/shared/common/src/localization/locales/hi/web.json b/shared/common/src/localization/locales/hi/web.json index 9fc6790..1b528c2 100644 --- a/shared/common/src/localization/locales/hi/web.json +++ b/shared/common/src/localization/locales/hi/web.json @@ -1,6 +1,6 @@ { "LandingPage": { - "heroBadge": "सुरक्षित और असीमित क्लाउड स्टोरेज", + "heroBadge": "📶 अगली पीढ़ी का ऑडियो मेश प्रोटोकॉल", "heroText": "विशाल क्लाउड स्टोरेज", "poweredBy": "टेलीग्राम द्वारा संचालित", "subHeroText": "टेलीग्राम के MTProto API के माध्यम से सीधे असीमित क्लाउड स्टोरेज एक्सेस करें। बिना किसी मध्यस्थ डेटाबेस, बिना फ़ाइल आकार की सीमा और अपने डेटा के पूर्ण स्वामित्व के साथ अपनी फ़ाइलों को तुरंत अपलोड, प्रबंधित और साझा करें।", @@ -58,7 +58,46 @@ "stat": "शून्य", "statLabel": "तृतीय-पक्ष सर्वर" } - } + }, + "statsActiveNodes": "सक्रिय नोड्स", + "statsSyncRate": "सिंक सटीकता", + "statsLatency": "औसत विलंबता", + "consoleHeader": "मेश राउटिंग कंसोल", + "logSyncWiFi": "[SYS] वाई-फाई के माध्यम से नोड {{name}} सिंक किया जा रहा है (RTT {{rtt}}ms)", + "logFallbackBT": "[NET] {{name}} के लिए ब्लूटूथ पर वापस जा रहा है", + "logLatencyCorrect": "[SYNC] विलंबता विचलन ठीक किया गया ({{offset}}ms)", + "logStatusChange": "[NODE] नोड {{name}} की स्थिति {{status}} सेट की गई", + "logWaveTrigger": "[WAVE] सभी नोड्स में सिंक तरंगें प्रसारित की जा रही हैं...", + "nodeTitle": "नोड विन्यासकर्ता", + "nodeVolume": "नोड वॉल्यूम", + "nodeLatency": "विलंबता ऑफ़सेट", + "nodeStatus": "कनेक्शन स्थिति", + "active": "सक्रिय", + "syncing": "सिंक हो रहा है", + "muted": "म्यूट किया गया", + "wavePropagate": "सिंक तरंग प्रसारित करें", + "playTestTone": "परीक्षण टोन बजाएं", + "optSyncButton": "सिंक अनुकूलित करें", + "logCalibrateStart": "[SYS] ऑटो-कैलिब्रेशन अनुक्रम शुरू हो रहा है...", + "logCalibratePing": "[SYNC] {{name}} को पिंग किया गया (RTT {{rtt}}ms) -> कैलिब्रेट किया जा रहा है...", + "logCalibrateSuccess": "[SYS] अनुकूलन पूर्ण: 5/5 नोड्स पूरी तरह से संरेखित (0ms बहाव)।", + "step1": "चरण 01", + "step2": "चरण 02", + "step3": "चरण 03", + "step4": "चरण 04", + "nodeNameMacbook": "मैकबुक प्रो", + "nodeNameIpad": "आईपैड प्रो", + "nodeNameIphone": "आईफोन 15", + "nodeNameAndroid": "गैलेक्सी S24", + "nodeNameSpeaker": "मेश स्पीकर", + "logDaemonInit": "[SYS] AudioMesh राउटिंग डेमन 127.0.0.1:3000 पर प्रारंभ किया गया", + "logDualSync": "[NET] दोहरी-प्रोटोकॉल सिंक्रनाइज़ेशन चल रहा है: वाई-फाई + ब्लूटूथ", + "logReady": "[SYS] कनेक्शन खोज के लिए तैयार...", + "logVolumeUpdate": "[NODE] {{name}} वॉल्यूम {{volume}}% पर अपडेट किया गया", + "logLatencyCalibrate": "[SYNC] {{name}} के लिए कैलिब्रेटेड लेटेंसी ऑफ़सेट: {{sign}}{{latency}}ms", + "logStatusSet": "[SYS] नोड {{name}} स्थिति {{status}} पर सेट की गई", + "logAudioInject": "[AUDIO] चरण जांच के लिए बीथोवेन \"फर एलिस\" मेलोडी इंजेक्ट की जा रही है", + "logAudioDisable": "[AUDIO] परीक्षण टोन अक्षम" }, "Footer": { "copyrightText": "© {{year}} audiomesh.com | सर्वाधिकार सुरक्षित", @@ -153,4 +192,4 @@ "buttonPlayStore": "इसे Google Play पर प्राप्त करें" } } -} +} \ No newline at end of file diff --git a/shared/common/src/localization/locales/ja/web.json b/shared/common/src/localization/locales/ja/web.json index 1a2ac97..5bfd577 100644 --- a/shared/common/src/localization/locales/ja/web.json +++ b/shared/common/src/localization/locales/ja/web.json @@ -1,64 +1,73 @@ { "LandingPage": { - "heroBadge": "安全で無制限のクラウドストレージ", - "heroText": "広大なクラウドストレージ", - "poweredBy": "Telegramによる提供", - "subHeroText": "TelegramのMTProto APIを介して、無制限のクラウドストレージに直接アクセスします。仲介データベースやファイルサイズ制限なしで、ファイルを即座にアップロード、管理、共有できます。データの完全な所有権を維持します。", - "getStarted": "始める", - "exploreFeatures": "機能を探索", - "tags": { - "encrypted": "MTProto暗号化", - "fileSize": "最大4GB/ファイル", - "direct": "API直結" - }, - "driveWidget": { - "title": "マイ AudioMesh ドライブ", - "uploading": "アップロード中...", - "hoursAgo": "2時間前", - "yesterday": "昨日", - "dropzoneTitle": "ファイルをドラッグ&ドロップしてアップロード", - "dropzoneSubtitle": "Telegram APIと直接かつ即座に同期" - }, - "features": { - "title": "パフォーマンスに特化した設計", - "subtitle": "最小限の摩擦でデジタルライフを管理するために必要なすべてを提供します。", - "infinite": { - "title": "無制限のストレージ", - "description": "制限的なクォータから解放されましょう。Telegramの無制限のインフラを活用して、容量不足を心配することなく文書、メディア、アーカイブを保存できます。", - "stat": "無制限", - "statLabel": "ストレージ容量" - }, - "security": { - "title": "銀行レベルのセキュリティ", - "description": "ファイルは、9億人以上のTelegramユーザーを保護しているのと同じMTProto 2.0暗号化によって保護されています。復号キーを所有しているのはあなただけです。", - "stat": "256ビット", - "statLabel": "AES暗号化" - }, - "transfers": { - "title": "高速転送", - "description": "グローバルに分散されたサーバーに最適化された、比類のないアップロードとダウンロード速度を体験してください。", - "stat": "最大4 GB", - "statLabel": "ファイルごと" - }, - "sync": { - "title": "デバイス間のシームレスな同期", - "description": "デスクトップ、タブレット、スマートフォンからファイルに即座にアクセスできます。変更はエコシステム全体でリアルタイムに同期されます。", - "stat": "リアルタイム", - "statLabel": "マルチデバイス同期" - }, - "search": { - "title": "スマートな検索機能", - "description": "ファイル名、タイプ、メタデータの全文検索により、ミリ秒単位でファイルを見つけることができます。もうスクロールし続ける必要はありません。", - "stat": "50ミリ秒未満", - "statLabel": "平均検索時間" - }, - "share": { - "title": "ワンクリック共有", - "description": "安全な共有リンクを即座に生成。有効期限の設定、リンクのパスワード保護、アクセス権のいつでも取り消しが可能です。", - "stat": "ゼロ", - "statLabel": "サードパーティサーバー" - } - } + "heroBadge": "📶 次世代オーディオメッシュプロトコル", + "heroTitlePrefix": "デバイスを調和させ、", + "heroTitleSpan": "サウンドを増幅する。", + "heroDescription": "AudioMeshは、ローカルWi-FiとBluetoothを介して周囲のスマホ、タブレット、PCをシームレスに接続し、完全に同期されたスピーカーシステムに変貌させます。高価なハードウェアなしで没入型サウンドをお楽しみください。", + "downloadApp": "アプリをダウンロード", + "readDocs": "ドキュメントを読む", + "scrollExplore": "スクロールして探索", + "featuresTitle": "同期のために設計", + "featuresSubtitle": "あらゆるデバイス群をアクティブなオーディオノードに変えるために必要なすべて。", + "feature1Title": "デュアルプロトコル同期", + "feature1Desc": "ローカルWi-FiとBluetoothマルチポイント接続の両方を活用し、最大の範囲、安定性、同期を確保します。", + "feature2Title": "シームレスなフォールバック", + "feature2Desc": "Wi-Fi接続が低下した場合、再生の中断を防ぐために自動的にBluetoothメッシュ経由で音声をルーティングします。", + "feature3Title": "ダイナミックノード管理", + "feature3Desc": "ホストの音声ストリームを中断することなく、デバイスは動的にセッションに参加または離脱できます。", + "feature4Title": "ユニバーサルな互換性", + "feature4Desc": "完全にハードウェアに依存しません。iOS、Android、macOS、Windows、Linuxで動作します。", + "howItWorksTitle": "仕組み", + "howItWorksSubtitle": "数秒で同期スピーカーネットワークをセットアップします。", + "step1Title": "1. ホスト初期化", + "step1Desc": "任意のデバイスをプライマリ送信機に指定し、オーディオストリームをロードして開始します。", + "step2Title": "2. シグナル放送", + "step2Desc": "ホストはローカルWi-FiおよびBluetoothを介して同期タイミングパケットを放送します。", + "step3Title": "3. ノード接続", + "step3Desc": "近くのクライアントデバイスがホストを検出し、即座にオーディオメッシュに参加します。", + "step4Title": "4. 遅延の自動同期", + "step4Desc": "AudioMeshは、完璧な位相アライメントのために、ミリ秒未満のオーディオ遅延を自動的に測定および調整します。", + "interactiveTitle": "インタラクティブ・オーディオメッシュ・コンソール", + "interactiveSubtitle": "ノードを操作して遅延、音量を調整し、同期ウェーブを発生させます。", + "nodeTitle": "ノード設定", + "nodeVolume": "ノード音量", + "nodeLatency": "遅延オフセット", + "nodeStatus": "接続ステータス", + "active": "アクティブ", + "syncing": "同期中", + "muted": "ミュート", + "wavePropagate": "同期ウェーブをトリガー", + "playTestTone": "テストトーン再生", + "statsActiveNodes": "有効ノード", + "statsSyncRate": "同期精度", + "statsLatency": "平均遅延", + "consoleHeader": "メッシュルーティングコンソール", + "logSyncWiFi": "[SYS] Wi-Fi経由でノード {{name}} を同期中 (RTT {{rtt}}ms)", + "logFallbackBT": "[NET] {{name}} のためにBluetoothへフォールバック中", + "logLatencyCorrect": "[SYNC] 遅延のズレを補正しました ({{offset}}ms)", + "logStatusChange": "[NODE] ノード {{name}} のステータスを {{status}} に設定しました", + "logWaveTrigger": "[WAVE] すべてのノードへ同期タイミングパルスを送信中...", + "optSyncButton": "同期の最適化", + "logCalibrateStart": "[SYS] 自動調整シーケンスを開始中...", + "logCalibratePing": "[SYNC] {{name}} をピング (RTT {{rtt}}ms) -> 調整中...", + "logCalibrateSuccess": "[SYS] 最適化完了: 5/5 のノードが完全に同期しました (遅延 0ms)", + "step1": "ステップ 01", + "step2": "ステップ 02", + "step3": "ステップ 03", + "step4": "ステップ 04", + "nodeNameMacbook": "MacBook Pro", + "nodeNameIpad": "iPad Pro", + "nodeNameIphone": "iPhone 15", + "nodeNameAndroid": "Galaxy S24", + "nodeNameSpeaker": "メッシュスピーカー", + "logDaemonInit": "[SYS] AudioMeshルーティングデーモンが127.0.0.1:3000で初期化されました", + "logDualSync": "[NET] デュアルプロトコル同期実行中: Wi-Fi + Bluetooth", + "logReady": "[SYS] 接続検出準備完了...", + "logVolumeUpdate": "[NODE] {{name}} の音量を {{volume}}% に更新しました", + "logLatencyCalibrate": "[SYNC] {{name}} の遅延オフセットを調整完了: {{sign}}{{latency}}ms", + "logStatusSet": "[SYS] ノード {{name}} の状態を {{status}} に設定しました", + "logAudioInject": "[AUDIO] 位相チェックのためベートーヴェン「エリーゼのために」の旋律を再生", + "logAudioDisable": "[AUDIO] テスト音を無効化しました" }, "Footer": { "copyrightText": "© {{year}} audiomesh.com | All rights reserved", @@ -153,4 +162,4 @@ "buttonPlayStore": "Google Playで入手" } } -} +} \ No newline at end of file diff --git a/shared/common/src/localization/locales/ru/web.json b/shared/common/src/localization/locales/ru/web.json index e3a0c98..e00afae 100644 --- a/shared/common/src/localization/locales/ru/web.json +++ b/shared/common/src/localization/locales/ru/web.json @@ -1,64 +1,73 @@ { "LandingPage": { - "heroBadge": "Безопасное и неограниченное облачное хранилище", - "heroText": "Огромное облачное хранилище", - "poweredBy": "На базе Telegram", - "subHeroText": "Получите доступ к неограниченному облачному хранилищу напрямую через API MTProto от Telegram. Загружайте файлы, управляйте ими и делитесь ими мгновенно, без промежуточных баз данных, ограничений на размер файлов и при полном владении своими данными.", - "getStarted": "Начать", - "exploreFeatures": "Возможности", - "tags": { - "encrypted": "Шифрование MTProto", - "fileSize": "До 4 ГБ на файл", - "direct": "Прямо к API" - }, - "driveWidget": { - "title": "Мой диск AudioMesh", - "uploading": "Загрузка...", - "hoursAgo": "2 часа назад", - "yesterday": "Вчера", - "dropzoneTitle": "Перетащите файлы сюда для загрузки", - "dropzoneSubtitle": "Синхронизируется мгновенно напрямую с Telegram API" - }, - "features": { - "title": "Создан для высокой производительности", - "subtitle": "Все, что вам нужно для управления цифровой жизнью с минимальными усилиями.", - "infinite": { - "title": "Безлимитное хранилище", - "description": "Освободитесь от ограничений квот. Используйте неограниченную инфраструктуру Telegram для надежного хранения документов, медиа и архивов.", - "stat": "Безлимитный", - "statLabel": "Объем хранилища" - }, - "security": { - "title": "Банковский уровень безопасности", - "description": "Ваши файлы защищены шифрованием MTProto 2.0 — тем же протоколом, который защищает более 900 миллионов пользователей Telegram. Только у вас есть ключи дешифрования.", - "stat": "256 бит", - "statLabel": "Шифрование AES" - }, - "transfers": { - "title": "Турбо-передача данных", - "description": "Оцените непревзойденную скорость загрузки и скачивания, оптимизированную для распределенных глобальных серверов.", - "stat": "До 4 ГБ", - "statLabel": "На один файл" - }, - "sync": { - "title": "Синхронизация между устройствами", - "description": "Получайте мгновенный доступ к своим файлам с компьютера, планшета или телефона. Изменения синхронизируются в реальном времени.", - "stat": "Реальное время", - "statLabel": "Синхронизация данных" - }, - "search": { - "title": "Мгновенный умный поиск", - "description": "Находите любой файл за миллисекунды с помощью полнотекстового поиска по названиям файлов, типам и метаданным. Забудьте о бесконечной прокрутке.", - "stat": "<50 мс", - "statLabel": "Среднее время поиска" - }, - "share": { - "title": "Отправка в один клик", - "description": "Мгновенно создавайте безопасные ссылки для обмена файлами. Устанавливайте срок действия, защищайте паролем и закрывайте доступ в любое время.", - "stat": "Ноль", - "statLabel": "Сторонних серверов" - } - } + "heroBadge": "📶 Аудиосетка нового поколения", + "heroTitlePrefix": "Гармония ваших устройств,", + "heroTitleSpan": "усиление вашего звука.", + "heroDescription": "AudioMesh беспрепятственно объединяет смартфоны, планшеты и компьютеры через локальный Wi-Fi и Bluetooth, превращая их в единую синхронизированную систему динамиков. Наслаждайтесь объемным звуком без покупки дорогого оборудования.", + "downloadApp": "Скачать приложение", + "readDocs": "Документация", + "scrollExplore": "Прокрутите для изучения", + "featuresTitle": "Создано для синхронизации", + "featuresSubtitle": "Все необходимое для превращения любых ваших устройств в активный аудиоузел.", + "feature1Title": "Двухпротокольный синк", + "feature1Desc": "Использует локальный Wi-Fi и многоточечный Bluetooth для обеспечения максимальной дальности, стабильности и синхронизации.", + "feature2Title": "Автоматический переход", + "feature2Desc": "При ухудшении Wi-Fi система автоматически перенаправляет поток через Bluetooth для предотвращения сбоев воспроизведения.", + "feature3Title": "Динамические узлы", + "feature3Desc": "Устройства могут подключаться или отключаться на лету без прерывания основного аудиопотока.", + "feature4Title": "Универсальность", + "feature4Desc": "Абсолютно не зависит от оборудования. Работает на iOS, Android, macOS, Windows и Linux.", + "howItWorksTitle": "Как это работает", + "howItWorksSubtitle": "Настройте синхронизированную сеть динамиков за секунды.", + "step1Title": "1. Запуск хоста", + "step1Desc": "Назначьте любое устройство основным передатчиком. Загрузите поток и начните сессию.", + "step2Title": "2. Вещание сигнала", + "step2Desc": "Хост транслирует пакеты синхронизации времени через локальный Wi-Fi и Bluetooth.", + "step3Title": "3. Подключение узлов", + "step3Desc": "Устройства обнаруживают хост и мгновенно подключаются к аудиосети.", + "step4Title": "4. Синхронизация задержки", + "step4Desc": "AudioMesh автоматически измеряет и корректирует субмиллисекундные задержки звука для идеальной фазовой автоподстройки.", + "interactiveTitle": "Интерактивная консоль AudioMesh", + "interactiveSubtitle": "Взаимодействуйте с узлами для настройки задержки, громкости и запуска волн синхронизации.", + "nodeTitle": "Настройка узла", + "nodeVolume": "Громкость узла", + "nodeLatency": "Смещение задержки", + "nodeStatus": "Статус подключения", + "active": "Активен", + "syncing": "Синхронизация", + "muted": "Без звука", + "wavePropagate": "Запустить волну синхронизации", + "playTestTone": "Воспроизвести тестовый тон", + "statsActiveNodes": "Активные узлы", + "statsSyncRate": "Точность синхронизации", + "statsLatency": "Средняя задержка", + "consoleHeader": "Консоль маршрутизации сети", + "logSyncWiFi": "[SYS] Синхронизация узла {{name}} по Wi-Fi (RTT {{rtt}}мс)", + "logFallbackBT": "[NET] Переключение на Bluetooth для {{name}}", + "logLatencyCorrect": "[SYNC] Корректировка дрейфа задержки ({{offset}}мс)", + "logStatusChange": "[NODE] Статус узла {{name}} изменен на {{status}}", + "logWaveTrigger": "[WAVE] Трансляция синхроимпульсов на все узлы...", + "optSyncButton": "Оптимизировать синхронизацию", + "logCalibrateStart": "[SYS] Запуск автокалибровки...", + "logCalibratePing": "[SYNC] Пинг {{name}} (RTT {{rtt}}ms) -> калибровка...", + "logCalibrateSuccess": "[SYS] Оптимизация завершена: 5/5 узлов выровнены (сдвиг 0 мс).", + "step1": "ШАГ 01", + "step2": "ШАГ 02", + "step3": "ШАГ 03", + "step4": "ШАГ 04", + "nodeNameMacbook": "MacBook Pro", + "nodeNameIpad": "iPad Pro", + "nodeNameIphone": "iPhone 15", + "nodeNameAndroid": "Galaxy S24", + "nodeNameSpeaker": "Колонка Mesh", + "logDaemonInit": "[SYS] Демон маршрутизации AudioMesh запущен на 127.0.0.1:3000", + "logDualSync": "[NET] Запущена двухпротокольная синхронизация: Wi-Fi + Bluetooth", + "logReady": "[SYS] Готов к поиску подключений...", + "logVolumeUpdate": "[NODE] Громкость {{name}} изменена на {{volume}}%", + "logLatencyCalibrate": "[SYNC] Калибровка задержки для {{name}}: {{sign}}{{latency}}мс", + "logStatusSet": "[SYS] Статус узла {{name}} изменен на {{status}}", + "logAudioInject": "[AUDIO] Воспроизведение мелодии Бетховена «К Элизе» для фазовой проверки", + "logAudioDisable": "[AUDIO] Тестовый сигнал отключен" }, "Footer": { "copyrightText": "© {{year}} audiomesh.com | Все права защищены", @@ -153,4 +162,4 @@ "buttonPlayStore": "Скачать в Google Play" } } -} +} \ No newline at end of file diff --git a/shared/common/src/localization/locales/zh/web.json b/shared/common/src/localization/locales/zh/web.json index ffdb0f6..8eed794 100644 --- a/shared/common/src/localization/locales/zh/web.json +++ b/shared/common/src/localization/locales/zh/web.json @@ -1,64 +1,73 @@ { "LandingPage": { - "heroBadge": "安全且无限制的云存储", - "heroText": "海量云端存储", - "poweredBy": "基于 Telegram 技术", - "subHeroText": "直接通过 Telegram 的 MTProto API 访问无限的云存储空间。即时上传、管理和分享您的文件,无需中间数据库,没有文件大小限制,并且完全拥有您自己的数据。", - "getStarted": "立即体验", - "exploreFeatures": "了解产品特性", - "tags": { - "encrypted": "MTProto 加密", - "fileSize": "单文件最大支持 4GB", - "direct": "直连 API" - }, - "driveWidget": { - "title": "我的 AudioMesh 云盘", - "uploading": "上传中...", - "hoursAgo": "2 小时前", - "yesterday": "昨天", - "dropzoneTitle": "拖放文件至此处上传", - "dropzoneSubtitle": "即时与 Telegram API 直接同步" - }, - "features": { - "title": "专为极致性能而设计", - "subtitle": "以极低的摩擦力管理您的数字生活所需要的一切。", - "infinite": { - "title": "无限存储空间", - "description": "摆脱繁琐的配额限制。利用 Telegram 无穷的基础设施来存储文档、媒体和归档文件,从此无需担心空间不足。", - "stat": "无限制", - "statLabel": "存储上限" - }, - "security": { - "title": "金融级安全保障", - "description": "您的文件受到 MTProto 2.0 加密的保护 — 该协议目前保障着 9 亿多 Telegram 用户。只有您自己掌握解密密钥。", - "stat": "256位", - "statLabel": "AES 加密" - }, - "transfers": { - "title": "极速文件传输", - "description": "体验在分布式全球服务器上优化的卓越上传和下载速度。", - "stat": "最大 4 GB", - "statLabel": "单个文件" - }, - "sync": { - "title": "跨设备无缝同步", - "description": "从您的电脑、平板或手机即时访问您的文件。更改会在整个生态系统中实时同步。", - "stat": "实时", - "statLabel": "跨设备同步" - }, - "search": { - "title": "即时智能搜索", - "description": "通过对文件名、类型和元数据的全文检索,在几毫秒内找到任何文件。无需再无休止地滚动列表。", - "stat": "<50 毫秒", - "statLabel": "平均搜索耗时" - }, - "share": { - "title": "一键快速分享", - "description": "即时生成安全的分享链接。可以设置过期时间、使用密码保护链接,并随时撤销访问权限。", - "stat": "零", - "statLabel": "第三方服务器" - } - } + "heroBadge": "📶 下一代音频网状网协议", + "heroTitlePrefix": "设备和谐共鸣,", + "heroTitleSpan": "声效震撼升级。", + "heroDescription": "AudioMesh 通过本地 Wi-Fi 和蓝牙协议无缝连接附近的智能手机、平板电脑和计算机,将它们转化为统一且完美同步的扬声器阵列。无需昂贵的硬件即可享受身临其境的音效。", + "downloadApp": "下载应用", + "readDocs": "阅读文档", + "scrollExplore": "向下滚动探索", + "featuresTitle": "专为极致同步打造", + "featuresSubtitle": "将任意设备组合转化为活动音频节点所需的一切。", + "feature1Title": "双协议同步", + "feature1Desc": "结合本地 Wi-Fi 网络和蓝牙多点连接,确保最大范围、稳定性和完美同步。", + "feature2Title": "无缝容灾切换", + "feature2Desc": "如果 Wi-Fi 连接中断或变弱,系统会自动将音频流路由至蓝牙网状网络,以防止播放中断。", + "feature3Title": "动态节点管理", + "feature3Desc": "设备可以在不中断主控音频流的情况下,在运行中动态加入或退出 AudioMesh 会话。", + "feature4Title": "广泛兼容性", + "feature4Desc": "完全不依赖特定硬件。在 iOS、Android、macOS、Windows 和 Linux 系统上均可流畅运行。", + "howItWorksTitle": "工作原理", + "howItWorksSubtitle": "几秒钟内即可设置好您的同步扬声器网络。", + "step1Title": "1. 初始化主控", + "step1Desc": "将任意设备指定为主发射器。加载音频流并启动会话。", + "step2Title": "2. 广播信号", + "step2Desc": "主控端通过本地 Wi-Fi 和蓝牙广播时间同步数据包。", + "step3Title": "3. 连接节点", + "step3Desc": "附近的客户端设备发现主控端并立即加入音频网状网络。", + "step4Title": "4. 自动同步延迟", + "step4Desc": "AudioMesh 自动测量并调整亚毫秒级音频延迟,以实现完美的相位对齐。", + "interactiveTitle": "互动音频网控制台", + "interactiveSubtitle": "点击或调节下方的节点来配置延迟偏差、音量,并触发同步声波扩散。", + "nodeTitle": "节点配置", + "nodeVolume": "节点音量", + "nodeLatency": "延迟偏差", + "nodeStatus": "连接状态", + "active": "已激活", + "syncing": "同步中", + "muted": "已静音", + "wavePropagate": "触发同步声波", + "playTestTone": "播放测试音", + "statsActiveNodes": "活动节点", + "statsSyncRate": "同步精度", + "statsLatency": "平均延迟", + "consoleHeader": "网络路由控制台", + "logSyncWiFi": "[SYS] 正在通过 Wi-Fi 同步节点 {{name}} (RTT {{rtt}}ms)", + "logFallbackBT": "[NET] {{name}} 连接已回退至蓝牙协议", + "logLatencyCorrect": "[SYNC] 已纠正延迟偏差 ({{offset}}ms)", + "logStatusChange": "[NODE] 节点 {{name}} 状态已变更为 {{status}}", + "logWaveTrigger": "[WAVE] 正在向所有节点广播时间脉冲信号...", + "optSyncButton": "优化同步", + "logCalibrateStart": "[SYS] 正在启动自动校准程序...", + "logCalibratePing": "[SYNC] 已 Ping {{name}} (RTT {{rtt}}ms) -> 正在校准...", + "logCalibrateSuccess": "[SYS] 优化完成:5/5 个节点完全对齐(0ms 偏差)。", + "step1": "步骤 01", + "step2": "步骤 02", + "step3": "步骤 03", + "step4": "步骤 04", + "nodeNameMacbook": "MacBook Pro", + "nodeNameIpad": "iPad Pro", + "nodeNameIphone": "iPhone 15", + "nodeNameAndroid": "Galaxy S24", + "nodeNameSpeaker": "网格扬声器", + "logDaemonInit": "[SYS] AudioMesh 路由守护进程已在 127.0.0.1:3000 初始化", + "logDualSync": "[NET] 双协议同步运行中:Wi-Fi + 蓝牙", + "logReady": "[SYS] 准备好进行连接发现...", + "logVolumeUpdate": "[NODE] {{name}} 音量已更新至 {{volume}}%", + "logLatencyCalibrate": "[SYNC] 已校准 {{name}} 的延迟偏差:{{sign}}{{latency}}ms", + "logStatusSet": "[SYS] 节点 {{name}} 状态已设置为 {{status}}", + "logAudioInject": "[AUDIO] 正在注入贝多芬《致爱丽丝》旋律以进行相位检查", + "logAudioDisable": "[AUDIO] 测试音已禁用" }, "Footer": { "copyrightText": "© {{year}} audiomesh.com | 保留所有权利", @@ -153,4 +162,4 @@ "buttonPlayStore": "在 Google Play 下载" } } -} +} \ No newline at end of file From 85712f52c7f91301a341c3056f6a0398084b1c70 Mon Sep 17 00:00:00 2001 From: Amit Raikwar Date: Fri, 12 Jun 2026 18:30:02 +0530 Subject: [PATCH 3/5] feat(AUD-8): implement LandingPage sub-sections and dynamic visualizers - Rebuild LandingPage structure with dedicated components: HeroSection, FeaturesSection, HowItWorksSection - Add MeshVisualizer component rendering nodes dynamically on a HTML5 Canvas - Add NodeConfigurator to adjust simulation settings (delay, distance, volume) - Add DiagnosticsTerminal simulated console logs - Upgrade main logo SVG paths and theme loading screen styles --- apps/web/src/screens/landingPage/Const.ts | 81 ++ .../src/screens/landingPage/LandingPage.tsx | 859 +++++++----------- .../components/DiagnosticsTerminal.tsx | 208 +++++ .../components/FeaturesSection.tsx | 112 +++ .../landingPage/components/HeroSection.tsx | 240 +++++ .../components/HowItWorksSection.tsx | 529 +++++++++++ .../landingPage/components/MeshVisualizer.tsx | 770 ++++++++++++++++ .../components/NodeConfigurator.tsx | 226 +++++ .../landingPage/components/TinyEqBars.tsx | 69 ++ .../landingPage/landingPage.module.css | 460 ++++++++++ apps/web/src/screens/landingPage/types.ts | 13 + shared/common/src/assets/icons/Logo.tsx | 125 +-- .../components/Loading/LoadingComponent.tsx | 524 +++++++++-- .../MdPreview/css/Markdown.module.css | 6 +- 14 files changed, 3458 insertions(+), 764 deletions(-) create mode 100644 apps/web/src/screens/landingPage/Const.ts create mode 100644 apps/web/src/screens/landingPage/components/DiagnosticsTerminal.tsx create mode 100644 apps/web/src/screens/landingPage/components/FeaturesSection.tsx create mode 100644 apps/web/src/screens/landingPage/components/HeroSection.tsx create mode 100644 apps/web/src/screens/landingPage/components/HowItWorksSection.tsx create mode 100644 apps/web/src/screens/landingPage/components/MeshVisualizer.tsx create mode 100644 apps/web/src/screens/landingPage/components/NodeConfigurator.tsx create mode 100644 apps/web/src/screens/landingPage/components/TinyEqBars.tsx create mode 100644 apps/web/src/screens/landingPage/landingPage.module.css create mode 100644 apps/web/src/screens/landingPage/types.ts diff --git a/apps/web/src/screens/landingPage/Const.ts b/apps/web/src/screens/landingPage/Const.ts new file mode 100644 index 0000000..d154737 --- /dev/null +++ b/apps/web/src/screens/landingPage/Const.ts @@ -0,0 +1,81 @@ +import { MelodyNote, Node } from './types'; + +export const INITIAL_NODES: Node[] = [ + { + id: 'macbook', + name: 'MacBook Pro', + volume: 80, + latency: 0, + status: 'active', + }, + { id: 'ipad', name: 'iPad Pro', volume: 60, latency: 15, status: 'active' }, + { + id: 'android', + name: 'Galaxy S24', + volume: 75, + latency: 10, + status: 'active', + }, + { + id: 'speaker', + name: 'Mesh Speaker', + volume: 65, + latency: -18, + status: 'active', + }, + { + id: 'iphone', + name: 'iPhone 15', + volume: 90, + latency: -5, + status: 'syncing', + }, +]; + +export const BEETHOVEN_MELODY: MelodyNote[] = [ + // Phrase 1 + { f: 659.25, d: 0.20 }, // E5 + { f: 622.25, d: 0.20 }, // D#5 + { f: 659.25, d: 0.20 }, // E5 + { f: 622.25, d: 0.20 }, // D#5 + { f: 659.25, d: 0.20 }, // E5 + { f: 493.88, d: 0.20 }, // B4 + { f: 587.33, d: 0.20 }, // D5 + { f: 523.25, d: 0.20 }, // C5 + { f: 440.00, d: 0.60, g: 0.15 }, // A4 + + // Phrase 2 + { f: 261.63, d: 0.20 }, // C4 + { f: 329.63, d: 0.20 }, // E4 + { f: 440.00, d: 0.20 }, // A4 + { f: 493.88, d: 0.60, g: 0.15 }, // B4 + + // Phrase 3 + { f: 329.63, d: 0.20 }, // E4 + { f: 415.30, d: 0.20 }, // G#4 + { f: 493.88, d: 0.20 }, // B4 + { f: 523.25, d: 0.60, g: 0.15 }, // C5 + + // Phrase 4 (Repeat Phrase 1) + { f: 659.25, d: 0.20 }, // E5 + { f: 622.25, d: 0.20 }, // D#5 + { f: 659.25, d: 0.20 }, // E5 + { f: 622.25, d: 0.20 }, // D#5 + { f: 659.25, d: 0.20 }, // E5 + { f: 493.88, d: 0.20 }, // B4 + { f: 587.33, d: 0.20 }, // D5 + { f: 523.25, d: 0.20 }, // C5 + { f: 440.00, d: 0.60, g: 0.15 }, // A4 + + // Phrase 5 (Repeat Phrase 2) + { f: 261.63, d: 0.20 }, // C4 + { f: 329.63, d: 0.20 }, // E4 + { f: 440.00, d: 0.20 }, // A4 + { f: 493.88, d: 0.60, g: 0.15 }, // B4 + + // Phrase 6 (Ending) + { f: 329.63, d: 0.20 }, // E4 + { f: 523.25, d: 0.20 }, // C5 + { f: 493.88, d: 0.20 }, // B4 + { f: 440.00, d: 0.60, g: 0.80 }, // A4 followed by a long pause +]; diff --git a/apps/web/src/screens/landingPage/LandingPage.tsx b/apps/web/src/screens/landingPage/LandingPage.tsx index 3688f65..69251c1 100644 --- a/apps/web/src/screens/landingPage/LandingPage.tsx +++ b/apps/web/src/screens/landingPage/LandingPage.tsx @@ -1,566 +1,329 @@ import * as React from 'react'; -import { - Box, - Heading, - Text, - Button, - VStack, - HStack, - SimpleGrid, - Flex, - Badge, - Stack, -} from '@chakra-ui/react'; -import { Link } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; import { TitleBoxContainer } from '@components'; -import { Icon, IconType } from '@assets'; +import { BEETHOVEN_MELODY, INITIAL_NODES } from './Const'; +import { Node } from './types'; +import HeroSection from './components/HeroSection'; +import DiagnosticsTerminal from './components/DiagnosticsTerminal'; +import HowItWorksSection from './components/HowItWorksSection'; +import FeaturesSection from './components/FeaturesSection'; -const MeshVisualizer = () => { - return ( - - {/* Wave propagation animations */} - - - - - {/* Main Connection Lines (SVGs) */} - - - - - - - {/* Host Node (Center) */} - - - - HOST - - - - {/* Node 1: Laptop (Top Left) */} - - - - - - - - - - MacBook Pro - - - - {/* Node 2: Tablet (Top Right) */} - - - - - - - - - - iPad Pro - - - - {/* Node 3: Smartphone (Bottom) */} - - - - - - - - - - iPhone 15 - - - +export const LandingPage = () => { + const { t } = useTranslation(); + + const [nodes, setNodes] = React.useState(INITIAL_NODES); + const [selectedNodeId, setSelectedNodeId] = React.useState( + null, ); -}; + const [isCalibrating, setIsCalibrating] = React.useState(false); + const [testToneActive, setTestToneActive] = React.useState(false); -const LandingPage = () => { - return ( - - - - {/* Hero Header Area */} - - - {/* LEFT: Copy content */} - - - 📶 Dual-Protocol Synchronization - - - - Harmonize Your Devices, -
- - Amplify Your Sound. - -
- - - AudioMesh seamlessly bridges nearby smartphones, tablets, and - computers over Wi-Fi and Bluetooth networks, transforming them - into a unified, perfectly synchronized speaker array. Enjoy - immersive sound without expensive hardware. - - - - - - -
- - {/* RIGHT: Visualizer */} - - - -
-
+ oscillatorRef.current = null; + gainNodeRef.current = null; + audioCtxRef.current = null; + } catch (e) { + // eslint-disable-next-line no-console + console.warn('Failed to stop audio context:', e); + } + }; + + React.useEffect(() => { + if (testToneActive) { + startAudio(); + } else { + stopAudio(); + } + return () => { + stopAudio(); + }; + }, [testToneActive]); + + const [terminalLogs, setTerminalLogs] = React.useState([]); + + React.useEffect(() => { + setTerminalLogs([ + t('LandingPage.logDaemonInit'), + t('LandingPage.logDualSync'), + t('LandingPage.logReady'), + ]); + }, [t]); + + const terminalRef = React.useRef(null); + + const addLog = (log: string) => { + setTerminalLogs((prev) => [...prev.slice(-15), log]); + }; + + React.useEffect(() => { + if (terminalRef.current) { + terminalRef.current.scrollTop = terminalRef.current.scrollHeight; + } + }, [terminalLogs]); + + const handleUpdateNode = (id: string, updates: Partial) => { + const node = nodes.find((n) => n.id === id); + setNodes((prev) => + prev.map((n) => (n.id === id ? { ...n, ...updates } : n)), + ); + if (!node) return; + const name = t( + `LandingPage.nodeName${id.charAt(0).toUpperCase() + id.slice(1)}`, + { defaultValue: node.name }, + ); + if (updates.volume !== undefined) { + addLog( + t('LandingPage.logVolumeUpdate', { name, volume: updates.volume }), + ); + } + if (updates.latency !== undefined) { + const sign = updates.latency > 0 ? '+' : ''; + addLog( + t('LandingPage.logLatencyCalibrate', { + name, + sign, + latency: updates.latency, + }), + ); + } + if (updates.status !== undefined) { + addLog( + t('LandingPage.logStatusSet', { + name, + status: updates.status.toUpperCase(), + }), + ); + } + }; + + const runCalibration = () => { + if (isCalibrating) return; + setIsCalibrating(true); + addLog(t('LandingPage.logCalibrateStart')); + + // Step-by-step sequential calibration of each node + const nodeOrder = ['macbook', 'ipad', 'android', 'speaker', 'iphone']; + const rtts = { macbook: 4, ipad: 12, android: 8, speaker: 15, iphone: 9 }; + + nodeOrder.forEach((nodeId, index) => { + setTimeout( + () => { + const node = nodes.find((n) => n.id === nodeId); + const name = t( + `LandingPage.nodeName${nodeId.charAt(0).toUpperCase() + nodeId.slice(1)}`, + { defaultValue: node?.name || nodeId }, + ); + const rtt = rtts[nodeId as keyof typeof rtts]; + + setNodes((prev) => + prev.map((n) => + n.id === nodeId ? { ...n, latency: 0, status: 'active' } : n, + ), + ); + + addLog(t('LandingPage.logCalibratePing', { name, rtt })); + + if (index === nodeOrder.length - 1) { + setTimeout(() => { + addLog(t('LandingPage.logCalibrateSuccess')); + setIsCalibrating(false); + }, 600); + } + }, + (index + 1) * 600, + ); + }); + }; + + const toggleTestTone = () => { + setTestToneActive((prev) => { + const next = !prev; + addLog( + next + ? t('LandingPage.logAudioInject') + : t('LandingPage.logAudioDisable'), + ); + return next; + }); + }; + + React.useEffect(() => { + const supportsScrollTimeline = + typeof CSS !== 'undefined' && + typeof CSS.supports === 'function' && + CSS.supports('(animation-timeline: view()) and (animation-range: entry)'); + + if ( + !supportsScrollTimeline && + typeof IntersectionObserver !== 'undefined' + ) { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.classList.add('reveal-visible'); + } + }); + }, + { + threshold: 0.15, + rootMargin: '0px 0px -55px 0px', + }, + ); + + const elements = document.querySelectorAll('.reveal-up, .reveal-scale'); + elements.forEach((el) => observer.observe(el)); + + return () => { + elements.forEach((el) => observer.unobserve(el)); + }; + } + }, []); + + return ( + + {/* Hero Header Area (Wraps Diagnostics Terminal) */} + + + + + {/* Timeline: How It Works Section */} + {/* Features Grid Area */} - - - - - Engineered for Synchronization - - - Everything you need to turn any collection of devices into an - active audio node. - - - - - {/* Feature 1 */} - - - - - - Dual-Protocol Sync - - - Utilizes both local Wi-Fi networks and Bluetooth multi-point - connections to ensure maximum range, stability, and - synchronization. - - - - {/* Feature 2 */} - - - - - - Seamless Fallback - - - If the Wi-Fi connection drops or weakens, the system - automatically routes the audio stream through the Bluetooth mesh - to prevent playback drops. - - - - {/* Feature 3 */} - - - - - - Dynamic Node Management - - - Devices can join or leave the AudioMesh session dynamically on - the fly without interrupting the host's audio stream. - - - - {/* Feature 4 */} - - - - - - Universal Compatibility - - - Completely hardware-agnostic. Runs seamlessly across iOS, - Android, macOS, Windows, and Linux operating systems. - - - - - + ); }; diff --git a/apps/web/src/screens/landingPage/components/DiagnosticsTerminal.tsx b/apps/web/src/screens/landingPage/components/DiagnosticsTerminal.tsx new file mode 100644 index 0000000..0cf9c07 --- /dev/null +++ b/apps/web/src/screens/landingPage/components/DiagnosticsTerminal.tsx @@ -0,0 +1,208 @@ +import * as React from 'react'; +import { Box, HStack, VStack, Text, Button } from '@chakra-ui/react'; +import { useTranslation } from 'react-i18next'; +import { Node } from '../types'; +import MeshVisualizer from './MeshVisualizer'; +import styles from '../landingPage.module.css'; +import { GlassBox } from '@components'; + +interface DiagnosticsTerminalProps { + nodes: Node[]; + selectedNodeId: string | null; + onSelectNode: (id: string | null) => void; + onUpdateNode: (id: string, updates: Partial) => void; + isCalibrating: boolean; + testToneActive: boolean; + runCalibration: () => void; + toggleTestTone: () => void; + terminalLogs: string[]; + terminalRef: React.RefObject; +} + +export const DiagnosticsTerminal = ({ + nodes, + selectedNodeId, + onSelectNode, + onUpdateNode, + isCalibrating, + testToneActive, + runCalibration, + toggleTestTone, + terminalLogs, + terminalRef, +}: DiagnosticsTerminalProps) => { + const { t } = useTranslation(); + + return ( + + + {/* Console Header */} + + + + + {t('LandingPage.consoleHeader')} + + + + + + + + + + {/* Visualizer */} + + + + + {/* Controls */} + + + + + + + + + + {/* Terminal Logs */} + + + {terminalLogs.map((log, index) => { + let logColor = 'terminal.default'; + if (log.startsWith('[SYS]')) logColor = 'terminal.sys'; + else if (log.startsWith('[NET]')) logColor = 'terminal.net'; + else if (log.startsWith('[SYNC]')) logColor = 'terminal.sync'; + else if (log.startsWith('[WAVE]')) logColor = 'terminal.wave'; + else if (log.startsWith('[AUDIO]')) logColor = 'terminal.audio'; + + return ( + + > {log} + + ); + })} + + + + + ); +}; + +export default DiagnosticsTerminal; diff --git a/apps/web/src/screens/landingPage/components/FeaturesSection.tsx b/apps/web/src/screens/landingPage/components/FeaturesSection.tsx new file mode 100644 index 0000000..b786f99 --- /dev/null +++ b/apps/web/src/screens/landingPage/components/FeaturesSection.tsx @@ -0,0 +1,112 @@ +import * as React from 'react'; +import { Box, VStack, Heading, Text, SimpleGrid, Flex } from '@chakra-ui/react'; +import { useTranslation } from 'react-i18next'; +import { Icon, IconType } from '@assets'; +import { GlassBox } from '@components'; + +const featureCards = [ + { + icon: IconType.SYNC, + titleKey: 'LandingPage.feature1Title', + descKey: 'LandingPage.feature1Desc', + className: 'reveal-scale reveal-scale-native', + }, + { + icon: IconType.BOLT, + titleKey: 'LandingPage.feature2Title', + descKey: 'LandingPage.feature2Desc', + className: 'reveal-scale reveal-scale-native delay-1', + }, + { + icon: IconType.USER, + titleKey: 'LandingPage.feature3Title', + descKey: 'LandingPage.feature3Desc', + className: 'reveal-scale reveal-scale-native delay-2', + }, + { + icon: IconType.LOCK, + titleKey: 'LandingPage.feature4Title', + descKey: 'LandingPage.feature4Desc', + className: 'reveal-scale reveal-scale-native delay-3', + }, +]; + +export const FeaturesSection = () => { + const { t } = useTranslation(); + + return ( + + + + + {t('LandingPage.featuresTitle')} + + + {t('LandingPage.featuresSubtitle')} + + + + + {featureCards.map(({ icon, titleKey, descKey, className }) => ( + + + + + + + {t(titleKey)} + + + {t(descKey)} + + + + ))} + + + + ); +}; + +export default FeaturesSection; diff --git a/apps/web/src/screens/landingPage/components/HeroSection.tsx b/apps/web/src/screens/landingPage/components/HeroSection.tsx new file mode 100644 index 0000000..2073fc7 --- /dev/null +++ b/apps/web/src/screens/landingPage/components/HeroSection.tsx @@ -0,0 +1,240 @@ +import * as React from 'react'; +import { + Stack, + VStack, + Heading, + Text, + SimpleGrid, + Button, + Box, +} from '@chakra-ui/react'; +import { Link } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import { GlassBox } from '@components'; +import styles from '../landingPage.module.css'; + +interface HeroSectionProps { + children: React.ReactNode; +} + +export const HeroSection = ({ children }: HeroSectionProps) => { + const { t } = useTranslation(); + + return ( + + {/* Immersive moving glows */} +
+
+ + + {/* LEFT: Copy content */} + + + + {t('LandingPage.heroBadge')} + + + + + {t('LandingPage.heroTitlePrefix')} +
+ + {t('LandingPage.heroTitleSpan')} + +
+ + + {t('LandingPage.heroDescription')} + + + {/* Floating glassmorphic stat cards */} + + + + {t('LandingPage.statsActiveNodes').toUpperCase()} + + + 3 / 5 + + + + + {t('LandingPage.statsSyncRate').toUpperCase()} + + + 99.99% + + + + + + + + + {t('LandingPage.downloadApp')} + + + + + +
+ + {/* RIGHT: Diagnostics Terminal */} + {children} +
+ + {/* Scroll indicator */} + + + {t('LandingPage.scrollExplore')} + + + + + + + + ); +}; + +export default HeroSection; diff --git a/apps/web/src/screens/landingPage/components/HowItWorksSection.tsx b/apps/web/src/screens/landingPage/components/HowItWorksSection.tsx new file mode 100644 index 0000000..a97dae6 --- /dev/null +++ b/apps/web/src/screens/landingPage/components/HowItWorksSection.tsx @@ -0,0 +1,529 @@ +import * as React from 'react'; +import { + Box, + VStack, + Badge, + Heading, + SimpleGrid, + Text, +} from '@chakra-ui/react'; +import { useTranslation } from 'react-i18next'; +import { ElectricBorder } from '@components'; +import styles from '../landingPage.module.css'; + +export const HowItWorksSection = () => { + const { t } = useTranslation(); + + return ( + + + + + 🛠️ {t('LandingPage.howItWorksTitle')} + + + {t('LandingPage.howItWorksSubtitle')} + + + + + {/* Step 1 */} + + + {/* Animated illustration */} + + + + + + + + + + + + + + + + + + {t('LandingPage.step1')} + + + {t('LandingPage.step1Title').replace(/^\d+\.\s*/, '')} + + + {t('LandingPage.step1Desc')} + + + + + {/* Step 2 */} + + + {/* Animated illustration */} + + + + + + + + + + + + + + + + + + + + + + {t('LandingPage.step2')} + + + {t('LandingPage.step2Title').replace(/^\d+\.\s*/, '')} + + + {t('LandingPage.step2Desc')} + + + + + {/* Step 3 */} + + + {/* Animated illustration */} + + + + + + + + + + + + + + + + + + + {t('LandingPage.step3')} + + + {t('LandingPage.step3Title').replace(/^\d+\.\s*/, '')} + + + {t('LandingPage.step3Desc')} + + + + + {/* Step 4 */} + + + {/* Animated illustration */} + + + + + + + + + + + + + + + + {t('LandingPage.step4')} + + + {t('LandingPage.step4Title').replace(/^\d+\.\s*/, '')} + + + {t('LandingPage.step4Desc')} + + + + + + + ); +}; + +export default HowItWorksSection; diff --git a/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx b/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx new file mode 100644 index 0000000..7f7488f --- /dev/null +++ b/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx @@ -0,0 +1,770 @@ +import * as React from 'react'; +import { Box, Flex, Text, VStack } from '@chakra-ui/react'; +import { useTranslation } from 'react-i18next'; +import { Icon, IconType } from '@assets'; +import { Node } from '../types'; +import TinyEqBars from './TinyEqBars'; +import NodeConfigurator from './NodeConfigurator'; +import styles from '../landingPage.module.css'; + +interface MeshVisualizerProps { + nodes: Node[]; + selectedNodeId: string | null; + onSelectNode: (id: string | null) => void; + onUpdateNode: (id: string, updates: Partial) => void; + isCalibrating: boolean; + testToneActive: boolean; +} + +export const MeshVisualizer = ({ + nodes, + selectedNodeId, + onSelectNode, + onUpdateNode, + isCalibrating, + testToneActive, +}: MeshVisualizerProps) => { + const { t } = useTranslation(); + + const macbook = nodes.find((n) => n.id === 'macbook') || { + id: 'macbook' as const, + name: 'MacBook Pro', + volume: 80, + latency: 0, + status: 'active' as const, + }; + const ipad = nodes.find((n) => n.id === 'ipad') || { + id: 'ipad' as const, + name: 'iPad Pro', + volume: 60, + latency: 15, + status: 'active' as const, + }; + const iphone = nodes.find((n) => n.id === 'iphone') || { + id: 'iphone' as const, + name: 'iPhone 15', + volume: 90, + latency: -5, + status: 'syncing' as const, + }; + const android = nodes.find((n) => n.id === 'android') || { + id: 'android' as const, + name: 'Galaxy S24', + volume: 75, + latency: 10, + status: 'active' as const, + }; + const speaker = nodes.find((n) => n.id === 'speaker') || { + id: 'speaker' as const, + name: 'Mesh Speaker', + volume: 65, + latency: -18, + status: 'active' as const, + }; + + const getLineStyle = (node: Node) => { + if (isCalibrating) { + return { + stroke: '#eab308', + opacity: 0.85, + animation: `${styles.strokeDash} 0.5s linear infinite`, + }; + } + + if (node.status === 'muted') { + return { + stroke: 'var(--chakra-colors-border)', + opacity: 0.15, + animation: 'none', + }; + } + + if (node.status === 'syncing') { + return { + stroke: '#eab308', + opacity: 0.6, + animation: `${styles.strokeDash} 3.5s linear infinite`, + }; + } + + if (Math.abs(node.latency) > 20) { + return { + stroke: '#ef4444', + opacity: 0.8, + animation: `${styles.strokeDash} 0.8s linear infinite`, + }; + } + + const duration = Math.max(0.6, 2.5 - node.volume / 40); + return { + stroke: 'var(--chakra-colors-primary)', + opacity: 0.75, + animation: `${styles.strokeDash} ${duration}s linear infinite`, + }; + }; + + const selectedNode = nodes.find((n) => n.id === selectedNodeId); + + return ( + + {/* Wave propagation animations */} + {isCalibrating && ( + <> + + + + + )} + + {!isCalibrating && ( + <> + + + + )} + + {/* Test Tone Sine Wave Ripple */} + {testToneActive && ( + + + + + + )} + + {/* Main Connection Lines (SVGs) */} + + + + + + + {isCalibrating && ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + )} + + + {/* Host Node (Center) */} + + + + HOST + + + + {/* Node 1: Laptop (Top Left) */} + + onSelectNode(selectedNodeId === 'macbook' ? null : 'macbook') + } + cursor="pointer" + transition="all 0.2s" + _hover={{ transform: 'scale(1.06)' }} + opacity={macbook.status === 'muted' ? 0.45 : 1} + > + + + + + + + + + + + + + + {t('LandingPage.nodeNameMacbook', { defaultValue: macbook.name })} + + + + {/* Node 2: Tablet (Top Right) */} + onSelectNode(selectedNodeId === 'ipad' ? null : 'ipad')} + cursor="pointer" + transition="all 0.2s" + _hover={{ transform: 'scale(1.06)' }} + opacity={ipad.status === 'muted' ? 0.45 : 1} + > + + + + + + + + + + + + + {t('LandingPage.nodeNameIpad', { defaultValue: ipad.name })} + + + + {/* Node 4: Android Phone (Middle Left) */} + + onSelectNode(selectedNodeId === 'android' ? null : 'android') + } + cursor="pointer" + transition="all 0.2s" + _hover={{ transform: 'scale(1.06)' }} + opacity={android.status === 'muted' ? 0.45 : 1} + > + + + + + + + + + + + + + {t('LandingPage.nodeNameAndroid', { defaultValue: android.name })} + + + + {/* Node 5: Mesh Speaker (Middle Right) */} + + onSelectNode(selectedNodeId === 'speaker' ? null : 'speaker') + } + cursor="pointer" + transition="all 0.2s" + _hover={{ transform: 'scale(1.06)' }} + opacity={speaker.status === 'muted' ? 0.45 : 1} + > + + + + + + + + + + + + + + + {t('LandingPage.nodeNameSpeaker', { defaultValue: speaker.name })} + + + + {/* Node 3: Smartphone (Bottom Center) */} + + onSelectNode(selectedNodeId === 'iphone' ? null : 'iphone') + } + cursor="pointer" + transition="all 0.2s" + _hover={{ transform: 'translateX(-50%) scale(1.06)' }} + opacity={iphone.status === 'muted' ? 0.45 : 1} + > + + + + + + + + + + + + + {t('LandingPage.nodeNameIphone', { defaultValue: iphone.name })} + + + + {/* Node Configurator Drawer Overlay */} + onSelectNode(null)} + onUpdateNode={onUpdateNode} + /> + + ); +}; + +export default MeshVisualizer; diff --git a/apps/web/src/screens/landingPage/components/NodeConfigurator.tsx b/apps/web/src/screens/landingPage/components/NodeConfigurator.tsx new file mode 100644 index 0000000..60e7a53 --- /dev/null +++ b/apps/web/src/screens/landingPage/components/NodeConfigurator.tsx @@ -0,0 +1,226 @@ +import * as React from 'react'; +import { Box, HStack, VStack, Text, Button } from '@chakra-ui/react'; +import { useTranslation } from 'react-i18next'; +import { GlassBox } from '@components'; +import { Node } from '../types'; +import styles from '../landingPage.module.css'; + +interface NodeConfiguratorProps { + selectedNode: Node | null; + isOpen: boolean; + onClose: () => void; + onUpdateNode: (id: string, updates: Partial) => void; +} + +export const NodeConfigurator = ({ + selectedNode, + isOpen, + onClose, + onUpdateNode, +}: NodeConfiguratorProps) => { + const { t } = useTranslation(); + + const [activeNode, setActiveNode] = React.useState(null); + + React.useEffect(() => { + if (selectedNode) { + setActiveNode(selectedNode); + } + }, [selectedNode]); + + if (!activeNode) return null; + + return ( + + + + + + + {activeNode.id === 'macbook' && ( + + + + + + )} + {activeNode.id === 'ipad' && ( + + + + + )} + {activeNode.id === 'android' && ( + + + + + )} + {activeNode.id === 'speaker' && ( + + + + + + )} + {activeNode.id === 'iphone' && ( + + + + + )} + + {t( + `LandingPage.nodeName${activeNode.id.charAt(0).toUpperCase() + activeNode.id.slice(1)}`, + { defaultValue: activeNode.name }, + )}{' '} + {t('LandingPage.nodeTitle')} + + + + + + + {/* Status Option */} + + + {t('LandingPage.nodeStatus')} + + + {(['active', 'syncing', 'muted'] as const).map((status) => ( + + ))} + + + + {/* Volume Slider */} + + + + {t('LandingPage.nodeVolume')} + + + {activeNode.volume}% + + + + onUpdateNode(activeNode.id, { + volume: parseInt(e.target.value), + }) + } + className={styles.premiumRange} + disabled={activeNode.status === 'muted'} + /> + + + + + + ); +}; + +export default NodeConfigurator; diff --git a/apps/web/src/screens/landingPage/components/TinyEqBars.tsx b/apps/web/src/screens/landingPage/components/TinyEqBars.tsx new file mode 100644 index 0000000..d0669bd --- /dev/null +++ b/apps/web/src/screens/landingPage/components/TinyEqBars.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; +import { Box, HStack } from '@chakra-ui/react'; +import { Node } from '../types'; +import styles from '../landingPage.module.css'; + +interface TinyEqBarsProps { + node: Node; +} + +export const TinyEqBars = ({ node }: TinyEqBarsProps) => { + if (node.status === 'muted') { + return ( + + + + + + ); + } + + const scale = node.status === 'syncing' ? 0.35 : node.volume / 100; + const duration1 = node.status === 'syncing' ? '2.5s' : '0.8s'; + const duration2 = node.status === 'syncing' ? '3.0s' : '1.1s'; + const duration3 = node.status === 'syncing' ? '2.2s' : '0.9s'; + + const anim1 = + node.status === 'syncing' ? styles.eqBounceSync : styles.eqBounce1; + const anim2 = + node.status === 'syncing' ? styles.eqBounceSync : styles.eqBounce2; + const anim3 = + node.status === 'syncing' ? styles.eqBounceSync : styles.eqBounce3; + + return ( + + + + + + ); +}; + +export default TinyEqBars; diff --git a/apps/web/src/screens/landingPage/landingPage.module.css b/apps/web/src/screens/landingPage/landingPage.module.css new file mode 100644 index 0000000..beea894 --- /dev/null +++ b/apps/web/src/screens/landingPage/landingPage.module.css @@ -0,0 +1,460 @@ +/* --- Mesh animations --- */ +@keyframes float { + 0%, + 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-8px); + } +} +.meshCardFloat { + animation: float 6s ease-in-out infinite; +} + +@keyframes wave { + 0% { + transform: translate(-50%, -50%) scale(0.8); + opacity: 0; + } + 1% { + opacity: 0.8; + } + 100% { + transform: translate(-50%, -50%) scale(2.8); + opacity: 0; + } +} +.waveRing { + position: absolute; + top: 50%; + left: 50%; + border: 2px solid var(--chakra-colors-primary); + border-radius: 50%; + pointer-events: none; + z-index: 1; + width: 90px; + height: 90px; + transform: translate(-50%, -50%); + opacity: 0; /* Hidden during delay */ +} +.waveRing1 { + animation: wave 4s cubic-bezier(0.1, 0.8, 0.3, 1) infinite; +} +.waveRing2 { + animation: wave 4s cubic-bezier(0.1, 0.8, 0.3, 1) infinite 1.3s; +} + +@keyframes wavePulseOnce { + 0% { + transform: translate(-50%, -50%) scale(1); + opacity: 0; + } + 1% { + opacity: 0.9; + } + 100% { + transform: translate(-50%, -50%) scale(3.5); + opacity: 0; + } +} +.wavePulseActive { + position: absolute; + top: 50%; + left: 50%; + border: 3px solid var(--chakra-colors-primary); + background: color-mix(in srgb, var(--chakra-colors-primary) 3%, transparent); + border-radius: 50%; + pointer-events: none; + z-index: 2; + width: 90px; + height: 90px; + transform: translate(-50%, -50%); + opacity: 0; /* Hidden during delay */ + animation: wavePulseOnce 1.2s cubic-bezier(0.1, 0.8, 0.3, 1) forwards; +} + +@keyframes pulseIcon { + 0%, + 100% { + transform: scale(1); + } + 50% { + transform: scale(1.12); + } +} +.pulseHostIcon { + animation: pulseIcon 2s ease-in-out infinite; +} + +@keyframes eqBounce1 { + 0%, + 100% { + height: 3px; + } + 50% { + height: 10px; + } +} +@keyframes eqBounce2 { + 0%, + 100% { + height: 7px; + } + 50% { + height: 2px; + } +} +@keyframes eqBounce3 { + 0%, + 100% { + height: 5px; + } + 50% { + height: 12px; + } +} +@keyframes eqBounceSync { + 0%, + 100% { + height: 2px; + } + 50% { + height: 5px; + } +} + +@keyframes strokeDash { + to { + stroke-dashoffset: -20; + } +} +.meshLine { + stroke-dasharray: 4 4; +} + +@keyframes waveRipple { + 0% { + stroke-dashoffset: 0; + } + 100% { + stroke-dashoffset: -100; + } +} +.sineWaveFlow { + stroke-dasharray: 20 5; + animation: waveRipple 3s linear infinite; +} + +/* Input Slider styling */ +.premiumRange { + -webkit-appearance: none; + appearance: none; + width: 100%; + height: 5px; + border-radius: 3px; + background: color-mix(in srgb, var(--chakra-colors-border) 70%, transparent); + outline: none; + margin: 6px 0; +} +.premiumRange::-webkit-slider-runnable-track { + width: 100%; + height: 5px; + border-radius: 3px; + background: color-mix(in srgb, var(--chakra-colors-border) 70%, transparent); +} +.premiumRange::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 13px; + height: 13px; + border-radius: 50%; + background: var(--chakra-colors-primary); + cursor: pointer; + box-shadow: 0 0 6px var(--chakra-colors-primary); + transition: transform 0.1s ease; + margin-top: -4px; /* Align thumb vertically on Webkit */ +} +.premiumRange::-webkit-slider-thumb:hover { + transform: scale(1.25); +} +.premiumRange::-moz-range-track { + width: 100%; + height: 5px; + border-radius: 3px; + background: color-mix(in srgb, var(--chakra-colors-border) 70%, transparent); +} +.premiumRange::-moz-range-thumb { + width: 13px; + height: 13px; + border: none; + border-radius: 50%; + background: var(--chakra-colors-primary); + cursor: pointer; + box-shadow: 0 0 6px var(--chakra-colors-primary); + transition: transform 0.1s ease; +} +.premiumRange::-moz-range-thumb:hover { + transform: scale(1.25); +} + +/* Tech Grid Background */ +.techGrid { + position: relative; +} +.techGrid::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + z-index: 1; + background-size: 30px 30px; + background-image: linear-gradient( + to right, + rgba(139, 92, 246, 0.1) 1px, + transparent 1px + ), + linear-gradient(to bottom, rgba(139, 92, 246, 0.1) 1px, transparent 1px); +} + +/* Moving radial glows */ +@keyframes glowMove { + 0%, + 100% { + transform: translate(0px, 0px) scale(1); + } + 33% { + transform: translate(40px, -50px) scale(1.15); + } + 66% { + transform: translate(-30px, 30px) scale(0.9); + } +} +.radialGlow1 { + position: absolute; + top: -15%; + left: 10%; + width: 500px; + height: 500px; + max-width: 60vw; + max-height: 60vw; + border-radius: 50%; + background: radial-gradient( + circle, + color-mix(in srgb, var(--chakra-colors-primary) 16%, transparent) 0%, + transparent 70% + ); + filter: blur(60px); + pointer-events: none; + z-index: 0; + animation: glowMove 15s ease-in-out infinite; +} +.radialGlow2 { + position: absolute; + bottom: -10%; + right: 5%; + width: 550px; + height: 550px; + max-width: 60vw; + max-height: 60vw; + border-radius: 50%; + background: radial-gradient( + circle, + color-mix(in srgb, var(--chakra-colors-success) 12%, transparent) 0%, + transparent 70% + ); + filter: blur(70px); + pointer-events: none; + z-index: 0; + animation: glowMove 20s ease-in-out infinite alternate; +} + +/* Text-Shine Heading Animation */ +@keyframes textShine { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} +.textShineEffect { + background: linear-gradient( + to right, + #8b5cf6 0%, + #0088cc 25%, + #c084fc 50%, + #0088cc 75%, + #8b5cf6 100% + ); + background-size: 200% auto; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + animation: textShine 5s linear infinite; +} + +/* Scrollbar styling for Terminal */ +.customScrollbar::-webkit-scrollbar { + width: 4px; +} +.customScrollbar::-webkit-scrollbar-track { + background: transparent; +} +.customScrollbar::-webkit-scrollbar-thumb { + background: rgba(139, 92, 246, 0.3); + border-radius: 2px; +} +.customScrollbar::-webkit-scrollbar-thumb:hover { + background: rgba(139, 92, 246, 0.5); +} + +/* --- Scroll reveals & keyframes --- */ +@keyframes scrollRevealUp { + from { + opacity: 0; + transform: translateY(40px); + } + to { + opacity: 1; + transform: translateY(0); + } +} +@keyframes scrollRevealScale { + from { + opacity: 0; + transform: scale(0.92); + } + to { + opacity: 1; + transform: scale(1); + } +} +@keyframes scrollBounceFade { + 0%, + 100% { + transform: translateY(0); + opacity: 0.8; + } + 50% { + transform: translateY(6px); + opacity: 0.4; + } +} + +:global(.scroll-indicator) { + animation: scrollBounceFade 2s ease-in-out infinite; +} + +:global(.reveal-up) { + opacity: 0; + transform: translateY(40px); + transition: + opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); +} +:global(.reveal-scale) { + opacity: 0; + transform: scale(0.92); + transition: + opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); +} +:global(.reveal-visible) { + opacity: 1 !important; + transform: none !important; +} + +/* Fallback delay values */ +:global(.delay-1) { + transition-delay: 0.1s; +} +:global(.delay-2) { + transition-delay: 0.2s; +} +:global(.delay-3) { + transition-delay: 0.3s; +} + +@supports ((animation-timeline: view()) and (animation-range: entry)) { + /* Nullify transition classes, use pure CSS Scroll timeline instead */ + :global(.reveal-up), + :global(.reveal-scale) { + opacity: 1; + transform: none; + transition: none; + } + :global(.reveal-up-native) { + animation: scrollRevealUp auto linear both; + animation-timeline: view(); + animation-range: entry 10% cover 30%; + } + :global(.reveal-scale-native) { + animation: scrollRevealScale auto linear both; + animation-timeline: view(); + animation-range: entry 10% cover 30%; + } +} + +/* How It Works Premium Card Hover & Electric Border animation */ +.electricCard { + position: relative; + overflow: visible !important; + transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1) !important; + height: 100% !important; +} + +.electricCard:hover { + transform: translateY(-6px) scale(1.02); +} + +.electricCard .iconContainer { + transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1); +} + +.electricCard:hover .iconContainer { + transform: scale(1.12); +} + +/* Hide ElectricBorder canvas and glow divs by default, fade in on hover */ +.electricCard :global(.electric-border-canvas-wrapper), +.electricCard :global(.electric-border-glow-wrapper) { + opacity: 0; + transition: opacity 0.4s ease !important; + pointer-events: none; +} + +.electricCard:hover :global(.electric-border-canvas-wrapper), +.electricCard:hover :global(.electric-border-glow-wrapper) { + opacity: 1; +} + +.electricCard:hover { + box-shadow: 0 0 35px + color-mix(in srgb, var(--electric-border-color) 22%, transparent) !important; +} + +@media (prefers-reduced-motion: reduce) { + :global(.reveal-up), + :global(.reveal-scale), + :global(.reveal-up-native), + :global(.reveal-scale-native) { + opacity: 1 !important; + transform: none !important; + animation: none !important; + transition: none !important; + } + .meshCardFloat, + .pulseHostIcon, + :global(.eq-bar), + .sineWaveFlow, + :global(.scroll-indicator) { + animation: none !important; + } +} diff --git a/apps/web/src/screens/landingPage/types.ts b/apps/web/src/screens/landingPage/types.ts new file mode 100644 index 0000000..36400cc --- /dev/null +++ b/apps/web/src/screens/landingPage/types.ts @@ -0,0 +1,13 @@ +export interface Node { + id: 'macbook' | 'ipad' | 'iphone' | 'android' | 'speaker'; + name: string; + volume: number; + latency: number; + status: 'active' | 'syncing' | 'muted'; +} + +export interface MelodyNote { + f: number; // frequency in Hz + d: number; // duration in seconds + g?: number; // optional quiet gap after note in seconds +} diff --git a/shared/common/src/assets/icons/Logo.tsx b/shared/common/src/assets/icons/Logo.tsx index 88c2aba..30293f3 100644 --- a/shared/common/src/assets/icons/Logo.tsx +++ b/shared/common/src/assets/icons/Logo.tsx @@ -8,6 +8,7 @@ const Logo = ({ width, height, className = '', + color, ...props }: IconProps) => { const finalSize = resolveIconSize(size ?? w ?? width, 120); @@ -16,122 +17,20 @@ const Logo = ({ xmlns="http://www.w3.org/2000/svg" width={finalSize} height={finalSize} - viewBox="0 0 85 85" + version="1" + viewBox="0 0 2048 2048" className={`audiomesh-icon ${className}`} + style={{ color: color || 'var(--chakra-colors-primary)' }} {...props} > - - {/* Official Messenger Blue Gradient */} - - - - - - {/* Darker Blue for the 3D Edge of the Hard Drives */} - - - - - - - {/* 1. Hard Drive Stack (Kept 3D) */} - - - - - {/* Bottom Hard Drive */} - - - {/* Status Light */} - {' '} - {/* Drive Slot */} - {/* Middle Hard Drive */} - - - - - {/* Top Hard Drive */} - - - - - - - {/* 2. New Paper Plane SVG path */} - - {/* Inner shadow/fold filled with theme primary color */} - - - + + ); }; diff --git a/shared/common/src/components/Loading/LoadingComponent.tsx b/shared/common/src/components/Loading/LoadingComponent.tsx index ff9c798..e9799f6 100644 --- a/shared/common/src/components/Loading/LoadingComponent.tsx +++ b/shared/common/src/components/Loading/LoadingComponent.tsx @@ -22,21 +22,94 @@ const progressKeyframe = keyframes` 100% { left: 110%; width: 20%; } `; +// Pulse keyframe for network status +const pulseKeyframe = keyframes` + 0% { transform: scale(0.9); opacity: 0.6; box-shadow: 0 0 0 0 rgba(186, 200, 215, 0.4); } + 50% { transform: scale(1.1); opacity: 1; box-shadow: 0 0 8px 2px rgba(186, 200, 215, 0.6); } + 100% { transform: scale(0.9); opacity: 0.6; box-shadow: 0 0 0 0 rgba(186, 200, 215, 0.4); } +`; + +// Concentric ripples for audio broadcast/sync +const rippleKeyframe = keyframes` + 0% { transform: scale(0.6); opacity: 0; } + 10% { opacity: 0.6; } + 100% { transform: scale(2.0); opacity: 0; } +`; + +// Mesh network dashed line data-flow — dashes travel outward from center to each node +const dashOutwardKeyframe = keyframes` + 0% { stroke-dashoffset: 16; } + 100% { stroke-dashoffset: 0; } +`; + +// Satellite pulse animation +const satellitePulseKeyframe = keyframes` + 0%, 100% { transform: scale(0.8); opacity: 0.5; box-shadow: 0 0 0 0 rgba(186, 200, 215, 0.4); } + 50% { transform: scale(1.1); opacity: 1; box-shadow: 0 0 10px 3px rgba(186, 200, 215, 0.7); } +`; + +// Equalizer bar animation for sound play +const eqBarKeyframe = keyframes` + 0% { transform: scaleY(0.2); } + 100% { transform: scaleY(1); } +`; + +// Wavy fabric background motion keyframes +const waveMove1 = keyframes` + 0% { transform: rotate(0deg) translate(0px, 0px) scale(1); } + 100% { transform: rotate(6deg) translate(-5%, 5%) scale(1.1); } +`; + +const waveMove2 = keyframes` + 0% { transform: rotate(0deg) translate(0px, 0px) scale(1.05); } + 100% { transform: rotate(-8deg) translate(5%, -3%) scale(0.95); } +`; + +const waveMove3 = keyframes` + 0% { transform: rotate(0deg) translate(0px, 0px) scale(0.95); } + 100% { transform: rotate(4deg) translate(-3%, -5%) scale(1.08); } +`; + +// 7 satellite nodes at varied angles and random-ish distances from center (110,110) +// Each: x,y are SVG coords; pulseDelay staggers the glow for a live-network feel +const MESH_NODES: Array<{ x: number; y: number; pulseDelay: string; lineDuration: string }> = [ + { x: 174, y: 147, pulseDelay: '0s', lineDuration: '0.8s' }, // ~30°, r=74 + { x: 117, y: 193, pulseDelay: '0.4s', lineDuration: '1.1s' }, // ~85°, r=83 + { x: 52, y: 150, pulseDelay: '0.8s', lineDuration: '0.9s' }, // ~145°, r=68 + { x: 35, y: 82, pulseDelay: '1.2s', lineDuration: '1.3s' }, // ~200°, r=79 + { x: 105, y: 38, pulseDelay: '1.6s', lineDuration: '0.7s' }, // ~265°, r=72 + { x: 171, y: 49, pulseDelay: '2.0s', lineDuration: '1.0s' }, // ~320°, r=85 + { x: 182, y: 95, pulseDelay: '2.4s', lineDuration: '1.2s' }, // ~352°, r=72 +]; + +// Spin-only keyframe — Z rotation only; rotateX tilt is handled by the separate tilt layer +const spinOnlyKeyframe = keyframes` + 0% { transform: rotateZ(0deg); } + 100% { transform: rotateZ(360deg); } +`; + +// Counter-spin for logo: cancels the Z rotation so logo stays upright on the tilted plane +const logoCounterSpinKeyframe = keyframes` + 0% { transform: translate(-50%, -50%) rotateZ(0deg); } + 100% { transform: translate(-50%, -50%) rotateZ(-360deg); } +`; + const loadingMessages = [ - 'INITIALIZING SECURE SESSION...', - 'CONNECTING TO TELEGRAM MTPROTO GATEWAY...', - 'SECURE CONNECTION ESTABLISHED.', - 'DOWNLOADING SYSTEM MANIFESTS...', - 'PARSING ASSET DICTIONARIES...', - 'DECRYPTING LOCAL STATE STORES...', - 'COMPILING SHADERS & STYLES...', - 'MOUNTING AUDIOMESH DESKTOP SHELL...', - 'SPAWNING CRAFTSMAN COMPASS...', + 'INITIALIZING AUDIO SUBSYSTEM...', + 'SCANNING WI-FI & BLUETOOTH INTERFACES...', + 'DISCOVERING NEARBY AUDIOMESH NODES...', + 'ESTABLISHING PEER-TO-PEER DATA CHANNELS...', + 'CALIBRATING TRANSMISSION LATENCY...', + 'MEASURING MULTI-DEVICE CLOCK DRIFT...', + 'SYNCHRONIZING AUDIO BUFFER QUEUES...', + 'STARTING RUST AUDIO ROUTING DAEMON...', + 'SPAWNING UNIFIED SPEAKER MESH...', ]; const LoadingComponent = () => { const [logIndex, setLogIndex] = React.useState(0); const [dots, setDots] = React.useState(''); + const [isHovered, setIsHovered] = React.useState(false); React.useEffect(() => { // Cycle messages @@ -62,13 +135,7 @@ const LoadingComponent = () => { direction="column" justifyContent="center" alignItems="center" - bg="#15111e" - backgroundImage=" - radial-gradient(circle at center, rgba(139, 92, 246, 0.12) 0%, rgba(21, 17, 30, 1) 75%), - linear-gradient(rgba(255, 255, 255, 0.015) 1px, transparent 1px), - linear-gradient(90deg, rgba(255, 255, 255, 0.015) 1px, transparent 1px) - " - backgroundSize="100% 100%, 24px 24px, 24px 24px" + bg="#121416" overflow="hidden" position="relative" > @@ -79,8 +146,9 @@ const LoadingComponent = () => { left="4" width="16px" height="16px" - borderTop="2px solid rgba(139, 92, 246, 0.3)" - borderLeft="2px solid rgba(139, 92, 246, 0.3)" + borderTop="2px solid rgba(186, 200, 215, 0.2)" + borderLeft="2px solid rgba(186, 200, 215, 0.2)" + zIndex={2} /> { right="4" width="16px" height="16px" - borderTop="2px solid rgba(139, 92, 246, 0.3)" - borderRight="2px solid rgba(139, 92, 246, 0.3)" + borderTop="2px solid rgba(186, 200, 215, 0.2)" + borderRight="2px solid rgba(186, 200, 215, 0.2)" + zIndex={2} /> { left="4" width="16px" height="16px" - borderBottom="2px solid rgba(139, 92, 246, 0.3)" - borderLeft="2px solid rgba(139, 92, 246, 0.3)" + borderBottom="2px solid rgba(186, 200, 215, 0.2)" + borderLeft="2px solid rgba(186, 200, 215, 0.2)" + zIndex={2} /> { right="4" width="16px" height="16px" - borderBottom="2px solid rgba(139, 92, 246, 0.3)" - borderRight="2px solid rgba(139, 92, 246, 0.3)" + borderBottom="2px solid rgba(186, 200, 215, 0.2)" + borderRight="2px solid rgba(186, 200, 215, 0.2)" + zIndex={2} /> - {/* Floating Logo Container */} + {/* Wavy fabric background layers */} + + + + + + + + + + + + + + + + + + + + + + + + + {/* Cybernetic Tech Grid overlay on top of fabric */} + + + {/* Interactive Main Content Layer */} + - {/* Pulsing Backglow */} + {/* Mesh Communication Network Container — float moves everything as one unit */} + onMouseEnter={() => setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + {/* Pulsing Backglow behind entire network */} + - {/* Main Brand Logo */} - - - - + {/* Tilt layer: rotateX transitions smoothly on hover (CSS transition, not keyframe) */} + + {/* Spin layer: continuous Z rotation, independent of tilt */} + + {/* Dynamic Mesh SVG — SMIL animate drives outward-flowing dashes (no CSS keyframe needed) */} + + {MESH_NODES.map((node, i) => ( + + {/* SMIL: from=0 to=-21 (period=15+6) makes dashes travel center→node */} + + + ))} + - {/* Brand Title */} - - AudioMesh - - - {/* Brand Subtitle */} - - CLOUD STORAGE CLIENT - + {/* Satellite speaker nodes — positions match SVG line endpoints */} + {MESH_NODES.map((node, i) => ( + + + + ))} - {/* Premium Sleek Progress Bar */} - + {/* Concentric ripples around central host */} + + + + {/* Central Brand Host Logo — inside the 3D plane, counter-spin keeps it upright */} + + + + {/* end spin layer */} + {/* end tilt layer */} + {/* end mesh container */} + + {/* Brand Title */} + + AudioMesh + + + {/* Brand Subtitle */} + + SYNCHRONIZED SPEAKER NETWORK + + + {/* Premium Sleek Progress Bar */} - + overflow="hidden" + position="relative" + mb="4" + border="1px solid rgba(255, 255, 255, 0.03)" + > + + - {/* Interactive Terminal console */} - - > {loadingMessages[logIndex]} - {dots} + {/* Rhythmic Audio Equalizer showing Active Sound Playback */} + + {[1, 2, 3, 4, 5, 6, 7, 8].map((i) => ( + + ))} + + + {/* Pulse Status Indicator */} + + + + MESH STATUS: SYNCING + + + + {/* Interactive Terminal console */} + + > {loadingMessages[logIndex]} + {dots} + ); diff --git a/shared/common/src/components/MdPreview/css/Markdown.module.css b/shared/common/src/components/MdPreview/css/Markdown.module.css index 8faec34..ed1af01 100644 --- a/shared/common/src/components/MdPreview/css/Markdown.module.css +++ b/shared/common/src/components/MdPreview/css/Markdown.module.css @@ -2,7 +2,7 @@ width: 100%; padding: 0; background-color: transparent !important; - font-family: 'Inter', sans-serif !important; + font-family: 'Hanken Grotesk', sans-serif !important; line-height: 1.8; word-wrap: break-word !important; word-break: break-word !important; @@ -31,7 +31,7 @@ .markdown h3, .markdown h4 { scroll-margin-top: 120px !important; - font-family: 'Inter', sans-serif !important; + font-family: 'Geist', sans-serif !important; } .markdown h1 { @@ -213,7 +213,7 @@ /* Code */ .markdown code { - font-family: 'Courier New', Consolas, monospace !important; + font-family: 'JetBrains Mono', monospace !important; background-color: var(--chakra-colors-bg-subtle) !important; color: var(--chakra-colors-primary) !important; padding: 0.15rem 0.45rem !important; From f199493f69289cdf38dc7dc72085380f76df7419 Mon Sep 17 00:00:00 2001 From: Amit Raikwar Date: Fri, 12 Jun 2026 18:30:12 +0530 Subject: [PATCH 4/5] fix(AUD-8): refactor layout structure, navigation bar, copyright footer and update tests - Refactor NavigationBar layout removing page title text matching new responsive header styling - Refactor CopyrightFooter to use translated legal and team section headers - Remove outdated page title test cases from NavigationBar test suite and fix ESLint errors - Update Jest snapshot files across packages to align with new layout structures --- .../RouterProvider.test.tsx.snap | 1612 ++++++----- .../__snapshots__/DocsPage.test.tsx.snap | 40 +- .../Host/CopyrightFooter/CopyrightFooter.tsx | 91 +- .../CopyrightFooter.test.tsx.snap | 223 +- apps/web/src/screens/Host/Host.tsx | 2 +- .../Host/NavigationBar/NavigationBar.tsx | 82 +- .../__tests__/NavigationBar.test.tsx | 8 +- .../__snapshots__/NavigationBar.test.tsx.snap | 187 +- .../__snapshots__/Host.test.tsx.snap | 412 +-- .../__snapshots__/ProductPage.test.tsx.snap | 24 +- .../__snapshots__/LandingPage.test.tsx.snap | 2498 ++++++++++++++--- .../RouterProvider.test.tsx.snap | 785 +++--- .../LoadingComponent.test.tsx.snap | 600 ++-- .../__snapshots__/Modal.test.tsx.snap | 4 +- 14 files changed, 4053 insertions(+), 2515 deletions(-) diff --git a/apps/web/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap b/apps/web/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap index a4c9a54..35c327b 100644 --- a/apps/web/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap +++ b/apps/web/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap @@ -3,234 +3,438 @@ exports[`RouterProvider should render router provider correctly 1`] = `
-
-
- - - - - - - - - - - - + - - - - - - - - - - - - - - - + + - - - - + - - - - -
+ + + + + + +
-

- AudioMesh -

-

- CLOUD STORAGE CLIENT -

-
-
+ class="css-34ne0f" + />
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ +
+ +
+

- > - INITIALIZING SECURE SESSION... + AudioMesh

+ class="css-7l3o8e" + > + SYNCHRONIZED SPEAKER NETWORK +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ MESH STATUS: SYNCING +

+
+
+

+ > + INITIALIZING AUDIO SUBSYSTEM... +

+

+

@@ -239,10 +443,10 @@ exports[`RouterProvider should render router provider correctly 1`] = ` exports[`RouterProvider should render router provider correctly 2`] = `
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
-

- iPad Pro -

+ + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + +
-
-
-
+

+ > + [SYS] AudioMesh Routing Daemon initialised on 127.0.0.1:3000 +

+

+ > + [NET] Dual-protocol synchronization running: Wi-Fi + Bluetooth +

+

+ > + [SYS] Ready for connection discovery... +

-

- iPhone 15 -

+
+

+ Scroll to explore +

+ + + + +
+ + 🛠️ + How It Works +

- Engineered for Synchronization + Setting up your synchronized speaker network in seconds.

-

- Everything you need to turn any collection of devices into an active audio node. -

- +
+
+
+
+
+
+
+
- - - - - +
+ + + + + + + + + + + + + +
+ + STEP 01 + +

+ Initialize Host +

+

+ Designate any device as the primary transmitter. Load your audio stream and start the session. +

+
-

+
+
- Dual-Protocol Sync -

-

+

+
- Utilizes both local Wi-Fi networks and Bluetooth multi-point connections to ensure maximum range, stability, and synchronization. -

+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + +
+ + STEP 02 + +

+ Broadcast Signal +

+

+ The host broadcasts timing packets over local Wi-Fi and Bluetooth protocols. +

+
+
- +
+
+
+
+
+
+
+
- - +
+ + + + + + + + + + + + + + +
+ + STEP 03 + +

+ Link Nodes +

+

+ Nearby client devices discover the host and join the audio mesh network instantly. +

+
-

+
+
- Seamless Fallback -

-

+

+
- If the Wi-Fi connection drops or weakens, the system automatically routes the audio stream through the Bluetooth mesh to prevent playback drops. -

+
+
+
+
+
+
+
+ + + + + + + + + + + +
+ + STEP 04 + +

+ Auto-Sync Latency +

+

+ AudioMesh automatically measures and adjusts sub-millisecond audio delays for perfect phase alignment. +

+
+
+
+
+
+
+
+
+

+ Engineered for Synchronization +

+

+ Everything you need to turn any collection of devices into an active audio node. +

+
+
+ + + + + + + + + + + + + + + +
- - - - +
+ + + + + + +
+

+ Dual-Protocol Sync +

+

+ Utilizes both local Wi-Fi networks and Bluetooth multi-point connections to ensure maximum range, stability, and synchronization. +

+
-

+
+ - Dynamic Node Management -

-

+ + + + + + + + + + + + + + +

- Devices can join or leave the AudioMesh session dynamically on the fly without interrupting the host's audio stream. -

+
+
+ + + +
+

+ Seamless Fallback +

+

+ If the Wi-Fi connection drops or weakens, the system automatically routes the audio stream through the Bluetooth mesh to prevent playback drops. +

+
+
+ + + + + + + + + + + + + + + +
- - - - +
+ + + + +
+

+ Dynamic Node Management +

+

+ Devices can join or leave the AudioMesh session dynamically on the fly without interrupting the host's audio stream. +

+
-

+
+ - Universal Compatibility -

-

+ + + + + + + + + + + + + + +

- Completely hardware-agnostic. Runs seamlessly across iOS, Android, macOS, Windows, and Linux operating systems. -

+
+
+ + + + +
+

+ Universal Compatibility +

+

+ Completely hardware-agnostic. Runs seamlessly across iOS, Android, macOS, Windows, and Linux operating systems. +

+
+
diff --git a/shared/client-common/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap b/shared/client-common/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap index f6fd12a..0d3c745 100644 --- a/shared/client-common/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap +++ b/shared/client-common/src/providers/router/__tests__/__snapshots__/RouterProvider.test.tsx.snap @@ -3,234 +3,438 @@ exports[`RouterProvider should render router provider correctly 1`] = `
-
-
- - - - - - - - - - - - + - - - - - - - - - - - - - - - + + - - - - + - - - - -
+ + + + + + +
-

- AudioMesh -

-

- CLOUD STORAGE CLIENT -

-
-
+ class="css-34ne0f" + />
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ +
+ +
+

- > - INITIALIZING SECURE SESSION... + AudioMesh

+ class="css-7l3o8e" + > + SYNCHRONIZED SPEAKER NETWORK +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ MESH STATUS: SYNCING +

+
+
+

+ > + INITIALIZING AUDIO SUBSYSTEM... +

+

+

@@ -253,176 +457,19 @@ exports[`RouterProvider should render router provider correctly 2`] = ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +

Turn this device into a synchronized speaker node in the mesh network.

Device / Node Name

diff --git a/shared/common/src/components/Loading/__tests__/__snapshots__/LoadingComponent.test.tsx.snap b/shared/common/src/components/Loading/__tests__/__snapshots__/LoadingComponent.test.tsx.snap index 90d5c51..3daefe9 100644 --- a/shared/common/src/components/Loading/__tests__/__snapshots__/LoadingComponent.test.tsx.snap +++ b/shared/common/src/components/Loading/__tests__/__snapshots__/LoadingComponent.test.tsx.snap @@ -3,234 +3,438 @@ exports[`Loading Component should render correctly 1`] = `
-
-
- - - - - - - - - - - - + - - - - - - - - - - - - - - - + + - - - - + - - - - -
+ + + + + + +
-

- AudioMesh -

-

- CLOUD STORAGE CLIENT -

-
-
+ class="css-34ne0f" + />
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ +
+ +
+

- > - INITIALIZING SECURE SESSION... + AudioMesh

+ class="css-7l3o8e" + > + SYNCHRONIZED SPEAKER NETWORK +

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ MESH STATUS: SYNCING +

+
+
+

+ > + INITIALIZING AUDIO SUBSYSTEM... +

+

+

diff --git a/shared/common/src/components/modal/__tests__/__snapshots__/Modal.test.tsx.snap b/shared/common/src/components/modal/__tests__/__snapshots__/Modal.test.tsx.snap index d268b50..9096da2 100644 --- a/shared/common/src/components/modal/__tests__/__snapshots__/Modal.test.tsx.snap +++ b/shared/common/src/components/modal/__tests__/__snapshots__/Modal.test.tsx.snap @@ -14,7 +14,7 @@ exports[`Modal should render correctly 1`] = ` aria-describedby="dialog::r0::description" aria-labelledby="dialog::r0::title" aria-modal="true" - class="chakra-dialog__content css-1pqcini" + class="chakra-dialog__content css-jkrmsw" data-part="content" data-scope="dialog" data-state="open" @@ -46,7 +46,7 @@ exports[`Modal should render correctly with different modalID 1`] = ` aria-describedby="dialog::r1::description" aria-labelledby="dialog::r1::title" aria-modal="true" - class="chakra-dialog__content css-1pqcini" + class="chakra-dialog__content css-jkrmsw" data-part="content" data-scope="dialog" data-state="open" From 85e7ec5898f203d46241ac27f92a9664ffa14f24 Mon Sep 17 00:00:00 2001 From: Amit Raikwar Date: Fri, 12 Jun 2026 18:41:45 +0530 Subject: [PATCH 5/5] build(AUD-8): update FTP deployment settings in web build workflow - Update target FTP deployment server to ftp.audiomesh.amitraikwar.in - Update FTP username credential identifier to match Hostinger configuration --- .github/workflows/build-web.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index 531fc77..d88c695 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -110,8 +110,8 @@ jobs: if: ${{ steps.changelog.outputs.skipped == 'false' }} uses: SamKirkland/FTP-Deploy-Action@v4.3.5 with: - server: ftp.audiomesh.com - username: u392139545.githubdeploy + server: ftp.audiomesh.amitraikwar.in + username: u392139545.githubdep password: ${{ secrets.HOSTINGER_FTP_PASSWORD }} local-dir: apps/web/build/ server-dir: ./