Posted in

Go语言绘制动态爱心动画(含贝塞尔曲线+WebAssembly部署全流程)

第一章:Go语言绘制动态爱心动画(含贝塞尔曲线+WebAssembly部署全流程)

用 Go 语言实现一个平滑、可交互的动态爱心动画,核心在于精准构造心形轮廓——这并非简单几何图形,而是由两条三次贝塞尔曲线对称拼接而成。控制点坐标经数学推导确定:左半边曲线起点 (0.5, 0),控制点1 (0.25, 0.25),控制点2 (0, 0.5),终点 (0.5, 1);右半边镜像对称。整个路径在 Canvas 上以 requestAnimationFrame 驱动,配合 sin(t) 缓动实现脉动缩放与颜色渐变。

首先创建 main.go,导入 gioui.org GUI 框架(轻量级、原生支持 WASM):

package main

import (
    "image/color"
    "log"
    "math"
    "syscall/js"
    "gioui.org/app"
    "gioui.org/f32"
    "gioui.org/io/system"
    "gioui.org/layout"
    "gioui.org/op/paint"
    "gioui.org/unit"
)

func main() {
    go func() {
        w := app.NewWindow(app.Title("Dynamic Heart"), app.Size(400, 400))
        if err := loop(w); err != nil {
            log.Fatal(err)
        }
    }()
    select {} // keep program alive
}

构建贝塞尔路径需手动计算插值点序列(每帧生成约 64 个采样点),再调用 paint.Path 绘制填充。关键逻辑封装在 heartPath() 函数中,返回 []f32.Point 坐标切片。

编译为 WebAssembly 并部署:

  • 执行 GOOS=js GOARCH=wasm go build -o main.wasm
  • main.wasm 与官方 wasm_exec.js(位于 $GOROOT/misc/wasm/)置于同一目录
  • 编写 index.html,通过 WebAssembly.instantiateStreaming() 加载并启动
步骤 命令/文件 说明
编译 GOOS=js GOARCH=wasm go build -o main.wasm 生成标准 WASM 二进制
运行时依赖 wasm_exec.js 提供 Go 运行时胶水代码
启动入口 index.html<script> 初始化 app.Main() 触发 Go 主循环

最终页面无需任何外部 CDN,纯静态托管即可运行高性能矢量动画——贝塞尔曲线保证数学精确性,WASM 提供接近原生的渲染帧率。

第二章:贝塞尔曲线原理与Go中矢量绘图实现

2.1 三次贝塞尔曲线的数学建模与参数化推导

三次贝塞尔曲线由四个控制点 $ P_0, P_1, P_2, P_3 $ 定义,其参数方程为:

$$ B(t) = (1-t)^3 P_0 + 3t(1-t)^2 P_1 + 3t^2(1-t) P_2 + t^3 P_3,\quad t \in [0,1] $$

核心参数意义

  • $ t $:归一化路径参数(0 → 起点,1 → 终点)
  • 系数 $ (1-t)^3, 3t(1-t)^2, 3t^2(1-t), t^3 $ 构成伯恩斯坦基函数,保证凸包性与端点插值

Python 实现(向量版)

def cubic_bezier(p0, p1, p2, p3, t):
    """输入:4个二维/三维点;输出:曲线上对应t的位置"""
    b0 = (1-t)**3
    b1 = 3*t*(1-t)**2
    b2 = 3*t**2*(1-t)
    b3 = t**3
    return b0*p0 + b1*p1 + b2*p2 + b3*p3  # 向量逐分量运算

逻辑分析:b0b3 是 $ t $ 的三次多项式权重,和恒为 1;p0p3 可为 NumPy 数组,支持批量计算。

几何意义 权重峰值位置
$ B_0(t) $ 起点影响 $ t=0 $
$ B_1(t) $ 第一控制点拉力 $ t=1/3 $
$ B_2(t) $ 第二控制点拉力 $ t=2/3 $
$ B_3(t) $ 终点影响 $ t=1 $
graph TD
    A[控制点 P₀] --> B[线性插值 P₀→P₁]
    C[P₁] --> B
    C --> D[P₁→P₂]
    E[P₂] --> D
    E --> F[P₂→P₃]
    G[P₃] --> F
    B --> H[二次插值]
    D --> H
    F --> I[三次插值 → B t ]
    H --> I

2.2 Go标准库与第三方绘图库(ebiten/fyne)的渲染机制对比

Go 标准库不提供图形渲染能力,image 包仅支持内存中位图操作,无窗口、事件或 GPU 加速支持。

渲染抽象层级对比

  • 标准库:纯 CPU 绘制,依赖 image.RGBA + draw.Draw,需手动绑定 OS 窗口(如通过 x11winapi
  • Ebiten:基于 OpenGL / Metal / Vulkan 的帧循环引擎,自动管理纹理上传、双缓冲、VSync
  • Fyne:基于 Canvas 抽象层(默认用 OpenGL),面向组件 UI,非游戏场景优化

核心差异表

维度 image(标准库) Ebiten Fyne
渲染目标 内存图像 窗口/全屏 窗口+Widget树
同步机制 自动帧同步 基于定时器重绘
硬件加速 ✅(默认启用)
// Ebiten 主循环:每帧自动调用 Update/Draw
func (g *Game) Update() error { return nil }
func (g *Game) Draw(screen *ebiten.Image) {
    // screen 是当前帧缓冲,Draw 调用触发 GPU 提交
    ebiten.DrawImage(screen, logoImg, &ebiten.DrawImageOptions{})
}

ebiten.DrawImagelogoImg(GPU 纹理)合成到 screen(帧缓冲),内部触发 OpenGL glDrawElementsDrawImageOptions 控制缩放、旋转、滤波等管线参数,无需手动管理 shader 或 VAO。

graph TD
    A[Game Loop] --> B[Update State]
    B --> C[Draw Scene]
    C --> D[Ebiten Texture Upload]
    D --> E[GPU Command Submission]
    E --> F[Present to Display]

2.3 动态爱心路径生成:控制点选取、插值采样与帧率同步策略

动态爱心路径的核心在于将数学美感转化为实时渲染的平滑轨迹。我们采用五阶贝塞尔曲线建模,以7个关键控制点定义心形轮廓——首尾两点锚定起止位置,中间5点通过极坐标映射($r = 1 – \sin\theta$)生成初始骨架。

控制点自适应选取

  • 基于用户交互点动态偏移中心,确保爱心始终朝向鼠标/触点方向
  • 引入权重衰减因子 $\alpha=0.85$ 平滑抖动,避免高频跳变

插值与帧率协同机制

// 帧率自适应三次样条插值
const spline = new CatmullRomCurve3(
  controlPoints, 
  false,     // 是否闭合
  'centripetal', // 参数化策略:缓解弦长畸变
  0.02       // 采样步长:对应60fps下每帧增量
);

该实现采用centripetal参数化抑制尖角振荡;0.02 步长经实测匹配主流设备60fps刷新周期,确保单周期内完成100+采样点生成。

策略 采样密度 CPU开销 路径平滑度
线性插值 30点 极低 ★★☆
贝塞尔插值 60点 中等 ★★★★
Catmull-Rom 120点 中高 ★★★★★
graph TD
  A[用户输入坐标] --> B[极坐标映射生成7控制点]
  B --> C[应用权重衰减平滑]
  C --> D[Catmull-Rom插值]
  D --> E[按requestAnimationFrame节拍输出顶点]
  E --> F[GPU逐帧渲染]

2.4 坐标变换与抗锯齿优化:从像素坐标到设备无关渲染的实践

像素坐标系的局限性

传统 gl_FragCoord 直接映射屏幕像素,导致在高DPI设备上线条发虚、文字边缘锯齿明显。核心矛盾在于:像素 ≠ 物理长度

设备无关坐标的构建

通过统一缩放因子实现逻辑单位对齐:

// GLSL 片元着色器片段
uniform vec2 u_resolution;   // 设备实际分辨率(如 3840×2160)
uniform float u_pixelRatio;  // 设备像素比(Retina=2.0, 普通屏=1.0)
uniform vec2 u_logicalSize;  // 逻辑视口尺寸(如 1920×1080)

void main() {
  vec2 logicalCoord = gl_FragCoord.xy / u_pixelRatio; // 归一化至逻辑坐标
  vec2 normalized = logicalCoord / u_logicalSize;     // [0,1] 归一化
  // 后续绘制基于 normalized,与设备无关
}

逻辑分析u_pixelRatio 补偿物理像素密度差异;u_logicalSize 定义设计基准,确保UI元素在不同设备上保持一致视觉尺寸。忽略该变换将导致CSS px 与Canvas devicePixelRatio 错配。

抗锯齿策略对比

方法 覆盖范围 性能开销 适用场景
MSAA 全场景 3D几何边缘
FXAA(后处理) 全帧 实时2D/3D混合
SDF字体+距离场采样 文字/图标 UI文本锐利渲染

渲染管线关键路径

graph TD
  A[逻辑坐标输入] --> B[顶点着色器:viewport适配]
  B --> C[光栅化:自动插值]
  C --> D[片元着色器:SDF距离计算]
  D --> E[Alpha混合:smoothstep抗混叠]

2.5 性能剖析:CPU/GPU负载分布与帧耗时监控工具集成

实时性能洞察依赖于跨硬件单元的协同采样。现代渲染管线需同步捕获 CPU 工作线程调度、GPU command buffer 提交及 GPU 硬件计时器(如 VK_QUERY_TYPE_TIMESTAMP)数据。

数据同步机制

使用 Vulkan 的 vkCmdWriteTimestamp 与 CPU 高精度时钟(std::chrono::steady_clock)对齐,通过 fence 保证顺序:

// 在 command buffer 中插入时间戳查询
vkCmdWriteTimestamp(cmdBuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, timestampPool, 0);
vkCmdWriteTimestamp(cmdBuf, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, timestampPool, 1);
// 后续调用 vkGetQueryPoolResults 获取纳秒级 GPU 耗时

逻辑分析:TOP_OF_PIPE 标记命令开始,BOTTOM_OF_PIPE 标记结束;timestampPool 需预先创建为 VK_QUERY_TYPE_TIMESTAMP 类型,且 VkQueryPoolCreateInfo::queryCount ≥ 2。结果以 GPU 原生时钟周期返回,须乘以 physicalDeviceProperties.limits.timestampPeriod 转换为纳秒。

工具链集成对比

工具 CPU 负载采样 GPU 负载采样 帧粒度耗时 集成复杂度
RenderDoc ✅ (trace)
NVIDIA Nsight Graphics ✅ (ETW) ✅ (HW counters)
custom Vulkan layer ✅ (VK_EXT_calibrated_timestamps)

关键路径可视化

graph TD
    A[Frame Start] --> B[CPU: Scene Update]
    B --> C[CPU: Command Buffer Build]
    C --> D[GPU: Submit to Queue]
    D --> E[GPU: Execute & Timestamp]
    E --> F[CPU: vkGetQueryPoolResults]
    F --> G[Aggregate: CPU/GPU Overlap Analysis]

第三章:Go WebAssembly前端渲染架构设计

3.1 WASM编译链路解析:tinygo vs go build -o wasm,内存模型与GC约束

编译路径差异

go build -o main.wasm 依赖 Go 官方 WASM backend(基于 GOOS=js GOARCH=wasm),生成含完整 runtime 的 WASM 模块;而 TinyGo 采用轻量级 LLVM 后端,剥离 GC 和反射,直接映射到 WebAssembly 线性内存。

内存与 GC 约束对比

特性 go build -o wasm TinyGo
堆内存管理 含标记-清除 GC(约 2MB 起) 无 GC,仅栈 + 静态分配
初始内存页 --initial-memory=65536 默认 64KB,可手动扩展
导出函数调用开销 较高(runtime 调度层) 极低(直接裸函数调用)
;; TinyGo 生成的典型导出函数签名(经 wasm-decompile)
(func $main.main (export "main") (param i32 i32) (result i32)
  local.get 0
  i32.const 42
  i32.add)

该函数无 runtime 入口跳转,参数直接传入线性内存偏移,返回值为纯计算结果。TinyGo 强制要求 main() 不返回、不阻塞,因无事件循环支持。

内存模型关键限制

  • Go WASM 必须通过 syscall/js 与 JS 交互,所有 Go 对象需经 js.Value 封装;
  • TinyGo 仅支持 unsafe.Pointer + 手动内存布局,禁止闭包与 goroutine(除非 scheduler:none)。
graph TD
  A[Go源码] --> B{编译器选择}
  B -->|go build| C[Go Runtime + GC + js/syscall]
  B -->|tinygo| D[LLVM IR → WASM<br>零GC、无goroutine]
  C --> E[64KB+初始内存<br>JS Bridge必需]
  D --> F[静态内存布局<br>可嵌入微控制器]

3.2 Canvas API桥接:Go函数暴露为JavaScript可调用接口的双向通信实践

Canvas API桥接核心在于syscall/js包提供的js.FuncOfjs.Value.Call机制,实现Go与JS函数互调。

数据同步机制

Go侧需将函数注册为全局JS可访问对象:

func init() {
    js.Global().Set("drawCircle", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
        x := args[0].Float()
        y := args[1].Float()
        r := args[2].Float()
        // 调用Canvas 2D上下文绘图
        ctx := js.Global().Get("canvas").Call("getContext", "2d")
        ctx.Call("beginPath")
        ctx.Call("arc", x, y, r, 0, 2*3.14159)
        ctx.Call("stroke")
        return nil // 返回值将被自动转为JS undefined
    }))
}

逻辑分析:js.FuncOf将Go函数包装为JS可调用对象;参数args为JS传入的Float()Int()等类型转换结果;this指向调用上下文(通常为window);返回值经interface{}→JS类型自动映射。

通信约束与对照表

方向 Go → JS JS → Go
参数传递 js.Value切片 []js.Value自动解包
返回处理 interface{}自动转换 js.Valuenil
异常捕获 panic → JS Error JS throw → Go panic

双向调用流程

graph TD
    A[JS调用 drawCircle] --> B[Go函数执行]
    B --> C[Canvas渲染]
    C --> D[Go触发 js.Global().Call]
    D --> E[JS回调函数]

3.3 WASM模块生命周期管理:初始化、帧循环、资源释放与内存泄漏规避

WASM模块并非“一劳永逸”加载即用,其生命周期需由宿主(如JavaScript)显式协同管理。

初始化阶段:WebAssembly.instantiate()

const wasmModule = await WebAssembly.instantiate(wasmBytes, {
  env: {
    memory: new WebAssembly.Memory({ initial: 256 }),
    abort: () => { throw new Error("WASM abort"); }
  }
});

wasmBytes为编译后的二进制模块;env对象提供导入函数与内存实例——必须复用同一Memory实例,否则跨模块指针失效。

帧循环:避免阻塞主线程

  • 使用requestAnimationFrame()驱动WASM逻辑;
  • 每帧调用导出的update()render()函数;
  • 禁止在WASM中执行长耗时同步计算(无协程支持)。

内存泄漏规避关键点

风险源 措施
手动分配未释放 优先使用Rust/Go等带RAII的WASM语言
JS引用WASM堆对象 调用__wbindgen_throw()后及时置空引用
导入函数闭包捕获 避免在env中传入含DOM引用的函数
graph TD
  A[模块加载] --> B[实例化与内存绑定]
  B --> C[帧循环调用导出函数]
  C --> D{是否退出?}
  D -->|是| E[解除JS引用]
  D -->|否| C
  E --> F[GC可回收WASM线性内存]

第四章:全栈部署与工程化交付

4.1 静态资源打包:WASM二进制嵌入HTML与HTTP缓存头配置

WASM模块作为静态资源,需兼顾加载性能与缓存可控性。现代构建工具支持将 .wasm 文件内联为 Base64 数据 URI 或通过 <script type="module"> 动态 instantiateStreaming 加载。

内联WASM的HTML嵌入方式

<script type="application/wasm" id="my-wasm">
AGFzbQEAAAABDwQAAAFgAn9/AX8Bf2ABfwJ/A38EfwZ/B38Ifwp/Cn8Mfw5/Dn8PfxB/EH8SfxR/FX8Wfxd/GH8Zfxp/G38cfxx/HX8efx9/IH8hfyJ/I38kfyV/Jn8nfyh/KX8qfyt/LH8tfy5/L38w/zF/Mn8z/zR/NX82fzd/OH85fzp/O388fz1/Pn8/f0B/QX9Cf0N/RH9Ff0Z/R39If0l/Sn9Lf0x/TX9Of09/UH9Rf1J/U39Uf1V/Vn9Xf1h/WX9af1t/XH9df15/X39gf2F/Yn9jf2R/ZX9mf2d/aH9pf2p/a39sf21/bn9vf3B/cX9yf3N/dH91f3Z/d394f3l/en97f3x/fX9+f3+Af4F/gn+Df4R/hX+Gf4d/iH+Jf4p/i3+Mf41/jn+Pf5B/kX+Sf5N/lH+Vf5Z/l3+Yf5l/mn+bf5x/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5X/lv+X/5j/mf+a/5v/nP+df55/n3+gf6F/on+jf6R/pX+mf6d/qH+pf6p/q3+sf61/rn+vf7B/sX+yf7N/tH+1f7Z/t3+4f7l/un+7f7x/vX++f79/wH/Bf8J/w3/Ef8V/xn/Hf8h/yX/Kf8t/zH/Nf85/z3/Qf9F/0n/Tf9Rf1X/Wf9d/2H/Zf9p/23/cf91/3n/ff+B/4X/if+N/5H/lf+Z/53/of+l/6n/rf+x/7X/uf+9/8H/xf/J/83/0f/V/9n/3f/h/+X/6f/t//H/9f/5//3//gP+B/4L/g/+E/4X/hv+I/4n/iv+M/43/jv+Q/5H/kv+T/5T/lf+W/5f/mP+Z/5r/m/+c/51/nn+ff6B/oX+if6N/pH+lf6Z/p3+of6l/qn+rf6x/rX+uf69/sH+xf7J/s3+0f7V/tn+3f7h/uX+6f7t/vH+9f75/v3/Af8F/wn/Df8R/xX/Gf8d/yH/Jf8p/y3/Mf81/zn/Pf9B/0X/Sf9N/1F/Vf9Z/13/Yf9l/2n/bf9x/3X/ef99/4H/hf+J/43/kf+V/5n/nf+h/6X/qf+t/7H/tf+5/73/wf/F/8n/zf/R/9X/2f/d/+H/5f/p/+3/8f/1//n//f/+A/4H/gv+D/4T/hf+G/4j/if+K/4z/jf+O/5D/kf+S/5P/lP+V/5b/l/+Y/5n/mv+b/5z/nX+ef59/oH+hf6J/o3+kf6V/pn+nf6h/qX+qf6t/rH+tf65/r3+wf7F/sn+zf7R/tX+2f7d/uH+5f7p/u3+8f71/vn+/f8B/wX/Cf8N/xH/Ff8Z/x3/If8l/yn/Lf8x/zX/Of89/0H/Rf9J/03/UX9V/1n/Xf9h/2X/af9t/3H/df95/33/gf+F/4n/jf+R/5X/mf+d/6H/pf+p/63/sf+1/7n/vf/B/8X/yf/N/9H/1f/Z/93/4f/l/+n/7f/x//X/+f/9//4D/gf+C/4P/hP+F/4b/iP+J/4r/jP+N/47/kP+R/5L/k/+U/5

### 4.2 构建自动化:GitHub Actions流水线实现CI/CD与跨平台WASM验证

#### 流水线设计原则  
聚焦“一次编写,多端验证”:Linux/macOS/Windows 上并行构建 Rust → WASM,并运行 `wasm-bindgen-test` 与浏览器环境模拟测试。

#### 核心 workflow 配置  
```yaml
# .github/workflows/ci-wasm.yml
on: [push, pull_request]
jobs:
  wasm-test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        rust: ['1.78']
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: Build and test WASM
        run: |
          cargo install wasm-pack
          wasm-pack build --target web --dev
          wasm-pack test --headless --chrome --firefox  # 跨浏览器验证

逻辑分析--target web 生成兼容浏览器的 ES module;--headless 启用无界面模式;--chrome--firefox 触发双引擎并行验证,确保 WASM ABI 兼容性。wasm-pack test 自动注入 wasm-bindgen-test-runner,屏蔽底层 JS 运行时差异。

验证维度对比

环境 支持 WebAssembly SIMD Chrome DevTools 调试 内存限制(默认)
Ubuntu 4GB
macOS ⚠️(需 Rust 1.80+) 3GB
Windows ❌(LLVM backend 限制) ⚠️(需手动启用) 2GB

构建状态流转

graph TD
  A[Git Push] --> B[Checkout + Rust Setup]
  B --> C{Build WASM}
  C --> D[Chrome Headless Test]
  C --> E[Firefox Headless Test]
  D & E --> F[Upload Artifact to GitHub Packages]

4.3 安全加固:CSP策略配置、WASM沙箱权限收敛与源码混淆实践

CSP策略最小化实践

严格限制资源加载来源,禁用内联脚本与eval

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'; base-uri 'self'; frame-ancestors 'none'

default-src 'self' 设定默认信任域;script-src 显式白名单CDN;object-src 'none' 阻断Flash/Java插件;frame-ancestors 'none' 防止点击劫持。

WASM沙箱权限收敛

通过WebAssembly.validate()校验模块完整性,并在实例化时传入精简的ImportObject

const importObj = { env: { memory: new WebAssembly.Memory({ initial: 1 }) } };
// 仅暴露必要内存对象,禁用`table`、`global`等高危导入

混淆策略对比

方法 可读性 调试难度 性能影响
Terser压缩 ★☆☆☆☆ ★★☆☆☆ 极低
Control Flow Flattening ★★★☆☆ ★★★★☆
graph TD
A[原始JS] --> B[Terser压缩]
B --> C[AST重写+控制流扁平化]
C --> D[字符串数组+动态解密]

4.4 可观测性增强:前端性能指标采集(FPS/内存占用/加载延迟)与Prometheus对接

前端可观测性需突破传统日志埋点局限,转向实时、标准化的指标体系。我们通过 PerformanceObserverwindow.performance.memory(需开启 Chrome 的 --enable-precise-memory-info 标志)采集关键维度:

FPS 动态采样

const fpsObserver = new PerformanceObserver((list) => {
  list.getEntries().forEach(entry => {
    // entry.name === 'frame',duration 单位为 ms,1000/duration ≈ FPS
    const fps = Math.round(1000 / entry.duration);
    pushToPrometheus('frontend_fps', { app: 'dashboard' }, fps);
  });
});
fpsObserver.observe({ entryTypes: ['frame'] });

逻辑说明:entry.duration 表示单帧渲染耗时;每秒帧数由 1000 / duration 近似计算;pushToPrometheus() 将指标以 OpenMetrics 格式 POST 至 Prometheus Pushgateway。

内存与加载延迟统一上报

指标名 数据源 采集频率 标签示例
frontend_js_heap_size performance.memory.totalJSHeapSize 5s {env="prod", page="/home"}
frontend_ttfb_ms resource timing API 首屏+路由切换 {resource="api/user"}

数据同步机制

graph TD
  A[Browser] -->|HTTP POST| B[Pushgateway]
  B --> C[Prometheus scrape]
  C --> D[Grafana Dashboard]

指标采集后经 Pushgateway 中转,由 Prometheus 主动拉取,实现与后端监控栈的无缝对齐。

第五章:总结与展望

技术演进的现实映射

在某大型金融风控平台的升级项目中,团队将传统规则引擎迁移至基于Flink + Kafka的实时决策流架构。上线后,欺诈识别延迟从平均850ms降至42ms,日均处理事件量从1200万跃升至3.6亿。关键突破在于引入状态 TTL 机制与 RocksDB 增量 Checkpoint,使作业重启耗时压缩至17秒以内(原需4分23秒)。该实践已沉淀为行内《实时风控流水线建设规范V2.3》,被6个省级分行复用。

工程化落地的关键瓶颈

下表对比了2022–2024年三个典型生产环境中的可观测性短板:

维度 2022年(ELK+Prometheus) 2023年(OpenTelemetry+Grafana) 2024年(eBPF+自研TraceFlow)
异常定位平均耗时 28分钟 9分钟 112秒
跨服务链路丢失率 37% 12%
自动根因建议准确率 54% 89%

开源组件的深度定制案例

某电商中台团队对Apache Doris进行了三项核心改造:

  • 修改BE节点元数据同步协议,支持跨AZ双活集群间Schema变更原子提交;
  • 在Compaction流程中嵌入业务标签过滤器,使促销商品维度表查询P99降低63%;
  • 开发UDF插件框架,允许运营人员通过SQL直接调用Python风控模型(经PyTorch JIT编译),上线后A/B测试迭代周期从3天缩短至4小时。
flowchart LR
    A[用户下单请求] --> B{网关鉴权}
    B -->|通过| C[实时库存校验]
    C --> D[Doris物化视图聚合]
    D --> E[动态路由至区域仓]
    E --> F[异步触发履约引擎]
    F --> G[结果写入Kafka Topic]
    G --> H[消费端更新Redis缓存]
    H --> I[前端展示履约状态]

人才能力结构的迁移趋势

一线交付团队技能图谱发生显著偏移:2023年Q4调研显示,掌握Flink State Backend调优的工程师占比达76%,而能独立配置YARN队列资源策略的仅剩31%;与此同时,熟悉OpenAPI规范并完成Swagger-to-Terraform转换的全栈开发者比例从12%升至58%。某省政务云项目中,运维人员通过Ansible Playbook自动注入eBPF探针脚本,实现零代码修改完成HTTP/2流量采样率动态调控。

生态协同的新范式

华为云Stack与火山引擎的混合云调度平台已在3家制造业客户中验证可行性:当本地GPU集群负载超阈值时,自动将非实时渲染任务卸载至公有云Spot实例池,并通过Service Mesh统一管理跨云Sidecar通信。该方案使整体算力利用率稳定维持在78%~84%区间,较单云架构提升22.6个百分点。其核心依赖于CNCF认证的Kubernetes Federation v3控制器与自研的跨云指标联邦采集器。

技术债的偿还节奏正被市场倒逼加速,而每一次架构升级都伴随着新的隐性成本浮现。

专注 Go 语言实战开发,分享一线项目中的经验与踩坑记录。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注