@toriistudio/shader-ui 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -2090,12 +2090,1370 @@ function Efecto({
2090
2090
  }
2091
2091
  );
2092
2092
  }
2093
+
2094
+ // src/components/Snow.tsx
2095
+ import { useCallback as useCallback6, useEffect as useEffect7, useRef as useRef7 } from "react";
2096
+ import * as THREE7 from "three";
2097
+
2098
+ // src/shaders/snow/fragment.glsl
2099
+ var fragment_default7 = "precision mediump float;\n\nuniform vec3 uColor;\n\nvarying float vAlpha;\n\nvoid main() {\n vec2 uv = gl_PointCoord - 0.5;\n float dist = length(uv);\n float mask = smoothstep(0.5, 0.0, dist);\n if (mask <= 0.01) {\n discard;\n }\n\n float centerGlow = smoothstep(0.22, 0.0, dist);\n vec3 color = mix(uColor * 1.2, uColor, centerGlow);\n\n gl_FragColor = vec4(color, mask * vAlpha);\n}\n";
2100
+
2101
+ // src/shaders/snow/vertex.glsl
2102
+ var vertex_default6 = "uniform float uTime;\nuniform float uFallSpeed;\nuniform float uWindStrength;\nuniform float uTurbulence;\nuniform float uSize;\nuniform float uTwinkleStrength;\nuniform vec3 uArea;\n\nattribute float aSpeed;\nattribute float aSize;\nattribute float aSeed;\n\nvarying float vAlpha;\n\nfloat wrap(float value, float size) {\n return mod(value + size * 0.5, size) - size * 0.5;\n}\n\nvoid main() {\n float height = uArea.y;\n float width = uArea.x;\n float depth = uArea.z;\n\n float fall = uFallSpeed * (0.3 + aSpeed);\n float droppedY = position.y - uTime * fall;\n float wrappedY = wrap(droppedY, height);\n\n float sway =\n sin((wrappedY + aSeed) * 0.45 + uTime * 0.8) * uTurbulence +\n cos(uTime * 0.35 + aSeed) * 0.15;\n float wind = uWindStrength * (0.4 + aSpeed);\n float displacedX = wrap(position.x + sway + wind, width);\n\n float driftZ =\n sin(uTime * 0.25 + aSeed * 1.7) * 0.5 +\n cos((wrappedY + aSeed) * 0.2) * 0.4;\n float displacedZ = wrap(position.z + driftZ, depth);\n\n vec4 modelPosition =\n modelMatrix * vec4(displacedX, wrappedY, displacedZ, 1.0);\n vec4 viewPosition = viewMatrix * modelPosition;\n\n float baseSize = mix(0.45, 1.0, aSize) * uSize;\n float twinkle =\n 1.0 + sin(uTime * (0.6 + aSpeed) + aSeed) * uTwinkleStrength;\n float perspective = clamp(15.0 / max(1.0, -viewPosition.z), 0.5, 3.0);\n gl_PointSize = baseSize * twinkle * perspective;\n gl_Position = projectionMatrix * viewPosition;\n\n vAlpha = mix(0.35, 1.0, aSize);\n}\n";
2103
+
2104
+ // src/components/Snow.tsx
2105
+ import { jsx as jsx8 } from "react/jsx-runtime";
2106
+ var AREA_BOUNDS = {
2107
+ width: 36,
2108
+ height: 44,
2109
+ depth: 26
2110
+ };
2111
+ function createSnowGeometry(count) {
2112
+ const geometry = new THREE7.BufferGeometry();
2113
+ const positions = new Float32Array(count * 3);
2114
+ const speeds = new Float32Array(count);
2115
+ const sizes = new Float32Array(count);
2116
+ const seeds = new Float32Array(count);
2117
+ for (let i = 0; i < count; i += 1) {
2118
+ const x = (Math.random() - 0.5) * AREA_BOUNDS.width;
2119
+ const y = (Math.random() - 0.5) * AREA_BOUNDS.height;
2120
+ const z = (Math.random() - 0.5) * AREA_BOUNDS.depth;
2121
+ positions[i * 3] = x;
2122
+ positions[i * 3 + 1] = y;
2123
+ positions[i * 3 + 2] = z;
2124
+ speeds[i] = Math.random();
2125
+ sizes[i] = Math.random();
2126
+ seeds[i] = Math.random() * 100;
2127
+ }
2128
+ geometry.setAttribute("position", new THREE7.BufferAttribute(positions, 3));
2129
+ geometry.setAttribute("aSpeed", new THREE7.BufferAttribute(speeds, 1));
2130
+ geometry.setAttribute("aSize", new THREE7.BufferAttribute(sizes, 1));
2131
+ geometry.setAttribute("aSeed", new THREE7.BufferAttribute(seeds, 1));
2132
+ geometry.computeBoundingSphere();
2133
+ return geometry;
2134
+ }
2135
+ function buildUniforms2({
2136
+ color,
2137
+ fallSpeed,
2138
+ windStrength,
2139
+ turbulence,
2140
+ flakeSize,
2141
+ twinkleStrength
2142
+ }) {
2143
+ return {
2144
+ uTime: { value: 0 },
2145
+ uFallSpeed: { value: fallSpeed },
2146
+ uWindStrength: { value: windStrength },
2147
+ uTurbulence: { value: turbulence },
2148
+ uSize: { value: flakeSize },
2149
+ uTwinkleStrength: { value: twinkleStrength },
2150
+ uColor: { value: new THREE7.Color(color) },
2151
+ uArea: {
2152
+ value: new THREE7.Vector3(
2153
+ AREA_BOUNDS.width,
2154
+ AREA_BOUNDS.height,
2155
+ AREA_BOUNDS.depth
2156
+ )
2157
+ }
2158
+ };
2159
+ }
2160
+ function Snow({
2161
+ className,
2162
+ style,
2163
+ width,
2164
+ height,
2165
+ color,
2166
+ fallSpeed,
2167
+ windStrength,
2168
+ turbulence,
2169
+ flakeSize,
2170
+ twinkleStrength,
2171
+ flakeCount,
2172
+ mouseWindInteraction = false,
2173
+ ...divProps
2174
+ }) {
2175
+ const snowRef = useRef7(null);
2176
+ const uniformsRef = useRef7({
2177
+ color,
2178
+ fallSpeed,
2179
+ windStrength,
2180
+ turbulence,
2181
+ flakeSize,
2182
+ twinkleStrength,
2183
+ flakeCount
2184
+ });
2185
+ uniformsRef.current = {
2186
+ color,
2187
+ fallSpeed,
2188
+ windStrength,
2189
+ turbulence,
2190
+ flakeSize,
2191
+ twinkleStrength,
2192
+ flakeCount
2193
+ };
2194
+ const pointerWindOffsetRef = useRef7(0);
2195
+ const pointerWindTargetRef = useRef7(0);
2196
+ const pointerStateRef = useRef7({
2197
+ lastX: 0,
2198
+ lastTime: 0,
2199
+ timeoutId: null
2200
+ });
2201
+ const pointerActiveRef = useRef7(false);
2202
+ const baseWindRef = useRef7(windStrength);
2203
+ useEffect7(() => {
2204
+ baseWindRef.current = windStrength;
2205
+ }, [windStrength]);
2206
+ const handleCreate = useCallback6(({ scene }) => {
2207
+ const uniforms = buildUniforms2(uniformsRef.current);
2208
+ const geometry = createSnowGeometry(
2209
+ Math.max(1, Math.floor(uniformsRef.current.flakeCount))
2210
+ );
2211
+ const material = new THREE7.ShaderMaterial({
2212
+ fragmentShader: fragment_default7,
2213
+ vertexShader: vertex_default6,
2214
+ uniforms,
2215
+ transparent: true,
2216
+ depthWrite: false,
2217
+ blending: THREE7.AdditiveBlending
2218
+ });
2219
+ const points = new THREE7.Points(geometry, material);
2220
+ points.frustumCulled = false;
2221
+ scene.add(points);
2222
+ snowRef.current = { points, geometry, material, uniforms };
2223
+ return () => {
2224
+ scene.remove(points);
2225
+ geometry.dispose();
2226
+ material.dispose();
2227
+ snowRef.current = null;
2228
+ };
2229
+ }, []);
2230
+ const handleRender = useCallback6(
2231
+ (_context, delta, elapsedTime) => {
2232
+ const assets = snowRef.current;
2233
+ if (!assets) return;
2234
+ assets.uniforms.uTime.value = elapsedTime;
2235
+ const currentOffset = pointerWindOffsetRef.current;
2236
+ const targetOffset = pointerWindTargetRef.current;
2237
+ const nextOffset = THREE7.MathUtils.damp(
2238
+ currentOffset,
2239
+ targetOffset,
2240
+ 3.5,
2241
+ delta
2242
+ );
2243
+ if (Math.abs(nextOffset - currentOffset) > 5e-5) {
2244
+ pointerWindOffsetRef.current = nextOffset;
2245
+ assets.uniforms.uWindStrength.value = baseWindRef.current + nextOffset;
2246
+ }
2247
+ },
2248
+ []
2249
+ );
2250
+ const { containerRef } = useScene({
2251
+ camera: {
2252
+ position: [0, 0, 18]
2253
+ },
2254
+ onCreate: handleCreate,
2255
+ onRender: handleRender
2256
+ });
2257
+ useEffect7(() => {
2258
+ const assets = snowRef.current;
2259
+ if (!assets) return;
2260
+ assets.uniforms.uColor.value.set(color);
2261
+ }, [color]);
2262
+ useEffect7(() => {
2263
+ const assets = snowRef.current;
2264
+ if (!assets) return;
2265
+ assets.uniforms.uFallSpeed.value = fallSpeed;
2266
+ }, [fallSpeed]);
2267
+ useEffect7(() => {
2268
+ const assets = snowRef.current;
2269
+ if (!assets) return;
2270
+ assets.uniforms.uWindStrength.value = windStrength + pointerWindOffsetRef.current;
2271
+ }, [windStrength]);
2272
+ useEffect7(() => {
2273
+ const assets = snowRef.current;
2274
+ if (!assets) return;
2275
+ assets.uniforms.uTurbulence.value = turbulence;
2276
+ }, [turbulence]);
2277
+ useEffect7(() => {
2278
+ const assets = snowRef.current;
2279
+ if (!assets) return;
2280
+ assets.uniforms.uSize.value = flakeSize;
2281
+ }, [flakeSize]);
2282
+ useEffect7(() => {
2283
+ const assets = snowRef.current;
2284
+ if (!assets) return;
2285
+ assets.uniforms.uTwinkleStrength.value = twinkleStrength;
2286
+ }, [twinkleStrength]);
2287
+ useEffect7(() => {
2288
+ const assets = snowRef.current;
2289
+ if (!assets) return;
2290
+ const geometry = createSnowGeometry(Math.max(1, Math.floor(flakeCount)));
2291
+ assets.points.geometry.dispose();
2292
+ assets.points.geometry = geometry;
2293
+ assets.geometry = geometry;
2294
+ }, [flakeCount]);
2295
+ useEffect7(() => {
2296
+ const pointerState = pointerStateRef.current;
2297
+ const clearTimeoutIfNeeded = () => {
2298
+ if (pointerState.timeoutId !== null) {
2299
+ window.clearTimeout(pointerState.timeoutId);
2300
+ pointerState.timeoutId = null;
2301
+ }
2302
+ };
2303
+ if (!mouseWindInteraction) {
2304
+ clearTimeoutIfNeeded();
2305
+ pointerWindOffsetRef.current = 0;
2306
+ pointerWindTargetRef.current = 0;
2307
+ pointerState.lastTime = 0;
2308
+ pointerActiveRef.current = false;
2309
+ const assets = snowRef.current;
2310
+ if (assets) {
2311
+ assets.uniforms.uWindStrength.value = windStrength;
2312
+ }
2313
+ return;
2314
+ }
2315
+ const container = containerRef.current;
2316
+ if (!container) return;
2317
+ const scheduleReset = () => {
2318
+ clearTimeoutIfNeeded();
2319
+ pointerState.timeoutId = window.setTimeout(() => {
2320
+ pointerWindTargetRef.current = 0;
2321
+ pointerState.timeoutId = null;
2322
+ }, 220);
2323
+ };
2324
+ const handlePointerMove = (event) => {
2325
+ const isMouse = event.pointerType === "mouse";
2326
+ if (!isMouse && !pointerActiveRef.current) return;
2327
+ const now = performance.now();
2328
+ if (pointerState.lastTime === 0) {
2329
+ pointerState.lastX = event.clientX;
2330
+ pointerState.lastTime = now;
2331
+ return;
2332
+ }
2333
+ const dx = event.clientX - pointerState.lastX;
2334
+ const dt = Math.max(1, now - pointerState.lastTime);
2335
+ const velocity = dx / dt;
2336
+ const offset = THREE7.MathUtils.clamp(velocity * 0.9, -1.6, 1.6);
2337
+ pointerWindTargetRef.current = offset;
2338
+ pointerState.lastX = event.clientX;
2339
+ pointerState.lastTime = now;
2340
+ scheduleReset();
2341
+ };
2342
+ const handlePointerDown = (event) => {
2343
+ pointerActiveRef.current = true;
2344
+ pointerState.lastX = event.clientX;
2345
+ pointerState.lastTime = performance.now();
2346
+ scheduleReset();
2347
+ };
2348
+ const handlePointerUp = () => {
2349
+ pointerActiveRef.current = false;
2350
+ pointerState.lastTime = 0;
2351
+ pointerWindTargetRef.current = 0;
2352
+ scheduleReset();
2353
+ };
2354
+ const handlePointerLeave = () => {
2355
+ pointerActiveRef.current = false;
2356
+ pointerState.lastTime = 0;
2357
+ pointerWindTargetRef.current = 0;
2358
+ clearTimeoutIfNeeded();
2359
+ };
2360
+ container.addEventListener("pointermove", handlePointerMove);
2361
+ container.addEventListener("pointerdown", handlePointerDown);
2362
+ container.addEventListener("pointerup", handlePointerUp);
2363
+ container.addEventListener("pointercancel", handlePointerUp);
2364
+ container.addEventListener("pointerout", handlePointerLeave);
2365
+ container.addEventListener("pointerleave", handlePointerLeave);
2366
+ return () => {
2367
+ container.removeEventListener("pointermove", handlePointerMove);
2368
+ container.removeEventListener("pointerdown", handlePointerDown);
2369
+ container.removeEventListener("pointerup", handlePointerUp);
2370
+ container.removeEventListener("pointercancel", handlePointerUp);
2371
+ container.removeEventListener("pointerout", handlePointerLeave);
2372
+ container.removeEventListener("pointerleave", handlePointerLeave);
2373
+ pointerState.lastTime = 0;
2374
+ pointerWindOffsetRef.current = 0;
2375
+ pointerWindTargetRef.current = 0;
2376
+ pointerActiveRef.current = false;
2377
+ clearTimeoutIfNeeded();
2378
+ const assets = snowRef.current;
2379
+ if (assets) {
2380
+ assets.uniforms.uWindStrength.value = windStrength;
2381
+ }
2382
+ };
2383
+ }, [containerRef, mouseWindInteraction, windStrength]);
2384
+ return /* @__PURE__ */ jsx8(
2385
+ "div",
2386
+ {
2387
+ ref: containerRef,
2388
+ className,
2389
+ style: {
2390
+ width: width ?? "100%",
2391
+ height: height ?? "100%",
2392
+ ...style
2393
+ },
2394
+ ...divProps
2395
+ }
2396
+ );
2397
+ }
2398
+
2399
+ // src/components/AnimatedDrawingSVG.tsx
2400
+ import clsx from "clsx";
2401
+ import { useEffect as useEffect8, useLayoutEffect, useRef as useRef8 } from "react";
2402
+ import { jsx as jsx9 } from "react/jsx-runtime";
2403
+ var PATH_SELECTOR = "path, line, polyline, polygon, circle, ellipse";
2404
+ function AnimatedDrawingSVG({
2405
+ svgMarkup,
2406
+ animated = true,
2407
+ size,
2408
+ onAnimated,
2409
+ delay,
2410
+ className,
2411
+ style,
2412
+ ...divProps
2413
+ }) {
2414
+ const containerRef = useRef8(null);
2415
+ const animationsRef = useRef8([]);
2416
+ const parserRef = useRef8(null);
2417
+ const onAnimatedRef = useRef8(onAnimated);
2418
+ const animationRunIdRef = useRef8(0);
2419
+ const onAnimationCompleteRef = useRef8(false);
2420
+ const timeoutRef = useRef8([]);
2421
+ const monitorRafRef = useRef8(null);
2422
+ const sanitizedMarkup = (svgMarkup ?? "").toString().trim();
2423
+ const normalizedDelay = typeof delay === "number" && delay > 0 ? delay : 0;
2424
+ useEffect8(() => {
2425
+ onAnimatedRef.current = onAnimated;
2426
+ }, [onAnimated]);
2427
+ useEffect8(() => {
2428
+ return () => {
2429
+ animationsRef.current.forEach((animation) => animation.cancel());
2430
+ animationsRef.current = [];
2431
+ timeoutRef.current.forEach((id) => window.clearTimeout(id));
2432
+ timeoutRef.current = [];
2433
+ if (monitorRafRef.current !== null) {
2434
+ cancelAnimationFrame(monitorRafRef.current);
2435
+ monitorRafRef.current = null;
2436
+ }
2437
+ };
2438
+ }, []);
2439
+ useLayoutEffect(() => {
2440
+ const container = containerRef.current;
2441
+ if (!container) return;
2442
+ let rafId = null;
2443
+ let delayId = null;
2444
+ let started = false;
2445
+ if (normalizedDelay > 0) {
2446
+ container.style.visibility = "hidden";
2447
+ } else {
2448
+ container.style.removeProperty("visibility");
2449
+ }
2450
+ animationRunIdRef.current += 1;
2451
+ const currentRunId = animationRunIdRef.current;
2452
+ onAnimationCompleteRef.current = false;
2453
+ timeoutRef.current.forEach((id) => window.clearTimeout(id));
2454
+ timeoutRef.current = [];
2455
+ const markComplete = () => {
2456
+ if (animationRunIdRef.current === currentRunId && !onAnimationCompleteRef.current) {
2457
+ onAnimationCompleteRef.current = true;
2458
+ onAnimatedRef.current?.();
2459
+ }
2460
+ };
2461
+ animationsRef.current.forEach((animation) => animation.cancel());
2462
+ animationsRef.current = [];
2463
+ if (monitorRafRef.current !== null) {
2464
+ cancelAnimationFrame(monitorRafRef.current);
2465
+ monitorRafRef.current = null;
2466
+ }
2467
+ if (!sanitizedMarkup) {
2468
+ container.replaceChildren();
2469
+ markComplete();
2470
+ return;
2471
+ }
2472
+ const parser = parserRef.current ?? new DOMParser();
2473
+ parserRef.current = parser;
2474
+ let parsed;
2475
+ try {
2476
+ parsed = parser.parseFromString(sanitizedMarkup, "image/svg+xml");
2477
+ } catch {
2478
+ return;
2479
+ }
2480
+ if (parsed.querySelector("parsererror")) {
2481
+ return;
2482
+ }
2483
+ const parsedSvg = parsed.querySelector("svg");
2484
+ if (!parsedSvg) {
2485
+ container.replaceChildren();
2486
+ onAnimatedRef.current?.();
2487
+ return;
2488
+ }
2489
+ const svgElement = document.importNode(parsedSvg, true);
2490
+ svgElement.setAttribute("preserveAspectRatio", "xMidYMid meet");
2491
+ if (size !== void 0) {
2492
+ svgElement.removeAttribute("width");
2493
+ svgElement.removeAttribute("height");
2494
+ const sizeValue = typeof size === "number" ? `${Math.max(0, size)}px` : `${size}`;
2495
+ svgElement.style.width = sizeValue;
2496
+ svgElement.style.height = "auto";
2497
+ } else {
2498
+ svgElement.style.width = "100%";
2499
+ svgElement.style.height = "100%";
2500
+ svgElement.style.maxWidth = "100%";
2501
+ svgElement.style.maxHeight = "100%";
2502
+ }
2503
+ svgElement.style.display = "block";
2504
+ container.replaceChildren(svgElement);
2505
+ const runAnimations = () => {
2506
+ const drawTargets = Array.from(
2507
+ svgElement.querySelectorAll(PATH_SELECTOR)
2508
+ );
2509
+ const scheduleFallback = (delay2) => {
2510
+ const fallbackId = window.setTimeout(markComplete, delay2);
2511
+ timeoutRef.current.push(fallbackId);
2512
+ };
2513
+ if (!drawTargets.length) {
2514
+ if (!animated) {
2515
+ markComplete();
2516
+ } else {
2517
+ Promise.resolve().then(() => {
2518
+ markComplete();
2519
+ });
2520
+ }
2521
+ return;
2522
+ }
2523
+ let maxDuration = 0;
2524
+ const resolveTimingValue = (value, fallback) => {
2525
+ if (typeof value === "number") {
2526
+ return value;
2527
+ }
2528
+ if (typeof value === "string") {
2529
+ const parsed2 = Number.parseFloat(value);
2530
+ return Number.isFinite(parsed2) ? parsed2 : fallback;
2531
+ }
2532
+ if (typeof value === "object" && value !== null) {
2533
+ const parsed2 = Number.parseFloat(value.toString());
2534
+ return Number.isFinite(parsed2) ? parsed2 : fallback;
2535
+ }
2536
+ return fallback;
2537
+ };
2538
+ drawTargets.forEach((element, index) => {
2539
+ const length = typeof element.getTotalLength === "function" ? element.getTotalLength() : null;
2540
+ if (!length || Number.isNaN(length)) {
2541
+ element.style.removeProperty("stroke-dasharray");
2542
+ element.style.removeProperty("stroke-dashoffset");
2543
+ return;
2544
+ }
2545
+ const dashValue = `${length}`;
2546
+ element.style.strokeDasharray = dashValue;
2547
+ element.style.strokeDashoffset = animated ? dashValue : "0";
2548
+ if (!element.style.strokeLinecap) {
2549
+ element.style.strokeLinecap = "round";
2550
+ }
2551
+ if (!animated) {
2552
+ return;
2553
+ }
2554
+ const animation = element.animate(
2555
+ [{ strokeDashoffset: dashValue }, { strokeDashoffset: "0" }],
2556
+ {
2557
+ duration: Math.min(6500, Math.max(1200, length * 12)),
2558
+ delay: index * 120,
2559
+ easing: "ease-in-out",
2560
+ fill: "forwards"
2561
+ }
2562
+ );
2563
+ const timing = animation.effect?.getTiming();
2564
+ const baseDuration = Math.min(6500, Math.max(1200, length * 12));
2565
+ const total = resolveTimingValue(timing?.delay, index * 120) + resolveTimingValue(timing?.duration, baseDuration);
2566
+ if (total > maxDuration) {
2567
+ maxDuration = total;
2568
+ }
2569
+ animationsRef.current.push(animation);
2570
+ });
2571
+ if (!animated) {
2572
+ markComplete();
2573
+ return;
2574
+ }
2575
+ const startMonitor = () => {
2576
+ const monitor = () => {
2577
+ if (animationRunIdRef.current !== currentRunId) {
2578
+ return;
2579
+ }
2580
+ const allFinished = animationsRef.current.every((animation) => {
2581
+ const state = animation.playState;
2582
+ return state === "finished" || state === "idle";
2583
+ });
2584
+ if (allFinished) {
2585
+ if (monitorRafRef.current !== null) {
2586
+ cancelAnimationFrame(monitorRafRef.current);
2587
+ monitorRafRef.current = null;
2588
+ }
2589
+ markComplete();
2590
+ return;
2591
+ }
2592
+ monitorRafRef.current = requestAnimationFrame(monitor);
2593
+ };
2594
+ if (monitorRafRef.current !== null) {
2595
+ cancelAnimationFrame(monitorRafRef.current);
2596
+ }
2597
+ monitorRafRef.current = requestAnimationFrame(monitor);
2598
+ };
2599
+ startMonitor();
2600
+ if (animated && maxDuration > 0) {
2601
+ scheduleFallback(maxDuration + 50);
2602
+ }
2603
+ };
2604
+ const triggerStart = () => {
2605
+ if (started) return;
2606
+ started = true;
2607
+ container.style.removeProperty("visibility");
2608
+ rafId = requestAnimationFrame(runAnimations);
2609
+ };
2610
+ if (normalizedDelay > 0) {
2611
+ delayId = window.setTimeout(triggerStart, normalizedDelay);
2612
+ } else {
2613
+ triggerStart();
2614
+ }
2615
+ return () => {
2616
+ if (delayId !== null) {
2617
+ window.clearTimeout(delayId);
2618
+ }
2619
+ if (rafId !== null) {
2620
+ cancelAnimationFrame(rafId);
2621
+ }
2622
+ };
2623
+ }, [sanitizedMarkup, animated, size, normalizedDelay]);
2624
+ return /* @__PURE__ */ jsx9(
2625
+ "div",
2626
+ {
2627
+ ref: containerRef,
2628
+ className: clsx(
2629
+ "flex items-center justify-center [&_svg]:block",
2630
+ className
2631
+ ),
2632
+ style: {
2633
+ ...style
2634
+ },
2635
+ ...divProps
2636
+ }
2637
+ );
2638
+ }
2639
+
2640
+ // src/components/WandyHand.tsx
2641
+ import { useEffect as useEffect9, useMemo as useMemo4, useRef as useRef9, useState } from "react";
2642
+ import opentype from "opentype.js";
2643
+
2644
+ // src/assets/fonts/waltographUI.ttf
2645
+ var waltographUI_default = "data:font/ttf;base64,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L2xpY2Vuc2VzL25jLXNhLzEuMC9XYWx0b2dyYXBoIFVJQm9sZE1HQkY6IFdhbHQgRGlzbmV5IFNjcmlwdDogMjAwMldhbHRvZ3JhcGggVUkgQm9sZDEuMFdhbHRvZ3JhcGhVSS1Cb2xkaHR0cDovL21pY2tleWF2ZW51ZS5jb20vZm9udHNUSEUgV09SSyAoQVMgREVGSU5FRCBCRUxPVykgSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ1JFQVRJVkUgQ09NTU9OUyBQVUJMSUMgTElDRU5TRSAoIkNDUEwiIE9SICJMSUNFTlNFIikuIFRIRSBXT1JLIElTIFBST1RFQ1RFRCBCWSBDT1BZUklHSFQgQU5EL09SIE9USEVSIEFQUExJQ0FCTEUgTEFXLiBBTlkgVVNFIE9GIFRIRSBXT1JLIE9USEVSIFRIQU4gQVMgQVVUSE9SSVpFRCBVTkRFUiBUSElTIExJQ0VOU0UgSVMgUFJPSElCSVRFRC4NCg0KQlkgRVhFUkNJU0lORyBBTlkgUklHSFRTIFRPIFRIRSBXT1JLIFBST1ZJREVEIEhFUkUsIFlPVSBBQ0NFUFQgQU5EIEFHUkVFIFRPIEJFIEJPVU5EIEJZIFRIRSBURVJNUyBPRiBUSElTIExJQ0VOU0UuIFRIRSBMSUNFTlNPUiBHUkFOVFMgWU9VIFRIRSBSSUdIVFMgQ09OVEFJTkVEIEhFUkUgSU4gQ09OU0lERVJBVElPTiBPRiBZT1VSIEFDQ0VQVEFOQ0UgT0YgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUy4NCg0KMS4gRGVmaW5pdGlvbnMNCg0KICAgMS4gIkNvbGxlY3RpdmUgV29yayIgbWVhbnMgYSB3b3JrLCBzdWNoIGFzIGEgcGVyaW9kaWNhbCBpc3N1ZSwgYW50aG9sb2d5IG9yIGVuY3ljbG9wZWRpYSwgaW4gd2hpY2ggdGhlIFdvcmsgaW4gaXRzIGVudGlyZXR5IGluIHVubW9kaWZpZWQgZm9ybSwgYWxvbmcgd2l0aCBhIG51bWJlciBvZiBvdGhlciBjb250cmlidXRpb25zLCBjb25zdGl0dXRpbmcgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50IHdvcmtzIGluIHRoZW1zZWx2ZXMsIGFyZSBhc3NlbWJsZWQgaW50byBhIGNvbGxlY3RpdmUgd2hvbGUuIEEgd29yayB0aGF0IGNvbnN0aXR1dGVzIGEgQ29sbGVjdGl2ZSBXb3JrIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYSBEZXJpdmF0aXZlIFdvcmsgKGFzIGRlZmluZWQgYmVsb3cpIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBMaWNlbnNlLg0KICAgMi4gIkRlcml2YXRpdmUgV29yayIgbWVhbnMgYSB3b3JrIGJhc2VkIHVwb24gdGhlIFdvcmsgb3IgdXBvbiB0aGUgV29yayBhbmQgb3RoZXIgcHJlLWV4aXN0aW5nIHdvcmtzLCBzdWNoIGFzIGEgdHJhbnNsYXRpb24sIG11c2ljYWwgYXJyYW5nZW1lbnQsIGRyYW1hdGl6YXRpb24sIGZpY3Rpb25hbGl6YXRpb24sIG1vdGlvbiBwaWN0dXJlIHZlcnNpb24sIHNvdW5kIHJlY29yZGluZywgYXJ0IHJlcHJvZHVjdGlvbiwgYWJyaWRnbWVudCwgY29uZGVuc2F0aW9uLCBvciBhbnkgb3RoZXIgZm9ybSBpbiB3aGljaCB0aGUgV29yayBtYXkgYmUgcmVjYXN0LCB0cmFuc2Zvcm1lZCwgb3IgYWRhcHRlZCwgZXhjZXB0IHRoYXQgYSB3b3JrIHRoYXQgY29uc3RpdHV0ZXMgYSBDb2xsZWN0aXZlIFdvcmsgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhIERlcml2YXRpdmUgV29yayBmb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBMaWNlbnNlLg0KICAgMy4gIkxpY2Vuc29yIiBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBvZmZlcnMgdGhlIFdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCiAgIDQuICJPcmlnaW5hbCBBdXRob3IiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB3aG8gY3JlYXRlZCB0aGUgV29yay4NCiAgIDUuICJXb3JrIiBtZWFucyB0aGUgY29weXJpZ2h0YWJsZSB3b3JrIG9mIGF1dGhvcnNoaXAgb2ZmZXJlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLg0KICAgNi4gIllvdSIgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIHdobyBoYXMgbm90IHByZXZpb3VzbHkgdmlvbGF0ZWQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8gdGhlIFdvcmssIG9yIHdobyBoYXMgcmVjZWl2ZWQgZXhwcmVzcyBwZXJtaXNzaW9uIGZyb20gdGhlIExpY2Vuc29yIHRvIGV4ZXJjaXNlIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgZGVzcGl0ZSBhIHByZXZpb3VzIHZpb2xhdGlvbi4NCg0KMi4gRmFpciBVc2UgUmlnaHRzLiBOb3RoaW5nIGluIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byByZWR1Y2UsIGxpbWl0LCBvciByZXN0cmljdCBhbnkgcmlnaHRzIGFyaXNpbmcgZnJvbSBmYWlyIHVzZSwgZmlyc3Qgc2FsZSBvciBvdGhlciBsaW1pdGF0aW9ucyBvbiB0aGUgZXhjbHVzaXZlIHJpZ2h0cyBvZiB0aGUgY29weXJpZ2h0IG93bmVyIHVuZGVyIGNvcHlyaWdodCBsYXcgb3Igb3RoZXIgYXBwbGljYWJsZSBsYXdzLg0KDQozLiBMaWNlbnNlIEdyYW50LiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIExpY2Vuc29yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUsIHBlcnBldHVhbCAoZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgYXBwbGljYWJsZSBjb3B5cmlnaHQpIGxpY2Vuc2UgdG8gZXhlcmNpc2UgdGhlIHJpZ2h0cyBpbiB0aGUgV29yayBhcyBzdGF0ZWQgYmVsb3c6DQoNCiAgIDEuIHRvIHJlcHJvZHVjZSB0aGUgV29yaywgdG8gaW5jb3Jwb3JhdGUgdGhlIFdvcmsgaW50byBvbmUgb3IgbW9yZSBDb2xsZWN0aXZlIFdvcmtzLCBhbmQgdG8gcmVwcm9kdWNlIHRoZSBXb3JrIGFzIGluY29ycG9yYXRlZCBpbiB0aGUgQ29sbGVjdGl2ZSBXb3JrczsNCiAgIDIuIHRvIGNyZWF0ZSBhbmQgcmVwcm9kdWNlIERlcml2YXRpdmUgV29ya3M7DQogICAzLiB0byBkaXN0cmlidXRlIGNvcGllcyBvciBwaG9ub3JlY29yZHMgb2YsIGRpc3BsYXkgcHVibGljbHksIHBlcmZvcm0gcHVibGljbHksIGFuZCBwZXJmb3JtIHB1YmxpY2x5IGJ5IG1lYW5zIG9mIGEgZGlnaXRhbCBhdWRpbyB0cmFuc21pc3Npb24gdGhlIFdvcmsgaW5jbHVkaW5nIGFzIGluY29ycG9yYXRlZCBpbiBDb2xsZWN0aXZlIFdvcmtzOw0KICAgNC4gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb3IgcGhvbm9yZWNvcmRzIG9mLCBkaXNwbGF5IHB1YmxpY2x5LCBwZXJmb3JtIHB1YmxpY2x5LCBhbmQgcGVyZm9ybSBwdWJsaWNseSBieSBtZWFucyBvZiBhIGRpZ2l0YWwgYXVkaW8gdHJhbnNtaXNzaW9uIERlcml2YXRpdmUgV29ya3M7DQoNClRoZSBhYm92ZSByaWdodHMgbWF5IGJlIGV4ZXJjaXNlZCBpbiBhbGwgbWVkaWEgYW5kIGZvcm1hdHMgd2hldGhlciBub3cga25vd24gb3IgaGVyZWFmdGVyIGRldmlzZWQuIFRoZSBhYm92ZSByaWdodHMgaW5jbHVkZSB0aGUgcmlnaHQgdG8gbWFrZSBzdWNoIG1vZGlmaWNhdGlvbnMgYXMgYXJlIHRlY2huaWNhbGx5IG5lY2Vzc2FyeSB0byBleGVyY2lzZSB0aGUgcmlnaHRzIGluIG90aGVyIG1lZGlhIGFuZCBmb3JtYXRzLiBBbGwgcmlnaHRzIG5vdCBleHByZXNzbHkgZ3JhbnRlZCBieSBMaWNlbnNvciBhcmUgaGVyZWJ5IHJlc2VydmVkLg0KDQo0LiBSZXN0cmljdGlvbnMuIFRoZSBsaWNlbnNlIGdyYW50ZWQgaW4gU2VjdGlvbiAzIGFib3ZlIGlzIGV4cHJlc3NseSBtYWRlIHN1YmplY3QgdG8gYW5kIGxpbWl0ZWQgYnkgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQoNCiAgIDEuIFlvdSBtYXkgZGlzdHJpYnV0ZSwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0gdGhlIFdvcmsgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YsIG9yIHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgZm9yLCB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9yIHBob25vcmVjb3JkIG9mIHRoZSBXb3JrIFlvdSBkaXN0cmlidXRlLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiB0aGUgV29yayB0aGF0IGFsdGVyIG9yIHJlc3RyaWN0IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIuIFlvdSBtYXkgbm90IHN1YmxpY2Vuc2UgdGhlIFdvcmsuIFlvdSBtdXN0IGtlZXAgaW50YWN0IGFsbCBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50aWVzLiBZb3UgbWF5IG5vdCBkaXN0cmlidXRlLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybSB0aGUgV29yayB3aXRoIGFueSB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRoYXQgY29udHJvbCBhY2Nlc3Mgb3IgdXNlIG9mIHRoZSBXb3JrIGluIGEgbWFubmVyIGluY29uc2lzdGVudCB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiBUaGUgYWJvdmUgYXBwbGllcyB0byB0aGUgV29yayBhcyBpbmNvcnBvcmF0ZWQgaW4gYSBDb2xsZWN0aXZlIFdvcmssIGJ1dCB0aGlzIGRvZXMgbm90IHJlcXVpcmUgdGhlIENvbGxlY3RpdmUgV29yayBhcGFydCBmcm9tIHRoZSBXb3JrIGl0c2VsZiB0byBiZSBtYWRlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gSWYgWW91IGNyZWF0ZSBhIENvbGxlY3RpdmUgV29yaywgdXBvbiBub3RpY2UgZnJvbSBhbnkgTGljZW5zb3IgWW91IG11c3QsIHRvIHRoZSBleHRlbnQgcHJhY3RpY2FibGUsIHJlbW92ZSBmcm9tIHRoZSBDb2xsZWN0aXZlIFdvcmsgYW55IHJlZmVyZW5jZSB0byBzdWNoIExpY2Vuc29yIG9yIHRoZSBPcmlnaW5hbCBBdXRob3IsIGFzIHJlcXVlc3RlZC4gSWYgWW91IGNyZWF0ZSBhIERlcml2YXRpdmUgV29yaywgdXBvbiBub3RpY2UgZnJvbSBhbnkgTGljZW5zb3IgWW91IG11c3QsIHRvIHRoZSBleHRlbnQgcHJhY3RpY2FibGUsIHJlbW92ZSBmcm9tIHRoZSBEZXJpdmF0aXZlIFdvcmsgYW55IHJlZmVyZW5jZSB0byBzdWNoIExpY2Vuc29yIG9yIHRoZSBPcmlnaW5hbCBBdXRob3IsIGFzIHJlcXVlc3RlZC4NCiAgIDIuIFlvdSBtYXkgZGlzdHJpYnV0ZSwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0gYSBEZXJpdmF0aXZlIFdvcmsgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YsIG9yIHRoZSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgZm9yLCB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9yIHBob25vcmVjb3JkIG9mIGVhY2ggRGVyaXZhdGl2ZSBXb3JrIFlvdSBkaXN0cmlidXRlLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybS4gWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiB0aGUgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IGFsdGVyIG9yIHJlc3RyaWN0IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIsIGFuZCBZb3UgbXVzdCBrZWVwIGludGFjdCBhbGwgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4gWW91IG1heSBub3QgZGlzdHJpYnV0ZSwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgb3IgcHVibGljbHkgZGlnaXRhbGx5IHBlcmZvcm0gdGhlIERlcml2YXRpdmUgV29yayB3aXRoIGFueSB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRoYXQgY29udHJvbCBhY2Nlc3Mgb3IgdXNlIG9mIHRoZSBXb3JrIGluIGEgbWFubmVyIGluY29uc2lzdGVudCB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LiBUaGUgYWJvdmUgYXBwbGllcyB0byB0aGUgRGVyaXZhdGl2ZSBXb3JrIGFzIGluY29ycG9yYXRlZCBpbiBhIENvbGxlY3RpdmUgV29yaywgYnV0IHRoaXMgZG9lcyBub3QgcmVxdWlyZSB0aGUgQ29sbGVjdGl2ZSBXb3JrIGFwYXJ0IGZyb20gdGhlIERlcml2YXRpdmUgV29yayBpdHNlbGYgdG8gYmUgbWFkZSBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQogICAzLiBZb3UgbWF5IG5vdCBleGVyY2lzZSBhbnkgb2YgdGhlIHJpZ2h0cyBncmFudGVkIHRvIFlvdSBpbiBTZWN0aW9uIDMgYWJvdmUgaW4gYW55IG1hbm5lciB0aGF0IGlzIHByaW1hcmlseSBpbnRlbmRlZCBmb3Igb3IgZGlyZWN0ZWQgdG93YXJkIGNvbW1lcmNpYWwgYWR2YW50YWdlIG9yIHByaXZhdGUgbW9uZXRhcnkgY29tcGVuc2F0aW9uLiBUaGUgZXhjaGFuZ2Ugb2YgdGhlIFdvcmsgZm9yIG90aGVyIGNvcHlyaWdodGVkIHdvcmtzIGJ5IG1lYW5zIG9mIGRpZ2l0YWwgZmlsZS1zaGFyaW5nIG9yIG90aGVyd2lzZSBzaGFsbCBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBpbnRlbmRlZCBmb3Igb3IgZGlyZWN0ZWQgdG93YXJkIGNvbW1lcmNpYWwgYWR2YW50YWdlIG9yIHByaXZhdGUgbW9uZXRhcnkgY29tcGVuc2F0aW9uLCBwcm92aWRlZCB0aGVyZSBpcyBubyBwYXltZW50IG9mIGFueSBtb25ldGFyeSBjb21wZW5zYXRpb24gaW4gY29ubmVjdGlvbiB3aXRoIHRoZSBleGNoYW5nZSBvZiBjb3B5cmlnaHRlZCB3b3Jrcy4NCg0KNS4gUmVwcmVzZW50YXRpb25zLCBXYXJyYW50aWVzIGFuZCBEaXNjbGFpbWVyDQoNCiAgIDEuIEJ5IG9mZmVyaW5nIHRoZSBXb3JrIGZvciBwdWJsaWMgcmVsZWFzZSB1bmRlciB0aGlzIExpY2Vuc2UsIExpY2Vuc29yIHJlcHJlc2VudHMgYW5kIHdhcnJhbnRzIHRoYXQsIHRvIHRoZSBiZXN0IG9mIExpY2Vuc29yJ3Mga25vd2xlZGdlIGFmdGVyIHJlYXNvbmFibGUgaW5xdWlyeToNCiAgICAgICAgIDEuIExpY2Vuc29yIGhhcyBzZWN1cmVkIGFsbCByaWdodHMgaW4gdGhlIFdvcmsgbmVjZXNzYXJ5IHRvIGdyYW50IHRoZSBsaWNlbnNlIHJpZ2h0cyBoZXJldW5kZXIgYW5kIHRvIHBlcm1pdCB0aGUgbGF3ZnVsIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2l0aG91dCBZb3UgaGF2aW5nIGFueSBvYmxpZ2F0aW9uIHRvIHBheSBhbnkgcm95YWx0aWVzLCBjb21wdWxzb3J5IGxpY2Vuc2UgZmVlcywgcmVzaWR1YWxzIG9yIGFueSBvdGhlciBwYXltZW50czsNCiAgICAgICAgIDIuIFRoZSBXb3JrIGRvZXMgbm90IGluZnJpbmdlIHRoZSBjb3B5cmlnaHQsIHRyYWRlbWFyaywgcHVibGljaXR5IHJpZ2h0cywgY29tbW9uIGxhdyByaWdodHMgb3IgYW55IG90aGVyIHJpZ2h0IG9mIGFueSB0aGlyZCBwYXJ0eSBvciBjb25zdGl0dXRlIGRlZmFtYXRpb24sIGludmFzaW9uIG9mIHByaXZhY3kgb3Igb3RoZXIgdG9ydGlvdXMgaW5qdXJ5IHRvIGFueSB0aGlyZCBwYXJ0eS4NCiAgIDIuIEVYQ0VQVCBBUyBFWFBSRVNTTFkgU1RBVEVEIElOIFRISVMgTElDRU5TRSBPUiBPVEhFUldJU0UgQUdSRUVEIElOIFdSSVRJTkcgT1IgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBXT1JLIElTIExJQ0VOU0VEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgUkVHQVJESU5HIFRIRSBDT05URU5UUyBPUiBBQ0NVUkFDWSBPRiBUSEUgV09SSy4NCg0KNi4gTGltaXRhdGlvbiBvbiBMaWFiaWxpdHkuIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXLCBBTkQgRVhDRVBUIEZPUiBEQU1BR0VTIEFSSVNJTkcgRlJPTSBMSUFCSUxJVFkgVE8gQSBUSElSRCBQQVJUWSBSRVNVTFRJTkcgRlJPTSBCUkVBQ0ggT0YgVEhFIFdBUlJBTlRJRVMgSU4gU0VDVElPTiA1LCBJTiBOTyBFVkVOVCBXSUxMIExJQ0VOU09SIEJFIExJQUJMRSBUTyBZT1UgT04gQU5ZIExFR0FMIFRIRU9SWSBGT1IgQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIENPTlNFUVVFTlRJQUwsIFBVTklUSVZFIE9SIEVYRU1QTEFSWSBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRISVMgTElDRU5TRSBPUiBUSEUgVVNFIE9GIFRIRSBXT1JLLCBFVkVOIElGIExJQ0VOU09SIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4NCg0KNy4gVGVybWluYXRpb24NCg0KICAgMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgdXBvbiBhbnkgYnJlYWNoIGJ5IFlvdSBvZiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBJbmRpdmlkdWFscyBvciBlbnRpdGllcyB3aG8gaGF2ZSByZWNlaXZlZCBEZXJpdmF0aXZlIFdvcmtzIG9yIENvbGxlY3RpdmUgV29ya3MgZnJvbSBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlLCBob3dldmVyLCB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgcHJvdmlkZWQgc3VjaCBpbmRpdmlkdWFscyBvciBlbnRpdGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlIHdpdGggdGhvc2UgbGljZW5zZXMuIFNlY3Rpb25zIDEsIDIsIDUsIDYsIDcsIGFuZCA4IHdpbGwgc3Vydml2ZSBhbnkgdGVybWluYXRpb24gb2YgdGhpcyBMaWNlbnNlLg0KICAgMi4gU3ViamVjdCB0byB0aGUgYWJvdmUgdGVybXMgYW5kIGNvbmRpdGlvbnMsIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZSBpcyBwZXJwZXR1YWwgKGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFwcGxpY2FibGUgY29weXJpZ2h0IGluIHRoZSBXb3JrKS4gTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgTGljZW5zb3IgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHJlbGVhc2UgdGhlIFdvcmsgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgb3IgdG8gc3RvcCBkaXN0cmlidXRpbmcgdGhlIFdvcmsgYXQgYW55IHRpbWU7IHByb3ZpZGVkLCBob3dldmVyIHRoYXQgYW55IHN1Y2ggZWxlY3Rpb24gd2lsbCBub3Qgc2VydmUgdG8gd2l0aGRyYXcgdGhpcyBMaWNlbnNlIChvciBhbnkgb3RoZXIgbGljZW5zZSB0aGF0IGhhcyBiZWVuLCBvciBpcyByZXF1aXJlZCB0byBiZSwgZ3JhbnRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlKSwgYW5kIHRoaXMgTGljZW5zZSB3aWxsIGNvbnRpbnVlIGluIGZ1bGwgZm9yY2UgYW5kIGVmZmVjdCB1bmxlc3MgdGVybWluYXRlZCBhcyBzdGF0ZWQgYWJvdmUuDQoNCjguIE1pc2NlbGxhbmVvdXMNCg0KICAgMS4gRWFjaCB0aW1lIFlvdSBkaXN0cmlidXRlIG9yIHB1YmxpY2x5IGRpZ2l0YWxseSBwZXJmb3JtIHRoZSBXb3JrIG9yIGEgQ29sbGVjdGl2ZSBXb3JrLCB0aGUgTGljZW5zb3Igb2ZmZXJzIHRvIHRoZSByZWNpcGllbnQgYSBsaWNlbnNlIHRvIHRoZSBXb3JrIG9uIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIGFzIHRoZSBsaWNlbnNlIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZS4NCiAgIDIuIEVhY2ggdGltZSBZb3UgZGlzdHJpYnV0ZSBvciBwdWJsaWNseSBkaWdpdGFsbHkgcGVyZm9ybSBhIERlcml2YXRpdmUgV29yaywgTGljZW5zb3Igb2ZmZXJzIHRvIHRoZSByZWNpcGllbnQgYSBsaWNlbnNlIHRvIHRoZSBvcmlnaW5hbCBXb3JrIG9uIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIGFzIHRoZSBsaWNlbnNlIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZS4NCiAgIDMuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyB0byB0aGlzIGFncmVlbWVudCwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4NCiAgIDQuIE5vIHRlcm0gb3IgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgd2FpdmVkIGFuZCBubyBicmVhY2ggY29uc2VudGVkIHRvIHVubGVzcyBzdWNoIHdhaXZlciBvciBjb25zZW50IHNoYWxsIGJlIGluIHdyaXRpbmcgYW5kIHNpZ25lZCBieSB0aGUgcGFydHkgdG8gYmUgY2hhcmdlZCB3aXRoIHN1Y2ggd2FpdmVyIG9yIGNvbnNlbnQuDQogICA1LiBUaGlzIExpY2Vuc2UgY29uc3RpdHV0ZXMgdGhlIGVudGlyZSBhZ3JlZW1lbnQgYmV0d2VlbiB0aGUgcGFydGllcyB3aXRoIHJlc3BlY3QgdG8gdGhlIFdvcmsgbGljZW5zZWQgaGVyZS4gVGhlcmUgYXJlIG5vIHVuZGVyc3RhbmRpbmdzLCBhZ3JlZW1lbnRzIG9yIHJlcHJlc2VudGF0aW9ucyB3aXRoIHJlc3BlY3QgdG8gdGhlIFdvcmsgbm90IHNwZWNpZmllZCBoZXJlLiBMaWNlbnNvciBzaGFsbCBub3QgYmUgYm91bmQgYnkgYW55IGFkZGl0aW9uYWwgcHJvdmlzaW9ucyB0aGF0IG1heSBhcHBlYXIgaW4gYW55IGNvbW11bmljYXRpb24gZnJvbSBZb3UuIFRoaXMgTGljZW5zZSBtYXkgbm90IGJlIG1vZGlmaWVkIHdpdGhvdXQgdGhlIG11dHVhbCB3cml0dGVuIGFncmVlbWVudCBvZiB0aGUgTGljZW5zb3IgYW5kIFlvdS5odHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9uYy1zYS8xLjAvAEQAaQBnAGkAdABpAHoAZQBkACAAZABhAHQAYQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADAAMAAtADIAMAAwADQAIABtAGkAYwBrAGUAeQBhAHYAZQBuAHUAZQAuAGMAbwBtACAAOgA6ACAAUwBvAG0AZQAgAHIAaQBnAGgAdABzACAAcgBlAHMAZQByAHYAZQBkACAAOgA6ACAARgBvAHIAIABwAGUAcgBzAG8AbgBhAGwALAAgAG4AbwBuAGMAbwBtAG0AZQByAGMAaQBhAGwAIAB1AHMAZQAgAG8AbgBsAHkAIAA6ADoAIABSAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABDAHIAZQBhAHQAaQB2AGUAIABDAG8AbQBtAG8AbgBzACAATgBvAG4AQwBvAG0AbQBlAHIAYwBpAGEAbAAtAFMAaABhAHIAZQBBAGwAaQBrAGUAIABsAGkAYwBlAG4AcwBlACAAaAB0AHQAcAA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AbgBjAC0AcwBhAC8AMQAuADAALwBXAGEAbAB0AG8AZwByAGEAcABoACAAVQBJAEIAbwBsAGQATQBHAEIARgA6ACAAVwBhAGwAdAAgAEQAaQBzAG4AZQB5ACAAUwBjAHIAaQBwAHQAOgAgADIAMAAwADIAVwBhAGwAdABvAGcAcgBhAHAAaAAgAFUASQAgAEIAbwBsAGQAMQAuADAAVwBhAGwAdABvAGcAcgBhAHAAaABVAEkALQBCAG8AbABkAGgAdAB0AHAAOgAvAC8AbQBpAGMAawBlAHkAYQB2AGUAbgB1AGUALgBjAG8AbQAvAGYAbwBuAHQAcwBUAEgARQAgAFcATwBSAEsAIAAoAEEAUwAgAEQARQBGAEkATgBFAEQAIABCAEUATABPAFcAKQAgAEkAUwAgAFAAUgBPAFYASQBEAEUARAAgAFUATgBEAEUAUgAgAFQASABFACAAVABFAFIATQBTACAATwBGACAAVABIAEkAUwAgAEMAUgBFAEEAVABJAFYARQAgAEMATwBNAE0ATwBOAFMAIABQAFUAQgBMAEkAQwAgAEwASQBDAEUATgBTAEUAIAAoACIAQwBDAFAATAAiACAATwBSACAAIgBMAEkAQwBFAE4AUwBFACIAKQAuACAAVABIAEUAIABXAE8AUgBLACAASQBTACAAUABSAE8AVABFAEMAVABFAEQAIABCAFkAIABDAE8AUABZAFIASQBHAEgAVAAgAEEATgBEAC8ATwBSACAATwBUAEgARQBSACAAQQBQAFAATABJAEMAQQBCAEwARQAgAEwAQQBXAC4AIABBAE4AWQAgAFUAUwBFACAATwBGACAAVABIAEUAIABXAE8AUgBLACAATwBUAEgARQBSACAAVABIAEEATgAgAEEAUwAgAEEAVQBUAEgATwBSAEkAWgBFAEQAIABVAE4ARABFAFIAIABUAEgASQBTACAATABJAEMARQBOAFMARQAgAEkAUwAgAFAAUgBPAEgASQBCAEkAVABFAEQALgANAAoADQAKAEIAWQAgAEUAWABFAFIAQwBJAFMASQBOAEcAIABBAE4AWQAgAFIASQBHAEgAVABTACAAVABPACAAVABIAEUAIABXAE8AUgBLACAAUABSAE8AVgBJAEQARQBEACAASABFAFIARQAsACAAWQBPAFUAIABBAEMAQwBFAFAAVAAgAEEATgBEACAAQQBHAFIARQBFACAAVABPACAAQgBFACAAQgBPAFUATgBEACAAQgBZACAAVABIAEUAIABUAEUAUgBNAFMAIABPAEYAIABUAEgASQBTACAATABJAEMARQBOAFMARQAuACAAVABIAEUAIABMAEkAQwBFAE4AUwBPAFIAIABHAFIAQQBOAFQAUwAgAFkATwBVACAAVABIAEUAIABSAEkARwBIAFQAUwAgAEMATwBOAFQAQQBJAE4ARQBEACAASABFAFIARQAgAEkATgAgAEMATwBOAFMASQBEAEUAUgBBAFQASQBPAE4AIABPAEYAIABZAE8AVQBSACAAQQBDAEMARQBQAFQAQQBOAEMARQAgAE8ARgAgAFMAVQBDAEgAIABUAEUAUgBNAFMAIABBAE4ARAAgAEMATwBOAEQASQBUAEkATwBOAFMALgANAAoADQAKADEALgAgAEQAZQBmAGkAbgBpAHQAaQBvAG4AcwANAAoADQAKACAAIAAgADEALgAgACIAQwBvAGwAbABlAGMAdABpAHYAZQAgAFcAbwByAGsAIgAgAG0AZQBhAG4AcwAgAGEAIAB3AG8AcgBrACwAIABzAHUAYwBoACAAYQBzACAAYQAgAHAAZQByAGkAbwBkAGkAYwBhAGwAIABpAHMAcwB1AGUALAAgAGEAbgB0AGgAbwBsAG8AZwB5ACAAbwByACAAZQBuAGMAeQBjAGwAbwBwAGUAZABpAGEALAAgAGkAbgAgAHcAaABpAGMAaAAgAHQAaABlACAAVwBvAHIAawAgAGkAbgAgAGkAdABzACAAZQBuAHQAaQByAGUAdAB5ACAAaQBuACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGYAbwByAG0ALAAgAGEAbABvAG4AZwAgAHcAaQB0AGgAIABhACAAbgB1AG0AYgBlAHIAIABvAGYAIABvAHQAaABlAHIAIABjAG8AbgB0AHIAaQBiAHUAdABpAG8AbgBzACwAIABjAG8AbgBzAHQAaQB0AHUAdABpAG4AZwAgAHMAZQBwAGEAcgBhAHQAZQAgAGEAbgBkACAAaQBuAGQAZQBwAGUAbgBkAGUAbgB0ACAAdwBvAHIAawBzACAAaQBuACAAdABoAGUAbQBzAGUAbAB2AGUAcwAsACAAYQByAGUAIABhAHMAcwBlAG0AYgBsAGUAZAAgAGkAbgB0AG8AIABhACAAYwBvAGwAbABlAGMAdABpAHYAZQAgAHcAaABvAGwAZQAuACAAQQAgAHcAbwByAGsAIAB0AGgAYQB0ACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQAgAEMAbwBsAGwAZQBjAHQAaQB2AGUAIABXAG8AcgBrACAAdwBpAGwAbAAgAG4AbwB0ACAAYgBlACAAYwBvAG4AcwBpAGQAZQByAGUAZAAgAGEAIABEAGUAcgBpAHYAYQB0AGkAdgBlACAAVwBvAHIAawAgACgAYQBzACAAZABlAGYAaQBuAGUAZAAgAGIAZQBsAG8AdwApACAAZgBvAHIAIAB0AGgAZQAgAHAAdQByAHAAbwBzAGUAcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlAC4ADQAKACAAIAAgADIALgAgACIARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsAIgAgAG0AZQBhAG4AcwAgAGEAIAB3AG8AcgBrACAAYgBhAHMAZQBkACAAdQBwAG8AbgAgAHQAaABlACAAVwBvAHIAawAgAG8AcgAgAHUAcABvAG4AIAB0AGgAZQAgAFcAbwByAGsAIABhAG4AZAAgAG8AdABoAGUAcgAgAHAAcgBlAC0AZQB4AGkAcwB0AGkAbgBnACAAdwBvAHIAawBzACwAIABzAHUAYwBoACAAYQBzACAAYQAgAHQAcgBhAG4AcwBsAGEAdABpAG8AbgAsACAAbQB1AHMAaQBjAGEAbAAgAGEAcgByAGEAbgBnAGUAbQBlAG4AdAAsACAAZAByAGEAbQBhAHQAaQB6AGEAdABpAG8AbgAsACAAZgBpAGMAdABpAG8AbgBhAGwAaQB6AGEAdABpAG8AbgAsACAAbQBvAHQAaQBvAG4AIABwAGkAYwB0AHUAcgBlACAAdgBlAHIAcwBpAG8AbgAsACAAcwBvAHUAbgBkACAAcgBlAGMAbwByAGQAaQBuAGcALAAgAGEAcgB0ACAAcgBlAHAAcgBvAGQAdQBjAHQAaQBvAG4ALAAgAGEAYgByAGkAZABnAG0AZQBuAHQALAAgAGMAbwBuAGQAZQBuAHMAYQB0AGkAbwBuACwAIABvAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGYAbwByAG0AIABpAG4AIAB3AGgAaQBjAGgAIAB0AGgAZQAgAFcAbwByAGsAIABtAGEAeQAgAGIAZQAgAHIAZQBjAGEAcwB0ACwAIAB0AHIAYQBuAHMAZgBvAHIAbQBlAGQALAAgAG8AcgAgAGEAZABhAHAAdABlAGQALAAgAGUAeABjAGUAcAB0ACAAdABoAGEAdAAgAGEAIAB3AG8AcgBrACAAdABoAGEAdAAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAIABDAG8AbABsAGUAYwB0AGkAdgBlACAAVwBvAHIAawAgAHcAaQBsAGwAIABuAG8AdAAgAGIAZQAgAGMAbwBuAHMAaQBkAGUAcgBlAGQAIABhACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsAIABmAG8AcgAgAHQAaABlACAAcAB1AHIAcABvAHMAZQAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlAC4ADQAKACAAIAAgADMALgAgACIATABpAGMAZQBuAHMAbwByACIAIABtAGUAYQBuAHMAIAB0AGgAZQAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABvAHIAIABlAG4AdABpAHQAeQAgAHQAaABhAHQAIABvAGYAZgBlAHIAcwAgAHQAaABlACAAVwBvAHIAawAgAHUAbgBkAGUAcgAgAHQAaABlACAAdABlAHIAbQBzACAAbwBmACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUALgANAAoAIAAgACAANAAuACAAIgBPAHIAaQBnAGkAbgBhAGwAIABBAHUAdABoAG8AcgAiACAAbQBlAGEAbgBzACAAdABoAGUAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAbwByACAAZQBuAHQAaQB0AHkAIAB3AGgAbwAgAGMAcgBlAGEAdABlAGQAIAB0AGgAZQAgAFcAbwByAGsALgANAAoAIAAgACAANQAuACAAIgBXAG8AcgBrACIAIABtAGUAYQBuAHMAIAB0AGgAZQAgAGMAbwBwAHkAcgBpAGcAaAB0AGEAYgBsAGUAIAB3AG8AcgBrACAAbwBmACAAYQB1AHQAaABvAHIAcwBoAGkAcAAgAG8AZgBmAGUAcgBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlAC4ADQAKACAAIAAgADYALgAgACIAWQBvAHUAIgAgAG0AZQBhAG4AcwAgAGEAbgAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABvAHIAIABlAG4AdABpAHQAeQAgAGUAeABlAHIAYwBpAHMAaQBuAGcAIAByAGkAZwBoAHQAcwAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACAAdwBoAG8AIABoAGEAcwAgAG4AbwB0ACAAcAByAGUAdgBpAG8AdQBzAGwAeQAgAHYAaQBvAGwAYQB0AGUAZAAgAHQAaABlACAAdABlAHIAbQBzACAAbwBmACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUAIAB3AGkAdABoACAAcgBlAHMAcABlAGMAdAAgAHQAbwAgAHQAaABlACAAVwBvAHIAawAsACAAbwByACAAdwBoAG8AIABoAGEAcwAgAHIAZQBjAGUAaQB2AGUAZAAgAGUAeABwAHIAZQBzAHMAIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAZgByAG8AbQAgAHQAaABlACAATABpAGMAZQBuAHMAbwByACAAdABvACAAZQB4AGUAcgBjAGkAcwBlACAAcgBpAGcAaAB0AHMAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAGQAZQBzAHAAaQB0AGUAIABhACAAcAByAGUAdgBpAG8AdQBzACAAdgBpAG8AbABhAHQAaQBvAG4ALgANAAoADQAKADIALgAgAEYAYQBpAHIAIABVAHMAZQAgAFIAaQBnAGgAdABzAC4AIABOAG8AdABoAGkAbgBnACAAaQBuACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABpAG4AdABlAG4AZABlAGQAIAB0AG8AIAByAGUAZAB1AGMAZQAsACAAbABpAG0AaQB0ACwAIABvAHIAIAByAGUAcwB0AHIAaQBjAHQAIABhAG4AeQAgAHIAaQBnAGgAdABzACAAYQByAGkAcwBpAG4AZwAgAGYAcgBvAG0AIABmAGEAaQByACAAdQBzAGUALAAgAGYAaQByAHMAdAAgAHMAYQBsAGUAIABvAHIAIABvAHQAaABlAHIAIABsAGkAbQBpAHQAYQB0AGkAbwBuAHMAIABvAG4AIAB0AGgAZQAgAGUAeABjAGwAdQBzAGkAdgBlACAAcgBpAGcAaAB0AHMAIABvAGYAIAB0AGgAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbwB3AG4AZQByACAAdQBuAGQAZQByACAAYwBvAHAAeQByAGkAZwBoAHQAIABsAGEAdwAgAG8AcgAgAG8AdABoAGUAcgAgAGEAcABwAGwAaQBjAGEAYgBsAGUAIABsAGEAdwBzAC4ADQAKAA0ACgAzAC4AIABMAGkAYwBlAG4AcwBlACAARwByAGEAbgB0AC4AIABTAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIAB0AGUAcgBtAHMAIABhAG4AZAAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAIABvAGYAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAsACAATABpAGMAZQBuAHMAbwByACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAcwAgAFkAbwB1ACAAYQAgAHcAbwByAGwAZAB3AGkAZABlACwAIAByAG8AeQBhAGwAdAB5AC0AZgByAGUAZQAsACAAbgBvAG4ALQBlAHgAYwBsAHUAcwBpAHYAZQAsACAAcABlAHIAcABlAHQAdQBhAGwAIAAoAGYAbwByACAAdABoAGUAIABkAHUAcgBhAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAGEAcABwAGwAaQBjAGEAYgBsAGUAIABjAG8AcAB5AHIAaQBnAGgAdAApACAAbABpAGMAZQBuAHMAZQAgAHQAbwAgAGUAeABlAHIAYwBpAHMAZQAgAHQAaABlACAAcgBpAGcAaAB0AHMAIABpAG4AIAB0AGgAZQAgAFcAbwByAGsAIABhAHMAIABzAHQAYQB0AGUAZAAgAGIAZQBsAG8AdwA6AA0ACgANAAoAIAAgACAAMQAuACAAdABvACAAcgBlAHAAcgBvAGQAdQBjAGUAIAB0AGgAZQAgAFcAbwByAGsALAAgAHQAbwAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQAgAHQAaABlACAAVwBvAHIAawAgAGkAbgB0AG8AIABvAG4AZQAgAG8AcgAgAG0AbwByAGUAIABDAG8AbABsAGUAYwB0AGkAdgBlACAAVwBvAHIAawBzACwAIABhAG4AZAAgAHQAbwAgAHIAZQBwAHIAbwBkAHUAYwBlACAAdABoAGUAIABXAG8AcgBrACAAYQBzACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAEMAbwBsAGwAZQBjAHQAaQB2AGUAIABXAG8AcgBrAHMAOwANAAoAIAAgACAAMgAuACAAdABvACAAYwByAGUAYQB0AGUAIABhAG4AZAAgAHIAZQBwAHIAbwBkAHUAYwBlACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsAcwA7AA0ACgAgACAAIAAzAC4AIAB0AG8AIABkAGkAcwB0AHIAaQBiAHUAdABlACAAYwBvAHAAaQBlAHMAIABvAHIAIABwAGgAbwBuAG8AcgBlAGMAbwByAGQAcwAgAG8AZgAsACAAZABpAHMAcABsAGEAeQAgAHAAdQBiAGwAaQBjAGwAeQAsACAAcABlAHIAZgBvAHIAbQAgAHAAdQBiAGwAaQBjAGwAeQAsACAAYQBuAGQAIABwAGUAcgBmAG8AcgBtACAAcAB1AGIAbABpAGMAbAB5ACAAYgB5ACAAbQBlAGEAbgBzACAAbwBmACAAYQAgAGQAaQBnAGkAdABhAGwAIABhAHUAZABpAG8AIAB0AHIAYQBuAHMAbQBpAHMAcwBpAG8AbgAgAHQAaABlACAAVwBvAHIAawAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBzACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIABDAG8AbABsAGUAYwB0AGkAdgBlACAAVwBvAHIAawBzADsADQAKACAAIAAgADQALgAgAHQAbwAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIABjAG8AcABpAGUAcwAgAG8AcgAgAHAAaABvAG4AbwByAGUAYwBvAHIAZABzACAAbwBmACwAIABkAGkAcwBwAGwAYQB5ACAAcAB1AGIAbABpAGMAbAB5ACwAIABwAGUAcgBmAG8AcgBtACAAcAB1AGIAbABpAGMAbAB5ACwAIABhAG4AZAAgAHAAZQByAGYAbwByAG0AIABwAHUAYgBsAGkAYwBsAHkAIABiAHkAIABtAGUAYQBuAHMAIABvAGYAIABhACAAZABpAGcAaQB0AGEAbAAgAGEAdQBkAGkAbwAgAHQAcgBhAG4AcwBtAGkAcwBzAGkAbwBuACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsAcwA7AA0ACgANAAoAVABoAGUAIABhAGIAbwB2AGUAIAByAGkAZwBoAHQAcwAgAG0AYQB5ACAAYgBlACAAZQB4AGUAcgBjAGkAcwBlAGQAIABpAG4AIABhAGwAbAAgAG0AZQBkAGkAYQAgAGEAbgBkACAAZgBvAHIAbQBhAHQAcwAgAHcAaABlAHQAaABlAHIAIABuAG8AdwAgAGsAbgBvAHcAbgAgAG8AcgAgAGgAZQByAGUAYQBmAHQAZQByACAAZABlAHYAaQBzAGUAZAAuACAAVABoAGUAIABhAGIAbwB2AGUAIAByAGkAZwBoAHQAcwAgAGkAbgBjAGwAdQBkAGUAIAB0AGgAZQAgAHIAaQBnAGgAdAAgAHQAbwAgAG0AYQBrAGUAIABzAHUAYwBoACAAbQBvAGQAaQBmAGkAYwBhAHQAaQBvAG4AcwAgAGEAcwAgAGEAcgBlACAAdABlAGMAaABuAGkAYwBhAGwAbAB5ACAAbgBlAGMAZQBzAHMAYQByAHkAIAB0AG8AIABlAHgAZQByAGMAaQBzAGUAIAB0AGgAZQAgAHIAaQBnAGgAdABzACAAaQBuACAAbwB0AGgAZQByACAAbQBlAGQAaQBhACAAYQBuAGQAIABmAG8AcgBtAGEAdABzAC4AIABBAGwAbAAgAHIAaQBnAGgAdABzACAAbgBvAHQAIABlAHgAcAByAGUAcwBzAGwAeQAgAGcAcgBhAG4AdABlAGQAIABiAHkAIABMAGkAYwBlAG4AcwBvAHIAIABhAHIAZQAgAGgAZQByAGUAYgB5ACAAcgBlAHMAZQByAHYAZQBkAC4ADQAKAA0ACgA0AC4AIABSAGUAcwB0AHIAaQBjAHQAaQBvAG4AcwAuACAAVABoAGUAIABsAGkAYwBlAG4AcwBlACAAZwByAGEAbgB0AGUAZAAgAGkAbgAgAFMAZQBjAHQAaQBvAG4AIAAzACAAYQBiAG8AdgBlACAAaQBzACAAZQB4AHAAcgBlAHMAcwBsAHkAIABtAGEAZABlACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAGEAbgBkACAAbABpAG0AaQB0AGUAZAAgAGIAeQAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AcwA6AA0ACgANAAoAIAAgACAAMQAuACAAWQBvAHUAIABtAGEAeQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAHAAdQBiAGwAaQBjAGwAeQAgAGQAaQBzAHAAbABhAHkALAAgAHAAdQBiAGwAaQBjAGwAeQAgAHAAZQByAGYAbwByAG0ALAAgAG8AcgAgAHAAdQBiAGwAaQBjAGwAeQAgAGQAaQBnAGkAdABhAGwAbAB5ACAAcABlAHIAZgBvAHIAbQAgAHQAaABlACAAVwBvAHIAawAgAG8AbgBsAHkAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAFkAbwB1ACAAbQB1AHMAdAAgAGkAbgBjAGwAdQBkAGUAIABhACAAYwBvAHAAeQAgAG8AZgAsACAAbwByACAAdABoAGUAIABVAG4AaQBmAG8AcgBtACAAUgBlAHMAbwB1AHIAYwBlACAASQBkAGUAbgB0AGkAZgBpAGUAcgAgAGYAbwByACwAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAHcAaQB0AGgAIABlAHYAZQByAHkAIABjAG8AcAB5ACAAbwByACAAcABoAG8AbgBvAHIAZQBjAG8AcgBkACAAbwBmACAAdABoAGUAIABXAG8AcgBrACAAWQBvAHUAIABkAGkAcwB0AHIAaQBiAHUAdABlACwAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAcwBwAGwAYQB5ACwAIABwAHUAYgBsAGkAYwBsAHkAIABwAGUAcgBmAG8AcgBtACwAIABvAHIAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAZwBpAHQAYQBsAGwAeQAgAHAAZQByAGYAbwByAG0ALgAgAFkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAG8AZgBmAGUAcgAgAG8AcgAgAGkAbQBwAG8AcwBlACAAYQBuAHkAIAB0AGUAcgBtAHMAIABvAG4AIAB0AGgAZQAgAFcAbwByAGsAIAB0AGgAYQB0ACAAYQBsAHQAZQByACAAbwByACAAcgBlAHMAdAByAGkAYwB0ACAAdABoAGUAIAB0AGUAcgBtAHMAIABvAGYAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAG8AcgAgAHQAaABlACAAcgBlAGMAaQBwAGkAZQBuAHQAcwAnACAAZQB4AGUAcgBjAGkAcwBlACAAbwBmACAAdABoAGUAIAByAGkAZwBoAHQAcwAgAGcAcgBhAG4AdABlAGQAIABoAGUAcgBlAHUAbgBkAGUAcgAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAcwB1AGIAbABpAGMAZQBuAHMAZQAgAHQAaABlACAAVwBvAHIAawAuACAAWQBvAHUAIABtAHUAcwB0ACAAawBlAGUAcAAgAGkAbgB0AGEAYwB0ACAAYQBsAGwAIABuAG8AdABpAGMAZQBzACAAdABoAGEAdAAgAHIAZQBmAGUAcgAgAHQAbwAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACAAYQBuAGQAIAB0AG8AIAB0AGgAZQAgAGQAaQBzAGMAbABhAGkAbQBlAHIAIABvAGYAIAB3AGEAcgByAGEAbgB0AGkAZQBzAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABkAGkAcwB0AHIAaQBiAHUAdABlACwAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAcwBwAGwAYQB5ACwAIABwAHUAYgBsAGkAYwBsAHkAIABwAGUAcgBmAG8AcgBtACwAIABvAHIAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAZwBpAHQAYQBsAGwAeQAgAHAAZQByAGYAbwByAG0AIAB0AGgAZQAgAFcAbwByAGsAIAB3AGkAdABoACAAYQBuAHkAIAB0AGUAYwBoAG4AbwBsAG8AZwBpAGMAYQBsACAAbQBlAGEAcwB1AHIAZQBzACAAdABoAGEAdAAgAGMAbwBuAHQAcgBvAGwAIABhAGMAYwBlAHMAcwAgAG8AcgAgAHUAcwBlACAAbwBmACAAdABoAGUAIABXAG8AcgBrACAAaQBuACAAYQAgAG0AYQBuAG4AZQByACAAaQBuAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAdABoAGUAIAB0AGUAcgBtAHMAIABvAGYAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAEEAZwByAGUAZQBtAGUAbgB0AC4AIABUAGgAZQAgAGEAYgBvAHYAZQAgAGEAcABwAGwAaQBlAHMAIAB0AG8AIAB0AGgAZQAgAFcAbwByAGsAIABhAHMAIABpAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAGEAIABDAG8AbABsAGUAYwB0AGkAdgBlACAAVwBvAHIAawAsACAAYgB1AHQAIAB0AGgAaQBzACAAZABvAGUAcwAgAG4AbwB0ACAAcgBlAHEAdQBpAHIAZQAgAHQAaABlACAAQwBvAGwAbABlAGMAdABpAHYAZQAgAFcAbwByAGsAIABhAHAAYQByAHQAIABmAHIAbwBtACAAdABoAGUAIABXAG8AcgBrACAAaQB0AHMAZQBsAGYAIAB0AG8AIABiAGUAIABtAGEAZABlACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAdABlAHIAbQBzACAAbwBmACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUALgAgAEkAZgAgAFkAbwB1ACAAYwByAGUAYQB0AGUAIABhACAAQwBvAGwAbABlAGMAdABpAHYAZQAgAFcAbwByAGsALAAgAHUAcABvAG4AIABuAG8AdABpAGMAZQAgAGYAcgBvAG0AIABhAG4AeQAgAEwAaQBjAGUAbgBzAG8AcgAgAFkAbwB1ACAAbQB1AHMAdAAsACAAdABvACAAdABoAGUAIABlAHgAdABlAG4AdAAgAHAAcgBhAGMAdABpAGMAYQBiAGwAZQAsACAAcgBlAG0AbwB2AGUAIABmAHIAbwBtACAAdABoAGUAIABDAG8AbABsAGUAYwB0AGkAdgBlACAAVwBvAHIAawAgAGEAbgB5ACAAcgBlAGYAZQByAGUAbgBjAGUAIAB0AG8AIABzAHUAYwBoACAATABpAGMAZQBuAHMAbwByACAAbwByACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABBAHUAdABoAG8AcgAsACAAYQBzACAAcgBlAHEAdQBlAHMAdABlAGQALgAgAEkAZgAgAFkAbwB1ACAAYwByAGUAYQB0AGUAIABhACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsALAAgAHUAcABvAG4AIABuAG8AdABpAGMAZQAgAGYAcgBvAG0AIABhAG4AeQAgAEwAaQBjAGUAbgBzAG8AcgAgAFkAbwB1ACAAbQB1AHMAdAAsACAAdABvACAAdABoAGUAIABlAHgAdABlAG4AdAAgAHAAcgBhAGMAdABpAGMAYQBiAGwAZQAsACAAcgBlAG0AbwB2AGUAIABmAHIAbwBtACAAdABoAGUAIABEAGUAcgBpAHYAYQB0AGkAdgBlACAAVwBvAHIAawAgAGEAbgB5ACAAcgBlAGYAZQByAGUAbgBjAGUAIAB0AG8AIABzAHUAYwBoACAATABpAGMAZQBuAHMAbwByACAAbwByACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABBAHUAdABoAG8AcgAsACAAYQBzACAAcgBlAHEAdQBlAHMAdABlAGQALgANAAoAIAAgACAAMgAuACAAWQBvAHUAIABtAGEAeQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAHAAdQBiAGwAaQBjAGwAeQAgAGQAaQBzAHAAbABhAHkALAAgAHAAdQBiAGwAaQBjAGwAeQAgAHAAZQByAGYAbwByAG0ALAAgAG8AcgAgAHAAdQBiAGwAaQBjAGwAeQAgAGQAaQBnAGkAdABhAGwAbAB5ACAAcABlAHIAZgBvAHIAbQAgAGEAIABEAGUAcgBpAHYAYQB0AGkAdgBlACAAVwBvAHIAawAgAG8AbgBsAHkAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAFkAbwB1ACAAbQB1AHMAdAAgAGkAbgBjAGwAdQBkAGUAIABhACAAYwBvAHAAeQAgAG8AZgAsACAAbwByACAAdABoAGUAIABVAG4AaQBmAG8AcgBtACAAUgBlAHMAbwB1AHIAYwBlACAASQBkAGUAbgB0AGkAZgBpAGUAcgAgAGYAbwByACwAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAHcAaQB0AGgAIABlAHYAZQByAHkAIABjAG8AcAB5ACAAbwByACAAcABoAG8AbgBvAHIAZQBjAG8AcgBkACAAbwBmACAAZQBhAGMAaAAgAEQAZQByAGkAdgBhAHQAaQB2AGUAIABXAG8AcgBrACAAWQBvAHUAIABkAGkAcwB0AHIAaQBiAHUAdABlACwAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAcwBwAGwAYQB5ACwAIABwAHUAYgBsAGkAYwBsAHkAIABwAGUAcgBmAG8AcgBtACwAIABvAHIAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAZwBpAHQAYQBsAGwAeQAgAHAAZQByAGYAbwByAG0ALgAgAFkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAG8AZgBmAGUAcgAgAG8AcgAgAGkAbQBwAG8AcwBlACAAYQBuAHkAIAB0AGUAcgBtAHMAIABvAG4AIAB0AGgAZQAgAEQAZQByAGkAdgBhAHQAaQB2AGUAIABXAG8AcgBrAHMAIAB0AGgAYQB0ACAAYQBsAHQAZQByACAAbwByACAAcgBlAHMAdAByAGkAYwB0ACAAdABoAGUAIAB0AGUAcgBtAHMAIABvAGYAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAG8AcgAgAHQAaABlACAAcgBlAGMAaQBwAGkAZQBuAHQAcwAnACAAZQB4AGUAcgBjAGkAcwBlACAAbwBmACAAdABoAGUAIAByAGkAZwBoAHQAcwAgAGcAcgBhAG4AdABlAGQAIABoAGUAcgBlAHUAbgBkAGUAcgAsACAAYQBuAGQAIABZAG8AdQAgAG0AdQBzAHQAIABrAGUAZQBwACAAaQBuAHQAYQBjAHQAIABhAGwAbAAgAG4AbwB0AGkAYwBlAHMAIAB0AGgAYQB0ACAAcgBlAGYAZQByACAAdABvACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAHQAbwAgAHQAaABlACAAZABpAHMAYwBsAGEAaQBtAGUAcgAgAG8AZgAgAHcAYQByAHIAYQBuAHQAaQBlAHMALgAgAFkAbwB1ACAAbQBhAHkAIABuAG8AdAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAHAAdQBiAGwAaQBjAGwAeQAgAGQAaQBzAHAAbABhAHkALAAgAHAAdQBiAGwAaQBjAGwAeQAgAHAAZQByAGYAbwByAG0ALAAgAG8AcgAgAHAAdQBiAGwAaQBjAGwAeQAgAGQAaQBnAGkAdABhAGwAbAB5ACAAcABlAHIAZgBvAHIAbQAgAHQAaABlACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsAIAB3AGkAdABoACAAYQBuAHkAIAB0AGUAYwBoAG4AbwBsAG8AZwBpAGMAYQBsACAAbQBlAGEAcwB1AHIAZQBzACAAdABoAGEAdAAgAGMAbwBuAHQAcgBvAGwAIABhAGMAYwBlAHMAcwAgAG8AcgAgAHUAcwBlACAAbwBmACAAdABoAGUAIABXAG8AcgBrACAAaQBuACAAYQAgAG0AYQBuAG4AZQByACAAaQBuAGMAbwBuAHMAaQBzAHQAZQBuAHQAIAB3AGkAdABoACAAdABoAGUAIAB0AGUAcgBtAHMAIABvAGYAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAgAEEAZwByAGUAZQBtAGUAbgB0AC4AIABUAGgAZQAgAGEAYgBvAHYAZQAgAGEAcABwAGwAaQBlAHMAIAB0AG8AIAB0AGgAZQAgAEQAZQByAGkAdgBhAHQAaQB2AGUAIABXAG8AcgBrACAAYQBzACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIABhACAAQwBvAGwAbABlAGMAdABpAHYAZQAgAFcAbwByAGsALAAgAGIAdQB0ACAAdABoAGkAcwAgAGQAbwBlAHMAIABuAG8AdAAgAHIAZQBxAHUAaQByAGUAIAB0AGgAZQAgAEMAbwBsAGwAZQBjAHQAaQB2AGUAIABXAG8AcgBrACAAYQBwAGEAcgB0ACAAZgByAG8AbQAgAHQAaABlACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsAIABpAHQAcwBlAGwAZgAgAHQAbwAgAGIAZQAgAG0AYQBkAGUAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIAB0AGUAcgBtAHMAIABvAGYAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAuAA0ACgAgACAAIAAzAC4AIABZAG8AdQAgAG0AYQB5ACAAbgBvAHQAIABlAHgAZQByAGMAaQBzAGUAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAcgBpAGcAaAB0AHMAIABnAHIAYQBuAHQAZQBkACAAdABvACAAWQBvAHUAIABpAG4AIABTAGUAYwB0AGkAbwBuACAAMwAgAGEAYgBvAHYAZQAgAGkAbgAgAGEAbgB5ACAAbQBhAG4AbgBlAHIAIAB0AGgAYQB0ACAAaQBzACAAcAByAGkAbQBhAHIAaQBsAHkAIABpAG4AdABlAG4AZABlAGQAIABmAG8AcgAgAG8AcgAgAGQAaQByAGUAYwB0AGUAZAAgAHQAbwB3AGEAcgBkACAAYwBvAG0AbQBlAHIAYwBpAGEAbAAgAGEAZAB2AGEAbgB0AGEAZwBlACAAbwByACAAcAByAGkAdgBhAHQAZQAgAG0AbwBuAGUAdABhAHIAeQAgAGMAbwBtAHAAZQBuAHMAYQB0AGkAbwBuAC4AIABUAGgAZQAgAGUAeABjAGgAYQBuAGcAZQAgAG8AZgAgAHQAaABlACAAVwBvAHIAawAgAGYAbwByACAAbwB0AGgAZQByACAAYwBvAHAAeQByAGkAZwBoAHQAZQBkACAAdwBvAHIAawBzACAAYgB5ACAAbQBlAGEAbgBzACAAbwBmACAAZABpAGcAaQB0AGEAbAAgAGYAaQBsAGUALQBzAGgAYQByAGkAbgBnACAAbwByACAAbwB0AGgAZQByAHcAaQBzAGUAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAGMAbwBuAHMAaQBkAGUAcgBlAGQAIAB0AG8AIABiAGUAIABpAG4AdABlAG4AZABlAGQAIABmAG8AcgAgAG8AcgAgAGQAaQByAGUAYwB0AGUAZAAgAHQAbwB3AGEAcgBkACAAYwBvAG0AbQBlAHIAYwBpAGEAbAAgAGEAZAB2AGEAbgB0AGEAZwBlACAAbwByACAAcAByAGkAdgBhAHQAZQAgAG0AbwBuAGUAdABhAHIAeQAgAGMAbwBtAHAAZQBuAHMAYQB0AGkAbwBuACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAZQByAGUAIABpAHMAIABuAG8AIABwAGEAeQBtAGUAbgB0ACAAbwBmACAAYQBuAHkAIABtAG8AbgBlAHQAYQByAHkAIABjAG8AbQBwAGUAbgBzAGEAdABpAG8AbgAgAGkAbgAgAGMAbwBuAG4AZQBjAHQAaQBvAG4AIAB3AGkAdABoACAAdABoAGUAIABlAHgAYwBoAGEAbgBnAGUAIABvAGYAIABjAG8AcAB5AHIAaQBnAGgAdABlAGQAIAB3AG8AcgBrAHMALgANAAoADQAKADUALgAgAFIAZQBwAHIAZQBzAGUAbgB0AGEAdABpAG8AbgBzACwAIABXAGEAcgByAGEAbgB0AGkAZQBzACAAYQBuAGQAIABEAGkAcwBjAGwAYQBpAG0AZQByAA0ACgANAAoAIAAgACAAMQAuACAAQgB5ACAAbwBmAGYAZQByAGkAbgBnACAAdABoAGUAIABXAG8AcgBrACAAZgBvAHIAIABwAHUAYgBsAGkAYwAgAHIAZQBsAGUAYQBzAGUAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAATABpAGMAZQBuAHMAZQAsACAATABpAGMAZQBuAHMAbwByACAAcgBlAHAAcgBlAHMAZQBuAHQAcwAgAGEAbgBkACAAdwBhAHIAcgBhAG4AdABzACAAdABoAGEAdAAsACAAdABvACAAdABoAGUAIABiAGUAcwB0ACAAbwBmACAATABpAGMAZQBuAHMAbwByACcAcwAgAGsAbgBvAHcAbABlAGQAZwBlACAAYQBmAHQAZQByACAAcgBlAGEAcwBvAG4AYQBiAGwAZQAgAGkAbgBxAHUAaQByAHkAOgANAAoAIAAgACAAIAAgACAAIAAgACAAMQAuACAATABpAGMAZQBuAHMAbwByACAAaABhAHMAIABzAGUAYwB1AHIAZQBkACAAYQBsAGwAIAByAGkAZwBoAHQAcwAgAGkAbgAgAHQAaABlACAAVwBvAHIAawAgAG4AZQBjAGUAcwBzAGEAcgB5ACAAdABvACAAZwByAGEAbgB0ACAAdABoAGUAIABsAGkAYwBlAG4AcwBlACAAcgBpAGcAaAB0AHMAIABoAGUAcgBlAHUAbgBkAGUAcgAgAGEAbgBkACAAdABvACAAcABlAHIAbQBpAHQAIAB0AGgAZQAgAGwAYQB3AGYAdQBsACAAZQB4AGUAcgBjAGkAcwBlACAAbwBmACAAdABoAGUAIAByAGkAZwBoAHQAcwAgAGcAcgBhAG4AdABlAGQAIABoAGUAcgBlAHUAbgBkAGUAcgAgAHcAaQB0AGgAbwB1AHQAIABZAG8AdQAgAGgAYQB2AGkAbgBnACAAYQBuAHkAIABvAGIAbABpAGcAYQB0AGkAbwBuACAAdABvACAAcABhAHkAIABhAG4AeQAgAHIAbwB5AGEAbAB0AGkAZQBzACwAIABjAG8AbQBwAHUAbABzAG8AcgB5ACAAbABpAGMAZQBuAHMAZQAgAGYAZQBlAHMALAAgAHIAZQBzAGkAZAB1AGEAbABzACAAbwByACAAYQBuAHkAIABvAHQAaABlAHIAIABwAGEAeQBtAGUAbgB0AHMAOwANAAoAIAAgACAAIAAgACAAIAAgACAAMgAuACAAVABoAGUAIABXAG8AcgBrACAAZABvAGUAcwAgAG4AbwB0ACAAaQBuAGYAcgBpAG4AZwBlACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAsACAAdAByAGEAZABlAG0AYQByAGsALAAgAHAAdQBiAGwAaQBjAGkAdAB5ACAAcgBpAGcAaAB0AHMALAAgAGMAbwBtAG0AbwBuACAAbABhAHcAIAByAGkAZwBoAHQAcwAgAG8AcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAcgBpAGcAaAB0ACAAbwBmACAAYQBuAHkAIAB0AGgAaQByAGQAIABwAGEAcgB0AHkAIABvAHIAIABjAG8AbgBzAHQAaQB0AHUAdABlACAAZABlAGYAYQBtAGEAdABpAG8AbgAsACAAaQBuAHYAYQBzAGkAbwBuACAAbwBmACAAcAByAGkAdgBhAGMAeQAgAG8AcgAgAG8AdABoAGUAcgAgAHQAbwByAHQAaQBvAHUAcwAgAGkAbgBqAHUAcgB5ACAAdABvACAAYQBuAHkAIAB0AGgAaQByAGQAIABwAGEAcgB0AHkALgANAAoAIAAgACAAMgAuACAARQBYAEMARQBQAFQAIABBAFMAIABFAFgAUABSAEUAUwBTAEwAWQAgAFMAVABBAFQARQBEACAASQBOACAAVABIAEkAUwAgAEwASQBDAEUATgBTAEUAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAgAEEARwBSAEUARQBEACAASQBOACAAVwBSAEkAVABJAE4ARwAgAE8AUgAgAFIARQBRAFUASQBSAEUARAAgAEIAWQAgAEEAUABQAEwASQBDAEEAQgBMAEUAIABMAEEAVwAsACAAVABIAEUAIABXAE8AUgBLACAASQBTACAATABJAEMARQBOAFMARQBEACAATwBOACAAQQBOACAAIgBBAFMAIABJAFMAIgAgAEIAQQBTAEkAUwAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABBAE4AWQAgAEsASQBOAEQALAAgAEUASQBUAEgARQBSACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQAIABJAE4AQwBMAFUARABJAE4ARwAsACAAVwBJAFQASABPAFUAVAAgAEwASQBNAEkAVABBAFQASQBPAE4ALAAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAFIARQBHAEEAUgBEAEkATgBHACAAVABIAEUAIABDAE8ATgBUAEUATgBUAFMAIABPAFIAIABBAEMAQwBVAFIAQQBDAFkAIABPAEYAIABUAEgARQAgAFcATwBSAEsALgANAAoADQAKADYALgAgAEwAaQBtAGkAdABhAHQAaQBvAG4AIABvAG4AIABMAGkAYQBiAGkAbABpAHQAeQAuACAARQBYAEMARQBQAFQAIABUAE8AIABUAEgARQAgAEUAWABUAEUATgBUACAAUgBFAFEAVQBJAFIARQBEACAAQgBZACAAQQBQAFAATABJAEMAQQBCAEwARQAgAEwAQQBXACwAIABBAE4ARAAgAEUAWABDAEUAUABUACAARgBPAFIAIABEAEEATQBBAEcARQBTACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0AIABMAEkAQQBCAEkATABJAFQAWQAgAFQATwAgAEEAIABUAEgASQBSAEQAIABQAEEAUgBUAFkAIABSAEUAUwBVAEwAVABJAE4ARwAgAEYAUgBPAE0AIABCAFIARQBBAEMASAAgAE8ARgAgAFQASABFACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAEkATgAgAFMARQBDAFQASQBPAE4AIAA1ACwAIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABXAEkATABMACAATABJAEMARQBOAFMATwBSACAAQgBFACAATABJAEEAQgBMAEUAIABUAE8AIABZAE8AVQAgAE8ATgAgAEEATgBZACAATABFAEcAQQBMACAAVABIAEUATwBSAFkAIABGAE8AUgAgAEEATgBZACAAUwBQAEUAQwBJAEEATAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAsACAAUABVAE4ASQBUAEkAVgBFACAATwBSACAARQBYAEUATQBQAEwAQQBSAFkAIABEAEEATQBBAEcARQBTACAAQQBSAEkAUwBJAE4ARwAgAE8AVQBUACAATwBGACAAVABIAEkAUwAgAEwASQBDAEUATgBTAEUAIABPAFIAIABUAEgARQAgAFUAUwBFACAATwBGACAAVABIAEUAIABXAE8AUgBLACwAIABFAFYARQBOACAASQBGACAATABJAEMARQBOAFMATwBSACAASABBAFMAIABCAEUARQBOACAAQQBEAFYASQBTAEUARAAgAE8ARgAgAFQASABFACAAUABPAFMAUwBJAEIASQBMAEkAVABZACAATwBGACAAUwBVAEMASAAgAEQAQQBNAEEARwBFAFMALgANAAoADQAKADcALgAgAFQAZQByAG0AaQBuAGEAdABpAG8AbgANAAoADQAKACAAIAAgADEALgAgAFQAaABpAHMAIABMAGkAYwBlAG4AcwBlACAAYQBuAGQAIAB0AGgAZQAgAHIAaQBnAGgAdABzACAAZwByAGEAbgB0AGUAZAAgAGgAZQByAGUAdQBuAGQAZQByACAAdwBpAGwAbAAgAHQAZQByAG0AaQBuAGEAdABlACAAYQB1AHQAbwBtAGEAdABpAGMAYQBsAGwAeQAgAHUAcABvAG4AIABhAG4AeQAgAGIAcgBlAGEAYwBoACAAYgB5ACAAWQBvAHUAIABvAGYAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlAC4AIABJAG4AZABpAHYAaQBkAHUAYQBsAHMAIABvAHIAIABlAG4AdABpAHQAaQBlAHMAIAB3AGgAbwAgAGgAYQB2AGUAIAByAGUAYwBlAGkAdgBlAGQAIABEAGUAcgBpAHYAYQB0AGkAdgBlACAAVwBvAHIAawBzACAAbwByACAAQwBvAGwAbABlAGMAdABpAHYAZQAgAFcAbwByAGsAcwAgAGYAcgBvAG0AIABZAG8AdQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACwAIABoAG8AdwBlAHYAZQByACwAIAB3AGkAbABsACAAbgBvAHQAIABoAGEAdgBlACAAdABoAGUAaQByACAAbABpAGMAZQBuAHMAZQBzACAAdABlAHIAbQBpAG4AYQB0AGUAZAAgAHAAcgBvAHYAaQBkAGUAZAAgAHMAdQBjAGgAIABpAG4AZABpAHYAaQBkAHUAYQBsAHMAIABvAHIAIABlAG4AdABpAHQAaQBlAHMAIAByAGUAbQBhAGkAbgAgAGkAbgAgAGYAdQBsAGwAIABjAG8AbQBwAGwAaQBhAG4AYwBlACAAdwBpAHQAaAAgAHQAaABvAHMAZQAgAGwAaQBjAGUAbgBzAGUAcwAuACAAUwBlAGMAdABpAG8AbgBzACAAMQAsACAAMgAsACAANQAsACAANgAsACAANwAsACAAYQBuAGQAIAA4ACAAdwBpAGwAbAAgAHMAdQByAHYAaQB2AGUAIABhAG4AeQAgAHQAZQByAG0AaQBuAGEAdABpAG8AbgAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlAC4ADQAKACAAIAAgADIALgAgAFMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAGEAYgBvAHYAZQAgAHQAZQByAG0AcwAgAGEAbgBkACAAYwBvAG4AZABpAHQAaQBvAG4AcwAsACAAdABoAGUAIABsAGkAYwBlAG4AcwBlACAAZwByAGEAbgB0AGUAZAAgAGgAZQByAGUAIABpAHMAIABwAGUAcgBwAGUAdAB1AGEAbAAgACgAZgBvAHIAIAB0AGgAZQAgAGQAdQByAGEAdABpAG8AbgAgAG8AZgAgAHQAaABlACAAYQBwAHAAbABpAGMAYQBiAGwAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAaQBuACAAdABoAGUAIABXAG8AcgBrACkALgAgAE4AbwB0AHcAaQB0AGgAcwB0AGEAbgBkAGkAbgBnACAAdABoAGUAIABhAGIAbwB2AGUALAAgAEwAaQBjAGUAbgBzAG8AcgAgAHIAZQBzAGUAcgB2AGUAcwAgAHQAaABlACAAcgBpAGcAaAB0ACAAdABvACAAcgBlAGwAZQBhAHMAZQAgAHQAaABlACAAVwBvAHIAawAgAHUAbgBkAGUAcgAgAGQAaQBmAGYAZQByAGUAbgB0ACAAbABpAGMAZQBuAHMAZQAgAHQAZQByAG0AcwAgAG8AcgAgAHQAbwAgAHMAdABvAHAAIABkAGkAcwB0AHIAaQBiAHUAdABpAG4AZwAgAHQAaABlACAAVwBvAHIAawAgAGEAdAAgAGEAbgB5ACAAdABpAG0AZQA7ACAAcAByAG8AdgBpAGQAZQBkACwAIABoAG8AdwBlAHYAZQByACAAdABoAGEAdAAgAGEAbgB5ACAAcwB1AGMAaAAgAGUAbABlAGMAdABpAG8AbgAgAHcAaQBsAGwAIABuAG8AdAAgAHMAZQByAHYAZQAgAHQAbwAgAHcAaQB0AGgAZAByAGEAdwAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACAAKABvAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUAIAB0AGgAYQB0ACAAaABhAHMAIABiAGUAZQBuACwAIABvAHIAIABpAHMAIAByAGUAcQB1AGkAcgBlAGQAIAB0AG8AIABiAGUALAAgAGcAcgBhAG4AdABlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACkALAAgAGEAbgBkACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUAIAB3AGkAbABsACAAYwBvAG4AdABpAG4AdQBlACAAaQBuACAAZgB1AGwAbAAgAGYAbwByAGMAZQAgAGEAbgBkACAAZQBmAGYAZQBjAHQAIAB1AG4AbABlAHMAcwAgAHQAZQByAG0AaQBuAGEAdABlAGQAIABhAHMAIABzAHQAYQB0AGUAZAAgAGEAYgBvAHYAZQAuAA0ACgANAAoAOAAuACAATQBpAHMAYwBlAGwAbABhAG4AZQBvAHUAcwANAAoADQAKACAAIAAgADEALgAgAEUAYQBjAGgAIAB0AGkAbQBlACAAWQBvAHUAIABkAGkAcwB0AHIAaQBiAHUAdABlACAAbwByACAAcAB1AGIAbABpAGMAbAB5ACAAZABpAGcAaQB0AGEAbABsAHkAIABwAGUAcgBmAG8AcgBtACAAdABoAGUAIABXAG8AcgBrACAAbwByACAAYQAgAEMAbwBsAGwAZQBjAHQAaQB2AGUAIABXAG8AcgBrACwAIAB0AGgAZQAgAEwAaQBjAGUAbgBzAG8AcgAgAG8AZgBmAGUAcgBzACAAdABvACAAdABoAGUAIAByAGUAYwBpAHAAaQBlAG4AdAAgAGEAIABsAGkAYwBlAG4AcwBlACAAdABvACAAdABoAGUAIABXAG8AcgBrACAAbwBuACAAdABoAGUAIABzAGEAbQBlACAAdABlAHIAbQBzACAAYQBuAGQAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlACAAZwByAGEAbgB0AGUAZAAgAHQAbwAgAFkAbwB1ACAAdQBuAGQAZQByACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUALgANAAoAIAAgACAAMgAuACAARQBhAGMAaAAgAHQAaQBtAGUAIABZAG8AdQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIABvAHIAIABwAHUAYgBsAGkAYwBsAHkAIABkAGkAZwBpAHQAYQBsAGwAeQAgAHAAZQByAGYAbwByAG0AIABhACAARABlAHIAaQB2AGEAdABpAHYAZQAgAFcAbwByAGsALAAgAEwAaQBjAGUAbgBzAG8AcgAgAG8AZgBmAGUAcgBzACAAdABvACAAdABoAGUAIAByAGUAYwBpAHAAaQBlAG4AdAAgAGEAIABsAGkAYwBlAG4AcwBlACAAdABvACAAdABoAGUAIABvAHIAaQBnAGkAbgBhAGwAIABXAG8AcgBrACAAbwBuACAAdABoAGUAIABzAGEAbQBlACAAdABlAHIAbQBzACAAYQBuAGQAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlACAAZwByAGEAbgB0AGUAZAAgAHQAbwAgAFkAbwB1ACAAdQBuAGQAZQByACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUALgANAAoAIAAgACAAMwAuACAASQBmACAAYQBuAHkAIABwAHIAbwB2AGkAcwBpAG8AbgAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACAAaQBzACAAaQBuAHYAYQBsAGkAZAAgAG8AcgAgAHUAbgBlAG4AZgBvAHIAYwBlAGEAYgBsAGUAIAB1AG4AZABlAHIAIABhAHAAcABsAGkAYwBhAGIAbABlACAAbABhAHcALAAgAGkAdAAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYQBmAGYAZQBjAHQAIAB0AGgAZQAgAHYAYQBsAGkAZABpAHQAeQAgAG8AcgAgAGUAbgBmAG8AcgBjAGUAYQBiAGkAbABpAHQAeQAgAG8AZgAgAHQAaABlACAAcgBlAG0AYQBpAG4AZABlAHIAIABvAGYAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAHQAaABpAHMAIABMAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAHcAaQB0AGgAbwB1AHQAIABmAHUAcgB0AGgAZQByACAAYQBjAHQAaQBvAG4AIABiAHkAIAB0AGgAZQAgAHAAYQByAHQAaQBlAHMAIAB0AG8AIAB0AGgAaQBzACAAYQBnAHIAZQBlAG0AZQBuAHQALAAgAHMAdQBjAGgAIABwAHIAbwB2AGkAcwBpAG8AbgAgAHMAaABhAGwAbAAgAGIAZQAgAHIAZQBmAG8AcgBtAGUAZAAgAHQAbwAgAHQAaABlACAAbQBpAG4AaQBtAHUAbQAgAGUAeAB0AGUAbgB0ACAAbgBlAGMAZQBzAHMAYQByAHkAIAB0AG8AIABtAGEAawBlACAAcwB1AGMAaAAgAHAAcgBvAHYAaQBzAGkAbwBuACAAdgBhAGwAaQBkACAAYQBuAGQAIABlAG4AZgBvAHIAYwBlAGEAYgBsAGUALgANAAoAIAAgACAANAAuACAATgBvACAAdABlAHIAbQAgAG8AcgAgAHAAcgBvAHYAaQBzAGkAbwBuACAAbwBmACAAdABoAGkAcwAgAEwAaQBjAGUAbgBzAGUAIABzAGgAYQBsAGwAIABiAGUAIABkAGUAZQBtAGUAZAAgAHcAYQBpAHYAZQBkACAAYQBuAGQAIABuAG8AIABiAHIAZQBhAGMAaAAgAGMAbwBuAHMAZQBuAHQAZQBkACAAdABvACAAdQBuAGwAZQBzAHMAIABzAHUAYwBoACAAdwBhAGkAdgBlAHIAIABvAHIAIABjAG8AbgBzAGUAbgB0ACAAcwBoAGEAbABsACAAYgBlACAAaQBuACAAdwByAGkAdABpAG4AZwAgAGEAbgBkACAAcwBpAGcAbgBlAGQAIABiAHkAIAB0AGgAZQAgAHAAYQByAHQAeQAgAHQAbwAgAGIAZQAgAGMAaABhAHIAZwBlAGQAIAB3AGkAdABoACAAcwB1AGMAaAAgAHcAYQBpAHYAZQByACAAbwByACAAYwBvAG4AcwBlAG4AdAAuAA0ACgAgACAAIAA1AC4AIABUAGgAaQBzACAATABpAGMAZQBuAHMAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAHQAaABlACAAZQBuAHQAaQByAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGIAZQB0AHcAZQBlAG4AIAB0AGgAZQAgAHAAYQByAHQAaQBlAHMAIAB3AGkAdABoACAAcgBlAHMAcABlAGMAdAAgAHQAbwAgAHQAaABlACAAVwBvAHIAawAgAGwAaQBjAGUAbgBzAGUAZAAgAGgAZQByAGUALgAgAFQAaABlAHIAZQAgAGEAcgBlACAAbgBvACAAdQBuAGQAZQByAHMAdABhAG4AZABpAG4AZwBzACwAIABhAGcAcgBlAGUAbQBlAG4AdABzACAAbwByACAAcgBlAHAAcgBlAHMAZQBuAHQAYQB0AGkAbwBuAHMAIAB3AGkAdABoACAAcgBlAHMAcABlAGMAdAAgAHQAbwAgAHQAaABlACAAVwBvAHIAawAgAG4AbwB0ACAAcwBwAGUAYwBpAGYAaQBlAGQAIABoAGUAcgBlAC4AIABMAGkAYwBlAG4AcwBvAHIAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAGIAbwB1AG4AZAAgAGIAeQAgAGEAbgB5ACAAYQBkAGQAaQB0AGkAbwBuAGEAbAAgAHAAcgBvAHYAaQBzAGkAbwBuAHMAIAB0AGgAYQB0ACAAbQBhAHkAIABhAHAAcABlAGEAcgAgAGkAbgAgAGEAbgB5ACAAYwBvAG0AbQB1AG4AaQBjAGEAdABpAG8AbgAgAGYAcgBvAG0AIABZAG8AdQAuACAAVABoAGkAcwAgAEwAaQBjAGUAbgBzAGUAIABtAGEAeQAgAG4AbwB0ACAAYgBlACAAbQBvAGQAaQBmAGkAZQBkACAAdwBpAHQAaABvAHUAdAAgAHQAaABlACAAbQB1AHQAdQBhAGwAIAB3AHIAaQB0AHQAZQBuACAAYQBnAHIAZQBlAG0AZQBuAHQAIABvAGYAIAB0AGgAZQAgAEwAaQBjAGUAbgBzAG8AcgAgAGEAbgBkACAAWQBvAHUALgBoAHQAdABwADoALwAvAGMAcgBlAGEAdABpAHYAZQBjAG8AbQBtAG8AbgBzAC4AbwByAGcALwBsAGkAYwBlAG4AcwBlAHMALwBuAGMALQBzAGEALwAxAC4AMAAvAAIAAAAAAAD/6QAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAuQAAAAMABgAHAAgACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AIgAjAD4APwBAAEEAQgBGAEcASABJAEoASwBMAE4ATwBQAFEAUgBWAFcAWABaAFsAXABdAGEAqwDYALYAtAC1AIcAsgCzANkAjACsAKMAhACFAL0AhgCOAIsAigECAI0BAwDeAKIABAAFAEUAVQC3AAkAsQAgAL4AvwCpAKoAiACkAMQAxQCmAB8AxgAhAF4AYACdAFQAUwBNALsAlgCJALAAkABfAK0AyQDHAK4AYgBjAGoAaQBrAG0AbABuAKAAZABvAMsAZQDIAMoAcQBwAHIAcwDPAMwAzQDOAHUAdAB2AHcA0wDQANEArwBnAJEAegB5AHsAfQB8AKEA1gDUANUAaAB/AH4AgACBALoAZgB4AEQAWQEEAAIBBQEGAOgA8QDyAPMBBwDnAOYA9QD0APYA6wDsAOQA5QDqAO4GbWFjcm9uDnBlcmlvZGNlbnRlcmVkBS5udWxsBGEuMDEEdi4wMgRFdXJvAAAAAAH//wADAAAAAQABAQEBAQAMAPgI/wAIAAf//QAJAAj//QAKAAj//QALAAn//AAMAAr//AANAAv//AAOAAz/+wAPAAz/+wAQAA3/+wARAA7/+wASAA//+gATABD/+gAUABD/+gAVABH/+QAWABL/+QAXABP/+QAYABT/+QAZABT/+AAaABX/+AAbABb/+AAcABf/9wAdABj/9wAeABj/9wAfABn/9gAgABr/9gAhABv/9gAiABz/9gAjABz/9QAkAB3/9QAlAB7/9QAmAB//9AAnACD/9AAoACD/9AApACH/9AAqACL/8wArACP/8wAsACT/8wAtACT/8gAuACX/8gAvACb/8gAwACf/8gAxACj/8QAyACj/8QAzACn/8QA0ACr/8AA1ACv/8AA2ACz/8AA3ACz/7wA4AC3/7wA5AC7/7wA6AC//7wA7ADD/7gA8ADD/7gA9ADH/7gA+ADL/7QA/ADP/7QBAADT/7QBBADT/7QBCADX/7ABDADb/7ABEADf/7ABFADj/6wBGADj/6wBHADn/6wBIADr/6wBJADv/6gBKADz/6gBLADz/6gBMAD3/6QBNAD7/6QBOAD//6QBPAED/6QBQAED/6ABRAEH/6ABSAEL/6ABTAEP/5wBUAET/5wBVAET/5wBWAEX/5gBXAEb/5gBYAEf/5gBZAEj/5gBaAEj/5QBbAEn/5QBcAEr/5QBdAEv/5ABeAEz/5ABfAEz/5ABgAE3/5ABhAE7/4wBiAE//4wBjAFD/4wBkAFD/4gBlAFH/4gBmAFL/4gBnAFP/4gBoAFT/4QBpAFT/4QBqAFX/4QBrAFb/4ABsAFf/4ABtAFj/4ABuAFj/3wBvAFn/3wBwAFr/3wBxAFv/3wByAFz/3gBzAFz/3gB0AF3/3gB1AF7/3QB2AF//3QB3AGD/3QB4AGD/3QB5AGH/3AB6AGL/3AB7AGP/3AB8AGT/2wB9AGT/2wB+AGX/2wB/AGb/2wCAAGf/2gCBAGj/2gCCAGj/2gCDAGn/2QCEAGr/2QCFAGv/2QCGAGz/2QCHAGz/2ACIAG3/2ACJAG7/2ACKAG//1wCLAHD/1wCMAHD/1wCNAHH/1gCOAHL/1gCPAHP/1gCQAHT/1gCRAHT/1QCSAHX/1QCTAHb/1QCUAHf/1ACVAHj/1ACWAHj/1ACXAHn/1ACYAHr/0wCZAHv/0wCaAHz/0wCbAHz/0gCcAH3/0gCdAH7/0gCeAH//0gCfAID/0QCgAID/0QChAIH/0QCiAIL/0ACjAIP/0ACkAIT/0AClAIT/zwCmAIX/zwCnAIb/zwCoAIf/zwCpAIj/zgCqAIj/zgCrAIn/zgCsAIr/zQCtAIv/zQCuAIz/zQCvAIz/zQCwAI3/zACxAI7/zACyAI//zACzAJD/ywC0AJD/ywC1AJH/ywC2AJL/ywC3AJP/ygC4AJT/ygC5AJT/ygC6AJX/yQC7AJb/yQC8AJf/yQC9AJj/yQC+AJj/yAC/AJn/yADAAJr/yADBAJv/xwDCAJz/xwDDAJz/xwDEAJ3/xgDFAJ7/xgDGAJ//xgDHAKD/xgDIAKD/xQDJAKH/xQDKAKL/xQDLAKP/xADMAKT/xADNAKT/xADOAKX/xADPAKb/wwDQAKf/wwDRAKj/wwDSAKj/wgDTAKn/wgDUAKr/wgDVAKv/wgDWAKz/wQDXAKz/wQDYAK3/wQDZAK7/wADaAK//wADbALD/wADcALD/vwDdALH/vwDeALL/vwDfALP/vwDgALT/vgDhALT/vgDiALX/vgDjALb/vQDkALf/vQDlALj/vQDmALj/vQDnALn/vADoALr/vADpALv/vADqALz/uwDrALz/uwDsAL3/uwDtAL7/uwDuAL//ugDvAMD/ugDwAMD/ugDxAMH/uQDyAML/uQDzAMP/uQD0AMT/uAD1AMT/uAD2AMX/uAD3AMb/uAD4AMf/twD5AMj/twD6AMj/twD7AMn/tgD8AMr/tgD9AMv/tgD+AMz/tgD/AMz/tQ==";
2646
+
2647
+ // src/components/WandyHand.tsx
2648
+ import { jsx as jsx10 } from "react/jsx-runtime";
2649
+ function dist(a, b) {
2650
+ const dx = a.x - b.x;
2651
+ const dy = a.y - b.y;
2652
+ return Math.hypot(dx, dy);
2653
+ }
2654
+ function polylineLength(points) {
2655
+ let L = 0;
2656
+ for (let i = 1; i < points.length; i++) L += dist(points[i - 1], points[i]);
2657
+ return L;
2658
+ }
2659
+ function lerp(a, b, t) {
2660
+ return a + (b - a) * t;
2661
+ }
2662
+ function mulberry32(seed) {
2663
+ let t = seed >>> 0;
2664
+ return function() {
2665
+ t += 1831565813;
2666
+ let r = Math.imul(t ^ t >>> 15, t | 1);
2667
+ r ^= r + Math.imul(r ^ r >>> 7, r | 61);
2668
+ return ((r ^ r >>> 14) >>> 0) / 4294967296;
2669
+ };
2670
+ }
2671
+ function hashStringToSeed(str) {
2672
+ let h = 1779033703 ^ str.length;
2673
+ for (let i = 0; i < str.length; i++) {
2674
+ h = Math.imul(h ^ str.charCodeAt(i), 3432918353);
2675
+ h = h << 13 | h >>> 19;
2676
+ }
2677
+ return h >>> 0;
2678
+ }
2679
+ function randomBetween(rng, min, max) {
2680
+ return min + (max - min) * rng();
2681
+ }
2682
+ function randomOffset(rng, magnitude) {
2683
+ return {
2684
+ x: randomBetween(rng, -magnitude, magnitude),
2685
+ y: randomBetween(rng, -magnitude, magnitude)
2686
+ };
2687
+ }
2688
+ function easeInOut(t) {
2689
+ if (t <= 0) return 0;
2690
+ if (t >= 1) return 1;
2691
+ return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;
2692
+ }
2693
+ function sampleCubic(p0, p1, p2, p3, steps) {
2694
+ const pts = [];
2695
+ for (let i = 0; i <= steps; i++) {
2696
+ const t = i / steps;
2697
+ const mt = 1 - t;
2698
+ const x = mt * mt * mt * p0.x + 3 * mt * mt * t * p1.x + 3 * mt * t * t * p2.x + t * t * t * p3.x;
2699
+ const y = mt * mt * mt * p0.y + 3 * mt * mt * t * p1.y + 3 * mt * t * t * p2.y + t * t * t * p3.y;
2700
+ pts.push({ x, y });
2701
+ }
2702
+ return pts;
2703
+ }
2704
+ function sampleQuadratic(p0, p1, p2, steps) {
2705
+ const pts = [];
2706
+ for (let i = 0; i <= steps; i++) {
2707
+ const t = i / steps;
2708
+ const mt = 1 - t;
2709
+ const x = mt * mt * p0.x + 2 * mt * t * p1.x + t * t * p2.x;
2710
+ const y = mt * mt * p0.y + 2 * mt * t * p1.y + t * t * p2.y;
2711
+ pts.push({ x, y });
2712
+ }
2713
+ return pts;
2714
+ }
2715
+ function pathToPolylines(commands, samplesPerCurve = 16) {
2716
+ const polylines = [];
2717
+ let current = [];
2718
+ let pen = { x: 0, y: 0 };
2719
+ let start = { x: 0, y: 0 };
2720
+ const pushCurrent = () => {
2721
+ if (current.length > 1) polylines.push(current);
2722
+ current = [];
2723
+ };
2724
+ for (const cmd of commands) {
2725
+ if (cmd.type === "M") {
2726
+ pushCurrent();
2727
+ pen = { x: cmd.x, y: cmd.y };
2728
+ start = { ...pen };
2729
+ current.push({ ...pen });
2730
+ } else if (cmd.type === "L") {
2731
+ pen = { x: cmd.x, y: cmd.y };
2732
+ current.push({ ...pen });
2733
+ } else if (cmd.type === "C") {
2734
+ const p0 = pen;
2735
+ const p1 = { x: cmd.x1, y: cmd.y1 };
2736
+ const p2 = { x: cmd.x2, y: cmd.y2 };
2737
+ const p3 = { x: cmd.x, y: cmd.y };
2738
+ const pts = sampleCubic(p0, p1, p2, p3, samplesPerCurve);
2739
+ current.push(...pts.slice(1));
2740
+ pen = p3;
2741
+ } else if (cmd.type === "Q") {
2742
+ const p0 = pen;
2743
+ const p1 = { x: cmd.x1, y: cmd.y1 };
2744
+ const p2 = { x: cmd.x, y: cmd.y };
2745
+ const pts = sampleQuadratic(p0, p1, p2, samplesPerCurve);
2746
+ current.push(...pts.slice(1));
2747
+ pen = p2;
2748
+ } else if (cmd.type === "Z") {
2749
+ current.push({ ...start });
2750
+ pushCurrent();
2751
+ }
2752
+ }
2753
+ pushCurrent();
2754
+ return polylines;
2755
+ }
2756
+ function polygonSignedArea(points) {
2757
+ let area = 0;
2758
+ for (let i = 0; i < points.length; i++) {
2759
+ const a = points[i];
2760
+ const b = points[(i + 1) % points.length];
2761
+ area += a.x * b.y - b.x * a.y;
2762
+ }
2763
+ return area / 2;
2764
+ }
2765
+ function polylineBounds(points) {
2766
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
2767
+ for (const p of points) {
2768
+ minX = Math.min(minX, p.x);
2769
+ minY = Math.min(minY, p.y);
2770
+ maxX = Math.max(maxX, p.x);
2771
+ maxY = Math.max(maxY, p.y);
2772
+ }
2773
+ if (!points.length) return { minX: 0, minY: 0, maxX: 0, maxY: 0 };
2774
+ return { minX, minY, maxX, maxY };
2775
+ }
2776
+ function getEndDirection(points) {
2777
+ for (let i = points.length - 1; i > 0; i--) {
2778
+ const curr = points[i];
2779
+ const prev = points[i - 1];
2780
+ const dx = curr.x - prev.x;
2781
+ const dy = curr.y - prev.y;
2782
+ const mag = Math.hypot(dx, dy);
2783
+ if (mag > 0) return { x: dx / mag, y: dy / mag };
2784
+ }
2785
+ return { x: 1, y: 0 };
2786
+ }
2787
+ function drawPolylineStamped(ctx, pts, visibleLen, totalLen, strokeWidth, strokeColor, baselineOffset, offsets, poolingStrength) {
2788
+ if (pts.length < 2 || visibleLen <= 0 || totalLen <= 0) return;
2789
+ const maxDistance = Math.min(visibleLen, totalLen);
2790
+ if (maxDistance <= 0) return;
2791
+ const spacing = Math.max(0.5, strokeWidth * 0.3);
2792
+ let nextStamp = 0;
2793
+ let segmentIndex = 1;
2794
+ let segmentStartLen = 0;
2795
+ let segmentLength = dist(pts[0], pts[1]);
2796
+ const lastIndex = pts.length - 1;
2797
+ const advanceSegment = () => {
2798
+ while (segmentLength === 0 && segmentIndex < lastIndex) {
2799
+ segmentIndex++;
2800
+ segmentLength = dist(pts[segmentIndex - 1], pts[segmentIndex]);
2801
+ }
2802
+ };
2803
+ advanceSegment();
2804
+ const stampAt = (distance) => {
2805
+ const targetDistance = Math.min(distance, maxDistance);
2806
+ while (segmentIndex < pts.length && targetDistance > segmentStartLen + segmentLength && segmentIndex < lastIndex) {
2807
+ segmentStartLen += segmentLength;
2808
+ segmentIndex++;
2809
+ segmentLength = dist(pts[segmentIndex - 1], pts[segmentIndex]);
2810
+ advanceSegment();
2811
+ }
2812
+ const clampedSegmentLen = segmentLength || 1;
2813
+ const segmentDistance = Math.max(0, targetDistance - segmentStartLen);
2814
+ const t = segmentLength === 0 ? 0 : segmentDistance / clampedSegmentLen;
2815
+ const a = pts[segmentIndex - 1];
2816
+ const b = pts[segmentIndex];
2817
+ const point = {
2818
+ x: lerp(a.x, b.x, t),
2819
+ y: lerp(a.y, b.y, t)
2820
+ };
2821
+ const localProgress = maxDistance > 0 ? Math.min(1, targetDistance / maxDistance) : 1;
2822
+ const delta = localProgress < 0.5 ? {
2823
+ x: lerp(offsets.start.x, offsets.mid.x, localProgress * 2),
2824
+ y: lerp(offsets.start.y, offsets.mid.y, localProgress * 2)
2825
+ } : {
2826
+ x: lerp(offsets.mid.x, offsets.end.x, (localProgress - 0.5) * 2),
2827
+ y: lerp(offsets.mid.y, offsets.end.y, (localProgress - 0.5) * 2)
2828
+ };
2829
+ point.x += baselineOffset.x + delta.x;
2830
+ point.y += baselineOffset.y + delta.y;
2831
+ const pressure = Math.max(0, Math.sin(Math.PI * localProgress));
2832
+ const poolingFactor = localProgress >= 0.7 ? Math.pow((localProgress - 0.7) / 0.3, 1.1) : 0;
2833
+ const radius = Math.max(
2834
+ 0.1,
2835
+ strokeWidth * (0.35 + 0.65 * pressure) * (1 + poolingStrength * poolingFactor)
2836
+ );
2837
+ ctx.moveTo(point.x + radius, point.y);
2838
+ ctx.arc(point.x, point.y, radius, 0, Math.PI * 2);
2839
+ };
2840
+ ctx.save();
2841
+ ctx.fillStyle = strokeColor;
2842
+ ctx.beginPath();
2843
+ while (nextStamp <= maxDistance) {
2844
+ stampAt(nextStamp);
2845
+ nextStamp += spacing;
2846
+ }
2847
+ if (nextStamp - spacing < maxDistance) {
2848
+ stampAt(maxDistance);
2849
+ }
2850
+ ctx.fill();
2851
+ ctx.restore();
2852
+ }
2853
+ function drawOvershootTail(ctx, basePoint, direction, overshootPx, strokeWidth, strokeColor) {
2854
+ if (overshootPx <= 0) return;
2855
+ const dirMag = Math.hypot(direction.x, direction.y) || 1;
2856
+ const dir = { x: direction.x / dirMag, y: direction.y / dirMag };
2857
+ const spacing = Math.max(1, strokeWidth * 0.4);
2858
+ ctx.save();
2859
+ ctx.fillStyle = strokeColor;
2860
+ ctx.beginPath();
2861
+ for (let traveled = 0; traveled <= overshootPx; traveled += spacing) {
2862
+ const progress = Math.min(1, traveled / Math.max(overshootPx, 1e-4));
2863
+ const radius = Math.max(0.1, strokeWidth * (0.25 + 0.35 * (1 - progress)));
2864
+ const x = basePoint.x + dir.x * traveled;
2865
+ const y = basePoint.y + dir.y * traveled;
2866
+ ctx.moveTo(x + radius, y);
2867
+ ctx.arc(x, y, radius, 0, Math.PI * 2);
2868
+ }
2869
+ ctx.fill();
2870
+ ctx.restore();
2871
+ }
2872
+ function createFlourishPath(endPoint, direction, rng) {
2873
+ const dirMag = Math.hypot(direction.x, direction.y);
2874
+ if (!dirMag) return null;
2875
+ const dir = { x: direction.x / dirMag, y: direction.y / dirMag };
2876
+ const normal = { x: -dir.y, y: dir.x };
2877
+ const flourishLen = randomBetween(rng, 6, 14);
2878
+ const curl = randomBetween(rng, -0.6, 0.6);
2879
+ const control = {
2880
+ x: endPoint.x + dir.x * (flourishLen * 0.5) + normal.x * flourishLen * 0.3 * curl,
2881
+ y: endPoint.y + dir.y * (flourishLen * 0.5) + normal.y * flourishLen * 0.3 * curl
2882
+ };
2883
+ const finalPoint = {
2884
+ x: endPoint.x + dir.x * flourishLen + normal.x * flourishLen * 0.15 * curl,
2885
+ y: endPoint.y + dir.y * flourishLen + normal.y * flourishLen * 0.15 * curl
2886
+ };
2887
+ const flourishPoints = sampleQuadratic(endPoint, control, finalPoint, 12);
2888
+ const length = polylineLength(flourishPoints);
2889
+ if (length <= 0) return null;
2890
+ return { points: flourishPoints, length };
2891
+ }
2892
+ var ZERO_OFFSETS = {
2893
+ start: { x: 0, y: 0 },
2894
+ mid: { x: 0, y: 0 },
2895
+ end: { x: 0, y: 0 }
2896
+ };
2897
+ function resolveCurveSamples(controlValue) {
2898
+ return Math.max(2, Math.round(controlValue * controlValue * 0.75));
2899
+ }
2900
+ function computeBounds(polylines) {
2901
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
2902
+ for (const line of polylines) {
2903
+ for (const p of line) {
2904
+ minX = Math.min(minX, p.x);
2905
+ minY = Math.min(minY, p.y);
2906
+ maxX = Math.max(maxX, p.x);
2907
+ maxY = Math.max(maxY, p.y);
2908
+ }
2909
+ }
2910
+ if (minX === Infinity || minY === Infinity || maxX === -Infinity || maxY === -Infinity) {
2911
+ return { minX: 0, minY: 0, maxX: 0, maxY: 0 };
2912
+ }
2913
+ return { minX, minY, maxX, maxY };
2914
+ }
2915
+ function prepareText(font, text, fontSize, samplesPerCurve) {
2916
+ const glyphs = font.stringToGlyphs(text);
2917
+ const characters = Array.from(text);
2918
+ const contours = [];
2919
+ let totalLen = 0;
2920
+ let penX = 0;
2921
+ const scale = fontSize / font.unitsPerEm;
2922
+ let currentWordIndex = 0;
2923
+ let hasGlyphInCurrentWord = false;
2924
+ const lengthThreshold = Math.max(fontSize * 0.65, 20);
2925
+ const areaThreshold = Math.max(fontSize * fontSize * 0.02, 40);
2926
+ const punctuationRegex = /[!?,.;:'"()]/;
2927
+ for (let i = 0; i < glyphs.length; i++) {
2928
+ const glyph = glyphs[i];
2929
+ const char = characters[i] ?? "";
2930
+ const isWhitespaceChar = /\s/.test(char);
2931
+ const isPunctuationGlyph = punctuationRegex.test(char);
2932
+ if (isWhitespaceChar) {
2933
+ if (hasGlyphInCurrentWord) {
2934
+ currentWordIndex++;
2935
+ hasGlyphInCurrentWord = false;
2936
+ }
2937
+ const advanceWidth2 = glyph.advanceWidth && glyph.advanceWidth > 0 ? glyph.advanceWidth : font.unitsPerEm;
2938
+ penX += advanceWidth2 * scale;
2939
+ continue;
2940
+ }
2941
+ hasGlyphInCurrentWord = true;
2942
+ const commands = glyph.getPath(penX, 0, fontSize).commands;
2943
+ const glyphLines = pathToPolylines(commands, samplesPerCurve);
2944
+ for (let contourIndex = 0; contourIndex < glyphLines.length; contourIndex++) {
2945
+ const pl = glyphLines[contourIndex];
2946
+ if (pl.length < 2) continue;
2947
+ const length = polylineLength(pl);
2948
+ if (length <= 0) continue;
2949
+ const bounds2 = polylineBounds(pl);
2950
+ const boundsArea = (bounds2.maxX - bounds2.minX) * (bounds2.maxY - bounds2.minY);
2951
+ const signedArea = polygonSignedArea(pl);
2952
+ const isHole = signedArea < 0;
2953
+ const isSecondary = isPunctuationGlyph || length < lengthThreshold || boundsArea < areaThreshold;
2954
+ contours.push({
2955
+ id: `word${currentWordIndex}-glyph${i}-contour${contourIndex}`,
2956
+ points: pl,
2957
+ length,
2958
+ bounds: bounds2,
2959
+ boundsArea,
2960
+ glyphIndex: i,
2961
+ wordIndex: currentWordIndex,
2962
+ signedArea,
2963
+ isHole,
2964
+ isSecondary,
2965
+ isPunctuation: isPunctuationGlyph
2966
+ });
2967
+ totalLen += length;
2968
+ }
2969
+ const advanceWidth = glyph.advanceWidth && glyph.advanceWidth > 0 ? glyph.advanceWidth : font.unitsPerEm;
2970
+ penX += advanceWidth * scale;
2971
+ if (i < glyphs.length - 1) {
2972
+ const kern = font.getKerningValue(glyph, glyphs[i + 1]);
2973
+ penX += kern * scale;
2974
+ }
2975
+ }
2976
+ const polylines = contours.map((c) => c.points);
2977
+ const bounds = computeBounds(polylines);
2978
+ return { contours, polylines, totalLen, bounds };
2979
+ }
2980
+ function createStrokePlan(contours, totalLen, durationMs, text, imperfectionsEnabled) {
2981
+ if (!contours.length || totalLen <= 0) {
2982
+ return { strokes: [], totalMs: 0 };
2983
+ }
2984
+ const seed = hashStringToSeed(text);
2985
+ const rng = mulberry32(seed || 1);
2986
+ const effectiveDuration = durationMs > 0 ? durationMs : Math.max(totalLen, 1);
2987
+ const baseSpeed = totalLen / Math.max(effectiveDuration, 1);
2988
+ const wordGroups = /* @__PURE__ */ new Map();
2989
+ for (const contour of contours) {
2990
+ const existing = wordGroups.get(contour.wordIndex) ?? {
2991
+ primaries: [],
2992
+ secondaries: [],
2993
+ baselineDrift: { x: 0, y: 0 }
2994
+ };
2995
+ if (!wordGroups.has(contour.wordIndex)) {
2996
+ existing.baselineDrift = imperfectionsEnabled ? {
2997
+ x: randomBetween(rng, -1, 1),
2998
+ y: randomBetween(rng, -1, 1)
2999
+ } : { x: 0, y: 0 };
3000
+ }
3001
+ if (contour.isSecondary) existing.secondaries.push(contour);
3002
+ else existing.primaries.push(contour);
3003
+ wordGroups.set(contour.wordIndex, existing);
3004
+ }
3005
+ const sortContours = (items) => items.sort((a, b) => {
3006
+ if (a.glyphIndex !== b.glyphIndex) {
3007
+ return a.glyphIndex - b.glyphIndex;
3008
+ }
3009
+ if (a.isHole !== b.isHole) {
3010
+ return Number(a.isHole) - Number(b.isHole);
3011
+ }
3012
+ return b.boundsArea - a.boundsArea;
3013
+ });
3014
+ const wordIndices = Array.from(wordGroups.keys()).sort((a, b) => a - b);
3015
+ const strokes = [];
3016
+ let cursor = 0;
3017
+ let lastWordIndex = null;
3018
+ const scheduleContour = (contour, kind, baselineDrift, isLastInWord) => {
3019
+ const length = contour.length;
3020
+ const durationMultiplier = lerp(0.8, 1.2, rng());
3021
+ const baseDuration = baseSpeed > 0 ? length / baseSpeed : length / Math.max(totalLen, 1);
3022
+ const durationMsForStroke = Math.max(baseDuration * durationMultiplier, 24);
3023
+ const isNewWord = lastWordIndex === null || contour.wordIndex !== lastWordIndex;
3024
+ let pauseBeforeMs = 0;
3025
+ if (strokes.length > 0) {
3026
+ if (isNewWord) {
3027
+ pauseBeforeMs = randomBetween(rng, 120, 250);
3028
+ } else if (contour.isPunctuation) {
3029
+ pauseBeforeMs = randomBetween(rng, 60, 140);
3030
+ } else {
3031
+ pauseBeforeMs = randomBetween(rng, 10, 60);
3032
+ if (kind === "secondary") {
3033
+ pauseBeforeMs += randomBetween(rng, 40, 110);
3034
+ }
3035
+ }
3036
+ }
3037
+ cursor += pauseBeforeMs;
3038
+ const startMs = cursor;
3039
+ cursor += durationMsForStroke;
3040
+ const offsets = imperfectionsEnabled ? {
3041
+ start: randomOffset(rng, 0.8),
3042
+ mid: randomOffset(rng, 0.6),
3043
+ end: randomOffset(rng, 0.8)
3044
+ } : ZERO_OFFSETS;
3045
+ const poolingStrength = imperfectionsEnabled ? randomBetween(rng, 0.05, 0.32) : 0;
3046
+ const overshootPx = imperfectionsEnabled ? kind === "secondary" ? randomBetween(rng, 1.5, 4) : randomBetween(rng, 2, 6) : 0;
3047
+ const endDirection = getEndDirection(contour.points);
3048
+ let flourish;
3049
+ if (imperfectionsEnabled && isLastInWord && kind === "main" && rng() < 0.35) {
3050
+ const flourishPath = createFlourishPath(
3051
+ contour.points[contour.points.length - 1],
3052
+ endDirection,
3053
+ rng
3054
+ );
3055
+ if (flourishPath) {
3056
+ flourish = flourishPath;
3057
+ }
3058
+ }
3059
+ strokes.push({
3060
+ id: contour.id,
3061
+ points: contour.points,
3062
+ length,
3063
+ startMs,
3064
+ durationMs: durationMsForStroke,
3065
+ pauseBeforeMs,
3066
+ wordBoundary: isNewWord,
3067
+ kind,
3068
+ wordIndex: contour.wordIndex,
3069
+ baselineDrift,
3070
+ offsets,
3071
+ poolingStrength,
3072
+ overshootPx,
3073
+ endDirection,
3074
+ flourish
3075
+ });
3076
+ lastWordIndex = contour.wordIndex;
3077
+ };
3078
+ for (const wordIndex of wordIndices) {
3079
+ const group = wordGroups.get(wordIndex);
3080
+ if (!group) continue;
3081
+ const orderedPrimaries = sortContours(group.primaries).map((contour) => ({
3082
+ contour,
3083
+ kind: "main"
3084
+ }));
3085
+ const orderedSecondaries = sortContours(group.secondaries).map(
3086
+ (contour) => ({
3087
+ contour,
3088
+ kind: "secondary"
3089
+ })
3090
+ );
3091
+ const orderedContours = [...orderedPrimaries, ...orderedSecondaries];
3092
+ orderedContours.forEach(({ contour, kind }, idx) => {
3093
+ const isLastInWord = idx === orderedContours.length - 1;
3094
+ scheduleContour(contour, kind, group.baselineDrift, isLastInWord);
3095
+ });
3096
+ }
3097
+ const totalMs = cursor;
3098
+ return { strokes, totalMs };
3099
+ }
3100
+ var WANDY_HAND_DEFAULTS = {
3101
+ fontSize: 160,
3102
+ durationMs: 2200,
3103
+ strokeWidth: 3.2,
3104
+ penOpacity: 1,
3105
+ strokeColor: "#fff",
3106
+ lineCap: "round",
3107
+ lineJoin: "round",
3108
+ samplesPerCurve: 5,
3109
+ strokeMode: "outline",
3110
+ canvasPadding: 8,
3111
+ backgroundColor: "transparent",
3112
+ imperfectionsEnabled: false,
3113
+ animate: true
3114
+ };
3115
+ function WandyHand({
3116
+ text,
3117
+ fontUrl,
3118
+ fontSize,
3119
+ durationMs = WANDY_HAND_DEFAULTS.durationMs,
3120
+ strokeWidth = WANDY_HAND_DEFAULTS.strokeWidth,
3121
+ penOpacity = WANDY_HAND_DEFAULTS.penOpacity,
3122
+ strokeColor = WANDY_HAND_DEFAULTS.strokeColor,
3123
+ lineCap = WANDY_HAND_DEFAULTS.lineCap,
3124
+ lineJoin = WANDY_HAND_DEFAULTS.lineJoin,
3125
+ samplesPerCurve = WANDY_HAND_DEFAULTS.samplesPerCurve,
3126
+ strokeMode = WANDY_HAND_DEFAULTS.strokeMode,
3127
+ canvasPadding = WANDY_HAND_DEFAULTS.canvasPadding,
3128
+ backgroundColor = WANDY_HAND_DEFAULTS.backgroundColor,
3129
+ imperfectionsEnabled = WANDY_HAND_DEFAULTS.imperfectionsEnabled,
3130
+ size,
3131
+ animate = WANDY_HAND_DEFAULTS.animate,
3132
+ onDrawn
3133
+ }) {
3134
+ const canvasRef = useRef9(null);
3135
+ const rafRef = useRef9(null);
3136
+ const [font, setFont] = useState(null);
3137
+ const resolvedFontUrl = fontUrl ?? waltographUI_default;
3138
+ const onDrawnRef = useRef9(onDrawn);
3139
+ const drawRunRef = useRef9(0);
3140
+ const drawNotifiedRef = useRef9(false);
3141
+ const resolvedFontSize = typeof fontSize === "number" && fontSize > 0 ? fontSize : 160;
3142
+ const sizeValue = size !== void 0 ? typeof size === "number" ? `${Math.max(0, size)}px` : `${size}` : null;
3143
+ const LINE_CAP_MAP = {
3144
+ round: "round",
3145
+ butt: "butt",
3146
+ square: "square"
3147
+ };
3148
+ const LINE_JOIN_MAP = {
3149
+ round: "round",
3150
+ miter: "miter",
3151
+ bevel: "bevel"
3152
+ };
3153
+ const STROKE_MODE_MAP = {
3154
+ outline: "outline",
3155
+ "outline reveal": "outline",
3156
+ "full stroke": "full",
3157
+ full: "full"
3158
+ };
3159
+ const normalizeLineCap = (value) => {
3160
+ if (!value) return "round";
3161
+ const lower = value.toLowerCase();
3162
+ return LINE_CAP_MAP[lower] ?? "round";
3163
+ };
3164
+ const normalizeLineJoin = (value) => {
3165
+ if (!value) return "round";
3166
+ const lower = value.toLowerCase();
3167
+ return LINE_JOIN_MAP[lower] ?? "round";
3168
+ };
3169
+ const normalizeStrokeMode = (value) => {
3170
+ if (!value) return "outline";
3171
+ const lower = value.toLowerCase();
3172
+ return STROKE_MODE_MAP[lower] ?? "outline";
3173
+ };
3174
+ const resolvedLineCap = normalizeLineCap(lineCap);
3175
+ const resolvedLineJoin = normalizeLineJoin(lineJoin);
3176
+ const resolvedStrokeMode = normalizeStrokeMode(strokeMode);
3177
+ const resolvedSamplesPerCurve = resolveCurveSamples(samplesPerCurve);
3178
+ useEffect9(() => {
3179
+ onDrawnRef.current = onDrawn;
3180
+ }, [onDrawn]);
3181
+ useEffect9(() => {
3182
+ let cancelled = false;
3183
+ const loadFont = async () => {
3184
+ try {
3185
+ const response = await fetch(resolvedFontUrl);
3186
+ if (!response.ok) {
3187
+ throw new Error(
3188
+ `Failed to load font (${response.status} ${response.statusText})`
3189
+ );
3190
+ }
3191
+ const contentType = response.headers.get("content-type") ?? "";
3192
+ if (contentType && !contentType.includes("font") && !contentType.includes("application/octet-stream") && !resolvedFontUrl.startsWith("data:")) {
3193
+ throw new Error(
3194
+ `Unexpected font content-type "${contentType}" for ${resolvedFontUrl}`
3195
+ );
3196
+ }
3197
+ const buffer = await response.arrayBuffer();
3198
+ const loaded = opentype.parse(buffer);
3199
+ if (!cancelled) setFont(loaded);
3200
+ } catch (err) {
3201
+ if (!cancelled) {
3202
+ console.error(err);
3203
+ setFont(null);
3204
+ }
3205
+ }
3206
+ };
3207
+ loadFont();
3208
+ return () => {
3209
+ cancelled = true;
3210
+ };
3211
+ }, [resolvedFontUrl]);
3212
+ const prepared = useMemo4(() => {
3213
+ if (!font) return null;
3214
+ const safe = text.trim().length ? text : " ";
3215
+ return prepareText(font, safe, resolvedFontSize, resolvedSamplesPerCurve);
3216
+ }, [font, text, resolvedFontSize, resolvedSamplesPerCurve]);
3217
+ const aspectRatio = useMemo4(() => {
3218
+ if (!prepared) return null;
3219
+ const width = prepared.bounds.maxX - prepared.bounds.minX;
3220
+ const height = prepared.bounds.maxY - prepared.bounds.minY;
3221
+ return width > 0 && height > 0 ? width / height : null;
3222
+ }, [prepared]);
3223
+ const strokePlan = useMemo4(() => {
3224
+ if (!prepared) return null;
3225
+ const safe = text.trim().length ? text : " ";
3226
+ return createStrokePlan(
3227
+ prepared.contours,
3228
+ prepared.totalLen,
3229
+ durationMs,
3230
+ safe,
3231
+ imperfectionsEnabled
3232
+ );
3233
+ }, [prepared, durationMs, text, imperfectionsEnabled]);
3234
+ useEffect9(() => {
3235
+ const canvas = canvasRef.current;
3236
+ if (!canvas || !prepared || !strokePlan) return;
3237
+ drawRunRef.current += 1;
3238
+ drawNotifiedRef.current = false;
3239
+ const ctx = canvas.getContext("2d");
3240
+ if (!ctx) return;
3241
+ const safeCanvas = canvas;
3242
+ const safeCtx = ctx;
3243
+ const { polylines, bounds } = prepared;
3244
+ const { strokes, totalMs } = strokePlan;
3245
+ const textW = bounds.maxX - bounds.minX;
3246
+ const textH = bounds.maxY - bounds.minY;
3247
+ const targetAspect = textW > 0 && textH > 0 ? textW / textH : null;
3248
+ function resize() {
3249
+ const dpr = Math.max(1, window.devicePixelRatio || 1);
3250
+ const host = safeCanvas.parentElement ?? safeCanvas;
3251
+ const rect = host.getBoundingClientRect();
3252
+ let nextWidth = rect.width;
3253
+ let nextHeight = rect.height;
3254
+ if (targetAspect) {
3255
+ const rectAspect = rect.width / Math.max(rect.height, 1);
3256
+ if (rectAspect > targetAspect) {
3257
+ nextWidth = rect.height * targetAspect;
3258
+ nextHeight = rect.height;
3259
+ } else {
3260
+ nextWidth = rect.width;
3261
+ nextHeight = rect.width / targetAspect;
3262
+ }
3263
+ }
3264
+ safeCanvas.style.width = `${Math.max(1, nextWidth)}px`;
3265
+ safeCanvas.style.height = `${Math.max(1, nextHeight)}px`;
3266
+ safeCanvas.width = Math.floor(Math.max(1, nextWidth) * dpr);
3267
+ safeCanvas.height = Math.floor(Math.max(1, nextHeight) * dpr);
3268
+ safeCtx.setTransform(dpr, 0, 0, dpr, 0, 0);
3269
+ if (!animate) {
3270
+ renderFrame(Number.POSITIVE_INFINITY, 1);
3271
+ rafRef.current = null;
3272
+ return;
3273
+ }
3274
+ if (rafRef.current === null) {
3275
+ rafRef.current = requestAnimationFrame(draw);
3276
+ }
3277
+ }
3278
+ resize();
3279
+ window.addEventListener("resize", resize);
3280
+ const start = performance.now();
3281
+ const totalTimeline = totalMs > 0 ? totalMs : Math.max(durationMs, 1);
3282
+ function renderFrame(timelineElapsed, timelineProgress) {
3283
+ safeCtx.clearRect(0, 0, safeCanvas.width, safeCanvas.height);
3284
+ safeCtx.lineCap = resolvedLineCap;
3285
+ safeCtx.lineJoin = resolvedLineJoin;
3286
+ safeCtx.lineWidth = strokeWidth;
3287
+ safeCtx.globalAlpha = penOpacity;
3288
+ safeCtx.strokeStyle = strokeColor;
3289
+ const pad = canvasPadding;
3290
+ const viewW = safeCanvas.clientWidth;
3291
+ const viewH = safeCanvas.clientHeight;
3292
+ const scaleToFit = Math.min(
3293
+ (viewW - pad * 2) / (textW || 1),
3294
+ (viewH - pad * 2) / (textH || 1)
3295
+ );
3296
+ const scale = sizeValue === null ? scaleToFit : Math.min(1, scaleToFit);
3297
+ const cx = viewW / 2;
3298
+ const cy = viewH / 2;
3299
+ safeCtx.save();
3300
+ safeCtx.translate(cx, cy);
3301
+ safeCtx.scale(scale, scale);
3302
+ safeCtx.translate(-(bounds.minX + textW / 2), -(bounds.minY + textH / 2));
3303
+ const filledContours = [];
3304
+ for (const stroke of strokes) {
3305
+ if (!stroke.points.length || stroke.length <= 0) continue;
3306
+ const strokeStart = stroke.startMs;
3307
+ const strokeEnd = stroke.startMs + stroke.durationMs;
3308
+ if (timelineElapsed >= strokeEnd) {
3309
+ drawPolylineStamped(
3310
+ safeCtx,
3311
+ stroke.points,
3312
+ stroke.length,
3313
+ stroke.length,
3314
+ strokeWidth,
3315
+ strokeColor,
3316
+ stroke.baselineDrift,
3317
+ stroke.offsets,
3318
+ stroke.poolingStrength
3319
+ );
3320
+ if (resolvedStrokeMode === "full") {
3321
+ filledContours.push(stroke.points);
3322
+ }
3323
+ const lastPoint = stroke.points[stroke.points.length - 1];
3324
+ const tipPoint = {
3325
+ x: lastPoint.x + stroke.baselineDrift.x + stroke.offsets.end.x,
3326
+ y: lastPoint.y + stroke.baselineDrift.y + stroke.offsets.end.y
3327
+ };
3328
+ drawOvershootTail(
3329
+ safeCtx,
3330
+ tipPoint,
3331
+ stroke.endDirection,
3332
+ stroke.overshootPx,
3333
+ strokeWidth,
3334
+ strokeColor
3335
+ );
3336
+ if (stroke.flourish) {
3337
+ drawPolylineStamped(
3338
+ safeCtx,
3339
+ stroke.flourish.points,
3340
+ stroke.flourish.length,
3341
+ stroke.flourish.length,
3342
+ strokeWidth * 0.9,
3343
+ strokeColor,
3344
+ stroke.baselineDrift,
3345
+ ZERO_OFFSETS,
3346
+ stroke.poolingStrength * 0.5
3347
+ );
3348
+ }
3349
+ continue;
3350
+ }
3351
+ if (timelineElapsed >= strokeStart) {
3352
+ const localElapsed = timelineElapsed - strokeStart;
3353
+ const localTLinear = Math.min(
3354
+ 1,
3355
+ localElapsed / Math.max(stroke.durationMs, 1)
3356
+ );
3357
+ const easedT = easeInOut(localTLinear);
3358
+ const partialLen = stroke.length * easedT;
3359
+ drawPolylineStamped(
3360
+ safeCtx,
3361
+ stroke.points,
3362
+ partialLen,
3363
+ stroke.length,
3364
+ strokeWidth,
3365
+ strokeColor,
3366
+ stroke.baselineDrift,
3367
+ stroke.offsets,
3368
+ stroke.poolingStrength
3369
+ );
3370
+ }
3371
+ break;
3372
+ }
3373
+ if (resolvedStrokeMode === "full") {
3374
+ const contoursToFill = timelineProgress >= 1 ? polylines : filledContours;
3375
+ if (contoursToFill.length) {
3376
+ safeCtx.save();
3377
+ safeCtx.fillStyle = strokeColor;
3378
+ safeCtx.beginPath();
3379
+ for (const pl of contoursToFill) {
3380
+ if (!pl.length) continue;
3381
+ safeCtx.moveTo(pl[0].x, pl[0].y);
3382
+ for (let i = 1; i < pl.length; i++) {
3383
+ safeCtx.lineTo(pl[i].x, pl[i].y);
3384
+ }
3385
+ safeCtx.closePath();
3386
+ }
3387
+ safeCtx.fill("evenodd");
3388
+ safeCtx.restore();
3389
+ }
3390
+ }
3391
+ safeCtx.restore();
3392
+ if (timelineProgress >= 1 && !drawNotifiedRef.current) {
3393
+ drawNotifiedRef.current = true;
3394
+ onDrawnRef.current?.();
3395
+ }
3396
+ }
3397
+ function draw(now) {
3398
+ const elapsedRaw = now - start;
3399
+ const timelineElapsed = Math.min(elapsedRaw, totalTimeline);
3400
+ const timelineProgress = totalTimeline > 0 ? timelineElapsed / totalTimeline : 1;
3401
+ renderFrame(timelineElapsed, timelineProgress);
3402
+ if (timelineProgress < 1) {
3403
+ rafRef.current = requestAnimationFrame(draw);
3404
+ } else {
3405
+ rafRef.current = null;
3406
+ }
3407
+ }
3408
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
3409
+ if (animate) {
3410
+ rafRef.current = requestAnimationFrame(draw);
3411
+ } else {
3412
+ renderFrame(Number.POSITIVE_INFINITY, 1);
3413
+ rafRef.current = null;
3414
+ }
3415
+ return () => {
3416
+ window.removeEventListener("resize", resize);
3417
+ if (rafRef.current) cancelAnimationFrame(rafRef.current);
3418
+ rafRef.current = null;
3419
+ };
3420
+ }, [
3421
+ prepared,
3422
+ strokePlan,
3423
+ durationMs,
3424
+ strokeWidth,
3425
+ strokeColor,
3426
+ canvasPadding,
3427
+ resolvedLineCap,
3428
+ resolvedLineJoin,
3429
+ penOpacity,
3430
+ resolvedStrokeMode,
3431
+ sizeValue,
3432
+ animate
3433
+ ]);
3434
+ return /* @__PURE__ */ jsx10(
3435
+ "div",
3436
+ {
3437
+ className: "flex w-full flex-col text-white",
3438
+ style: {
3439
+ background: backgroundColor,
3440
+ ...sizeValue ? { width: sizeValue } : null,
3441
+ ...aspectRatio ? { aspectRatio } : null
3442
+ },
3443
+ children: /* @__PURE__ */ jsx10("div", { className: "relative flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsx10("canvas", { ref: canvasRef, style: { display: "block" } }) })
3444
+ }
3445
+ );
3446
+ }
2093
3447
  export {
3448
+ AnimatedDrawingSVG,
2094
3449
  EFECTO_ASCII_COMPONENT_DEFAULTS,
2095
3450
  EFECTO_ASCII_POST_PROCESSING_DEFAULTS,
2096
3451
  Efecto,
2097
3452
  FractalFlower,
2098
3453
  MenuGlitch,
2099
3454
  OranoParticles,
2100
- ShaderArt
3455
+ ShaderArt,
3456
+ Snow,
3457
+ WANDY_HAND_DEFAULTS,
3458
+ WandyHand
2101
3459
  };